При разработке интеграций в 1С:Предприятие часто возникает задача выгрузить данные из результата запроса в формат JSON. Рассмотрим частую проблему: при формировании тела JSON в цикле первая запись создается корректно, а начиная со второй значения и свойства разбиваются неверно, идут на разных строках или разделяются лишними запятыми.
Проанализируем ситуацию подробнее. Ошибка, как правило, кроется в ручной конкатенации строк или неверном порядке вызова низкоуровневых методов записи. Если посмотреть на проблемный код, то можно заметить, что вместо правильного формата "ИмяСвойства": "Значение", алгоритм начинает генерировать структуру вида "ИмяСвойства", "ИмяСвойства". Это ломает валидность JSON-документа. Давайте разберем по шагам, как избежать подобных проблем и использовать современные возможности платформы 1С.
Основная рекомендация для современных версий платформы 1С — не собирать JSON посимвольно или с помощью ручного управления скобками в цикле. Платформа обладает отличными механизмами для сериализации готовых структур данных.
Вместо использования методов ЗаписатьНачалоОбъекта или ЗаписатьИмяСвойства, сформируем данные в оперативной памяти с помощью объектов Массив и Структура. При обходе выборки запроса мы просто добавляем каждую новую строку как структуру в общий массив. Выясним причину, почему это лучше: платформа автоматически расставит все фигурные и квадратные скобки, а также запятые без синтаксических ошибок.
МассивДанных = Новый Массив;
Пока Выборка.Следующий() Цикл
СтрокаДанных = Новый Структура;
СтрокаДанных.Вставить("УИД", Выборка.УИД);
СтрокаДанных.Вставить("Адрес", Выборка.Адрес);
СтрокаДанных.Вставить("Наименование", Выборка.Наименование);
МассивДанных.Добавить(СтрокаДанных);
КонецЦикла;
ЗаписьJSON = Новый ЗаписьJSON;
// Настройка записи...
ЗаписатьJSON(ЗаписьJSON, МассивДанных);
Очень часто данные требуются для отправки по HTTP, и создавать промежуточные текстовые файлы на диске нет никакой необходимости. Посмотрим на метод УстановитьСтроку() у объекта ЗаписьJSON. С его помощью мы можем получить готовый JSON прямо в переменную.
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
// Сериализуем наш массив со структурами
ЗаписатьJSON(ЗаписьJSON, МассивДанных);
// Получаем готовую строку
СтрокаJSON = ЗаписьJSON.Закрыть();
Если стоит задача выгрузить не просто плоскую таблицу, а целые элементы справочников или документов, воспользуемся высокоуровневым механизмом. Рассмотрим объект Сериализатор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С всегда собирайте данные в объекты Структура, Соответствие и Массив, а затем сериализуйте их встроенными методами. Это гарантированно избавит вас от ошибок с забытыми запятыми, неверно закрытыми скобками и съехавшими ключами свойств.