Получение результата СКД из отчета

1. user1070412 5 12.11.18 14:32 Сейчас в теме
В последних версиях ЗУП печатные формы для документов Т1, Т1а, Т5, Т5а, Т6, Т6а, Т8, Т8а, Т9, Т9а, Т11 вынесены в отчеты и сделаны на СКД
Возможно ли обращение к этим отчетам из внешней печатной формы для получения данных и подстановкой в свой макет?
По теме из базы знаний
Найденные решения
28. VmvLer 14.11.18 11:03 Сейчас в теме
Ниже пример решения задачи подмены типового макета Т53 на свой, причем можно печатать из списка
платежек сразу несколько выделенных документов как и работает типовая печать, но при определенных
(в коде расширения) условиях для одних видов оплаты будет типовой макет, для других расширенный.
На БСП через доппечформы такой финт не прокатит, а в расширении да.

Главная морока в совмещении геометрии макетов по ширине, т.к. при печати нескольких документов -
все выводятся в один табличный документ согласно типовой печати или печатать документы по одному, если лень заморачиваться.

по комментариям в коде все должно быть ясно

// Расширение: ОбщийМодуль.ВедомостьНаВыплатуЗарплатыБазовый ЗУП: 3.1.8.155
//

#Область Расш1_ЧД_ПечатьТ53

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

	// Выполнение метода печати из расширения или основной кнофигурации
	Если ИспользоватьМакетыРасширения Тогда
	    Результат = Расш1_ЧДПечатьТ53_ПодписьПоРасчетныйЛистДа(МассивОбъектов, ОбъектыПечати, мСпособыВыплатыПодписьПоРасчетныйЛистДа);
	Иначе	
	    Результат = ПродолжитьВызов(МассивОбъектов, ОбъектыПечати); // Не импользуем макеты расширения и выполняется код основной конфигурации
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// 
// Код функция является копией метода основной конфигурации ПечатьТ53(МассивОбъектов, ОбъектыПечати) 
// 
// Модификации 
// 1. дополнительный параметр вызова "мСпособыВыплатыПодписьПоРасчетныйЛистДа"
//
// 2. Модификаций в коде которые выделены тегами
//
// ≪✔ - Фрагмент кода удален (если закомментирован) или будет переопределен добавленными фрагментами (если не закомментирован)   
// ≫✔ - Фрагмент кода добавлен 
//
Функция Расш1_ЧДПечатьТ53_ПодписьПоРасчетныйЛистДа(МассивОбъектов, ОбъектыПечати, мСпособыВыплатыПодписьПоРасчетныйЛистДа)
	
	ПутьКМакету = "ОбщийМакет.ПФ_MXL_Т53";
	
	Менеджер = Документы[МассивОбъектов[0].Метаданные().Имя];
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.АвтоМасштаб          = Истина;
	ТабличныйДокумент.ОриентацияСтраницы   = ОриентацияСтраницы.Портрет;
	ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ВедомостьНаВыплатуЗарплатыВКассу_Т53";
	
	Макет = УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету); // ≪✔  - Фрагмент кода будет переопределен далее
	НастройкиПечатныхФорм = ЗарплатаКадры.НастройкиПечатныхФорм();
	
	ВалютаУчета = ЗарплатаКадры.ВалютаУчетаЗаработнойПлаты();
	
	// получаем данные для печати
	ВыборкаШапок = Менеджер.ВыборкаДляПечатиШапки(МассивОбъектов);
	ВыборкаСтрок = Менеджер.ВыборкаДляПечатиТаблицы(МассивОбъектов);
	
	// Структура параметров областей стандартного макета для помещения данных печати
	ДанныеПечати = УправлениеПечатьюБЗК.ПараметрыОбластейСтандартногоМакета(ПутьКМакету);
			
	ПервыйДокумент = Истина;
	Пока ВыборкаШапок.Следующий() Цикл
		
		// ≫✔▼ Фрагмент кода добавлен ▼ 
		// Для печати могут выделены платежки с разными видами оплаты: ВыплатаЗП, Увольнение, Отпуск...Поэтому логично макет печати подменять именно тут.
		// Определяем макет в зависимости от вхождения в массив мСпособыВыплатыПодписьПоРасчетныйЛистДа
		Если мСпособыВыплатыПодписьПоРасчетныйЛистДа.Найти(ВыборкаШапок.Ссылка.СпособВыплаты) = Неопределено Тогда
			Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.Расш1_ЧДПФ_MXL_Т53_ПодписьПоРасчетныйЛистНет"); // Это фактически скопированный в расширение типовой макет Т53. ПродолжитьВызов() тут недоступен, а простое копирование типового макета позволит выполнить типовую печать. Если стандартный макет не "пилим", то его можно не копировать в расширении и эту строку закомментровать. 
		Иначе
			Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.Расш1_ЧДПФ_MXL_Т53_ПодписьПоРасчетныйЛистДа");  // Это макет с дополнительной колонкой "Подпись о получение расчетного листа". Это мекет для платежек с видом оплаты "ВыплатаЗП" и "Увольнение" см. Расш1_ЧДПечатьТ53()
		КонецЕсли;
		// ВАЖНО. Когда одновременно выбраны для печати документы и с типовым макетом(Оплата отупуска) и с расшиеренным макетом (Выплата ЗП), то
		// ширина таблиц макетов должна быть синхронизирована, что легко проверить при просмотре выводимого табличного документа.
		// ≫✔▲ Фрагмент кода добавлен ▲
	
		// Документы нужно выводить на разных страницах.
		Если Не ПервыйДокумент Тогда
			ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		ПервыйДокумент = Ложь;
		
		// Запомним номер строки, с которой начали выводить текущий документ.
		НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
		
		// Подсчитываем количество страниц документа - для корректного разбиения на страницы.
		ВсегоСтрокДокумента = ВыборкаСтрок.Количество();
		
		ОбластьМакетаШапкаДокумента  = Макет.ПолучитьОбласть("ШапкаДокумента");
		ОбластьМакетаШапкаТаблицы    = Макет.ПолучитьОбласть("Шапка");
		ОбластьМакетаСтрокаТаблицы   = Макет.ПолучитьОбласть("Строка");
		ОбластьМакетаИтогПоСтранице  = Макет.ПолучитьОбласть("ИтогПоЛисту");
		ОбластьМакетаПодвалДокумента = Макет.ПолучитьОбласть("Подвал");
		
		// Массив с двумя строками - для разбиения на страницы.
		ВыводимыеОбласти = Новый Массив();
		ВыводимыеОбласти.Добавить(ОбластьМакетаСтрокаТаблицы);
		ВыводимыеОбласти.Добавить(ОбластьМакетаИтогПоСтранице);
		
		ОбщегоНазначенияБЗККлиентСервер.ОчиститьЗначенияСтруктуры(ДанныеПечати.ШапкаДокумента);
		ОбщегоНазначенияБЗККлиентСервер.ОчиститьЗначенияСтруктуры(ДанныеПечати.Подвал);
		
		// выводим данные о документе
		ЗаполнитьЗначенияСвойств(ДанныеПечати.ШапкаДокумента, ВыборкаШапок);
		ДанныеПечати.ШапкаДокумента.НазваниеОрганизации = СокрЛП(ВыборкаШапок.НазваниеОрганизации);
		Если НастройкиПечатныхФорм.ВыводитьПолнуюИерархиюПодразделений И ЗначениеЗаполнено(ВыборкаШапок.Подразделение) Тогда
			ДанныеПечати.ШапкаДокумента.Подразделение = ВыборкаШапок.Подразделение.ПолноеНаименование();
		КонецЕсли;
		ДанныеПечати.ШапкаДокумента.Номер = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ВыборкаШапок.Номер, Истина, Истина);
		ДанныеПечати.ШапкаДокумента.ОтчетныйПериодС	= НачалоМесяца(ВыборкаШапок.ПериодРегистрации);
		ДанныеПечати.ШапкаДокумента.ОтчетныйПериодПо = ?(НЕ ЗначениеЗаполнено(ВыборкаШапок.ПериодРегистрации), ВыборкаШапок.ПериодРегистрации, КонецМесяца(ВыборкаШапок.ПериодРегистрации));
		
	    ДанныеПечати.ШапкаДокумента.СообщениеОНеприменимостиПечатнойФормы = 
			ЗарплатаКадры.СообщениеОНеприменимостиПечатнойФормы(
				ВыборкаШапок.Дата,
				'20150619',
				НСтр("ru='Приказа Минфина РФ'"),
				'20150330',
				"52н");
		
		Если ВыборкаШапок.СуммаПоДокументу <> 0 Тогда
			ДанныеПечати.ШапкаДокумента.СуммаДок = РаботаСКурсамиВалют.СформироватьСуммуПрописью(ВыборкаШапок.СуммаПоДокументу, ВалютаУчета);
			ДанныеПечати.ШапкаДокумента.СуммаДокРублей = Цел(ВыборкаШапок.СуммаПоДокументу);
			ДанныеПечати.ШапкаДокумента.СуммаДокКопеек = (ВыборкаШапок.СуммаПоДокументу - Цел(ВыборкаШапок.СуммаПоДокументу)) * 100
		КонецЕсли;
		
		// Подвал документа.
		ЗаполнитьЗначенияСвойств(ДанныеПечати.Подвал, ВыборкаШапок);
		// Строка не локализуется т.к. является частью регламентированной формы, применяемой в РФ.
		ДанныеПечати.Подвал.РКО = "Расходный кассовый ордер № _______ от  ""___"" ___________ 20 ___ г.";
		
		ОбластьМакетаШапкаДокумента.Параметры.Заполнить(ДанныеПечати.ШапкаДокумента);
		
		ТабличныйДокумент.Вывести(ОбластьМакетаШапкаДокумента);
		ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		ТабличныйДокумент.Вывести(ОбластьМакетаШапкаТаблицы);
		
		ВыведеноСтраниц = 1; ВыведеноСтрок = 0; ИтогоНаСтранице = 0; Итого = 0;
		
		// Выводим данные по строкам документа.
		НомерСтроки = 0;
		ВыборкаСтрок.Сбросить();
		Пока ВыборкаСтрок.НайтиСледующий(ВыборкаШапок.Ссылка, "Ведомость") Цикл
			
			НомерСтроки = НомерСтроки + 1;
			
			ОбщегоНазначенияБЗККлиентСервер.ОчиститьЗначенияСтруктуры(ДанныеПечати.Строка);
			
			ЗаполнитьЗначенияСвойств(ДанныеПечати.Строка, ВыборкаСтрок);
			ДанныеПечати.Строка.НомерСтроки = НомерСтроки;
			ДанныеПечати.Строка.ТабельныйНомер = 
				ЗарплатаКадрыОтчеты.ТабельныйНомерНаПечать(ВыборкаСтрок.ТабельныйНомер);
				
			Если НастройкиПечатныхФорм.ВыводитьПолныеФИОВСписочныхПечатныхФормах Тогда
					
				ДанныеПечати.Строка.Физлицо = СокрЛП(ВыборкаСтрок.Фамилия)
					+ ?(ПустаяСтрока(ВыборкаСтрок.Имя), "", " " + ВыборкаСтрок.Имя)
					+ ?(ПустаяСтрока(ВыборкаСтрок.Отчество), "", " " + ВыборкаСтрок.Отчество);
					
			Иначе
				ФИО = Новый Структура("Фамилия, Имя, Отчество");
				ФИО.Фамилия = ВыборкаСтрок.Фамилия;
				ФИО.Имя = ВыборкаСтрок.Имя;
				ФИО.Отчество = ВыборкаСтрок.Отчество;
				ДанныеПечати.Строка.Физлицо = ФизическиеЛицаЗарплатаКадрыКлиентСервер.ФамилияИнициалы(ФИО);
			КонецЕсли;
			
			ОбластьМакетаСтрокаТаблицы.Параметры.Заполнить(ДанныеПечати.Строка);
			
			// разбиение на страницы
			ВыведеноСтрок = ВыведеноСтрок + 1;
			
			// Проверим, уместится ли строка на странице или надо открывать новую страницу.
			ВывестиПодвалЛиста = Не ОбщегоНазначения.ПроверитьВыводТабличногоДокумента(ТабличныйДокумент, ВыводимыеОбласти);
			Если Не ВывестиПодвалЛиста И ВыведеноСтрок = ВсегоСтрокДокумента Тогда
				ВыводимыеОбласти.Добавить(ОбластьМакетаПодвалДокумента);
				ВывестиПодвалЛиста = Не ОбщегоНазначения.ПроверитьВыводТабличногоДокумента(ТабличныйДокумент, ВыводимыеОбласти);
			КонецЕсли;
			Если ВывестиПодвалЛиста Тогда
				
				ОбщегоНазначенияБЗККлиентСервер.УстановитьЗначениеСвойства(
					ОбластьМакетаИтогПоСтранице.Параметры, "ИтогоНаСтранице", ИтогоНаСтранице); 
				
				ТабличныйДокумент.Вывести(ОбластьМакетаИтогПоСтранице);
				ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
				ТабличныйДокумент.Вывести(ОбластьМакетаШапкаТаблицы);
				
				ВыведеноСтраниц = ВыведеноСтраниц + 1;
				ИтогоНаСтранице = 0;
				
			КонецЕсли;
			
			ТабличныйДокумент.Вывести(ОбластьМакетаСтрокаТаблицы);
			ИтогоНаСтранице = ИтогоНаСтранице + ВыборкаСтрок.Сумма;
			Итого = Итого + ВыборкаСтрок.Сумма;
			
		КонецЦикла; // по строкам документа
		
		Если ВыведеноСтрок > 0 Тогда 
			ОбщегоНазначенияБЗККлиентСервер.УстановитьЗначениеСвойства(
				ОбластьМакетаИтогПоСтранице.Параметры, "ИтогоНаСтранице", ИтогоНаСтранице); 
		КонецЕсли;
		ДанныеПечати.Подвал.КоличествоЛистов = ?(ВыведеноСтрок = 0,"",ВыведеноСтраниц + 1);
		
		ОбластьМакетаПодвалДокумента.Параметры.Заполнить(ДанныеПечати.Подвал); 
		
		// дополняем пустыми строками до конца страницы
		ОбщегоНазначенияБЗК.ОчиститьПараметрыТабличногоДокумента(ОбластьМакетаСтрокаТаблицы);
		ОбластиКонцаСтраницы = Новый Массив();
		ОбластиКонцаСтраницы.Добавить(ОбластьМакетаИтогПоСтранице);
		ОбластиКонцаСтраницы.Добавить(ОбластьМакетаПодвалДокумента);
		ОбщегоНазначенияБЗК.ДополнитьСтраницуТабличногоДокумента(ТабличныйДокумент, ОбластьМакетаСтрокаТаблицы, ОбластиКонцаСтраницы);  
		
		ТабличныйДокумент.Вывести(ОбластьМакетаИтогПоСтранице);
		ТабличныйДокумент.Вывести(ОбластьМакетаПодвалДокумента);
		
		// В табличном документе необходимо задать имя области, в которую был 
		// выведен объект. Нужно для возможности печати покомплектно.
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ВыборкаШапок.Ссылка);
		
	КонецЦикла; // по документам
		
	Возврат ТабличныйДокумент;
	
