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