Интеграции в 1С

Структура в JSON в 1С: сериализация Структура, Соответствие и Массив

Коротко

Чтобы преобразовать структуру в JSON в 1С, есть два пути. Простой — глобальная функция ЗаписатьJSON(Запись, Значение, ПараметрыЗаписи): сама пройдётся по Структуре, Массиву и Соответствию со строковыми ключами. Ручной — объект ЗаписьJSON с методами ЗаписатьНачалоОбъекта, ЗаписатьИмяСвойства, ЗаписатьЗначение, ЗаписатьКонецОбъекта. Второй вариант нужен, когда простая сериализация не проходит: Соответствие с не-строковыми ключами, особые требования API к формату дат, null-значениям или порядку полей.

Ключевой момент: глобальная ЗаписатьJSON не умеет писать Соответствие, если хоть один ключ не строка — падает с ошибкой. Такой набор данных нужно либо предварительно привести к Структуре/Соответствию со строковыми ключами, либо собрать JSON вручную.

Простой способ: глобальная функция ЗаписатьJSON

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

Данные = Новый Структура;
Данные.Вставить("Наименование", "ООО Ромашка");
Данные.Вставить("ИНН", "7701234567");
Данные.Вставить("Активен", Истина);

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(); // писать в строку, а не в файл
ЗаписатьJSON(Запись, Данные);
JSONСтрока = Запись.Закрыть(); // {"Наименование":"ООО Ромашка","ИНН":"7701234567","Активен":true}
ЗаписатьJSON (глобальная)
ЗаписьJSONобъект-приёмник, куда пишется JSON
ЗначениеСтруктура, Соответствие, Массив или примитив
НастройкиСериализацииформат дат, поведение при null и т.п.
ничего не возвращает, результат — в ЗаписьJSON

Метод Закрыть() у ЗаписьJSON при работе через УстановитьСтроку() возвращает готовую JSON-строку. Это удобно, когда JSON нужно сразу отправить POST-запросом или положить в реквизит.

В параметре НастройкиСериализации задаётся, в частности, формат дат (по умолчанию — ISO 8601) и поведение при значении Неопределено: писать ли его как null, пропускать или падать ошибкой. Именно здесь настраивается поведение, которого требует конкретный API.

Ручной способ: объект ЗаписьJSON

Когда нужно контролировать формат — порядок ключей, отдельные преобразования, особые требования к null и датам, — JSON собирают вручную через методы объекта ЗаписьJSON. Схема всегда одна: открыть приёмник, записать объект/массив, закрыть.

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(); // альтернативы — ОткрытьФайл() или ОткрытьПоток()

Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("Наименование");
Запись.ЗаписатьЗначение("ООО Ромашка");
Запись.ЗаписатьИмяСвойства("ИНН");
Запись.ЗаписатьЗначение("7701234567");
Запись.ЗаписатьИмяСвойства("Активен");
Запись.ЗаписатьЗначение(Истина);
Запись.ЗаписатьКонецОбъекта();

JSONСтрока = Запись.Закрыть();
ЗаписьJSON — ключевые методы
УстановитьСтрокуписать в строку в памяти
ОткрытьФайлписать в файл на диске
ОткрытьПотокписать в произвольный поток
ЗаписатьНачалоОбъекта / КонецОбъектаграницы JSON-объекта { }
ЗаписатьИмяСвойстваключ следующего значения
ЗаписатьЗначениепримитив: строка, число, булево, null
Закрытьзавершает запись; для строкового режима — возвращает JSON

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

Массив структур в JSON: цикл и границы массива

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

Строки = Новый Массив;

Стр1 = Новый Структура("Артикул, Количество, Цена", "А-100", 5, 199.90);
Строки.Добавить(Стр1);
Стр2 = Новый Структура("Артикул, Количество, Цена", "А-200", 2, 349.00);
Строки.Добавить(Стр2);

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

Запись.ЗаписатьНачалоМассива();
Для Каждого Строка Из Строки Цикл
    ЗаписатьJSON(Запись, Строка); // каждый элемент — JSON-объект
