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

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

Важно: все примеры в статье актуальны для 1С:Предприятие 8.3.20+. Если вы работаете с более ранними версиями (до 8.3.10), некоторые методы могут требовать доработок — об этом мы упомянем в соответствующих разделах.

1. Базовый способ: ЗаписьJSON + ЗаписьТекста

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

Основные шаги:

  • 🔹 Создать объект ЗаписьJSON и настроить параметры записи (отступы, кодировку).
  • 📝 Записать данные в поток с помощью ЗаписатьJSON().
  • 💾 Сохранить поток в файл через ЗаписьТекста.

Пример кода для сохранения структуры в файл data.json:

Процедура СохранитьJSONВФайл(Данные, ПутьКФайлу)

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

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

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

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

ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);

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

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

КонецПроцедуры

⚠️ Внимание: При записи больших объёмов данных (>10 МБ) этот метод может вызывать ошибки переполнения памяти. В таких случаях используйте потоковую запись (раздел 3).

Преимущества метода:

  • ✅ Не требует внешних компонент.
  • ✅ Работает во всех конфигурациях 1С.
  • ✅ Поддерживает русские символы при правильной кодировке.

☑️ Подготовка к сохранению JSON

Выполнено: 0 / 4

2. Сохранение JSON из HTTP-запроса

Частая задача — сохранить ответ от API (например, данные о курсах валют, информацию о заказах с маркетплейса) в JSON-файл. Здесь используем комбинацию HTTPСоединение и ЗаписьТекста.

Типичный алгоритм:

  1. Отправить GET/POST-запрос к API.
  2. Получить ответ в формате JSON.
  3. Сохранить "сырой" ответ или обработанные данные.

Пример сохранения ответа от Центробанка РФ с курсами валют:

Процедура СохранитьКурсыВалютВJSON()

HTTP = Новый HTTPСоединение("www.cbr.ru");

Ответ = HTTP.Получить("/scripts/XML_daily.asp?date_req=" + ТекущаяДата());

// Преобразуем XML в JSON (упрощённо)

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

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

Данные.Вставить("Курсы", Новый Массив());

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

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

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

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

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

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

КонецПроцедуры

⚠️ Внимание: При работе с API некоторых сервисов (например, Wildberries или Ozon) требуется авторизация. Не сохраняйте токены доступа в JSON-файлах без шифрования!
📊 Какой формат данных вы чаще сохраняете в 1С?
JSON
XML
TXT
CSV
Другой

Для сложных API рекомендуем использовать библиотеку rest-1c (доступна на GitHub), которая упрощает обработку ответов и поддерживает аутентификацию.

3. Потоковая запись для больших файлов

Если объём JSON-данных превышает 50 МБ, стандартные методы могут приводить к ошибкам Недостаточно памяти. В таких случаях используем потоковую запись через ДвоичныеДанные и ЗаписьДанных.

Алгоритм потоковой записи:

  • 📥 Получаем данные порциями (например, по 10 000 строк таблицы).
  • 🔄 Сериализуем каждую порцию в JSON.
  • 💾 Дозаписываем в файл без полной загрузки в память.

Пример для большой таблицы значений:

Процедура СохранитьБольшуюТаблицуВJSON(Таблица, ПутьКФайлу)

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

ЗаписьДанных = Новый ЗаписьДанных(Поток);

ЗаписьJSON = Новый ЗаписьJSON(ЗаписьДанных);

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

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

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

КонецЦикла;

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

ЗаписьДанных.Закрыть();

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

ДвоичныеДанные.Записать(ПутьКФайлу);

КонецПроцедуры

Этот метод позволяет обрабатывать файлы размером до 2 ГБ (ограничение платформы 1С). Для ещё больших объёмов потребуется разбиение на несколько файлов.

💡

Перед потоковой записью проверьте свободное место на диске командой ПолучитьСвободноеМестоНаДиске() — это предотвратит ошибки при работе с файлами >1 ГБ.

4. Использование внешних компонент

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

КомпонентаВозможностиСсылка
1C+JSONРасширенная работа с JSON, поддержка схем валидацииinfostart.ru
AddInFileРабота с файлами >2 ГБ, шифрованиеgithub.com
NativeAPIПрямой доступ к WinAPI для высокопроизводительных операцийits.1c.ru

Пример использования AddInFile для сжатого JSON:

Процедура СохранитьJSONССжатием(Данные, ПутьКФайлу)

Компонента = Новый COMОбъект("AddInFile.FileCompressor");

ТекстJSON = Новый ЗаписьJSON.ЗаписатьСтроку(Данные);

Компонента.CompressToGZip(ТекстJSON, ПутьКФайлу + ".gz");

КонецПроцедуры

⚠️ Внимание: Внешние компоненты требуют регистрации в системе и могут конфликтовать с антивирусами. Тестируйте их на копии базы перед внедрением в рабочую среду.

5. Автоматизация через регламентные задания

Если JSON-файлы нужно сохранять регулярно (например, ежедневный экспорт данных для аналитики), настройте регламентное задание. Это позволит:

  • ⏰ Запускать сохранение по расписанию.
  • 📊 Архивировать файлы с указанием даты в имени.
  • 📧 Отправлять уведомления об ошибках.

Пример создания регламентного задания:

Процедура СоздатьЗаданиеНаЭкспортJSON()

Задание = РегламентныеЗадания.СоздатьЗадание(

Новый ОписаниеТипов("КаталогОбъектов.РегламентноеЗадание"),

Истина,

Ложь

);