КонецФункции

#КонецОбласти


Показать
Остальные ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. SaschaL 12.11.18 14:57 Сейчас в теме
Ну можно сделать на базе этих отчетов свои печатные формы и передать туда параметры программно. Ну это самый простой способ.
Второй программно вызвать отчет и тоже передать параметры
3. user1070412 5 12.11.18 15:08 Сейчас в теме
(2) Можно пример кода как передать параметры и получить данные? Например на основе этих отчетов?
4. user1070412 5 13.11.18 09:36 Сейчас в теме
Подскажите на примере ПечатнаяФормаТ5 какой параметр нужно передать?
Пробую "СсылкаНаОбъект", "КлючВарианта" - не получается
Прикрепленные файлы:
5. user1070412 5 13.11.18 09:42 Сейчас в теме
Пытаюсь делать так:
	СхемаОст = Отчеты.ПечатнаяФормаТ5.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
	
	КомпоновщикНастроекНастройки = Новый КомпоновщикНастроекКомпоновкиДанных;
	КомпоновщикНастроекНастройки.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаОст));
	КомпоновщикНастроекНастройки.ЗагрузитьНастройки(СхемаОст.НастройкиПоУмолчанию); 
	
	сообщить(КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы.Количество());//выводит 2
	сообщить(КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы.Получить(0).Заголовок);//выводит Ключ варианта
	сообщить(КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы.Получить(1).Заголовок);//выводит Дата ознакомления работника совпадает с датой приказа
	КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КлючВарианта", ДокПеревод);// проходит
	КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СсылкаНаОбъект", ДокПеревод); // ошибка "Параметр с указанным именем не найден"
	
	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаОст, КомпоновщикНастроекНастройки.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; 
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	
	ДанныеТЗ = Новый ТаблицаЗначений;
	ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