КонецЦикла;
Запись.ЗаписатьКонецМассива();

JSON = Запись.Закрыть();
// [{"Артикул":"А-100","Количество":5,"Цена":199.9},{"Артикул":"А-200","Количество":2,"Цена":349}]

Если у элементов массива состав полей разный (например, один API требует у одних записей поле СтавкаНДС, а у других — нет), для каждого элемента открывайте объект вручную и записывайте только нужные свойства.

Соответствие в JSON: строковые ключи и обход не-строковых

Соответствие сериализуется в JSON-объект только со строковыми ключами. Если хоть один ключ не строка (например, ссылка или число), глобальная ЗаписатьJSON() завершится с ошибкой. Классический сценарий — «остатки по номенклатуре», где ключ — ссылка на элемент справочника.

// Соответствие с ключами-ссылками: строкой сериализовать нельзя
Остатки = Новый Соответствие;
Остатки.Вставить(Товар1Ссылка, 10);
Остатки.Вставить(Товар2Ссылка, 4);

// Собираем JSON-объект вручную: ключом делаем GUID номенклатуры
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку();

Запись.ЗаписатьНачалоОбъекта();
Для Каждого Пара Из Остатки Цикл
    Запись.ЗаписатьИмяСвойства(Строка(Пара.Ключ.УникальныйИдентификатор()));
    Запись.ЗаписатьЗначение(Пара.Значение);
КонецЦикла;
Запись.ЗаписатьКонецОбъекта();

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

Если требования API допускают массив пар {"ключ":..., "значение":...}, вместо JSON-объекта пишите JSON-массив: это устраняет вопрос типа ключа и совместимо с любым языком на стороне-приёмнике.

Подсказка Code Console: сериализация с не-строковыми ключами — регулярная причина падений при отправке JSON внешнему API. Если код изначально писался под Структуру, а потом в него добавили Соответствие с ключами-ссылками, вы получите ошибку именно на строке с ЗаписатьJSON, а не в месте, где ключ был добавлен.

Вложенные структуры и массивы: контракты API

Реальный JSON почти всегда вложенный: у документа есть шапка и табличная часть, у заказа — массив строк. В 1С это удобно собирать связкой «Структура → Массив → Структура»: глобальная ЗаписатьJSON() обойдёт их одним вызовом.

Заказ = Новый Структура;
Заказ.Вставить("Номер", "0000123");
Заказ.Вставить("Дата", ТекущаяДата());
Заказ.Вставить("Контрагент", "ООО Ромашка");

Строки = Новый Массив;
Строки.Добавить(Новый Структура("Артикул, Количество, Цена", "А-100", 5, 199.90));
Строки.Добавить(Новый Структура("Артикул, Количество, Цена", "А-200", 2, 349.00));
Заказ.Вставить("Строки", Строки);

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

Если API требует конкретных имён на английском (number, date, items), сразу называйте свойства Структуры так, как их ждёт приёмник — это проще, чем потом переименовывать в JSON. Русские идентификаторы в Структуре разрешены, но удобны только для внутренних задач.

Даты, null и кодировка UTF-8 без BOM

Три вещи, которые ломают интеграцию чаще всего:

  • Формат дат. По умолчанию даты пишутся как строки ISO 8601 ("2026-07-17T10:15:00"). Если API ждёт Unix-timestamp или другой формат — преобразуйте дату в нужный тип до вызова ЗаписатьJSON или задайте формат через параметр НастройкиСериализации.
  • Nullable-поля. Чтобы отдать null, передайте в ЗаписатьЗначение() значение Неопределено — глобальная ЗаписатьJSON() и ручная запись превратят его в JSON-null. Пустая строка "" — это не null, а именно пустая строка.
  • Кодировка. Записывайте в UTF-8 без BOM: у ОткрытьФайл() и ОткрытьПоток() для этого есть параметр ДобавлятьBOM — для API он должен быть Ложь. Большинство HTTP-клиентов не ждёт BOM и споткнётся о лишний байт-порядок в начале.
