Как использовать команды печати БСП для запуска форм выбора параметров

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

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

Постановка задачи и анализ механизмов

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

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

Шаг 1. Описание команды печати

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


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

В данном случае, когда пользователь нажмет на кнопку в меню «Печать», система не пойдет сразу в модуль менеджера, а будет искать клиентскую процедуру ОткрытьФормуПараметровПечати.

Шаг 2. Реализация клиентского обработчика

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

Рассмотрим пример реализации функции открытия формы в модуле формы или общем модуле:


// Процедура-обработчик команды печати
Процедура ОткрытьФормуПараметровПечати(ПараметрыПечати, ЭтаФорма) Экспорт
    
    // ПараметрыПечати — это структура, которую нам передает БСП.
    // Она содержит: 
    // .ОбъектыПечати — массив ссылок на документы
    // .ИдентификаторКоманды — имя нашей команды
    
    ПараметрыФормы = Новый Структура;
    ПараметрыФормы.Вставить("ОбъектыПечати", ПараметрыПечати.ОбъектыПечати);
    ПараметрыФормы.Вставить("ИдентификаторКоманды", ПараметрыПечати.ИдентификаторКоманды);
    
    // Открываем нашу вспомогательную форму
    ОткрытьФорму("Отчет.МойТестовыйОтчет.Форма.ФормаНастройкиПараметров", 
        ПараметрыФормы, 
        ЭтаФорма);
        
КонецПроцедуры

Шаг 3. Завершение процесса печати из вспомогательной формы

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

Разберем, как это реализовать в модуле нашей вспомогательной формы настроек. Нам нужно вызвать метод УправлениеПечатьюКлиент.ВыполнитьКомандуПечати. Посмотрим на пример кода кнопки «Печать» в этой форме:


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

Шаг 4. Обработка параметров на сервере

Теперь проанализируем, как эти данные попадут в финальный отчет. В модуле менеджера (в данном примере это Отчет.МойТестовыйОтчет) должна быть стандартная процедура Печать. В ней мы и извлечем наши настройки из параметра ДополнительныеПараметры.


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

Важные нюансы и отличия

Рассмотрим несколько ключевых моментов, которые помогут избежать ошибок при реализации:

  1. Различие подсистем: Важно понимать разницу между подсистемами «Печать» и «Подключаемые команды». Если вам нужно именно сформировать печатный лист (MXL), используйте подсистему «Печать». Если же нужно просто открыть какую-то форму для работы с данными без вывода на печать — лучше использовать «Подключаемые команды».
  2. Параметр МенеджерПечати: В качестве менеджера печати может выступать любой объект (документ, справочник, отчет, обработка), в модуле менеджера которого есть процедура Печать. Даже если сам объект не имеет макетов, он может служить «контейнером» для логики формирования печатных форм.
  3. Работа в расширениях: Если вы добавляете команду через расширение, используйте аннотацию &После("ДобавитьКомандыПечати"). При этом в параметре МенеджерПечати не забывайте указывать полные имена объектов с учетом префиксов вашего расширения, если объекты созданы в нем.
  4. Структура ПараметрыПечати: При вызове клиентского обработчика БСП передает в него структуру, в которой ОбъектыПечати — это всегда массив ссылок, даже если печать вызвана для одного документа.

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

← На главную