Как исправить ошибку отображения типа Массив в тип string в веб-сервисе 1С

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

При разработке SOAP веб-сервисов в платформе 1С разработчики часто сталкиваются с ошибкой сериализации данных:

Ошибка SOAP сервера: Неизвестная ошибка. Ошибка отображения типов: Отображение типа 'Массив' в тип '{http://www.w3.org/2001/XMLSchema}string'

Разберем по шагам, почему возникает эта ошибка, где кроется типичная невнимательность разработчика и какими способами можно корректно передавать и возвращать списки значений через веб-сервисы.

Причина возникновения ошибки отображения типов

Проанализируем механизм работы веб-сервисов (SOAP) в 1С. SOAP-сервисы жестко типизированы и опираются на схемы XDTO (XML Schema Definition). Когда для операции или параметра веб-сервиса в конфигураторе задан тип {http://www.w3.org/2001/XMLSchema}string, платформа ожидает скалярное строковое значение.

Встроенный тип 1С Массив является внутренней коллекцией значений и не имеет прямого автоматического сопоставления со стандартным типом string. Ошибка возникает в двух случаях:

  1. В операции веб-сервиса указан возвращаемый тип string, но в коде функции модуля веб-сервиса с помощью оператора Возврат передается объект типа Массив (или промежуточная переменная коллекции).
  2. Входящий параметр объявлен как string, а вызывающая сторона отправляет структуру или массив объектов.

Если ошибка вызвана опечаткой в коде функции веб-сервиса, достаточно проверить оператор Возврат и убедиться, что возвращается именно строковое значение, а не созданный для внутренних расчетов массив.

Способ 1. Сериализация массива в формат JSON или XML

Рассмотрим наиболее популярный и простой способ передачи списков значений без изменения схемы типов веб-сервиса. Тип параметра или возвращаемого значения в конфигураторе остается string, а данные упаковываются в строку.

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


Функция ПолучитьСписокДанных()
    МассивДанных = Новый Массив;
    МассивДанных.Добавить("Элемент 1");
    МассивДанных.Добавить("Элемент 2");
    
    // Сериализуем массив в JSON-строку
    ЗаписьJSON = Новый ЗаписьJSON;
    ЗаписьJSON.УстановитьСтроку();
    ЗаписатьJSON(ЗаписьJSON, МассивДанных);
    СтрокаРезультат = ЗаписьJSON.Закрыть();
    
    Возврат СтрокаРезультат;
КонецФункции

Теперь разберем, как прочитать полученную строку с разделителями или JSON-строку на стороне клиента:


ЧтениеJSON = Новый ЧтениеJSON;
ЧтениеJSON.УстановитьСтроку(ПолученнаяСтрока);
МассивРезультат = ПрочитатьJSON(ЧтениеJSON);
ЧтениеJSON.Закрыть();

Для взаимодействия исключительно между двумя базами 1С можно использовать функции ЗначениеВXMLСтроку() и ЗначениеИзXMLСтроки().

Способ 2. Использование собственного XDTO-пакета для строгой типизации

Если веб-сервис должен соответствовать строгому контракту WSDL, где массивы передаются в виде структурированных XML-элементов, выполним настройку через пакет XDTO.

  1. Создадим в дереве метаданных новый XDTO-пакет.
  2. Внутри пакета добавим Тип объекта, например ArrayOfString.
  3. В типе объекта создадим Свойство (например, Item) со строковым типом string.
  4. Установим у свойства параметр Максимальное количество (UpperBound) равным -1 (что эквивалентно unbounded в XML Schema).
  5. В операции веб-сервиса укажем созданный тип XDTO в качестве типа параметра или возвращаемого значения.

Посмотрим, как сформировать и вернуть такой объект в модуле веб-сервиса:


Функция ПолучитьМассивXDTO()
    ТипXDTO = ФабрикаXDTO.Тип("http://v8.1c.ru/custom-ws", "ArrayOfString");
    ОбъектXDTO = ФабрикаXDTO.Создать(ТипXDTO);
    
    МассивСтрок = Новый Массив;
    МассивСтрок.Добавить("Значение 1");
    МассивСтрок.Добавить("Значение 2");
    
    Для Каждого Стр Из МассивСтрок Цикл
        ОбъектXDTO.Item.Добавить(Стр);
    КонецЦикла;
    
    Возврат ОбъектXDTO;
КонецФункции

Способ 3. Переход на HTTP-сервисы (REST)

Если проект допускает архитектурные изменения, для передачи произвольных структур данных и массивов рекомендуется использовать объект конфигурации HTTP-сервисы вместо SOAP веб-сервисов.

HTTP-сервисы не требуют строгой XDTO-схемы, работают напрямую с телом запроса и ответа через объекты HTTPСервисЗапрос и HTTPСервисОтвет, что исключает ошибки несовместимости типов платформы и упрощает интеграцию с внешними системами.

← На главную