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

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

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

Основная проблема, с которой сталкиваются разработчики — это попытка создать команду в дереве метаданных объекта. Такой подход приводит к появлению двух подменю "Печать", одно из которых платформенное, а другое — от БСП. Правильный путь — регистрировать все команды печати программно.

Рассмотрим пошаговый алгоритм, как правильно реализовать печатную форму с предварительным открытием формы для ввода параметров.

Шаг 1. Создание формы для ввода параметров

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

Для нашего примера создадим новую форму у справочника Учащиеся с названием ФормаПараметровСправкаОбУспеваемости.

  1. Создайте новую форму для вашего объекта.
  2. На форме разместите все необходимые реквизиты для ввода параметров (например, поля для ввода дат, флажки, поля выбора и т.д.).
  3. Важный момент: у формы необходимо создать основной реквизит или параметр формы, через который мы будем получать контекст печати (массив объектов, для которых нужно выполнить печать). В примере из форума автор создал ключевой параметр формы ДанныеДляПечати.
  4. Добавьте на форму кнопку, например, "Сформировать" или "Печать", которая будет запускать процесс формирования печатной формы после ввода всех параметров.

Шаг 2. Регистрация команды печати в модуле менеджера

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

Когда мы указываем этот параметр, стандартный механизм печати БСП прерывается, и управление передается указанной клиентской процедуре. Это позволяет нам перехватить команду печати и выполнить свои действия, а именно — открыть форму параметров.

Откроем модуль менеджера справочника Учащиеся и добавим код в процедуру ДобавитьКомандыПечати:


Процедура ДобавитьКомандыПечати(КомандыПечати) Экспорт
    // ... другие команды печати

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

КонецПроцедуры

Здесь УчащиесяКлиент — это имя общего клиентского модуля, а ОткрытьДополнительнуюФормуПечатиСправкаОбУспеваемости — имя экспортной функции в этом модуле.

Шаг 3. Создание клиентского обработчика

Теперь создадим общий модуль УчащиесяКлиент с установленными флагами "Клиент (управляемое приложение)" и "Вызов сервера". В нем разместим функцию, которую мы указали в качестве обработчика на предыдущем шаге.

Эта функция получает на вход структуру ПараметрыПечати, которая содержит массив объектов для печати. Наша задача — извлечь этот массив и передать его в созданную нами форму параметров.


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

Шаг 4. Запуск печати из формы параметров

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

Для этого в обработчике команды "Печать" на форме параметров используем процедуру УправлениеПечатьюКлиент.ВыполнитьКомандуПечати.


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

После вызова этой процедуры БСП инициирует серверный вызов процедуры Печать в модуле менеджера справочника Учащиеся.

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

Последний шаг — это доработка серверной процедуры Печать в модуле менеджера объекта. Дополнительные параметры, которые мы передали с клиента, будут доступны в структуре ПараметрыВывода.ДополнительныеПараметры.


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

Таким образом, мы реализовали полный цикл: перехватили команду печати, показали пользователю форму для ввода данных, а затем инициировали стандартный процесс печати, передав в него собранные параметры.

← На главную