Веб-сервис в 1С: что выбрать — XDTO-пакет или ХранилищеЗначений?

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

При проектировании механизмов интеграции между базами 1С через веб-сервисы (SOAP) разработчики часто сталкиваются с дилеммой: описывать ли сложную структуру данных в XDTO-пакете или пойти по пути наименьшего сопротивления, упаковав данные в ХранилищеЗначений. Рассмотрим подробнее оба подхода, проанализируем их сильные и слабые стороны, а также выясним, в каких ситуациях оправдано применение каждого из них.

Суть проблемы и постановка задачи

Представим ситуацию: нам необходимо передать остатки товаров (склад, номенклатура, количество) из одной информационной базы в другую. Традиционный путь веб-сервиса предполагает описание выходного параметра как объекта XDTO. Однако создание схемы WSDL и настройка пакетов XDTO требуют времени. Возникает закономерный вопрос: можно ли просто сериализовать данные в XML-строку, поместить её в объект ХранилищеЗначений и передать как один параметр? Технически — да, но за этим решением кроется ряд нюансов.

Вариант 1: Использование ХранилищаЗначений (ValueStorage)

Этот метод часто выбирают для ускорения разработки, особенно если обмен происходит исключительно между базами на платформе 1С. Рассмотрим, как это работает на практике.

Проанализируем процесс: данные (например, таблица значений или структура) сначала преобразуются в XML или просто сжимаются платформой внутри объекта ХранилищеЗначений. При передаче через веб-сервис этот объект упаковывается в Base64.

Преимущества данного подхода:

  1. Простота реализации: Не нужно описывать типы данных в дереве XDTO-пакетов. Вы просто передаете «контейнер».
  2. Автоматическое сжатие: Платформа 1С при помещении данных в ХранилищеЗначений использует алгоритм deflate, что значительно уменьшает объем исходных данных (особенно текстовых XML-структур).
  3. Гибкость: Вы можете менять структуру передаваемых данных внутри хранилища, не обновляя описание веб-сервиса и не перегенерируя WSDL.

Пример кода на стороне сервера (отправителя):


Функция ПолучитьОстатки()
    ТЗ_Остатки = СформироватьТаблицуОстатков(); // Ваша логика получения данных
    Возврат Новый ХранилищеЗначений(ТЗ_Остатки, Новый СжатиеДанных(9));
КонецФункции

Недостатки и «подводные камни»:

Вариант 2: Использование XDTO (XML Data Transfer Objects)

XDTO — это «родной» для веб-сервисов способ описания данных. Мы создаем строгое описание каждого поля, его типа (число, строка, дата) и вложенности.

Почему стоит выбрать XDTO:

  1. Строгая типизация: Платформа автоматически проверяет данные. Если вы попытаетесь передать строку в поле, где ожидается decimal, веб-сервис выдаст ошибку валидации схемы еще до выполнения кода 1С.
  2. Прозрачность (WSDL): Любая внешняя система, прочитав описание вашего сервиса, поймет, какие именно данные он возвращает. Это стандарт индустрии.
  3. Производительность парсинга: Сериализация и десериализация объектов XDTO на уровне платформы часто работает эффективнее, чем ручной разбор XML-файла, извлеченного из хранилища.

Разберем ситуацию с использованием XDTO. Для передачи списка остатков нам потребуется создать пакет XDTO, определить в нем тип объекта (например, ОстатокТовара) и тип списка. В коде это будет выглядеть следующим образом:


// Создание объекта XDTO на основании типа из пакета
ТипОбъекта = ФабрикаXDTO.Тип("http://www.mycompany.ru/stocks", "StockItem");
НовыйОбъект = ФабрикаXDTO.Создать(ТипОбъекта);
НовыйОбъект.Warehouse = "Основной склад";
НовыйОбъект.Product = "Кирпич";
НовыйОбъект.Quantity = 100;

Сравнение производительности и лимитов

Выясним причину, по которой ХранилищеЗначений может стать проблемой при больших объемах данных. При формировании ответа сервер 1С должен сформировать весь объект целиком в оперативной памяти. Если вы упаковываете миллион строк остатков в одно ХранилищеЗначений, существует риск получить ошибку Out of Memory или падение рабочего процесса rphost.

Проанализируем технический аспект: при использовании XDTO платформа может оптимизировать передачу, но в случае с SOAP «потоковая» передача (streaming) затруднена. Тем не менее, XDTO позволяет более гибко управлять структурой данных. Если вы используете платформу 8.2 (где нет HTTP-сервисов), единственным способом ускорить типизированный обмен является использование технологии FastInfoset — бинарного XML, который поддерживается веб-сервисами 1С и позволяет передавать данные компактно, сохраняя преимущества XDTO.

Рекомендации по выбору

Подведем итог и определим критерии выбора:

Важно помнить: использование веб-сервиса (SOAP) для передачи ХранилищаЗначений — это компромисс. Как справедливо заметили участники обсуждения, если вам не нужна валидация на уровне схемы, то в современных версиях платформы (8.3.6 и выше) лучше использовать HTTP-сервисы. Они лишены накладных расходов SOAP, не требуют Base64 для передачи бинарных данных (через multipart/form-data или application/octet-stream) и работают быстрее.

Однако в условиях ограничений (например, работа на платформе 8.2), ХранилищеЗначений остается рабочим инструментом для быстрой «проброски» данных, при условии, что вы осознаете все риски, связанные с совместимостью и нагрузкой на память.

← На главную