К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как обратиться к подменю в 1С

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

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

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

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

Как устроено подменю в управляемой форме 1С

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

Назначение подменю — сгруппировать редко используемые или однотипные команды, чтобы не перегружать панель. Типичные примеры в типовых конфигурациях: «Печать», «Отчеты», «Ещё», «Создать на основании». Каждая кнопка внутри подменю привязана к команде формы или к стандартной команде.

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

Как открыть подменю в пользовательском режиме

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

Если нужной команды не видно на панели, проверьте подменю «Ещё» — туда платформа автоматически убирает команды, не поместившиеся в основную область, а также редко используемые действия. В формах списков и документов значительная часть сервисных команд находится именно там.

Дополнительные точки входа: клавиша Alt активирует главное меню в некоторых режимах, а сочетания клавиш, назначенные командам, работают независимо от того, видна кнопка или спрятана в подменю. Посмотреть сочетание можно в подсказке при наведении курсора на кнопку.

Как найти команду в подменю
  1. 1
    Откройте нужную форму (документ, справочник или список).
  2. 2
    Осмотрите командную панель: подменю обычно подписано («Печать», «Ещё», «Отчеты») и имеет стрелку вниз.
  3. 3
    Нажмите на заголовок подменю — развернётся список вложенных команд.
  4. 4
    Если команды нет, проверьте пункт «Ещё» и настройки командного интерфейса формы.
  5. 5
    Если команда недоступна (серая), проверьте права пользователя и условия доступности команды.

Программное обращение к подменю по имени

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

Если элемент создан программно или имя заранее неизвестно, используют метод Элементы.Найти("ИмяПодменю"). Он возвращает элемент или Неопределено, если элемент с таким именем не найден. Это безопаснее прямого обращения: можно проверить результат до того, как обращаться к свойствам.

Пример типового кода в модуле управляемой формы:

&НаКлиенте

Процедура СкрытьПодменю(Команда)

ПодменюПечать = Элементы.Найти("ПодменюПечать");

Если ПодменюПечать <> Неопределено Тогда

ПодменюПечать.Видимость = Ложь;

КонецЕсли;

КонецПроцедуры

bsl
&НаСервере
Процедура НастроитьПодменю()
    Подменю = Элементы.Найти("ПодменюОтчеты");
    Если Подменю <> Неопределено Тогда
        Подменю.Заголовок = "Отчеты по документу";
        Подменю.Доступность = Истина;
    КонецЕсли;
КонецПроцедуры

Обращение к кнопкам внутри подменю

Кнопки, лежащие внутри подменю, доступны через коллекцию ПодчиненныеЭлементы. Обращение выглядит так: Элементы.ИмяПодменю.ПодчиненныеЭлементы.ИмяКнопки. Важно понимать, что в большинстве случаев к кнопке можно обратиться и напрямую — Элементы.ИмяКнопки, потому что коллекция Элементы формы содержит все элементы независимо от вложенности.

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

Пример перебора кнопок подменю:

&НаСервере

Процедура ОтключитьКнопкиПодменю()

Для Каждого Кнопка Из Элементы.ПодменюПечать.ПодчиненныеЭлементы Цикл

Кнопка.Доступность = Ложь;

КонецЦикла;

КонецПроцедуры

Программное создание подменю и добавление кнопок

Подменю можно создать динамически, например при создании формы на сервере. Для этого используют метод Элементы.Добавить() с типом Тип("ГруппаФормы"), затем задают вид группы и родителя. Кнопки добавляются аналогично, с указанием подменю в качестве родителя.

Порядок действий: сначала создаётся команда формы через Команды.Добавить(), ей назначается обработчик, затем создаётся подменю, и в него добавляется кнопка, привязанная к команде. Без привязки к команде кнопка не будет выполнять никаких действий.

&НаСервере

Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

Команда = Команды.Добавить("МояКоманда");

Команда.Действие = "Подключаемый_МояКоманда";

Подменю = Элементы.Добавить("МоеПодменю", Тип("ГруппаФормы"), ЭтаФорма.КоманднаяПанель);

Подменю.Вид = ВидГруппыФормы.Подменю;

Подменю.Заголовок = "Дополнительно";

Кнопка = Элементы.Добавить("КнопкаМояКоманда", Тип("КнопкаФормы"), Подменю);

Кнопка.ИмяКоманды = "МояКоманда";

КонецПроцедуры

