Понадобилось сделать контекстное меню в табличном документе и тут возникли вопросы. Есть несколько вариантов активизации контекстных меню:
а) по двойному щелчку через вызов обработки расшифровки и последующим вызовом ПоказатьВыборДействия (объекта ОбработкаРасшифровкиКомпоновкиДанных );
б) статическое (классическое) контекстное меню элемента формы.
в) по правому клику мышки (с последующим вызовом ПоказатьВыборИзМеню();

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

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

Третий вариант хорош всем за исключением того, что в нем невозможно создание подменю. Такой вариант (как для варианта с расшифровкой) не прокатывает:

```1c
    ...
    Подменю = Новый СписокЗначений;

    Для Каждого КлючИЗначение Из Структура Цикл

    Подменю.Добавить(КлючИЗначение.Ключ, КлючИЗначение.Значение);

    КонецЦикла;

    Меню.Добавить(Подменю, "тест");
```

Что за несправедливость? Может быть можно как-то обмануть расшифровку, чтобы она начала работать без схемы и её настроек? (платформа 8.3.11)
---
Я решил вопрос "экзотическим" способом. Методом проб и ошибок получился такой код (в интернете нет ничего подобного):

```1c
    &НаКлиенте
    Процедура ТДРезультатОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

    Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда

    СтандартнаяОбработка = Ложь;

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    ДанныеРасшифровки.Элементы.Добавить(Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля"),, Новый ЗначенияПолейРасшифровкиКомпоновкиДанных);

    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Новый СхемаКомпоновкиДанных));

    ДоступныеДействия=Новый Массив;
    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);

    ДополнительныеДействия = Новый СписокЗначений;
    ДополнительныеДействия.Добавить("Действие1", "Пункт 1");
    ДополнительныеДействия.Добавить("Действие2", "Пункт 2");

    Подменю = Новый СписокЗначений;
    Подменю.Добавить("Тест","Элемент подменю");
    ДополнительныеДействия.Добавить(Подменю, "Подменю");

    Оп = Новый ОписаниеОповещения("РезультатОбработкаРасшифровки_Завершение", ЭтаФорма, Расшифровка);
    ОбработкаРасшифровки.ПоказатьВыборДействия(Оп, Новый ИдентификаторРасшифровкиКомпоновкиДанных(0), ДоступныеДействия, ДополнительныеДействия, Ложь );

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

    &НаКлиенте
    Процедура РезультатОбработкаРасшифровки_Завершение(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт

    Если ВыполненноеДействие = "Действие1" Тогда

    Сообщить(ТипЗнч(ДополнительныеПараметры)); // Значение расшифровки

    ИначеЕсли ВыполненноеДействие = "Действие2" Тогда

    ИначеЕсли ВыполненноеДействие=ДействиеОбработкиРасшифровкиКомпоновкиДа­нных.ОткрытьЗначение Тогда
    //ОткрытьЗначение(ПараметрВыполненногоДействия);
    КонецЕсли;

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

Т.е. я просто создаю программно пустой ИсточникДоступныхНастроекКомпоновкиДанных на основе пустой СхемуКомпоновкиДанных, затем пустые ДанныеРасшифровки, ИдентификаторРасшифровкиКомпоновкиДанных с идентификатором расшифровки "0" и добавляю 1 единственный пустой элемент ЗначенияПолейРасшифровкиКомпоновкиДанных к элементам в ДанныеРасшифровки. Не знаю насколько большой получился overhead, но меню формируется быстро, даже если эти объекты создавать каждый раз. А главное работает по правому клику мышки.
---
само контекстное меню статичное и набор его элементов невозможно изменить в зависимости от выбранной ячейки ТабличногоДокумента.

С чего это вдруг?
---
Потому, что я не нашел никакого события, которое бы вызывалось перед открытием контекстного меню.
---
(2) Потому, что я не нашел никакого события, которое бы вызывалось перед открытием контекстного меню.

Активизация области чем не устраивает?
---
Это событие будет вызвано как при клике левой кнопкой мышки, правой кнопкой мышки, так и при навигации клавиатурой. Предлагаете при каждой активизацией ячейки перестраивать меню?
---
Ну тогда класть что-нибудь в расшифровку и ловить обработку дополнительной расшифровки.
---
Ну тогда возвращаемся к проблемам описанным в первом посте...
---
не вижу никаких проблем.
---
Этот вариант мне не подходит по той простой причине, что мне нужно именно динамическое меню. Заголовки команд в меню будут меняться, состав и количество элементов в подменю тоже. Их невозможно запрограммировать заранее. Управлять только видимостью элементов для меня недостаточно. Как один из вариантов можно попробовать изменять состав реквизитов формы, т.е. каждый раз формировать группу в контекстном меню заново и гонять кэш формы с клиента на сервер и обратно.

Странно, что разработчики 1С не сделали единый функционал для таких вещей.
---
Зачем гонять-то? Один раз создать динамически и играться видимостью, не? При заполнении табличного документа это же реально?
---
Нет. Один раз создать не получится, т.к. значение ячейки выбирает пользователь, от того, что он там выберет будут и формироваться элементы меню.
---
ну, остается гонять кэш формы)
---
Я решил вопрос "экзотическим" способом. Методом проб и ошибок получился такой код (в интернете нет ничего подобного):

```1c
    &НаКлиенте
    Процедура ТДРезультатОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)

    Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда

    СтандартнаяОбработка = Ложь;

    ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
    ДанныеРасшифровки.Элементы.Добавить(Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля"),, Новый ЗначенияПолейРасшифровкиКомпоновкиДанных);

    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Новый СхемаКомпоновкиДанных));

    ДоступныеДействия=Новый Массив;
    ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);

    ДополнительныеДействия = Новый СписокЗначений;
    ДополнительныеДействия.Добавить("Действие1", "Пункт 1");
    ДополнительныеДействия.Добавить("Действие2", "Пункт 2");

    Подменю = Новый СписокЗначений;
    Подменю.Добавить("Тест","Элемент подменю");
    ДополнительныеДействия.Добавить(Подменю, "Подменю");

    Оп = Новый ОписаниеОповещения("РезультатОбработкаРасшифровки_Завершение", ЭтаФорма, Расшифровка);
    ОбработкаРасшифровки.ПоказатьВыборДействия(Оп, Новый ИдентификаторРасшифровкиКомпоновкиДанных(0), ДоступныеДействия, ДополнительныеДействия, Ложь );

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

    &НаКлиенте
    Процедура РезультатОбработкаРасшифровки_Завершение(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт

    Если ВыполненноеДействие = "Действие1" Тогда

    Сообщить(ТипЗнч(ДополнительныеПараметры)); // Значение расшифровки

    ИначеЕсли ВыполненноеДействие = "Действие2" Тогда

    ИначеЕсли ВыполненноеДействие=ДействиеОбработкиРасшифровкиКомпоновкиДа­нных.ОткрытьЗначение Тогда
    //ОткрытьЗначение(ПараметрВыполненногоДействия);
    КонецЕсли;

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

Т.е. я просто создаю программно пустой ИсточникДоступныхНастроекКомпоновкиДанных на основе пустой СхемуКомпоновкиДанных, затем пустые ДанныеРасшифровки, ИдентификаторРасшифровкиКомпоновкиДанных с идентификатором расшифровки "0" и добавляю 1 единственный пустой элемент ЗначенияПолейРасшифровкиКомпоновкиДанных к элементам в ДанныеРасшифровки. Не знаю насколько большой получился overhead, но меню формируется быстро, даже если эти объекты создавать каждый раз. А главное работает по правому клику мышки.
---
Тоже вчера начал копать в этом направлении, но потом закрутился. Поздравляю, в общем)
---
Только выяснился нюанс, код работает в толстом клиенте. Для тонкого клиента нужно извернутся с временным хранилищем, чтобы передать URI на ДанныеРасшифровки и СхемуКомпоновкиДанных
---
Выяснились еще нюансы. Если в меню всего 1 элемент, то при его вызове, вместо того, чтобы показать его, она вызывает обработку действия этого меню непосредственно без показа. Еще нельзя сделать свой элемент меню неактивным, вставлять разделители (или объединять в группы).
---
Тип не определен (ДанныеРасшифровкиКомпоновкиДанных)
 ДанныеРасшифровки = Новый <<?>>ДанныеРасшифровкиКомпоновкиДанных;

