Как передать массив или сложную структуру данных через веб-сервис в 1С?

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

При разработке интеграционных решений на платформе 1С:Предприятие часто возникает задача обмена данными между информационными системами посредством веб-сервисов (SOAP). Одной из наиболее частых проблем, с которой сталкиваются разработчики, является невозможность прямой передачи стандартных коллекций 1С, таких как Массив, ТаблицаЗначений или СписокЗначений, через параметры операций веб-сервиса. Давайте разберемся, почему так происходит и как эффективно решить эту задачу.

Почему возникает ошибка несоответствия типов?

Когда мы публикуем веб-сервис, платформа 1С автоматически генерирует WSDL-описание. Этот файл описывает типы данных, которые ожидаются на входе и выходе. В протоколе SOAP типы данных должны быть жестко типизированы и соответствовать стандартам XML Schema (XSD). Стандартные объекты 1С, такие как Массив, не имеют прямого аналога в стандартных примитивных типах SOAP, поэтому при попытке передать их напрямую система выдает ошибку: «Несоответствие типов».

Решение проблемы: Сериализация в XML-строку

Наиболее универсальным и быстрым способом обхода этого ограничения является сериализация объекта в XML-строку. Вместо того чтобы пытаться передать объект как сложный тип, мы превращаем его в текстовое представление, которое легко передается через параметр строкового типа (string).

Шаг 1: Сериализация на стороне отправителя

Для того чтобы преобразовать Массив в строку, мы используем объект СериализаторXDTO. Этот объект позволяет «упаковать» практически любую структуру данных 1С в XML-формат.

Рассмотрим пошаговый процесс сериализации:

  1. Создаем XDTO-представление массива с помощью СериализаторXDTO.ЗаписатьXDTO(Массив).
  2. Используем объект ЗаписьXML для формирования строки.
  3. Записываем данные в память с помощью ФабрикаXDTO.ЗаписатьXML.

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


// Предположим, у нас есть массив, который нужно передать
МассивВОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(Массив);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, МассивВОбъектXDTO);
XmlСтр = ЗаписьXML.Закрыть();

// Теперь XmlСтр содержит строковое представление нашего массива
// Передаем его в метод веб-сервиса
Прокси.ИмяПроцедурыВПриемнике(XmlСтр);

Шаг 2: Десериализация на стороне получателя

После того как принимающая сторона получила строку (параметр типа string), нам необходимо превратить её обратно в полноценный объект 1С. Для этого мы выполняем обратную операцию — десериализацию.

Разберем процесс восстановления данных:

  1. Создаем объект ЧтениеXML и устанавливаем в него полученную строку.
  2. Используем СериализаторXDTO.ПрочитатьXML(ЧтениеXML) для получения исходного объекта.

Пример кода внутри процедуры веб-сервиса на стороне приемника:


// Полученная строка передается в параметр XMLСтруктураСериализованногоОбъекта
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLСтруктураСериализованногоОбъекта);
ВосстановленныйМассив = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();

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

Данный метод обладает рядом важных особенностей, которые стоит учитывать при проектировании архитектуры обмена:

Альтернатива: Использование пакетов XDTO

Если вы разрабатываете API, которое будет использоваться не только другими базами 1С, но и внешними системами на других языках программирования (например, Java, C#, Python), настоятельно рекомендуется использовать полноценные пакеты XDTO.

В этом случае вы создаете в конфигураторе пакет, описываете там структуру (тип объекта), например, «МассивСтрок» или «ТаблицаТоваров», и используете этот тип в параметрах операции веб-сервиса. Это сделает ваш сервис понятным для любого разработчика, использующего стандартные средства генерации прокси-классов на основе WSDL.

Рекомендация по современным стандартам

В современных реализациях интеграции все чаще отказываются от тяжеловесного формата XML в пользу JSON. Методы ЗаписатьJSON и ПрочитатьJSON в 1С работают быстрее и создают гораздо менее объемные пакеты данных. При передаче через веб-сервис JSON также упаковывается в строку, но при этом является стандартом де-факто для большинства современных веб-интерфейсов.

Выбирайте метод сериализации в зависимости от вашей задачи: если нужно быстро связать две базы 1С — используйте сериализацию в строку через СериализаторXDTO. Если же вы создаете публичный сервис — проектируйте пакеты XDTO или используйте обмен через JSON.

← На главную