При разработке интерфейсов в среде 1С:Предприятие 8.3 часто возникает необходимость предоставить пользователю быстрый доступ к действиям над строками таблицы. Контекстное меню — это классический и наиболее интуитивно понятный способ реализации такого функционала. Давайте подробно разберем, как реализовать контекстное меню, начиная от простых настроек и заканчивая сложными программными манипуляциями.
Если ваша задача — добавить стандартную или собственную команду в меню всей таблицы, вам не потребуется написание кода. Система позволяет выполнять добавление реквизитов и элементов формы через визуальные инструменты:
Таблица.Команду (она должна быть предварительно создана в списке команд формы) и просто перетащите её в появившуюся область контекстного меню.После этого при нажатии правой кнопкой мыши на любую строку таблицы пользователь увидит вашу команду в выпадающем списке. Это самый быстрый и надежный способ для большинства прикладных задач.
Часто разработчики сталкиваются с требованием: «хочу, чтобы в первой колонке было одно меню, а во второй — другое». Важно понимать: стандартная архитектура 1С привязывает контекстное меню к Таблице в целом, а не к отдельным колонкам или Полю формы. Попытки простого добавления команд в свойства Поля ввода внутри таблицы часто игнорируются платформой.
Для решения этой задачи необходимо использовать программное управление. Разберем подход через событие ПриАктивизацииЯчейки:
Суть метода заключается в динамическом изменении состава команд в момент, когда пользователь встает на конкретную ячейку. Для этого мы используем свойство КонтекстноеМеню элемента управления Таблица.
&НаКлиенте
Процедура СписокПриАктивизацииЯчейки(Элемент)
// Получаем текущую колонку
ТекущаяКолонка = Элемент.ТекущаяКолонка;
// Очищаем текущие команды, чтобы не было дублей
Элементы.Список.КонтекстноеМеню.ПодчиненныеЭлементы.Очистить();
// Добавляем команды в зависимости от условий
Если ТекущаяКолонка.Имя = "Цена" Тогда
// Добавляем специфическую команду для колонки Цена
НоваяКнопка = Элементы.Список.КонтекстноеМеню.ПодчиненныеЭлементы.Добавить(Тип("КнопкаФормы"), "МояСпецКоманда", Элементы.Список.КонтекстноеМеню);
НоваяКнопка.Заголовок = "Пересчитать цену";
НоваяКнопка.ИмяКоманды = "ПересчитатьЦену";
КонецЕсли;
КонецПроцедуры
Важные замечания по реализации:
ПодчиненныеЭлементы контекстного меню при переходе между ячейками, иначе команды будут накапливаться при каждом клике.Иногда после удаления или изменения строки через контекстное меню таблица не обновляет свое состояние. Это связано с тем, что контекстное меню является «островком» управления, который может не вызывать автоматического обновления привязанных данных.
Чтобы обеспечить корректную работу, проанализируем следующие шаги:
Удалить() убедитесь, что вы работаете с актуальным индексом строки.ДинамическимСписком, простого удаления недостаточно. После выполнения удаления на сервере обязательно вызовите метод Обновить() для динамического списка.ОбновитьОтображениеДанных(), чтобы интерфейс «увидел» изменения.В завершение стоит отметить: если требования к сложности контекстного меню растут, возможно, правильным решением будет отказ от него в пользу Командной панели, размещенной над таблицей. Это более прозрачный для пользователя способ взаимодействия, который лишен ограничений, накладываемых контекстными меню платформы.