Как убрать "лишние" поля и действия в меню расшифровки отчета на СКД?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке отчетов на базе Системы Компоновки Данных (СКД) мы часто сталкиваемся со следующей ситуацией: в самом отчете выводится множество полей, которые необходимы пользователю для визуального анализа. Однако при двойном клике на ячейку (при попытке расшифровать данные) система автоматически предлагает огромный список всех доступных полей строки. В этом списке могут оказаться служебные реквизиты, идентификаторы и просто лишние данные, которые только путают пользователя. Если мы просто снимем галочки использования в настройках схемы СКД, эти поля пропадут и из самого отчета, что нас категорически не устраивает.

Проанализируем ситуацию и разберем по шагам, как можно решить эту задачу, оставив нужные поля в отчете, но при этом очистив меню расшифровки. Рассмотрим два основных способа решения: от простой настройки макета до полного программного контроля над меню.

Способ 1. Использование пользовательских макетов СКД (без сложного программирования)

Если проблема касается только конкретных ячеек или определенных группировок, мы можем обойтись переопределением макета вывода непосредственно в схеме компоновки данных. Этот способ отлично подходит, когда мы точно знаем, по какому полю должна происходить расшифровка при клике на конкретную колонку.

Разберем алгоритм настройки:

  1. Откроем схему компоновки данных нашего отчета и перейдем на вкладку Макеты.
  2. Добавим новый макет поля или макет группировки для той области, где мы хотим изменить поведение расшифровки.
  3. В свойствах конкретной ячейки созданного макета найдем настройку ПараметрРасшифровки.
  4. Вместо стандартного поведения привяжем к этому параметру только то конкретное поле (или выражение), по которому должна происходить логика расшифровки.

Какой будет результат? При двойном клике по настроенной ячейке система перестанет предлагать пользователю простыню из всех доступных полей строки (включая служебные и лишние). Окно выбора либо не появится вовсе (сразу откроется значение, если оно одно), либо будет отрабатывать только по нашему явно заданному параметру.

Способ 2. Программное переопределение меню расшифровки

Если нам нужен полный контроль над тем, что увидит пользователь (например, мы хотим убрать не только лишние поля, но и системные действия типа "Отфильтровать", "Упорядочить" или "Оформить"), выясним причину стандартного поведения и перехватим управление кодом. Нам потребуется создать форму отчета и написать обработчик события для поля табличного документа.

Рассмотрим подробнее шаги программной реализации:

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

Посмотрим на пример того, как концептуально выглядит такой код в модуле формы отчета:


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

&НаКлиенте
Процедура ПослеВыбораИзМенюРасшифровки(ВыбранныйПункт, Параметры) Экспорт
    Если ВыбранныйПункт = Неопределено Тогда
        Возврат;
    КонецЕсли;
    
    // Обрабатываем выбор пользователя (открываем форму или формируем новый отчет)
КонецПроцедуры

Подведем итоги:

Мы проанализировали оба метода. Если вам нужно просто направить расшифровку по одному конкретному пути (например, чтобы при клике на сумму всегда открывался документ-регистратор) — смело используйте макеты в схеме СКД, это быстро и не требует кодирования. Если же ваша задача — оставить сложную вариативную расшифровку (например, по 3-4 определенным аналитикам), но убрать из выпадающего списка "мусор" и заблокировать системные действия типа настройки группировок — применяйте программный перехват ОбработкаРасшифровки с использованием объекта ОбработкаРасшифровкиКомпоновкиДанных. Это позволит сделать интерфейс вашего отчета чистым, понятным и защищенным от случайных действий пользователя.

← На главную