Выполнение запроса в другой базе 1С без com-соединения. HTTP-сервис

Обмен - Перенос данных из 1C8 в 1C8

Запрос HTTP-сервис POST JSON

50
Выполнение любого запроса с параметрами из одной базы 1С в другую. Используя HTTP-сервис. Посредством POST-запроса и JSON.

Com-соединение использовать не хотелось по ряду причин. Одной из главных является зоопарк разных баз на разных платформах 1с. И поэтому написал http-сервис.

Публикуем ее на Apache или iss (об публикации 1с  есть много статей в интернете) .

Пишем функцию, которая обрабатывает POST-запрос в теле запроса строка JSON в которой хранится Структура с запросом и его параметрами. Ниже видно как заполнить  параметры с датой и элементом справочника. Функция на выходе возвращает Таблицу значений ЗначениеВСтрокуВнутр (в текстовом представлении)

Далее Создаем обработку и пишем процедуру обращения к HTTP- сервису. Описываем запрос который будет выполнен в другой базе. Заворачиваем его в JSON. Делаем POST-запрос к адресу http-сервиса. Получаем  текст из тела ответа. Преобразуем ее в Таблицу значений методом ЗначениеИзСтрокиВнутр.

В демо-базе заполню данные чтобы получить результат.

В демо-базе  для скачивания требует логин и пароль

Логин: user

Пароль:12345

Тестировал на релизе 1С:Предприятие 8.3 (8.3.13.1513)

50

Скачать файлы

Наименование Файл Версия Размер
Выполнить запрос в другой базе 1с без com-соединения. HTTP-сервис.:
.dt 43,08Kb
30.11.18
7
.dt 1 43,08Kb 7 Скачать

См. также

Специальные предложения

Комментарии
Избранное Подписка Сортировка: Древо
1. VmvLer 30.11.18 17:09 Сейчас в теме
Хорошая идея для небольших объемов данных: сверка, синхронизация маленьких таблиц и т.п.

Для выгрузки/загрузки полных объемов данных проще сохранить в источнике массивные данные в файл JSON и затем получить его в приемнике и обработать.
2. dsdred 911 30.11.18 17:32 Сейчас в теме
Сразу видно не читали https://its.1c.ru/db/content/v8std/src/d810/i8100770.htm?_=1528299650
Для вашего примера достаточно OData без создания http-сервиса

А по http-сервисам вот:

HTTP Сервисы: Путь к своему сервису. Часть 1
HTTP Сервисы: Путь к своему сервису. Часть 2
HTTP Сервисы: Путь к своему сервису. Часть 3
HTTP Сервисы: Путь к своему сервису. Часть 4

П.С. Это больше на костыль похоже, причем на дыру в безопасности.
papche; nikita0832; frkbvfnjh; unichkin; VladimirL; zeegin; +6 Ответить
10. Aleks.spb 05.12.18 09:34 Сейчас в теме
(2) У вас отличный фундаментальный труд, на освоение которого нужно потратить от трех дней и больше, если есть возможность и время копать глубоко.
Тут конкретный узкоспециализированный пример, освоить который можно за час и оставшееся время посвятить уже решению задачи.
13. dsdred 911 05.12.18 15:43 Сейчас в теме
(10)
Тут конкретный узкоспециализированный пример, освоить который можно за час и оставшееся время посвятить уже решению задачи.

Есть конкретно OData, ее использование позволит сделать данную задачу еще быстрее и без создания бреши в безопасности.

П.С. Можно потратить час сейчас и X-дней потом чиня последствия. Беречь время правильно, но правильно беречь время лучше!
14. Aleks.spb 05.12.18 16:47 Сейчас в теме
(13) Вас понял, но я рассматривал это как пример организации http сервиса с post запросом/ответом в формате JSON для человека который начал с нуля.
15. dsdred 911 05.12.18 17:18 Сейчас в теме
3. K_A_O 514 02.12.18 14:18 Сейчас в теме
А я-то уж по заголовку решил, что любой запрос в OData преобразуется.
4. Lapitskiy 884 04.12.18 08:31 Сейчас в теме
а насколько правильно использовать "ЗначениеВСтрокуВнутр" в 2018 году?
5. John_d 316 04.12.18 10:16 Сейчас в теме
(4) Это типовая функция платформы. Все зависит от задачи.
Например в УПП есть регистр сведений СоответствиеОбъектовДляОбмена, где хранятся текстовые ссылки на объекты в другой базе.
6. starik-2005 1445 04.12.18 13:37 Сейчас в теме
(4)
а насколько правильно использовать "ЗначениеВСтрокуВнутр" в 2018 году?
А там внутри тот же XML, только заююченый )))
7. Lapitskiy 884 04.12.18 14:11 Сейчас в теме
(6) Но 1С вот что пишет:

