При разработке интеграционных решений на платформе 1С:Предприятие часто возникает задача обмена данными между информационными системами посредством веб-сервисов (SOAP). Одной из наиболее частых проблем, с которой сталкиваются разработчики, является невозможность прямой передачи стандартных коллекций 1С, таких как Массив, ТаблицаЗначений или СписокЗначений, через параметры операций веб-сервиса. Давайте разберемся, почему так происходит и как эффективно решить эту задачу.
Когда мы публикуем веб-сервис, платформа 1С автоматически генерирует WSDL-описание. Этот файл описывает типы данных, которые ожидаются на входе и выходе. В протоколе SOAP типы данных должны быть жестко типизированы и соответствовать стандартам XML Schema (XSD). Стандартные объекты 1С, такие как Массив, не имеют прямого аналога в стандартных примитивных типах SOAP, поэтому при попытке передать их напрямую система выдает ошибку: «Несоответствие типов».
Наиболее универсальным и быстрым способом обхода этого ограничения является сериализация объекта в XML-строку. Вместо того чтобы пытаться передать объект как сложный тип, мы превращаем его в текстовое представление, которое легко передается через параметр строкового типа (string).
Для того чтобы преобразовать Массив в строку, мы используем объект СериализаторXDTO. Этот объект позволяет «упаковать» практически любую структуру данных 1С в XML-формат.
Рассмотрим пошаговый процесс сериализации:
СериализаторXDTO.ЗаписатьXDTO(Массив).ЗаписьXML для формирования строки.ФабрикаXDTO.ЗаписатьXML.Пример кода для подготовки данных к отправке:
// Предположим, у нас есть массив, который нужно передать
МассивВОбъектXDTO = СериализаторXDTO.ЗаписатьXDTO(Массив);
ЗаписьXML = Новый ЗаписьXML;
ЗаписьXML.УстановитьСтроку();
ФабрикаXDTO.ЗаписатьXML(ЗаписьXML, МассивВОбъектXDTO);
XmlСтр = ЗаписьXML.Закрыть();
// Теперь XmlСтр содержит строковое представление нашего массива
// Передаем его в метод веб-сервиса
Прокси.ИмяПроцедурыВПриемнике(XmlСтр);
После того как принимающая сторона получила строку (параметр типа string), нам необходимо превратить её обратно в полноценный объект 1С. Для этого мы выполняем обратную операцию — десериализацию.
Разберем процесс восстановления данных:
ЧтениеXML и устанавливаем в него полученную строку.СериализаторXDTO.ПрочитатьXML(ЧтениеXML) для получения исходного объекта.Пример кода внутри процедуры веб-сервиса на стороне приемника:
// Полученная строка передается в параметр XMLСтруктураСериализованногоОбъекта
ЧтениеXML = Новый ЧтениеXML;
ЧтениеXML.УстановитьСтроку(XMLСтруктураСериализованногоОбъекта);
ВосстановленныйМассив = СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
ЧтениеXML.Закрыть();
Данный метод обладает рядом важных особенностей, которые стоит учитывать при проектировании архитектуры обмена:
ТаблицыЗначений, ДеревьяЗначений, СпискиЗначений и любые другие структуры, поддерживаемые сериализатором 1С.XDTO в конфигураторе для каждого типа данных, достаточно иметь метод, принимающий string.string, сторонние системы (не на платформе 1С) не будут знать, какая именно структура скрыта внутри XML. Им придется самостоятельно разбирать полученный XML-документ.Если вы разрабатываете API, которое будет использоваться не только другими базами 1С, но и внешними системами на других языках программирования (например, Java, C#, Python), настоятельно рекомендуется использовать полноценные пакеты XDTO.
В этом случае вы создаете в конфигураторе пакет, описываете там структуру (тип объекта), например, «МассивСтрок» или «ТаблицаТоваров», и используете этот тип в параметрах операции веб-сервиса. Это сделает ваш сервис понятным для любого разработчика, использующего стандартные средства генерации прокси-классов на основе WSDL.
В современных реализациях интеграции все чаще отказываются от тяжеловесного формата XML в пользу JSON. Методы ЗаписатьJSON и ПрочитатьJSON в 1С работают быстрее и создают гораздо менее объемные пакеты данных. При передаче через веб-сервис JSON также упаковывается в строку, но при этом является стандартом де-факто для большинства современных веб-интерфейсов.
Выбирайте метод сериализации в зависимости от вашей задачи: если нужно быстро связать две базы 1С — используйте сериализацию в строку через СериализаторXDTO. Если же вы создаете публичный сервис — проектируйте пакеты XDTO или используйте обмен через JSON.