Доброго времени суток.

Подскажите пожалуйста как мне распечатать документ.txt из модуля формы?

Файл = Новый ЧтениеТекста("C:\тест.txt",КодировкаТекста.OEM);
Файл.Прочитать();
---
примерный говнокод

```1c
    Макет = ПолучитьМакет("Макет");
    ТабДок = Новый ТабличныйДокумент;
    Текст = Новый ЧтениеТекста(ИмяФайла);
    Стр = Текст.ПрочитатьСтроку();
    ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
    ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
    ТабДок.Присоединить(ОбластьМакета);
    Пока Стр <> Неопределено Цикл
    ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
    ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
    ТабДок.Присоединить(ОбластьМакета);
    Стр = Текст.ПрочитатьСтроку();
    КонецЦикла;
    ТабДок.Показать();
```
---
Нужно его автоматически распечатать или только показать?

тд = Новый ТекстовыйДокумент;
 Тд.Прочитать("C:\тест.txt");
 Тд.Показать();
---
А попробовать так?

```1c
    Блокнот = новый ЧтениеТекста("c:\test.txt");
    Пакет = новый ПакетОтображаемыхДокументов;
    Пакет.КоличествоЭкземпляров = 1;
    Состав1 = Пакет.Состав.Добавить();
    Состав1.Данные = Блокнот.Прочитать();
    пакет.Напечатать(РежимИспользованияДиалогаПечати.НеИспользовать);
```

