Как настроить фильтрацию подчиненного справочника в СКД при использовании отбора «В списке»?

Программист 1С v8.3 (Обычные формы)
← На главную

При разработке отчетов на базе Системы компоновки данных (СКД) программисты часто сталкиваются с задачей организации удобных отборов. Типичный сценарий: есть справочник Контрагенты и подчиненный ему справочник ДоговорыКонтрагентов. Мы ожидаем, что при выборе конкретного контрагента список доступных договоров автоматически ограничится только теми, которые принадлежат этому владельцу. Однако на практике часто возникает ситуация, когда при виде сравнения «Равно» всё работает идеально, но стоит пользователю выбрать вид сравнения «В списке», как фильтрация ломается, и платформа предлагает выбрать договор из полного списка всех существующих записей. Рассмотрим, почему это происходит и как решить данную проблему.

Анализ технической причины проблемы

Разберем ситуацию подробно. Механизм, отвечающий за ограничение выбора в 1С, называется Связи параметров выбора (ChoiceParameterLinks). В настройках набора данных СКД для поля ДоговорКонтрагента обычно указывается связь по владельцу с полем Контрагент. Проблема заключается в особенностях реализации интерфейса платформы (особенно это актуально для Обычных форм и ранних версий Управляемых форм):

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

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


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    VL_ОборотыПоБюджетамОбороты.Регистратор.Контрагент КАК Контрагент,
    VL_ОборотыПоБюджетамОбороты.Регистратор.ДоговорКонтрагента КАК ДоговорКонтрагента,
    VL_ОборотыПоБюджетамОбороты.СуммаОборот КАК Сумма
ПОМЕСТИТЬ ВТ_Данные
ИЗ
    РегистрНакопления.VL_ОборотыПоБюджетам.Обороты(&НачалоПериода, &КонецПериода, Регистратор, ) КАК VL_ОборотыПоБюджетамОбороты;

Даже если в самом запросе поля определены верно, настройки СКД требуют дополнительного внимания к связям параметров.

Решение 1: Настройка связей параметров выбора в схеме СКД

Первым делом проверим настройки на уровне схемы компоновки данных. Это наиболее «правильный» путь, который не требует написания кода. Выполним следующие шаги:

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

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

Решение 2: Использование быстрых отборов на форме отчета

Если стандартный механизм СКД в пользовательских настройках работает некорректно, мы можем вынести эти отборы непосредственно на форму отчета. Рассмотрим, как это упрощает ситуацию:

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

Решение 3: Программная обработка события «НачалоВыбора»

Если мы работаем в Управляемом приложении, у нас есть гораздо больше инструментов. Мы можем программно перехватить момент выбора договора и передать туда нужные параметры, включая список контрагентов. Разберем пример кода для обработчика события НачалоВыбора на форме отчета:


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

В данном примере мы используем параметр Отбор, который платформа понимает автоматически при открытии формы выбора справочника. Если ЗначениеКонтрагента является массивом (списком), и форма выбора справочника поддерживает отбор по списку, фильтрация отработает корректно.

Решение 4: Ограничение функционала для стабильности данных

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

  1. Оставлять для поля Контрагент вид сравнения только «Равно», если предполагается выбор договоров.
  2. Если пользователю необходимо видеть данные по нескольким контрагентам сразу, обучить его сначала выбирать список контрагентов, а затем, если нужно уточнение по договорам, добавлять их в список без предварительной фильтрации (по коду или наименованию).
  3. Использовать механизм «Быстрого выбора» в настройках поля справочника, что позволяет выбирать значения из выпадающего списка, который лучше поддерживает связи параметров.

Выяснив причину, мы понимаем, что это не ошибка в коде или запросе, а архитектурная особенность обработки модальных окон списка значений. При переходе на современные релизы платформы 8.3 и использовании Управляемых форм, данные проблемы минимизируются за счет более гибкой настройки параметров выбора непосредственно в свойствах реквизитов метаданных.

← На главную