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

1. BARDER 37 22.01.18 15:48 Сейчас в теме
Доброго времени суток.

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


Файл = Новый ЧтениеТекста("C:\тест.txt",КодировкаТекста.OEM);
Файл.Прочитать();
По теме из базы знаний
Вознаграждение за ответ
Показать полностью
Найденные решения
13. cool.vlad4 2 22.01.18 18:13 Сейчас в теме +0.32 $m
примерный говнокод
Макет = ПолучитьМакет("Макет");
	ТабДок = Новый ТабличныйДокумент;
	Текст = Новый ЧтениеТекста(ИмяФайла);
	Стр = Текст.ПрочитатьСтроку();
	ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
	ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
	ТабДок.Присоединить(ОбластьМакета);
	Пока Стр <> Неопределено Цикл
		ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
		ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
		ТабДок.Присоединить(ОбластьМакета);
		Стр = Текст.ПрочитатьСтроку();
	КонецЦикла; 
	ТабДок.Показать();
Показать
Прикрепленные файлы:
ПечатьТекста.epf
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
5. dandykry 10 22.01.18 16:20 Сейчас в теме
(1)
Нужно его автоматически распечатать или только показать?

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


ай блин - это только с ТабДоками будет работать(((
16. dandykry 10 23.01.18 07:53 Сейчас в теме
(10) (1) Печать текстовых документов встречал только в Чеках, но там через драйвер кассы или принтера чеков. В (2) сказали, как это сделать. Это не долго. Макет с 1 областью, с 1 ячейкой на всю страницу и 1 параметром, в который устанавливается текст из файла.
15. UtSpar 134 23.01.18 06:53 Сейчас в теме
34. BARDER 37 24.01.18 09:24 Сейчас в теме
ведь есть же с word фишка:
ОбъектВорд = Новый COMОбъект("Word.Application");
ОбъектВорд.Documents.add(ИмяФайла);
ДокументВорд = ОбъектВорд.Application.Documents(1);
ДокументВорд.Activate();
ДокументВорд.PrintOut()

неужели с блокнотом такого нет?
35. DenisCh 24.01.18 09:27 Сейчас в теме
(34) у блокнота нет ком-интерфейса.
Но есть /P - ключ командной строки
37. sssss_aaaaa_2011 19.02.18 15:39 Сейчас в теме
(1)
КомандаСистемы(("notepad /p C:\тест.txt")
adhocprog; +1 Ответить
38. herfis 499 19.02.18 15:47 Сейчас в теме
(37) Было. Но зачем упираться в винду, если можно сделать кросс-платформенно и без внешних зависимостей?
39. sssss_aaaaa_2011 19.02.18 17:01 Сейчас в теме
(38)А проанализировать тип ОС и выдать команду для нее тоже не кроссплатформенно? Гораздо интереснее заниматься BDSM на страницу кода.
40. herfis 499 19.02.18 18:37 Сейчас в теме
(39) За избавление от внешних зависимостей я готов платить и больше, чем лишним десятком строк кода.
2. herfis 499 22.01.18 15:59 Сейчас в теме
Кроме как через табличный документ никаких идей не приходит (если без внешних скриптов).
3. herfis 499 22.01.18 16:01 Сейчас в теме
Установить у первой ячейки табличного документа подходящую ширину, признаки переноса и т.п, присвоить ячейке весь текст табличного документа и напечатать :)
33. independ 1520 23.01.18 21:45 Сейчас в теме
Нужна печать слипчека с банковского терминала?
У него штатная ширина 32 или 48 символов
Делал такое для китайского принтера чеков
ТекстовыйФайл = Новый ТекстовыйДокумент;
	ТекстовыйФайл.Прочитать(СлипЧек, КодировкаТекста.ANSI, Символы.ПС);
	ТабДок = Новый ТабличныйДокумент;
	Макет = ПолучитьМакет("СлипЧек");
	облСтрока = Макет.ПолучитьОбласть("Строка");
	Для Номер = 1 По ТекстовыйФайл.КоличествоСтрок() Цикл
		Строка=ТекстовыйФайл.ПолучитьСтроку(Номер);
		облСтрока.Параметры.Строка=Строка;
		ТабДок.Вывести(облСтрока);
	КонецЦикла;
	
	УстановитьПараметрыТабличногоДокумента(ТабДок);	
	
	Если ЗначениеЗаполнено(Принтер) Тогда
		ТабДок.Напечатать();
//		Sleep(3); // До 14.09 было активно МНФ
	Иначе
		ТабДок.Показать();
	КонецЕсли;	

Процедура УстановитьПараметрыТабличногоДокумента(ТабДок)
	ТабДок.ИмяПринтера=Принтер;
	ТабДок.ПолеСлева=0;
	ТабДок.ПолеСправа=0;
	ТабДок.ПолеСверху=0;
	ТабДок.ПолеСнизу=0;
	ТабДок.РазмерКолонтитулаСверху=0;
	ТабДок.РазмерКолонтитулаСнизу=0;
	ТабДок.ВерхнийКолонтитул.Выводить=Ложь;
	ТабДок.НижнийКолонтитул.Выводить=Ложь;
	ТабДок.АвтоМасштаб=Истина;
КонецПроцедуры
Показать
Прикрепленные файлы:
4. BARDER 37 22.01.18 16:19 Сейчас в теме
17. herfis 499 23.01.18 11:07 Сейчас в теме
(4) В смысле "как"? Как два пальца, если вообще с табличными документами работал.
6. BARDER 37 22.01.18 16:22 Сейчас в теме
7. BARDER 37 22.01.18 16:51 Сейчас в теме
Сделал так:
Файл = Новый ЧтениеТекста("C:\тест.txt",КодировкаТекста.OEM);
Файл.Закрыть();
ФайлЭкваринга = Новый ТекстовыйДокумент;
ФайлЭкваринга.Прочитать("C:\тест.txt",КодировкаТекста.OEM);
ФайлЭкваринга.Показать();

Выводит, все хорошо, теперь как сделать что бы автоматически печатался?
Метода у текстового документа ".Напечатать" нет.
8. DenisCh 22.01.18 16:55 Сейчас в теме
командаСистемы("copy c:\test.txt prn:")
adhocprog; +1 Ответить
9. BARDER 37 22.01.18 16:59 Сейчас в теме
Есть что нибудь попроще? что бы к системе не обращаться?
14. user856012 13 22.01.18 23:57 Сейчас в теме
(9)
что нибудь попроще? что бы к системе не обращаться?
Предложу свой вариант, который хоть и затрагивает систему, зато содержит минимум кода. При этом обеспечивает гибкость в настройках печати без дальнейшей модификации 1С.

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

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

Для этого в 1С достаточно всего одной команды КопироватьФайл(), даже не читая его. Ну, или можно прочитать и тут же записать прочитанный текст в файл с именем, заданным в настройках Sprint. А утилита его подхватит и распечатает.
11. cool.vlad4 2 22.01.18 18:00 Сейчас в теме
через таб документ, как выше уже сказали, но чем париться с автоустановкой ширины и подобного, взять создать таб документ, в первой ячейке напечатать текст образец. сохранить. затем как угодно десериализовать полученный mxl (можно тупо прочитать его как текстовый документ), найти текст образец и зашаблонизировать его
12. cool.vlad4 2 22.01.18 18:02 Сейчас в теме
(11) чего-то туплю, проще даже просто запараметризировать первую ячейку и в параметр выводить, что вообще проще простого
13. cool.vlad4 2 22.01.18 18:13 Сейчас в теме +0.32 $m
примерный говнокод
Макет = ПолучитьМакет("Макет");
	ТабДок = Новый ТабличныйДокумент;
	Текст = Новый ЧтениеТекста(ИмяФайла);
	Стр = Текст.ПрочитатьСтроку();
	ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
	ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
	ТабДок.Присоединить(ОбластьМакета);
	Пока Стр <> Неопределено Цикл
		ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
		ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
		ТабДок.Присоединить(ОбластьМакета);
		Стр = Текст.ПрочитатьСтроку();
	КонецЦикла; 
	ТабДок.Показать();
Показать
Прикрепленные файлы:
ПечатьТекста.epf
19. BARDER 37 23.01.18 16:37 Сейчас в теме
(13)
Макет = ПолучитьМакет("Макет");
ТабДок = Новый ТабличныйДокумент;
Текст = Новый ЧтениеТекста(ИмяФайла);
Стр = Текст.ПрочитатьСтроку();
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
ТабДок.Присоединить(ОбластьМакета);
Пока Стр <> Неопределено Цикл
ОбластьМакета = Макет.ПолучитьОбласть("СтрокаТекста");
ОбластьМакета.Параметры.Заполнить(Новый Структура("ЗначениеСтроки", Стр));
ТабДок.Присоединить(ОбластьМакета);
Стр = Текст.ПрочитатьСтроку();
КонецЦикла;
ТабДок.Показать();
Показать

Все хорошо, только что бы отображался текст правильно, нужен шрифт "Terminal 10"
В макете делаю Шрифт параметра Terminal 10 а Текст = Новый ЧтениеТекста(ИмяФайла, КодировкаТекста.OEM); выходит кракозябра, а на вывод ТабДок выводит нормально, на принтере и предварительном просмотре кракозябра, если КодировкаТекста.OEM убираю, то он шрифт меняет, и выводит на русском.
21. herfis 499 23.01.18 16:54 Сейчас в теме
(19) Шрифт "Terminal" - это кодировка ANSI. А стандартные строки 1С - это UTF.
Для корректной печати шрифтом "Terminal" придется смириться с отображением в кракозяблах стандартными шрифтами.
18. herfis 499 23.01.18 12:15 Сейчас в теме
С настройкой ширины колонки оказалось менее тривиально, чем я думал

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

&НаКлиенте
Процедура РаспечататьТекст(Текст, Шрифт = Неопределено);
	
	ТабДок = Новый ТабличныйДокумент;
	ОбластьПечати = ТабДок.Область(1,1,1,1);
	ОбластьПечати.Текст = Текст;
	Если Шрифт <> Неопределено Тогда
		ОбластьПечати.Шрифт = Шрифт;
	КонецЕсли;
	ОбластьПечати.ШиринаКолонки = (ТабДок.ШиринаСтраницы - 5) / 2; // эмперически под стандартный размер полей
	ОбластьПечати.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
	ТабДок.Напечатать();
	
КонецПроцедуры
Показать
22. spacecraft 23.01.18 16:57 Сейчас в теме
(18) еще более не тривиально будет попадание на ограничение размера строки в ячейки. Если текст будет большой.
23. herfis 499 23.01.18 16:58 Сейчас в теме
(22) А какое там ограничение? Хотя соглашусь, что войну и мир так вряд ли распечатаешь :)
ЗЫ. Ок. Думаю, спасет несложная модификация по ячейке на строку.
24. spacecraft 23.01.18 17:01 Сейчас в теме
(23) вот точных данных не знаю, но уже сталкивался с тем, что в ячейке нельзя большой текст занести.
В акте нужно было подробно расписать выполненные работы. Был неприятно удивлен. И текста там было не так уж и много. Все на 1 лист укладывалось.
25. spacecraft 23.01.18 17:08 Сейчас в теме
(23) вот из ограничений Excel: "Общее количество знаков в ячейке - 32 767 знаков".
Думаю в 1С аналогично, или похоже.
26. spacecraft 23.01.18 17:10 Сейчас в теме
(23)
ЗЫ. Ок. Думаю, спасет несложная модификация по ячейке на строку.

Это если в txt есть эти строки, а не весь текст одной строкой на несколько мб.
27. herfis 499 23.01.18 17:14 Сейчас в теме
(26)
Это если в txt есть эти строки, а не весь текст одной строкой на несколько мб.

В таких условиях можно и в ограничения размера строки 1С упереться. Пусть буферизацию пишет тот, кому это реально надо :)
20. BARDER 37 23.01.18 16:47 Сейчас в теме
КодировкаТекста.ANSI тоже происходит что и с КодировкаТекста.OEM
28. herfis 499 23.01.18 17:39 Сейчас в теме
Вариант для не слишком больших текстов с не слишком большими строками :)
&НаКлиенте
Процедура РаспечататьТекст(Текст, Шрифт = Неопределено);
	
	ТабДок = Новый ТабличныйДокумент;
	ШиринаКолонки = (ТабДок.ШиринаСтраницы - 5) / 2; // эмперически под стандартный размер полей
	Для НомерСтроки = 1 По СтрЧислоСтрок(Текст) Цикл
		ОбластьПечати = ТабДок.Область(НомерСтроки, 1);
		ОбластьПечати.Текст = СтрПолучитьСтроку(Текст, НомерСтроки);
		Если Шрифт <> Неопределено Тогда
			ОбластьПечати.Шрифт = Шрифт;
		КонецЕсли;
		ОбластьПечати.ШиринаКолонки = ШиринаКолонки;
		ОбластьПечати.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
	КонецЦикла;
	ТабДок.Напечатать();
	