Задание.Имя = "ЭкспортДанныхВJSON";

Задание.Периодичность = ТипПериодичностиРегламентногоЗадания.Ежедневно;

Задание.ВремяНачала = ВремяНачалоДня() + 3600; // Каждый день в 1:00

Задание.Действие = Новый Действие("ЭкспортДанныхВJSON");

КонецПроцедуры

Для хранения истории экспортированных файлов рекомендуем использовать каталог с структурой YYYY\MM\DD\ — это упростит поиск и резервное копирование.

💡

Регламентные задания позволяют интегрировать сохранение JSON в бизнес-процессы без ручного контроля, но требуют мониторинга логов на предмет ошибок.

6. Обработка ошибок и нюансы

При сохранении JSON в 1С возникают типичные ошибки, которые важно обрабатывать:

ОшибкаПричинаРешение
Ошибка при записи файлаНедостаточно прав на записьПроверьте права на каталог или используйте %TEMP%
Недопустимый символ JSONСпецсимволы (табуляция, перевод строки)Используйте СтрЗamenить() для экранирования
Файл используется другим процессомФайл открыт в другой программеДобавьте проверку Файл.Существует() перед записью

Пример обработки исключений:

Процедура БезопасноеСохранениеJSON(Данные, ПутьКФайлу)

Попытка

// Основной код сохранения

Исключение

ЗаписьЖурналаРегистрации(

НСтр("ru = 'Ошибка сохранения JSON'"),

УровеньЖурналаРегистрации.Ошибка,

،,

ДеталиОшибки()

);

Сообщить(ОписаниеОшибки());

КонецПопытки;

КонецПроцедуры

Для отладки сложных JSON-структур используйте сервис JSONLint (валидатор JSON) или расширение для Visual Studio Code — это поможет выявить синтаксические ошибки на раннем этапе.

Как проверить корректность JSON без внешних сервисов?

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

7. Альтернативные форматы: когда JSON не подходит

JSON удобен, но не всегда оптимален. Рассмотрим альтернативы для специфических задач:

  • 📄 XML: Лучше для обмена с гос. системами (например, ЭДО, СБИС).
  • 🗃️ CSV: Оптимален для табличных данных (экспорт в Excel).
  • 🗜️ Binary: Для больших объёмов данных (используйте ЗаписьДанных).
  • 🔐 Зашифрованные файлы: Если данные конфиденциальны (используйте ГОСТ-шифрование через внешние компоненты).

Пример сохранения данных в CSV (альтернатива JSON для таблиц):

Процедура СохранитьВCSV(Таблица, ПутьКФайлу)

ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);

// Записываем заголовки

Для Каждого Колонка Из Таблица.Колонки Цикл

ЗаписьТекста.Записать(Колонка.Имя + ";");

КонецЦикла;

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

// Записываем данные

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

Для Каждого Колонка Из Таблица.Колонки Цикл

ЗаписьТекста.Записать(Строка[Колонка.Имя] + ";");

КонецЦикла;

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

КонецЦикла;

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

КонецПроцедуры

Выбор формата зависит от задачи:

- JSON: универсален для API и веб-сервисов.

- XML: для взаимодействия с гос. системами.

- CSV: для импорта в Excel или Power BI.

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

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

Да, если вы используете типовую конфигурацию (например, 1С:ERP или 1С:УТ), где предусмотрен экспорт данных через обработки. Найдите в меню Файл → Экспорт данных и выберите формат JSON (если поддерживается). Для кастомизированных конфигураций без программирования не обойтись.

Как сохранить JSON с кириллицей без иероглифов?

Используйте кодировку UTF-8 при записи файла:

ЗаписьТекста = Новый ЗаписьТекста(ПутьКФайлу, КодировкаТекста.UTF8);

Если символы всё равно отображаются неправильно, проверьте настройки региональных стандартов в Windows и 1С (должны совпадать).

Почему при сохранении JSON теряются даты?

Объект ЗаписьJSON по умолчанию преобразует даты в строки в формате ГГГГ-ММ-ДДТчч:мм:сс. Чтобы сохранить оригинальный формат, предварительно конвертируйте даты в строки:

Данные.ДатаДокумента = Формат(Данные.ДатаДокумента, "ДФ=yyyy-MM-dd");

Как сохранить JSON в облако (Yandex Disk, Google Drive)?

Для работы с облачными хранилищами используйте их API. Пример для Yandex Disk:

  1. Получите OAuth-токен в кабинете разработчика.
  2. Отправьте файл через HTTP-запрос:
    HTTP = Новый HTTPСоединение("cloud-api.yandex.net");
    

    Заголовки = Новый Соответствие();

    Заголовки.Вставить("Authorization", "OAuth YOUR_TOKEN");

    Ответ = HTTP.ЗагрузитьФайл(

    "/v1/disk/resources/upload?path=/data.json&overwrite=true",

    ПутьКЛокальномуФайлу,

    Заголовки

    );

Можно ли сохранить JSON в базу данных 1С вместо файла?

Да, для этого используйте реквизит типа ХранилищеЗначения или ДвоичныеДанные. Пример:

Объект.ДанныеJSON = Новый ХранилищеЗначения(ТекстJSON, Новый СжатиеДанных(9));

Это удобно для версионирования данных, но увеличивает размер базы. Для больших объёмов лучше использовать файловую систему.