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

Особенность в том, что здесь нет универсального «сохранить как» — каждый формат требует своего подхода. Например, для простого текстового лога хватит метода ЗаписатьСтроку(), а для структурированных данных придётся использовать ЗаписьXML или ЗаписьJSON. Мы покажем не только синтаксис, но и типичные ошибки (например, проблемы с кодировками или правами доступа), а также дадим рекомендации по оптимизации кода для больших объёмов данных.

Статья будет полезна и начинающим разработчикам , и опытным программистам: первые узнают основы работы с файлами, вторые — нюансы работы с потоками, транзакциями и альтернативными библиотеками вроде 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) использует права пользователя, под которым запущен сеанс. Если скрипт выполняется на сервере, у учётной записи usr1cv8 должны быть права на запись.
📊 Какой формат файлов вы чаще всего записываете из 1С?
Текстовые (.txt, .csv)
XML/JSON
Двоичные (.bin, .pdf)
Excel (.xlsx)
Другой

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

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

3. Запись в CSV: нюансы формата и пример кода

Формат CSV (Comma-Separated Values) часто используется для обмена данными с Excel или другими системами. В нет встроенного объекта для 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-архивов) в используется объект ЗаписьДанных. Он работает с массивом байтов, поэтому предварительно нужно преобразовать данные в двоичный формат.

Типичный сценарий — сохранение отчёта в PDF:

// Получаем двоичные данные отчёта (пример для СКД)

Макет = Отчеты.Продажи.ПолучитьМакет("Основной");

Настройки = Отчеты.Продажи.ПолучитьНастройкиПоУмолчанию();

Результат = Отчеты.Продажи.Сформировать(Макет, Настройки);

// Сохраняем в PDF

ДвоичныеДанные = Результат.ПолучитьДвоичныеДанные("PDF");

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

ЗаписьДанных.ОткрытьФайл("C:\temp\отчет_продажи.pdf");

ЗаписьДанных.Записать(ДвоичныеДанные);

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

Для изображений (например, логотипов или скриншотов) логика аналогична:

// Пример: сохранение картинки из поля "Картинка" справочника

Выборка = Справочники.Товары.Выбрать();

Пока Выборка.Следующий() Цикл

Если Не Выборка.Картинка.Пустая() Тогда

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

ПутьКФайлу = "C:\temp\images\" + Выборка.Код + ".jpg";

ЗаписьДанных.ОткрытьФайл(ПутьКФайлу);

ЗаписьДанных.Записать(Выборка.Картинка.ПолучитьДвоичныеДанные());

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

КонецЕсли;

КонецЦикла;

Важные моменты:

  • 🖼️ Форматы изображений: поддерживает .jpg, .png, .bmp. Для других форматов (например, .webp) потребуется внешняя компонента.
  • 📦 Архивы ZIP: для создания ZIP-файлов нужна внешняя библиотека (например, Zip1C или 7-Zip DLL).
  • 🔒 Безопасность: двоичные файлы могут содержать вирусы. Всегда проверяйте источник данных перед записью.
💡

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

5. Альтернативные способы: внешние компоненты и COM-объекты

Встроенные средства не всегда покрывают все задачи. Например, для работы с .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 на сервере должен быть установлен 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. Обработка ошибок и оптимизация записи

При записи файлов из часто возникают ошибки, связанные с правами доступа, переполнением диска или блокировкой файлов. Разберём типичные проблемы и способы их решения.

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. Лайфхаки и неочевидные приёмы

Заключительный раздел посвящён редким, но полезным техникам записи файлов из .

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");

Для Каждого Строка Из Данные Цикл

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

КонецЦикла;

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

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