Как установить отборы в стиле СКД во внешней печатной форме или обработке заполнения

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет
← На главную

При разработке внешних печатных форм или обработок заполнения для современных конфигураций на базе 1С:ERP, УТ 11 или КА 2 (построенных на БСП) часто возникает задача предоставить пользователю возможность гибкой фильтрации данных. Например, при печати графика отпусков может потребоваться отобрать сотрудников только по конкретным подразделениям, хотя в самом документе-источнике могут быть указаны сотрудники всей организации. Рассмотрим, как реализовать механизм отборов, аналогичный стандартным отчетам на СКД (Системе компоновки данных), внутри внешней обработки.

Выбор способа запуска внешней обработки

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

Для начала проанализируем функцию СведенияОВнешнейОбработке в модуле объекта. Вместо стандартного использования серверного метода, мы должны указать вариант запуска ОткрытиеФормы. Рассмотрим пример настройки регистрации обработки для документа «График отпусков»:


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

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

Реализация интерфейса отборов на форме

Теперь разберем, как сделать форму «как в СКД». Для этого нам не нужно рисовать таблицу отборов вручную. Мы воспользуемся мощью встроенного КомпоновщикаНастроек.

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

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


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

Программный вывод печатной формы с учетом настроек

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

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


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

Нюансы размещения и регистрации в ERP

Посмотрим на ситуацию, описанную в сообщениях форума относительно «размещения» обработки. В ERP 2.0 при использовании вида ЗаполнениеОбъекта, команда автоматически появляется в меню «Заполнение» (над табличной частью или в шапке документа). Если же вы хотите, чтобы команда была в меню «Печать», используйте вид ПечатнаяФорма.

Если при подключении обработки в интерфейсе неактивно поле «Размещение», это означает, что привязка жестко определена в коде в массиве Назначение. Чтобы разрешить пользователю самостоятельно определять, в каких разделах (например, «Кадры» или «Зарплата») будет видна обработка, её нужно регистрировать как ДополнительныйОтчет или ДополнительнаяОбработка. Однако для печатных форм из документов массив Назначение является предпочтительным способом, так как он обеспечивает контекстный запуск.

Резюмируем: для добавления отборов во внешнюю форму мы переводим её в режим открытия формы, инициализируем КомпоновщикНастроек на базе СКД и программно выводим результат, передавая в него пользовательские настройки. Это превращает обычную печатную форму в мощный аналитический инструмент с привычным для пользователей интерфейсом.

← На главную