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