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

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

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

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

Контекст 1. Универсальный отчет на обычных формах (УТ 10.3, КА 1.1, БП 2.0)

В старых редакциях конфигураций Универсальный отчет построен с использованием объекта ПостроительОтчетов. Расшифровка здесь работает через стандартное событие табличного документа на форме отчета.

Выясним причину, почему стандартная расшифровка ведет себя именно так. При формировании отчета ПостроительОтчетов автоматически заполняет свойство ячеек ПараметрРасшифровки. В качестве этого параметра выступает Структура, содержащая пары "Ключ-Значение", где ключами являются имена группировок (например, Номенклатура, Контрагент), а значениями — конкретные ссылки на элементы справочников или документов.

Разберем по шагам, как переопределить это поведение для реализации нашей задачи (обработка номенклатуры конкретной категории):

Шаг 1. Переопределение события на форме отчета

В форме отчета найдем элемент управления — табличное поле, в которое выводится результат отчета. Для него определено событие РезультатОбработкаРасшифровки. Чтобы внедрить наш собственный алгоритм, нам необходимо установить параметр СтандартнаяОбработка = Ложь, иначе система проигнорирует наши действия и попытается выполнить стандартный алгоритм открытия формы.

Шаг 2. Анализ и обработка структуры расшифровки

Перенаправим обработку в модуль объекта отчета. Перед вызовом стандартного метода общего модуля УниверсальныйОтчет.ОбработкаРасшифровкиУниверсальногоОтчета внедрим собственную проверку. Нам нужно проанализировать структуру расшифровки, извлечь из нее номенклатуру, проверить ее категорию и при совпадении с нужным значением выполнить наше действие.

Рассмотрим пример реализации этого алгоритма в коде:


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

Разберем роль дополнительных параметров

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

Контекст 2. Универсальный отчет на управляемых формах (СКД и БСП)

В современных конфигурациях (ERP, Комплексная автоматизация 2, Управление торговлей 11, Бухгалтерия предприятия 3) Универсальный отчет полностью переведен на рельсы Системы компоновки данных (СКД) и контролируется механизмами Библиотеки стандартных подсистем (БСП).

Здесь архитектура принципиально иная. При клике на ячейку платформа возвращает не структуру с готовыми ссылками, а числовой ИдентификаторРасшифровкиКомпоновкиДанных. Сами данные расшифровки кэшируются во временном хранилище на сервере. Напрямую прочитать реквизиты объекта из ячейки на клиенте без обращения к серверу невозможно.

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

Шаг 1. Использование переопределяемого модуля БСП

В БСП предусмотрен специальный общий модуль ОтчетыКлиентПереопределяемый. В нем содержатся обработчики событий расшифровки, которые вызываются перед тем, как сработает стандартное меню СКД. Нам интересен метод ОбработкаРасшифровки.

Создадим расширение конфигурации, добавим в него общий модуль ОтчетыКлиентПереопределяемый и переопределим процедуру с помощью аннотации &После:


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

Шаг 2. Добавление собственного пункта в стандартное меню расшифровки

Иногда требуется не полностью заменять стандартный клик (который позволяет делать отборы и группировки), а аккуратно встроить свою команду в контекстное меню расшифровки (например, добавить кнопку "Показать специальный анализ по категории").

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

  1. Перехватываем расшифровку в модуле формы или переопределяемом модуле.
  2. Устанавливаем СтандартнаяОбработка = Ложь.
  3. Создаем описание источника настроек и инициализируем объект ОбработкаРасшифровкиКомпоновкиДанных.
  4. Формируем список доступных действий и добавляем туда наше кастомное действие.
  5. Вызываем метод ПоказатьВыборДействия() и обрабатываем выбор пользователя.

Посмотрим на пример реализации такого подхода:


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

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

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

Мы рассмотрели два ключевых механизма кастомизации Универсального отчета в зависимости от используемого интерфейса и поколения платформы 1С. В обычных формах вся логика завязана на обработку структуры в модуле объекта и отмену стандартного поведения через форму. В управляемом приложении (СКД) мы используем программные возможности переопределяемых модулей БСП и методы платформы для динамического получения значений из кэша расшифровки на сервере.

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

← На главную