// Явно null и корректная дата
Данные = Новый Структура;
Данные.Вставить("Комментарий", Неопределено); // → null
Данные.Вставить("ДатаОтгрузки", Дата("20260717101500")); // → "2026-07-17T10:15:00"

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

Красивый JSON и отладка: ПараметрыЗаписиJSON

Для API JSON собирают одной строкой без пробелов — так меньше трафика. Для отладки удобнее «красивый» JSON с отступами: его задают конструктором ПараметрыЗаписиJSON и передают в ОткрытьФайл(), ОткрытьПоток() или УстановитьСтроку().

Параметры = Новый ПараметрыЗаписиJSON(
    ПереносСтрокJSON.Авто,   // переносы строк для читаемости
    Символы.Таб,             // символы отступа
    Истина                   // использовать двойные кавычки
);

Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(Параметры);
ЗаписатьJSON(Запись, Данные);
JSON = Запись.Закрыть();
ПараметрыЗаписиJSON
ПереносСтрокПереносСтрокJSON.Авто / Нет
СимволыОтступатабы или пробелы для indent
ИспользоватьДвойныеКавычкиИстина — стандартный JSON
ЭкранированиеСимволовуправляет обработкой служебных символов
ЭкранироватьРазделителиСтрокпереносы внутри строковых значений
ЭкранироватьУгловыеСкобки / Амперсанд / Слешсовместимость с HTML / XML
ПараметрыЗаписиJSON
Подсказка Code Console: в продакшн-обмен всегда идёт JSON без отступов, иначе будете гонять лишние байты. Красивый JSON включайте только на время отладки — например, записью во временный файл рядом с ЗаписьЖурналаРегистрации().

Частые ошибки при преобразовании структуры в JSON

  • Соответствие с не-строковыми ключами. Глобальная ЗаписатьJSON() падает на первом же не-строковом ключе. Либо приводите ключи к строке заранее, либо собирайте JSON вручную через ЗаписатьИмяСвойства.
  • Забытый Закрыть(). Без него JSON-строка не будет сформирована, а файл — не закрыт. Для строкового режима Закрыть() возвращает готовый JSON — не игнорируйте возвращаемое значение.
  • Дата отправлена как строка нестандартного формата. Российское ДД.ММ.ГГГГ в JSON — почти всегда несовместимо со сторонним API. Договаривайтесь про ISO 8601 или Unix-timestamp и приводите значение до сериализации.
  • Пустая строка вместо null. Если API различает отсутствие значения и пустоту — передавайте именно Неопределено, а не "". Иначе на стороне-приёмнике логика валидации сработает не так.
  • BOM в начале файла. При отладке JSON часто выгружают в файл и открывают редактором. Если ОткрытьФайл(..., ДобавлятьBOM = Истина), сторонний парсер может упасть на первом же символе.
  • «Красивый» JSON в проде. Отступы удобны в логах, но раздувают полезную нагрузку и меняют хеши. Для боевого обмена — компактный JSON без переносов.

Какой способ преобразовать структуру в JSON выбрать

  • Глобальная ЗаписатьJSON — плоские и вложенные Структуры / Массивы, Соответствие со строковыми ключами.
  • Ручная ЗаписьJSON — Соответствие с любыми ключами, специфический порядок полей, «свои» правила null и дат.
  • Комбинированный подход — обёртку и особые фрагменты пишите вручную, «плоские» подобъекты сериализуйте глобальной ЗаписатьJSON().
  • Красивый JSON — только для отладки; в проде — компактная строка в UTF-8 без BOM.

Частые вопросы: структура и JSON в 1С

Как преобразовать структуру в JSON в 1С одной строкой?

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

Почему ЗаписатьJSON падает на Соответствии?

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

Как передать массив структур в JSON для внешнего API?

Соберите Массив, каждый элемент — Структура с нужными полями, и передайте массив в ЗаписатьJSON(). Для управляемого состава полей у каждого элемента используйте ручную запись через ЗаписатьНачалоМассива / ЗаписатьНачалоОбъекта.