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