Как программно напечатать документы с внешней печатной формой?

Внимание! Тема закрыта. Добавлять сообщения в закрытую тему запрещено.
1. Perk0n 13 01.03.16 14:21 Сейчас в теме
Только осваиваю БСП. Не могу найти точку "впиха".

Есть типовой документ Х. У него есть внешняя печатная форма (с правильной регистрацией "СведенияОВнешнейОбработке").

Есть обработка групповой печати, которая по нажатию на кнопочку должна список этих документов отправить на печать (на принтер сразу / на предпросмотр).

Пытался прикрутить "УправлениеПечатью.СформироватьПечатныеФормы", что-то не вышло.
Подскажите верный путь. Попутно можно отослать на годные статьи и процедурное описание БСП.
Вознаграждение за ответ
Показать полностью
Найденные решения
7. Alex_E 2362 01.03.16 21:22 Сейчас в теме
Процедура печати может выглядеть примерно так:
&НаКлиенте
Процедура ПечатьСчета(МассивСчетов)
	
	Если Не ЗначениеЗаполнено(Объект.ПечатнаяФормаСчет) Тогда
		Предупреждение("Выберите печатную форму счета!!!");
	КонецЕсли;
	
	ПараметрыПечати	= Новый Структура("ЗаголовокФормы", "Счет");
	
	Если ТипЗнч(МассивСчетов) = Тип("Массив") Тогда
	Иначе
		МассивСчетов = Новый Массив;
		
		ВыделенныеСтроки = Элементы.СписокДокументов.ВыделенныеСтроки;	
		Для Каждого стр Из ВыделенныеСтроки Цикл
			ТекущаяСтрока = Элементы.СписокДокументов.ДанныеСтроки(стр);
			Если ЗначениеЗаполнено(ТекущаяСтрока.Счет) Тогда
				МассивСчетов.Добавить(ТекущаяСтрока.Счет);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Если МассивСчетов.Количество() Тогда
		
		СтрСпПечФормСчет = СоздатьСпиокЗначенийДляВыбора("СчетНаОплатуПокупателю", Истина, Объект.ПечатнаяФормаСчет);
		

		Если ЗначениеЗаполнено(ТабПечФорм[0].ВариантЗапуска) Тогда
			ПечатьВнешнейПечатнойФормы(МассивСчетов)
		Иначе
			//ПечатьВстроеннойФормы(МассивСчетов, ТабПечФорм[0].ИсточникКомандыПечати, ТабПечФорм[0].СпПечатныхФорм, ПараметрыПечати);
			УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
				ТабПечФорм[0].МенеджерПечати,
				ТабПечФорм[0].Идентификатор,
				МассивСчетов,
				Неопределено,
				ПараметрыПечати
				);
		КонецЕсли;
		
	КонецЕсли;
КонецПроцедуры
Показать

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

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


МассивСчетов - массив документов, который нужно передать в процедуру печати.

Ничего не исправлял - это рабочие процедуры из реально использующейся обработки...думаю, для начального точка, будет достаточно?
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. Xershi 1496 01.03.16 14:27 Сейчас в теме
(1) Perk0n, нужно получить ВНФ. И выполнить код вывода на печать.
3. Perk0n 13 01.03.16 15:41 Сейчас в теме
mista-style... вы либо развивайте свою мысль, либо не пишите совсем.

Да, ВНФ можно "вытащить" из справочника "ВнешниеСправочникиИОбработки" или как-то так, но это будет не по феншую (БСП).
4. Xershi 1496 01.03.16 16:03 Сейчас в теме
(3) Perk0n, ну если вас концепция не устраивает, то так и пишите. Ваш уровень программиста мне не известен, но пинка под зад могу дать!
5. Perk0n 13 01.03.16 17:39 Сейчас в теме
(4) Xershi, не хотел никого обидеть, да и себе бы пинка под зад дать не позволил бы.

Буду примного благодарен за любые развернутые решения.
6. Xershi 1496 01.03.16 19:20 Сейчас в теме
(5) Perk0n, я вам могу подсказать как это реализовать в принципе. По методам БСП или по другим канонам я не работаю.

В принципе чем вас вариант из (2) не устраивает?
Или вопрос как написать код?
7. Alex_E 2362 01.03.16 21:22 Сейчас в теме
Процедура печати может выглядеть примерно так:
&НаКлиенте
Процедура ПечатьСчета(МассивСчетов)
	
	Если Не ЗначениеЗаполнено(Объект.ПечатнаяФормаСчет) Тогда
		Предупреждение("Выберите печатную форму счета!!!");
	КонецЕсли;
	
	ПараметрыПечати	= Новый Структура("ЗаголовокФормы", "Счет");
	
	Если ТипЗнч(МассивСчетов) = Тип("Массив") Тогда
	Иначе
		МассивСчетов = Новый Массив;
		
		ВыделенныеСтроки = Элементы.СписокДокументов.ВыделенныеСтроки;	
		Для Каждого стр Из ВыделенныеСтроки Цикл
			ТекущаяСтрока = Элементы.СписокДокументов.ДанныеСтроки(стр);
			Если ЗначениеЗаполнено(ТекущаяСтрока.Счет) Тогда
				МассивСчетов.Добавить(ТекущаяСтрока.Счет);
			КонецЕсли;
		КонецЦикла;
	КонецЕсли;
	Если МассивСчетов.Количество() Тогда
		
		СтрСпПечФормСчет = СоздатьСпиокЗначенийДляВыбора("СчетНаОплатуПокупателю", Истина, Объект.ПечатнаяФормаСчет);
		

		Если ЗначениеЗаполнено(ТабПечФорм[0].ВариантЗапуска) Тогда
			ПечатьВнешнейПечатнойФормы(МассивСчетов)
		Иначе
			//ПечатьВстроеннойФормы(МассивСчетов, ТабПечФорм[0].ИсточникКомандыПечати, ТабПечФорм[0].СпПечатныхФорм, ПараметрыПечати);
			УправлениеПечатьюКлиент.ВыполнитьКомандуПечати(
				ТабПечФорм[0].МенеджерПечати,
				ТабПечФорм[0].Идентификатор,
				МассивСчетов,
				Неопределено,
				ПараметрыПечати
				);
		КонецЕсли;
		
	КонецЕсли;
