Как настроить свою форму выбора с фильтром для поля в системе компоновки данных (СКД)

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

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

Метод 1: Настройка свойств поля в схеме компоновки данных

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

Откроем схему компоновки данных нашего отчета и перейдем на закладку «Наборы данных». Выберем нужное поле (в нашем примере это Город). В колонке «Параметры редактирования» (или в нижней части окна свойств поля) мы увидим несколько ключевых свойств:

  1. Форма выбора: Здесь можно явно указать, какая именно форма справочника Города должна открываться, когда пользователь нажимает кнопку выбора в настройках отчета. Это полезно, если вы создали специальную форму с особым оформлением.
  2. Параметры выбора: Этот механизм позволяет передать фиксированные отборы в форму выбора. Например, если нам нужно показывать только города определенного региона, мы можем добавить параметр с именем Отбор.Регион и указать конкретное значение.
  3. Связи параметров выбора: Это более продвинутый инструмент. Если в отчете пользователь сначала выбирает Страну, а затем Город, мы можем связать поле Город с полем Страна. Тогда в форме выбора городов автоматически отобразятся только те, которые относятся к выбранной стране.

Проанализируем ситуацию, когда нам нужно программно, но без изменения формы справочника, ограничить список. Для этого в свойстве «Параметры выбора» можно использовать предопределенную структуру. Если мы укажем Отбор.Статус(Значение.Перечисление.СтатусыГородов.Активен), платформа сама применит этот фильтр при открытии формы.

Метод 2: Использование «Списка выбора» для небольших наборов данных

Если список городов, из которых пользователь должен выбирать, невелик и может быть сформирован заранее, рассмотрим вариант использования свойства «Список выбора». Это позволяет пользователю выбирать значение из выпадающего списка прямо в строке отбора, не открывая модальное окно справочника.

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

  1. В схеме СКД для поля Город установим флаг «Доступные значения» или заполним «Список выбора».
  2. Если список должен быть динамическим, мы можем заполнить его программно в модуле отчета перед компоновкой.

Посмотрим на пример кода в модуле объекта отчета, который заполняет список выбора для параметра или поля:


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

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

Метод 3: Программный перехват события начала выбора в форме отчета

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

Рассмотрим ситуацию в контексте Управляемых форм. Нам нужно найти элемент, который отображает пользовательские настройки компоновщика. Обычно это таблица с именем КомпоновщикНастроекПользовательскиеНастройки. Выясним, как перехватить нажатие кнопки выбора в этой таблице.

Для этого элемента формы нужно создать обработчик события НачалоВыбора. Внутри обработчика мы проверим, для какого именно поля вызван подбор, и программно вызовем форму с нужными параметрами.


&НаКлиенте
Процедура КомпоновщикНастроекПользовательскиеНастройкиПередНачаломИзменения(Элемент, Отказ)
    // В управляемых формах для пользовательских настроек СКД 
    // часто используется специфический подход через обработку события начала выбора
КонецПроцедуры

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

Важный момент: При использовании этого метода необходимо учитывать, что в КомпоновщикеНастроек пользовательские настройки могут быть представлены в виде дерева или списка. Нужно точно определять идентификатор настройки, чтобы не подменить выбор для другого поля.

Метод 4: Использование связей параметров выбора в Наборах данных

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

Предположим, в вашем отчете есть два отбора: Регион и Город. Чтобы при выборе города система показывала только города выбранного региона, выполним следующее:

  1. В схеме СКД выберем поле Город.
  2. В свойстве «Связи параметров выбора» добавим новую связь.
  3. В колонке «Параметр выбора» укажем Отбор.Владелец (или Отбор.Регион, в зависимости от структуры вашего справочника).
  4. В колонке «Выражение» выберем Регион (это имя поля из доступных полей компоновки).

Теперь система автоматически будет «подсматривать», что выбрано в поле Регион в текущих настройках отчета, и передавать это значение как фильтр в форму выбора города. Это наиболее надежный и поддерживаемый метод, который работает даже во внешних отчетах без создания модулей форм.

Заключение и рекомендации

Мы проанализировали различные подходы к кастомизации отборов в СКД. Подведем итоги нашей совместной работы:

1. Если вам нужно просто ограничить список по какому-то статичному признаку (например, «только неудаленные»), используйте «Параметры выбора» в схеме СКД.

2. Если выбор одного поля зависит от значения другого поля в отчете — ваш выбор «Связи параметров выбора».

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

Использование стандартных механизмов СКД (параметры и связи) предпочтительнее, так как это сохраняет гибкость отчета: настройки будут корректно работать при сохранении вариантов отчета пользователем и при использовании отчета в составе других подсистем или консолей отчетов.

← На главную