При интеграции систем часто возникает задача построения универсального шлюза, который принимает на вход параметры или текст запроса и возвращает выборку данных. Если с передачей самого текста запроса в виде строки сложностей обычно не возникает, то передача параметров требует правильного выбора архитектуры сериализации и десериализации данных. Рассмотрим подробно, какими способами можно организовать передачу структуры параметров в 1С как для взаимодействия между базами на платформе 1С, так и для интеграции с внешними сайтами и сервисами.
Если вызывающей стороной выступает другая информационная база 1С, наиболее простым и встроенным в платформу решением является использование механизма XDTO. Платформа умеет автоматически преобразовывать прикладные типы данных, такие как Структура, в объекты XDTO и обратно.
Разберем реализацию этого механизма по шагам:
ПараметрыЗапроса. В поле типа указываем тип XDTO Structure из пространства имен http://v8.1c.ru/8.1/data/core.СериализаторXDTO:
ПараметрыДляЗапроса = Новый Структура;
ПараметрыДляЗапроса.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
ПараметрыДляЗапроса.Вставить("Организация", ВыбраннаяОрганизация);
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ОбъектXDTO = Сериализатор.ЗаписатьXDTO(ПараметрыДляЗапроса);
// Вызов операции веб-сервиса
РезультатWS = ПроксиВебСервиса.ПолучитьДанные(ТекстЗапроса, ОбъектXDTO);
На стороне веб-сервиса (в базе-источнике) выполняем обратную операцию десериализации и передаем параметры в сам запрос:
Функция ПолучитьДанные(ТекстЗапроса, ПараметрыЗапроса) Экспорт
Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
СтруктураПараметров = Сериализатор.ПрочитатьXDTO(ПараметрыЗапроса);
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Для Каждого Элемент Из СтруктураПараметров Цикл
Запрос.УстановитьПараметр(Элемент.Ключ, Элемент.Значение);
КонецЦикла;
РезультатЗапроса = Запрос.Выполнить();
Таблица = РезультатЗапроса.Выгрузить();
Возврат Сериализатор.ЗаписатьXDTO(Таблица);
КонецФункции
Этот подход удобен тем, что сохраняются прикладные типы 1С (даты, числа, ссылки), однако он плохо совместим со сторонними клиентами (PHP, Python, JavaScript), поскольку стандартные SOAP-библиотеки внешних платформ часто некорректно обрабатывают внутренние XDTO-типы платформы 1С.
Когда к сервису обращаются не только базы 1С, но и сторонние сайты или мобильные приложения, использование XDTO-пакетов 1С становится узким местом. Внешние системы гораздо проще работают с форматом JSON. Проанализируем два варианта работы с JSON:
xs:string. Клиент отправляет валидную строку JSON, а внутри функции веб-сервиса 1С выполняет ее парсинг через ЧтениеJSON.Посмотрим на пример обработки параметров в HTTP-сервисе или веб-сервисе с использованием объекта ЧтениеJSON:
// СтрокаJSON получена из тела запроса HTTP или строкового параметра веб-сервиса
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
СтруктураПараметров = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();
Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;
Для Каждого КлючИЗначение Из СтруктураПараметров Цикл
Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
При передаче параметров из внешних систем важно учитывать несколько критических аспектов платформы 1С:
Запрос.УстановитьПараметр("Номенклатура", СтрокаGUID) не сработает при сравнении со ссылочным полем. В 1С ссылка не равна строке. Необходимо либо заранее восстанавливать ссылку через метод менеджера справочника или функцию XMLЗначение(Тип("СправочникСсылка.Номенклатура"), СтрокаGUID), либо строить условия запроса по полю Ссылка.УникальныйИдентификатор.В (&Параметр), то значением параметра обязательно должен быть массив (тип Массив) или СписокЗначений. При десериализации из JSON списки автоматически преобразуются в массив, что корректно поддерживается запросами платформы.ТаблицаЗначений создает избыточную нагрузку на рабочий процесс rphost. Рекомендуется обходить результат через Выборка = Запрос.Выполнить().Выбрать() и потоково записывать данные в ответ через объект ЗаписьJSON или ЗаписьXML.Если цель архитектуры — дать внешним сайтам возможность гибко выбирать любые данные без постоянной доработки конфигурации, обратим внимание на встроенный в платформу OData-интерфейс. Он настраивается стандартными средствами публикации базы, поддерживает протокол HTTP/REST, формат JSON, фильтрацию по полям (параметр $filter), выборку конкретных реквизитов ($select) и автоматически сопоставляет внешние GUID со ссылочными данными базы 1С без написания программного кода.