КонецПроцедуры
Показать

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

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


МассивСчетов - массив документов, который нужно передать в процедуру печати.

Ничего не исправлял - это рабочие процедуры из реально использующейся обработки...думаю, для начального точка, будет достаточно?
8. Alex_E 2362 01.03.16 21:25 Сейчас в теме
добавлю ещё пару процедур оттуда же:
&НаКлиенте
Процедура ДополнительныеОтчетыИОбработкиКлиент_ВыполнитьСерверныйМетод­Обработки(
							ВнешняяОбработка,
							ВидОбработки,
							ИдентификаторКоманды,
							БезопасныйРежим,
							ПоказыватьОповещение,
							Модификатор,
							ОбъектыНазначенияМассив)
	
		Если ПоказыватьОповещение Тогда
			ПоказатьОповещениеПользователя(НСтр("ru = 'Обработка выполняется...'"));
		КонецЕсли;
		
		Если ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка()
		 ИЛИ ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительныйОтчет() Тогда
			
			//ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим);
			ВызовДопОтч(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим);
			
		ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиСозданиеСвязанныхОбъектов() Тогда
			
			ТипыСозданныхОбъектов = Новый Массив;
			
			//ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ТипыСозданныхОбъектов);
			ВызовДопОтч(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ТипыСозданныхОбъектов);
			
			Для Каждого Тип Из ТипыСозданныхОбъектов Цикл
				ОповеститьОбИзменении(Тип);
			КонецЦикла;
			
		ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма()
			И Модификатор = "ПечатьMXL" Тогда
			
			ПараметрыИсточника = Новый Структура;
			ПараметрыИсточника.Вставить("ИдентификаторКоманды", ИдентификаторКоманды);
			ПараметрыИсточника.Вставить("ОбъектыНазначения", ОбъектыНазначенияМассив);
			ПараметрыИсточника.Вставить("БезопасныйРежим", БезопасныйРежим);
			
			ПараметрыОткрытия = Новый Структура("ИсточникДанных,ПараметрыИсточника");
			ПараметрыОткрытия.ИсточникДанных = ВнешняяОбработка;
			ПараметрыОткрытия.ПараметрыИсточника = ПараметрыИсточника;
			
			//ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия); //ninch 01.11.2011
			// Получим ключ уникальности открываемой формы
			ВрКлючУникальности	= Строка(Новый УникальныйИдентификатор); //ninch 01.11.2011
			ВрВладелецФормы		= Неопределено; //ninch 01.11.2011
			ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ВрВладелецФормы, ВрКлючУникальности); //ninch 01.11.2011
			
		ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиЗаполнениеОбъекта() Тогда
			
			ИзмененныеОбъекты = Новый Массив;
			
			//ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ИзмененныеОбъекты);
			ВызовДопОтч(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив, ИзмененныеОбъекты);
			
			Для Каждого Тип Из ИзмененныеОбъекты Цикл
				ОповеститьОбИзменении(Тип);
			КонецЦикла;
			
		ИначеЕсли ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиПечатнаяФорма()
		 ИЛИ ВидОбработки = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиОтчет() Тогда
			
			//ДополнительныеОтчетыИОбработки.ВыполнитьОбработкуНепосредственно(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив);
			ВызовДопОтч(ВнешняяОбработка, ИдентификаторКоманды, БезопасныйРежим, ОбъектыНазначенияМассив);
			
		КонецЕсли;
		
		Если ПоказыватьОповещение Тогда
			ПоказатьОповещениеПользователя(НСтр("ru = 'Обработка завершена...'"));
		КонецЕсли;
	
КонецПроцедуры

&НаКлиенте
Процедура ПечатьВнешнейПечатнойФормы(МассивОбъектовНазначения)
	
	ДополнительныеОтчетыИОбработкиКлиент_ВыполнитьСерверныйМетод­Обработки(
			ТабПечФорм[0].Ссылка,
			"ПечатнаяФорма",
			ТабПечФорм[0].Идентификатор,
			Истина,
			ТабПечФорм[0].ПоказыватьОповещение,
			ТабПечФорм[0].Модификатор,
			МассивОбъектовНазначения);
	
КонецПроцедуры
Показать
9. Perk0n 13 02.03.16 05:52 Сейчас в теме
Спасибо за потраченное время и куски кода)
Буду разбираться.
Оставьте свое сообщение

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