Показать
6. tvm 13.11.18 09:45 Сейчас в теме
(5) можно макет попробовать подменить, а не выводить в ТЗ. ну и также программно добавить вывод нужных полей в СКД.
НУ или выводить результат в ТЗ и скармливать своей схеме. Все зависит от того что нужно выводить в своих формах
7. user1070412 5 13.11.18 09:53 Сейчас в теме
1. не могу понять как передать параметр и какой, чтобы для начала получить хоть что-то
2. на выходе хочу получить ТЗ для формирования измененной печатной формы
8. tvm 13.11.18 10:10 Сейчас в теме
(7)
НужныйОтчет = Отчеты.СтатистикаПерсонала.Создать();
КомпоновщикНастроекОтчета = НужныйОтчет.КомпоновщикНастроек;
НастройкиОтчета = КомпоновщикНастроекОтчета.Настройки;
НастройкиОтчета.ПараметрыДанных.Элементы.Получить(0).Значение = ПериодОтчета;

"НастройкиОтчета.ПараметрыДанных.Элементы" это и есть параметры
9. user1070412 5 13.11.18 10:14 Сейчас в теме
в отчете "СтатистикаПерсинала" с параметрами более менее понятно (см вложение), но какой параметр передавать в отчет "ПечатнаяФормаТ5"?
Там только "КлючВарианта" и "ДатаОзнакомленияРаботникаСовпадаетСДатойПриказа", как передать документ на основании которого нужно вывести это отчет?
Прикрепленные файлы:
10. tvm 13.11.18 10:36 Сейчас в теме
11. user1070412 5 13.11.18 10:49 Сейчас в теме
12. tvm 13.11.18 10:59 Сейчас в теме
под рукой нет сейчас не могу посмотреть. Сделайте скришот настроек
13. user1070412 5 13.11.18 13:10 Сейчас в теме
Вот скриншоты раздела Настройки
Прикрепленные файлы:
14. vadim1011985 100 13.11.18 13:41 Сейчас в теме
(13) ну так СсылкаНаОбъект - это элемент отбора поэтому и надо работать с отбором
15. tvm 13.11.18 14:01 Сейчас в теме
(13)
КомпоновщикНастроекОтчета.Настройки.Отбор.Элементы.Получить(ИНДЕКС)

