Иногда возникает необходимость формирования отчётов с возможностью гибко устанавливать отборы по регистраторам для регистров, по которым формируется отчёт. Данная обработка предоставляет удобный интерфейс для реализации подобного механизма.
Обработку необходимо загрузить в конфигурацию и провести ряд несложных манипуляций в отчётах, для которых требуется данный механизм. А именно:
1) Разместить на форме отчёта кнопку для вызова формы выбора регистраторов, наподобие того, как это сделано на фото в данной публикации.
2) В модуле формы или объекта отчёта задайте глобальную переменную для хранения массива регистраторов:
Перем МассивРегистраторов;
3) В обработчике нажатия кнопки реализовать код, аналогичный этому:
// Формируем список регистров для отбора регистраторов
СписокРегистров = Новый СписокЗначений;
СписокРегистров.Добавить("РегистрыСведений.ИмяРегистра", "ИмяРегистра");
НастройкаОтбораРегистраторов = Обработки.НастройкаОтбораРегистраторов.Создать();
// Уникальное имя под которым будут храниться настройки регистраторов для данного отчета
НастройкаОтбораРегистраторов.УникальноеИмяНастройки = "ИмяОтчета_Регистраторы";
// Список регистров по которым нужно отобрать регистраторы для отчета
НастройкаОтбораРегистраторов.СписокИменРегистров = СписокРегистров;
ФормаНастроекРегистров = НастройкаОтбораРегистраторов.ПолучитьФорму("Форма");
Результат = ФормаНастроекРегистров.ОткрытьМодально();
Если Результат <> Неопределено Тогда
МассивРегистраторов = Результат;
КонецЕсли;
Как видно, в первых строках кода мы формируем список значений с именами регистров, по которым будут отбираться регистраторы.
Также не поленитесь задать УникальноеИмяНастройки, если механизм будет использоваться в нескольких отчётах, чтобы настройки разных отчётов не перетирали друг друга. Имя может быть любым, но я для себя выработал удобную комбинацию из имени отчёта и названия механизма.
4) В обработчике события ПриОткрытии() добавьте блок кода отвечающий за подгрузку ранее установленных настроек регистраторов для отчета:
МассивТиповРегистраторов = РегистрыСведений.ИмяРегистра.СоздатьНаборЗаписей().Отбор.Регистратор.ТипЗначения.Типы();
МассивРегистраторов = Новый Массив;
Для Каждого ТипРегистратора Из МассивТиповРегистраторов Цикл
Для Каждого МетаданныеДокумента Из Метаданные.Документы Цикл
Если Тип("ДокументСсылка." + МетаданныеДокумента.Имя) = ТипРегистратора Тогда
МассивРегистраторов.Добавить(ТипРегистратора);
Прервать;
КонецЕсли;
КонецЦикла;
КонецЦикла;
СтруктураНастроек = ВосстановитьЗначение("ИмяОтчета_Регистраторы");
Если СтруктураНастроек <> Неопределено
И ТипЗнч(СтруктураНастроек) = Тип("Структура") Тогда
Для Каждого элСтруктуры Из СтруктураНастроек Цикл
ИндексРегистратора = МассивРегистраторов.Найти(Тип("ДокументСсылка." + элСтруктуры.Ключ));
Если ИндексРегистратора <> Неопределено И НЕ элСтруктуры.Значение Тогда
МассивРегистраторов.Удалить(ИндексРегистратора);
КонецЕсли;
КонецЦикла;
КонецЕсли;
5) Ну и вишенкой на торте - передайте сформированный массив регистраторов в параметры запроса:
Запрос.УстановитьПараметр("ТипыРегистраторов", МассивРегистраторов);
Тестировалось на версиях платформ: 8.3.10.2650, 8.3.17.1549, но ввиду его универсальности никаких ограничений по платформам и конфигурациям на обычных формах не вижу.