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