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