Своё контекстное меню в табличном документе
Понадобилось сделать контекстное меню в табличном документе и тут возникли вопросы. Есть несколько вариантов активизации контекстных меню:
а) по двойному щелчку через вызов обработки расшифровки и последующим вызовом ПоказатьВыборДействия (объекта ОбработкаРасшифровкиКомпоновкиДанных );
б) статическое (классическое) контекстное меню элемента формы.
в) по правому клику мышки (с последующим вызовом ПоказатьВыборИзМеню();
Первый вариант хорош тем, что позволяет делать "Подменю". Вот выдержка:
Плох тем, что не работает без СКД с чистым ТабличнымДокументом, т.к. не откуда взять ДанныеРасшифровки. Отметаем...
Второй вариант хорош тем, что позволяет создавать подменю, но само контекстное меню статичное и набор его элементов невозможно изменить в зависимости от выбранной ячейки ТабличногоДокумента. Отметаем...
Третий вариант хорош всем за исключением того, что в нем невозможно создание подменю. Такой вариант (как для варианта с расшифровкой) не прокатывает:
Что за несправедливость? Может быть можно как-то обмануть расшифровку, чтобы она начала работать без схемы и её настроек? (платформа 8.3.11)
а) по двойному щелчку через вызов обработки расшифровки и последующим вызовом ПоказатьВыборДействия (объекта ОбработкаРасшифровкиКомпоновкиДанных );
б) статическое (классическое) контекстное меню элемента формы.
в) по правому клику мышки (с последующим вызовом ПоказатьВыборИзМеню();
Первый вариант хорош тем, что позволяет делать "Подменю". Вот выдержка:
В случае, если значением элемента списка является список значений, из него будет сформировано подменю
Плох тем, что не работает без СКД с чистым ТабличнымДокументом, т.к. не откуда взять ДанныеРасшифровки. Отметаем...
Второй вариант хорош тем, что позволяет создавать подменю, но само контекстное меню статичное и набор его элементов невозможно изменить в зависимости от выбранной ячейки ТабличногоДокумента. Отметаем...
Третий вариант хорош всем за исключением того, что в нем невозможно создание подменю. Такой вариант (как для варианта с расшифровкой) не прокатывает:
...
Подменю = Новый СписокЗначений;
Для Каждого КлючИЗначение Из Структура Цикл
Подменю.Добавить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
Меню.Добавить(Подменю, "тест");
ПоказатьЧто за несправедливость? Может быть можно как-то обмануть расшифровку, чтобы она начала работать без схемы и её настроек? (платформа 8.3.11)
По теме из базы знаний
- [УТ11] Наглядное заполнение документа "Заказ Клиента" по таблице (например, Excel, управляемое приложение)
- Интеграция сценарного тестирования в процесс разработки
- Разработка и сценарное тестирование с Vanessa-ADD. Практические примеры сценариев. Шаги встроенной библиотеки
- BDDSM-практики, или 50 оттенков желтого
- Как сохранить данные табличного поля в табличный документ / файл Excel программно
Найденные решения
(12) Я решил вопрос "экзотическим" способом. Методом проб и ошибок получился такой код (в интернете нет ничего подобного):
Т.е. я просто создаю программно пустой ИсточникДоступныхНастроекКомпоновкиДанных на основе пустой СхемуКомпоновкиДанных, затем пустые ДанныеРасшифровки, ИдентификаторРасшифровкиКомпоновкиДанных с идентификатором расшифровки "0" и добавляю 1 единственный пустой элемент ЗначенияПолейРасшифровкиКомпоновкиДанных к элементам в ДанныеРасшифровки. Не знаю насколько большой получился overhead, но меню формируется быстро, даже если эти объекты создавать каждый раз. А главное работает по правому клику мышки.
&НаКлиенте
Процедура ТДРезультатОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
СтандартнаяОбработка = Ложь;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
ДанныеРасшифровки.Элементы.Добавить(Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля"),, Новый ЗначенияПолейРасшифровкиКомпоновкиДанных);
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Новый СхемаКомпоновкиДанных));
ДоступныеДействия=Новый Массив;
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
ДополнительныеДействия = Новый СписокЗначений;
ДополнительныеДействия.Добавить("Действие1", "Пункт 1");
ДополнительныеДействия.Добавить("Действие2", "Пункт 2");
Подменю = Новый СписокЗначений;
Подменю.Добавить("Тест","Элемент подменю");
ДополнительныеДействия.Добавить(Подменю, "Подменю");
Оп = Новый ОписаниеОповещения("РезультатОбработкаРасшифровки_Завершение", ЭтаФорма, Расшифровка);
ОбработкаРасшифровки.ПоказатьВыборДействия(Оп, Новый ИдентификаторРасшифровкиКомпоновкиДанных(0), ДоступныеДействия, ДополнительныеДействия, Ложь );
КонецПроцедуры
&НаКлиенте
Процедура РезультатОбработкаРасшифровки_Завершение(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт
Если ВыполненноеДействие = "Действие1" Тогда
Сообщить(ТипЗнч(ДополнительныеПараметры)); // Значение расшифровки
ИначеЕсли ВыполненноеДействие = "Действие2" Тогда
ИначеЕсли ВыполненноеДействие=ДействиеОбработкиРасшифровкиКомпоновкиДа нных.ОткрытьЗначение Тогда
//ОткрытьЗначение(ПараметрВыполненногоДействия);
КонецЕсли;
КонецПроцедуры
ПоказатьТ.е. я просто создаю программно пустой ИсточникДоступныхНастроекКомпоновкиДанных на основе пустой СхемуКомпоновкиДанных, затем пустые ДанныеРасшифровки, ИдентификаторРасшифровкиКомпоновкиДанных с идентификатором расшифровки "0" и добавляю 1 единственный пустой элемент ЗначенияПолейРасшифровкиКомпоновкиДанных к элементам в ДанныеРасшифровки. Не знаю насколько большой получился overhead, но меню формируется быстро, даже если эти объекты создавать каждый раз. А главное работает по правому клику мышки.
Прикрепленные файлы:
Остальные ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
(8) Этот вариант мне не подходит по той простой причине, что мне нужно именно динамическое меню. Заголовки команд в меню будут меняться, состав и количество элементов в подменю тоже. Их невозможно запрограммировать заранее. Управлять только видимостью элементов для меня недостаточно. Как один из вариантов можно попробовать изменять состав реквизитов формы, т.е. каждый раз формировать группу в контекстном меню заново и гонять кэш формы с клиента на сервер и обратно.
Странно, что разработчики 1С не сделали единый функционал для таких вещей.
Странно, что разработчики 1С не сделали единый функционал для таких вещей.
(12) Я решил вопрос "экзотическим" способом. Методом проб и ошибок получился такой код (в интернете нет ничего подобного):
Т.е. я просто создаю программно пустой ИсточникДоступныхНастроекКомпоновкиДанных на основе пустой СхемуКомпоновкиДанных, затем пустые ДанныеРасшифровки, ИдентификаторРасшифровкиКомпоновкиДанных с идентификатором расшифровки "0" и добавляю 1 единственный пустой элемент ЗначенияПолейРасшифровкиКомпоновкиДанных к элементам в ДанныеРасшифровки. Не знаю насколько большой получился overhead, но меню формируется быстро, даже если эти объекты создавать каждый раз. А главное работает по правому клику мышки.
&НаКлиенте
Процедура ТДРезультатОбработкаДополнительнойРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
СтандартнаяОбработка = Ложь;
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
ДанныеРасшифровки.Элементы.Добавить(Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля"),, Новый ЗначенияПолейРасшифровкиКомпоновкиДанных);
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровки, Новый ИсточникДоступныхНастроекКомпоновкиДанных(Новый СхемаКомпоновкиДанных));
ДоступныеДействия=Новый Массив;
ДоступныеДействия.Добавить(ДействиеОбработкиРасшифровкиКомпоновкиДанных.ОткрытьЗначение);
ДополнительныеДействия = Новый СписокЗначений;
ДополнительныеДействия.Добавить("Действие1", "Пункт 1");
ДополнительныеДействия.Добавить("Действие2", "Пункт 2");
Подменю = Новый СписокЗначений;
Подменю.Добавить("Тест","Элемент подменю");
ДополнительныеДействия.Добавить(Подменю, "Подменю");
Оп = Новый ОписаниеОповещения("РезультатОбработкаРасшифровки_Завершение", ЭтаФорма, Расшифровка);
ОбработкаРасшифровки.ПоказатьВыборДействия(Оп, Новый ИдентификаторРасшифровкиКомпоновкиДанных(0), ДоступныеДействия, ДополнительныеДействия, Ложь );
КонецПроцедуры
&НаКлиенте
Процедура РезультатОбработкаРасшифровки_Завершение(ВыполненноеДействие, ПараметрВыполненногоДействия, ДополнительныеПараметры) Экспорт
Если ВыполненноеДействие = "Действие1" Тогда
Сообщить(ТипЗнч(ДополнительныеПараметры)); // Значение расшифровки
ИначеЕсли ВыполненноеДействие = "Действие2" Тогда
ИначеЕсли ВыполненноеДействие=ДействиеОбработкиРасшифровкиКомпоновкиДа нных.ОткрытьЗначение Тогда
//ОткрытьЗначение(ПараметрВыполненногоДействия);
КонецЕсли;
КонецПроцедуры
ПоказатьТ.е. я просто создаю программно пустой ИсточникДоступныхНастроекКомпоновкиДанных на основе пустой СхемуКомпоновкиДанных, затем пустые ДанныеРасшифровки, ИдентификаторРасшифровкиКомпоновкиДанных с идентификатором расшифровки "0" и добавляю 1 единственный пустой элемент ЗначенияПолейРасшифровкиКомпоновкиДанных к элементам в ДанныеРасшифровки. Не знаю насколько большой получился overhead, но меню формируется быстро, даже если эти объекты создавать каждый раз. А главное работает по правому клику мышки.
Прикрепленные файлы:
Выяснились еще нюансы. Если в меню всего 1 элемент, то при его вызове, вместо того, чтобы показать его, она вызывает обработку действия этого меню непосредственно без показа. Еще нельзя сделать свой элемент меню неактивным, вставлять разделители (или объединять в группы).
(17) Возможно я тестировал в толстом клиенте. Но печатные формы в тонких клиентах пользователей до сих пор работают. Стало быть я в последствии перенес ДанныеРасшифровки во временное хранилище и использовал уже адрес хранилища в конструкторе ОбработкаРасшифровкиКомпоновкиДанных.
Если ТипЗнч(Расшифровка) = Тип("Структура") Тогда
СтандартнаяОбработка = Ложь;
ОбработкаРасшифровки = Новый ОбработкаРасшифровкиКомпоновкиДанных(ДанныеРасшифровкиКомпоновкиДанных(), Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаКомпоновкиДанных()));
ДополнительныеДействия = Новый СписокЗначений;
ДополнительныеДействия.Добавить("Расшифровка", НСтр("ru = 'Расшифровка...'; uk = 'Розшифровка...'"));
ДополнительныеДействия.Добавить("ОткрытьНастройку", НСтр("ru = 'Открыть настройку поля'; uk = 'Відкрити налаштування поля'"));
Оп = Новый ОписаниеОповещения("ОбработкаВыбораРасшифровки", ЭтаФорма, Расшифровка);
ОбработкаРасшифровки.ПоказатьВыборДействия(Оп, Новый ИдентификаторРасшифровкиКомпоновкиДанных(0), , ДополнительныеДействия, Ложь, Элементы.ТабличныйДокумент);
КонецЕсли;
ПоказатьРугается на ПоказатьВыборДейсвтвия:
Значение данных расшифровки отсутствует, либо имеет неправильный тип
{Отчет.мв_УправленческийОтчетБаланс.Форма.ФормаОтчета2021.Форма(174)}: ОбработкаРасшифровки.ПоказатьВыборДействия(Оп, Новый ИдентификаторРасшифровкиКомпоновкиДанных(0), , ДополнительныеДействия, Ложь);
по причине:
Значение данных расшифровки отсутствует, либо имеет неправильный тип
есть идеи как добить?
полечилось добавлением идентификатора при помещении в хранилище
&НаСервере
Функция ДанныеРасшифровкиКомпоновкиДанных()
ДанныеРасшифровки = Новый ДанныеРасшифровкиКомпоновкиДанных;
ДанныеРасшифровки.Элементы.Добавить(Тип("ЭлементРасшифровкиКомпоновкиДанныхПоля"),, Новый ЗначенияПолейРасшифровкиКомпоновкиДанных);
Возврат ПоместитьВоВременноеХранилище(ДанныеРасшифровки, Новый УникальныйИдентификатор);
КонецФункции
&НаСервере
Функция СхемаКомпоновкиДанных()
Возврат ПоместитьВоВременноеХранилище(Новый СхемаКомпоновкиДанных, Новый УникальныйИдентификатор);
КонецФункции
Показать
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот