К статье
Практический материал

Разработка и Конфигурация · 12 мин

Как записать массив в JSON в 1С

Как записать массив 1С в JSON: ЗаписьJSON, сериализация, структуры и соответствия. Примеры кода, ошибки, проверка результата и ответы на вопросы.

Задача записать массив в JSON возникает в 1С постоянно: при обмене с сайтами, мобильными приложениями, веб-сервисами и при выгрузке данных во внешние системы. Платформа 1С:Предприятие предлагает несколько механизмов — от универсального объекта ЗаписьJSON до автоматической сериализации через СериализаторXDTO, — и выбор зависит от того, какой именно массив вы передаёте и кто будет читать результат.

Ключевой момент, который нужно понять сразу: в JSON массив — это упорядоченный список значений в квадратных скобках [...]. Массив 1С (Массив) идеально ложится на эту структуру, но таблица значений, выборка из запроса или список значений требуют предварительного преобразования. Если пропустить этот шаг, на выходе получится либо ошибка, либо JSON, который принимающая сторона не сможет разобрать.

Ниже разобраны рабочие способы записи массива в JSON с готовым кодом, типичные ошибки сериализации, проверка результата и ответы на частые вопросы разработчиков.

Какие инструменты платформа даёт для записи JSON

В платформе 1С:Предприятие есть три основных подхода к формированию JSON. Первый — объект ЗаписьJSON, который работает как потоковый писатель: вы явно открываете объекты и массивы, записываете свойства и значения. Это самый контролируемый и самый часто используемый способ.

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

Для задачи «записать массив» оптимален первый способ — ЗаписьJSON. Он доступен в тонком, толстом и веб-клиенте, не требует внешних компонентов и позволяет точно управлять именами свойств и порядком элементов.

Запись простого массива через ЗаписьJSON

Базовый сценарий: есть массив примитивных значений (строки, числа), и его нужно получить в виде JSON-строки. Объект ЗаписьJSON создаётся, настраивается через УстановитьСтроку(), после чего открывается массив и в цикле записываются элементы.

Функция МассивВJSON(МассивЗначений)

Запись = Новый ЗаписьJSON;

ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Авто);

Запись.УстановитьСтроку(ПараметрыЗаписи);

Запись.ЗаписатьНачалоМассива();

Для Каждого Элемент Из МассивЗначений Цикл

Запись.ЗаписатьЗначение(Элемент);

КонецЦикла;

Запись.ЗаписатьКонецМассива();

Возврат Запись.Закрыть();

КонецФункции

Метод ЗаписатьЗначение() сам подбирает JSON-представление по типу значения: число запишется как число, строка — как строка в кавычках, булево — как true/false, дата — в формате ISO 8601. Неопределено превращается в null.

Порядок действий
  1. 1
    Создайте объект ЗаписьJSON и вызовите УстановитьСтроку() с параметрами записи
  2. 2
    Откройте массив методом ЗаписатьНачалоМассива()
  3. 3
    В цикле запишите элементы через ЗаписатьЗначение()
  4. 4
    Закройте массив методом ЗаписатьКонецМассива()
  5. 5
    Получите готовую строку через Закрыть() и проверьте её чтением обратно

Обратите внимание: если вызвать Закрыть() до ЗаписатьКонецМассива(), платформа выдаст ошибку о нарушении структуры документа. Каждый открытый массив или объект обязан быть закрыт строго в обратном порядке — как скобки в выражении.

Массив объектов: структуры и данные из запроса

На практике чаще нужен не плоский массив, а массив объектов — например, список товаров с полями. В JSON это выглядит как [{"Код":"001","Наименование":"Товар"},...]. В 1С такой объект удобно собирать структурой, а записывать комбинацией ЗаписатьНачалоОбъекта и ЗаписатьСвойство/ЗаписатьЗначение.

