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

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

Как создать файл JSON в 1С

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

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

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

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

Какие средства платформы 1С позволяют создать JSON

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

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

Сравнение подходов

ЗаписьJSON

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

СериализаторXDTO.ЗаписатьJSON

Одна строка кода для готовых структур и массивов. Не подходит для ссылок, таблиц значений и случаев, где нужен особый порядок полей.

Ручная сборка строки

Не рекомендуется: высок риск синтаксических ошибок, проблем с экранированием и кодировкой. Оправдана только для тривиальных фиксированных шаблонов.

Создание JSON через объект ЗаписьJSON

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

Пример формирования простого объекта с записью в строку и последующим сохранением в файл:

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

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

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

ЗаписьJSON.ЗаписатьИмяСвойства("Номенклатура");

ЗаписьJSON.ЗаписатьЗначение("Кабель ВВГ 3х2.5");

ЗаписьJSON.ЗаписатьИмяСвойства("Цена");

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

ЗаписьJSON.ЗаписатьИмяСвойства("Активен");

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

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

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

ЗаписьТекста = Новый ЗаписьТекста("C:\Обмен\product.json", КодировкаТекста.UTF8);

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

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

Результатом будет файл product.json с содержимым вида {"Номенклатура":"Кабель ВВГ 3х2.5","Цена":125.5,"Активен":true}. Обратите внимание: ЗаписатьЗначение автоматически преобразует булево в true/false, а число — в числовой литерал без кавычек. Даты при такой записи преобразуются в строковое представление, поэтому формат даты лучше контролировать явно через Формат.

Если файл нужно писать напрямую без промежуточной строки, используйте ОткрытьФайл:

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

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

ЗаписьJSON.ОткрытьФайл("C:\Обмен\data.json", КодировкаТекста.UTF8, , ПараметрыЗаписи);

// ... запись структуры ...

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

Формирование массивов и вложенных объектов

Реальные выгрузки редко ограничиваются плоским объектом. Для массива используется пара ЗаписатьНачалоМассива / ЗаписатьКонецМассива, внутри которой можно писать как простые значения, так и вложенные объекты. Вложенность не ограничена, но каждый открытый блок обязан быть закрыт — иначе Закрыть вызовет исключение.

ЗаписьJSON.ЗаписатьИмяСвойства("Товары");

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

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

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

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

ЗаписьJSON.ЗаписатьЗначение(СтрокаТовара.Код);

ЗаписьJSON.ЗаписатьИмяСвойства("Наименование");

ЗаписьJSON.ЗаписатьЗначение(СтрокаТовара.Наименование);

ЗаписьJSON.ЗаписатьИмяСвойства("Количество");

ЗаписьJSON.ЗаписатьЗначение(СтрокаТовара.Количество);

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

КонецЦикла;

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

Имена свойств могут быть на русском или английском языке, но для интеграций принято использовать латиницу в camelCase или snake_case — это снижает риск проблем на стороне приёмной системы. Если формат обмена задан контрагентом, имена полей должны совпадать с его спецификацией символ в символ, включая регистр.

Порядок создания JSON-файла
  1. 1
    Создайте объект: ЗаписьJSON = Новый ЗаписьJSON
  2. 2
    Укажите приёмник: УстановитьСтроку() или ОткрытьФайл(Путь, КодировкаТекста.UTF8)
  3. 3
    Откройте корневой объект методом ЗаписатьНачалоОбъекта
  4. 4
    Запишите свойства парами ЗаписатьИмяСвойства + ЗаписатьЗначение
  5. 5
    Для списков используйте ЗаписатьНачалоМассива и ЗаписатьКонецМассива
  6. 6
    Закройте объект ЗаписатьКонецОбъекта и вызовите Закрыть()
  7. 7
    Проверьте файл: откройте в редакторе и валидаторе JSON

Быстрый способ: сериализация структуры через СериализаторXDTO

Когда данные уже собраны в структуру или массив, JSON можно получить одной командой. Это удобно для ответов HTTP-сервисов, выгрузки настроек и простых интеграций.

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

Данные.Вставить("Организация", "ООО Ромашка");

Данные.Вставить("ИНН", "7701234567");

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

Товары.Добавить(Новый Структура("Код, Количество", "001", 10));

Товары.Добавить(Новый Структура("Код, Количество", "002", 5));

Данные.Вставить("Товары", Товары);

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

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

СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Данные);

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

Ключевое ограничение: если в структуре окажется ссылка на элемент справочника, документ, таблица значений или другой несериализуемый тип, метод вызовет исключение. Поэтому перед сериализацией извлекайте из объектов базы нужные реквизиты в примитивные типы. Также учитывайте, что в структуре имена ключей должны быть допустимыми идентификаторами — без пробелов и дефисов; если требуются такие имена полей, используйте Соответствие вместо Структуры.

При выгрузке дат через ЗаписатьJSON сериализатора даты выводятся в формате ISO 8601, который корректно читается большинством систем. При ручной записи через ЗаписатьЗначение дата превращается в строку локального формата — для интеграций форматируйте её явно: Формат(Дата, "ДФ=yyyy-MM-ddTHH:mm:ss").
ПЗ
Практическое замечание

