Как передать параметры формы документа во внешнюю печатную форму БСП?

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

Рассмотрим распространенную проблему, с которой сталкиваются разработчики при создании внешних печатных форм (ВПФ) на базе Библиотеки Стандартных Подсистем (БСП) в конфигурациях на управляемых формах (например, «1С:Розница 2.1», «1С:Управление торговлей 11» и др.).

Суть проблемы и ограничения БСП

В типовых конфигурациях некоторые документы содержат динамические данные, которые присутствуют исключительно на форме документа и не сохраняются в объекте базы данных. Яркий пример — документ РасходныйКассовыйОрдер, в форме которого пользователь перед печатью инкассаторской ведомости заполняет опись сдаваемых купюр различного номинала.

В типовом модуле менеджера процедура печати принимает структуру параметров:


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

При использовании стандартного серверного механизма регистрации ВПФ с типом команды ВызовСерверногоМетода, подсистема БСП строго регламентирует сигнатуру процедуры Печать в модуле объекта внешней обработки:


Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
    // Параметр ПараметрыПечати здесь отсутствует!
КонецПроцедуры

Так как данные формы (например, реквизит ТаблицаОписьСдаваемыхНаличныхДенег) отсутствуют в объекте ИБ, вытащить их из базы на сервере невозможно. Проанализируем способы решения этой задачи.

Способ 1. Использование клиентского метода вызова (ВызовКлиентскогоМетода)

Чтобы получить доступ к контексту открытой формы документа, необходимо перевести команду внешней печатной формы на клиентский вызов.

Разберем реализацию по шагам:

  1. В функции СведенияОВнешнейОбработке() модуля объекта ВПФ указываем тип команды ВидКомандыВызовКлиентскогоМетода:

    
    СтрокаКоманды.Использование = ДополнительныеОтчетыИОбработкиКлиент.ВидКомандыВызовКлиентскогоМетода();
    
  2. В модуле формы внешней обработки создаем экспортную процедуру Печать:

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

Способ 2. Запрос недостающих данных в форме внешней обработки

Если печать запускается из формы списка документов, форма объекта может быть вообще не открыта, и считывать данные будет не откуда.

В таком случае рекомендуется следующий алгоритм:

  1. При вызове команды печатной формы проверяем наличие данных во временном контексте.
  2. Если данные не найдены (печать из списка), ВПФ открывает собственное небольшое диалоговое окно для ввода количества купюр/номиналов.
  3. После ввода данных пользователем кнопка «Печать» формирует и выводит готовый табличный документ.

Способ 3. Альтернативный подход — Расширение конфигурации

Если внесение доработок возможно не только через механизмы ВПФ, но и через расширения платформы 1С, этот подход окажется наиболее чистым и простым.

В расширении конфигурации можно перехватить команду печати формы документа или модуль менеджера с помощью аннотаций &Вместо или &После:


&После("СформироватьПечатнуюФормуПрепроводительнаяВедомостьНакладнаяКСумке")
Функция Расш_СформироватьПечатнуюФормуПрепроводительнаяВедомостьНакладнаяКСумке(МассивОбъектов, ОбъектыПечати, ПараметрыПечати)
    // В расширении параметр ПараметрыПечати доступен в полном объеме
    // Можно сформировать свой собственный макет с учетом данных формы
КонецФункции

Резюме: При необходимости передать временные данные формы в макет печатной формы используйте типы команд ВызовКлиентскогоМетода с поиском контекста активного окна, либо создавайте диалоговые формы в самой ВПФ. При наличии возможности используйте расширения конфигурации для прямого перехвата процедур печати.

← На главную