Структура в JSON в 1С: сериализация Структура, Соответствие и Массив
Чтобы преобразовать структуру в JSON в 1С, есть два пути. Простой — глобальная функция
ЗаписатьJSON(Запись, Значение, ПараметрыЗаписи): сама пройдётся по Структуре,
Массиву и Соответствию со строковыми ключами. Ручной — объект ЗаписьJSON
с методами ЗаписатьНачалоОбъекта, ЗаписатьИмяСвойства,
ЗаписатьЗначение, ЗаписатьКонецОбъекта. Второй вариант нужен,
когда простая сериализация не проходит: Соответствие с не-строковыми ключами, особые
требования API к формату дат, null-значениям или порядку полей.
Ключевой момент: глобальная ЗаписатьJSON не умеет писать
Соответствие, если хоть один ключ не строка — падает с ошибкой. Такой набор данных
нужно либо предварительно привести к Структуре/Соответствию со строковыми ключами,
либо собрать JSON вручную.
Простой способ: глобальная функция ЗаписатьJSON
Самый короткий способ преобразовать структуру в JSON в 1С — глобальная функция
ЗаписатьJSON(). Она принимает объект ЗаписьJSON, значение и,
опционально, параметры сериализации; сама рекурсивно обходит Структуру, Соответствие
(со строковыми ключами) и Массив.
Данные = Новый Структура;
Данные.Вставить("Наименование", "ООО Ромашка");
Данные.Вставить("ИНН", "7701234567");
Данные.Вставить("Активен", Истина);
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(); // писать в строку, а не в файл
ЗаписатьJSON(Запись, Данные);
JSONСтрока = Запись.Закрыть(); // {"Наименование":"ООО Ромашка","ИНН":"7701234567","Активен":true}
ЗаписьJSON
Метод Закрыть() у ЗаписьJSON при работе через
УстановитьСтроку() возвращает готовую JSON-строку. Это удобно, когда JSON нужно
сразу отправить POST-запросом или положить в реквизит.
В параметре НастройкиСериализации задаётся, в частности, формат дат
(по умолчанию — ISO 8601) и поведение при значении Неопределено: писать ли
его как null, пропускать или падать ошибкой. Именно здесь настраивается
поведение, которого требует конкретный API.
Ручной способ: объект ЗаписьJSON
Когда нужно контролировать формат — порядок ключей, отдельные преобразования, особые
требования к null и датам, — JSON собирают вручную через методы объекта
ЗаписьJSON. Схема всегда одна: открыть приёмник, записать объект/массив,
закрыть.
Запись = Новый ЗаписьJSON;
Запись.УстановитьСтроку(); // альтернативы — ОткрытьФайл() или ОткрытьПоток()
Запись.ЗаписатьНачалоОбъекта();
Запись.ЗаписатьИмяСвойства("Наименование");
Запись.ЗаписатьЗначение("ООО Ромашка");
Запись.ЗаписатьИмяСвойства("ИНН");
Запись.ЗаписатьЗначение("7701234567");
Запись.ЗаписатьИмяСвойства("Активен");
Запись.ЗаписатьЗначение(Истина);
Запись.ЗаписатьКонецОбъекта();
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-массив: это устраняет вопрос типа ключа и совместимо с любым языком
на стороне-приёмнике.
Вложенные структуры и массивы: контракты 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()падает на первом же не-строковом ключе. Либо приводите ключи к строке заранее, либо собирайте 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(). Для управляемого состава полей у
каждого элемента используйте ручную запись через
ЗаписатьНачалоМассива / ЗаписатьНачалоОбъекта.