Сохранение JSON в файл: пути, права и потоки

При записи файла на диск убедитесь, что каталог существует и у пользователя, от имени которого работает код, есть права на запись. В клиент-серверном режиме код на сервере пишет в файловую систему сервера, а не клиентского компьютера — частая причина «файл не появился». Если файл должен оказаться у пользователя, сформируйте его на сервере, передайте через временное хранилище и сохраните на клиенте методом НачатьПолучениеФайлов или через диалог сохранения.

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

Поток = Новый ПотокВПамяти;

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

ЗаписьJSON.ОткрытьПоток(Поток, КодировкаТекста.UTF8);

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

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

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

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

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

Двоичные = Поток.ЗакрытьИПолучитьДвоичныеДанные();

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

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

После формирования файла проверьте его до отправки во внешнюю систему. Минимальная проверка — открыть файл в текстовом редакторе и убедиться, что структура читается, кодировка корректна (нет «кракозябр» вместо кириллицы), а JSON валиден. Для валидации подойдёт любой онлайн-валидатор JSON или чтение файла обратно в 1С через ЧтениеJSON — если файл читается без исключения, синтаксис корректен.

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

ЧтениеJSON.ОткрытьФайл("C:\Обмен\data.json", КодировкаТекста.UTF8);

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

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

Типичные ошибки
01
Не вызван Закрыть() — файл пустой или содержит неполные данные, а файловый дескриптор остаётся занятым
02
Несбалансированные блоки: открыли массив, забыли ЗаписатьКонецМассива — исключение при закрытии
03
Числа с запятой вместо точки при ручной сборке строки — приёмная система отклоняет файл
04
Кодировка не указана — кириллица превращается в нечитаемые символы на стороне получателя
05
Сериализация ссылки на объект базы через СериализаторXDTO — исключение о невозможности сериализации
06
Запись на диск C: сервера вместо сетевого каталога — пользователь не находит файл
07
Дата в локальном формате вместо ISO — приёмная система не распознаёт значение
Контрольные точки

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

Файл открывается в редакторе
Норма

Кириллица читается, структура с отступами понятна

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

Кракозябры или пустой файл — проблема кодировки или не вызван Закрыть

Валидация синтаксиса
Норма

ЧтениеJSON читает файл без исключения

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

Ошибка разбора — незакрытый блок или лишняя запятая

Соответствие спецификации
Норма

Имена и типы полей совпадают с требованиями приёмной системы

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

Поле число передано строкой или имя отличается регистром

Расположение файла
Норма

Файл в ожидаемом каталоге с доступом для нужных пользователей

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

Файл записан локально на сервер и недоступен клиенту

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

Можно ли создать JSON без программирования, штатными средствами типовой конфигурации?

В большинстве типовых конфигураций штатной кнопки «выгрузить в JSON» нет — формат ориентирован на разработчиков и интеграции. Частичная альтернатива — выгрузка в XML или CSV через универсальные обработки, но для получения именно JSON потребуется либо внешняя обработка с кодом записи, либо доработка конфигурации.

Как выгрузить в JSON таблицу значений?

Напрямую таблица значений не сериализуется. Пройдите по ней циклом и на каждую строку формируйте объект через ЗаписьJSON, либо преобразуйте таблицу в массив структур и передайте его в СериализаторXDTO.ЗаписатьJSON. Второй вариант короче, но требует предварительного построения массива.

Почему в файле вместо русских букв нечитаемые символы?

Причина почти всегда в кодировке: файл записан в ANSI или UTF-8 с BOM, а просматривается программой, ожидающей другую кодировку. Укажите КодировкаТекста.UTF8 при открытии файла или потока и проверьте, в какой кодировке открывает файл принимающая сторона.

Как записать в JSON значение Неопределено или NULL?

Метод ЗаписатьЗначение при передаче Неопределено записывает null. Если нужно явно записать null для свойства, передайте Неопределено. Учтите: некоторые приёмные системы не принимают null-поля и требуют либо опускать свойство, либо передавать пустую строку — уточните спецификацию обмена.

Чем отличается УстановитьСтроку от ОткрытьФайл?

УстановитьСтроку накапливает весь JSON в памяти и возвращает его строкой после Закрыть — удобно для небольших документов и дальнейшей передачи по HTTP. ОткрытьФайл пишет сразу на диск порциями, что экономит память на больших выгрузках, но требует корректного пути и прав доступа.

Можно ли сформировать JSON на мобильной платформе или в тонком клиенте?

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

Итог

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

Для создания JSON в 1С используйте объект ЗаписьJSON: откройте запись в строку, файл или поток, сформируйте структуру методами ЗаписатьНачалоОбъекта, ЗаписатьИмяСвойства и ЗаписатьЗначение, обязательно вызовите Закрыть. Для готовых структур подойдёт СериализаторXDTO.ЗаписатьJSON. Всегда указывайте кодировку UTF-8 и проверяйте файл обратным чтением перед отправкой.