КонецПроцедуры
Показать
29. BARDER 37 23.01.18 17:43 Сейчас в теме
получается никак не распечатать шрифт terminal?
30. herfis 499 23.01.18 18:26 Сейчас в теме
(29) По-идее, если будешь читать текст ANSI как UTF-8 а не как ANSI, тогда он прочитается в строку 1С без преобразований и тогда ты сможешь его корректно отобразить шрифтом Terminal, хотя в строке 1С он будет крокозяблами. Но зуб не дам :)
32. independ 1520 23.01.18 21:07 Сейчас в теме +0.3 $m
(29) а почему именно terminal, есть и другие моноширинные шрифты Courjer new или Lucida Console
31. herfis 499 23.01.18 18:44 Сейчас в теме
Хотя непонятно. Вроде если ложишь в ячейку нормальный UTF, то дальше табличный документ корректно отрабатывает хоть Terminal, хоть не Terminal...
36. KHoroshulinAV 171 19.02.18 15:31 Сейчас в теме
Я подобное решал проще. Конвертировал в pdf и потом уже печать.
41. Азверин 3 10.12.21 16:16 Сейчас в теме
Добавлю увиденный пример печати в txt-файл. Этикетка сразу же идёт на печать термопринтера.

	Шаблон = "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);
ТекстНаПринтер.Записать(Шаблон);
Показать
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот