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

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

Как добавить команду в контекстное меню табличной части в 1С

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

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

В управляемых формах 1С 8.3 добавить свою команду в это меню можно двумя способами: в редакторе формы конфигуратора (перетаскиванием команды в дерево элементов) или программно в модуле формы. Первый способ проще и нагляднее, второй нужен, когда команда должна появляться динамически — по условию, для определённых ролей или в расширении без изменения типовой формы.

Ниже разобраны оба подхода, типичные ошибки и способы проверить, что команда действительно появилась и работает. Материал ориентирован на управляемые формы (тонкий клиент, веб-клиент); в обычных формах механизм отличается и рассматривается отдельно.

Как устроено контекстное меню табличной части

У каждой таблицы формы (элемент с типом «ТаблицаФормы») есть три стандартных места размещения команд: командная панель таблицы, контекстное меню и подменю «Ещё». В дереве элементов редактора формы они отображаются как вложенные узлы с именами вида ТоварыКоманднаяПанель и ТоварыКонтекстноеМеню.

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

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

Подготовка: создаём команду формы и обработчик

Откройте нужную форму объекта в конфигураторе и перейдите на закладку «Команды» → «Команды формы». Нажмите «Добавить» и задайте имя команды, например ЗаполнитьПоОстаткам. В свойствах команды укажите заголовок — именно его увидит пользователь в меню, — при необходимости картинку, подсказку и сочетание клавиш.

Затем в свойстве «Действие» нажмите кнопку выбора — платформа предложит создать обработчик. Выбирайте вариант «На клиенте», если логика не требует обращения к серверу, либо создайте пару обработчиков: клиентский, который собирает данные текущей строки, и серверный, который выполняет запросы к базе.

Пример типового каркаса обработчика:

&НаКлиенте

Процедура ЗаполнитьПоОстаткам(Команда)

ТекущиеДанные = Элементы.Товары.ТекущиеДанные;

Если ТекущиеДанные = Неопределено Тогда

ПоказатьПредупреждение(, "Сначала выберите строку таблицы.");

Возврат;

КонецЕсли;

ЗаполнитьПоОстаткамНаСервере(ТекущиеДанные.Номенклатура);

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

Проверка на ТекущиеДанные = Неопределено обязательна: пользователь может вызвать контекстное меню на пустой таблице, и без проверки команда завершится ошибкой.

Способ 1: добавление команды через редактор формы

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

Перетащите команду из правой панели «Команды формы» прямо на узел контекстного меню. Платформа создаст кнопку с типом «Кнопка формы», связанную с вашей командой. В свойствах кнопки можно переопределить заголовок, картинку и свойство «ТолькоВоВсехДействиях» — если его установить, команда уйдёт в подменю «Ещё» внутри контекстного меню.

Порядок действий в редакторе формы
  1. 1
    Откройте форму объекта в конфигураторе
  2. 2
    На закладке «Команды» создайте команду формы и обработчик
  3. 3
    В дереве элементов раскройте узел табличной части
  4. 4
    Найдите вложенный узел «КонтекстноеМеню»
  5. 5
    Перетащите команду на этот узел
  6. 6
    Сохраните конфигурацию и проверьте в режиме предприятия

Если узел контекстного меню не виден, убедитесь, что вы смотрите именно на таблицу формы, а не на группу-колонку или реквизит. Контекстное меню существует только у элементов типа «Таблица формы».

Способ 2: программное добавление команды

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

&НаСервере

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

НоваяКоманда = Команды.Добавить("ЗаполнитьПоОстаткам");

НоваяКоманда.Заголовок = "Заполнить по остаткам";

НоваяКоманда.Действие = "ЗаполнитьПоОстаткам";

РодительМеню = Элементы.Товары.КонтекстноеМеню;

Кнопка = Элементы.Добавить("ТоварыЗаполнитьПоОстаткам",

Тип("КнопкаФормы"), РодительМеню);

Кнопка.ИмяКоманды = "ЗаполнитьПоОстаткам";

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

