Как правильно установить программный отбор в форме списка справочника 1С?

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

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

Анализ синтаксической ошибки

Рассмотрим распространенный пример ошибочного кода в обработчике ПередОткрытием:


// Ошибочный вариант обращения:
ЭтаФорма.СправочникСписок.Отбор.Ссылка.ВидСравнения = ВидСравнения.НеВСписке;
ЭтаФорма.СправочникСписок.Ссылка.Значение = Сп; // Ошибка: пропущено свойство Отбор
ЭтаФорма.СправочникСписок.Ссылка.Использование = Истина; // Ошибка: пропущено свойство Отбор

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

Исправленный и синтаксически верный вариант выглядит следующим образом:


ЭтаФорма.СправочникСписок.Отбор.Ссылка.ВидСравнения = ВидСравнения.НеВСписке;
ЭтаФорма.СправочникСписок.Отбор.Ссылка.Значение = Сп;
ЭтаФорма.СправочникСписок.Отбор.Ссылка.Использование = Истина;

Важность порядка присвоения свойств отбора

Помимо синтаксиса обращения к коллекции Отбор, критически важна последовательность установки свойств конкретного элемента отбора:

  1. Первым шагом необходимо задать ВидСравнения. По умолчанию для элемента отбора установлен вид сравнения ВидСравнения.Равно, который принимает только одиночное значение.
  2. Вторым шагом устанавливается Значение. Если попытаться передать СписокЗначений до изменения вида сравнения на НеВСписке или ВСписке, платформа вызовет ошибку времени выполнения «Неверный тип значения».
  3. Третьим шагом взводим флаг Использование = Истина.

Оптимизация выборки данных для отбора

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

1. Использование ключевого слова РАЗЛИЧНЫЕ. Если не указать РАЗЛИЧНЫЕ в тексте запроса, в результат попадут дублирующиеся записи. Это приведет к переполнению СпискаЗначений и лишней нагрузке на СУБД при формировании запроса отбора.

2. Фильтрация незаполненных значений. Если реквизит объекта не заполнен, в выборку могут попасть пустые ссылки. Чтобы исключить их, добавляйте в запрос проверку заполнения через условие ГДЕ ... Заполнено или проверку на равенство пустой ссылке.

Разберем итоговый правильный и оптимизированный пример кода:


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

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

Различие между НастройкаОтбора и Отбор

Обратите внимание на разницу между объектами ЭлементыФормы.СправочникСписок.НастройкаОтбора и ЭтаФорма.СправочникСписок.Отбор:

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

← На главную