Как правильно формировать JSON в 1С и избежать ошибок синтаксиса в цикле?

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

При разработке интеграций в 1С:Предприятие часто возникает задача выгрузить данные из результата запроса в формат JSON. Рассмотрим частую проблему: при формировании тела JSON в цикле первая запись создается корректно, а начиная со второй значения и свойства разбиваются неверно, идут на разных строках или разделяются лишними запятыми.

Проанализируем ситуацию подробнее. Ошибка, как правило, кроется в ручной конкатенации строк или неверном порядке вызова низкоуровневых методов записи. Если посмотреть на проблемный код, то можно заметить, что вместо правильного формата "ИмяСвойства": "Значение", алгоритм начинает генерировать структуру вида "ИмяСвойства", "ИмяСвойства". Это ломает валидность JSON-документа. Давайте разберем по шагам, как избежать подобных проблем и использовать современные возможности платформы 1С.

Отказ от низкоуровневого формирования вручную

Основная рекомендация для современных версий платформы 1С — не собирать JSON посимвольно или с помощью ручного управления скобками в цикле. Платформа обладает отличными механизмами для сериализации готовых структур данных.

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


МассивДанных = Новый Массив;
Пока Выборка.Следующий() Цикл
    СтрокаДанных = Новый Структура;
    СтрокаДанных.Вставить("УИД", Выборка.УИД);
    СтрокаДанных.Вставить("Адрес", Выборка.Адрес);
    СтрокаДанных.Вставить("Наименование", Выборка.Наименование);
    
    МассивДанных.Добавить(СтрокаДанных);
КонецЦикла;

ЗаписьJSON = Новый ЗаписьJSON;
// Настройка записи...
ЗаписатьJSON(ЗаписьJSON, МассивДанных);

Запись JSON прямо в строку (без файлов)

Очень часто данные требуются для отправки по HTTP, и создавать промежуточные текстовые файлы на диске нет никакой необходимости. Посмотрим на метод УстановитьСтроку() у объекта ЗаписьJSON. С его помощью мы можем получить готовый JSON прямо в переменную.


ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();

// Сериализуем наш массив со структурами
ЗаписатьJSON(ЗаписьJSON, МассивДанных);

// Получаем готовую строку
СтрокаJSON = ЗаписьJSON.Закрыть();

Сериализация сложных объектов платформы (через XDTO)

Если стоит задача выгрузить не просто плоскую таблицу, а целые элементы справочников или документов, воспользуемся высокоуровневым механизмом. Рассмотрим объект СериализаторXDTO.

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

Тонкости работы с датами

Формат JSON сам по себе не имеет базового типа для дат, используются только строки или числа. При выгрузке данных из 1С разработчики часто сталкиваются с проблемой неверного представления времени. Чтобы избежать этого, настроим сериализацию.

Мы можем использовать объект НастройкиСериализацииJSON, в котором явно задаются ВариантЗаписиДаты и ФорматСериализацииДаты. Общепринятым стандартом для WEB-интеграций является формат ISO. Для ручной записи дат в 1С также существует функция глобального контекста ЗаписатьДатуJSON().


НастройкиJSON = Новый НастройкиСериализацииJSON;
НастройкиJSON.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением;
НастройкиJSON.ФорматСериализацииДаты = ФорматДатыJSON.ISO;

ЗаписатьJSON(ЗаписьJSON, МассивДанных, НастройкиJSON);

Использование функции преобразования

При прямой сериализации структур, полученных из запроса, платформа может выдать исключение, если наткнется на тип данных, который она не знает, как перевести в JSON (например, уникальный идентификатор или специфический ссылочный тип). Разберем, как это обойти.

Чтобы цикл не прервался ошибкой, в метод ЗаписатьJSON передадим имя экспортной процедуры — "функции преобразования". Платформа будет вызывать эту функцию для несовместимых свойств, давая нам возможность перехватить значение и вернуть вместо него простую строку или число.

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

← На главную