К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как печатать в файл из 1С: способы и примеры кода

Как вывести данные из 1С в файл: ТекстовыйДокумент, ЗаписьТекста, сохранение табличного документа в MXL, Excel и PDF. Примеры кода, кодировки, ошибки.

Под «печатью в файл» в 1С обычно понимают три разные задачи: вывод произвольного текста в текстовый файл, сохранение табличного документа (печатной формы) в файл формата MXL, Excel, PDF или HTML и потоковая запись данных через объект ЗаписьТекста. У каждой задачи свой инструментарий, и выбор неправильного объекта — самая частая причина битых файлов, потери кодировки и ошибок «Файл не найден».

Все перечисленные способы работают как на толстом, так и на тонком клиенте, но с важным ограничением: в клиент-серверном режиме код, выполняемый на сервере, пишет файлы на диск сервера, а не на компьютер пользователя. Чтобы файл оказался у пользователя, его нужно либо сформировать на клиенте, либо передать с сервера через временное хранилище. Этот момент критичен для веб-клиента, где прямой доступ к файловой системе вообще ограничен браузером.

Ниже разобраны рабочие примеры кода на встроенном языке 1С, различия между объектами, вопросы кодировки и типичные ошибки, которые приводят к пустым или нечитаемым файлам.

Выбор объекта: ТекстовыйДокумент, ЗаписьТекста или табличный документ

Перед написанием кода определите, что именно должно оказаться в файле. Если это произвольный текст — лог, выгрузка, служебный файл — подходят ТекстовыйДокумент и ЗаписьТекста. Если это печатная форма документа, отчёт или любой табличный документ — используйте метод Записать самого табличного документа с указанием типа файла.

ТекстовыйДокумент удобен для небольших и средних объёмов: весь текст накапливается в памяти, затем записывается одним вызовом. ЗаписьТекста работает потоково — строки пишутся в файл по мере формирования, что снимает ограничение по памяти при выгрузке сотен тысяч строк. Табличный документ сохраняет не только текст, но и форматирование, поэтому подходит для печатных форм.

Сравнение вариантов

ТекстовыйДокумент

Произвольный текст небольшого и среднего объёма. Простой код, но весь текст держится в памяти до записи.

ЗаписьТекста

Большие выгрузки и логи. Потоковая запись экономит память, но требует явно открывать и закрывать файл.

Табличный документ (Записать)

Печатные формы и отчёты. Сохраняет оформление в MXL, XLSX, PDF, HTML, ODS, TXT.

Вывод текста через ТекстовыйДокумент

Объект ТекстовыйДокумент — самый простой способ напечатать строки в файл. Текст добавляется построчно методом ДобавитьСтроку или УстановитьТекст целиком, затем метод Записать сохраняет содержимое на диск. Вторым параметром метода Записать можно указать кодировку — по умолчанию используется системная, что часто приводит к «кракозябрам» при открытии файла на другой машине.

Текст = Новый ТекстовыйДокумент;

Текст.ДобавитьСтроку("Номенклатура;Количество;Цена");

Запрос = Новый Запрос("ВЫБРАТЬ Номенклатура, Количество, Цена ИЗ РегистрСведений.Цены");

Выборка = Запрос.Выполнить().Выбрать();

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

Текст.ДобавитьСтроку(СтрШаблон("%1;%2;%3",

Выборка.Номенклатура, Выборка.Количество, Выборка.Цена));

КонецЦикла;

Текст.Записать("C:\Обмен\выгрузка.txt", КодировкаТекста.UTF8);

Явное указание кодировки — обязательная практика. КодировкаТекста.UTF8 корректно читается большинством программ, КодировкаТекста.ANSI соответствует системной кодировке Windows. Если файл предназначен для старой DOS-программы, может понадобиться КодировкаТекста.OEM. Несовпадение кодировки записи и чтения — главная причина нечитаемого текста.

Потоковая запись больших файлов через ЗаписьТекста

