В процессе разработки часто возникает необходимость автоматизировать вывод на печать внешних текстовых файлов. Это могут быть логи, чеки из сторонних систем эквайринга или простые сопроводительные документы в формате .txt. Сложность заключается в том, что стандартный объект платформы ТекстовыйДокумент имеет метод Показать(), но лишен встроенного метода Напечатать(). В этой статье мы подробно разберем несколько стратегий решения этой задачи: от использования механизмов самой платформы до обращения к системным утилитам операционной системы.
Наиболее правильным и гибким способом в среде 1С является преобразование текстовых данных в ТабличныйДокумент. Этот метод позволяет не зависеть от внешних приложений, установленных в системе, и корректно управлять параметрами страницы (полями, шрифтами, масштабом).
Рассмотрим вариант, при котором мы создаем табличный документ «на лету» и заполняем его строками из файла. Проанализируем пример кода, который эффективно справляется с этой задачей:
&НаКлиенте
Процедура РаспечататьТекстИзФайла(ПутьКФайлу)
// Создаем объект для чтения файла
Текст = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);
// Создаем результирующий табличный документ
ТабДок = Новый ТабличныйДокумент;
// Определяем ширину колонки так, чтобы текст влезал по ширине страницы
// Эмпирически рассчитываем значение исходя из стандартных полей
ШиринаКолонки = (ТабДок.ШиринаСтраницы - 5) / 2;
НомерСтроки = 1;
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
// Обращаемся к ячейке в текущей строке
ОбластьПечати = ТабДок.Область(НомерСтроки, 1);
ОбластьПечати.Текст = Стр;
// Настраиваем шрифт и оформление
ОбластьПечати.Шрифт = Новый Шрифт("Courier New", 10); // Используем моноширинный шрифт
ОбластьПечати.ШиринаКолонки = ШиринаКолонки;
ОбластьПечати.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
Стр = Текст.ПрочитатьСтроку();
НомерСтроки = НомерСтроки + 1;
КонецЦикла;
// Настраиваем параметры печати
ТабДок.АвтоМасштаб = Истина;
ТабДок.ПолеСлева = 10;
ТабДок.ПолеСправа = 5;
// Выводим на принтер без диалога
ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецПроцедуры
Разберем, почему мы используем именно такой подход. Во-первых, использование ТипРазмещенияТекстаТабличногоДокумента.Переносить гарантирует, что длинные строки не будут обрезаны краем листа. Во-вторых, моноширинный шрифт (например, Courier New) позволяет сохранить визуальное форматирование колонок, если оно присутствовало в исходном txt файле.
Если нам требуется печатать документы определенного формата (например, банковские слип-чеки), удобнее использовать заранее подготовленный Макет. Это позволяет один раз настроить область печати и просто передавать в нее данные. Посмотрим на алгоритм реализации:
СтрокаТекста.ЗначениеСтроки.Теперь реализуем программную часть:
Макет = ПолучитьМакет("МакетПечати");
ТабДок = Новый ТабличныйДокумент;
Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.OEM);
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
Стр = Текст.ПрочитатьСтроку();
Пока Стр <> Неопределено Цикл
ОбластьМакета.Параметры.ЗначениеСтроки = Стр;
ТабДок.Вывести(ОбластьМакета);
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
ТабДок.ИмяПринтера = "ИмяВашегоПринтера";
ТабДок.Напечатать();
Обратите внимание на использование метода Вывести() вместо Присоединить(). Метод Вывести() добавляет области сверху вниз, что идеально подходит для построчного вывода текстового файла.
Если разработка ведется строго под Windows и нет желания возиться с макетами, можно воспользоваться командами операционной системы. Самый простой способ — вызвать штатный «Блокнот» с ключом печати.
Выясним, как это реализовать через КомандаСистемы:
ПутьКФайлу = "C:\temp\report.txt";
КомандаСистемы("notepad /p " + ПутьКФайлу);
Важный нюанс: Ключ /p отправляет файл на принтер, установленный в системе по умолчанию. Если вам нужно отправить файл на конкретный сетевой принтер, можно воспользоваться командой копирования в порт принтера (подходит для старых моделей или специализированных принтеров этикеток):
КомандаСистемы("copy /b C:\test.txt \\ИмяСервера\ИмяПринтера");
При работе с текстовыми файлами часто возникает проблема «кракозябр». Проанализируем причины. Файлы могут быть созданы в разных кодировках: OEM (DOS), ANSI (Windows-1251) или UTF-8. При создании объекта ЧтениеТекста крайне важно явно указывать кодировку, соответствующую источнику.
Особое внимание стоит уделить шрифту Terminal. Многие старые системы используют его для формирования таблиц псевдографикой. В 1С при попытке печати этим шрифтом могут возникнуть сложности, так как он является растровым. Рекомендуем заменять его на современные векторные аналоги, такие как Lucida Console, которые корректно масштабируются и поддерживают Unicode.
Разберем еще несколько профессиональных хитростей:
ПрочитатьСтроку(), как показано в примерах выше.<pre> и загрузить в ПолеHTMLДокумента на форме. У этого объекта есть встроенный метод печати, который отлично сохраняет форматирование.ИмяПринтера перед вызовом Напечатать(), чтобы избежать путаницы у пользователя.Таким образом, мы рассмотрели основные подходы к печати текстовых документов. Для надежных бизнес-решений мы рекомендуем использовать Способ №1 с табличным документом, так как он обеспечивает максимальный контроль над результатом и не зависит от настроек стороннего ПО на рабочих станциях пользователей.