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