Печать внешней формы 8.3

1. XiPyPg 28.04.18 12:02 Сейчас в теме
Подскажите печать уходит в цикл вот код.

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


КонецПроцедуры

Функция ПечатьВнешнейПечатнойФормы(МассивОбъектовНазначения, ОбъектыПечати) Экспорт

	//ФормаДокумента = СсылкаНаОбъект.ПолучитьФорму();
	//Если ФормаДокумента.Модифицированность Тогда 
	//	Предупреждение("Сначала нужно записать документ", 10, "Формирование печатной формы невозможно");
	//	Возврат Неопределено;
	//ИначеЕсли НЕ ЗначениеЗаполнено(СсылкаНаОбъект.Организация) Тогда 
	//	Предупреждение("Укажите организацию", 10, "Формирование печатной формы невозможно");
	//	Возврат Неопределено;
	//КонецЕсли;
	//для каждого стр из МассивОбъектовНазначения цикл
		СсылкаНаОбъект =МассивОбъектовНазначения;
		Организация = СсылкаНаОбъект.Организация;
		
	ТабДокумент = Новый ТабличныйДокумент;
	ТабДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ДополнительноеСоглашение";
	
	ТабДокумент.ОтображатьГруппировки = Ложь;
	ТабДокумент.ОтображатьЗаголовки = Ложь;
	ТабДокумент.ОтображатьСетку = Ложь;
	
	// получаем данные для печати
	РезультатЗарпоса = СформироватьЗапросДляПечатиДоговора();
	Выборка = РезультатЗарпоса.Выбрать();
	
	// получаем макет
	Макет = ПолучитьМакет("Макет");
	
	ОбластьШапка  = Макет.ПолучитьОбласть("Шапка");
	ОбластьСтр = Макет.ПолучитьОбласть("Стр1");	 
	ОбластьТело = Макет.ПолучитьОбласть("Тело");
	ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
	
	// выводим данные 
	Пока Выборка.Следующий() Цикл
		
		ФИОРаботникаИм = ПросклонятьФИОПоВозможности(Выборка.ФизЛицо, Выборка.ФамилияСотр, Выборка.ИмяСотр, Выборка.ОтчествоСотр, Выборка.ПолСотр , Ложь, 3);
		ФИОСотрудникаКратко = ПросклонятьФИОПоВозможности(Выборка.ФизЛицо, Выборка.ФамилияСотр, Выборка.ИмяСотр, Выборка.ОтчествоСотр, Выборка.ПолСотр , Истина, 1);
		
		//Если ЗначениеЗаполнено(Выборка.ФИОКадры) Тогда 
		//	ФИОКадры = ВРег(ПросклонятьФИОПоВозможности(Выборка.ФИОКадры, Выборка.ФамилияКадры, Выборка.ИмяКадры, Выборка.ОтчествоКадры, Выборка.ПолКадры , Ложь, 2));
		//	ФИОКадрыСокр = ПросклонятьФИОПоВозможности(Выборка.ФИОКадры, Выборка.ФамилияКадры, Выборка.ИмяКадры, Выборка.ОтчествоКадры, Выборка.ПолКадры , Истина, 1);
		//Иначе
		//	#Если Клиент Тогда
		//		Сообщить("Не указан руководитель организации", СтатусСообщения.Внимание);	
		//	#КонецЕсли
		//КонецЕсли;
		
		ОбластьСтр.Параметры.ФИОСотрудника =  ФИОРаботникаИм;
		ОбластьСтр.Параметры.ДолжностьСотрудника = Выборка.Должность;
		
		ОбластьТело.Параметры.ДатаНачалаОтпуска = Формат(Выборка.ДатаНачала, "ДЛФ=Д");
		ОбластьТело.Параметры.ДатаОкончанияОтпуска = Формат(Выборка.ДатаОкончания + 24*60*60, "ДЛФ=Д");
		
		ОбластьПодвал.Параметры.ФИОКадры =  "";//ФИОКадрыСокр;
		ОбластьПодвал.Параметры.ДатаДоОтпуска = Формат( Выборка.ДатаНачала - 14*24*60*60,"ДЛФ=Д");
		ОбластьПодвал.Параметры.ФИОСотрудникаСокр = ФИОСотрудникаКратко;
		
			
		ТабДокумент.Вывести(ОбластьШапка);
		ТабДокумент.Вывести(ОбластьСтр);
		ТабДокумент.Вывести(ОбластьТело);
		ТабДокумент.Вывести(ОбластьПодвал);
	
		ТабДокумент.ВывестиГоризонтальныйРазделительСтраниц();
		
	КонецЦикла;
	//КонецЦикла;
	Возврат ТабДокумент;	