ай блин - это только с ТабДоками будет работать(((
---
(1) Печать текстовых документов встречал только в Чеках, но там через драйвер кассы или принтера чеков. В (2) сказали, как это сделать. Это не долго. Макет с 1 областью, с 1 ячейкой на всю страницу и 1 параметром, в который устанавливается текст из файла.
---
ТекстДок.Показать();
---
ведь есть же с word фишка:

```1c
    ОбъектВорд = Новый COMОбъект("Word.Application");
    ОбъектВорд.Documents.add(ИмяФайла);
    ДокументВорд = ОбъектВорд.Application.Documents(1);
    ДокументВорд.Activate();
    ДокументВорд.PrintOut()
```

неужели с блокнотом такого нет?
---
у блокнота нет ком-интерфейса.
Но есть /P - ключ командной строки
---
```1c
    КомандаСистемы(("notepad /p C:\тест.txt")
```
---
Было. Но зачем упираться в винду, если можно сделать кросс-платформенно и без внешних зависимостей?
---
А проанализировать тип ОС и выдать команду для нее тоже не кроссплатформенно? Гораздо интереснее заниматься BDSM на страницу кода.
---
За избавление от внешних зависимостей я готов платить и больше, чем лишним десятком строк кода.
---
Кроме как через табличный документ никаких идей не приходит (если без внешних скриптов).
---
Установить у первой ячейки табличного документа подходящую ширину, признаки переноса и т.п, присвоить ячейке весь текст табличного документа и напечатать :)
---
Нужна печать слипчека с банковского терминала?
У него штатная ширина 32 или 48 символов
Делал такое для китайского принтера чеков

```1c
    ТекстовыйФайл = Новый ТекстовыйДокумент;
    ТекстовыйФайл.Прочитать(СлипЧек, КодировкаТекста.ANSI, Символы.ПС);
    ТабДок = Новый ТабличныйДокумент;
    Макет = ПолучитьМакет("СлипЧек");
    облСтрока = Макет.ПолучитьОбласть("Строка");
    Для Номер = 1 По ТекстовыйФайл.КоличествоСтрок() Цикл
    Строка=ТекстовыйФайл.ПолучитьСтроку(Номер);
    облСтрока.Параметры.Строка=Строка;
    ТабДок.Вывести(облСтрока);
    КонецЦикла;

    УстановитьПараметрыТабличногоДокумента(ТабДок);

    Если ЗначениеЗаполнено(Принтер) Тогда
    ТабДок.Напечатать();
    // Sleep(3); // До 14.09 было активно МНФ
    Иначе
    ТабДок.Показать();
    КонецЕсли;

    Процедура УстановитьПараметрыТабличногоДокумента(ТабДок)
    ТабДок.ИмяПринтера=Принтер;
    ТабДок.ПолеСлева=0;
    ТабДок.ПолеСправа=0;
    ТабДок.ПолеСверху=0;
    ТабДок.ПолеСнизу=0;
    ТабДок.РазмерКолонтитулаСверху=0;
    ТабДок.РазмерКолонтитулаСнизу=0;
    ТабДок.ВерхнийКолонтитул.Выводить=Ложь;
    ТабДок.НижнийКолонтитул.Выводить=Ложь;
    ТабДок.АвтоМасштаб=Истина;
    КонецПроцедуры
```
---
Это как?
---
В смысле "как"? Как два пальца, если вообще с табличными документами работал.
---
автоматом
---
Сделал так:
 Файл = Новый ЧтениеТекста("C:\тест.txt",КодировкаТекста.OEM);
 Файл.Закрыть();
 ФайлЭкваринга = Новый ТекстовыйДокумент;
 ФайлЭкваринга.Прочитать("C:\тест.txt",КодировкаТекста.OEM);
 ФайлЭкваринга.Показать();
Выводит, все хорошо, теперь как сделать что бы автоматически печатался?
Метода у текстового документа ".Напечатать" нет.
---
командаСистемы("copy c:\test.txt prn:")
---
Есть что нибудь попроще? что бы к системе не обращаться?
---
что нибудь попроще? что бы к системе не обращаться? Предложу свой вариант, который хоть и затрагивает систему, зато содержит минимум кода. При этом обеспечивает гибкость в настройках печати без дальнейшей модификации 1С.

А именно: установить в системе утилиту печати текстовых файлов на любом Win-принтере, лучшая из известных мне - бесплатная SPrint.

Тогда задача сводится к копированию распечатываемого файла в файл с именем, которое отслеживается этой утилитой.

Для этого в 1С достаточно всего одной команды КопироватьФайл(), даже не читая его. Ну, или можно прочитать и тут же записать прочитанный текст в файл с именем, заданным в настройках Sprint. А утилита его подхватит и распечатает.
---
через таб документ, как выше уже сказали, но чем париться с автоустановкой ширины и подобного, взять создать таб документ, в первой ячейке напечатать текст образец. сохранить. затем как угодно десериализовать полученный mxl (можно тупо прочитать его как текстовый документ), найти текст образец и зашаблонизировать его
---
чего-то туплю, проще даже просто запараметризировать первую ячейку и в параметр выводить, что вообще проще простого
---
примерный говнокод

```1c
    Макет = ПолучитьМакет("Макет");
    ТабДок = Новый ТабличныйДокумент;
    Текст = Новый ЧтениеТекста(ИмяФайла);
    Стр = Текст.ПрочитатьСтроку();
    ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
    ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
    ТабДок.Присоединить(ОбластьМакета);
    Пока Стр <> Неопределено Цикл
    ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
    ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
    ТабДок.Присоединить(ОбластьМакета);
    Стр = Текст.ПрочитатьСтроку();
    КонецЦикла;
    ТабДок.Показать();
```
---
Все хорошо, только что бы отображался текст правильно, нужен шрифт "Terminal 10"
В макете делаю Шрифт параметра Terminal 10 а Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.OEM); выходит кракозябра, а на вывод ТабДок выводит нормально, на принтере и предварительном просмотре кракозябра, если КодировкаТекста.OEM убираю, то он шрифт меняет, и выводит на русском.
---
Шрифт "Terminal" - это кодировка ANSI. А стандартные строки 1С - это UTF.
Для корректной печати шрифтом "Terminal" придется смириться с отображением в кракозяблах стандартными шрифтами.
---
С настройкой ширины колонки оказалось менее тривиально, чем я думал

```1c
    &НаКлиенте
    Процедура Команда1(Команда)

    РаспечататьТекст("Однажды в студеную зимнюю пору, я из лесу вышел; был сильный мороз. Гляжу - поднимается медленно в году лошадка, везущая хворосту воз.
    |И шествуя важно, в спокойствии чинном, лошадку ведет под узцы мужичок. В больших сапогах, в полушубке овчинном, в больших руковицах... А сам - с ноготок!",
    Новый Шрифт("Verdana", 20, , Истина));

    КонецПроцедуры

    &НаКлиенте
    Процедура РаспечататьТекст(Текст, Шрифт = Неопределено);

    ТабДок = Новый ТабличныйДокумент;
    ОбластьПечати = ТабДок.Область(1,1,1,1);
    ОбластьПечати.Текст = Текст;
    Если Шрифт <> Неопределено Тогда
    ОбластьПечати.Шрифт = Шрифт;
    КонецЕсли;
    ОбластьПечати.ШиринаКолонки = (ТабДок.ШиринаСтраницы - 5) / 2; // эмперически под стандартный размер полей
    ОбластьПечати.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
    ТабДок.Напечатать();

    КонецПроцедуры
```
---
еще более не тривиально будет попадание на ограничение размера строки в ячейки. Если текст будет большой.
---
А какое там ограничение? Хотя соглашусь, что войну и мир так вряд ли распечатаешь :)
ЗЫ. Ок. Думаю, спасет несложная модификация по ячейке на строку.
---
вот точных данных не знаю, но уже сталкивался с тем, что в ячейке нельзя большой текст занести.
В акте нужно было подробно расписать выполненные работы. Был неприятно удивлен. И текста там было не так уж и много. Все на 1 лист укладывалось.
---
вот из ограничений Excel: "Общее количество знаков в ячейке - 32 767 знаков".
Думаю в 1С аналогично, или похоже.
---
ЗЫ. Ок. Думаю, спасет несложная модификация по ячейке на строку.
Это если в txt есть эти строки, а не весь текст одной строкой на несколько мб.
---
Это если в txt есть эти строки, а не весь текст одной строкой на несколько мб.
В таких условиях можно и в ограничения размера строки 1С упереться. Пусть буферизацию пишет тот, кому это реально надо :)
---
КодировкаТекста.ANSI тоже происходит что и с КодировкаТекста.OEM
---
Вариант для не слишком больших текстов с не слишком большими строками :)

