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

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

Как программно отключить контекстное меню в 1С

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

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

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

Как устроено контекстное меню в управляемых формах

В управляемом приложении контекстное меню каждого элемента формы — это отдельный объект типа «ГруппаФормы» с видом «Контекстное меню». У элемента формы есть свойство КонтекстноеМеню, которое ссылается на эту группу. По умолчанию платформа заполняет меню автоматически: добавляет стандартные команды («Копировать», «Изменить», «Установить пометку удаления» и т.д.) и команды из командного интерфейса объекта.

Программно доступ к меню получают через коллекцию Элементы формы. Например, для таблицы «СписокТоваров» контекстное меню доступно как Элементы.СписокТоваров.КонтекстноеМеню. Состав меню — это коллекция дочерних элементов (кнопок, подменю, групп), которую можно перебрать, очистить или перестроить.

Важно понимать: часть пунктов меню платформа подставляет динамически при открытии, и они не всегда видны в дереве элементов формы в конфигураторе. Поэтому простое удаление кнопок в редакторе формы не всегда убирает всё меню целиком — надёжнее управлять составом программно в обработчике ПриСозданииНаСервере.

Отключение контекстного меню у элемента формы

Самый прямой способ — очистить состав контекстного меню конкретного элемента. Делается это на сервере при создании формы:

&НаСервере

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

Элементы.СписокТоваров.КонтекстноеМеню.ПодчиненныеЭлементы.Очистить();

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

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

&НаСервере

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

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

ПустоеМеню.Вид = ВидГруппыФормы.КонтекстноеМеню;

Элементы.СписокТоваров.КонтекстноеМеню = ПустоеМеню;

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

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

Порядок отключения меню у элемента
  1. 1
    Откройте модуль формы и найдите или создайте обработчик ПриСозданииНаСервере
  2. 2
    Добавьте код очистки подчинённых элементов контекстного меню либо подмену пустой группой
  3. 3
    Сохраните конфигурацию и обновите конфигурацию базы данных
  4. 4
    Откройте форму в режиме предприятия и нажмите правую кнопку на элементе
  5. 5
    Проверьте поведение во всех используемых клиентах: тонкий, толстый, веб

Отключение через конфигуратор без кода

Если доработка делается один раз и не требует динамики, меню можно убрать прямо в редакторе формы. Откройте форму в конфигураторе, найдите в дереве элементов нужный элемент, раскройте его — под ним будет ветка «КонтекстноеМеню». Удалите из неё все кнопки и группы.

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

Дополнительно проверьте свойство элемента «АвтоКонтекстноеМеню» там, где оно доступно, и свойства командной панели. У части элементов есть переключатели, управляющие автоматическим наполнением меню, — их отключение убирает стандартные пункты без кода.

Отключение меню в табличном документе и поле HTML

Табличный документ

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

Поле HTML-документа

Поле HTML-документа — частый случай, когда нужно убрать браузерное меню «Копировать / Обновить / Свойства». Здесь работает стандартный веб-приём: обработчик события oncontextmenu в самом HTML-коде документа:

html
 ... 

HTML-код формируется программно при выводе содержимого в поле. Добавьте атрибут oncontextmenu в тег body или на конкретный контейнер — правый клик перестанет вызывать меню внутри поля. Учтите, что это работает только внутри области HTML-документа и не влияет на остальную форму.

Точечная настройка: скрыть часть команд

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

Для Каждого Кнопка Из Элементы.СписокТоваров.КонтекстноеМеню.ПодчиненныеЭлементы Цикл

Если Кнопка.ИмяКоманды = "ИзменитьФорму" Тогда

Кнопка.Видимость = Ложь;

КонецЕсли;

КонецЦикла;

Альтернатива — отключить конкретные стандартные команды через свойства. Например, у динамического списка можно снять флажки «Изменение», «Добавление», «Удаление» в палитре свойств, и соответствующие пункты исчезнут из меню и командной панели. Для таблиц также полезно свойство «ИзменятьСоставСтрок» и «ИзменятьПорядокСтрок» — они убирают команды редактирования из всех меню сразу.

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

Способы отключения меню

Очистка состава меню в коде

Гибко, работает для любого элемента. Требует доработки формы и повторяется при обновлении конфигурации

Удаление кнопок в конфигураторе

Просто, но не убирает автоматически добавляемые стандартные команды

Свойства списка и таблицы

Убирает команды редактирования из всех меню сразу, но не управляет произвольными пунктами

Права и роли

Самый надёжный вариант против нежелательных действий, но пункты остаются видимыми (недоступными)

Отключение меню через расширение конфигурации

Если конфигурация на поддержке и менять её напрямую нельзя, используйте расширение. Создайте расширение, заимствуйте нужную форму и добавьте в её модуль обработчик ПриСозданииНаСервере с аннотацией &После — в нём выполните очистку контекстного меню.

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

Проверка результата и типичные ошибки

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

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

Типичные ошибки
01
Очистка меню в ПриОткрытии на клиенте: состав меню формируется на сервере, и изменения на клиенте часто не применяются — выполняйте очистку в ПриСозданииНаСервере
02
Удаление только видимых кнопок в конфигураторе: стандартные команды динамического списка остаются — дополнительно настраивайте свойства списка
03
Отключение меню вместо настройки прав: пользователь с достаточными правами обойдёт интерфейсное ограничение через другие формы — дублируйте запрет ролями
04
Игнорирование веб-клиента: поведение меню в браузере может отличаться, проверка только в тонком клиенте даёт ложную уверенность
Контрольные точки

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

Правый клик на целевом элементе
Норма

Меню не появляется или содержит только разрешённые пункты

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

Появляются стандартные команды редактирования и служебные пункты

Правый клик на соседних элементах формы
Норма

Их меню работают как раньше

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

Отключились меню элементов, которые трогать не планировали

Проверка под пользователем с ограниченными правами
Норма

Состав меню соответствует ожиданиям для этой роли

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

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

Часто задаваемые вопросы

Можно ли отключить контекстное меню сразу на всех формах конфигурации?

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

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

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

Как убрать пункт «Изменить форму» из контекстного меню?

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

Работает ли отключение контекстного меню в веб-клиенте?

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

Чем отключение меню отличается от отключения командной панели?

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

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

Если меню отключено программно в ПриСозданииНаСервере, достаточно закомментировать или удалить код очистки и обновить конфигурацию базы данных — стандартное меню восстановится автоматически. Если кнопки удалены в редакторе формы, их придётся добавлять заново вручную или восстанавливать форму из копии.

Итог

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

Контекстное меню в управляемых формах 1С отключается очисткой состава меню или подменой пустой группой в ПриСозданииНаСервере. Стандартные команды дополнительно отключают через свойства списка и права. Для HTML-полей используется oncontextmenu. Всегда проверяйте результат во всех клиентах и под разными ролями.