КонецФункции
	

Функция СформироватьЗапросДляПечатиДоговора()
		
	Запрос = Новый Запрос;
	Запрос.УстановитьПараметр("Ссылка", СсылкаНаОбъект);
	Запрос.УстановитьПараметр("Организация", СсылкаНаОбъект.Организация);
	Запрос.УстановитьПараметр("Должность",Справочники.Должности.НайтиПоКоду("000000054"));
	Запрос.Текст = "ВЫБРАТЬ
	               |	ФИОСотрудника.Фамилия КАК ФамилияСотр,
	               |	ФИОСотрудника.Имя КАК ИмяСотр,
	               |	ФИОСотрудника.Отчество КАК ОтчествоСотр,
	               |	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность КАК Должность,
	               |	Отпуск.ФизическоеЛицо КАК ФизЛицо,
	               |	Отпуск.Сотрудник КАК Сотрудник,
	               |	Отпуск.ФизическоеЛицо.Пол КАК ПолСотр,
	               |	Отпуск.ДатаНачалаПериодаОтсутствия КАК ДатаНачала,
	               |	Отпуск.ДатаОкончанияПериодаОтсутствия КАК ДатаОкончания
	               |ИЗ
	               |	Документ.Отпуск КАК Отпуск,
	               |	РегистрСведений.ФИОФизическихЛиц.СрезПоследних КАК ФИОСотрудника,
	               |	РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
	               |ГДЕ
	               |	Отпуск.Ссылка = &Ссылка
	               |
	               |ОБЪЕДИНИТЬ ВСЕ
	               |
	               |ВЫБРАТЬ
	               |	ФИОСотрудника.Фамилия,
	               |	ФИОСотрудника.Имя,
	               |	ФИОСотрудника.Отчество,
	               |	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность,
	               |	ОтпускБезСохраненияОплаты.ФизическоеЛицо,
	               |	ОтпускБезСохраненияОплаты.Сотрудник,
	               |	ОтпускБезСохраненияОплаты.ФизическоеЛицо.Пол,
	               |	ОтпускБезСохраненияОплаты.ДатаНачала,
	               |	ОтпускБезСохраненияОплаты.ДатаОкончания
	               |ИЗ
	               |	Документ.ОтпускБезСохраненияОплаты КАК ОтпускБезСохраненияОплаты,
	               |	РегистрСведений.ФИОФизическихЛиц.СрезПоследних КАК ФИОСотрудника,
	               |	РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
	               |ГДЕ
	               |	ОтпускБезСохраненияОплаты.Ссылка = &Ссылка
	               |
	               |ОБЪЕДИНИТЬ ВСЕ
	               |
	               |ВЫБРАТЬ
	               |	ФИОСотрудника.Фамилия,
	               |	ФИОСотрудника.Имя,
	               |	ФИОСотрудника.Отчество,
	               |	ТекущиеКадровыеДанныеСотрудников.ТекущаяДолжность,
	               |	ОтпускБезСохраненияОплатыСпискомСотрудники.ФизическоеЛицо,
	               |	ОтпускБезСохраненияОплатыСпискомСотрудники.Сотрудник,
	               |	ОтпускБезСохраненияОплатыСпискомСотрудники.ФизическоеЛицо.Пол,
	               |	ОтпускБезСохраненияОплатыСпискомСотрудники.ДатаНачала,
	               |	ОтпускБезСохраненияОплатыСпискомСотрудники.ДатаОкончания
	               |ИЗ
	               |	Документ.ОтпускБезСохраненияОплатыСписком.Сотрудники КАК ОтпускБезСохраненияОплатыСпискомСотрудники,
	               |	РегистрСведений.ФИОФизическихЛиц.СрезПоследних КАК ФИОСотрудника,
	               |	РегистрСведений.ТекущиеКадровыеДанныеСотрудников КАК ТекущиеКадровыеДанныеСотрудников
	               |ГДЕ
	               |	ОтпускБезСохраненияОплатыСпискомСотрудники.Ссылка = &Ссылка";
	            //   |	И ОтветственныеЛицаОрганизацийСрезПоследних.Должность = &Должность";
	
	Возврат Запрос.Выполнить();
	
