При разработке внешних печатных форм и алгоритмов формирования отчетов разработчики часто сталкиваются с ситуацией, когда данные формируются в объекте ТекстовыйДокумент. Однако при попытке отправить результат напрямую на печать выясняется, что у объекта ТекстовыйДокумент в платформе 1С:Предприятие отсутствует встроенный метод Напечатать(), а также свойства управления параметрами страницы и принтера (в отличие от объекта ТабличныйДокумент).
Стандартный метод ТекстовыйДокумент.Показать() открывает окно документа пользователю, требуя ручного нажатия комбинации клавиш печати. Разберем основные способы и практические варианты обхода этого ограничения, позволяющие отправить текстовые данные на принтер без лишних действий со стороны пользователя.
Рассмотрим самый надежный и платформенный способ. Мы загружаем сформированный текст в ТабличныйДокумент, настраиваем моноширинный шрифт для сохранения колонок и форматирования, после чего программно вызываем метод Напечатать().
Разберем по шагам реализацию данного подхода:
ТабличныйДокумент.ТекстовыйДокумент в ячейку или выводим построчно.Напечатать() с параметром РежимИспользованияДиалогаПечати.НеИспользовать.Посмотрим на пример программного кода:
// Предположим, что ТекстДок - это сформированный объект ТекстовыйДокумент
ТабДок = Новый ТабличныйДокумент;
// Задаем параметры страницы при необходимости
ТабДок.ПолеСлева = 5;
ТабДок.ПолеСправа = 5;
ТабДок.ПолеСверху = 5;
ТабДок.ПолеСнизу = 5;
// Помещаем весь текст в первую ячейку или заполняем область
Область = ТабДок.Область("R1C1");
Область.Текст = ТекстДок.ПолучитьТекст();
Область.Шрифт = Новый Шрифт("Courier New", 9);
// Если требуется отправить на конкретный принтер
// ТабДок.ИмяПринтера = "Имя_Принтера_В_Системе";
// Отправляем сразу на печать без вывода диалогового окна
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
Проанализируем ситуацию, когда текст нельзя конвертировать в табличный документ (например, требуется прямая печать текстового потока или печать на специализированный матричный/термопринтер). В этом случае мы можем сохранить файл на диск и вызвать утилиты операционной системы.
Разберем пример для операционной системы Windows:
ПутьКФайлу = ПолучитьИмяВременногоФайла("txt");
ТекстДок.Записать(ПутьКФайлу, КодировкаТекста.ANSI);
// Вариант 1: Печать через стандартный блокнот Windows
Команда = СтрШаблон("notepad.exe /p ""%1""", ПутьКФайлу);
ЗапуститьПриложение(Команда, , Истина);
// Удаляем временный файл после отправки в очередь печати
УдалитьФайлы(ПутьКФайлу);
Если используется операционная система Linux, печать файла выполняется через системные утилиты lp или lpr:
ПутьКФайлу = ПолучитьИмяВременногоФайла("txt");
ТекстДок.Записать(ПутьКФайлу, КодировкаТекста.UTF8);
Команда = СтрШаблон("lp ""%1""", ПутьКФайлу);
ЗапуститьПриложение(Команда, , Истина);
УдалитьФайлы(ПутьКФайлу);
Рассмотрим нюансы работы стандартного механизма внешних печатных форм в типовых конфигурациях. Обычно функция печати ожидает возврата объекта ТабличныйДокумент для отображения его в стандартной форме предпросмотра.
Если печать выполняется прямо внутри кода обработки, обратим внимание на следующие правила:
Неопределено или пустую структуру печатных форм (в зависимости от версии БСП).ПоказатьОповещениеПользователю() или Сообщить() о том, что документ успешно отправлен на печать. Это предотвратит повторные многократные нажатия на кнопку печати.