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