Top.Mail.Ru
Заказать консультацию
специалиста 1С
Отправить заявку

ИнфоСофт использует файлы «cookie» с целью персонализации сервисов и повышения удобства пользования веб-сайтом. Вы можете запретить обработку сookies в настройках браузера. Пожалуйста, ознакомьтесь с политикой использования cookies.
Оставаясь на сайте, вы соглашаетесь с политикой использования cookies.

Универсальный метод получения данных через веб-сервис на примере интеграции 1С:ERP - 1С:ДО 2.1

Корхов Иван Посмотреть все статьи >> Ведущий разработчик 1С франчайзинговой сети «ИнфоСофт».
03.07.2026
71
Время прочтения - 7 мин.
Заказать консультацию

При планировании объёмных доработок веб-сервисов очень часто требуется дорабатывать или разрабатывать большое количество методов для получения данных. Приходится многократно анализировать типовые или добавленные методы для внесения изменений, что занимает большое количество времени и ресурсов.

В этой статье я продемонстрирую решение, которое значительно сократит трудоемкость выполнения таких задач. Несмотря на то, что я покажу пример на интеграции 1С:ERP - 1С:ДО 2.1, подобный механизм можно использовать для любого веб-сервиса.

Суть механизма заключается в том, что мы напишем универсальный метод получения данных. Метод будет принимать запрос и его параметры в формате JSON. Обработка запроса будет учитывать всевозможные детали и возвращать результат в удобной нам форме. Приступим:

01


      Для начала напишем саму функцию обработки запроса. В функцию будет передаваться параметр «СтруктураСообщения». Параметр в формате структуры будет содержать все нужные нам свойства метода. В свойстве «query» передадим текст запроса. Сам текст запроса должен быть написан так, как выглядел бы обычный запрос в базе-источнике данных.

Рисунок1.png


      Сам запрос может содержать ссылочные поля, которые мы будем обрабатывать уже после выполнения запроса. Создадим новую таблицу и пройдемся по всем колонкам результата запроса для проверки. Колонки ссылочного типа мы разобьем на две другие колонки: первая - с уникальным идентификатором, вторая - с типом значения. На стороне запроса к веб-сервису нужно будет получать ссылку по этим двум колонкам. Колонки с простыми типами данных оставляем как есть.

Рисунок2.png


      Теперь заполним эту таблицу на основании результата запроса. При необходимости можно добавить обработку значений, помимо ссылочных и простых типов данных.

Рисунок3.png
02


      Теперь добавим установку параметров запроса из параметра метода «parameters». Параметр метода будет содержать структуру, где ключ — имя параметра запроса. Учтем преобразование к дате, так как она будет прочитана в виде строки. В параметрах также будем учитывать ссылочные поля. Для этого ссылочные поля будут отправляться в виде структуры со свойствами «ID» и «Тип». Как и в прошлом подпункте, при необходимости можно расширить список обрабатываемых типов объектов.

Рисунок4.png
03


      Иногда возникает необходимость получать несколько пакетов данных за один запрос. Чтобы избежать выполнения нескольких отдельных запросов, добавим возможность получать сразу несколько пакетов, используя параметр «packages». Этот параметр будет содержать массив номеров пакетов запроса, которые необходимо вернуть. При наличии этого параметра будем записывать указанные пакеты запроса в результирующий массив.

Рисунок5.png
04


      Добавим возможность включения привилегированного режима для обхода ограничений прав пользователя в те моменты, когда это необходимо.

Рисунок6.png


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

Рисунок7.png


   Функция универсального запроса написана. Теперь нужно описать её вызов. Это можно сделать любым удобным вам способом. Я покажу вариант на примере интеграции 1С:ERP – 1С:ДО 2.1. В метод «DMCreateRequest» добавим обработку нестандартных сообщений. Теперь при любой необходимости в получении данных мы сможем вызвать этот метод, передав тип сообщения «getDataUniversalQuery» и параметры сообщения в формате JSON.

Рисунок8.png


   Всё готово. Давайте напишем простой пример вызова этого метода.

Рисунок9.png

Универсальный метод получения данных через веб-сервис готов. Теперь при необходимости получить какие-либо данные нам достаточно написать обычный запрос к информационной базе, а затем обработать его результат. Больше не потребуется каждый раз искать или писать с нуля методы веб-сервиса. А для анализа запроса достаточно посмотреть текст запроса в коде базы-приемника. Все это позволит значительно сократить часы разработки.

Листинг метода универсального запроса

Функция ИС_ПолучитьДанныеУниверсальнымЗапросом(СтруктураСообщения)

Запрос = Новый Запрос;

Запрос.Текст = СтруктураСообщения.query;

Если СтруктураСообщения.Свойство("parameters") Тогда

Для Каждого ПараметрЗапроса Из СтруктураСообщения.Parameters Цикл

Если ТипЗнч(ПараметрЗапроса.Значение) = Тип("Структура") Тогда

ТипМассив = СтрРазделить(ПараметрЗапроса.Значение.Тип, ".");

Если ТипМассив[0] = "Справочники" Тогда