КонецФункции


Функция ПросклонятьФИОПоВозможности(Знач ФИО, Фамилия="", Имя="", Отчество="", Пол, ТолькоФамилию = Ложь, Падеж)
	
	Инициалы = " " + Врег(Лев(Имя, 1)) + "." + Врег(Лев(Отчество, 1)) + ".";
	ФиоПросклонять = Фамилия + Имя + Отчество;	
	РезультатСклонения = "";
	//ФизическиеЛицаЗарплатаКадры.Просклонять(
	Если ФизическиеЛицаЗарплатаКадры.Просклонять(ФиоПросклонять, Падеж, РезультатСклонения,Пол) Тогда 
		ФИО = РезультатСклонения + ?(ТолькоФамилию, Инициалы, "");
	Иначе
		ФИО = Фамилия + ?(ТолькоФамилию, Инициалы, "");
	КонецЕсли;	
	
	Возврат СокрЛП(ФИО);	
	
КонецФункции


#Область СведенияОВнешнейОбработке
// Сервисная экспортная функция. Вызывается в основной программе при регистрации обработки в информационной базе
// Возвращает структуру с параметрами регистрации
//
// Возвращаемое значение:
//		Структура с полями:
//			Вид - строка, вид обработки, один из возможных: "ДополнительнаяОбработка", "ДополнительныйОтчет", 
//					"ЗаполнениеОбъекта", "Отчет", "ПечатнаяФорма", "СозданиеСвязанныхОбъектов"
//			Назначение - Массив строк имен объектов метаданных в формате: 
//					<ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>]. 
//					Например, "Документ.СчетЗаказ" или "Справочник.*". Параметр имеет смысл только для назначаемых обработок, для глобальных может не задаваться.
//			Наименование - строка - Наименование обработки, которым будет заполнено наименование элемента справочника по умолчанию.
//			Информация  - строка - Краткая информация или описание по обработке.
//			Версия - строка - Версия обработки в формате “<старший номер>.<младший номер>” используется при загрузке обработок в информационную базу.
//			БезопасныйРежим - булево - Принимает значение Истина или Ложь, в зависимости от того, требуется ли устанавливать или отключать безопасный режим 
//							исполнения обработок. Если истина, обработка будет запущена в безопасном режиме. 
//
Функция СведенияОВнешнейОбработке() Экспорт
	//Инициализируем структуру с параметрами регистрации    	
	ПараметрыРегистрации = Новый Структура;
	// Первый параметр, который мы должны указать - это какой вид обработки системе должна зарегистрировать.
	// Допустимые типы: ДополнительнаяОбработка, ДополнительныйОтчет, ЗаполнениеОбъекта, Отчет, ПечатнаяФорма, СозданиеСвязанныхОбъектов
	ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть - ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов...
	
	МассивНазначений = Новый Массив;
	// Теперь нам необходимо передать в виде массива имен, к чему будет подключена наша ВПФ
	// Имейте ввиду, что можно задать имя в таком виде: Документ.* - в этом случае обработка будет подключена ко всем документам в системе,
	// которые поддерживают механизм ВПФ
	МассивНазначений.Добавить("Документ.Отпуск");
	МассивНазначений.Добавить("Документ.ОтпускБезСохраненияОплаты");
	МассивНазначений.Добавить("Документ.ОтпускБезСохраненияОплатыСписком");//Указываем документ к которому делаем внешнюю печ. форму   		
	ПараметрыРегистрации.Вставить("Назначение", МассивНазначений);
	
	ПараметрыРегистрации.Вставить("Наименование", "Уведомление об отпуске"); //имя под которым обработка будет зарегестрирована в справочнике внешних обработок
	ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);  // Зададим право обработке на использование безопасного режима. Более подробно можно узнать в справке к платформе (метод УстановитьБезопасныйРежим)
	ПараметрыРегистрации.Вставить("Версия", "1.0");   // эти два параметра играют больше информационную роль,
	ПараметрыРегистрации.Вставить("Информация", "Дополнительная печатная форма"); // т.е. это то, что будет видеть пользователь в информации к обработке
	
	// Создадим таблицу команд (подробнее смотрим ниже)
	ТаблицаКоманд = ПолучитьТаблицуКоманд();
	ДобавитьКоманду(ТаблицаКоманд, "Уведомление об отпуске", "УведомлениеОбОтпуске", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
	//ДобавитьКоманду(ТаблицаКоманд, "Внешний: АКТ (Иванов)", "АКТПечатьВнешняяИван", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
	//ДобавитьКоманду(ТаблицаКоманд, "Внешний: АКТ (Петров)", "АКТПечатьВнешняяПетр", "ВызовСерверногоМетода", Истина, "ПечатьMXL");
	
	ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд);
	
	Возврат ПараметрыРегистрации; 	
