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