Работа с форматом 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
2. Сохранение JSON из HTTP-запроса
Частая задача — сохранить ответ от API (например, данные о курсах валют, информацию о заказах с маркетплейса) в JSON-файл. Здесь используем комбинацию HTTPСоединение и ЗаписьТекста.
Типичный алгоритм:
- Отправить GET/POST-запрос к API.
- Получить ответ в формате JSON.
- Сохранить "сырой" ответ или обработанные данные.
Пример сохранения ответа от Центробанка РФ с курсами валют:
Процедура СохранитьКурсыВалютВ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-файлах без шифрования!
Для сложных 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:
- Получите OAuth-токен в кабинете разработчика.
- Отправьте файл через 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));
Это удобно для версионирования данных, но увеличивает размер базы. Для больших объёмов лучше использовать файловую систему.