Как настроить отбор в форме выбора справочника, чтобы скрыть помеченные на удаление элементы?

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

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

Решение для обычных форм (ОФ)

В обычных формах попытка напрямую присвоить значение полю отбора, например Отбор.ПометкаУдаления = Ложь, приведет к ошибке "Поле объекта недоступно для записи". Это связано с тем, что объект Отбор в обычных формах представляет собой коллекцию элементов, и для изменения конкретного фильтра необходимо использовать специальный метод.

Рассмотрим пошагово, как программно открыть форму выбора с установленным фильтром в обработчике события НачалоВыбора:


Процедура ИмяРеквизитаНачалоВыбора(Элемент, СтандартнаяОбработка)
    
    // Отключаем стандартное открытие формы, так как будем открывать ее программно
    СтандартнаяОбработка = Ложь;
    
    // Получаем форму выбора нужного справочника
    // Передаем Элемент в качестве владельца, чтобы выбранное значение подставилось автоматически
    ФормаВыбора = Справочники.ТипыЦенНоменклатуры.ПолучитьФормуВыбора(, Элемент);
    
    // Обязательно устанавливаем режим выбора
    ФормаВыбора.РежимВыбора = Истина;
    
    // Устанавливаем отбор. Метод Установить(Значение, Использование) 
    // позволяет корректно настроить фильтрацию
    ФормаВыбора.Отбор.ПометкаУдаления.Установить(Ложь);
    
    // Открываем форму
    ФормаВыбора.Открыть();
    
КонецПроцедуры

Проанализируем этот код. Мы используем метод Установить(), который не только присваивает значение Ложь, но и автоматически включает использование этого элемента отбора. Если нам нужно, чтобы пользователь не мог самостоятельно отключить этот фильтр в открывшемся окне, мы можем дополнительно настроить свойство Доступность элемента отбора.

Решение для управляемых форм (УФ)

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

Способ 1: Свойства элемента формы (без кода)

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

Способ 2: Программное открытие (если нужна сложная логика)

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


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

Обратите внимание, что в управляемых формах ключ "Отбор" в структуре параметров является зарезервированным. Платформа автоматически ищет этот ключ и применяет вложенную структуру к динамическому списку основной таблицы формы.

Настройка на уровне метаданных

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

  1. Откроем дерево конфигурации и найдем нужный реквизит (в справочнике или документе).
  2. Перейдем в свойства реквизита.
  3. Найдем свойство Параметры выбора.
  4. Нажмем на кнопку выбора и добавим условие: ПометкаУдаления Равно Ложь.

Теперь везде, где используется этот реквизит конфигурации, 1С будет автоматически отсекать удаленные объекты. Нам не придется дублировать код в разных формах или обработках.

Важные нюансы и дополнения

При реализации отборов стоит учитывать еще несколько технических моментов:

Подводя итог, можно сказать: для разовых задач в обычных формах используйте Форма.Отбор.Поле.Установить(), для управляемых форм — свойство Параметры выбора, а для глобальных ограничений — настройки самого реквизита в конфигураторе.

← На главную