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

Программист 1С v8.3 (Управляемые формы) 1С:Розница IT и автоматизация бизнеса
← На главную

При разработке отчетов в конфигурациях на платформе «1С:Предприятие 8.3» часто возникает задача сформировать печатную форму конкретного документа прямо из отчета — например, по двойному клику в поле расшифровки. Если печатная форма встроена в конфигурацию, вызов не вызывает сложностей. Однако если нужный макет вынесен во внешнюю печатную форму (ВПФ), зарегистрированную через подсистему «Дополнительные отчеты и обработки» (БСП), требуется учитывать архитектуру подключаемых команд. Разберем различные подходы к решению этой задачи.

Способ 1. Вызов команды через подсистему подключаемых команд на клиенте

Рассмотрим вариант, когда необходимо эмулировать нажатие команды печати так, как это происходит в форме самого документа. Для этого формируется контекст выполнения команды и вызывается обработчик подсистемы печати.

Разберем по шагам реализацию клиентского вызова:

  1. Получаем форму документа для доступа к структуре ее команд.
  2. Находим нужную команду печати и считываем ее описание через ПодключаемыеКомандыКлиентПовтИсп.ОписаниеКоманды.
  3. Заполняем параметры выполнения команды через ПодключаемыеКомандыКлиентСервер.ШаблонПараметровВыполненияКоманды().
  4. Передаем сформированный массив ссылок на документы в обработчик команды модуля УправлениеПечатьюСлужебныйКлиент.

Посмотрим на пример клиентского кода:


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

Способ 2. Штатное серверное формирование печатной формы через БСП

Проанализируем более универсальный и легковесный способ, который не требует создания клиентской формы документа-владельца. В типовых конфигурациях (таких как «1С:Розница», «1С:Управление торговлей», «1С:ERP») вся работа с внешними обработками централизована в общем модуле ДополнительныеОтчетыИОбработки.

Для выполнения серверной команды ВПФ создается структура параметров и передается в метод ПечатьПоВнешнемуИсточнику или напрямую вызывается метод объекта внешней обработки:


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

Способ 3. Перехват расшифровки в отчете на СКД

Разберем, как связать формирование печатной формы с действиями пользователя в отчете. В отчетах на базе системы компоновки данных для этого используется событие поля табличного документа РезультатОбработкаРасшифровки в форме отчета.

Рассмотрим по шагам логику обработки события:

  1. В обработчике события расшифровки получаем значение выбранного поля через объект ДанныеРасшифровкиКомпоновкиДанных.
  2. Проверяем тип полученного значения. Если это ссылка на нужный документ, отменяем стандартное действие, установив СтандартнаяОбработка = Ложь.
  3. Формируем табличный документ печатной формы на сервере и отображаем его пользователю через метод ТабличныйДокумент.Показать() либо передаем управление в УправлениеПечатьюКлиент.ПечатьДокументов().

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

Важные ограничения и нюансы

При вызове внешних печатных форм необходимо учитывать следующие особенности архитектуры 1С:

  1. Тип команды ВПФ: Если в обработке команда зарегистрирована как «Вызов клиентского метода» (например, форма запрашивает у пользователя ввод дополнительных данных перед печатью), сформировать печатную форму исключительно на сервере не удастся — потребуется открыть саму форму внешней обработки.
  2. Безопасный режим: Внешние обработки по умолчанию выполняются в безопасном режиме, что ограничивает прямой доступ к COM-объектам, операционной системе и внешним библиотекам, если соответствующие разрешения не настроены в профилях безопасности.
  3. Производительность: Прямое получение формы документа через ПолучитьФорму создает избыточные накладные расходы. При регулярном использовании рекомендуется применять вызов серверных методов подсистемы печати БСП или прямое обращение к объекту внешней обработки.
← На главную