Запись данных в файл из 1С:Предприятие — одна из самых востребованных задач при автоматизации бизнес-процессов.hether вы формируете отчёты для бухгалтерии, сохраняете лог транзакций или интегрируетесь с внешними системами, умение корректно выгружать информацию в текстовые, CSV, XML или JSON-файлы сэкономит часы ручной работы. В этой статье разберём все актуальные способы записи в файл — от базовых методов платформы до работы с двоичными данными и внешними компонентами.
Особенность 1С в том, что здесь нет универсального «сохранить как» — каждый формат требует своего подхода. Например, для простого текстового лога хватит метода ЗаписатьСтроку(), а для структурированных данных придётся использовать ЗаписьXML или ЗаписьJSON. Мы покажем не только синтаксис, но и типичные ошибки (например, проблемы с кодировками или правами доступа), а также дадим рекомендации по оптимизации кода для больших объёмов данных.
Статья будет полезна и начинающим разработчикам 1С, и опытным программистам: первые узнают основы работы с файлами, вторые — нюансы работы с потоками, транзакциями и альтернативными библиотеками вроде OneScript.
1. Базовые методы записи в файл: Записать() и ЗаписатьСтроку()
Начнём с самых простых инструментов, встроенных в платформу 1С:Предприятие 8.3. Эти методы подходят для записи небольших текстовых файлов — логов, конфигурационных данных или простых отчётов.
Метод Записать() сохраняет данные в файл в двоичном виде, а ЗаписатьСтроку() автоматически преобразует строку в байты с учётом кодировки. Основное отличие — первый требует ручного управления кодировкой, второй упрощает работу с текстом:
// Пример 1: Запись строки в файл с кодировкой UTF-8
Текст = "Привет, мир!" + Символы.ПС + "Это вторая строка";
ЗаписьТекста = Новый ЗаписьТекста();
ЗаписьТекста.ОткрытьФайл("C:\temp\example.txt", "UTF-8");
ЗаписьТекста.ЗаписатьСтроку(Текст);
ЗаписьТекста.Закрыть();
// Пример 2: Запись двоичных данных (например, картинки)
ДвоичныеДанные = ПолучаемДвоичныеДанныеИзКартинки(); // Ваш метод получения данных
ЗаписьДанных = Новый ЗаписьДанных();
ЗаписьДанных.ОткрытьФайл("C:\temp\image.bin");
ЗаписьДанных.Записать(ДвоичныеДанные);
ЗаписьДанных.Закрыть();
Обратите внимание на ключевые моменты:
- 📁 Путь к файлу должен быть полным (например,
C:\temp\file.txt). Относительные пути (вроде.\file.txt) работать не будут. - 🔤 Кодировка по умолчанию —
ANSI(Windows-1251). Для кириллицы лучше явно указывать"UTF-8". - 🔒 Права доступа: если файл уже существует, он будет перезаписан. Для добавления данных используйте режим
"Добавление".
⚠️ Внимание: При записи в сетевые папки (например,\\server\share\file.txt) 1С использует права пользователя, под которым запущен сеанс. Если скрипт выполняется на сервере, у учётной записиusr1cv8должны быть права на запись.
2. Работа с потоками: ЗаписьXML и ЗаписьJSON
Для структурированных данных (например, выгрузка справочников или документов) удобнее использовать специализированные объекты ЗаписьXML и ЗаписьJSON. Они автоматически формируют корректный синтаксис и обрабатывают специальные символы.
Пример записи справочника Номенклатура в XML:
ЗаписьXML = Новый ЗаписьXML();
ЗаписьXML.ОткрытьФайл("C:\temp\nomenklatura.xml", "UTF-8");
ЗаписьXML.ЗаписатьОбъявлениеXML();
ЗаписьXML.ЗаписатьНачалоЭлемента("Справочник");
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаписьXML.ЗаписатьНачалоЭлемента("Элемент");
ЗаписьXML.ЗаписатьАтрибут("Код", Выборка.Код);
ЗаписьXML.ЗаписатьАтрибут("Наименование", Выборка.Наименование);
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем Элемент
КонецЦикла;
ЗаписьXML.ЗаписатьКонецЭлемента(); // Закрываем Справочник
ЗаписьXML.Закрыть();
Для JSON логика аналогична, но синтаксис проще:
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.ОткрытьФайл("C:\temp\nomenklatura.json", "UTF-8");
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьКлюч("ДатаВыгрузки");
ЗаписьJSON.ЗаписатьЗначение(ТекущаяДата());
ЗаписьJSON.ЗаписатьКлюч("Элементы");
ЗаписьJSON.ЗаписатьНачалоМассива();
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
ЗаписьJSON.ЗаписатьНачалоОбъекта();
ЗаписьJSON.ЗаписатьКлюч("Код");
ЗаписьJSON.ЗаписатьЗначение(Выборка.Код);
ЗаписьJSON.ЗаписатьКлюч("Наименование");
ЗаписьJSON.ЗаписатьЗначение(Выборка.Наименование);
ЗаписьJSON.ЗаписатьКонецОбъекта();
КонецЦикла;
ЗаписьJSON.ЗаписатьКонецМассива();
ЗаписьJSON.ЗаписатьКонецОбъекта();
ЗаписьJSON.Закрыть();
Преимущества этого подхода:
- 📌 Автоматическое экранирование специальных символов (например,
&в XML или"в JSON). - 📊 Поддержка вложенных структур (массивов, объектов).
- 🔄 Валидный вывод: не нужно вручную следить за закрытием тегов или запятыми.
⚠️ Внимание: При записи больших объёмов данных (тысячи строк) используйтеЗаписьXML.ЗаписатьНачалоПотока()иЗаписьJSON.ЗаписатьНачалоПотока()— это ускорит процесс за счёт буферизации.
☑️ Подготовка к записи XML/JSON
3. Запись в CSV: нюансы формата и пример кода
Формат CSV (Comma-Separated Values) часто используется для обмена данными с Excel или другими системами. В 1С нет встроенного объекта для CSV, но его легко эмулировать с помощью ЗаписьТекста.
Основные правила формирования CSV:
- 📑 Разделитель: обычно запятая (
,), но может быть точка с запятой (;) — зависит от региональных настроек Excel. - 📌 Кавычки: текстовые поля с разделителями или переводами строк оборачиваются в
" ". - 🔤 Кодировка: для кириллицы обязательно использовать
UTF-8с BOM (маркером порядка байтов).
Пример выгрузки документов РеализацияТоваровУслуг в CSV:
// Создаём заголовки колонок
Заголовки = "Номер,Дата,Контрагент,Сумма";
ТекстCSV = Заголовки + Символы.ПС;
// Добавляем данные
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Пока Выборка.Следующий() Цикл
// Экранируем кавычки и разделители в тексте
Контрагент = СтрЗamenить(Выборка.Контрагент.Наименование, """", """""");
Контрагент = Если(Найти(Контрагент, ",") <> 0 Или Найти(Контрагент, Символы.ПС) <> 0,
""" + Контрагент + """",
Контрагент);
Строка = """" + Выборка.Номер + """," +
Формат(Выборка.Дата, "ДЛФ=DT") + "," +
Контрагент + "," +
Формат(Выборка.СуммаДокумента, "ЧЦ=15; ЧДЦ=2");
ТекстCSV = ТекстCSV + Строка + Символы.ПС;
КонецЦикла;
// Сохраняем в файл с BOM для UTF-8
ЗаписьТекста = Новый ЗаписьТекста();
ЗаписьТекста.ОткрытьФайл("C:\temp\реализации.csv", "UTF-8", Истина); // Третий параметр - добавить BOM
ЗаписьТекста.ЗаписатьСтроку(ТекстCSV);
ЗаписьТекста.Закрыть();
Критичный нюанс: без BOM в начале файла Excel может неправильно распознать кодировку UTF-8, и кириллица отобразится кракозябрами. Чтобы добавить BOM, используйте третий параметр Истина в методе ОткрытьФайл().
| Проблема | Причина | Решение |
|---|---|---|
| Кракозябры в Excel | Неверная кодировка или отсутствует BOM | Использовать UTF-8 с BOM |
| Данные в одной ячейке | Отсутствуют кавычки для текста с запятыми | Экранировать поля с разделителями |
| Перенос строк внутри ячейки | Символы ПС не экранированы |
Оборачивать поле в кавычки |
4. Работа с двоичными файлами: PDF, изображения, архивы
Для записи двоичных данных (например, сгенерированных PDF-отчётов, картинок или ZIP-архивов) в 1С используется объект ЗаписьДанных. Он работает с массивом байтов, поэтому предварительно нужно преобразовать данные в двоичный формат.
Типичный сценарий — сохранение отчёта в PDF:
// Получаем двоичные данные отчёта (пример для СКД)
Макет = Отчеты.Продажи.ПолучитьМакет("Основной");
Настройки = Отчеты.Продажи.ПолучитьНастройкиПоУмолчанию();
Результат = Отчеты.Продажи.Сформировать(Макет, Настройки);
// Сохраняем в PDF
ДвоичныеДанные = Результат.ПолучитьДвоичныеДанные("PDF");
ЗаписьДанных = Новый ЗаписьДанных();
ЗаписьДанных.ОткрытьФайл("C:\temp\отчет_продажи.pdf");
ЗаписьДанных.Записать(ДвоичныеДанные);
ЗаписьДанных.Закрыть();
Для изображений (например, логотипов или скриншотов) логика аналогична:
// Пример: сохранение картинки из поля "Картинка" справочника
Выборка = Справочники.Товары.Выбрать();
Пока Выборка.Следующий() Цикл
Если Не Выборка.Картинка.Пустая() Тогда
ЗаписьДанных = Новый ЗаписьДанных();
ПутьКФайлу = "C:\temp\images\" + Выборка.Код + ".jpg";
ЗаписьДанных.ОткрытьФайл(ПутьКФайлу);
ЗаписьДанных.Записать(Выборка.Картинка.ПолучитьДвоичныеДанные());
ЗаписьДанных.Закрыть();
КонецЕсли;
КонецЦикла;
Важные моменты:
- 🖼️ Форматы изображений: 1С поддерживает
.jpg,.png,.bmp. Для других форматов (например,.webp) потребуется внешняя компонента. - 📦 Архивы ZIP: для создания ZIP-файлов нужна внешняя библиотека (например, Zip1C или 7-Zip DLL).
- 🔒 Безопасность: двоичные файлы могут содержать вирусы. Всегда проверяйте источник данных перед записью.
Если нужно сжать данные перед сохранением, используйте внешнюю компоненту Gzip1C. Она позволяет архивировать файлы прямо из 1С без вызова внешних программ.
5. Альтернативные способы: внешние компоненты и COM-объекты
Встроенные средства 1С не всегда покрывают все задачи. Например, для работы с .xlsx (а не устаревшим .xls) или для записи в облачные хранилища (например, Google Drive) потребуются внешние инструменты.
Рассмотрим популярные варианты:
5.1. Работа с Excel через COM
Для записи в .xlsx можно использовать COM-объект Excel.Application:
Excel = Новый COMОбъект("Excel.Application");
Книга = Excel.Workbooks.Add();
Лист = Книга.Worksheets(1);
// Заполняем данные
Лист.Cells(1, 1).Value = "Номер";
Лист.Cells(1, 2).Value = "Дата";
Лист.Cells(1, 3).Value = "Сумма";
Выборка = Документы.РеализацияТоваровУслуг.Выбрать();
Строка = 2;
Пока Выборка.Следующий() Цикл
Лист.Cells(Строка, 1).Value = Выборка.Номер;
Лист.Cells(Строка, 2).Value = Формат(Выборка.Дата, "ДЛФ=DT");
Лист.Cells(Строка, 3).Value = Выборка.СуммаДокумента;
Строка = Строка + 1;
КонецЦикла;
// Сохраняем и закрываем
Книга.SaveAs("C:\temp\отчет.xlsx");
Excel.Quit();
⚠️ Внимание: Для работы с COM на сервере 1С должен быть установлен Microsoft Excel и настроены права для учётной записи usr1cv8.
5.2. Внешние компоненты для расширенных задач
Для сложных сценариев (например, работа с Google Sheets API или шифрование файлов) используйте внешние компоненты:
- 📁 OneScript: библиотека для работы с файлами, архивами, HTTP-запросами.
- 🔐 CryptoPro: для подписи и шифрования файлов.
- ☁️ YandexDisk1C: интеграция с Яндекс.Диском.
Пример использования OneScript для записи в файл:
// Подключаем OneScript (предварительно установите библиотеку)
ПутьКБиблиотеке = "C:\OneScript\lib\1Script.dll";
OneScript = Новый COMОбъект(ПутьКБиблиотеке);
// Создаём скрипт на языке OneScript
Скрипт = "
|Текст = ""Привет из OneScript!"";
|Файл = Новый ТекстовыйДокумент;
|Файл.Записать(Текст, ""C:\temp\onescript.txt"", КодировкаТекста.UTF8);
";
OneScript.Выполнить(Скрипт);
Как установить внешнюю компоненту в 1С?
1. Скачайте DLL-файл компоненты (например, с сайта разработчика).
2. Поместите его в папку bin вашей информационной базы (например, C:\Program Files\1cv8\8.3.x.x\bin\).
3. В конфигураторе добавьте ссылку на компоненту в разделе Внешние компоненты.
4. Перезапустите 1С и проверьте подключение через Новый COMОбъект("ИмяКомпоненты").
6. Обработка ошибок и оптимизация записи
При записи файлов из 1С часто возникают ошибки, связанные с правами доступа, переполнением диска или блокировкой файлов. Разберём типичные проблемы и способы их решения.
6.1. Типичные ошибки и их причины
| Ошибка | Причина | Решение |
|---|---|---|
Ошибка при открытии файла |
Нет прав на запись в папку | Проверить права учётной записи usr1cv8 или использовать другую папку (например, %TEMP%) |
Диск переполнен |
Недостаточно места на диске | Очистить диск или записывать файлы на другой раздел |
Файл используется другим процессом |
Файл открыт в Excel или другом ПО | Закрыть файл во внешних программах или использовать временное имя |
Неверная кодировка |
Указанная кодировка не совпадает с данными | Явно указывать UTF-8 и добавлять BOM для CSV |
6.2. Оптимизация для больших файлов
При записи тысяч строк (например, выгрузка большого справочника) используйте следующие приёмы:
- 📤 Буферизация: записывайте данные пачками по 100–1000 строк, а не построчно.
- 🗑️ Временные файлы: для промежуточных данных используйте
ПолучитьИмяВременногоФайла(). - ⚡ Асинхронная запись: для фоновых задач используйте
ЗапуститьОбработку().
Пример буферизированной записи:
// Буфер для хранения строк
Буфер = Новый Массив();
МаксРазмерБуфера = 1000;
ЗаписьТекста = Новый ЗаписьТекста();
ЗаписьТекста.ОткрытьФайл("C:\temp\bigfile.csv", "UTF-8", Истина);
Выборка = Справочники.Номенклатура.Выбрать();
Пока Выборка.Следующий() Цикл
Строка = ФорматироватьСтрокуCSV(Выборка); // Ваша функция форматирования
Буфер.Добавить(Строка);
Если Буфер.Количество() >= МаксРазмерБуфера Тогда
ЗаписьТекста.ЗаписатьСтроку(СтрСоединить(Буфер, Символы.ПС));
Буфер.Очистить();
КонецЕсли;
КонецЦикла;
// Записываем оставшиеся данные
Если Буфер.Количество() > 0 Тогда
ЗаписьТекста.ЗаписатьСтроку(СтрСоединить(Буфер, Символы.ПС));
КонецЕсли;
ЗаписьТекста.Закрыть();
Всегда проверяйте результат записи! После закрытия файла добавьте проверку Новый Файл(ПутьКФайлу).Существует() и сравните размер файла с ожидаемым.
7. Печать в сетевые и облачные хранилища
Современные системы часто требуют записи файлов не на локальный диск, а в сетевую папку, FTP или облако (Яндекс.Диск, Google Drive). Рассмотрим основные сценарии.
7.1. Запись в сетевую папку
Для записи в сетевую папку (например, \\server\share\file.txt) используйте стандартные методы, но учтите:
- 🔑 Права доступа: учётная запись
usr1cv8должна иметь права на запись в сетевую папку. - 🌐 UNC-пути: используйте формат
\\server\share\file.txt, а не сетевые диски (Z:\file.txt). - 🔄 Стабильность связи: при обрыве сети файл может сохраниться не полностью.
Пример:
Путь = "\\server\share\reports\отчет_" + Формат(ТекущаяДата(), "ДЛФ=Д") + ".txt";
Попытка
ЗаписьТекста = Новый ЗаписьТекста();
ЗаписьТекста.ОткрытьФайл(Путь, "UTF-8");
ЗаписьТекста.ЗаписатьСтроку("Данные отчёта...");
ЗаписьТекста.Закрыть();
Исключение
Сообщить("Ошибка записи в сетевую папку: " + ОписаниеОшибки());
КонецПопытки;
7.2. Загрузка в облачные хранилища
Для работы с облаками (например, Яндекс.Диск) проще всего использовать внешние компоненты:
- ☁️ YandexDisk1C: официальная компонента для интеграции с Яндекс.Диском.
- 📤 Google Drive API: требует регистрации проекта в Google Cloud и OAuth-аутентификации.
Пример загрузки файла на Яндекс.Диск:
// Подключаем компоненту YandexDisk1C
Диск = Новый COMОбъект("YandexDisk1C.YandexDisk");
// Авторизуемся (токен получаем заранее в личном кабинете Яндекса)
Диск.Авторизоваться("ваш_токен");
// Загружаем файл
ЛокальныйПуть = "C:\temp\отчет.csv";
ОблачныйПуть = "/AppFolder/отчет.csv";
Результат = Диск.ЗагрузитьФайл(ЛокальныйПуть, ОблачныйПуть);
Если Не Результат.Успех Тогда
Сообщить("Ошибка загрузки: " + Результат.ОписаниеОшибки);
КонецЕсли;
⚠️ Внимание: При работе с облачными API ограничения на количество запросов и размер файлов могут меняться. Уточняйте актуальные лимиты в документации сервиса.
8. Лайфхаки и неочевидные приёмы
Заключительный раздел посвящён редким, но полезным техникам записи файлов из 1С.
8.1. Запись в ZIP-архив без внешних компонент
Если нельзя установить внешнюю компоненту, можно вызвать 7-Zip через командную строку:
// Сначала сохраняем файлы в временную папку
Каталог = ПолучаемИмяВременногоКаталога(); // Ваша функция
СохранитьФайлыВПапку(Каталог); // Ваша функция записи файлов
// Архивируем с помощью 7-Zip
Команда = ""C:\Program Files\7-Zip\7z.exe"" a -tzip ""C:\temp\архив.zip"" """" + Каталог + "\*""""";
WScript = Новый COMОбъект("WScript.Shell");
WScript.Run(Команда, 0, Истина);
// Удаляем временные файлы
УдалитьФайлы(Каталог);
8.2. Логирование с автоматической ротацией
Для долговременного логирования (например, записи ошибок) используйте ротацию файлов по дате или размеру:
Процедура ЗаписатьВЛог(Сообщение)
ПутьКФайлу = "C:\logs\app_" + Формат(ТекущаяДата(), "ДЛФ=Д") + ".log";
// Проверяем размер файла
Если Файл(ПутьКФайлу).Размер() > 1024 * 1024 Тогда // 1 МБ
АрхивныйПуть = "C:\logs\archive\app_" + Формат(ТекущаяДата(), "ДЛФ=ДТ") + ".log";
ПереместитьФайл(ПутьКФайлу, АрхивныйПуть);
КонецЕсли;
// Записываем сообщение
ЗаписьТекста = Новый ЗаписьТекста();
ЗаписьТекста.ОткрытьФайл(ПутьКФайлу, "UTF-8", Истина, Истина); // Добавление в конец
ЗаписьТекста.ЗаписатьСтроку(Формат(ТекущаяДата(), "ДЛФ=ДТ") + " | " + Сообщение);
ЗаписьТекста.Закрыть();
КонецПроцедуры
8.3. Запись в файл из фонового задания
Если запись файла занимает много времени, перенесите её в фоновое задание:
Процедура ВыгрузитьДанныеВФоновомРежиме()
Параметры = Новый Структура();
Параметры.Вставить("ПутьКФайлу", "C:\temp\большой_отчет.csv");
Параметры.Вставить("Данные", ПолучаемДанныеДляВыгрузки()); // Ваша функция
ФоновоеЗадание = ФоновыеЗадания.Создать(
"ВыполнитьВыгрузкуВФайл", // Имя процедуры
Параметры,
Истина // Выполнять на сервере
);
ФоновоеЗадание.ВыполнитьАсинхронно();
КонецПроцедуры
Процедура ВыполнитьВыгрузкуВФайл(Параметры) Экспорт
Путь = Параметры.ПутьКФайлу;
Данные = Параметры.Данные;
ЗаписьТекста = Новый ЗаписьТекста();
ЗаписьТекста.ОткрытьФайл(Путь, "UTF-8");
Для Каждого Строка Из Данные Цикл
ЗаписьТекста.ЗаписатьСтроку(Строка);
КонецЦикла;
ЗаписьТекста.Закрыть();
КонецПроцедуры