Как передать параметры запроса в веб-сервис 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Способ 1. Сериализация структуры через СериализаторXDTO (обмен между базами 1С)

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

Разберем реализацию этого механизма по шагам:

  1. В метаданных конфигурации открываем свойства веб-сервиса и добавляем в операцию новый входящий параметр, например, ПараметрыЗапроса. В поле типа указываем тип XDTO Structure из пространства имен http://v8.1c.ru/8.1/data/core.
  2. На стороне клиента (в вызывающей базе 1С) формируем структуру с параметрами и выполняем сериализацию с помощью объекта СериализаторXDTO:

ПараметрыДляЗапроса = Новый Структура;
ПараметрыДляЗапроса.Вставить("ДатаНачала", НачалоДня(ТекущаяДата()));
ПараметрыДляЗапроса.Вставить("Организация", ВыбраннаяОрганизация);

Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
ОбъектXDTO = Сериализатор.ЗаписатьXDTO(ПараметрыДляЗапроса);

// Вызов операции веб-сервиса
РезультатWS = ПроксиВебСервиса.ПолучитьДанные(ТекстЗапроса, ОбъектXDTO);

На стороне веб-сервиса (в базе-источнике) выполняем обратную операцию десериализации и передаем параметры в сам запрос:


Функция ПолучитьДанные(ТекстЗапроса, ПараметрыЗапроса) Экспорт
    Сериализатор = Новый СериализаторXDTO(ФабрикаXDTO);
    СтруктураПараметров = Сериализатор.ПрочитатьXDTO(ПараметрыЗапроса);
    
    Запрос = Новый Запрос;
    Запрос.Текст = ТекстЗапроса;
    
    Для Каждого Элемент Из СтруктураПараметров Цикл
        Запрос.УстановитьПараметр(Элемент.Ключ, Элемент.Значение);
    КонецЦикла;
    
    РезультатЗапроса = Запрос.Выполнить();
    Таблица = РезультатЗапроса.Выгрузить();
    
    Возврат Сериализатор.ЗаписатьXDTO(Таблица);
КонецФункции

Этот подход удобен тем, что сохраняются прикладные типы 1С (даты, числа, ссылки), однако он плохо совместим со сторонними клиентами (PHP, Python, JavaScript), поскольку стандартные SOAP-библиотеки внешних платформ часто некорректно обрабатывают внутренние XDTO-типы платформы 1С.

Способ 2. Универсальный формат JSON через строку или HTTP-сервис

Когда к сервису обращаются не только базы 1С, но и сторонние сайты или мобильные приложения, использование XDTO-пакетов 1С становится узким местом. Внешние системы гораздо проще работают с форматом JSON. Проанализируем два варианта работы с JSON:

  1. Передача JSON через строковый параметр SOAP: В операции веб-сервиса параметр объявляется с типом xs:string. Клиент отправляет валидную строку JSON, а внутри функции веб-сервиса 1С выполняет ее парсинг через ЧтениеJSON.
  2. Использование HTTP-сервиса вместо Web-сервиса: HTTP-сервисы платформы 1С (REST-подход) работают быстрее веб-сервисов SOAP за счет отсутствия избыточных конвертов WSDL/SOAP. Запрос с сайта передается стандартным методом POST с телом в виде JSON.

Посмотрим на пример обработки параметров в HTTP-сервисе или веб-сервисе с использованием объекта ЧтениеJSON:


// СтрокаJSON получена из тела запроса HTTP или строкового параметра веб-сервиса
ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(СтрокаJSON);
СтруктураПараметров = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Запрос = Новый Запрос;
Запрос.Текст = ТекстЗапроса;

Для Каждого КлючИЗначение Из СтруктураПараметров Цикл
    Запрос.УстановитьПараметр(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;

Тонкости типизации и проблемы при передаче данных с сайтов

При передаче параметров из внешних систем важно учитывать несколько критических аспектов платформы 1С:

  1. Ссылочные типы и GUID: Если сайт передает строковый идентификатор объекта (UUID), то простое присвоение его в параметр запроса Запрос.УстановитьПараметр("Номенклатура", СтрокаGUID) не сработает при сравнении со ссылочным полем. В 1С ссылка не равна строке. Необходимо либо заранее восстанавливать ссылку через метод менеджера справочника или функцию XMLЗначение(Тип("СправочникСсылка.Номенклатура"), СтрокаGUID), либо строить условия запроса по полю Ссылка.УникальныйИдентификатор.
  2. Списки и массивы: Если в тексте запроса используется оператор В (&Параметр), то значением параметра обязательно должен быть массив (тип Массив) или СписокЗначений. При десериализации из JSON списки автоматически преобразуются в массив, что корректно поддерживается запросами платформы.
  3. Оптимизация памяти: Если запрос возвращает большие объемы строк, выгрузка в промежуточную ТаблицаЗначений создает избыточную нагрузку на рабочий процесс rphost. Рекомендуется обходить результат через Выборка = Запрос.Выполнить().Выбрать() и потоково записывать данные в ответ через объект ЗаписьJSON или ЗаписьXML.

Альтернатива: Стандартный интерфейс OData

Если цель архитектуры — дать внешним сайтам возможность гибко выбирать любые данные без постоянной доработки конфигурации, обратим внимание на встроенный в платформу OData-интерфейс. Он настраивается стандартными средствами публикации базы, поддерживает протокол HTTP/REST, формат JSON, фильтрацию по полям (параметр $filter), выборку конкретных реквизитов ($select) и автоматически сопоставляет внешние GUID со ссылочными данными базы 1С без написания программного кода.

← На главную