Это для управляемых форм годится??
Скорей всего нет... клиент не видит таких типов
---
Возможно я тестировал в толстом клиенте. Но печатные формы в тонких клиентах пользователей до сих пор работают. Стало быть я в последствии перенес ДанныеРасшифровки во временное хранилище и использовал уже адрес хранилища в конструкторе ОбработкаРасшифровкиКомпоновкиДанных.
---
Надо попробовать, спасибо
---
```1c
    Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда

    СтандартнаяОбработка = Ложь;

    ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровкиКомпоновкиДанных(), Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных()));

    ДополнительныеДействия = Новый СписокЗначений;
    ДополнительныеДействия.Добавить("Расшифровка", НСтр("ru = 'Расшифровка...'; uk = 'Розшифровка...'"));
    ДополнительныеДействия.Добавить("ОткрытьНастройку", НСтр("ru = 'Открыть настройку поля'; uk = 'Відкрити налаштування поля'"));

    Оп = Новый ОписаниеОповещения("ОбработкаВыбораРасшифровки", ЭтаФорма, Расшифровка);
    ОбработкаРасшифровки.ПоказатьВыборДействия(Оп, Новый ИдентификаторРасшифровкиКомпоновкиДанных(0), , ДополнительныеДействия, Ложь, Элементы.ТабличныйДокумент);

    КонецЕсли;
```

Ругается на ПоказатьВыборДейсвтвия:
Значение данных расшифровки отсутствует, либо имеет неправильный тип
{Отчет.мв_УправленческийОтчетБаланс.Форма.ФормаОтчета2021.Форма(174)}: ОбработкаРасшифровки.ПоказатьВыборДействия(Оп, Новый ИдентификаторРасшифровкиКомпоновкиДанных(0), , ДополнительныеДействия, Ложь);

по причине:
Значение данных расшифровки отсутствует, либо имеет неправильный тип

есть идеи как добить?
---
полечилось добавлением идентификатора при помещении в хранилище

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

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