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

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

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

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

Почему отбор пуст в "ПриСозданииНаСервере()", но появляется в "ПриОткрытии()"?

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

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

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

Откуда берутся скрытые параметры выбора в СКД?

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

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

Как локализовать проблему с помощью отладчика

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

Установим точку останова в самом начале процедуры ПриСозданииНаСервере() в модуле формы выбора справочника Номенклатура. В момент остановки программы откроем окно «Вычислить выражение» (Shift+F9) и исследуем свойство Параметры. Нас интересуют три ключевые коллекции:

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


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

Анализ объекта ПараметрыВыбораСписка в табло отладки поможет точно понять, какое именно значение и по какому полю накладывает ограничение на динамический список.

Варианты решения проблемы

В зависимости от архитектуры вашей конфигурации и требований к поведению системы, выберите один из следующих способов устранения нежелательного отбора.

Способ 1. Очистка параметров редактирования в схеме СКД

Если отбор наследуется из схемы компоновки данных и он там не нужен, выполните следующие шаги:

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

Способ 2. Программный сброс параметров в форме выбора

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

Для реализации этого решения перейдем в модуль формы выбора справочника и добавим код очистки коллекций в процедуру ПриСозданииНаСервере():


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

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

← На главную