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

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

Как записать JSON в файл в 1С

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

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

Главная ошибка новичков — собирать JSON конкатенацией строк. Такой подход ломается на первом же спецсимволе в данных (кавычки, переносы строк, кириллица вне ASCII) и даёт невалидный файл, который не читается принимающей стороной. Правильный путь — сформировать структуру данных средствами 1С (структуры, соответствия, массивы) и сериализовать её штатным механизмом.

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

Какие объекты 1С участвуют в записи JSON

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

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

Способ 1: запись JSON через ЗаписьJSON и ЗаписьТекста

Базовый сценарий: сформировать данные, сериализовать их в строку и сохранить в файл. Пример ниже записывает структуру с вложенным массивом:

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

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

Данные.Вставить("ДатаВыгрузки", ТекущаяДатаСеанса());

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

Товары.Добавить(Новый Структура("Код,Наименование,Цена", "001", "Тетрадь", 45.5));

Товары.Добавить(Новый Структура("Код,Наименование,Цена", "002", "Ручка", 25));

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

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

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

ЗаписатьJSON(ЗаписьJSON, Данные);

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

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

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

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

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

Даты сериализуются в формат ISO 8601 автоматически. Если принимающая система ожидает другой формат даты, используйте ПараметрыЗаписиJSON с явным указанием ФорматСериализацииДатыJSON и ВариантЗаписиДатыJSON.

bsl
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, Данные);
ТекстJSON = ЗаписьJSON.Закрыть();
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
ЗаписьТекста.Записать(ТекстJSON);
ЗаписьТекста.Закрыть();

Способ 2: запись напрямую в файл через параметры записи

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

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

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

ЗаписатьJSON(ЗаписьJSON, Данные);

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

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

Этот способ предпочтителен и с точки зрения надёжности: меньше промежуточных переменных, меньше шансов забыть закрыть текстовый поток. Однако помните, что при записи из серверного кода путь должен быть доступен серверу 1С, а не клиентскому компьютеру.

Сравнение вариантов записи

УстановитьСтроку() + ЗаписьТекста

Подходит для небольших данных и когда JSON нужен ещё и как строка (например, для HTTP-запроса). Требует двух объектов и ручного закрытия потока.

ЗаписьJSON напрямую в файл

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

СериализаторXDTO

Нужен, когда в JSON должны попасть объекты конфигурации (ссылки, документы) со сложной структурой. Требует аккуратной настройки и даёт менее предсказуемый формат.

Кодировка файла: UTF-8, BOM и совместимость

Фактический стандарт для JSON — UTF-8. В 1С это КодировкаТекста.UTF8. Тонкость в том, что ЗаписьТекста по умолчанию добавляет в начало файла метку порядка байт (BOM). Некоторые принимающие системы (веб-сервисы на Python, Node.js, строгие парсеры) воспринимают BOM как мусор и отказываются читать файл.

Чтобы записать UTF-8 без BOM, передайте третий параметр в конструктор ЗаписьТекста — ЗаписатьBOM со значением Ложь, либо используйте запись напрямую через ЗаписьJSON, где поведение BOM также контролируется параметрами конструктора. Если принимающая сторона — тоже 1С, BOM обычно не мешает, но единообразие (всегда без BOM) избавляет от сюрпризов.

Определить, есть ли BOM в готовом файле, можно открыв его в редакторе, показывающем шестнадцатеричный код: первые три байта EF BB BF — это BOM в UTF-8.

Проверка результата: как убедиться, что файл корректен

