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

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