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

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

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

Почему не стоит искать элементы на клиенте

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

Решение через серверную функцию

Если вам нужно программно установить отбор, вы можете вынести логику поиска группы в отдельную серверную функцию. Рассмотрим, как это сделать:


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

&НаСервере
Функция ПолучитьГруппуНаСервере()
    Возврат Справочники.Поставщики.НайтиПоНаименованию("Подключение");
КонецФункции

Использование предопределенных элементов

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

Когда группа определена в метаданных, вы можете обращаться к ней напрямую без поиска:

ЭлементОтбора.ПравоеЗначение = Справочники.Поставщики.Подключение;

Или, если вы используете передачу предопределенного значения через клиентский метод:


ЭлементОтбора.ПравоеЗначение = ПредопределенноеЗначение("Справочник.Поставщики.Подключение");

Профессиональный подход: передача параметров в форму

Более элегантным решением является передача настроек отбора через параметры формы при её открытии. Вместо того чтобы навязывать отбор из внешней процедуры, вы можете передать структуру с условиями в ОткрытьФорму.

Шаг 1: В коде документа передаем параметр:


ПараметрыФормы = Новый Структура("Отбор", Новый Структура("Родитель", Справочники.Поставщики.Подключение));
ОткрытьФорму("Справочник.Поставщики.ФормаВыбора", ПараметрыФормы, Элемент);

Платформа 1С автоматически обработает переданный параметр Отбор, если поле Родитель присутствует в динамическом списке формы выбора. Это избавляет вас от необходимости вручную добавлять элементы в Список.Отбор.Элементы.

Советы по оптимизации

  1. Используйте связи параметров выбора: В свойствах поля ввода на форме элемента документа можно настроить «Связи параметров выбора». Это декларативный метод, который не требует написания кода вообще.
  2. Инструктируйте форму при создании: Если логика выбора сложная, передавайте в форму идентификатор (флаг) и настраивайте отбор в обработчике ПриСозданииНаСервере самой формы выбора. Это делает код более модульным и легким для поддержки.
  3. Проверяйте типы данных: Всегда следите за тем, чтобы ПравоеЗначение соответствовало типу поля, по которому вы фильтруете. Сравнение строки с ссылкой всегда приведет к пустому результату в списке.

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

← На главную