Ошибка во внешней печатной форме счета УНФ

1. a_inves 07.10.21 23:47 Сейчас в теме
Всем привет. Опыт программирования небольшой. Прошу помощи...
Сделал внешнюю печ. форму счета.
Если запустить ее как внешнюю обработку - все печатается и из документа "счет" и из документа "Заказ покупателя".
Но если добавить ее как внеш. печ. форму, то при попытке печати из документа Счет, выдает ошибку:
"Значение не является значением объектного типа (Табличный документ)"

Делал вроде как обычно: скопировал код из процедуры "Печать" из модуля менеджера документа Счет,
потом перенес туда процедуры из обработки "ПечатьСчетаНаОплату"
Но в процедуре Печать как-то не так, как было у меня раньше...
Раньше была команда:
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(...
А в этой такой команды нет.
Не могу разобраться, что сделать, чтобы заработало?
По теме из базы знаний
Найденные решения
8. ankr 19 08.10.21 19:00 Сейчас в теме
(7) Вам шашечки или ехать? ;)
Если у вас этот код работает из внешней печ. формы, используйте то, что работает.
Например, так:
Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	ТабДок = ПодготовитьПечФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати);
	
	УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "СчетНаОплату", "СчетНаОплату", 
	ТабДок,,"СчетНаОплату");
	
	Возврат ТабДок;
КонецФункции

Функция ПодготовитьПечФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати)
	ВозможныеВарианты = Обработки.ПечатьСчетНаОплату.МатрицаВозможныхВариантов();
	Для каждого СтрокаТаблицы Из ВозможныеВарианты Цикл
		
		ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату");
		Если ПечатнаяФорма <> Неопределено Тогда
			
			ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
			ПечатнаяФорма.ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Универсальные_СчетНаОплатуВнешняя";//Обработки.ПечатьСчетНаОплату.КлючПараметровПечати();
			ПечатнаяФорма.ПолныйПутьКМакету = "ПФ_MXL_СчетНаОплату";//Обработки.ПечатьСчетНаОплату.ПолныйПутьКМакету();
			ПечатнаяФорма.СинонимМакета = "Счет на оплату";//Обработки.ПечатьСчетНаОплату.ПредставлениеПФ(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле);
			
			Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.СчетНаОплату") Тогда
				ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокумента(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле);
			Иначе
				Ошибки = Неопределено;
				ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокументаЗаказ(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле, Ошибки);
			КонецЕсли;
			
			Если СтрокаТаблицы.ЧастичнаяОплата Тогда
				Обработки.ПечатьСчетНаОплату.УчестьОсобенностиЧастичнойОплаты(ДанныеОбъектовПечати);
			КонецЕсли;
			
			ТабДок = СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, Ложь);
			
		КонецЕсли;
		
	КонецЦикла;
	
	//Если ПараметрыПечати.Свойство("ШаблонПечатиОфисныхДокументов") И ЗначениеЗаполнено(ПараметрыПечати.ШаблонПечатиОфисныхДокументов) Тогда
	//	
	//	Для каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
	//		Если СтрНачинаетсяС(ПечатнаяФорма.ИмяВРЕГ, ВРег("ПечатьПоШаблонуОфисногоДокумента")) Тогда
	//			ПечатнаяФорма.ОфисныеДокументы = ПечатьПоШаблонуОфисногоДокумента(МассивОбъектов, ПараметрыПечати.ШаблонПечатиОфисныхДокументов);
	//		КонецЕсли;
	//	КонецЦикла;
	//	
	//КонецЕсли;
	
	//ЭлектроннаяПочтаУНФ.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов,
	//КоллекцияПечатныхФорм);
	
	Возврат ТабДок;
	
КонецФункции
Показать

Я просто перенес ваш код в отдельную функцию, а Печать сделал как обычно.
При этом оставил ее функцией, тогда вызов из формы сохранит работоспособность.
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. a_inves 07.10.21 23:47 Сейчас в теме
Вот файл обработки
Прикрепленные файлы:
ПечатьСчета_проба.epf
3. RustamZz 08.10.21 09:05 Сейчас в теме
(2) Печать - это не функция, а процедура. ТабличныйДокумент это реквизит коллекции печатных форм. УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию есть и широко используется, почему его нет у вас не знаю.
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
                                
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ДоговорПоставки") Тогда
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "Договор поставки", "Договор поставки", ПечатнаяФорма(МассивОбъектов, ОбъектыПечати));
	КонецЕсли;		
     
