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