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