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

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

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

Различие между назначением реквизита в метаданных и выбором группы

Проанализируем распространенное заблуждение: при создании реквизита в дереве метаданных на вкладке Дополнительно параметр Использовать имеет значения Для элемента, Для группы или Для обоих. Этот параметр определяет исключительно принадлежность реквизита: будет ли он храниться у элементов текущего справочника или у его собственных групп. Если у справочника отключена иерархия (нет групп), данный переключатель заблокирован.

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

Разрешение выбора групп для поля формы

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

Посмотрим на пример кода в модуле формы элемента:


Процедура ПриОткрытии()
    // Разрешаем выбор как элементов, так и групп для реквизита "Номенклатура"
    Форма.Номенклатура.ВыборГруппы(1);
КонецПроцедуры

Если реквизит расположен в табличной части (многострочной части формы), синтаксис обращения к колонке остается аналогичным:


Процедура ПриОткрытии()
    Форма.Товар.ВыборГруппы(1);
КонецПроцедуры

Ограничение выбора: как разрешить выбирать ТОЛЬКО группы

Важно понимать особенность платформы: метод ВыборГруппы(1) открывает возможность выбирать папки, но не блокирует выбор конечных элементов. Пользователь по-прежнему сможет выбрать как папку, так и обычный элемент.

Если по бизнес-логике требуется разрешить выбор исключительно групп, добавим обязательную валидацию. Проверить выбранное значение можно в формуле элемента управления или в предопределенной процедуре ПриЗаписи() с помощью метода ЭтоГруппа().

Разберем реализацию проверки перед записью объекта:


Процедура ПриЗаписи()
    Если Выбран() = 1 Тогда
        Если ПустоеЗначение(Номенклатура) = 0 Тогда
            Если Номенклатура.ЭтоГруппа() = 0 Тогда
                Предупреждение("В данном поле разрешено выбирать только группы справочника!");
                СтатусВозврата(0);
                Возврат;
            КонецЕсли;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Программный выбор группы через объект Справочник

Если выбор значения инициируется программно (например, по кнопке или в специализированной обработке без стандартного поля ввода диалога), метод ВыборГруппы применяется непосредственно к объекту типа Справочник перед вызовом окна выбора.

Рассмотрим по шагам программный вызов диалога выбора:


Спр = СоздатьОбъект("Справочник.Номенклатура");
Спр.ВыборГруппы(1);

Если Спр.Выбрать("Выберите группу номенклатуры", "ФормаВыбора") = 1 Тогда
    Если Спр.ЭтоГруппа() = 1 Тогда
        ВыбГруппа = Спр.ТекущийЭлемент();
    Иначе
        Предупреждение("Выбран элемент, а не группа!");
    КонецЕсли;
КонецЕсли;

Особенности работы с динамическими типами

Если реквизит диалога имеет неопределенный тип и конкретный вид справочника назначается динамически из встроенного языка через методы НазначитьТип() или НазначитьВид(), вызов метода ВыборГруппы(1) необходимо выполнять строго после явного назначения типа реквизита на форме.

Посмотрим на порядок вызовов:


Процедура ПриОткрытии()
    // Сначала задаем тип реквизита
    НазначитьВид(РеквизитНеопределенный, "Номенклатура");
    // Затем открываем доступ к выбору групп
    Форма.РеквизитНеопределенный.ВыборГруппы(1);
КонецПроцедуры

Таким образом, для реализации выбора папок справочника в 1С 7.7 достаточно активировать режим методом Форма.ИмяРеквизита.ВыборГруппы(1) и при необходимости сопроводить выбор контролем через ЭтоГруппа().

← На главную