Как установить отбор по группе справочника при открытии формы выбора в 1С?

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

Рассмотрим распространенную задачу при разработке в управляемом интерфейсе (например, в интерфейсе «Такси»). Предположим, у нас есть документ с реквизитами «Заказчик» и «Исполнитель», ссылающимися на справочник контрагентов. Нам необходимо, чтобы при нажатии на кнопку выбора для поля «Заказчик» открывалась форма выбора справочника с установленным отбором по группе «Заказчики», а для поля «Исполнитель» — по группе «Исполнители». Разберем по шагам, как правильно реализовать это поведение.

Способ 1: Настройка без программирования

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

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

Способ 2: Программная установка отбора

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

Логику необходимо прописывать в обработчике события НачалоВыбора поля ввода. Первым делом мы должны отключить стандартную обработку, установив параметр СтандартнаяОбработка в значение Ложь, чтобы платформа не открыла форму выбора по умолчанию. Затем мы сформируем структуру параметров и откроем форму методом ОткрытьФорму().

Чтобы выбранное пользователем значение автоматически подставилось в реквизит на форме, обязательно нужно передать само поле ввода в качестве владельца открываемой формы (это третий параметр функции).

Рассмотрим пример кода:


&НаКлиенте
Процедура ЗаказчикНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    ПараметрыВыбора = Новый Структура("Отбор", Новый Структура("Родитель", НужнаяГруппаЗаказчиков));
    ОткрытьФорму("Справочник.Контрагенты.ФормаВыбора", ПараметрыВыбора, Элемент);
КонецПроцедуры

Устаревшие методы: почему нельзя использовать модальные окна

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

В современных конфигурациях 1С (особенно при использовании интерфейса «Такси» и веб-клиента) использование модальных окон является грубой ошибкой. Модальные окна блокируют работу веб-браузеров. По умолчанию они запрещены в свойствах конфигурации. Всегда используйте асинхронные вызовы или стандартное открытие формы с передачей владельца, как мы рассмотрели в предыдущем примере.

Важные нюансы работы отборов и поведения формы

При реализации механизмов выбора стоит учитывать несколько важных особенностей поведения платформы 1С:

  1. Жесткий отбор или позиционирование: Если мы передаем параметр Отбор, пользователь жестко ограничивается указанной группой. Он не сможет выйти на уровень выше и выбрать контрагента из другой папки. Если же наша задача — просто открыть справочник, сфокусировавшись на нужной папке, но оставить пользователю свободу навигации (возможность перейти в корень справочника), нам следует использовать другой параметр. Вместо структуры отбора передадим стандартный параметр ТекущийРодитель, присвоив ему ссылку на нужную группу.
  2. Учет иерархии (вид сравнения): При использовании стандартной структуры отбора (через Отбор и Родитель) платформа по умолчанию устанавливает вид сравнения «Равно». Это значит, что в списке отобразятся только те элементы, которые лежат непосредственно в указанной папке. Если внутри этой группы есть подгруппы со своими элементами, они показаны не будут.
  3. Отбор «В иерархии»: Если нам необходимо показать элементы текущей группы и всех вложенных в нее подгрупп, стандартного параметра формы не хватит. В таком случае мы должны передавать в форму выбора свой собственный произвольный параметр. Далее, в модуле самой формы выбора справочника (в обработчике ПриСозданииНаСервере) необходимо перехватить этот параметр и программно добавить элемент отбора в компоновщик настроек динамического списка (реквизит, отображающий данные на форме), принудительно установив вид сравнения как ВидСравненияКомпоновкиДанных.ВИерархии.

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

← На главную