Типичные ошибки
01
Обращение Элементы.ИмяПодменю без проверки на Неопределено — при отсутствии элемента код падает с ошибкой; используйте Элементы.Найти() с проверкой.
02
Попытка обратиться к подменю обычной формы синтаксисом управляемой — в обычных формах используется ЭлементыФормы и другая модель.
03
Добавление кнопки без создания команды и назначения ей обработчика — кнопка появляется, но ничего не делает.
04
Опечатка в имени элемента — платформа не подскажет правильное имя в режиме предприятия, сверяйте имя в конфигураторе.

Подменю в обычных формах и главном меню

В обычных формах (режим обычного приложения) модель другая: обращение идёт через ЭлементыФормы, а подменю командной панели доступны через коллекцию Кнопки: ЭлементыФормы.КоманднаяПанель1.Кнопки.Подменю1.Кнопки.Действие1. Здесь вложенность обязательна — прямого доступа по имени, как в управляемых формах, нет.

Главное меню приложения (раздел «Все функции», меню сервиса) программно изменяется ограниченно. Командный интерфейс подсистем и панели разделов настраивается в конфигураторе через свойства подсистем и командный интерфейс, а не кодом формы. Пользователь может настроить видимость команд через «Настройка командного интерфейса» в меню раздела.

Способы обращения к подменю

Элементы.ИмяПодменю

Быстрый прямой доступ, когда имя известно и элемент гарантированно есть в форме. Риск ошибки, если элемента нет.

Элементы.Найти("Имя")

Безопасный вариант для динамических форм и расширений: возвращает Неопределено, которое можно проверить.

Перебор ПодчиненныеЭлементы

Подходит для массовых операций над кнопками подменю, когда имена кнопок заранее неизвестны.

Проверка результата и ограничения

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

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

Контрольные точки

Как проверить результат

Подменю отображается на командной панели
Норма

Заголовок виден, стрелка разворачивает список

Тревожный признак

Подменю нет — проверьте Видимость и родителя группы

Обращение по имени из кода
Норма

Элементы.Найти() возвращает объект, свойства меняются

Тревожный признак

Возвращается Неопределено — имя не совпадает с именем в конфигураторе

Кнопка внутри подменю работает
Норма

Нажатие вызывает назначенный обработчик

Тревожный признак

Кнопка есть, но не реагирует — не назначено действие команды

Частые вопросы

Почему Элементы.ИмяПодменю возвращает ошибку «Поле объекта не обнаружено»?

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

Можно ли обратиться к подменю формы из другого модуля?

Напрямую — нет: коллекция Элементы доступна только в модуле самой формы. Из внешнего кода можно получить форму через ПолучитьФорму() и работать с ней как с объектом, но такой подход требует аккуратности и подходит не для всех сценариев. Правильнее вызывать экспортные процедуры формы.

Как обратиться к подменю «Ещё» в типовой форме?

Подменю «Ещё» — это стандартная группа командной панели, её имя зависит от конфигурации и версии. Точное имя смотрите в конфигураторе в дереве элементов конкретной формы. Изменять её состав лучше через расширение, чтобы не потерять изменения при обновлении.

Чем отличается обращение к подменю в обычных и управляемых формах?

В управляемых формах используется коллекция Элементы, и любой элемент доступен по имени напрямую. В обычных формах — ЭлементыФормы, а к кнопкам подменю обращаются через цепочку Кнопки с учётом вложенности: ЭлементыФормы.КоманднаяПанель.Кнопки.Подменю.Кнопки.ИмяКнопки.

Как добавить свою кнопку в существующее подменю типовой конфигурации?

Рекомендуемый путь — расширение конфигурации: заимствуйте форму, добавьте команду и кнопку, указав подменю как родителя. Прямая правка типовой формы усложнит последующие обновления конфигурации.

Почему программно созданная кнопка в подменю не выполняет действие?

Кнопка должна быть связана с командой формы, а у команды — заполнено свойство Действие с именем существующего обработчика. Проверьте, что команда создана через Команды.Добавить(), обработчик объявлен в модуле формы, а у кнопки заполнено свойство ИмяКоманды.

Итог

Что важно запомнить

К подменю в управляемой форме обращаются по имени через Элементы или Элементы.Найти() с проверкой на Неопределено; кнопки внутри доступны напрямую по имени или через ПодчиненныеЭлементы. Программное создание требует связки «команда — кнопка — обработчик», а изменения типовых форм безопаснее делать через расширение.