Создание внешней печатной формы без формирования табличного документа

1. rougudz 09.04.19 13:43 Сейчас в теме
Пытаюсь создать внешнюю печатную форму, на стандартных механизмах, но без формирования табличного документа, т.е. мне необходимо вывести некий шаблон в формате word сохраненный в макете обработки.
все в принципе отрабатывает, т.е. файл word формируется и открывается, но выходит сообщение:
{ОбщийМодуль.УправлениеПечатью.Модуль(1522)}: В обработчике печати не был сформирован табличный документ для: ПриемДМО
ВызватьИсключение(ТекстСообщенияОбОшибке);
ошибка выходит в Процедуре ПечатьПоВнешнемуИсточнику

если передать в модуле документа обработки в процедуру Печать() некий табличный документ, допустим пустой то он выводится дополнительно, а это какбы не нужно, хотя ошибкатоже не красиво.

никто не пытался сделать подобное.
немогу придумать как сие можно подобороть....
По теме из базы знаний
Найденные решения
4. insurgut 208 09.04.19 13:54 Сейчас в теме
В сведениях о внешней обработке:
НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
НоваяКоманда.Модификатор = "Печать";


Создаете форму, и печать из нее уже программируете. Пример модуля процедуры Печать в самой форме:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
	
	Объект.СсылкаНаОбъект = ОбъектыНазначения[0];
	
	ДанныеДляЗаполнения = ПолучитьДанныеДляЗаполнения(Объект.СсылкаНаОбъект);
	МакетФайл = ПолучитьМакет("Макет");
	ИмяФ = ПолучитьИмяВременногоФайла("docx");
	МакетФайл.Записать(ИмяФ);	
	MSWord = Новый COMОбъект("Word.Application");
	Doc = MSWord.Documents.ADD(ИмяФ);
	
	Попытка
		
		Для каждого СтрСтруктуры Из ДанныеДляЗаполнения Цикл
			
			СтрокаПоиска = "{" + СтрСтруктуры.Ключ + "}";
			
			Replace = Doc.Content.Find;
			
			FindText = СтрокаПоиска;     // что искать - имя_шаблона
			MatchCase = Ложь;                 // использовать регулярные выражения        
			MatchWholeWord = Истина;          // искать слово целиком
			MatchWildcards = Ложь;            // испоьзовать регулярные выражения 
			MatchSoundsLike = Неопределено;   // искать созвучные 
			MatchAllWordForms = Неопределено; // искать все формы слова
			Forward = Истина;                 // искать вперед
			Wrap = Неопределено;              // что должен вернуть Find-объект 
			Format_ = Ложь;                   // использовать форматирование
			ReplaceWith = СтрСтруктуры.Значение;              // текст, на который надо заменить имя_шаблона
			
			Попытка
				Replace.Execute(
				FindText, 
				MatchCase, 
				MatchWholeWord, 
				MatchWildcards, 
				MatchSoundsLike, 
				MatchAllWordForms, 
				Forward,
				Wrap,
				Format_,
				ReplaceWith, 2);
			Исключение
				Сообщить("Ошибка при замене: " + СтрокаПоиска + " на " + СтрСтруктуры.Значение);
			КонецПопытки;
			
		КонецЦикла;
		
		ТаблицаВорд = MSWord.ActiveDocument.Tables(3);
		
		ЗаполнитьТаблицуДокумента(Объект.СсылкаНаОбъект);
		
		Если НЕ Объект.ЕстьСкидка Тогда
			ТаблицаВорд.Columns.Item(6).Delete();
			ТаблицаВорд.Columns.Item(5).Delete();
			ТаблицаВорд.Columns.Item(2).Width = 300;
		КонецЕсли;
		
		Строка = 2;
		Для каждого СтрТовары Из Объект.ТаблицаДокумента Цикл
			
			ТаблицаВорд.Rows.Add();
			
			КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 1).Range;
			КолонкаТаблицы.Text = СтрТовары.НомСтр;
			
			КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 2).Range;
			КолонкаТаблицы.Text = СтрТовары.Номенклатура;
			
			КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 3).Range;
			КолонкаТаблицы.Text = СтрТовары.Количество;
			
			КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 4).Range;
			КолонкаТаблицы.Text = СтрТовары.Сумма;
			
			Если Объект.ЕстьСкидка Тогда
			
				КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 5).Range;
				КолонкаТаблицы.Text = СтрТовары.СуммаСкидки;
				
				КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 6).Range;
				КолонкаТаблицы.Text = СтрТовары.Итого;
				
				КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 7).Range;
				КолонкаТаблицы.Text = СтрТовары.ДатаКон;
				
			Иначе
				
				КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 5).Range;
				КолонкаТаблицы.Text = СтрТовары.ДатаКон;
				
			КонецЕсли;
			
			Строка = Строка + 1;
			
		КонецЦикла;
		
		// Вывод документа
		MSWord.Application.Visible = 1;
		MSWord.Activate();
		
		//+чтобы документ Word открылся перед лицом пользователя, нужен такой лайфхак
		MSWord.Application.WindowState = 2; //сворачиваем
		MSWord.Application.WindowState = 1; //разворачиваем
		
	Исключение
		Сообщить(ОписаниеОшибки());
		MSWord.Application.Quit();
	КонецПопытки; 
	
