Убираем стандартные команды правого клика в формах 1С:Предприятия 8.3
Содержание
Чтобы программно отключить контекстное меню
элемента управляемой формы в 1С 8.3, снимите у него автозаполнение: Элементы.ИмяЭлемента.КонтекстноеМеню.Автозаполнение = Ложь. Код ставят в ПриСозданииНаСервере формы. Стандартные команды правого клика пропадут, а свои команды в меню можно добавить вручную.
Типичная ситуация из практики. Бухгалтер открывает отчёт в табличном документе и правым кликом правит суммы прямо в ячейках, а потом отправляет «отчёт» руководителю. Или в таблице документа пользователь через меню копирует и удаляет строки, которые трогать нельзя. Задача 1С-ника — убрать лишнее из меню и при этом не сломать работу формы. Речь о платформе 8.3 с управляемыми формами; про обычные формы — отдельный раздел ниже.
Как устроено контекстное меню в управляемой форме
У каждого элемента, который поддерживает правый клик, платформа сама создаёт подчинённую группу типа КонтекстноеМенюФормы. В дереве элементов формы она видна под элементом: например, у таблицы Список это СписокКонтекстноеМеню.
Что важно знать про эту группу:
- 🔹 Её нельзя удалить или заменить на
Неопределено— свойствоКонтекстноеМенюу элемента только для чтения. - 🔹 Свойство
Автозаполнениеотвечает за стандартные команды. Пока оноИстина, платформа сама кладёт в меню команды элемента: «Создать», «Скопировать», «Изменить», «Удалить», «Найти» и т. д. - 🔹 В группу можно добавлять свои кнопки, подгруппы и разделители — как в командную панель.
- 🔹 Состав меню собирается при открытии формы с учётом прав пользователя и функциональных опций.
Есть три способа управлять меню. Выбор зависит от того, что нужно получить.
| Способ | Когда подходит | Что учесть |
|---|---|---|
Автозаполнение = Ложь | Убрать все стандартные команды разом | Пропадут и полезные команды, свои надо добавить вручную |
| Скрыть отдельные кнопки | Убрать 1-2 команды, остальное оставить | Кнопку стандартной команды надо явно разместить в меню |
| Запретить само действие | Нужен реальный запрет, а не косметика | Свойства элемента или права роли, а не меню |
Если цель — запретить действие, а не убрать надпись, начинайте с третьего способа. Меню — это только один из входов в команду.
Когда меню лучше не трогать
Пустое меню раздражает пользователей сильнее, чем лишние пункты. Люди привыкли копировать значение ячейки, искать по колонке и выводить список в табличный документ. Если убрать всё подряд, через неделю придут заявки «верните как было».
Хорошее правило: убирайте только команды, которые ведут к ошибкам в данных. Поиск, копирование значения и вывод списка оставляйте, если на это нет прямого запрета.
Отключаем меню у табличного документа
Табличный документ на форме выводится через поле реквизита типа ТабличныйДокумент (вид элемента — поле табличного документа). У этого поля своё контекстное меню: копирование, выделение, команды редактирования ячеек и оформления.
В конфигураторе, без кода
- Откройте форму в конфигураторе.
- На вкладке «Элементы» раскройте поле табличного документа.
- Выделите его подчинённый элемент
...КонтекстноеМеню. - В палитре свойств снимите флаг «Автозаполнение».
Программно
Тот же результат кодом. Допустим, поле называется ПолеОтчета:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Убираем стандартные команды правого клика у поля табличного документа
Элементы.ПолеОтчета.КонтекстноеМеню.Автозаполнение = Ложь;
// Чтобы пользователь не правил ячейки, закрываем поле для редактирования
Элементы.ПолеОтчета.ТолькоПросмотр = Истина;
КонецПроцедуры
Вторая строка нужна потому, что меню не единственный путь к правке. Пользователь может просто дважды щёлкнуть по ячейке или начать печатать. ТолькоПросмотр закрывает именно редактирование.
Если табличный документ выводят методом ТабличныйДокумент.Показать(), отдельной формы под ваш контроль нет — меню там стандартное. Чтобы им управлять, выведите документ в поле своей формы.
Скрытая команда «Копировать» не мешает Ctrl+C. Если данные из отчёта копировать нельзя, это вопрос прав и регламента, а не контекстного меню.
Таблица формы и динамический список: убираем выборочно
Со списками справочников и документов, а также с табличными частями обычно нужно убрать не всё, а пару команд. Полностью выключать автозаполнение здесь неудобно: исчезнут «Найти», «Отменить поиск», «Вывести список » и прочие команды, без которых пользователи начнут жаловаться.
Скрыть одну стандартную команду
Приём такой: явно положить кнопку стандартной команды в контекстное меню и сделать её невидимой. Автозаполнение не дублирует команду, которая уже размещена вручную.
- В редакторе формы откройте вкладку «Команды», а на ней — список «Стандартные команды».
- Найдите команды таблицы (например,
Список.УдалитьилиСписок.Скопировать). - Перетащите нужную команду в группу
СписокКонтекстноеМенюна вкладке «Элементы». - У созданной кнопки снимите «Видимость» в свойствах или скройте её кодом.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Имя кнопки — то, что видно в дереве элементов формы
Элементы.СписокКонтекстноеМенюСкопировать.Видимость = Ложь;
КонецПроцедуры
Имя кнопки платформа даёт при перетаскивании. Посмотрите его в дереве элементов и не набирайте наугад: ошибка в имени сразу даст исключение при открытии формы.
Запретить действие через свойства таблицы
Для таблицы, связанной с табличной частью или таблицей значений, есть свойство ИзменятьСоставСтрок. Если его выключить, команды добавления, копирования и удаления строк становятся недоступны везде: в меню, в командной панели и по клавишам.
Элементы.Товары.ИзменятьСоставСтрок = Ложь; // строки не добавить и не удалить
Элементы.Товары.ТолькоПросмотр = Истина; // и не изменить значения
Для динамического списка аналог — ТолькоПросмотр у таблицы списка.
Своё контекстное меню вместо стандартного
После Автозаполнение = Ложь меню пустое. Обычно туда кладут 2-3 своих команды: «Открыть», «Распечатать», «Показать движения».
В конфигураторе
- На вкладке «Команды» формы создайте команду, задайте ей действие (обработчик).
- Перетащите команду в группу
...КонтекстноеМенюнужного элемента. - При желании добавьте подгруппу — получится вложенное меню.
Полностью кодом
Это нужно, когда состав меню зависит от условий или форма дорабатывается расширением.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Меню = Элементы.Список.КонтекстноеМеню;
Меню.Автозаполнение = Ложь;
// 1. Команда формы
Команда = Команды.Добавить("ОткрытьКарточку");
Команда.Заголовок = "Открыть карточку";
Команда.Действие = "ОткрытьКарточку";
// 2. Кнопка этой команды внутри контекстного меню таблицы
Кнопка = Элементы.Добавить("КонтекстноеМенюОткрытьКарточку", Тип("КнопкаФормы"), Меню);
Кнопка.ИмяКоманды = "ОткрытьКарточку";
КонецПроцедуры
&НаКлиенте
Процедура ОткрытьКарточку(Команда)
ТекущиеДанные = Элементы.Список.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
Возврат;
КонецЕсли;
ПоказатьЗначение(, ТекущиеДанные.Ссылка);
КонецПроцедуры
Пример рассчитан на динамический список, где у строки есть поле Ссылка. Для таблицы значений возьмите своё поле строки.
Если кнопку нужно поставить в конкретное место меню, используйте Элементы.Вставить(...) с параметром «элемент, перед которым вставить». Элементы.Добавить ставит кнопку в конец группы.
Типовые формы лучше не править напрямую: снимете конфигурацию с поддержки и получите проблемы при каждом обновлении. Тот же код размещают в расширении:
&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Элементы.Список.КонтекстноеМеню.Автозаполнение = Ложь;
КонецПроцедуры
Префикс Расш1_ — это префикс вашего расширения, он может быть любым.
Меню и права: роли решают раньше кода
Часть работы платформа делает сама. Стандартные команды списка учитывают права текущего пользователя. Нет у роли права на добавление — в меню нет «Создать» и «Скопировать». Нет права на интерактивную пометку удаления — нет «Пометить на удаление».
Отсюда практические выводы:
- ✅ Если команда должна быть недоступна группе пользователей, снимите право в роли. Меню, командная панель и горячие клавиши подстроятся сами.
- ✅ Чтобы показывать свою команду только части людей, проверьте роль в
ПриСозданииНаСервере:
Элементы.КонтекстноеМенюОткрытьКарточку.Видимость = РольДоступна("ПолныеПрава");
- ✅ Для элементов формы в конфигураторе есть настройка «Пользовательская видимость» с разбивкой по ролям — можно обойтись без кода.
- ⚠️ Проверка роли в коде — это интерфейс, а не защита. Сервер разрешит запись, если право в роли есть, даже когда кнопка скрыта.
Ещё один источник: функциональные опции. Если команда объекта привязана к выключенной опции, она пропадает из меню вместе с остальным интерфейсом.
Правый клик и события мыши: что можно перехватить
Частый вопрос — «как поймать правый клик и показать своё меню». В управляемых формах отдельного события правого клика у элементов нет. Откройте палитру свойств поля или таблицы и посмотрите раздел «События»: там Выбор, ПриАктивизацииСтроки, ПриАктивизации, ОбработкаРасшифровки и т. п., но не нажатие правой кнопки.
Что из этого следует:
- 🔸 Управлять правым кликом можно только через состав группы
КонтекстноеМеню. Платформа сама показывает меню по правому клику. - 🔸 Двойной клик по строке или ячейке перехватывается событием
Выбор. УстановитеСтандартнаяОбработка = Ложь, чтобы отменить стандартное открытие или редактирование. - 🔸 Клик по ячейке с расшифровкой в отчёте ловит
ОбработкаРасшифровки. Там же можно открыть своё меню выбора черезПоказатьВыборИзМеню()— это и есть легальный способ показать «своё всплывающее меню» в ответ на действие пользователя.
&НаКлиенте
Процедура ПолеОтчетаОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Варианты = Новый СписокЗначений;
Варианты.Добавить("Открыть", "Открыть документ");
Варианты.Добавить("Движения", "Показать движения");
Оповещение = Новый ОписаниеОповещения("ВыборДействияЗавершение", ЭтотОбъект, Расшифровка);
ПоказатьВыборИзМеню(Оповещение, Варианты, Элемент);
КонецПроцедуры
&НаКлиенте
Процедура ВыборДействияЗавершение(ВыбранныйЭлемент, Расшифровка) Экспорт
Если ВыбранныйЭлемент = Неопределено Тогда
Возврат;
КонецЕсли;
Если ВыбранныйЭлемент.Значение = "Открыть" Тогда
ПоказатьЗначение(, Расшифровка);
КонецЕсли;
// ветку «Движения» допишите под свою задачу
КонецПроцедуры
Здесь предполагается, что в расшифровку ячейки вы положили ссылку на документ при формировании отчёта.
Обычные формы (толстый клиент)
В старых конфигурациях на обычных формах устройство другое. У табличного поля и поля табличного документа есть своё свойство КонтекстноеМеню и флаг автоматического контекстного меню в палитре свойств элемента. Его снимают в конфигураторе, а своё меню собирают в редакторе контекстного меню формы.
Если конфигурацию переводят на управляемые формы, эти настройки не переносятся. Меню придётся собрать заново по схеме выше.
Почему меню не изменилось: ошибки и отладка
Пара приёмов для диагностики:
- Отладчик. В
ПриСозданииНаСерверепоставьте точку останова и в окне вычисления выражений посмотритеЭлементы.Список.КонтекстноеМеню.ПодчиненныеЭлементы.Количество(). Так видно, сколько кнопок вы добавили явно. - Две формы. Проверьте, какую форму открывает команда: у объекта бывает основная форма списка и отдельная форма выбора. Код в одной из них на вторую не влияет.
- Права. Зайдите под пользователем с нужной ролью, а не под администратором. С «Полными правами» меню почти всегда полнее.
- Порядок обработчиков. В расширении с
&Передкод выполнится до типового — типовой код может вернуть автозаполнение. Используйте&После.