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