Как при нажатии на кнопку «Печать» в 1С:ЗУП 3.1 открыть форму внешней обработки или отчета?

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

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

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

  1. Задать дополнительные параметры формирования (выбрать подписанта, установить период, указать произвольный комментарий).
  2. Выбрать один из нескольких альтернативных макетов или настроить оформление.
  3. Выполнить сопутствующие интерактивные действия (например, отправить данные во внешнюю систему перед печатью).

В этой статье мы подробно разберем, как правильно реализовать такое поведение штатными средствами БСП, избегая типичных ошибок, с которыми сталкиваются разработчики при передаче параметров между клиентским и серверным контекстом.

---

Почему не стоит открывать форму из серверного метода Печать()?

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

Проанализируем ситуацию: процедура Печать() выполняется в контексте сервера. На сервере невозможно использовать клиентские методы, такие как ОткрытьФорму() или ПоказатьВводЗначения(). Попытка обойти это ограничение путем передачи контекста или вызова серверных процедур, конвертирующих объекты, приводит к усложнению кода и ошибкам.

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

---

Вариант 1. Использование режима «ОткрытиеФормы» (Прямой вызов основной формы)

Рассмотрим по шагам первый вариант решения, когда нам нужно при нажатии кнопки «Печать» сразу открыть форму нашей обработки.

Шаг 1. Регистрация внешней печатной формы

В модуле объекта внешней обработки необходимо прописать экспортную функцию СведенияОВнешнейОбработке(). Обратите внимание на колонку Использование в таблице команд — для нее мы указываем значение ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы() (или просто строковое значение "ОткрытиеФормы").


Функция СведенияОВнешнейОбработке() Экспорт

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

КонецФункции

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

Шаг 2. Получение ссылки на документ в форме обработки

Когда пользователь нажмет кнопку «Печать», БСП автоматически откроет основную форму внешней обработки. При этом в параметры открываемой формы передается структура, содержащая массив документов-оснований, для которых была вызвана печать.

Выясним, как правильно прочитать эти параметры. Откроем модуль основной формы нашей обработки и в обработчике события ПриСозданииНаСервере напишем следующий код:


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

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

---

Вариант 2. Использование «ВызовКлиентскогоМетода» (Создание диалогов настройки)

Иногда требуется более сложный сценарий: при нажатии кнопки «Печать» сначала выполнить какую-то быструю проверку на клиенте, затем открыть диалоговую форму настройки параметров печати, получить от пользователя выбор и только после этого сформировать печатную форму и вывести ее на экран в стандартном окне просмотра БСП.

Для решения этой задачи идеально подходит режим Использование = "ВызовКлиентскогоМетода".

Шаг 1. Регистрация команды

В модуле объекта в функции СведенияОВнешнейОбработке() регистрируем команду со значением Использование = "ВызовКлиентскогоМетода":

НоваяКоманда.Использование = "ВызовКлиентскогоМетода"; Шаг 2. Реализация клиентского метода в модуле формы

При использовании этого режима БСП будет искать в модуле основной формы обработки экспортную клиентскую процедуру Печать() с жестко заданными параметрами.

Посмотрим на пример реализации этой процедуры:


&НаКлиенте
Процедура Печать(ИдентификаторКоманды, ОбъектыНазначенияМассив) Экспорт
    
    // Наша цель — открыть вспомогательную форму "ФормаНастройкиПараметров" нашей внешней обработки.
    // Проблема: ВПФ подключается динамически, и ее имя в системе генерируется автоматически (например, ВнешняяОбработка.ПодключеннаяВПФ_123).
    // Мы не можем жестко прописать "ВнешняяОбработка.МояПечатнаяФорма.Форма.ФормаНастройки".
    // Решим эту проблему путем динамического вычисления имени обработки из пути текущей формы.
    
    ЧастиИмени = СтрРазделить(ЭтотОбъект.ИмяФормы, ".");
    ИмяВнешнейОбработки = ЧастиИмени[0] + "." + ЧастиИмени[1]; // Получим строку вида "ВнешняяОбработка.ИмяКомпиляции"
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ОбъектыНазначения", ОбъектыНазначенияМассив);
    
    // Задаем описание оповещения для обработки результатов закрытия диалогового окна
    ОписаниеОповещения = Новый ОписаниеОповещения("ПечатьЗавершение", ЭтотОбъект, ОбъектыНазначенияМассив);
    
    // Открываем форму ввода параметров модально (блокируя интерфейс)
    ОткрытьФорму(
        ИмяВнешнейОбработки + ".Форма.ФормаНастройки", 
        ПараметрыФормы, 
        ЭтотОбъект, 
        , 
        , 
        , 
        ОписаниеОповещения, 
        РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс
    );
    
КонецПроцедуры

Шаг 3. Логика формы настроек и возврат результата

Во вспомогательной форме настройки параметров (в нашем примере это ФормаНастройки) пользователь выбирает нужные опции. При нажатии на кнопку «ОК» мы собираем настройки в структуру и закрываем форму, возвращая эти данные в вызвавшую форму:


&НаКлиенте
Процедура КомандаОК(Команда)
    
    НастройкиПечати = Новый Структура;
    НастройкиПечати.Вставить("ВыводитьПодписи", Объект.ВыводитьПодписи);
    НастройкиПечати.Вставить("ПериодРегистрации", Объект.ПериодРегистрации);
    НастройкиПечати.Вставить("ДополнительныйТекст", Объект.ДополнительныйТекст);
    
    Закрыть(НастройкиПечати);
    
КонецПроцедуры

Шаг 4. Обработка закрытия формы и генерация документа

Вернемся в модуль основной формы обработки. Здесь должна быть объявлена процедура-оповещение ПечатьЗавершение(), которая примет настройки от пользователя и инициирует стандартный вывод на печать.


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

---

Особенности для актуальных версий БСП 3.1.9+ (Современные релизы ЗУП 3.1)

Проанализируем важный нюанс совместимости. В современных версиях ЗУП 3.1 используется обновленная подсистема печати БСП. Если вы планируете передавать результаты интерактивной работы в стандартное окно предварительного просмотра БСП после закрытия формы параметров, инициализацию структуры параметров вывода необходимо делать строго определенным образом.

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


ПараметрыОткрытия = Новый Структура("ИсточникДанных, ПараметрыИсточника, КоллекцияПечатныхФорм");

Если этот ключ отсутствует, платформа при попытке вывести печатные формы на экран может выдать системную ошибку о несовместимости типов параметров, и формирование документа аварийно прервется.

---

Резюме

Мы рассмотрели правильные архитектурные подходы БСП для переопределения стандартного поведения кнопки «Печать»:

  1. Используйте режим «ОткрытиеФормы», если вам нужно просто показать кастомный интерфейс вместо вывода печатного листа.
  2. Используйте режим «ВызовКлиентскогоМетода», если вы хотите организовать цепочку: «Нажатие кнопки Печать -> Сбор параметров в диалоговом окне -> Проверки на клиенте -> Серверное формирование документа -> Стандартный вывод БСП».
  3. Для получения ссылок на документы внутри формы внешней обработки используйте чтение параметра Параметры.ОбъектыНазначения на сервере при создании формы.
← На главную