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