Убираем стандартные команды правого клика в формах 1С:Предприятия 8.3

· 9 мин

Содержание

Чтобы программно отключить контекстное меню элемента управляемой формы в 1С 8.3, снимите у него автозаполнение: Элементы.ИмяЭлемента.КонтекстноеМеню.Автозаполнение = Ложь. Код ставят в ПриСозданииНаСервере формы. Стандартные команды правого клика пропадут, а свои команды в меню можно добавить вручную.

Типичная ситуация из практики. Бухгалтер открывает отчёт в табличном документе и правым кликом правит суммы прямо в ячейках, а потом отправляет «отчёт» руководителю. Или в таблице документа пользователь через меню копирует и удаляет строки, которые трогать нельзя. Задача 1С-ника — убрать лишнее из меню и при этом не сломать работу формы. Речь о платформе 8.3 с управляемыми формами; про обычные формы — отдельный раздел ниже.

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

У каждого элемента, который поддерживает правый клик, платформа сама создаёт подчинённую группу типа КонтекстноеМенюФормы. В дереве элементов формы она видна под элементом: например, у таблицы Список это СписокКонтекстноеМеню.

Что важно знать про эту группу:

  • 🔹 Её нельзя удалить или заменить на Неопределено — свойство КонтекстноеМеню у элемента только для чтения.
  • 🔹 Свойство Автозаполнение отвечает за стандартные команды. Пока оно Истина, платформа сама кладёт в меню команды элемента: «Создать», «Скопировать», «Изменить», «Удалить», «Найти» и т. д.
  • 🔹 В группу можно добавлять свои кнопки, подгруппы и разделители — как в командную панель.
  • 🔹 Состав меню собирается при открытии формы с учётом прав пользователя и функциональных опций.

Есть три способа управлять меню. Выбор зависит от того, что нужно получить.

СпособКогда подходитЧто учесть
Автозаполнение = ЛожьУбрать все стандартные команды разомПропадут и полезные команды, свои надо добавить вручную
Скрыть отдельные кнопкиУбрать 1-2 команды, остальное оставитьКнопку стандартной команды надо явно разместить в меню
Запретить само действиеНужен реальный запрет, а не косметикаСвойства элемента или права роли, а не меню

Если цель — запретить действие, а не убрать надпись, начинайте с третьего способа. Меню — это только один из входов в команду.

Когда меню лучше не трогать

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

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

Отключаем меню у табличного документа

Табличный документ на форме выводится через поле реквизита типа ТабличныйДокумент (вид элемента — поле табличного документа). У этого поля своё контекстное меню: копирование, выделение, команды редактирования ячеек и оформления.

В конфигураторе, без кода

  1. Откройте форму в конфигураторе.
  2. На вкладке «Элементы» раскройте поле табличного документа.
  3. Выделите его подчинённый элемент ...КонтекстноеМеню.
  4. В палитре свойств снимите флаг «Автозаполнение».

Программно

Тот же результат кодом. Допустим, поле называется ПолеОтчета:

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

	// Убираем стандартные команды правого клика у поля табличного документа
	Элементы.ПолеОтчета.КонтекстноеМеню.Автозаполнение = Ложь;

	// Чтобы пользователь не правил ячейки, закрываем поле для редактирования
	Элементы.ПолеОтчета.ТолькоПросмотр = Истина;

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

Вторая строка нужна потому, что меню не единственный путь к правке. Пользователь может просто дважды щёлкнуть по ячейке или начать печатать. ТолькоПросмотр закрывает именно редактирование.

Если табличный документ выводят методом ТабличныйДокумент.Показать(), отдельной формы под ваш контроль нет — меню там стандартное. Чтобы им управлять, выведите документ в поле своей формы.

Скрытая команда «Копировать» не мешает Ctrl+C. Если данные из отчёта копировать нельзя, это вопрос прав и регламента, а не контекстного меню.

Таблица формы и динамический список: убираем выборочно

Со списками справочников и документов, а также с табличными частями обычно нужно убрать не всё, а пару команд. Полностью выключать автозаполнение здесь неудобно: исчезнут «Найти», «Отменить поиск», «Вывести список » и прочие команды, без которых пользователи начнут жаловаться.

Скрыть одну стандартную команду

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

  1. В редакторе формы откройте вкладку «Команды», а на ней — список «Стандартные команды».
  2. Найдите команды таблицы (например, Список.Удалить или Список.Скопировать).
  3. Перетащите нужную команду в группу СписокКонтекстноеМеню на вкладке «Элементы».
  4. У созданной кнопки снимите «Видимость» в свойствах или скройте её кодом.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	// Имя кнопки — то, что видно в дереве элементов формы
	Элементы.СписокКонтекстноеМенюСкопировать.Видимость = Ложь;

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

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

Запретить действие через свойства таблицы

Для таблицы, связанной с табличной частью или таблицей значений, есть свойство ИзменятьСоставСтрок. Если его выключить, команды добавления, копирования и удаления строк становятся недоступны везде: в меню, в командной панели и по клавишам.

Элементы.Товары.ИзменятьСоставСтрок = Ложь;   // строки не добавить и не удалить
Элементы.Товары.ТолькоПросмотр = Истина;       // и не изменить значения

Для динамического списка аналог — ТолькоПросмотр у таблицы списка.

Своё контекстное меню вместо стандартного

После Автозаполнение = Ложь меню пустое. Обычно туда кладут 2-3 своих команды: «Открыть», «Распечатать», «Показать движения».

В конфигураторе

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

Полностью кодом