индекс можно в отладчике получить через "КомпоновщикНастроекОтчета.Настройки.Отбор.Элементы"
16. user1070412 5 13.11.18 14:03 Сейчас в теме
ка уже писал в коде выше
 сообщить(КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы.Количество());//выводит 2
    сообщить(КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы.Получить(0).Заголовок);//выводит Ключ варианта
    сообщить(КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.ДоступныеПараметры.Элементы.Получить(1).Заголовок);//выводит Дата ознакомления работника совпадает с датой приказа
    КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КлючВарианта", ДокПеревод);// проходит
    КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("СсылкаНаОбъект", ДокПеревод); // ошибка "Параметр с указанным именем не найден"
    

на попытку установить параметр СсылкаНаОбъект выдается ошибка "Параметр с указанным именем не найден"
17. vadim1011985 100 13.11.18 14:26 Сейчас в теме
(16) вы через отладку посмотрите доступные элементы отбора
18. tvm 13.11.18 14:42 Сейчас в теме
(16) не через параметрыданных а через отбор. Скрин вкладки "Параметры" еще покажите
19. user1070412 5 13.11.18 15:05 Сейчас в теме
скрин вкладки параметры
Прикрепленные файлы:
20. tvm 13.11.18 15:22 Сейчас в теме
(19) все правильно. использовать надо КомпоновщикНастроекОтчета.Настройки.Отбор.Элементы
в отладчике посмотрите что возвращает это выражение
21. user1070412 5 13.11.18 15:39 Сейчас в теме
КомпоновщикНастроекНастройки.Настройки.Отбор.Элементы.Получить(0)

