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