Каждый разработчик 1С рано или поздно сталкивается с ситуацией, когда в управляемой форме выбора динамического списка (например, справочника Номенклатура) внезапно появляется нежелательный отбор. При этом стандартные методы поиска не дают результатов: глобальный поиск по конфигурации молчит, в настройках динамического списка в конфигураторе чисто, а пользовательские настройки сброшены на стандартные. Более того, при замере производительности никаких подозрительных процедур не вызывается.
В этой статье мы подробно разберем, почему возникает такое поведение, как устроен жизненный цикл передачи параметров из Системы компоновки данных (СКД) в форму выбора и какими способами можно быстро локализовать и устранить эту проблему.
Для начала проанализируем поведение платформы «1С:Предприятие» при инициализации управляемой формы выбора. Разработчики часто пытаются поймать отбор в обработчике события ПриСозданииНаСервере(), выводя в табло значение Список.Отбор. Но на этом этапе коллекция отборов оказывается абсолютно пустой. Однако уже в следующем обработчике — клиентском событии ПриОткрытии() — в списке неожиданно регистрируется активный элемент отбора.
Выясним причину этого явления. Дело в том, что процесс инициализации формы выбора и динамического списка проходит несколько последовательных фаз:
ПриСозданииНаСервере(). На этом шаге контекст формы только создается. Платформа еще не успела связать переданные параметры вызова с настройками динамического списка. Коллекция Список.Отбор пуста.ПриСозданииНаСервере(), но до передачи управления на клиентскую сторону, платформа в автоматическом режиме анализирует структуру переданных параметров формы. К ним относятся системные структуры: Параметры.Отбор, Параметры.ПараметрыВыбора и Параметры.СвязиПараметровВыбора. На основе этих данных платформа самостоятельно модифицирует отбор динамического списка.ПриОткрытии(). К моменту выполнения этого обработчика автоматическая настройка списка платформой уже завершена. Именно поэтому здесь мы уже видим заполненный элемент отбора.Когда форма выбора открывается из поля отбора отчета на СКД, источником ограничений выступают параметры выбора компоновки данных. Рассмотрим подробнее, как и откуда они могут неявно наследоваться:
Номенклатура из табличной части документа), СКД автоматически считывает свойства этого реквизита из дерева метаданных конфигурации. Если у исходного реквизита в конфигураторе заполнены свойства «Параметры выбора» или «Связи параметров выбора», СКД унаследует эти свойства для поля отчета. При интерактивном выборе значения в отчете компоновщик настроек автоматически передаст эти ограничения в форму выбора через механизм ПолучитьПараметрыВыбора().Номенклатура). В колонке «Параметры редактирования» могут быть жестко заданы параметры выбора, которые и накладывают злополучный фильтр.Для того чтобы точно определить, какие именно параметры передаются в форму выбора, проанализируем структуру параметров при создании формы. Посмотрим на практический пример отладки.
Установим точку останова в самом начале процедуры ПриСозданииНаСервере() в модуле формы выбора справочника Номенклатура. В момент остановки программы откроем окно «Вычислить выражение» (Shift+F9) и исследуем свойство Параметры. Нас интересуют три ключевые коллекции:
Параметры.ОтборПараметры.ПараметрыВыбораПараметры.СвязиПараметровВыбораЕсли в одной из этих коллекций содержатся элементы, значит, источник проблемы находится на стороне вызывающего объекта (в данном случае — отчета СКД). Мы можем программно увидеть, как именно СКД формирует эти параметры, обратившись к компоновщику настроек отчета. Рассмотрим пример кода, который позволяет извлечь параметры выбора из доступного поля отбора компоновщика:
НастройкиКД = Отчет.КомпоновщикНастроек.Настройки;
// Получаем доступное поле отбора (индекс указан для примера)
ДоступнаяНастройка = НастройкиКД.ДоступныеПоляОтбора.Элементы[9];
// Извлекаем параметры выбора, которые будут переданы в форму
ПараметрыВыбораСписка = ДоступнаяНастройка.ПолучитьПараметрыВыбора();
Анализ объекта ПараметрыВыбораСписка в табло отладки поможет точно понять, какое именно значение и по какому полю накладывает ограничение на динамический список.
В зависимости от архитектуры вашей конфигурации и требований к поведению системы, выберите один из следующих способов устранения нежелательного отбора.
Если отбор наследуется из схемы компоновки данных и он там не нужен, выполните следующие шаги:
Бывают ситуации, когда параметры выбора в метаданных или СКД прописаны корректно и необходимы для работы других механизмов системы, но конкретно при открытии данной формы выбора их требуется проигнорировать. В этом случае мы можем прибегнуть к программной очистке параметров "на лету" до того, как платформа успеет применить их к динамическому списку.
Для реализации этого решения перейдем в модуль формы выбора справочника и добавим код очистки коллекций в процедуру ПриСозданииНаСервере():
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем наличие параметров и очищаем их, чтобы предотвратить автоотбор
Если Параметры.Свойство("ПараметрыВыбора") Тогда
// Можно очистить коллекцию полностью
Параметры.ПараметрыВыбора.Очистить();
КонецЕсли;
Если Параметры.Свойство("СвязиПараметровВыбора") Тогда
Параметры.СвязиПараметровВыбора.Очистить();
КонецЕсли;
Если Параметры.Свойство("Отбор") Тогда
// Если нужно удалить конкретный отбор, например, по признаку "Услуга"
Если Параметры.Отбор.Свойство("Услуга") Тогда
Параметры.Отбор.Удалить("Услуга");
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Этот простой и надежный способ гарантирует, что динамический список откроется без лишних ограничений, при этом вам не придется перестраивать логику работы СКД или изменять глобальные свойства реквизитов в метаданных конфигурации.