Распечатать текстовый документ(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 498 19.02.18 15:47 Сейчас в теме
(37) Было. Но зачем упираться в винду, если можно сделать кросс-платформенно и без внешних зависимостей?
39. sssss_aaaaa_2011 19.02.18 17:01 Сейчас в теме
(38)А проанализировать тип ОС и выдать команду для нее тоже не кроссплатформенно? Гораздо интереснее заниматься BDSM на страницу кода.
40. herfis 498 19.02.18 18:37 Сейчас в теме
(39) За избавление от внешних зависимостей я готов платить и больше, чем лишним десятком строк кода.
2. herfis 498 22.01.18 15:59 Сейчас в теме
Кроме как через табличный документ никаких идей не приходит (если без внешних скриптов).
3. herfis 498 22.01.18 16:01 Сейчас в теме
Установить у первой ячейки табличного документа подходящую ширину, признаки переноса и т.п, присвоить ячейке весь текст табличного документа и напечатать :)
33. independ 1518 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 498 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 498 23.01.18 16:54 Сейчас в теме
(19) Шрифт "Terminal" - это кодировка ANSI. А стандартные строки 1С - это UTF.
Для корректной печати шрифтом "Terminal" придется смириться с отображением в кракозяблах стандартными шрифтами.
18. herfis 498 23.01.18 12:15 Сейчас в теме
С настройкой ширины колонки оказалось менее тривиально, чем я думал

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

&НаКлиенте
Процедура РаспечататьТекст(Текст, Шрифт = Неопределено);
	
	ТабДок = Новый ТабличныйДокумент;
	ОбластьПечати = ТабДок.Область(1,1,1,1);
	ОбластьПечати.Текст = Текст;
	Если Шрифт <> Неопределено Тогда
		ОбластьПечати.Шрифт = Шрифт;
	КонецЕсли;
	ОбластьПечати.ШиринаКолонки = (ТабДок.ШиринаСтраницы - 5) / 2; // эмперически под стандартный размер полей
	ОбластьПечати.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
	ТабДок.Напечатать();
	
КонецПроцедуры
Показать
22. spacecraft 23.01.18 16:57 Сейчас в теме
(18) еще более не тривиально будет попадание на ограничение размера строки в ячейки. Если текст будет большой.
23. herfis 498 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 498 23.01.18 17:14 Сейчас в теме
(26)
Это если в txt есть эти строки, а не весь текст одной строкой на несколько мб.

В таких условиях можно и в ограничения размера строки 1С упереться. Пусть буферизацию пишет тот, кому это реально надо :)
20. BARDER 37 23.01.18 16:47 Сейчас в теме
КодировкаТекста.ANSI тоже происходит что и с КодировкаТекста.OEM
28. herfis 498 23.01.18 17:39 Сейчас в теме
Вариант для не слишком больших текстов с не слишком большими строками :)
&НаКлиенте
Процедура РаспечататьТекст(Текст, Шрифт = Неопределено);
	
	ТабДок = Новый ТабличныйДокумент;
	ШиринаКолонки = (ТабДок.ШиринаСтраницы - 5) / 2; // эмперически под стандартный размер полей
	Для НомерСтроки = 1 По СтрЧислоСтрок(Текст) Цикл
		ОбластьПечати = ТабДок.Область(НомерСтроки, 1);
		ОбластьПечати.Текст = СтрПолучитьСтроку(Текст, НомерСтроки);
		Если Шрифт <> Неопределено Тогда
			ОбластьПечати.Шрифт = Шрифт;
		КонецЕсли;
		ОбластьПечати.ШиринаКолонки = ШиринаКолонки;
		ОбластьПечати.РазмещениеТекста = ТипРазмещенияТекстаТабличногоДокумента.Переносить;
	КонецЦикла;
	ТабДок.Напечатать();
	
КонецПроцедуры
Показать
29. BARDER 37 23.01.18 17:43 Сейчас в теме
получается никак не распечатать шрифт terminal?
30. herfis 498 23.01.18 18:26 Сейчас в теме
(29) По-идее, если будешь читать текст ANSI как UTF-8 а не как ANSI, тогда он прочитается в строку 1С без преобразований и тогда ты сможешь его корректно отобразить шрифтом Terminal, хотя в строке 1С он будет крокозяблами. Но зуб не дам :)
32. independ 1518 23.01.18 21:07 Сейчас в теме +0.3 $m
(29) а почему именно terminal, есть и другие моноширинные шрифты Courjer new или Lucida Console
31. herfis 498 23.01.18 18:44 Сейчас в теме
Хотя непонятно. Вроде если ложишь в ячейку нормальный UTF, то дальше табличный документ корректно отрабатывает хоть Terminal, хоть не Terminal...
36. dinopopyys 151 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);
ТекстНаПринтер.Записать(Шаблон);
Показать
Оставьте свое сообщение
Вакансии
Руководитель направления 1С
Москва
зарплата от 350 000 руб.
Полный день

1С Программист
Москва
зарплата от 180 000 руб.
Полный день

Программист 1С
Москва
зарплата от 180 000 руб. до 220 000 руб.
Полный день

Аналитик 1С / Бизнес-аналитик
Нижний Новгород
зарплата от 100 000 руб. до 250 000 руб.
Временный (на проект)

Программист 1С
Москва
зарплата от 250 000 руб.
Полный день