КонецПроцедуры
4. -AI- 08.10.21 09:36 Сейчас в теме
(2) сокращу код, что бы была понятна мысль которую хочу донести:
Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	ВозможныеВарианты = Обработки.ПечатьСчетНаОплату.МатрицаВозможныхВариантов();
	Для каждого СтрокаТаблицы Из ВозможныеВарианты Цикл
		
		ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату");
		Если ПечатнаяФорма <> Неопределено Тогда
			
			ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
			
			ТабДок = СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, Ложь);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Возврат ТабДок;
КонецФункции
Показать
что видим:

0) в цикле, при каждой итерации, пересоздаются переменные ПечатнаяФорма и ТабДок
1) первая переменная за пределы этой функции не выходит, так зачем её создавать и заполнять?
2) вторая - возвращается только последнее значение... тогда зачем нужен цикл и многократное её формирование?

PS как уже сказали выше, что-то в логике у вас совсем не так как надо...
5. a_inves 08.10.21 10:01 Сейчас в теме
(4) RustamZz, благодарю за ответ.

"Печать - это не функция, а процедура"
-----------
Сделал функцией, чтобы отладить печать через запуск формы обработки.
По идее, не результат не влияет (раньше так уже делал).
============
что-то в логике у вас совсем не так как надо...
-------------
Вот в этом и вопрос.
Код скопировал из процедуры печати из модуля менеджера документа "Счет..." (УНФ)
И не понимаю, как там это работает.

Видимо, пойду стандартным путем - сделаю как у вас в (3)
6. -AI- 08.10.21 10:09 Сейчас в теме
(5)
Вот в этом и вопрос

наверняка в УНФ есть обработки с именем начинающемся на "Печать"

возьми от туда за образец процедуру Печать, она должна иметь примерно такой вид:
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);
	
	Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЗаказКлиента") Тогда
		
		УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
			КоллекцияПечатныхФорм,
			"ЗаказКлиента",
			НСтр("ru = 'Заказ клиента'"),
			СформироватьПечатнуюФормуЗаказаКлиента(СтруктураТипов, ОбъектыПечати, ПараметрыПечати));
		
	КонецЕсли;
	
	ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, СтруктураТипов, КоллекцияПечатныхФорм);
	
КонецПроцедуры
Показать
PS взял из УТ, грузить УНФ специально для этого сообщения - лень.

(5)
Сделал функцией, чтобы отладить печать через запуск формы обработки.

для отладки, в моём примере примере есть "СформироватьПечатнуюФормуЗаказаКлиента()"
в вашем СформироватьПФ(), т.е. делать ещё Печать функцией - не вижу смысла.
7. a_inves 08.10.21 18:56 Сейчас в теме
(6)
наверняка в УНФ есть обработки с именем начинающемся на "Печать"


Процедура Печать в модуле менеджера документа "Счет на оплату" (УНФ) выглядит так
Процедура Печать(МассивОбъектов, ПараметрыПечати, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	
	ВозможныеВарианты = Обработки.ПечатьСчетНаОплату.МатрицаВозможныхВариантов();
	Для каждого СтрокаТаблицы Из ВозможныеВарианты Цикл
		
		ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, Обработки.ПечатьСчетНаОплату.ИдентификаторПечатнойФормы(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле));
		Если ПечатнаяФорма <> Неопределено Тогда
			
			ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
			ПечатнаяФорма.ТабличныйДокумент.КлючПараметровПечати = Обработки.ПечатьСчетНаОплату.КлючПараметровПечати();
			ПечатнаяФорма.ПолныйПутьКМакету = Обработки.ПечатьСчетНаОплату.ПолныйПутьКМакету();
			ПечатнаяФорма.СинонимМакета = Обработки.ПечатьСчетНаОплату.ПредставлениеПФ(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле);
			
			ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокумента(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле);
			Если СтрокаТаблицы.ЧастичнаяОплата Тогда
				
				Обработки.ПечатьСчетНаОплату.УчестьОсобенностиЧастичнойОплаты(ДанныеОбъектовПечати);
				
			КонецЕсли;
			
			Обработки.ПечатьСчетНаОплату.СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, СтрокаТаблицы.ЧастичнаяОплата);
			
		КонецЕсли;
		
	КонецЦикла;
	
	Если ПараметрыПечати.Свойство("ШаблонПечатиОфисныхДокументов") И ЗначениеЗаполнено(ПараметрыПечати.ШаблонПечатиОфисныхДокументов) Тогда
		
		Для каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
			Если СтрНачинаетсяС(ПечатнаяФорма.ИмяВРЕГ, ВРег("ПечатьПоШаблонуОфисногоДокумента")) Тогда
				ПечатнаяФорма.ОфисныеДокументы = ПечатьПоШаблонуОфисногоДокумента(МассивОбъектов, ПараметрыПечати.ШаблонПечатиОфисныхДокументов);
			КонецЕсли;
		КонецЦикла;
		
	КонецЕсли;
	
	ЭлектроннаяПочтаУНФ.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов,
		КоллекцияПечатныхФорм);
	