Когда строк десятки или сотни тысяч, держать весь текст в памяти нерационально. Объект ЗаписьТекста открывает файл и пишет в него построчно. Важно не забыть вызвать Закрыть() — иначе часть буфера может не попасть на диск, а сам файл останется заблокированным до завершения сеанса.

Запись = Новый ЗаписьТекста("C:\Обмен\log.txt", КодировкаТекста.UTF8);

Попытка

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

Запись.ЗаписатьСтроку(СтрокаДанных.Представление);

КонецЦикла;

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

Исключение

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

ВызватьИсключение;

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

Обёртка в Попытка/Исключение с закрытием файла в обеих ветках защищает от зависших блокировок. Если такой файл потом не открывается другой программой с ошибкой «занят другим процессом» — почти наверняка где-то не вызван Закрыть().

Типичные ошибки
01
Не вызван Закрыть() у ЗаписьТекста — файл остаётся заблокированным, последние строки теряются
02
Не указана кодировка — на другом компьютере кириллица превращается в нечитаемые символы
03
Запись на сервере в папку, куда у службы агента 1С нет прав — ошибка доступа или молчаливый сбой
04
Использование ТекстовыйДокумент для выгрузки в миллионы строк — чрезмерный расход памяти и падение сеанса

Сохранение печатной формы и табличного документа в файл

Табличный документ (результат вывода печатной формы или отчёта) сохраняется собственным методом Записать. Первый параметр — имя файла, второй — тип файла табличного документа. Доступны MXL (родной формат 1С), XLSX, PDF, HTML, ODS, TXT и другие. Для PDF и XLSX сохраняется и оформление: шрифты, границы, объединённые ячейки.

ТабДок = Новый ТабличныйДокумент;

// ... вывод макета, заполнение областей ...

ТабДок.Записать("C:\Обмен\Счет.pdf", ТипФайлаТабличногоДокумента.PDF);

В управляемых формах у табличного документа на форме уже есть встроенная команда сохранения: пользователь может сохранить печатную форму в файл через меню «Файл — Сохранить копию» без всякого программирования. Если задача разовая, достаточно этого штатного механизма.

При сохранении в TXT форматирование теряется — выгружается только текст ячеек с разделителями. Для обмена с другими системами это иногда именно то, что нужно, но для печатных форм предпочтительнее PDF или XLSX.

Где выполняется код: клиент, сервер и веб-клиент

В клиент-серверном режиме директива компиляции определяет, на чьём диске появится файл. Код с директивой &НаСервере пишет в файловую систему сервера 1С — пользователь этот файл не увидит. Код с директивой &НаКлиенте пишет на компьютер пользователя, но только если у тонкого клиента есть разрешение на доступ к файловой системе.

Типовой шаблон обмена между сервером и клиентом — временное хранилище: файл формируется на сервере, помещается в хранилище как двоичные данные, а на клиенте извлекается и сохраняется. В веб-клиенте прямая запись на диск невозможна — файл передаётся пользователю как скачивание через браузер.

Маршрут решения

Как выбрать действие

Файл нужен пользователю на его компьютере, тонкий клиентФормируйте на сервере, передавайте через ПоместитьВоВременноеХранилище и сохраняйте на клиенте
Файл — часть обмена между серверамиПишите на сервере в каталог, доступный службе агента 1С
Пользователь работает в веб-клиентеПередавайте файл как скачивание, прямой записи на диск нет
Нужна разовая выгрузка печатной формыИспользуйте штатное «Файл — Сохранить копию» без программирования

Проверка результата и права доступа

После записи убедитесь, что файл реально создан и читаем: откройте его тем приложением, для которого он предназначен, и проверьте кодировку, количество строк и последнюю строку — обрыв в конце указывает на незакрытый поток или прерванную запись. Для печатных форм проверьте, что форматирование совпадает с тем, что видно на экране.