КонецПроцедуры // Печать()

&НаСервере
Функция ПолучитьМакет(ИмяМакета)
	
	Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
	
КонецФункции
Показать


P.S. Для приведенного примера тип макета - двоичные данные.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Octopus 338 09.04.19 13:46 Сейчас в теме
Если нужно вывести в Word, то я бы сделал через открытие формы.

В форме в таком случае доступен контекст вызова печатной формы:
	ИдентификаторКоманды = Параметры.ИдентификаторКоманды;
	ДополнительнаяОбработкаСсылка = Параметры.ДополнительнаяОбработкаСсылка;
	ОбъектыНазначения.ЗагрузитьЗначения(Параметры.ОбъектыНазначения);

В отладчике можно глянуть, чего еще в нее передается, там достаточно широкий набор данных
3. rougudz 09.04.19 13:51 Сейчас в теме
5. rougudz 09.04.19 13:56 Сейчас в теме
(2)
В отладчике можно глянуть, чего еще в нее передается, там достаточно широкий набор данных

тут совсем не понятно

(4)
Создаете форму, и печать из нее уже программируете

а так попробую спасибо!
6. Octopus 338 09.04.19 14:02 Сейчас в теме
(5) Я привел пример процедуры ПриСозданииНаСервере(), в которой можно определить имя команды, ссылку на саму обработку как справочник, а также массив объектов печати. Помимо них есть и другие поля, состав навскидку не помню. В отладчике можно глянуть, чего система передает параметрами перед открытием формы.

Приложил пример печатной формы для БП 3.0, где две команды рисуют табличный документ (общепринятое поведение), а другие две - открывают формы и шаманят там.
Прикрепленные файлы:
БП_АктСписания.epf
7. insurgut 208 09.04.19 14:05 Сейчас в теме
(6) у автора сложность именно с макетом MS Word насколько я понял
8. Octopus 338 09.04.19 14:08 Сейчас в теме
(7) А я понял так, что мешает штатная обработка табличного документа. Если он пустой, выдается окно ошибки, если нет - выводится табличный документ. А ни того, ни другого автору не требуется, нужно именно блокировать вывод
9. rougudz 09.04.19 14:12 Сейчас в теме
(8)
А я понял так, что мешает штатная обработка табличного документа. Если он пустой, выдается окно ошибки, если нет - выводится табличный документ. А ни того, ни другого автору не требуется, нужно именно блокировать вывод

да и именно так, спасибо.

вроде получается все по "Создаете форму, и печать из нее уже программируете"....
сейчас пробую...
4. insurgut 208 09.04.19 13:54 Сейчас в теме
В сведениях о внешней обработке:
НоваяКоманда.Использование = "ВызовКлиентскогоМетода";
НоваяКоманда.Модификатор = "Печать";


