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