Разработка и Конфигурация · 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);
Попытка
Для Каждого СтрокаДанных Из Данные Цикл
Запись.ЗаписатьСтроку(СтрокаДанных.Представление);
КонецЦикла;
Запись.Закрыть();
Исключение
Запись.Закрыть();
ВызватьИсключение;
КонецПопытки;
Обёртка в Попытка/Исключение с закрытием файла в обеих ветках защищает от зависших блокировок. Если такой файл потом не открывается другой программой с ошибкой «занят другим процессом» — почти наверняка где-то не вызван Закрыть().
Сохранение печатной формы и табличного документа в файл
Табличный документ (результат вывода печатной формы или отчёта) сохраняется собственным методом Записать. Первый параметр — имя файла, второй — тип файла табличного документа. Доступны MXL (родной формат 1С), XLSX, PDF, HTML, ODS, TXT и другие. Для PDF и XLSX сохраняется и оформление: шрифты, границы, объединённые ячейки.
ТабДок = Новый ТабличныйДокумент;
// ... вывод макета, заполнение областей ...
ТабДок.Записать("C:\Обмен\Счет.pdf", ТипФайлаТабличногоДокумента.PDF);
В управляемых формах у табличного документа на форме уже есть встроенная команда сохранения: пользователь может сохранить печатную форму в файл через меню «Файл — Сохранить копию» без всякого программирования. Если задача разовая, достаточно этого штатного механизма.
При сохранении в TXT форматирование теряется — выгружается только текст ячеек с разделителями. Для обмена с другими системами это иногда именно то, что нужно, но для печатных форм предпочтительнее PDF или XLSX.
Где выполняется код: клиент, сервер и веб-клиент
В клиент-серверном режиме директива компиляции определяет, на чьём диске появится файл. Код с директивой &НаСервере пишет в файловую систему сервера 1С — пользователь этот файл не увидит. Код с директивой &НаКлиенте пишет на компьютер пользователя, но только если у тонкого клиента есть разрешение на доступ к файловой системе.
Типовой шаблон обмена между сервером и клиентом — временное хранилище: файл формируется на сервере, помещается в хранилище как двоичные данные, а на клиенте извлекается и сохраняется. В веб-клиенте прямая запись на диск невозможна — файл передаётся пользователю как скачивание через браузер.
Как выбрать действие
Проверка результата и права доступа
После записи убедитесь, что файл реально создан и читаем: откройте его тем приложением, для которого он предназначен, и проверьте кодировку, количество строк и последнюю строку — обрыв в конце указывает на незакрытый поток или прерванную запись. Для печатных форм проверьте, что форматирование совпадает с тем, что видно на экране.
Частая проблема — права доступа. Служба агента сервера 1С обычно работает под отдельной учётной записью, у которой нет прав на пользовательские папки и сетевые диски с персональными маппингами. Сетевые пути указывайте в формате UNC (\\сервер\ресурс), а не через буквы дисков — буквы существуют только в сессии конкретного пользователя.
Как проверить результат
Файл появился в указанном каталоге с ненулевым размером
Файла нет или размер 0 байт — проверяйте путь и исключения в коде
Кириллица читается при открытии в Блокноте или целевой программе
Нечитаемые символы — перезапишите с явным указанием КодировкаТекста.UTF8
Последняя ожидаемая строка присутствует
Файл обрывается — поток не был закрыт или запись прервана ошибкой
Файл открывается сторонним приложением
Ошибка «файл занят» — где-то не вызван Закрыть()
Частые ошибки и их устранение
Ошибка «Файл не обнаружен» при записи почти всегда означает, что не существует каталог, указанный в пути: метод Записать не создаёт промежуточные папки. Создавайте каталог заранее через СоздатьКаталог() или проверяйте его существование. Вторая по частоте причина — опечатка в пути или смешение прямых и обратных слешей; встроенный язык корректно воспринимает оба варианта, но лучше придерживаться одного стиля.
Если файл формируется регламентным заданием, помните, что оно всегда выполняется на сервере и в контексте без пользовательского интерфейса: никаких диалогов выбора файла там быть не может, путь должен быть задан константой, параметром или настройкой в базе. Также регламентные задания не видят буквы сетевых дисков — только UNC-пути.
FAQ
Как сохранить печатную форму в PDF без программирования?
Откройте печатную форму, затем используйте меню «Файл — Сохранить копию» (или кнопку сохранения на панели табличного документа) и выберите формат PDF. Платформа сформирует файл самостоятельно, установленный PDF-принтер не требуется.
Почему в файле вместо русских букв нечитаемые символы?
Кодировка записи не совпадает с кодировкой, в которой файл открывают. Укажите кодировку явно вторым параметром метода Записать, например КодировкаТекста.UTF8, и убедитесь, что принимающая программа понимает этот формат.
Код записывает файл, но пользователь его не видит. В чём причина?
Код выполняется на сервере, поэтому файл создаётся на диске сервера 1С. Передайте файл на клиент через временное хранилище: поместите двоичные данные функцией ПоместитьВоВременноеХранилище, а на клиенте извлеките и сохраните.
Чем ТекстовыйДокумент отличается от ЗаписьТекста?
ТекстовыйДокумент накапливает весь текст в памяти и пишет одним вызовом — удобно для небольших файлов. ЗаписьТекста пишет потоково по мере формирования строк, что позволяет выгружать миллионы строк без переполнения памяти, но требует обязательного вызова Закрыть().
Можно ли писать в файл из регламентного задания?
Да, но файл будет создан на сервере, путь нужно задать явно (константой или настройкой), без диалогов выбора. Используйте UNC-пути для сетевых ресурсов и убедитесь, что у учётной записи службы агента 1С есть права на запись в целевой каталог.
Как добавить строки в существующий файл, не стирая его?
У ТекстовыйДокумент сначала вызовите Прочитать() с именем файла, затем добавляйте строки и записывайте обратно. У ЗаписьТекста передайте третьим параметром конструктора значение Истина — это включит режим дозаписи в конец файла.
Что важно запомнить
Произвольный текст выводите через ТекстовыйДокумент или потоковую ЗаписьТекста, печатные формы — методом Записать табличного документа в нужном формате. Всегда указывайте кодировку явно, закрывайте потоки и учитывайте, где выполняется код: сервер пишет на свой диск, а пользователю файл передают через временное хранилище.