Это нужно, когда состав меню зависит от условий или форма дорабатывается расширением.

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

	Меню = Элементы.Список.КонтекстноеМеню;
	Меню.Автозаполнение = Ложь;

	// 1. Команда формы
	Команда = Команды.Добавить("ОткрытьКарточку");
	Команда.Заголовок = "Открыть карточку";
	Команда.Действие = "ОткрытьКарточку";

	// 2. Кнопка этой команды внутри контекстного меню таблицы
	Кнопка = Элементы.Добавить("КонтекстноеМенюОткрытьКарточку", Тип("КнопкаФормы"), Меню);
	Кнопка.ИмяКоманды = "ОткрытьКарточку";

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

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

	ТекущиеДанные = Элементы.Список.ТекущиеДанные;
	Если ТекущиеДанные = Неопределено Тогда
		Возврат;
	КонецЕсли;

	ПоказатьЗначение(, ТекущиеДанные.Ссылка);

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

Пример рассчитан на динамический список, где у строки есть поле Ссылка. Для таблицы значений возьмите своё поле строки.

Если кнопку нужно поставить в конкретное место меню, используйте Элементы.Вставить(...) с параметром «элемент, перед которым вставить». Элементы.Добавить ставит кнопку в конец группы.

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

&После("ПриСозданииНаСервере")
Процедура Расш1_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)

	Элементы.Список.КонтекстноеМеню.Автозаполнение = Ложь;

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

Префикс Расш1_ — это префикс вашего расширения, он может быть любым.

Меню и права: роли решают раньше кода

Часть работы платформа делает сама. Стандартные команды списка учитывают права текущего пользователя. Нет у роли права на добавление — в меню нет «Создать» и «Скопировать». Нет права на интерактивную пометку удаления — нет «Пометить на удаление».

Отсюда практические выводы:

  • ✅ Если команда должна быть недоступна группе пользователей, снимите право в роли. Меню, командная панель и горячие клавиши подстроятся сами.
  • ✅ Чтобы показывать свою команду только части людей, проверьте роль в ПриСозданииНаСервере:
Элементы.КонтекстноеМенюОткрытьКарточку.Видимость = РольДоступна("ПолныеПрава");
  • ✅ Для элементов формы в конфигураторе есть настройка «Пользовательская видимость» с разбивкой по ролям — можно обойтись без кода.
  • ⚠️ Проверка роли в коде — это интерфейс, а не защита. Сервер разрешит запись, если право в роли есть, даже когда кнопка скрыта.

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

Правый клик и события мыши: что можно перехватить

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

Что из этого следует:

  • 🔸 Управлять правым кликом можно только через состав группы КонтекстноеМеню. Платформа сама показывает меню по правому клику.
  • 🔸 Двойной клик по строке или ячейке перехватывается событием Выбор. Установите СтандартнаяОбработка = Ложь, чтобы отменить стандартное открытие или редактирование.
  • 🔸 Клик по ячейке с расшифровкой в отчёте ловит ОбработкаРасшифровки. Там же можно открыть своё меню выбора через ПоказатьВыборИзМеню() — это и есть легальный способ показать «своё всплывающее меню» в ответ на действие пользователя.
&НаКлиенте
Процедура ПолеОтчетаОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

	СтандартнаяОбработка = Ложь;

	Варианты = Новый СписокЗначений;
	Варианты.Добавить("Открыть", "Открыть документ");
	Варианты.Добавить("Движения", "Показать движения");

	Оповещение = Новый ОписаниеОповещения("ВыборДействияЗавершение", ЭтотОбъект, Расшифровка);
	ПоказатьВыборИзМеню(Оповещение, Варианты, Элемент);

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

&НаКлиенте
Процедура ВыборДействияЗавершение(ВыбранныйЭлемент, Расшифровка) Экспорт

	Если ВыбранныйЭлемент = Неопределено Тогда
		Возврат;
	КонецЕсли;

	Если ВыбранныйЭлемент.Значение = "Открыть" Тогда
		ПоказатьЗначение(, Расшифровка);
	КонецЕсли;
	// ветку «Движения» допишите под свою задачу

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

Здесь предполагается, что в расшифровку ячейки вы положили ссылку на документ при формировании отчёта.

Обычные формы (толстый клиент)

В старых конфигурациях на обычных формах устройство другое. У табличного поля и поля табличного документа есть своё свойство КонтекстноеМеню и флаг автоматического контекстного меню в палитре свойств элемента. Его снимают в конфигураторе, а своё меню собирают в редакторе контекстного меню формы.

Если конфигурацию переводят на управляемые формы, эти настройки не переносятся. Меню придётся собрать заново по схеме выше.

Почему меню не изменилось: ошибки и отладка

Диагностика: выберите симптом

Пара приёмов для диагностики:

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

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

Можно ли отключить контекстное меню сразу во всех формах конфигурации?
Одного глобального переключателя нет. Меню настраивается в каждой форме. Если форм много, вынесите код в общий серверный модуль и вызывайте его из ПриСозданииНаСервере нужных форм.
Влияет ли отключение меню на скорость открытия формы?
Заметно — нет. Состав меню собирается при создании формы, одна строка кода на это время не влияет.
Работает ли этот код в веб-клиенте?
Да. Свойства элементов управляемой формы одинаковы для тонкого и веб-клиента. Браузерное меню по правому клику платформа подменяет своим.
Можно ли запретить пользователю самому вернуть команды через «Изменить форму»?
Команды, которых нет в меню при Автозаполнение = Ложь, пользователь через настройку формы не вернёт. Право на сохранение пользовательских настроек можно ограничить в роли.
Нужно ли обновлять конфигурацию базы после такой правки?
Если правили основную конфигурацию — да, как после любой доработки. Если код в расширении — достаточно применить расширение.