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