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