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

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Анализ проблемы и ограничений

Стандартное контекстное меню элемента формы 1С настраивается на этапе конфигурирования. Мы не можем программно перестроить его структуру непосредственно перед открытием по щелчку правой кнопкой мыши. Существующие варианты, такие как ПоказатьВыборИзМеню, удобны, но они лишены возможности создания сложных структур, например, вложенных подменю. В то же время, объект ОбработкаРасшифровкиКомпоновкиДанных позволяет создавать подменю, но жестко привязан к данным СКД.

Решение через имитацию расшифровки данных

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

Пошаговая реализация метода

Разберем процесс создания динамического меню на примере обработки события ОбработкаДополнительнойРасшифровки табличного документа.

  1. Создание данных на сервере. Поскольку типы ДанныеРасшифровкиКомпоновкиДанных являются серверными, для передачи их на клиент в тонком клиенте необходимо использовать временное хранилище.
  2. Инициализация объектов. Мы создаем пустые структуры СКД, чтобы метод ПоказатьВыборДействия не выдавал ошибку отсутствия данных.
  3. Оформление меню. Мы формируем СписокЗначений, в который добавляем как обычные команды, так и другие списки значений для создания подменю.
  4. Вызов меню. Используем ОписаниеОповещения для обработки выбора пользователя.

Посмотрим на пример серверных функций для подготовки объектов:


&НаСервере
Функция ПолучитьДанныеРасшифровкиДляМеню()
    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    ДанныеРасшифровки.Элементы.Добавить(Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля"), , Новый ЗначенияПолейРасшифровкиКомпоновкиДанных);
    Возврат ПоместитьВоВременноеХранилище(ДанныеРасшифровки, Новый УникальныйИдентификатор);
КонецФункции

&НаСервере
Функция ПолучитьСхемуКомпоновкиДляМеню()
    Возврат ПоместитьВоВременноеХранилище(Новый СхемаКомпоновкиДанных, Новый УникальныйИдентификатор);
КонецФункции

Обработка события на клиенте

Теперь рассмотрим, как использовать эти данные в процедуре обработки клика пользователя:


&НаКлиенте
Процедура ТДРезультатОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    СтандартнаяОбработка = Ложь;
    
    // Получаем адреса из хранилища (вызывается на сервере)
    АдресДанных = ПолучитьДанныеРасшифровкиДляМеню();
    АдресСхемы = ПолучитьСхемуКомпоновкиДляМеню();
    
    ДанныеРасшифровки = ПолучитьИзВременногоХранилища(АдресДанных);
    Схема = ПолучитьИзВременногоХранилища(АдресСхемы);
    
    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Схема));
    
    ДополнительныеДействия = Новый СписокЗначений;
    ДополнительныеДействия.Добавить("Действие1", "Пункт 1");
    
    Подменю = Новый СписокЗначений;
    Подменю.Добавить("Тест", "Элемент подменю");
    ДополнительныеДействия.Добавить(Подменю, "Мое подменю");
    
    Оп = Новый ОписаниеОповещения("РезультатОбработкаРасшифровки_Завершение", ЭтаФорма);
    ОбработкаРасшифровки.ПоказатьВыборДействия(Оп, Новый ИдентификаторРасшифровкиКомпоновкиДанных(0), , ДополнительныеДействия, Ложь);
КонецПроцедуры

Важные нюансы реализации

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

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

← На главную