Разработка и Конфигурация · 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.
Запись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 должны попасть объекты конфигурации (ссылки, документы) со сложной структурой. Требует аккуратной настройки и даёт менее предсказуемый формат.
Кодировка файла: 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 вручную или оборвана запись
Все ожидаемые поля и массивы присутствуют, даты в нужном формате
Пропущены поля со значением Неопределено, даты в неожиданном виде
Типичные ошибки и их причины
Самая частая проблема — «Ошибка при вызове метода контекста (Записать)» или пустой файл. Причины: каталог не существует (1С не создаёт промежуточные папки автоматически), нет прав на запись, файл открыт другой программой. Перед записью проверяйте существование каталога через объект Файл и создавайте его методом СоздатьКаталог().
Вторая группа ошибок — потеря данных при сериализации. Значение Неопределено в структуре при сериализации пропускается, а в массиве превращается в null. Типы, не поддерживаемые JSON напрямую (например, ссылки на объекты базы), через ЗаписатьJSON() без дополнительных настроек не сериализуются — для них нужен либо СериализаторXDTO, либо явное преобразование в строку (GUID, наименование).
Третья группа — конкатенация строк вместо сериализации. Как только в данных появится кавычка, обратный слэш или перевод строки, такой «ручной» JSON станет невалидным. Лечение одно — отказаться от ручной сборки полностью.
Запись JSON на сервере и в клиент-серверном режиме
В файловом режиме разницы между клиентом и сервером практически нет — оба работают с одной файловой системой. В клиент-серверном варианте код с директивой &НаСервере пишет файлы на диск сервера приложений, а &НаКлиенте — на компьютер пользователя. Выбирайте сторону осознанно: регламентная выгрузка — сервер, «сохранить файл пользователю» — клиент.
Если файл формируется на сервере, а отдать его нужно пользователю, передайте содержимое через временное хранилище: поместите данные с помощью ПоместитьВоВременноеХранилище(), а на клиенте получите и сохраните через диалог выбора файла. Для веб-клиента это единственный корректный путь — прямой доступ к файловой системе там ограничен.
Как выбрать действие
Частые вопросы
Можно ли записать 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.