Запрос = Новый Запрос(

"ВЫБРАТЬ ПЕРВЫЕ 100

| Номенклатура.Код КАК Код,

| Номенклатура.Наименование КАК Наименование

|ИЗ Справочник.Номенклатура КАК Номенклатура");

Запись = Новый ЗаписьJSON;

Запись.УстановитьСтроку();

Запись.ЗаписатьНачалоМассива();

Выборка = Запрос.Выполнить().Выбрать();

Пока Выборка.Следующий() Цикл

Запись.ЗаписатьНачалоОбъекта();

Запись.ЗаписатьИмяСвойства("code");

Запись.ЗаписатьЗначение(СокрЛП(Выборка.Код));

Запись.ЗаписатьИмяСвойства("name");

Запись.ЗаписатьЗначение(СокрЛП(Выборка.Наименование));

Запись.ЗаписатьКонецОбъекта();

КонецЦикла;

Запись.ЗаписатьКонецМассива();

СтрокаJSON = Запись.Закрыть();

Здесь важны два момента. Первый: имена свойств лучше задавать латиницей и в едином стиле (camelCase или snake_case), если JSON уходит во внешнюю систему — это общепринятое соглашение API. Второй: строковые значения из базы часто содержат хвостовые пробелы из-за фиксированной длины строк, поэтому СокрЛП() — не украшение, а защита от лишних символов в выгрузке.

Быстрый способ: ЗаписатьJSON с автоматической сериализацией

Если массив содержит только сериализуемые значения — примитивы, структуры, другие массивы — можно обойтись без ручного открытия и закрытия. Глобальная процедура ЗаписатьJSON() принимает объект ЗаписьJSON и значение, которое нужно сериализовать целиком.

Данные = Новый Массив;

Данные.Добавить(Новый Структура("Код, Имя", "001", "Первый"));

Данные.Добавить(Новый Структура("Код, Имя", "002", "Второй"));

Запись = Новый ЗаписьJSON;

Запись.УстановитьСтроку();

ЗаписатьJSON(Запись, Данные);

СтрокаJSON = Запись.Закрыть();

Структура сериализуется в JSON-объект, где имена ключей совпадают с именами свойств структуры. Это удобно, но накладывает ограничение: имена свойств должны быть допустимыми идентификаторами 1С, поэтому ключи с дефисом или пробелами таким способом не сделать — придётся вернуться к ручной записи через ЗаписатьИмяСвойства.

Сравнение вариантов

ЗаписьJSON вручную

Полный контроль над именами свойств, типами и вложенностью. Подходит для любых данных и внешних API, но кода больше.

ЗаписатьJSON() со структурами

Короткий код для типовых выгрузок. Ограничение: имена ключей — только допустимые идентификаторы 1С, типы — только сериализуемые.

СериализаторXDTO

Надёжен для обмена между базами 1С по планам обмена. Для произвольного JSON внешнему потребителю избыточен и даёт специфичный формат.

Преобразование таблицы значений и списка значений

Таблица значений и список значений напрямую в JSON-массив не сериализуются — их нужно предварительно превратить в массив структур. Для таблицы значений типовой приём — перебрать строки и для каждой собрать структуру по колонкам.

Функция ТаблицаВМассивСтруктур(ТЗ)

Результат = Новый Массив;

ИменаКолонок = Новый Массив;

Для Каждого Колонка Из ТЗ.Колонки Цикл

ИменаКолонок.Добавить(Колонка.Имя);

КонецЦикла;

Для Каждого СтрокаТЗ Из ТЗ Цикл

Элемент = Новый Структура;

Для Каждого ИмяКолонки Из ИменаКолонок Цикл

Элемент.Вставить(ИмяКолонки, СтрокаТЗ[ИмяКолонки]);

КонецЦикла;

Результат.Добавить(Элемент);

КонецЦикла;

Возврат Результат;

КонецФункции

Полученный массив структур дальше записывается любым из описанных способов. У списка значений проще: достаточно перебрать элементы и взять Элемент.Значение, отбросив представление и картинку, которые в JSON не имеют смысла.

Если таблица значений большая (десятки тысяч строк), не собирайте JSON целиком в памяти через УстановитьСтроку(). Используйте ОткрытьФайл() у ЗаписьJSON — потоковая запись в файл снижает потребление памяти и не упирается в лимиты длинных строк.
ПЗ
Практическое замечание

Запись JSON в файл и передача по HTTP

Когда JSON нужен не как строка, а как файл на диске или тело HTTP-запроса, объект ЗаписьJSON открывается иначе. Для файла используется метод ОткрытьФайл() с указанием пути и, при необходимости, кодировки. По умолчанию файл пишется в UTF-8, что соответствует ожиданиям большинства внешних систем.

Запись = Новый ЗаписьJSON;

Запись.ОткрытьФайл("C:\Exchange\goods.json");

Запись.ЗаписатьНачалоМассива();

// ... запись элементов ...

Запись.ЗаписатьКонецМассива();

Запись.Закрыть();

Для отправки по HTTP строку JSON передают в тело запроса с заголовком Content-Type: application/json; charset=utf-8. Если массив — это весь документ целиком, тело будет начинаться с [; если массив — часть структуры ответа, сначала открывают объект, записывают имя свойства и только потом массив.

Проверка результата и типичные ошибки

Самый надёжный способ убедиться, что JSON сформирован правильно, — прочитать его обратно. Платформа предоставляет ЧтениеJSON: если чтение проходит без исключения и возвращает массив ожидаемой длины, структура корректна. Дополнительно полезно прогнать строку через любой внешний валидатор JSON, особенно перед передачей заказчику API.

Контрольные точки

Как проверить результат

Чтение обратно через ЧтениеJSON
Норма

Прочитан массив, количество элементов совпадает с исходным

Тревожный признак

Исключение при чтении или массив пуст

Структура строки
Норма

Документ начинается с [ и заканчивается ], кавычки парные

Тревожный признак

Обрыв строки, лишние запятые, незакрытые скобки

Типы значений
Норма

Числа без кавычек, строки в кавычках, даты в ISO-формате

Тревожный признак

Числа как строки, даты в произвольном формате

Кодировка файла
Норма

UTF-8, кириллица читается внешней системой

Тревожный признак

Кракозябры вместо русских букв у получателя

Из ошибок чаще всего встречаются три. Первая — попытка записать несериализуемый тип (например, объект запроса или ссылку без преобразования), что приводит к исключению. Вторая — нарушение парности открывающих и закрывающих вызовов, особенно при вложенных массивах внутри объектов. Третья — смешение ручной записи и ЗаписатьJSON() в одном потоке без понимания, что автоматическая сериализация сама открывает и закрывает структуры.

Типичные ошибки
01
Запись ссылки справочника напрямую — внешняя система получает нечитаемое представление вместо GUID или кода
02
Пропуск ЗаписатьКонецМассива() — исключение при Закрыть() и потеря всей выгрузки
03
Имена свойств с пробелами или дефисами при сериализации структур — ошибка, так как имена должны быть идентификаторами
04
Запись строки целиком в память для больших данных — рост потребления памяти и замедление
05
Отсутствие СокрЛП() для строк из базы — хвостовые пробелы ломают сравнение у получателя
Итог

Что важно запомнить

Массив 1С записывают в JSON через ЗаписьJSON: открыть массив, записать элементы, закрыть. Для массива объектов используют структуры или ручную запись свойств, ссылки предварительно преобразуют в GUID или коды, а результат проверяют обратным чтением.

Частые вопросы о записи массива в JSON

Как записать в JSON только GUID ссылок вместо полных объектов?

Переберите массив ссылок и записывайте каждую как строку через XMLСтрока(Ссылка) — получите GUID в виде строки. При обратном чтении в другой базе 1С используйте XMLЗначение(Тип, Строка) для восстановления ссылки.

Можно ли записать массив внутри объекта, а не как весь документ?

Да. Сначала вызовите ЗаписатьНачалоОбъекта(), затем ЗаписатьИмяСвойства("items"), после чего ЗаписатьНачалоМассива(), элементы, ЗаписатьКонецМассива() и ЗаписатьКонецОбъекта(). Получится структура вида {"items": [...]}.

Почему даты в JSON выглядят не так, как ожидает внешняя система?

По умолчанию дата сериализуется в формате ISO 8601. Если принимающая сторона требует другой формат, преобразуйте дату в строку сами через Формат(Дата, "ДФ=...") и записывайте как строку, либо согласуйте формат в спецификации обмена.

Что делать, если массив вложенный — массив массивов?

Механизм тот же: внутри цикла по внешнему массиву для каждого вложенного вызывайте ЗаписатьНачалоМассива(), записывайте его элементы и закрывайте. Глубина вложенности не ограничена практически, главное — соблюдать порядок закрытия.

Как записать массив в JSON на мобильной платформе или в веб-клиенте?

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

Есть ли ограничение на размер JSON-строки?

Явного жёсткого лимита у строки 1С нет, но на практике очень большие строки замедляют работу и потребляют много памяти. Для выгрузок значительного объёма надёжнее писать напрямую в файл через ОткрытьФайл() или разбивать данные на порции.