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