```1c
    &НаКлиенте
    Процедура РаспечататьТекст(Текст, Шрифт = Неопределено);

    ТабДок = Новый ТабличныйДокумент;
    ШиринаКолонки = (ТабДок.ШиринаСтраницы - 5) / 2; // эмперически под стандартный размер полей
    Для НомерСтроки = 1 По СтрЧислоСтрок(Текст) Цикл
    ОбластьПечати = ТабДок.Область(НомерСтроки, 1);
    ОбластьПечати.Текст = СтрПолучитьСтроку(Текст, НомерСтроки);
    Если Шрифт <> Неопределено Тогда
    ОбластьПечати.Шрифт = Шрифт;
    КонецЕсли;
    ОбластьПечати.ШиринаКолонки = ШиринаКолонки;
    ОбластьПечати.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
    КонецЦикла;
    ТабДок.Напечатать();

    КонецПроцедуры
```
---
получается никак не распечатать шрифт terminal?
---
По-идее, если будешь читать текст ANSI как UTF-8 а не как ANSI, тогда он прочитается в строку 1С без преобразований и тогда ты сможешь его корректно отобразить шрифтом Terminal, хотя в строке 1С он будет крокозяблами. Но зуб не дам :)
---
а почему именно terminal, есть и другие моноширинные шрифты Courjer new или Lucida Console
---
Хотя непонятно. Вроде если ложишь в ячейку нормальный UTF, то дальше табличный документ корректно отрабатывает хоть Terminal, хоть не Terminal...
---
Я подобное решал проще. Конвертировал в pdf и потом уже печать.
---
Добавлю увиденный пример печати в txt-файл. Этикетка сразу же идёт на печать термопринтера.

```1c
    Шаблон = "CODEPAGE 1251
    |DIRECTION 1
    |CLS
    |TEXT 120,8,"3",0,1,1,2,"АРТИКУЛ ARTICLE"
    |BARCODE 120,64,"EAN13",60,2,0,2,2,2,"2000000021485"
    |PRINT 1,3
    |END
    |";
    ТекстНаПринтер = Новый ЗаписьТекста("comp1\tsc"+"\Этикетка30х20.txt", КодировкаТекста.ANSI);
    ТекстНаПринтер.Записать(Шаблон);
```