Как распечатать текстовый документ (txt) средствами 1С

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

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

Способ 1. Использование Табличного документа (Кроссплатформенный метод)

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

Рассмотрим вариант, при котором мы создаем табличный документ «на лету» и заполняем его строками из файла. Проанализируем пример кода, который эффективно справляется с этой задачей:


&НаКлиенте
Процедура РаспечататьТекстИзФайла(ПутьКФайлу)
    // Создаем объект для чтения файла
    Текст = Новый ЧтениеТекста(ПутьКФайлу, КодировкаТекста.ANSI);
    
    // Создаем результирующий табличный документ
    ТабДок = Новый ТабличныйДокумент;
    
    // Определяем ширину колонки так, чтобы текст влезал по ширине страницы
    // Эмпирически рассчитываем значение исходя из стандартных полей
    ШиринаКолонки = (ТабДок.ШиринаСтраницы - 5) / 2;
    
    НомерСтроки = 1;
    Стр = Текст.ПрочитатьСтроку();
    
    Пока Стр <> Неопределено Цикл
        // Обращаемся к ячейке в текущей строке
        ОбластьПечати = ТабДок.Область(НомерСтроки, 1);
        ОбластьПечати.Текст = Стр;
        
        // Настраиваем шрифт и оформление
        ОбластьПечати.Шрифт = Новый Шрифт("Courier New", 10); // Используем моноширинный шрифт
        ОбластьПечати.ШиринаКолонки = ШиринаКолонки;
        ОбластьПечати.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
        
        Стр = Текст.ПрочитатьСтроку();
        НомерСтроки = НомерСтроки + 1;
    КонецЦикла;
    
    // Настраиваем параметры печати
    ТабДок.АвтоМасштаб = Истина;
    ТабДок.ПолеСлева = 10;
    ТабДок.ПолеСправа = 5;
    
    // Выводим на принтер без диалога
    ТабДок.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
КонецПроцедуры

Разберем, почему мы используем именно такой подход. Во-первых, использование ТипРазмещенияТекстаТабличногоДокумента.Переносить гарантирует, что длинные строки не будут обрезаны краем листа. Во-вторых, моноширинный шрифт (например, Courier New) позволяет сохранить визуальное форматирование колонок, если оно присутствовало в исходном txt файле.

Способ 2. Вывод через макет

Если нам требуется печатать документы определенного формата (например, банковские слип-чеки), удобнее использовать заранее подготовленный Макет. Это позволяет один раз настроить область печати и просто передавать в нее данные. Посмотрим на алгоритм реализации:

  1. Создадим в обработке или документе макет с типом «Табличный документ».
  2. Назовем одну строку (одну ячейку на всю ширину) как СтрокаТекста.
  3. В ячейке установим параметр ЗначениеСтроки.

Теперь реализуем программную часть:


Макет = ПолучитьМакет("МакетПечати");
ТабДок = Новый ТабличныйДокумент;
Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.OEM);

ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
Стр = Текст.ПрочитатьСтроку();

Пока Стр <> Неопределено Цикл
    ОбластьМакета.Параметры.ЗначениеСтроки = Стр;
    ТабДок.Вывести(ОбластьМакета);
    Стр = Текст.ПрочитатьСтроку();
КонецЦикла;

ТабДок.ИмяПринтера = "ИмяВашегоПринтера";
ТабДок.Напечатать();

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

Способ 3. Использование системных команд Windows

Если разработка ведется строго под 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.

Дополнительные рекомендации

Разберем еще несколько профессиональных хитростей:

Таким образом, мы рассмотрели основные подходы к печати текстовых документов. Для надежных бизнес-решений мы рекомендуем использовать Способ №1 с табличным документом, так как он обеспечивает максимальный контроль над результатом и не зависит от настроек стороннего ПО на рабочих станциях пользователей.

← На главную