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

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

При разработке сложных отчетов в 1С:Комплексная автоматизация (КА 2.4/2.5) на базе Системы компоновки данных (СКД) разработчики часто сталкиваются с проблемой: при попытке расшифровать итоговую сумму до первичного документа (регистратора) система либо не предлагает такое поле, либо оно оказывается пустым. Рассмотрим, почему это происходит и как правильно спроектировать запрос и настройки СКД для сохранения возможности детальной расшифровки.

Анализ проблемы: почему исчезает регистратор?

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

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

Решение №1: Модификация запроса и добавление регистратора во временные таблицы

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


ВЫБРАТЬ
    ДенежныеСредстваБезналичные.СтатьяДвиженияДенежныхСредств КАК СтатьяДДС,
    ДенежныеСредстваБезналичные.Организация КАК Организация,
    СУММА(ДенежныеСредстваБезналичные.Сумма) КАК Суммафакт,
    ДенежныеСредстваБезналичные.Регистратор.ЦФО КАК ЦФО,
    ДенежныеСредстваБезналичные.Регистратор КАК Регистратор // Добавляем поле
ПОМЕСТИТЬ Факт
ИЗ
    РегистрНакопления.ДенежныеСредстваБезналичные КАК ДенежныеСредстваБезналичные
ГДЕ
    ДенежныеСредстваБезналичные.Период >= &НачалоПериода
    И ДенежныеСредстваБезналичные.Период <= &КонецПериода
СГРУППИРОВАТЬ ПО
    ДенежныеСредстваБезналичные.СтатьяДвиженияДенежныхСредств,
    ДенежныеСредстваБезналичные.Организация,
    ДенежныеСредстваБезналичные.Регистратор.ЦФО,
    ДенежныеСредстваБезналичные.Регистратор // Добавляем в группировку

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

Проанализируем ситуацию далее: во всех последующих соединениях (ЛЕВОЕ СОЕДИНЕНИЕ) поле Регистратор также должно участвовать в выборке последнего пакета запроса.

Решение №2: Использование параметров виртуальных таблиц

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


ВЫБРАТЬ
    ПланДСОбороты.СтатьяДС КАК СтатьяДС,
    СУММА(ПланДСОбороты.СуммаОборот) КАК СуммаПлан,
    ПланДСОбороты.ЦФО КАК ЦФО
ИЗ
    РегистрНакопления.кфтПланДС.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПланДСОбороты

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

РегистрНакопления.кфтПланДС.Обороты(&НачалоПериода, &КонецПериода, Авто, )

Использование значения Авто или Регистратор позволяет СКД вытаскивать документы-основания. Однако помните, что это работает только в том случае, если вы действительно выбираете поле Регистратор в списке полей ВЫБРАТЬ.

Решение №3: Настройка ролей полей в СКД

После того как мы добавили Регистратор в текст запроса, необходимо правильно настроить его в конструкторе СКД на закладке «Наборы данных». Без правильных ролей СКД может некорректно суммировать итоги или дублировать строки.

  1. Найдите поле Регистратор в списке полей набора данных.
  2. В колонке «Роль» нажмите на гиперссылку для настройки.
  3. Установите флаг «Период».
  4. Укажите порядковый номер периода (например, если у вас есть поле «Период» с номером 1, установите регистратору номер 2).
  5. Убедитесь, что для измерений (Статья ДДС, Организация, ЦФО) установлена роль «Измерение». Это критически важно: когда в итоговой выборке появляются детальные записи (регистраторы), СКД должна понимать, по каким полям агрегировать ресурсы (СуммаФакт, СуммаПлан), чтобы избежать их «размножения» при соединении таблиц.

Решение №4: Метод «Связи наборов данных» (Альтернативный подход)

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

Набор данных 1 (Агрегированный): Здесь мы оставляем запрос в его исходном виде, получая общие суммы по Статьям и ЦФО. Это обеспечит высокую скорость формирования основного отчета.

Набор данных 2 (Детальный): Создаем отдельный запрос к регистрам (безналичные и наличные ДС), где выбираем только Статью ДДС, ЦФО, Сумму и Регистратор без сложных группировок.

Затем на закладке «Связи наборов данных» мы связываем эти наборы по ключевым полям (Статья и ЦФО). В настройках отчета мы можем добавить группировку по регистратору как вложенную в основную группировку по статьям. В этом случае расшифровка будет работать «из коробки», так как СКД сама выполнит детальный запрос при клике на сумму.

Особенности ЦФО в Комплексной автоматизации 2.4/2.5

Обратим внимание на важную деталь в коде: ДенежныеСредстваБезналичные.Регистратор.ЦФО. В типовых конфигурациях 1С поле ЦФО часто не является измерением регистра накопления, а хранится как реквизит документа.

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

Рекомендация: Если вы замечаете падение производительности, лучше вынести получение ЦФО в отдельное левое соединение с конкретными таблицами документов или использовать дополнительные реквизиты, если архитектура вашей базы это позволяет.

Итоговый чек-лист для реализации расшифровки

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

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

← На главную