Все об 1С8 - просто и доступно

Добавить в Избранное  Сделать Стартовой  Написать письмо

Главная Статьи Вопрос-ответ Экспресс-справочник Гостевая книга
Статьи по 1С

Внешняя печатная форма 1С с передачей параметров через форму (УФ)

С появлением механизма расширений 1С актуальность внешних печатных форм может несколько и снизилась, но вовсе не пропала совсем. Для разработки внешней печатной формы не нужен конфигуратор именно той базы данных, для которой эта внешняя печатная форма предназначена. Поэтому вполне имеет право на жизнь. И нередко случается, что во внешнюю печатную форму перед ее формированием и выводом на экран необходимо передать какие-то данные. Данные, которые выбираются пользователем и вводятся через форму.
В этой статье пойдет речь о том, как открыть форму для выбора данных до формирования печатной формы и передать выбранные пользователем значения в процедуру формирования внешней печатной формы. Этот пример будет актуален для конфигураций на управляемых формах.
На просторах Интернета встречаются некоторые варианты решения задачи, здесь будет приведен механизм, используемый в реальной жизни, возможно похожий на тот, который был описан где-то раньше. Для примера будет взята одна из типовых сущностей, которая встречается почти во всех конфигурациях. А именно физические лица. Разработаем внешнюю печатную форму письма физическому лицу. В этой печатной форме будет содержаться поздравление с днем рождения и сообщение о том, что ему начислена разовая премия. Список пожеланий через запятую, размер премии и дату письма будем вводить на форме. Также сделаем проверку на принадлежность пользователя к определенному подразделению. Если пользователь не принадлежит к нужному подразделению, то внешняя печатная форма формироваться не будет. При желании можно добавить при этом сообщение.
В описании механизма этой внешней печатной формы стоит уделить внимание трем моментам: регистрации внешней печатной форме в системе, открытии формы параметров для передачи в печатную форму и получение этих параметров в модуле объекта с дальнейшим их использованием.

Создаем внешнюю обработку и в модуле объекта прописываем параметры регистрации. Не забываем добавить функцию печати, чтобы не было ошибок при сохранении.
#область Регистрация

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

#КонецОбласти
Затем добавляем форму. На форму добавляем три обязательных реквизиты. В некоторых реализациях эти реквизиты сделаны параметрами.
Итак, обязательные реквизиты формы: ДополнительнаяОбработкаСсылка (СправочникСсылка.ДополнительныеОтчетыИОбработки), ИдентификаторКоманды (Строка) и ОбъектыНазначения (СписокЗначений).
Затем добавляем реквизиты, которые должен заполнить пользователь. Значения этих реквизитов будут переданы в модуль объекта и выведены в печатную форму.

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

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

&НаСервере
Функция ПолучитьОбъектыНазначенияИПараметрыПечати()
    
    ДанныеДляПечати = ОбъектыНазначения.Скопировать();
    
    ПараметрыДляПечати = Новый Структура;
	ПараметрыДляПечати.Вставить("Пожелания", 	Пожелания);
	ПараметрыДляПечати.Вставить("Сумма", 		Сумма);
	ПараметрыДляПечати.Вставить("ДатаПисьма", 	ДатаПисьма);
    ДанныеДляПечати.Вставить(0, ПараметрыДляПечати);
    
    Возврат ДанныеДляПечати;
    
КонецФункции

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

Обработку примера внешней печатной формы с передачей параметров через форму можно скачать тут.