Как в отчете на СКД настроить расшифровку суммы по документам без их вывода в отчет?

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

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

Разберем типичные ошибки разработчиков в этой ситуации, проанализируем принципы работы механизма СКД и подробно рассмотрим способы правильной настройки как в пользовательском режиме, так и программно.

Почему не срабатывает флаг «Обязательное» и роль поля «Измерение»?

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

  1. Путаница с ролью поля: Флаг «Измерение» на вкладке Роли схемы компоновки данных не связывает числовые ресурсы с полями-ссылками. Он предназначен исключительно для корректного расчета остатков и оборотов по периодическим регистрам. Установка этого флага для документа никак не сделает его полем расшифровки для ресурса.
  2. Свойство «Обязательное»: Если в наборе данных поле документа помечено как Обязательное, СКД гарантированно оставит его в итоговом тексте SQL-запроса к базе данных и не исключит его при оптимизации. Однако если поле не участвует в структуре настроек отчета, система все равно рассчитает группировочные строки, а само поле останется лишь в памяти компоновщика.
  3. Жесткая группировка в самом тексте запроса: Если в наборе данных-запросе прописано СГРУППИРОВАТЬ ПО и поле документа в список группировки не включено, документы физически не попадают в выборку. В таком случае никакие настройки СКД не смогут восстановить первичные регистраторы.

Способ 1. Настройка штатной расшифровки платформы

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

Разберем по шагам правильную последовательность настройки схемы компоновки:

  1. Подготовка запроса без жесткой агрегации: В наборе данных-запросе выбираем поле документа (например, Ссылка или Регистратор), аналитики (например, Контрагент) и числовое поле (например, Сумма). Конструкцию СГРУППИРОВАТЬ ПО в запросе не используем, чтобы запрос возвращал детальные записи.
  2. Настройка ресурсов: На вкладке Ресурсы для числового поля добавляем расчет итогов, прописав выражение Сумма(Сумма). Рассчитывать итоги теперь будет сама СКД.
  3. Настройка структуры отчета: На вкладке Настройки создаем группировку только по аналитике (например, Контрагент). Группировку по документу в структуру не добавляем. Поле «Детальные записи» также не добавляем.

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

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

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

Разберем реализацию в модуле формы отчета:

  1. В форме отчета находим элемент Результат типа ПолеТабличногоДокумента.
  2. Создаем для него обработчик события ОбработкаРасшифровки.
  3. Переопределяем стандартную обработку и открываем форму списка с отбором.

Посмотрим на пример программной обработки:


&НаКлиенте
Процедура РезультатОбработкаРасшифровки(Элемент, Расшифровка, СтандартнаяОбработка)
    
    СтандартнаяОбработка = Ложь;
    
    // Получаем значение текущей группировки и открываем список
    ОткрытьФормуСпискаСОтбором(Расшифровка);
    
КонецПроцедуры

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

Важные нюансы и ограничения СКД

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

  1. Инициализация данных расшифровки: Если вывод отчета выполняется полностью программно через ПроцессорКомпоновкиДанных, в метод Инициализировать() вторым параметром обязательно передается объект ДанныеРасшифровкиКомпоновкиДанных. Без этого расшифровка работать не будет.
  2. Ограничения детальных записей: Если в структуре отчета верхний уровень настроен как Детальные записи, платформа блокирует действие «Расшифровать», так как считает запись конечным уровнем иерархии данных.
  3. Разделение кликов в управляемых формах: Для управляемого интерфейса двойной клик мыши обрабатывается в событии ОбработкаРасшифровки, а вызов контекстного меню правой кнопкой мыши — в событии ОбработкаДополнительнойРасшифровки.
← На главную