"Примечание:

Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется. "
8. oleganatolievich 140 04.12.18 19:35 Сейчас в теме
(6) значениевстрокувнутр < сериализация в JSON < сериализация в XML по скорости
9. dsdred 911 04.12.18 19:51 Сейчас в теме
(8)Подключение на прямую к базе < http-сервисов + преобразования... И?

Суть не в этом.

Данный пример просто опасен.
В любой параметр можно запихнуть код выполняющий вредное действие (создать пользователя, додать себе прав, удалить что либо, прочитать и т.д.). Вот что главное!
И кто то еще и скачает и воткнет сию разработку.

П.С. Я когда то тоже нечто подобное навоял. Создал HTTP-сервис и метод "Выполнятор" из названия не трудно догадаться, что это за выполнятор был.
Посылал целый кусок кода и параметры в JSON, в куске кода который передавал описывал в каком виде вернуть данные.
Крутая вещь я вам скажу! Так я думал... А потом спустя пару месяцев ночью проснулся и вздрогнул от того, что я натворил. Слава богу всего в 4-х местах успел только использовать.

Потом еще и статью почитал которую выше написал https://its.1c.ru/db/content/v8std/src/d810/i8100770.htm?_=1528299650
Так что ЗначениеВСтрокуВнутр это лишь цветочки...
11. John_d 316 05.12.18 10:17 Сейчас в теме
(9) Спасибо за комментарий. Вместе мы сделали код безопаснее.
Результ = "";
Значение1 = СтрЗаменить(СтрСтр.Значение,";",""); //запрет кода 1с с двумя и более операторами
Выполнить("Результ = " + Значение1);

Теперь я не могу придумать вредоносный код с одним оператором. Который начинается "Результ =".

Скриншот исправил. Файл перезалил.
16. dsdred 911 05.12.18 19:05 Сейчас в теме
(11)Одну заплатку поставили, а сколько их еще будет?

Кто его знает, не хочу ломать голову, но вот вам замена ";"=Символ(59)
Специальный запуск долгих запросов или получение данных из баз в которые не должно было быть доступа...
17. John_d 316 06.12.18 10:26 Сейчас в теме
(16)Это выполняемый код тут Символ(59) не прокатит в качестве разделителя операторов.
18. dsdred 911 06.12.18 15:59 Сейчас в теме
(17)Как я уже говорил не хочу ломать голову. Я лишь показал как можно протащить команду с ";"

Выполнить ее или записать куда то для выполнения это уже следующая стадия размышлений.

Показываю как текст команды протащить:
Параметры1 = новый Структура;
	//Параметр хранит текст команды
	Параметры1.Вставить("КодДляВыполнения","СтрЗаменить(""Я1=1||Я2=2||Я3=3"",""||"",Символ(59))");	
	//Вариант1: Получаем текст команды, осталось подумать что с этим делать
	Параметры1.Вставить("ПришелНасралУлетел1","Запрос.Параметры.КодДляВыполнения");
	//Вариант2: Получаем текст команды, осталось подумать что с этим делать
	Параметры1.Вставить("ПришелНасралУлетел2","Запрос.Выполнить().Выгрузить()[0].ПерлХарбр");
	

	Запрос.Текст = "ВЫБРАТЬ &КодДляВыполнения КАК ПерлХарбр";
Показать
Прикрепленные файлы:
19. John_d 316 06.12.18 17:36 Сейчас в теме
(18) красиво)
Тогда еще такую заплатку. Использовать нестандартную переменную запроса.
Запрос234а15а2 = Новый Запрос;
12. santech-1C 05.12.18 13:02 Сейчас в теме
не нравится "выполнить()" - сделайте через "Запрос.Выполнить()"

моя нетленка в тему

Оставьте свое сообщение