Запись без проверки — половина работы. Минимальный контроль: открыть файл текстовым редактором и убедиться, что он начинается с { или [, кириллица читается (а не отображается знаками вопроса), а структура соответствует ожиданиям. Знаки вопроса вместо русских букв — верный признак неверной кодировки при записи или чтении.

Более строгая проверка — прочитать файл обратно средствами 1С через ЧтениеJSON и убедиться, что десериализация проходит без исключения, а значения ключевых полей совпадают с исходными. Такой «кольцевой» тест особенно полезен в регламентных заданиях обмена: если файл не читается, об этом лучше узнать сразу, а не от принимающей стороны.

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

Чтение.ОткрытьФайл("C:\Обмен\goods.json");

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

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

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

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

Начало файла
Норма

Файл начинается с символа { или [

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

Первые байты EF BB BF (BOM), а приёмник его не принимает, либо файл пуст

Кириллица
Норма

Русский текст читается в редакторе в кодировке UTF-8

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

Знаки вопроса или кракозябры — несовпадение кодировок

Валидность JSON
Норма

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

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

Ошибка разбора — где-то собран JSON вручную или оборвана запись

Содержимое
Норма

Все ожидаемые поля и массивы присутствуют, даты в нужном формате

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

Пропущены поля со значением Неопределено, даты в неожиданном виде

Типичные ошибки и их причины

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

Вторая группа ошибок — потеря данных при сериализации. Значение Неопределено в структуре при сериализации пропускается, а в массиве превращается в null. Типы, не поддерживаемые JSON напрямую (например, ссылки на объекты базы), через ЗаписатьJSON() без дополнительных настроек не сериализуются — для них нужен либо СериализаторXDTO, либо явное преобразование в строку (GUID, наименование).

Третья группа — конкатенация строк вместо сериализации. Как только в данных появится кавычка, обратный слэш или перевод строки, такой «ручной» JSON станет невалидным. Лечение одно — отказаться от ручной сборки полностью.

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

Запись JSON на сервере и в клиент-серверном режиме

В файловом режиме разницы между клиентом и сервером практически нет — оба работают с одной файловой системой. В клиент-серверном варианте код с директивой &НаСервере пишет файлы на диск сервера приложений, а &НаКлиенте — на компьютер пользователя. Выбирайте сторону осознанно: регламентная выгрузка — сервер, «сохранить файл пользователю» — клиент.

Если файл формируется на сервере, а отдать его нужно пользователю, передайте содержимое через временное хранилище: поместите данные с помощью ПоместитьВоВременноеХранилище(), а на клиенте получите и сохраните через диалог выбора файла. Для веб-клиента это единственный корректный путь — прямой доступ к файловой системе там ограничен.

Маршрут решения

Как выбрать действие

Нужно выгрузить небольшую структуру и, возможно, отправить её ещё и по HTTPИспользуйте УстановитьСтроку() + ЗаписьТекста, чтобы иметь JSON и строкой, и файлом
Выгружается большая таблица или каталог на тысячи позицийПишите напрямую в файл через конструктор ЗаписьJSON с параметрами
Принимающая система отклоняет файл с ошибкой разбора в первой позицииПерезапишите файл в UTF-8 без BOM
Код работает в регламентном задании на сервереИспользуйте серверный путь и проверьте права учётной записи сервера 1С на каталог
В JSON должны попасть ссылки и объекты конфигурацииПреобразуйте их в примитивы вручную или примените СериализаторXDTO

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

Можно ли записать JSON без объекта ЗаписьJSON, просто строкой?

Технически да, но делать так не стоит: придётся вручную экранировать кавычки, слэши и управляющие символы, следить за форматом чисел и дат. Любая неучтённая ситуация даст невалидный файл. Штатный ЗаписатьJSON() решает всё это автоматически и работает быстрее, чем ручная сборка с проверками.

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

Файл записан в одной кодировке, а открывается в другой. Убедитесь, что при записи указана КодировкаТекста.UTF8, а редактор, которым вы смотрите файл, открывает его именно как UTF-8. Если знаки вопроса видит принимающая система — проблема на её стороне чтения, либо файл действительно записан в ANSI.

Как записать JSON с красивым форматированием (отступами)?

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

Что делать, если в данных есть ссылка на документ или справочник?

Штатный ЗаписатьJSON() без дополнительных настроек ссылки не сериализует. Самый надёжный вариант — заранее преобразовать ссылку в примитив: строку GUID через XMLСтрока(Ссылка) или уникальный идентификатор. Альтернатива — СериализаторXDTO, но формат результата сложнее контролировать.

Как записать JSON в файл на клиенте в веб-клиенте?

Прямая запись в произвольный путь в веб-клиенте недоступна. Сформируйте JSON на сервере, поместите строку или двоичные данные во временное хранилище, а на клиенте предложите пользователю сохранить файл через стандартный диалог сохранения. Либо используйте расширение работы с файлами в тонком клиенте.

Как проверить JSON на валидность перед отправкой контрагенту?

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

Итог

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

Формируйте данные структурами и массивами, сериализуйте через ЗаписатьJSON(), пишите в файл в UTF-8 без BOM. Не собирайте JSON вручную, проверяйте существование каталога и сторону выполнения кода (клиент или сервер), а готовый файл контролируйте обратным чтением через ЧтениеJSON.