КонецФункции
#КонецОбласти

#Область Вспомогательное
// ВСПОМОГАТЕЛЬНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ РЕГИСТРАЦИИ ОБРАБОТКИ


// Формирует структуру с параметрами регистрации регистрации обработки в информационной базе
//
// Параметры:
//	ОбъектыНазначенияФормы - Массив - Массив строк имен объектов метаданных в формате: 
//					<ИмяКлассаОбъектаМетаданного>.[ * | <ИмяОбъектаМетаданных>]. 
//					или строка с именем объекта метаданных 
//	НаименованиеОбработки - строка - Наименование обработки, которым будет заполнено наименование элемента справочника по умолчанию.
//							Необязательно, по умолчанию синоним или представление объекта
//	Информация  - строка - Краткая информация или описание обработки.
//							Необязательно, по умолчанию комментарий объекта
//	Версия - строка - Версия обработки в формате “<старший номер>.<младший номер>” используется при загрузке обработок в информационную базу.
//
//
// Возвращаемое значение:
//		Структура
//
Функция ПолучитьПараметрыРегистрации(ОбъектыНазначенияФормы = Неопределено, НаименованиеОбработки = "", Информация = "", Версия = "1.0")


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


	Возврат ПараметрыРегистрации;


КонецФункции


// Формирует таблицу значений с командами печати
//	
// Возвращаемое значение:
//		ТаблицаЗначений
//
Функция ПолучитьТаблицуКоманд()


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


	Возврат Команды; 
КонецФункции


// Вспомогательная процедура.
//
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование = "ВызовСерверногоМетода", ПоказыватьОповещение = Ложь, Модификатор = "ПечатьMXL")
	НоваяКоманда = ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление = Представление;
	НоваяКоманда.Идентификатор = Идентификатор;
	НоваяКоманда.Использование = Использование;
	НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
	НоваяКоманда.Модификатор = Модификатор;      
КонецПроцедуры

#КонецОбласти 
Показать
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. XiPyPg 28.04.18 12:18 Сейчас в теме
А все понял связи кривые
4. пользователь 28.04.18 14:40
Сообщение было скрыто модератором.
...
3. XiPyPg 28.04.18 12:18 Сейчас в теме
5. Healer 1 28.04.18 14:44 Сейчас в теме
Ну и сам вопрос темы корректнее было бы сформулировать так: "Печать долго думает", а не "уходит в цикл" ;-)
Оставьте свое сообщение

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