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