Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Публикация № 1121106

Разработка - Инструментарий разработчика

Web-сервис COM-подключение замена запрос параметры выполнение обмен

В процессе работы в 1С часто возникает потребность получить данные из другой базы.  Обычно это делается через COM-соединение, и время выполнения запроса при этом оставляет желать лучшего. В данной публикации представлено универсальное решение, позволяющее практически моментально выполнить произвольный код или запрос с параметрами в другой информационной базе через Web-сервис.

Состав решения: Web-сервис, общий модуль с готовыми функциями для работы с ним, константа и перечисление для однозначного определения текущей базы, обработка для задания соответствия объектов информационных баз.

Минимальный релиз платформы для корректной работы 8.2.19.90 (ниже не проверялось)

Эффект от внедрения:
- ускорение в десятки, сотни раз выполнения запросов к другим информационным базам за счет уменьшения времени подключения (по сравнению с COM);
- сокращение кода и увеличение скорости и простоты отладки за счет унификации механизма выполнения запросов к другим информационным базам.

Подготовка к использованию (пошагово на примере БП и ЗУП)
• Объединить конфигурацию с текущими конфигурациями БП и ЗУП, в каждую конфигурацию будет добавлено по 4 новых объекта. Не забудьте снять флаг «Свойства» с корня дерева метаданных.
• Опубликовать Web-сервисы в этих базах и в каждой базе создать пользователя «Webservice» с паролем «12345qwerty» для авторизации через Web-сервис (имя пользователя и пароль можно поменять в общем модуле).
• Перейти в «Общие» - «WS-Ссылки» - «Добавить» и указать путь к:
  - файлу - если у вас платформа 8.2. Для получения файла перейти по ссылке «http://<имясервера>/<имябазы>/ws/ws.1cws?wsdl», авторизоваться и сохранить страницу как XML файл.
  - WS-ссылке - если у вас платформа 8.3. WS-ссылка выглядит так: «http://<имясервера>/<имябазы>/ws/ws.1cws?wsdl».
  Переименовать WS-ссылку - WS-ссылка на БП должна называться «БП», WS-ссылка на ЗУП должна называться «ЗУП» и т.д.  
• Задать константу «ИдентификаторБазы» в каждой базе (в БП это будет «Перечисления.Мод_ИдентификаторБазы.БП», в ЗУП, соответственно, «Перечисления.Мод_ИдентификаторБазы.ЗУП»)

Как это работает?
Решение позволяет разработчику не отвлекаться на детали взаимодействия с Web-сервисом и предоставляет в пользование 2 глобальные функции:
- глЗапрос(ПрефиксБазы, Запрос);
- глВыполнить(ПрефиксБазы, Код);
Параметром «ПрефиксБазы» задается база, в которой происходит выполнение запроса или кода. Доступные префиксы можно посмотреть в «Общие» - «WS-Ссылки» в дереве метаданных конфигурации. 
В параметр «Запрос» необходимо передавать сам запрос с параметрами, в параметр "Код" - код на языке 1С.

Пример использования

Запрос = Новый Запрос("ВЫБРАТЬ
|    Контрагенты.Наименование
|ИЗ
|    Справочник.Контрагенты КАК Контрагенты
|ГДЕ
|    Контрагенты.ИНН = &ИНН");
Запрос.УстановитьПараметр("ИНН", ИНН);
Выборка = глЗапрос("БП", Запрос);
НаименованиеКонтрагента = Выборка[0].Наименование;


Правила использования
• Ссылочные параметры, кроме счетов бухгалтерского учета, необходимо менять на строковые, например, вместо «Организация = &Организация» писать «Организация.Код = &КодОрганизации». В архиве есть 
обработка "Добавление идентификаторов в регистр соответствий объектов ИБ", позволяющая настроить соответствие между счетами бухгалтерского учета двух баз, если вдруг у них разные идентификаторы (не встречал подобного).
• При выполнении кода результат можно вернуть с помощью вызова исключения.
• Если «ПрефиксБазы» совпадает с идентификатором текущей базы, то запрос или код выполняется в ней. Т.е. сбор данных из разных баз в одну таблицу можно выполнять в цикле, меняя только префикс базы, например:

ОбщаяТаблица = Новый ТаблицаЗначений;
МассивПрефиксов = Новый Массив;
МассивПрефиксов.Добавить("БП");
МассивПрефиксов.Добавить("УТ");
МассивПрефиксов.Добавить("ЗУП");
Для каждого Префикс из МассивПрефиксов Цикл
    ЗагрузитьВТаблицуЗначений(ОбщаяТаблица, глЗапрос(Префикс, Запрос));
КонецЦикла;


Замена COM-подключений на выполнение запросов через Web-сервис
Переменные COM-подключения должны быть заменены переменными этой базы, например, вместо «COM.NewObject("Запрос");» необходимо написать просто «Новый Запрос;».
Далее рассмотрены основные конструкции встроенного языка для работы с COM-подключением и их аналоги для работы с функцией «глЗапрос».

COM-подключение Web-сервис
ЗапросCOM = COM.NewObject("Запрос"); Запрос = Новый Запрос;
ЗапросCOM.УстановитьПараметр("ДатаОкончания", COM.NewObject("Граница",КонецДня(КонДата),БазаCOM.ВидГраницы.Включая)); ЗапросCOM.УстановитьПараметр("ДатаОкончания", Новый Граница(КонецДня(КонДата), ВидГраницы.Включая));
ЗапросCOM.УстановитьПараметр("Контрагент",   БазаCOM.Справочники.Контрагенты.НайтиПоРеквизиту("Код",Контрагент.Код)); Необходимо изменить условие в запросе.
«ГДЕ Контрагент = &Контрагент»
заменить на
«ГДЕ Контрагент.Код = &Код» 
и передать «Код» в качестве параметра.
СписокСчетов.Добавить(COM.ПланыСчетов.Хозрасчетный.НайтиПоКоду("75")); СписокСчетов.Добавить(ПланыСчетов.Хозрасчетный.НайтиПоКоду("75"));
РезультатИтогиCOM = ЗапросCOM.Выполнить().Выгрузить(); РезультатИтоги = глЗапрос("БП", Запрос);

 

Гарантия возврата денег

ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом в течение 14-ти дней со дня поступления денег на наш счет.

Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.

Для возврата оплаты просто свяжитесь с нами.

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

Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. novatrade 23.02.20 22:05 Сейчас в теме
а в чем быстрее получается? в выполнении запроса? в передаче данных? как Вы сравнивали?
2. Техподдержка 25.02.20 09:13
(1) отпадает необходимость создавать COM-подключение, на создание которого тратится много времени, вместо этого запрос можно выполнить так же как и к этой базе
3. novatrade 27.02.20 22:30 Сейчас в теме
Честно, не понял в чем тратится много времени. На само соединение или передачу данных?
5. novatrade 28.02.20 19:57 Сейчас в теме
сделайте модуль в принимающей базе, в качестве параметра передавайте текст запроса и условия - получайте результат. Будет работать быстро
6. Техподдержка 28.02.20 20:03
(5) напишите подробнее пожалуйста, интересно
7. novatrade 28.02.20 20:40 Сейчас в теме
После выходных постараюсь
Оставьте свое сообщение

См. также

Публикаций не найдено

Попробуйте расширить область поиска, проверьте поисковый запрос и повторите попытку.

Или закажите индивидуальную разработку вашего решения.

Создать заказ на разработку