Разработка и Конфигурация · 11 мин
Как обратиться к подменю в 1С
Как обратиться к подменю в 1С: работа с командной панелью в интерфейсе, программное обращение к кнопкам подменю по имени, типичные ошибки и проверка результата.
Подменю в 1С — это группа кнопок внутри командной панели формы или в главном меню приложения. Обратиться к нему можно двумя способами: визуально, через интерфейс пользователя, и программно, через встроенный язык 1С. Выбор способа зависит от задачи: пользователю достаточно найти нужную кнопку в меню «Ещё» или на панели, а разработчику — получить элемент формы по имени и изменить его свойства или выполнить команду.
Основная сложность при программном обращении — правильно указать имя элемента. Подменю в дереве элементов формы является контейнером типа «ГруппаКнопок» (в управляемых формах — ГруппаФормы с видом «Подменю»), и обращение к нему строится через коллекцию Элементы формы. Если имя задано неверно или элемент находится внутри другой группы, обращение вернёт Неопределено, и код завершится ошибкой.
Ниже разобраны оба сценария: работа пользователя с подменю в типовых конфигурациях и программный доступ к подменю и его кнопкам из кода на встроенном языке, включая обращение к вложенным элементам и типичные ошибки.
Как устроено подменю в управляемой форме 1С
В управляемых формах все визуальные элементы образуют дерево. Корневой элемент — сама форма, внутри неё располагаются группы, таблицы, поля и командные панели. Подменю — это группа с видом «Подменю», которая чаще всего находится внутри командной панели, но может быть создана и отдельно.
Назначение подменю — сгруппировать редко используемые или однотипные команды, чтобы не перегружать панель. Типичные примеры в типовых конфигурациях: «Печать», «Отчеты», «Ещё», «Создать на основании». Каждая кнопка внутри подменю привязана к команде формы или к стандартной команде.
Имя подменю задаётся в конфигураторе в свойствах группы либо формируется автоматически при программном создании. Именно это имя используется для обращения из кода. Посмотреть его можно в конфигураторе, открыв форму и выделив нужную группу в дереве элементов.
Как открыть подменю в пользовательском режиме
В режиме 1С:Предприятие подменю открывается щелчком по его заголовку на командной панели. Если подменю имеет вид кнопки со стрелкой вниз, нажатие разворачивает список вложенных команд. В тонком и веб-клиенте поведение одинаковое, отличается только отрисовка.
Если нужной команды не видно на панели, проверьте подменю «Ещё» — туда платформа автоматически убирает команды, не поместившиеся в основную область, а также редко используемые действия. В формах списков и документов значительная часть сервисных команд находится именно там.
Дополнительные точки входа: клавиша Alt активирует главное меню в некоторых режимах, а сочетания клавиш, назначенные командам, работают независимо от того, видна кнопка или спрятана в подменю. Посмотреть сочетание можно в подсказке при наведении курсора на кнопку.
- 1Откройте нужную форму (документ, справочник или список).
- 2Осмотрите командную панель: подменю обычно подписано («Печать», «Ещё», «Отчеты») и имеет стрелку вниз.
- 3Нажмите на заголовок подменю — развернётся список вложенных команд.
- 4Если команды нет, проверьте пункт «Ещё» и настройки командного интерфейса формы.
- 5Если команда недоступна (серая), проверьте права пользователя и условия доступности команды.
Программное обращение к подменю по имени
Базовый способ — обращение через коллекцию Элементы формы. В модуле формы пишут Элементы.ИмяПодменю, где ИмяПодменю — имя группы, заданное в конфигураторе. Через полученный объект можно менять видимость, доступность, заголовок и картинку.
Если элемент создан программно или имя заранее неизвестно, используют метод Элементы.Найти("ИмяПодменю"). Он возвращает элемент или Неопределено, если элемент с таким именем не найден. Это безопаснее прямого обращения: можно проверить результат до того, как обращаться к свойствам.
Пример типового кода в модуле управляемой формы:
&НаКлиенте
Процедура СкрытьПодменю(Команда)
ПодменюПечать = Элементы.Найти("ПодменюПечать");
Если ПодменюПечать <> Неопределено Тогда
ПодменюПечать.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура НастроитьПодменю()
Подменю = Элементы.Найти("ПодменюОтчеты");
Если Подменю <> Неопределено Тогда
Подменю.Заголовок = "Отчеты по документу";
Подменю.Доступность = Истина;
КонецЕсли;
КонецПроцедурыОбращение к кнопкам внутри подменю
Кнопки, лежащие внутри подменю, доступны через коллекцию ПодчиненныеЭлементы. Обращение выглядит так: Элементы.ИмяПодменю.ПодчиненныеЭлементы.ИмяКнопки. Важно понимать, что в большинстве случаев к кнопке можно обратиться и напрямую — Элементы.ИмяКнопки, потому что коллекция Элементы формы содержит все элементы независимо от вложенности.
Обращение через ПодчиненныеЭлементы оправдано, когда нужно перебрать все кнопки подменю в цикле — например, чтобы массово скрыть их или сформировать список доступных команд. Для одиночной кнопки с известным именем прямое обращение короче и надёжнее.
Пример перебора кнопок подменю:
&НаСервере
Процедура ОтключитьКнопкиПодменю()
Для Каждого Кнопка Из Элементы.ПодменюПечать.ПодчиненныеЭлементы Цикл
Кнопка.Доступность = Ложь;
КонецЦикла;
КонецПроцедуры
Программное создание подменю и добавление кнопок
Подменю можно создать динамически, например при создании формы на сервере. Для этого используют метод Элементы.Добавить() с типом Тип("ГруппаФормы"), затем задают вид группы и родителя. Кнопки добавляются аналогично, с указанием подменю в качестве родителя.
Порядок действий: сначала создаётся команда формы через Команды.Добавить(), ей назначается обработчик, затем создаётся подменю, и в него добавляется кнопка, привязанная к команде. Без привязки к команде кнопка не будет выполнять никаких действий.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Команда = Команды.Добавить("МояКоманда");
Команда.Действие = "Подключаемый_МояКоманда";
Подменю = Элементы.Добавить("МоеПодменю", Тип("ГруппаФормы"), ЭтаФорма.КоманднаяПанель);
Подменю.Вид = ВидГруппыФормы.Подменю;
Подменю.Заголовок = "Дополнительно";
Кнопка = Элементы.Добавить("КнопкаМояКоманда", Тип("КнопкаФормы"), Подменю);
Кнопка.ИмяКоманды = "МояКоманда";
КонецПроцедуры
Подменю в обычных формах и главном меню
В обычных формах (режим обычного приложения) модель другая: обращение идёт через ЭлементыФормы, а подменю командной панели доступны через коллекцию Кнопки: ЭлементыФормы.КоманднаяПанель1.Кнопки.Подменю1.Кнопки.Действие1. Здесь вложенность обязательна — прямого доступа по имени, как в управляемых формах, нет.
Главное меню приложения (раздел «Все функции», меню сервиса) программно изменяется ограниченно. Командный интерфейс подсистем и панели разделов настраивается в конфигураторе через свойства подсистем и командный интерфейс, а не кодом формы. Пользователь может настроить видимость команд через «Настройка командного интерфейса» в меню раздела.
Способы обращения к подменю
Быстрый прямой доступ, когда имя известно и элемент гарантированно есть в форме. Риск ошибки, если элемента нет.
Безопасный вариант для динамических форм и расширений: возвращает Неопределено, которое можно проверить.
Подходит для массовых операций над кнопками подменю, когда имена кнопок заранее неизвестны.
Проверка результата и ограничения
После изменения подменю или кнопок проверьте результат в режиме предприятия: откройте форму, убедитесь, что подменю отображается с нужным заголовком, кнопки доступны и выполняют назначенные команды. Если код выполняется на сервере, помните, что изменения свойств элементов применяются при передаче управления клиенту.
Ограничения: нельзя обратиться к элементам формы извне — только из модуля этой формы или через объект формы, полученный методом ПолучитьФорму() (с осторожностью, так как это не всегда поддерживается для всех сценариев). В расширениях конфигурации доступны только те элементы, которые не скрыты механизмом защиты, и переопределение чужих обработчиков требует аккуратности.
Как проверить результат
Заголовок виден, стрелка разворачивает список
Подменю нет — проверьте Видимость и родителя группы
Элементы.Найти() возвращает объект, свойства меняются
Возвращается Неопределено — имя не совпадает с именем в конфигураторе
Нажатие вызывает назначенный обработчик
Кнопка есть, но не реагирует — не назначено действие команды
Частые вопросы
Почему Элементы.ИмяПодменю возвращает ошибку «Поле объекта не обнаружено»?
Чаще всего имя подменю в коде не совпадает с именем в конфигураторе, либо элемент создаётся позже, чем выполняется обращение. Откройте форму в конфигураторе, найдите группу в дереве элементов и сверьте точное имя. Для надёжности замените прямое обращение на Элементы.Найти() с проверкой результата.
Можно ли обратиться к подменю формы из другого модуля?
Напрямую — нет: коллекция Элементы доступна только в модуле самой формы. Из внешнего кода можно получить форму через ПолучитьФорму() и работать с ней как с объектом, но такой подход требует аккуратности и подходит не для всех сценариев. Правильнее вызывать экспортные процедуры формы.
Как обратиться к подменю «Ещё» в типовой форме?
Подменю «Ещё» — это стандартная группа командной панели, её имя зависит от конфигурации и версии. Точное имя смотрите в конфигураторе в дереве элементов конкретной формы. Изменять её состав лучше через расширение, чтобы не потерять изменения при обновлении.
Чем отличается обращение к подменю в обычных и управляемых формах?
В управляемых формах используется коллекция Элементы, и любой элемент доступен по имени напрямую. В обычных формах — ЭлементыФормы, а к кнопкам подменю обращаются через цепочку Кнопки с учётом вложенности: ЭлементыФормы.КоманднаяПанель.Кнопки.Подменю.Кнопки.ИмяКнопки.
Как добавить свою кнопку в существующее подменю типовой конфигурации?
Рекомендуемый путь — расширение конфигурации: заимствуйте форму, добавьте команду и кнопку, указав подменю как родителя. Прямая правка типовой формы усложнит последующие обновления конфигурации.
Почему программно созданная кнопка в подменю не выполняет действие?
Кнопка должна быть связана с командой формы, а у команды — заполнено свойство Действие с именем существующего обработчика. Проверьте, что команда создана через Команды.Добавить(), обработчик объявлен в модуле формы, а у кнопки заполнено свойство ИмяКоманды.
Что важно запомнить
К подменю в управляемой форме обращаются по имени через Элементы или Элементы.Найти() с проверкой на Неопределено; кнопки внутри доступны напрямую по имени или через ПодчиненныеЭлементы. Программное создание требует связки «команда — кнопка — обработчик», а изменения типовых форм безопаснее делать через расширение.