Как распечатать текстовый документ в 1С напрямую на принтер?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

В практике разработчика 1С иногда возникают задачи, когда необходимо отправить на печать не стандартный табличный документ, а текстовый файл или макет типа ТекстовыйДокумент. Основная сложность заключается в том, что у объекта ТекстовыйДокумент, в отличие от ТабличныйДокумент, отсутствует встроенный метод Напечатать(). В этой статье мы подробно разберем несколько проверенных способов реализации прямой печати текстовых данных без вывода окна предварительного просмотра.

Способ 1. Использование промежуточного табличного документа

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

  1. Создаем новый объект ТабличныйДокумент.
  2. Помещаем весь текст в одну область или заполняем его построчно.
  3. Вызываем стандартный метод печати.

Посмотрим на пример кода, реализующий этот подход:


// Предположим, ТекстДляПечати - это объект типа ТекстовыйДокумент
ТабДок = Новый ТабличныйДокумент;
// Получаем весь текст и помещаем его в первую ячейку
ТабДок.Область(1, 1).Текст = ТекстДляПечати.ПолучитьТекст();

// Настраиваем параметры печати, если это необходимо
ТабДок.ИмяПринтера = "ИмяВашегоПринтера";
ТабДок.КоличествоЭкземпляров = 1;

// Печатаем без показа диалога
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);

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

Способ 2. Использование системной команды TYPE или COPY

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

Проанализируем пример кода с использованием команды КомандаСистемы:


МЛ = Новый ТекстовыйДокумент;
// ... тут заполнение документа ...
СтрФайл = КаталогВременныхФайлов() + "print_temp.txt";
МЛ.Записать(СтрФайл, КодировкаТекста.OEM); // Используем OEM для корректной печати кириллицы в DOS-кодировке

// Отправляем на порт принтера (LPT1 или сетевой путь)
КомандаСистемы("type """ + СтрФайл + """ > lpt1");

// Или через сетевой путь к расшаренному принтеру
// КомандаСистемы("copy /b """ + СтрФайл + """ \\ИмяСервера\ИмяПринтера");

УдалитьФайлы(СтрФайл);

Важный нюанс: при использовании этого метода критически важно следить за кодировкой. Большинство принтеров при прямой отправке данных ожидают кодировку КодировкаТекста.OEM (она же CP866) для корректного отображения русских символов.

Способ 3. Печать через PowerShell

Современным и более гибким способом является использование оболочки PowerShell. Это позволяет избежать проблем с захватом портов LPT и дает возможность обращаться к принтеру по его системному имени. Выясним, как это реализовать из кода 1С.

Мы можем использовать командлет Out-Printer. Рассмотрим пример вызова:


ПутьКФайлу = "C:\temp\report.txt";
ИмяПринтера = "HP_LaserJet_1100";
ТекстКоманды = "Get-Content '" + ПутьКФайлу + "' | Out-Printer -Name '" + ИмяПринтера + "'";
ЗапуститьПриложение("powershell.exe -Command """ + ТекстКоманды + """", , Истина);

Такой подход позволяет не задумываться о том, к какому порту подключен принтер — USB, сетевому или виртуальному. PowerShell сам обработает очередь печати.

Способ 4. Использование COM-объекта Shell.Application

Если мы хотим использовать стандартные средства Windows для печати файла, можно обратиться к объекту Shell.Application. Этот метод имитирует нажатие правой кнопкой мыши на файл и выбор пункта "Печать" (Print).

Выполним следующие шаги:


Шелл = Новый COMОбъект("Shell.Application");
// ПутьКФайлу должен быть полным
Шелл.ShellExecute(ПутьКФайлу, "", "", "print", 1);

Этот способ удобен тем, что он автоматически задействует приложение, ассоциированное с текстовыми файлами (обычно это Notepad.exe), и отправит файл на принтер по умолчанию.

Способ 5. Печать через Microsoft Word

Если текстовый документ имеет большой объем (например, 9 страниц, как упоминалось в обсуждении) и требует качественного разбиения на страницы, можно воспользоваться объектом Word.Application. Это гарантирует, что переносы строк и шрифты будут обработаны корректно.

Разберем программную реализацию:


Попытка
    Ворд = Новый COMОбъект("Word.Application");
    Док = Ворд.Documents.Open(ПутьКФайлу);
    Док.PrintOut(); // Печать на принтер по умолчанию
    Док.Close(0); // Закрыть без сохранения изменений
    Ворд.Quit();
Исключение
    Сообщить("Ошибка при печати через Word: " + ОписаниеОшибки());
КонецПопытки;

Рекомендации по выбору метода

Проанализировав все варианты, подведем итоги:

  1. Если нужно решение внутри 1С без обращения к внешним утилитам — используйте перенос данных в ТабличныйДокумент.
  2. Если вы работаете с кассовыми аппаратами или матричными принтерами — используйте прямую запись в порт через type или copy в кодировке OEM.
  3. Для офисной печати на современные принтеры лучше всего подходит способ с PowerShell или Shell.Application, так как они наиболее стабильны в среде Windows.

Помните, что при работе с временными файлами (КаталогВременныхФайлов()) всегда следует удалять их после завершения операции печати, чтобы не засорять дисковое пространство сервера или клиентской машины.

← На главную