выводит (см картинку)

пытаюсь установить отбор
	
ЭлементОтбора = КомпоновщикНастроекНастройки.Настройки.Отбор.Элементы.Получить(0);
ЭлементОтбора.ПравоеЗначение = Новый СписокЗначений; 
ЭлементОтбора.ПравоеЗначение.Добавить(ДокПеревод); 


но в результате

	КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
	МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаОст, КомпоновщикНастроекНастройки.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
	ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных; 
	ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
	ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
	
	ДанныеТЗ = Новый ТаблицаЗначений;
	ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
	ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);

Показать

пустая таблица
Прикрепленные файлы:
22. tvm 13.11.18 15:56 Сейчас в теме
(21) элементотбора.правоезначение что в отладчике показывает?
23. tvm 13.11.18 15:57 Сейчас в теме
(21) и наверно лучше сначал создать и заполнить списокзначений а потом присвоить правому значению
24. user1070412 5 13.11.18 16:01 Сейчас в теме
элементотбора.правоезначение в отладчике
Прикрепленные файлы:
25. tvm 13.11.18 17:03 Сейчас в теме
страннно. у меня работает и когда есть поле в отборе и когда нет
//поле есть
ОтборОрганизация = КомпоновщикНастроекОтчета.Настройки.Отбор.Элементы.Get(0);
ОтборОрганизация.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
ОтборОрганизация.ПравоеЗначение = Организации;
ОтборОрганизация.Использование = Истина;

//поля нет. добавляем
НовыйЭлементОтбора = КомпоновщикНастроекОтчета.Настройки.Отбор.Элементы.Добавить(Тип("ЭлементОтбораКомпоновкиДанных"));
НовыйЭлементОтбора.ЛевоеЗначение = КомпоновщикНастроекОтчета.Настройки.ДоступныеПоляОтбора.НайтиПоле(Новый ПолеКомпоновкиДанных("Сотрудник.ФизическоеЛицо")).Поле;
НовыйЭлементОтбора.ВидСравнения = ВидСравненияКомпоновкиДанных.ВСписке;
СписокФизлиц = Новый СписокЗначений;
СписокФизлиц.ЗагрузитьЗначения(МассивФизлиц);
НовыйЭлементОтбора.ПравоеЗначение = СписокФизлиц;
Показать
26. VmvLer 13.11.18 18:13 Сейчас в теме
Печать ПечатьТ53 сейчас в общем модуле(в 3.1.5 была в одном, в 3.1.8 в другом - но это не критично для расширения), я добавил этот метод печати в расширение, подменил там макет и получил, то что хотели

как-то так можно поступать с похожими макетами, время на правку минут 10, причем без мозклюйства.
27. user1070412 5 14.11.18 09:48 Сейчас в теме
(26)
ПечатьТ53

Да, поковыряв вывод Т5 стало понятно, что получение результата СКД дает только малую часть данных и много еще чего придется дописывать.

Подскажите как подменили макет? просто заменив расширении стандартный?
Хотелось бы стандартный оставить
28. VmvLer 14.11.18 11:03 Сейчас в теме
Ниже пример решения задачи подмены типового макета Т53 на свой, причем можно печатать из списка
платежек сразу несколько выделенных документов как и работает типовая печать, но при определенных
(в коде расширения) условиях для одних видов оплаты будет типовой макет, для других расширенный.
На БСП через доппечформы такой финт не прокатит, а в расширении да.

Главная морока в совмещении геометрии макетов по ширине, т.к. при печати нескольких документов -
все выводятся в один табличный документ согласно типовой печати или печатать документы по одному, если лень заморачиваться.

по комментариям в коде все должно быть ясно

// Расширение: ОбщийМодуль.ВедомостьНаВыплатуЗарплатыБазовый ЗУП: 3.1.8.155
//

