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