Создаете форму, и печать из нее уже программируете. Пример модуля процедуры Печать в самой форме:
&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначения) Экспорт
	
	Объект.СсылкаНаОбъект = ОбъектыНазначения[0];
	
	ДанныеДляЗаполнения = ПолучитьДанныеДляЗаполнения(Объект.СсылкаНаОбъект);
	МакетФайл = ПолучитьМакет("Макет");
	ИмяФ = ПолучитьИмяВременногоФайла("docx");
	МакетФайл.Записать(ИмяФ);	
	MSWord = Новый COMОбъект("Word.Application");
	Doc = MSWord.Documents.ADD(ИмяФ);
	
	Попытка
		
		Для каждого СтрСтруктуры Из ДанныеДляЗаполнения Цикл
			
			СтрокаПоиска = "{" + СтрСтруктуры.Ключ + "}";
			
			Replace = Doc.Content.Find;
			
			FindText = СтрокаПоиска;     // что искать - имя_шаблона
			MatchCase = Ложь;                 // использовать регулярные выражения        
			MatchWholeWord = Истина;          // искать слово целиком
			MatchWildcards = Ложь;            // испоьзовать регулярные выражения 
			MatchSoundsLike = Неопределено;   // искать созвучные 
			MatchAllWordForms = Неопределено; // искать все формы слова
			Forward = Истина;                 // искать вперед
			Wrap = Неопределено;              // что должен вернуть Find-объект 
			Format_ = Ложь;                   // использовать форматирование
			ReplaceWith = СтрСтруктуры.Значение;              // текст, на который надо заменить имя_шаблона
			
			Попытка
				Replace.Execute(
				FindText, 
				MatchCase, 
				MatchWholeWord, 
				MatchWildcards, 
				MatchSoundsLike, 
				MatchAllWordForms, 
				Forward,
				Wrap,
				Format_,
				ReplaceWith, 2);
			Исключение
				Сообщить("Ошибка при замене: " + СтрокаПоиска + " на " + СтрСтруктуры.Значение);
			КонецПопытки;
			
		КонецЦикла;
		
		ТаблицаВорд = MSWord.ActiveDocument.Tables(3);
		
		ЗаполнитьТаблицуДокумента(Объект.СсылкаНаОбъект);
		
		Если НЕ Объект.ЕстьСкидка Тогда
			ТаблицаВорд.Columns.Item(6).Delete();
			ТаблицаВорд.Columns.Item(5).Delete();
			ТаблицаВорд.Columns.Item(2).Width = 300;
		КонецЕсли;
		
		Строка = 2;
		Для каждого СтрТовары Из Объект.ТаблицаДокумента Цикл
			
			ТаблицаВорд.Rows.Add();
			
			КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 1).Range;
			КолонкаТаблицы.Text = СтрТовары.НомСтр;
			
			КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 2).Range;
			КолонкаТаблицы.Text = СтрТовары.Номенклатура;
			
			КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 3).Range;
			КолонкаТаблицы.Text = СтрТовары.Количество;
			
			КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 4).Range;
			КолонкаТаблицы.Text = СтрТовары.Сумма;
			
			Если Объект.ЕстьСкидка Тогда
			
				КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 5).Range;
				КолонкаТаблицы.Text = СтрТовары.СуммаСкидки;
				
				КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 6).Range;
				КолонкаТаблицы.Text = СтрТовары.Итого;
				
				КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 7).Range;
				КолонкаТаблицы.Text = СтрТовары.ДатаКон;
				
			Иначе
				
				КолонкаТаблицы = ТаблицаВорд.Cell(Строка, 5).Range;
				КолонкаТаблицы.Text = СтрТовары.ДатаКон;
				
			КонецЕсли;
			
			Строка = Строка + 1;
			
		КонецЦикла;
		
		// Вывод документа
		MSWord.Application.Visible = 1;
		MSWord.Activate();
		
		//+чтобы документ Word открылся перед лицом пользователя, нужен такой лайфхак
		MSWord.Application.WindowState = 2; //сворачиваем
		MSWord.Application.WindowState = 1; //разворачиваем
		
	Исключение
		Сообщить(ОписаниеОшибки());
		MSWord.Application.Quit();
	КонецПопытки; 
	
КонецПроцедуры // Печать()

&НаСервере
Функция ПолучитьМакет(ИмяМакета)
	
	Возврат РеквизитФормыВЗначение("Объект").ПолучитьМакет(ИмяМакета);
	
КонецФункции
Показать


P.S. Для приведенного примера тип макета - двоичные данные.
10. rougudz 09.04.19 14:29 Сейчас в теме
всем спасибо за оперативные ответы. все получилось.
причем так как все формируется в модуле формы, и отлаживать все можнокак обычную обработку.
Оставьте свое сообщение

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