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

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

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

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

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

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

Базовый пример: структура в JSON-строку

Минимальный рабочий код состоит из четырёх шагов: создать объект записи, открыть вывод в строку, вызвать ЗаписатьJSON и получить результат. Никаких дополнительных объектов создавать не нужно.

СтруктураДанных = Новый Структура;

СтруктураДанных.Вставить("Код", "000000123");

СтруктураДанных.Вставить("Наименование", "Тестовый товар");

СтруктураДанных.Вставить("Цена", 1250.5);

СтруктураДанных.Вставить("Активен", Истина);

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

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

ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);

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

// Результат:

// {"Код":"000000123","Наименование":"Тестовый товар","Цена":1250.5,"Активен":true}

Обратите внимание на автоматическое преобразование типов: строка 1С остаётся строкой, число — числом, булево Истина превращается в JSON-литерал true, а Неопределено и NULL — в null. Имена ключей структуры становятся именами свойств JSON-объекта без изменений, поэтому заранее проверяйте, что ключи соответствуют ожиданиям приёмной системы (регистр, латиница или кириллица).

Порядок действий
  1. 1
    Сформируйте структуру методом Вставить() с нужными ключами
  2. 2
    Создайте объект ЗаписьJSON и вызовите УстановитьСтроку() или ОткрытьФайл()
  3. 3
    Вызовите ЗаписатьJSON(Запись, Структура) для автоматической сериализации
  4. 4
    Закройте запись методом Закрыть() и получите строку результата
  5. 5
    Проверьте JSON на валидность через ЧтениеJSON или внешний валидатор

Запись JSON в файл

Если результат нужно сохранить на диск — например, для обмена с внешней системой по расписанию, — вместо УстановитьСтроку() используется метод ОткрытьФайл() с указанием пути и кодировки. Для JSON стандартом де-факто является UTF-8 без BOM, и это стоит указывать явно.

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

ПараметрыЗаписи = Новый ПараметрыЗаписиJSON(, Символы.Таб);

ЗаписьJSON.ОткрытьФайл("C:\Exchange\data.json", "UTF-8", , ПараметрыЗаписи);

ЗаписатьJSON(ЗаписьJSON, СтруктураДанных);

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

Второй параметр конструктора ПараметрыЗаписиJSON задаёт строку отступа: передав Символы.Таб, вы получите «красиво» отформатированный многострочный JSON, удобный для чтения человеком. Если файл читает только машина, отступы можно не задавать — однострочный JSON компактнее и быстрее пишется. Учтите, что при работе на сервере 1С путь к файлу интерпретируется относительно сервера, а не клиентского компьютера, и у учётной записи агента сервера должны быть права на каталог.

Настройки сериализации: даты, ссылки и специальные типы

Автоматическая сериализация корректно обрабатывает примитивы, но даты и ссылки требуют внимания. По умолчанию дата записывается в формате ISO (например, "2026-03-15T10:30:00"), однако приёмная система может ожидать Unix-время или другой формат. Формат задаётся третьим параметром ЗаписатьJSON через объект НастройкиСериализацииJSON.

Настройки = Новый НастройкиСериализацииJSON;

Настройки.ФорматСериализацииДаты = ФорматДатыJSON.ISO;

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

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

Ссылки на объекты базы (справочники, документы) автоматически не сериализуются в осмысленный вид — при попытке записать их напрямую платформа либо вызовет исключение, либо запишет техническое представление, бесполезное для внешней системы. Правильный подход — заранее извлечь из ссылки нужные поля (код, наименование, уникальный идентификатор) и поместить в структуру именно их. Уникальный идентификатор при этом преобразуйте в строку явно: Строка(Ссылка.УникальныйИдентификатор()).

Вложенные структуры, массивы и таблицы значений

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

Товары = Новый Массив;

Для Каждого СтрокаТЧ Из Документ.Товары Цикл

Товар = Новый Структура;

Товар.Вставить("Номенклатура", Строка(СтрокаТЧ.Номенклатура));

Товар.Вставить("Количество", СтрокаТЧ.Количество);

Товары.Добавить(Товар);

КонецЦикла;

СтруктураДанных = Новый Структура;

СтруктураДанных.Вставить("Номер", Документ.Номер);

СтруктураДанных.Вставить("Товары", Товары);

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

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

Ручная запись через методы ЗаписьJSON

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

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

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

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

ЗаписьJSON.ЗаписатьСвойство("Сумма");

ЗаписьJSON.ЗаписатьЗначение(1500.75);

ЗаписьJSON.ЗаписатьСвойство("Валюта");

ЗаписьJSON.ЗаписатьЗначение("RUB");

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

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

При ручной записи платформа контролирует корректность последовательности вызовов: попытка записать значение вне объекта или массива, незакрытый объект при вызове Закрыть() и другие нарушения приводят к исключению. Это удобно при отладке — ошибка всплывёт сразу, а не на стороне приёмника. Для вставки уже сформированного JSON-фрагмента без экранирования существует метод ЗаписатьБезОбработки, но применять его стоит осторожно: платформа не проверяет валидность вставляемого текста.

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

ЗаписатьJSON (автоматическая сериализация)

Подходит для типовых структур, массивов и соответствий. Минимум кода, но нет контроля над порядком свойств и нестандартными типами.

Ручная запись методами ЗаписьJSON

Полный контроль над документом, запись любых значений и готовых фрагментов. Требует аккуратной парности вызовов начала и конца.

СериализацияXDTO / ПрочитатьJSON с функциями восстановления

Для сложных объектов конфигурации и обмена между базами 1С. Избыточна для простой выгрузки структуры во внешнюю систему.

Проверка результата и отладка

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

Чтение = Новый ЧтениеJSON;

Чтение.УстановитьСтроку(ТекстJSON);

Проверка = ПрочитатьJSON(Чтение);

Чтение.Закрыть();

// Проверка — структура с теми же ключами

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

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

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

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

Строка разбирается без исключения, ключи на месте

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

Ошибка разбора — JSON невалиден или обрезан

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

Числа без кавычек, булево как true/false, даты в ожидаемом формате

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

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

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

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

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

Крякозябры или ошибка декодирования на приёмной стороне

Итог

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

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

Частые вопросы

Можно ли использовать в ключах структуры кириллицу?

Да, платформа запишет такие ключи в JSON без проблем, и это валидный JSON. Вопрос только в приёмной системе: многие внешние API ожидают латинские имена полей, поэтому для интеграций ключи лучше сразу формировать латиницей.

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

Метод Вставить структуры принимает любую строку в качестве ключа, например Структура.Вставить("data.id", 1). Ограничение на допустимые идентификаторы действует только при обращении к ключу через точку — для таких имён используйте обращение через квадратные скобки.

Чем записать данные, если приёмная система — тоже 1С?

Для обмена между базами 1С удобнее сериализация XDTO или та же ЗаписатьJSON с симметричным ПрочитатьJSON на приёмной стороне — типы восстановятся автоматически. Ручная подготовка структур нужна только когда схемы данных в базах различаются.

Почему после ЗаписатьJSON строка результата пустая?

Почти всегда причина в том, что не вызван метод Закрыть() у объекта ЗаписьJSON — именно он завершает формирование документа и возвращает строку при записи в строку. Проверьте также, что УстановитьСтроку() вызван до сериализации, а не после.

Как ограничить размер выгружаемого JSON?

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

Экранируются ли спецсимволы в строках автоматически?

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