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

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

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

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

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

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

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

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

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

Добавление меню в управляемой форме через конфигуратор

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

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

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

Если команда должна работать с текущей строкой, в обработчике используйте свойство Элементы.Список.ТекущиеДанные или Элементы.Список.ТекущаяСтрока. Для динамического списка текущая строка — это ссылка на объект, для таблицы значений — идентификатор строки, который нужно преобразовать через НайтиПоИдентификатору().

Добавление меню в обычной форме

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

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

Процедура ПриОткрытии()

Меню = ЭлементыФормы.Список.КонтекстноеМеню;

Кнопка = Меню.Кнопки.Добавить("ПоказатьКарточку",

ТипКнопкиКоманднойПанели.Действие,

"Открыть карточку контрагента",

Новый Действие("ПоказатьКарточкуНажатие"));

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

Процедура ПоказатьКарточкуНажатие(Кнопка)

ТекущиеДанные = ЭлементыФормы.Список.ТекущиеДанные;

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

Возврат;

КонецЕсли;

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

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

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

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

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

&НаКлиенте

Процедура СписокПриАктивизацииСтроки(Элемент)

ТекущиеДанные = Элементы.Список.ТекущиеДанные;

ЕстьСтрока = ТекущиеДанные <> Неопределено;

Элементы.СписокКонтекстноеМенюПоказатьИсторию.Доступность = ЕстьСтрока;

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

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

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

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

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

Контрольные точки

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

Пункт в меню
Норма

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

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

Команда отсутствует — проверьте, что кнопка в группе «Контекстное меню», а не в командной панели

Текущая строка
Норма

Обработчик получает данные строки под курсором

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

ТекущиеДанные = Неопределено — пользователь кликнул по пустой области, добавьте проверку

Стандартные команды
Норма

Добавить, Скопировать, Удалить на месте

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

Стандартные пункты пропали — включено ручное заполнение меню

Типичные ошибки и ограничения

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

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

Типичные ошибки
01
Кнопка помещена в командную панель вместо группы «Контекстное меню» — пункт не появляется по правому клику
02
Нет проверки ТекущиеДанные = Неопределено — ошибка при клике на пустом списке
03
Отключено автозаполнение меню без восстановления стандартных команд — пользователи теряют «Добавить» и «Удалить»
04
Обработчик команды описан как функция или без параметров — ошибка вызова в обычных формах
05
Изменения внесены в форму, но конфигурация базы данных не обновлена — в режиме предприятия ничего не меняется

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

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

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

Сравнение вариантов размещения команд

Контекстное меню

Подходит для дополнительных и редких действий над строкой; минус — низкая заметность для пользователя

Командная панель таблицы

Подходит для основных операций; всегда видна, но при большом числе команд перегружает интерфейс

Меню «Ещё»

Подходит для второстепенных команд, которые должны быть доступны и с клавиатуры; не требует правого клика

Итог

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

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

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

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

Чаще всего конфигурация базы данных не обновлена: изменения формы в конфигураторе не попадают в режим предприятия автоматически. Нажмите F7 и подтвердите обновление. Если не помогло — проверьте, что кнопка находится именно в группе «Контекстное меню», а не в командной панели таблицы.

Как сделать пункт меню доступным только для определённых строк?

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

Можно ли добавить в меню стандартную команду, например «Провести»?

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

Как удалить лишний пункт из автоматического контекстного меню?

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

Почему в обработчике команды ТекущиеДанные равны Неопределено?

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