#Область Расш1_ЧД_ПечатьТ53

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

	// Выполнение метода печати из расширения или основной кнофигурации
	Если ИспользоватьМакетыРасширения Тогда
	    Результат = Расш1_ЧДПечатьТ53_ПодписьПоРасчетныйЛистДа(МассивОбъектов, ОбъектыПечати, мСпособыВыплатыПодписьПоРасчетныйЛистДа);
	Иначе	
	    Результат = ПродолжитьВызов(МассивОбъектов, ОбъектыПечати); // Не импользуем макеты расширения и выполняется код основной конфигурации
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// 
// Код функция является копией метода основной конфигурации ПечатьТ53(МассивОбъектов, ОбъектыПечати) 
// 
// Модификации 
// 1. дополнительный параметр вызова "мСпособыВыплатыПодписьПоРасчетныйЛистДа"
//
// 2. Модификаций в коде которые выделены тегами
//
// ≪✔ - Фрагмент кода удален (если закомментирован) или будет переопределен добавленными фрагментами (если не закомментирован)   
// ≫✔ - Фрагмент кода добавлен 
//
Функция Расш1_ЧДПечатьТ53_ПодписьПоРасчетныйЛистДа(МассивОбъектов, ОбъектыПечати, мСпособыВыплатыПодписьПоРасчетныйЛистДа)
	
	ПутьКМакету = "ОбщийМакет.ПФ_MXL_Т53";
	
	Менеджер = Документы[МассивОбъектов[0].Метаданные().Имя];
	
	ТабличныйДокумент = Новый ТабличныйДокумент;
	ТабличныйДокумент.АвтоМасштаб          = Истина;
	ТабличныйДокумент.ОриентацияСтраницы   = ОриентацияСтраницы.Портрет;
	ТабличныйДокумент.КлючПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ВедомостьНаВыплатуЗарплатыВКассу_Т53";
	
	Макет = УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету); // ≪✔  - Фрагмент кода будет переопределен далее
	НастройкиПечатныхФорм = ЗарплатаКадры.НастройкиПечатныхФорм();
	
	ВалютаУчета = ЗарплатаКадры.ВалютаУчетаЗаработнойПлаты();
	
	// получаем данные для печати
	ВыборкаШапок = Менеджер.ВыборкаДляПечатиШапки(МассивОбъектов);
	ВыборкаСтрок = Менеджер.ВыборкаДляПечатиТаблицы(МассивОбъектов);
	
	// Структура параметров областей стандартного макета для помещения данных печати
	ДанныеПечати = УправлениеПечатьюБЗК.ПараметрыОбластейСтандартногоМакета(ПутьКМакету);
			
	ПервыйДокумент = Истина;
	Пока ВыборкаШапок.Следующий() Цикл
		
		// ≫✔▼ Фрагмент кода добавлен ▼ 
		// Для печати могут выделены платежки с разными видами оплаты: ВыплатаЗП, Увольнение, Отпуск...Поэтому логично макет печати подменять именно тут.
		// Определяем макет в зависимости от вхождения в массив мСпособыВыплатыПодписьПоРасчетныйЛистДа
		Если мСпособыВыплатыПодписьПоРасчетныйЛистДа.Найти(ВыборкаШапок.Ссылка.СпособВыплаты) = Неопределено Тогда
			Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.Расш1_ЧДПФ_MXL_Т53_ПодписьПоРасчетныйЛистНет"); // Это фактически скопированный в расширение типовой макет Т53. ПродолжитьВызов() тут недоступен, а простое копирование типового макета позволит выполнить типовую печать. Если стандартный макет не "пилим", то его можно не копировать в расширении и эту строку закомментровать. 
		Иначе
			Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.Расш1_ЧДПФ_MXL_Т53_ПодписьПоРасчетныйЛистДа");  // Это макет с дополнительной колонкой "Подпись о получение расчетного листа". Это мекет для платежек с видом оплаты "ВыплатаЗП" и "Увольнение" см. Расш1_ЧДПечатьТ53()
		КонецЕсли;
		// ВАЖНО. Когда одновременно выбраны для печати документы и с типовым макетом(Оплата отупуска) и с расшиеренным макетом (Выплата ЗП), то
		// ширина таблиц макетов должна быть синхронизирована, что легко проверить при просмотре выводимого табличного документа.
		// ≫✔▲ Фрагмент кода добавлен ▲
	
		// Документы нужно выводить на разных страницах.
		Если Не ПервыйДокумент Тогда
			ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		КонецЕсли;
		ПервыйДокумент = Ложь;
		
		// Запомним номер строки, с которой начали выводить текущий документ.
		НомерСтрокиНачало = ТабличныйДокумент.ВысотаТаблицы + 1;
		
		// Подсчитываем количество страниц документа - для корректного разбиения на страницы.
		ВсегоСтрокДокумента = ВыборкаСтрок.Количество();
		
		ОбластьМакетаШапкаДокумента  = Макет.ПолучитьОбласть("ШапкаДокумента");
		ОбластьМакетаШапкаТаблицы    = Макет.ПолучитьОбласть("Шапка");
		ОбластьМакетаСтрокаТаблицы   = Макет.ПолучитьОбласть("Строка");
		ОбластьМакетаИтогПоСтранице  = Макет.ПолучитьОбласть("ИтогПоЛисту");
		ОбластьМакетаПодвалДокумента = Макет.ПолучитьОбласть("Подвал");
		
		// Массив с двумя строками - для разбиения на страницы.
		ВыводимыеОбласти = Новый Массив();
		ВыводимыеОбласти.Добавить(ОбластьМакетаСтрокаТаблицы);
		ВыводимыеОбласти.Добавить(ОбластьМакетаИтогПоСтранице);
		
		ОбщегоНазначенияБЗККлиентСервер.ОчиститьЗначенияСтруктуры(ДанныеПечати.ШапкаДокумента);
		ОбщегоНазначенияБЗККлиентСервер.ОчиститьЗначенияСтруктуры(ДанныеПечати.Подвал);
		
		// выводим данные о документе
		ЗаполнитьЗначенияСвойств(ДанныеПечати.ШапкаДокумента, ВыборкаШапок);
		ДанныеПечати.ШапкаДокумента.НазваниеОрганизации = СокрЛП(ВыборкаШапок.НазваниеОрганизации);
		Если НастройкиПечатныхФорм.ВыводитьПолнуюИерархиюПодразделений И ЗначениеЗаполнено(ВыборкаШапок.Подразделение) Тогда
			ДанныеПечати.ШапкаДокумента.Подразделение = ВыборкаШапок.Подразделение.ПолноеНаименование();
		КонецЕсли;
		ДанныеПечати.ШапкаДокумента.Номер = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ВыборкаШапок.Номер, Истина, Истина);
		ДанныеПечати.ШапкаДокумента.ОтчетныйПериодС	= НачалоМесяца(ВыборкаШапок.ПериодРегистрации);
		ДанныеПечати.ШапкаДокумента.ОтчетныйПериодПо = ?(НЕ ЗначениеЗаполнено(ВыборкаШапок.ПериодРегистрации), ВыборкаШапок.ПериодРегистрации, КонецМесяца(ВыборкаШапок.ПериодРегистрации));
		
	    ДанныеПечати.ШапкаДокумента.СообщениеОНеприменимостиПечатнойФормы = 
			ЗарплатаКадры.СообщениеОНеприменимостиПечатнойФормы(
				ВыборкаШапок.Дата,
				'20150619',
				НСтр("ru='Приказа Минфина РФ'"),
				'20150330',
				"52н");
		
		Если ВыборкаШапок.СуммаПоДокументу <> 0 Тогда
			ДанныеПечати.ШапкаДокумента.СуммаДок = РаботаСКурсамиВалют.СформироватьСуммуПрописью(ВыборкаШапок.СуммаПоДокументу, ВалютаУчета);
			ДанныеПечати.ШапкаДокумента.СуммаДокРублей = Цел(ВыборкаШапок.СуммаПоДокументу);
			ДанныеПечати.ШапкаДокумента.СуммаДокКопеек = (ВыборкаШапок.СуммаПоДокументу - Цел(ВыборкаШапок.СуммаПоДокументу)) * 100
		КонецЕсли;
		
		// Подвал документа.
		ЗаполнитьЗначенияСвойств(ДанныеПечати.Подвал, ВыборкаШапок);
		// Строка не локализуется т.к. является частью регламентированной формы, применяемой в РФ.
		ДанныеПечати.Подвал.РКО = "Расходный кассовый ордер № _______ от  ""___"" ___________ 20 ___ г.";
		
		ОбластьМакетаШапкаДокумента.Параметры.Заполнить(ДанныеПечати.ШапкаДокумента);
		
		ТабличныйДокумент.Вывести(ОбластьМакетаШапкаДокумента);
		ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		ТабличныйДокумент.Вывести(ОбластьМакетаШапкаТаблицы);
		
		ВыведеноСтраниц = 1; ВыведеноСтрок = 0; ИтогоНаСтранице = 0; Итого = 0;
		
		// Выводим данные по строкам документа.
		НомерСтроки = 0;
		ВыборкаСтрок.Сбросить();
		Пока ВыборкаСтрок.НайтиСледующий(ВыборкаШапок.Ссылка, "Ведомость") Цикл
			
			НомерСтроки = НомерСтроки + 1;
			
			ОбщегоНазначенияБЗККлиентСервер.ОчиститьЗначенияСтруктуры(ДанныеПечати.Строка);
			
			ЗаполнитьЗначенияСвойств(ДанныеПечати.Строка, ВыборкаСтрок);
			ДанныеПечати.Строка.НомерСтроки = НомерСтроки;
			ДанныеПечати.Строка.ТабельныйНомер = 
				ЗарплатаКадрыОтчеты.ТабельныйНомерНаПечать(ВыборкаСтрок.ТабельныйНомер);
				
			Если НастройкиПечатныхФорм.ВыводитьПолныеФИОВСписочныхПечатныхФормах Тогда
					
				ДанныеПечати.Строка.Физлицо = СокрЛП(ВыборкаСтрок.Фамилия)
					+ ?(ПустаяСтрока(ВыборкаСтрок.Имя), "", " " + ВыборкаСтрок.Имя)
					+ ?(ПустаяСтрока(ВыборкаСтрок.Отчество), "", " " + ВыборкаСтрок.Отчество);
					
			Иначе
				ФИО = Новый Структура("Фамилия, Имя, Отчество");
				ФИО.Фамилия = ВыборкаСтрок.Фамилия;
				ФИО.Имя = ВыборкаСтрок.Имя;
				ФИО.Отчество = ВыборкаСтрок.Отчество;
				ДанныеПечати.Строка.Физлицо = ФизическиеЛицаЗарплатаКадрыКлиентСервер.ФамилияИнициалы(ФИО);
			КонецЕсли;
			
			ОбластьМакетаСтрокаТаблицы.Параметры.Заполнить(ДанныеПечати.Строка);
			
			// разбиение на страницы
			ВыведеноСтрок = ВыведеноСтрок + 1;
			
			// Проверим, уместится ли строка на странице или надо открывать новую страницу.
			ВывестиПодвалЛиста = Не ОбщегоНазначения.ПроверитьВыводТабличногоДокумента(ТабличныйДокумент, ВыводимыеОбласти);
			Если Не ВывестиПодвалЛиста И ВыведеноСтрок = ВсегоСтрокДокумента Тогда
				ВыводимыеОбласти.Добавить(ОбластьМакетаПодвалДокумента);
				ВывестиПодвалЛиста = Не ОбщегоНазначения.ПроверитьВыводТабличногоДокумента(ТабличныйДокумент, ВыводимыеОбласти);
			КонецЕсли;
			Если ВывестиПодвалЛиста Тогда
				
				ОбщегоНазначенияБЗККлиентСервер.УстановитьЗначениеСвойства(
					ОбластьМакетаИтогПоСтранице.Параметры, "ИтогоНаСтранице", ИтогоНаСтранице); 
				
				ТабличныйДокумент.Вывести(ОбластьМакетаИтогПоСтранице);
				ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
				ТабличныйДокумент.Вывести(ОбластьМакетаШапкаТаблицы);
				
				ВыведеноСтраниц = ВыведеноСтраниц + 1;
				ИтогоНаСтранице = 0;
				
			КонецЕсли;
			
			ТабличныйДокумент.Вывести(ОбластьМакетаСтрокаТаблицы);
			ИтогоНаСтранице = ИтогоНаСтранице + ВыборкаСтрок.Сумма;
			Итого = Итого + ВыборкаСтрок.Сумма;
			
		КонецЦикла; // по строкам документа
		
		Если ВыведеноСтрок > 0 Тогда 
			ОбщегоНазначенияБЗККлиентСервер.УстановитьЗначениеСвойства(
				ОбластьМакетаИтогПоСтранице.Параметры, "ИтогоНаСтранице", ИтогоНаСтранице); 
		КонецЕсли;
		ДанныеПечати.Подвал.КоличествоЛистов = ?(ВыведеноСтрок = 0,"",ВыведеноСтраниц + 1);
		
		ОбластьМакетаПодвалДокумента.Параметры.Заполнить(ДанныеПечати.Подвал); 
		
		// дополняем пустыми строками до конца страницы
		ОбщегоНазначенияБЗК.ОчиститьПараметрыТабличногоДокумента(ОбластьМакетаСтрокаТаблицы);
		ОбластиКонцаСтраницы = Новый Массив();
		ОбластиКонцаСтраницы.Добавить(ОбластьМакетаИтогПоСтранице);
		ОбластиКонцаСтраницы.Добавить(ОбластьМакетаПодвалДокумента);
		ОбщегоНазначенияБЗК.ДополнитьСтраницуТабличногоДокумента(ТабличныйДокумент, ОбластьМакетаСтрокаТаблицы, ОбластиКонцаСтраницы);  
		
		ТабличныйДокумент.Вывести(ОбластьМакетаИтогПоСтранице);
		ТабличныйДокумент.Вывести(ОбластьМакетаПодвалДокумента);
		
		// В табличном документе необходимо задать имя области, в которую был 
		// выведен объект. Нужно для возможности печати покомплектно.
		УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабличныйДокумент, НомерСтрокиНачало, ОбъектыПечати, ВыборкаШапок.Ссылка);
		
	КонецЦикла; // по документам
		
	Возврат ТабличныйДокумент;
	
КонецФункции

#КонецОбласти


Показать
29. user1070412 5 23.11.18 11:22 Сейчас в теме
(28) Спасибо очень помогли. Действительно, через расширение конфигурации получается гораздо быстрее и проще, чем через получение результат СКД из отчета.
Вот набросал небольшое расширение конфигурации для печатных форм Т-1, Т-5, Т-6, Т-8 в ЗУП 3.1
Оставьте свое сообщение

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