Частая проблема — права доступа. Служба агента сервера 1С обычно работает под отдельной учётной записью, у которой нет прав на пользовательские папки и сетевые диски с персональными маппингами. Сетевые пути указывайте в формате UNC (\\сервер\ресурс), а не через буквы дисков — буквы существуют только в сессии конкретного пользователя.

Контрольные точки

Как проверить результат

Существование файла
Норма

Файл появился в указанном каталоге с ненулевым размером

Тревожный признак

Файла нет или размер 0 байт — проверяйте путь и исключения в коде

Кодировка
Норма

Кириллица читается при открытии в Блокноте или целевой программе

Тревожный признак

Нечитаемые символы — перезапишите с явным указанием КодировкаТекста.UTF8

Полнота данных
Норма

Последняя ожидаемая строка присутствует

Тревожный признак

Файл обрывается — поток не был закрыт или запись прервана ошибкой

Доступность для других программ
Норма

Файл открывается сторонним приложением

Тревожный признак

Ошибка «файл занят» — где-то не вызван Закрыть()

Частые ошибки и их устранение

Ошибка «Файл не обнаружен» при записи почти всегда означает, что не существует каталог, указанный в пути: метод Записать не создаёт промежуточные папки. Создавайте каталог заранее через СоздатьКаталог() или проверяйте его существование. Вторая по частоте причина — опечатка в пути или смешение прямых и обратных слешей; встроенный язык корректно воспринимает оба варианта, но лучше придерживаться одного стиля.

Если файл формируется регламентным заданием, помните, что оно всегда выполняется на сервере и в контексте без пользовательского интерфейса: никаких диалогов выбора файла там быть не может, путь должен быть задан константой, параметром или настройкой в базе. Также регламентные задания не видят буквы сетевых дисков — только UNC-пути.

FAQ

Как сохранить печатную форму в PDF без программирования?

Откройте печатную форму, затем используйте меню «Файл — Сохранить копию» (или кнопку сохранения на панели табличного документа) и выберите формат PDF. Платформа сформирует файл самостоятельно, установленный PDF-принтер не требуется.

Почему в файле вместо русских букв нечитаемые символы?

Кодировка записи не совпадает с кодировкой, в которой файл открывают. Укажите кодировку явно вторым параметром метода Записать, например КодировкаТекста.UTF8, и убедитесь, что принимающая программа понимает этот формат.

Код записывает файл, но пользователь его не видит. В чём причина?

Код выполняется на сервере, поэтому файл создаётся на диске сервера 1С. Передайте файл на клиент через временное хранилище: поместите двоичные данные функцией ПоместитьВоВременноеХранилище, а на клиенте извлеките и сохраните.

Чем ТекстовыйДокумент отличается от ЗаписьТекста?

ТекстовыйДокумент накапливает весь текст в памяти и пишет одним вызовом — удобно для небольших файлов. ЗаписьТекста пишет потоково по мере формирования строк, что позволяет выгружать миллионы строк без переполнения памяти, но требует обязательного вызова Закрыть().

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

Да, но файл будет создан на сервере, путь нужно задать явно (константой или настройкой), без диалогов выбора. Используйте UNC-пути для сетевых ресурсов и убедитесь, что у учётной записи службы агента 1С есть права на запись в целевой каталог.

Как добавить строки в существующий файл, не стирая его?

У ТекстовыйДокумент сначала вызовите Прочитать() с именем файла, затем добавляйте строки и записывайте обратно. У ЗаписьТекста передайте третьим параметром конструктора значение Истина — это включит режим дозаписи в конец файла.

Итог

Что важно запомнить

Произвольный текст выводите через ТекстовыйДокумент или потоковую ЗаписьТекста, печатные формы — методом Записать табличного документа в нужном формате. Всегда указывайте кодировку явно, закрывайте потоки и учитывайте, где выполняется код: сервер пишет на свой диск, а пользователю файл передают через временное хранилище.