При проектировании механизмов интеграции между базами 1С через веб-сервисы (SOAP) разработчики часто сталкиваются с дилеммой: описывать ли сложную структуру данных в XDTO-пакете или пойти по пути наименьшего сопротивления, упаковав данные в ХранилищеЗначений. Рассмотрим подробнее оба подхода, проанализируем их сильные и слабые стороны, а также выясним, в каких ситуациях оправдано применение каждого из них.
Представим ситуацию: нам необходимо передать остатки товаров (склад, номенклатура, количество) из одной информационной базы в другую. Традиционный путь веб-сервиса предполагает описание выходного параметра как объекта XDTO. Однако создание схемы WSDL и настройка пакетов XDTO требуют времени. Возникает закономерный вопрос: можно ли просто сериализовать данные в XML-строку, поместить её в объект ХранилищеЗначений и передать как один параметр? Технически — да, но за этим решением кроется ряд нюансов.
Этот метод часто выбирают для ускорения разработки, особенно если обмен происходит исключительно между базами на платформе 1С. Рассмотрим, как это работает на практике.
Проанализируем процесс: данные (например, таблица значений или структура) сначала преобразуются в XML или просто сжимаются платформой внутри объекта ХранилищеЗначений. При передаче через веб-сервис этот объект упаковывается в Base64.
Преимущества данного подхода:
ХранилищеЗначений использует алгоритм deflate, что значительно уменьшает объем исходных данных (особенно текстовых XML-структур).WSDL.Пример кода на стороне сервера (отправителя):
Функция ПолучитьОстатки()
ТЗ_Остатки = СформироватьТаблицуОстатков(); // Ваша логика получения данных
Возврат Новый ХранилищеЗначений(ТЗ_Остатки, Новый СжатиеДанных(9));
КонецФункции
Недостатки и «подводные камни»:
ValueStorage. Это делает ваш сервис совместимым только с другими базами 1С.XDTO — это «родной» для веб-сервисов способ описания данных. Мы создаем строгое описание каждого поля, его типа (число, строка, дата) и вложенности.
Почему стоит выбрать XDTO:
decimal, веб-сервис выдаст ошибку валидации схемы еще до выполнения кода 1С.Разберем ситуацию с использованием 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), ХранилищеЗначений остается рабочим инструментом для быстрой «проброски» данных, при условии, что вы осознаете все риски, связанные с совместимостью и нагрузкой на память.