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