КонецПроцедуры
Показать

Именно поэтому и возник вопрос: может ли этот код работать во внешней печ. форме?
(ну, в документе "Счет на оплату" он же работает)
Но вот как он работает, я не понимаю... (((
8. ankr 19 08.10.21 19:00 Сейчас в теме
(7) Вам шашечки или ехать? ;)
Если у вас этот код работает из внешней печ. формы, используйте то, что работает.
Например, так:
Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
	ТабДок = ПодготовитьПечФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати);
	
	УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "СчетНаОплату", "СчетНаОплату", 
	ТабДок,,"СчетНаОплату");
	
	Возврат ТабДок;
КонецФункции

Функция ПодготовитьПечФорму(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати)
	ВозможныеВарианты = Обработки.ПечатьСчетНаОплату.МатрицаВозможныхВариантов();
	Для каждого СтрокаТаблицы Из ВозможныеВарианты Цикл
		
		ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "СчетНаОплату");
		Если ПечатнаяФорма <> Неопределено Тогда
			
			ПечатнаяФорма.ТабличныйДокумент = Новый ТабличныйДокумент;
			ПечатнаяФорма.ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_Универсальные_СчетНаОплатуВнешняя";//Обработки.ПечатьСчетНаОплату.КлючПараметровПечати();
			ПечатнаяФорма.ПолныйПутьКМакету = "ПФ_MXL_СчетНаОплату";//Обработки.ПечатьСчетНаОплату.ПолныйПутьКМакету();
			ПечатнаяФорма.СинонимМакета = "Счет на оплату";//Обработки.ПечатьСчетНаОплату.ПредставлениеПФ(СтрокаТаблицы.ЧастичнаяОплата, СтрокаТаблицы.ИспользоватьФаксимиле);
			
			Если ТипЗнч(МассивОбъектов[0]) = Тип("ДокументСсылка.СчетНаОплату") Тогда
				ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокумента(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле);
			Иначе
				Ошибки = Неопределено;
				ДанныеОбъектовПечати = УниверсальныйЗапросПоДаннымДокументаЗаказ(МассивОбъектов, СтрокаТаблицы.ИспользоватьФаксимиле, Ошибки);
			КонецЕсли;
			
			Если СтрокаТаблицы.ЧастичнаяОплата Тогда
				Обработки.ПечатьСчетНаОплату.УчестьОсобенностиЧастичнойОплаты(ДанныеОбъектовПечати);
			КонецЕсли;
			
			ТабДок = СформироватьПФ(ПечатнаяФорма, ДанныеОбъектовПечати, ОбъектыПечати, Ложь);
			
		КонецЕсли;
		
	КонецЦикла;
	
	//Если ПараметрыПечати.Свойство("ШаблонПечатиОфисныхДокументов") И ЗначениеЗаполнено(ПараметрыПечати.ШаблонПечатиОфисныхДокументов) Тогда
	//	
	//	Для каждого ПечатнаяФорма Из КоллекцияПечатныхФорм Цикл
	//		Если СтрНачинаетсяС(ПечатнаяФорма.ИмяВРЕГ, ВРег("ПечатьПоШаблонуОфисногоДокумента")) Тогда
	//			ПечатнаяФорма.ОфисныеДокументы = ПечатьПоШаблонуОфисногоДокумента(МассивОбъектов, ПараметрыПечати.ШаблонПечатиОфисныхДокументов);
	//		КонецЕсли;
	//	КонецЦикла;
	//	
	//КонецЕсли;
	
	//ЭлектроннаяПочтаУНФ.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, МассивОбъектов,
	//КоллекцияПечатныхФорм);
	
	Возврат ТабДок;
	
КонецФункции
Показать

Я просто перенес ваш код в отдельную функцию, а Печать сделал как обычно.
При этом оставил ее функцией, тогда вызов из формы сохранит работоспособность.
9. a_inves 10.10.21 13:42 Сейчас в теме
(8) сделал по вашему совету - все получилось.
Благодарю всех за помощь!
Оставьте свое сообщение

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