ЗначениеСсылка = Справочники[ТипМассив[1]].ПолучитьСсылку(

Новый УникальныйИдентификатор(ПараметрЗапроса.Значение.ID));

ИначеЕсли ТипМассив[0] = "Документы" Тогда

ЗначениеСсылка = Документы[ТипМассив[1]].ПолучитьСсылку(

Новый УникальныйИдентификатор(ПараметрЗапроса.Значение.ID));

КонецЕсли;

Запрос.УстановитьПараметр(ПараметрЗапроса.Ключ, ЗначениеСсылка);

Иначе

Если ТипЗнч(ПараметрЗапроса.Значение) = Тип("Строка")

И СтрПодобнаПоРегулярномуВыражению(ПараметрЗапроса.Значение,
"....-..-..T..:..:..") Тогда

ЗначениеДата = ПрочитатьДатуJSON(ПараметрЗапроса.Значение,
ФорматДатыJSON.ISO);

Запрос.УстановитьПараметр(ПараметрЗапроса.Ключ, ЗначениеДата);

Иначе

Запрос.УстановитьПараметр(ПараметрЗапроса.Ключ,
ПараметрЗапроса.Значение);

КонецЕсли;

КонецЕсли;

КонецЦикла;

КонецЕсли;

Если СтруктураСообщения.Свойство("privilegedMode") Тогда

УстановитьПривилегированныйРежим(Истина);

КонецЕсли;

МассивРезультатов = Новый Массив;

Если СтруктураСообщения.Свойство("packages") Тогда

РезультатыЗапроса = Запрос.ВыполнитьПакет();

Для Каждого НомерПакета Из СтруктураСообщения.packages Цикл

МассивРезультатов.Добавить(РезультатыЗапроса[НомерПакета].Выгрузить());

КонецЦИкла;

Иначе

МассивРезультатов.Добавить(Запрос.Выполнить().Выгрузить());

КонецЕсли;

МассивОтвет = Новый Массив;

Для Каждого РезультатЗапроса Из МассивРезультатов Цикл

ОбработаннаяТаблица = Новый ТаблицаЗначений;

ВсеСсылки = ОбщегоНазначения.ОписаниеТипаВсеСсылки();

Для Каждого КолонкаРезультата Из РезультатЗапроса.Колонки Цикл

СодержитСсылочныйТип = Ложь;

Для Каждого ТипЗнач Из КолонкаРезультата.ТипЗначения.Типы() Цикл

Если ВсеСсылки.СодержитТип(ТипЗнач) Тогда

СодержитСсылочныйТип = Истина;

Прервать;

КонецЕсли;

КонецЦикла;

Если СодержитСсылочныйТип Тогда

ОбработаннаяТаблица.Колонки.Добавить(КолонкаРезультата.Имя, Новый
ОписаниеТипов("Строка"));

ОбработаннаяТаблица.Колонки.Добавить(СтрШаблон("%1Тип",
КолонкаРезультата.Имя),

Новый ОписаниеТипов("Строка"));

Иначе

ОбработаннаяТаблица.Колонки.Добавить(КолонкаРезультата.Имя,
КолонкаРезультата.ТипЗначения);

КонецЕсли;

КонецЦикла;

Для Каждого СтрРезультата Из РезультатЗапроса Цикл

НовСтр = ОбработаннаяТаблица.Добавить();

Для Каждого КолРез Из РезультатЗапроса.Колонки Цикл

Если ОбщегоНазначения.ЭтоСсылка(ТипЗнч(СтрРезультата[КолРез.Имя]))
Тогда

НовСтр[КолРез.Имя] =
Строка(СтрРезультата[КолРез.Имя].УникальныйИдентификатор());

ИмяТипа =
Метаданные.НайтиПоТипу(ТипЗнч(СтрРезультата[КолРез.Имя])).ПолноеИмя();

МассивИмени = СтрРазделить(ИмяТипа, ".");

НовСтр[СтрШаблон("%1Тип", КолРез.Имя)] = СтрШаблон("%1Ссылка.%2",
МассивИмени[0], МассивИмени[1]);

Иначе

НовСтр[КолРез.Имя] = СтрРезультата[КолРез.Имя];

КонецЕсли;

КонецЦикла;

КонецЦикла;

МассивОтвет.Добавить(ОбработаннаяТаблица);

КонецЦикла;

Если СтруктураСообщения.Свойство("privilegedMode") Тогда

УстановитьПривилегированныйРежим(Ложь);

КонецЕсли;

Если СтруктураСообщения.Свойство("packages") Тогда

Возврат ЗначениеВСтрокуВнутр(МассивОтвет);

ИначеЕсли МассивОтвет.Количество() Тогда

Возврат ЗначениеВСтрокуВнутр(МассивОтвет[0]);

Иначе

Возврат Неопределено;

КонецЕсли;

КонецФункции



Заказать консультацию специалиста 1С
Оставьте заявку и наши эксперты проконсультируют вас по данной статье.
Рассказать друзьям
1C:ERP 1С:Документооборот
Вам может быть интересно: