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