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