Ключевой момент — третий параметр метода Элементы.Добавить: родителем кнопки должно быть именно Элементы.Товары.КонтекстноеМеню, а не сама таблица. Обработчик ЗаполнитьПоОстаткам должен существовать в модуле формы заранее, иначе при открытии формы возникнет ошибка «Процедура или функция с указанным именем не определена».

Добавление команды через расширение конфигурации

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

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

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

Сравнение подходов

Редактор формы

Подходит для собственных конфигураций. Наглядно, легко поддерживать, но требует снятия объекта с поддержки.

Программно в модуле

Гибко, работает по условию и для ролей. Сложнее отлаживать, команда не видна в конфигураторе.

Расширение

Единственный вариант для типовых конфигураций на поддержке. Ограничения при динамических изменениях типовой формы.

Управление видимостью и доступностью команды

Часто команда нужна не всегда, а только в определённых состояниях документа. Для этого у кнопки есть свойства Видимость и Доступность, которыми можно управлять программно — например, блокировать команду, когда документ проведён:

Элементы.ТоварыЗаполнитьПоОстаткам.Доступность = Не Объект.Проведен;

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

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

Не перегружайте контекстное меню: если команд больше пяти-семи, объединяйте редкие в подменю (добавьте в контекстное меню группу с видом «Подменю» и разместите кнопки внутри неё). Иначе пользователи будут тратить время на поиск нужного пункта.
ПЗ
Практическое замечание

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

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

Если команда не появилась, проверьте по порядку: сохранена ли форма и обновлена ли конфигурация БД; в тот ли узел добавлена кнопка (командная панель вместо контекстного меню — самая частая причина); не сброшена ли видимость; не перекрывает ли форму активное расширение.

Типичные ошибки
01
Кнопка добавлена в командную панель таблицы, а не в контекстное меню — по правому клику её не видно
02
В программном добавлении родителем указана сама таблица вместо Элементы.Товары.КонтекстноеМеню — ошибка или кнопка не там
03
Обработчик команды не создан в модуле формы — ошибка при открытии формы
04
Нет проверки ТекущиеДанные = Неопределено — падение при вызове на пустой таблице
05
Команда добавлена в расширении, но забыта директива &После для программного кода — кнопка не создаётся
Контрольные точки

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

Правый клик по строке таблицы
Норма

Команда видна с заданным заголовком и активна

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

Команды нет или она серая

Вызов команды на пустой таблице
Норма

Понятное предупреждение пользователю

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

Ошибка платформы или молчаливое завершение

Открытие формы под другим пользователем
Норма

Видимость соответствует ролям и настройкам

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

Команда доступна всем или пропала у всех

Дополнительно полезно проверить форму в веб-клиенте, если он используется: отображение контекстных меню там может отличаться, а сочетания клавиш — не работать. Картинки крупного размера в меню тоже лучше не использовать — они искажают высоту строк.

Итог

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

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

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

Команда есть в командной панели, но её нет в контекстном меню. Почему?

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

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

Да, через механизм расширений: создайте расширение, заимствуйте форму, добавьте команду и кнопку в контекстное меню табличной части. Сама типовая конфигурация при этом не изменяется и остаётся на поддержке.

Как добавить свою команду в подменю «Ещё» контекстного меню?

У кнопки в контекстном меню установите свойство «ТолькоВоВсехДействиях» в значение Истина — команда переместится в группу «Ещё» внутри меню. Либо создайте в контекстном меню группу с видом «Подменю» и разместите кнопки в ней.

Почему программно добавленная команда вызывает ошибку «процедура не определена»?

Свойство «Действие» команды содержит имя процедуры, которая должна существовать в модуле формы с точным совпадением имени и директив компиляции. Проверьте, что процедура объявлена с &НаКлиенте или &НаСервере и её имя совпадает со строкой в свойстве Действие.

Как скрыть команду для части пользователей?

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

Работает ли этот подход в обычных формах?

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