При разработке сложных отчетов в 1С:Комплексная автоматизация (КА 2.4/2.5) на базе Системы компоновки данных (СКД) разработчики часто сталкиваются с проблемой: при попытке расшифровать итоговую сумму до первичного документа (регистратора) система либо не предлагает такое поле, либо оно оказывается пустым. Рассмотрим, почему это происходит и как правильно спроектировать запрос и настройки СКД для сохранения возможности детальной расшифровки.
Проанализируем исходную ситуацию. В запросе автора данные собираются в несколько этапов через временные таблицы: Факт, ВсеСтатьи, ФактГотовый и т.д. В первой же временной таблице Факт используется конструкция СГРУППИРОВАТЬ ПО. Как только мы группируем данные по «Статье ДДС», «Организации» и «ЦФО», информация о конкретном документе-регистраторе безвозвратно теряется для всех последующих пакетов запроса. СКД не может «придумать» регистратор на финальном этапе, если он не был «протащен» через все уровни выборки.
Выясним основную причину: расшифровка по полю возможна только тогда, когда это поле присутствует в результирующем наборе данных или когда СКД может самостоятельно до него «дотянуться» через связи наборов данных.
Разберем по шагам, как изменить логику запроса. Для того чтобы поле Регистратор было доступно в отчете, мы должны включить его во все временные таблицы, где происходит агрегация данных. Рассмотрим пример изменения первого пакета запроса:
ВЫБРАТЬ
ДенежныеСредстваБезналичные.СтатьяДвиженияДенежныхСредств КАК СтатьяДДС,
ДенежныеСредстваБезналичные.Организация КАК Организация,
СУММА(ДенежныеСредстваБезналичные.Сумма) КАК Суммафакт,
ДенежныеСредстваБезналичные.Регистратор.ЦФО КАК ЦФО,
ДенежныеСредстваБезналичные.Регистратор КАК Регистратор // Добавляем поле
ПОМЕСТИТЬ Факт
ИЗ
РегистрНакопления.ДенежныеСредстваБезналичные КАК ДенежныеСредстваБезналичные
ГДЕ
ДенежныеСредстваБезналичные.Период >= &НачалоПериода
И ДенежныеСредстваБезналичные.Период <= &КонецПериода
СГРУППИРОВАТЬ ПО
ДенежныеСредстваБезналичные.СтатьяДвиженияДенежныхСредств,
ДенежныеСредстваБезналичные.Организация,
ДенежныеСредстваБезналичные.Регистратор.ЦФО,
ДенежныеСредстваБезналичные.Регистратор // Добавляем в группировку
Важный нюанс: добавление регистратора в группировку значительно увеличит количество строк во временной таблице. Если раньше у вас была одна строка на статью, то теперь их будет столько, сколько документов создало движения по этой статье. Это неизбежная плата за возможность детальной расшифровки.
Проанализируем ситуацию далее: во всех последующих соединениях (ЛЕВОЕ СОЕДИНЕНИЕ) поле Регистратор также должно участвовать в выборке последнего пакета запроса.
В тексте запроса для получения плановых данных используется виртуальная таблица Обороты. Посмотрим на этот фрагмент:
ВЫБРАТЬ
ПланДСОбороты.СтатьяДС КАК СтатьяДС,
СУММА(ПланДСОбороты.СуммаОборот) КАК СуммаПлан,
ПланДСОбороты.ЦФО КАК ЦФО
ИЗ
РегистрНакопления.кфтПланДС.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПланДСОбороты
Для того чтобы в виртуальной таблице оборотов появилось поле Регистратор, необходимо в параметрах таблицы указать периодичность. Если периодичность не указана (как в примере выше), поле Регистратор будет недоступно. Нам нужно изменить обращение к таблице следующим образом:
РегистрНакопления.кфтПланДС.Обороты(&НачалоПериода, &КонецПериода, Авто, )
Использование значения Авто или Регистратор позволяет СКД вытаскивать документы-основания. Однако помните, что это работает только в том случае, если вы действительно выбираете поле Регистратор в списке полей ВЫБРАТЬ.
После того как мы добавили Регистратор в текст запроса, необходимо правильно настроить его в конструкторе СКД на закладке «Наборы данных». Без правильных ролей СКД может некорректно суммировать итоги или дублировать строки.
Регистратор в списке полей набора данных.Если запрос получается слишком тяжелым из-за обилия временных таблиц с регистраторами, рассмотрим альтернативный метод — использование двух разных наборов данных в одной схеме СКД.
Набор данных 1 (Агрегированный): Здесь мы оставляем запрос в его исходном виде, получая общие суммы по Статьям и ЦФО. Это обеспечит высокую скорость формирования основного отчета.
Набор данных 2 (Детальный): Создаем отдельный запрос к регистрам (безналичные и наличные ДС), где выбираем только Статью ДДС, ЦФО, Сумму и Регистратор без сложных группировок.
Затем на закладке «Связи наборов данных» мы связываем эти наборы по ключевым полям (Статья и ЦФО). В настройках отчета мы можем добавить группировку по регистратору как вложенную в основную группировку по статьям. В этом случае расшифровка будет работать «из коробки», так как СКД сама выполнит детальный запрос при клике на сумму.
Обратим внимание на важную деталь в коде: ДенежныеСредстваБезналичные.Регистратор.ЦФО. В типовых конфигурациях 1С поле ЦФО часто не является измерением регистра накопления, а хранится как реквизит документа.
Рассмотрим ситуацию: обращение через точку (Регистратор.ЦФО) в запросе к физической таблице регистра накопления заставляет СУБД выполнять неявное соединение с таблицами всех типов документов, которые могут быть регистраторами этого регистра. В КА таких типов документов могут быть десятки. Это может привести к существенному замедлению отчета.
Рекомендация: Если вы замечаете падение производительности, лучше вынести получение ЦФО в отдельное левое соединение с конкретными таблицами документов или использовать дополнительные реквизиты, если архитектура вашей базы это позволяет.
Регистратор выбрано в финальном пакете запроса.Регистратор включено в секцию СГРУППИРОВАТЬ ПО.Обороты установить периодичность Авто.Регистратор роль «Период».Применяя эти методы, мы сохраним гибкость сложного аналитического отчета и при этом предоставим пользователю возможность «провалиться» в каждый первичный документ для проверки достоверности данных.