При разработке отчетов в конфигурациях на платформе «1С:Предприятие 8.3» часто возникает задача сформировать печатную форму конкретного документа прямо из отчета — например, по двойному клику в поле расшифровки. Если печатная форма встроена в конфигурацию, вызов не вызывает сложностей. Однако если нужный макет вынесен во внешнюю печатную форму (ВПФ), зарегистрированную через подсистему «Дополнительные отчеты и обработки» (БСП), требуется учитывать архитектуру подключаемых команд. Разберем различные подходы к решению этой задачи.
Рассмотрим вариант, когда необходимо эмулировать нажатие команды печати так, как это происходит в форме самого документа. Для этого формируется контекст выполнения команды и вызывается обработчик подсистемы печати.
Разберем по шагам реализацию клиентского вызова:
ПодключаемыеКомандыКлиентПовтИсп.ОписаниеКоманды.ПодключаемыеКомандыКлиентСервер.ШаблонПараметровВыполненияКоманды().УправлениеПечатьюСлужебныйКлиент.Посмотрим на пример клиентского кода:
&НаКлиенте
Процедура Печать(Команда)
Форма = ПолучитьФорму("Документ.ПоступлениеТоваров.Форма.ФормаДокумента");
Кмд = Форма.Команды.ПодменюПечатьОбычное_ПоступлениеТоваровПродажа; // Имя команды из ВПФ
Источник = Новый Структура;
Источник.Вставить("Ссылка", СсылкаНаДокумент);
ИмяКоманды = Кмд.Имя;
АдресНастроек = Форма.ПараметрыПодключаемыхКоманд.АдресТаблицыКоманд;
ОписаниеКоманды = ПодключаемыеКомандыКлиентПовтИсп.ОписаниеКоманды(ИмяКоманды, АдресНастроек);
Контекст = ПодключаемыеКомандыКлиентСервер.ШаблонПараметровВыполненияКоманды();
Контекст.ОписаниеКоманды = Новый Структура(ОписаниеКоманды);
Контекст.Форма = Форма;
Контекст.Источник = Источник;
Контекст.ЭтоФормаОбъекта = Истина;
Контекст.Вставить("ТребуетсяОпределитьСсылки", Истина);
Контекст.Вставить("ТребуетсяЗапись", Ложь);
Контекст.Вставить("ТребуетсяПроведение", Ложь);
Контекст.Вставить("ТребуетсяРаботаСФайлами", Ложь);
МассивСсылок = Новый Массив;
МассивСсылок.Добавить(СсылкаНаДокумент);
Контекст.Вставить("МассивСсылок", МассивСсылок);
ПараметрКоманды = МассивСсылок;
КлиентскийМодуль = ОбщегоНазначенияКлиент.ОбщийМодуль("УправлениеПечатьюСлужебныйКлиент");
Обработчик = Новый ОписаниеОповещения("ОбработчикКоманды", КлиентскийМодуль, Контекст);
ВыполнитьОбработкуОповещения(Обработчик, ПараметрКоманды);
КонецПроцедуры
Проанализируем более универсальный и легковесный способ, который не требует создания клиентской формы документа-владельца. В типовых конфигурациях (таких как «1С:Розница», «1С:Управление торговлей», «1С:ERP») вся работа с внешними обработками централизована в общем модуле ДополнительныеОтчетыИОбработки.
Для выполнения серверной команды ВПФ создается структура параметров и передается в метод ПечатьПоВнешнемуИсточнику или напрямую вызывается метод объекта внешней обработки:
&НаСервере
Функция СформироватьПечатнуюФормуВПФ(СсылкаНаДокумент, СсылкаНаДопОбработку, ИдентификаторКоманды)
// Получаем экземпляр внешней обработки из справочника БСП
ВнешнийОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(СсылкаНаДопОбработку);
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаДокумент);
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(ИдентификаторКоманды);
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// Вызываем стандартную экспортную процедуру печати ВПФ
ВнешнийОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
СтрокаПечатнойФормы = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, ИдентификаторКоманды);
Если СтрокаПечатнойФормы <> Неопределено Тогда
Возврат СтрокаПечатнойФормы.ТабличныйДокумент;
КонецЕсли;
Возврат Неопределено;
КонецФункции
Разберем, как связать формирование печатной формы с действиями пользователя в отчете. В отчетах на базе системы компоновки данных для этого используется событие поля табличного документа РезультатОбработкаРасшифровки в форме отчета.
Рассмотрим по шагам логику обработки события:
ДанныеРасшифровкиКомпоновкиДанных.СтандартнаяОбработка = Ложь.ТабличныйДокумент.Показать() либо передаем управление в УправлениеПечатьюКлиент.ПечатьДокументов().
&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
ПеременныеРасшифровки = ПолучитьЗначениеРасшифровкиНаСервере(Расшифровка);
Если ПеременныеРасшифровки <> Неопределено И ТипЗнч(ПеременныеРасшифровки) = Тип("ДокументСсылка.ПоступлениеТоваров") Тогда
СтандартнаяОбработка = Ложь;
ТабДок = СформироватьПечатнуюФормуВПФ(ПеременныеРасшифровки, СсылкаНаВПФ, "ИдентификаторКомандыПечати");
Если ТабДок <> Неопределено Тогда
ТабДок.Показать("Печатная форма");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
При вызове внешних печатных форм необходимо учитывать следующие особенности архитектуры 1С:
ПолучитьФорму создает избыточные накладные расходы. При регулярном использовании рекомендуется применять вызов серверных методов подсистемы печати БСП или прямое обращение к объекту внешней обработки.