Как правильно настроить XDTO для обработки JSON-массивов в 1С

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

При интеграции 1С с внешними системами через REST API мы часто сталкиваемся с форматом JSON. Одной из самых распространенных проблем является десериализация массивов простых типов (строк, чисел) в объекты XDTO. Типичная ситуация: поставщик присылает поле itemProblemTypes, которое содержит массив строк ["Not found", "Found but not"], но при попытке прочитать этот JSON в объект XDTO платформа выдает ошибку преобразования.

В этой статье мы подробно разберем, как «подружить» механизмы XDTO с массивами JSON, правильно настроить пакеты и написать программный код для обработки таких данных.

Разбор причины ошибки: почему XDTO «спотыкается» на массиве

Разберем ситуацию: когда 1С использует ФабрикаXDTO.ПрочитатьJSON, она сопоставляет ключи из JSON-файла со свойствами, описанными в вашем XDTO-пакете. Если в JSON стоит квадратная скобка [, это означает начало коллекции. Если в вашем XDTO-пакете для этого свойства параметр Максимальное количество (MaxOccurs) установлен в значение 1, механизм десериализации ожидает одиночное значение (строку или объект). Встречая массив, система выдает ошибку: «Ошибка преобразования данных XDTO».

Чтобы решить эту задачу, нам необходимо правильно сконфигурировать свойства в дереве XDTO-пакета.

Способ 1. Правильная настройка свойств в XDTO-пакете

Рассмотрим по шагам, как настроить пакет XDTO для корректного приема массива строк. Допустим, у нас есть объект Item, внутри которого находится массив itemProblemTypes.

  1. Выбор типа свойства: Установите тип свойства как простой тип string из пространства имен http://www.w3.org/2001/XMLSchema (префикс xs или xsd). Не создавайте для него вложенный объект, если в JSON приходят просто строки.
  2. Настройка количества (Bounds): Это критически важный момент. Для свойства itemProblemTypes установите Максимальное количество в значение -1. В интерфейсе конфигуратора это соответствует значению «Неограничено» (Unbounded). Минимальное количество лучше поставить 0, чтобы отсутствие массива не вызывало ошибку.
  3. Форма свойства: Убедитесь, что параметр Форма (Form) установлен в значение Элемент (Element). В JSON-сериализации свойства в форме «Атрибут» не могут быть массивами.
  4. Использование базовых типов: Если поставщик может присылать в массиве данные разных типов, проанализируем возможность использования типа anySimpleType. Это сделает вашу схему более гибкой.

После такой настройки 1С будет понимать, что itemProblemTypes — это не одна строка, а СписокXDTO, состоящий из строк. При чтении JSON массив автоматически превратится в коллекцию элементов.

Способ 2. Обработка через промежуточное чтение в Структуру

Если структура JSON слишком динамична или вы не хотите жестко описывать все типы в XDTO, можно пойти по пути «ручного» разбора. Выясним, как это реализовать программно.

Сначала прочитаем JSON в стандартные коллекции 1С (Структура и Массив):


ЧтениеДЖ = Новый ЧтениеJSON;
ЧтениеДЖ.УстановитьСтроку(ТекстJSON);
Данные = ПрочитатьJSON(ЧтениеДЖ, Истина); // Получаем соответствие или структуру
ЧтениеДЖ.Закрыть();

Затем мы можем перенести эти данные в объект XDTO, созданный по вашей схеме. Это позволяет избежать ошибок при парсинге «сырого» текста и дает полный контроль над процессом.

Способ 3. Универсальная функция преобразования XDTO в Структуру

Часто после получения ОбъектXDTO нам удобнее работать с ним как с обычной структурой 1С, особенно если там есть вложенные списки. Проанализируем пример функции, которая рекурсивно обходит ОбъектXDTO и корректно обрабатывает СписокXDTO (те самые массивы):


Функция ОбъектXDTOВСтруктуру(ОбъектXDTO) Экспорт
    Результат = Новый Структура;
    ТипОбъектаXDTO = ОбъектXDTO.Тип;
    
    Для Каждого Свойство Из ОбъектXDTO.Свойства Цикл
        ИмяСвойства = Свойство.Имя;
        ЗначениеСвойства = ОбъектXDTO[ИмяСвойства];
        
        Если ТипЗнч(ЗначениеСвойства) = Тип("ОбъектXDTO") Тогда
            // Рекурсивно обрабатываем вложенный объект
            Результат.Вставить(ИмяСвойства, ОбъектXDTOВСтруктуру(ЗначениеСвойства));
        ИначеЕсли ТипЗнч(ЗначениеСвойства) = Тип("СписокXDTO") Тогда
            // Обрабатываем массив (список)
            МассивЭлементов = Новый Массив;
            Для Каждого ЭлементСписка Из ЗначениеСвойства Цикл
                Если ТипЗнч(ЭлементСписка) = Тип("ОбъектXDTO") Тогда
                    МассивЭлементов.Добавить(ОбъектXDTOВСтруктуру(ЭлементСписка));
                Иначе
                    МассивЭлементов.Добавить(ЭлементСписка);
                КонецЕсли;
            КонецЦикла;
            Результат.Вставить(ИмяСвойства, МассивЭлементов);
        Иначе
            // Обычное значение (строка, число, булево)
            Результат.Вставить(ИмяСвойства, ЗначениеСвойства);
        КонецЕсли;
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Важные нюансы сериализации (выгрузки) в JSON

Когда нам нужно отправить массив обратно поставщику, важно, чтобы itemProblemTypes ушел именно как [], а не как строка. Рассмотрим правила, которые помогут избежать «костылей» вроде СтрЗаменить:

Типичные ошибки при работе с локальными типами

Рассмотрим ситуацию, когда программист создает внутри свойства itemProblemTypes «Локальный тип» (Local Type). Если вы случайно определили его как DataObjectType (сложный тип), 1С при десериализации будет ожидать, что внутри массива лежат объекты в фигурных скобках [ { "value": "Not found" } ]. Если же в JSON приходят простые строки ["Not found"], возникнет ошибка.

Решение: Всегда проверяйте, чтобы тип элементов списка был простым (xs:string, xs:int), если в JSON передаются примитивные значения.

Заключение

Работа с JSON-массивами в XDTO требует внимательности к настройке Upper Bound и правильному выбору базовых типов в пакете. Посмотрим на итоговый чек-лист:

  1. Максимальное количество = -1.
  2. Тип = xs:string (или другой примитив).
  3. Форма = Элемент.
  4. Использование ФабрикаXDTO.ПрочитатьJSON для автоматического заполнения списков.

Используя эти правила, вы сможете обрабатывать даже самые сложные структуры интеграции без использования сомнительных методов подмены текста.

← На главную