Как программно найти и скрыть стандартные кнопки командной панели (например, «Создать на основании») в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Выясняем причину: почему кнопки не видны в конфигураторе

Стандартные команды в 1С могут генерироваться платформой динамически на основе метаданных объекта. Если у командной панели установлено свойство Автозаполнение, платформа самостоятельно наполняет ее кнопками, соответствующими правам пользователя и настройкам командного интерфейса. В этом случае физического элемента в дереве формы может не существовать до момента запуска приложения, что и сбивает с толку начинающих разработчиков.

Способ 1: Использование отладчика для поиска имени элемента

Проанализируем самый надежный метод определения имени кнопки. Если мы не знаем точного пути к элементу, нам поможет отладка или помощник отладки — в этом поможет инструментарий разработчика для отладки управляемых форм 1С. Рассмотрим алгоритм действий:

  1. Откроем модуль формы, где находится нужная командная панель.
  2. Найдем процедуру ПриОткрытии (или создадим ее, если она отсутствует). Важно использовать именно эту процедуру на клиенте, так как к моменту ее выполнения коллекция элементов уже полностью сформирована платформой.
  3. Установим точку останова на последней строке этой процедуры (например, на КонецПроцедуры).
  4. Запустим систему в режиме «1С:Предприятие» и откроем нужную форму.
  5. Когда выполнение прервется, в окне «Табло» или через «Вычислить выражение» введем ЭтотОбъект.Элементы (или просто Элементы).

В открывшемся списке коллекции мы увидим огромное количество объектов. Чтобы найти кнопку «Создать на основании», просмотрим элементы, чьи имена начинаются с префикса командной панели. Выяснив имя через отладку или редактор форм в режиме предприятия, мы можем обращаться к нему программно — ускоряет этот процесс инструмент отладки и вычисления выражений в режиме предприятия.

Способ 2: Программное управление видимостью

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


&НаСервере
Процедура СкрытьКнопкуСозданияНаОснованииНаСервере()
    
    // Пытаемся найти элемент по предполагаемому имени
    ИмяЭлемента = "ФормаКоманднаяПанельСоздатьНаОсновании";
    НужныйЭлемент = Элементы.Найти(ИмяЭлемента);
    
    Если НужныйЭлемент <> Неопределено Тогда
        НужныйЭлемент.Видимость = Ложь;
    КонецЕсли;
    
КонецПроцедуры

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

Способ 3: Рекурсивный поиск элементов

Иногда кнопки вложены глубоко в подменю или группы, и прямое обращение по имени может не сработать, если имя сформировано сложным образом. В таких случаях мы можем реализовать рекурсивный обход всех элементов формы для поиска нужного по заголовку или части имени.

Разберем пример функции, которая ищет элемент по фрагменту имени:


&НаСервере
Функция НайтиЭлементРекурсивно(КоллекцияЭлементов, ФрагментИмени)
    
    Для Каждого ТекущийЭлемент Из КоллекцияЭлементов Цикл
        
        Если СтрНайти(ТекущийЭлемент.Имя, ФрагментИмени) > 0 Тогда
            Возврат ТекущийЭлемент;
        КонецЕсли;
        
        // Если это группа или подменю, ищем внутри
        Если ТипЗнч(ТекущийЭлемент) = Тип("ГруппаФормы") Тогда
            Результат = НайтиЭлементРекурсивно(ТекущийЭлемент.ПодчиненныеЭлементы, ФрагментИмени);
            Если Результат <> Неопределено Тогда
                Возврат Результат;
            КонецЕсли;
        КонецЕсли;
        
    КонецЦикла;
    
    Возврат Неопределено;
    
КонецФункции

Используя такую функцию, мы можем легко найти кнопку даже при изменении структуры метаданных: НужнаяКнопка = НайтиЭлементРекурсивно(Элементы, "СоздатьНаОсновании");.

Способ 4: Настройка через Командный интерфейс

Если ваша цель — не просто скрыть кнопку кодом, а настроить ее доступность для разных ролей, лучше всего использовать встроенный инструмент «Командный интерфейс» — также есть готовое расширение для гибкой настройки прав доступа к элементам формы. В редакторе управляемой формы перейдите на закладку «Командный интерфейс». Здесь вы увидите дерево всех стандартных команд (Создать на основании, Отчеты, Перейти и др.).

Преимущества этого метода:

  1. Вы можете управлять видимостью целых разделов без написания кода.
  2. Настройки можно задавать индивидуально для каждой роли, определенной в конфигурации.
  3. Это «штатный» способ платформы, который не нагружает сервер при создании формы.

Способ 5: Отказ от автозаполнения

Проанализируем ситуацию, когда стандартное поведение платформы нам совсем не подходит. Если вам нужно полностью перестроить командную панель, рекомендуется отключить свойство Автозаполнение у командной панели в конфигураторе.

В этом случае панель станет пустой, и вам придется добавить все нужные кнопки вручную. Для добавления стандартных команд (например, проведение документа) перетащите соответствующие команды из раздела «Команды формы» -> «Стандартные команды». Теперь у каждой кнопки будет понятное имя, заданное вами, и вы сможете управлять ими напрямую, как любым другим элементом формы.

Важные замечания по правам доступа и функциональным опциям

Нужно учитывать, что видимость кнопок в 1С определяется не только вашим кодом, но и глобальными настройками системы. Рассмотрим факторы, которые могут блокировать программное изменение видимости:

Таким образом, для надежного управления элементами командной панели мы рекомендуем сочетать методы отладки для определения имен и проверки прав доступа перед выполнением программных действий с интерфейсом.

← На главную