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

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

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

При тестировании запроса в консоли всё работает корректно, однако при переносе текста в СКД отчет сворачивает данные по всем счетам либо принудительно разворачивает субконто во всех ветках объединения. Разберем причинно-следственные связи этой проблемы и изучим проверенные варианты ее решения.

Почему возникают сложности при объединении запросов в СКД

Проанализируем исходный запрос, который вызывает некорректное поведение в СКД:


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК ВидПлатежа,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокДт КАК Сумма,
    ХозрасчетныйОстаткиИОбороты.Счет.Наименование,
    ХозрасчетныйОстаткиИОбороты.Счет
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоТекущегоПериода {(&НачалоТекущегоПериода)}, &КонецТекущегоПериода {(&КонецТекущегоПериода)}, Авто, , Счет В (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК ВидПлатежа,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК Сумма,
    ХозрасчетныйОстаткиИОбороты.Счет.Наименование,
    ХозрасчетныйОстаткиИОбороты.Счет
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоТекущегоПериода {(&НачалоТекущегоПериода)}, &КонецТекущегоПериода {(&КонецТекущегоПериода)}, Авто, , Счет В иерархии(&Счет2), , ) КАК ХозрасчетныйОстаткиИОбороты

Причины сбоя заключаются в следующих особенностях платформы 1С:

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

Способ 1. Использование промежуточной временной таблицы

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

Рассмотрим пример реализации:


ВЫБРАТЬ
    ХозрасчетныйОстаткиИОбороты.Субконто1 КАК ВидПлатежа,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокДт КАК Сумма,
    ХозрасчетныйОстаткиИОбороты.Счет КАК Счет
ПОМЕСТИТЬ ВТ_Данные
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоТекущегоПериода, &КонецТекущегоПериода, Авто, , Счет В (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    NULL КАК ВидПлатежа,
    ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК Сумма,
    ХозрасчетныйОстаткиИОбороты.Счет КАК Счет
ИЗ
    РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоТекущегоПериода, &КонецТекущегоПериода, Авто, , Счет В иерархии(&Счет2), , ) КАК ХозрасчетныйОстаткиИОбороты;

ВЫБРАТЬ
    ВТ_Данные.ВидПлатежа КАК ВидПлатежа,
    ВТ_Данные.Сумма КАК Сумма,
    ВТ_Данные.Счет КАК Счет,
    ВТ_Данные.Счет.Наименование КАК СчетНаименование
ИЗ
    ВТ_Данные КАК ВТ_Данные

Обратите внимание: во второй части объединения мы подставляем NULL в поле ВидПлатежа. Это исключает принудительную детализацию второй части по субконто.

Способ 2. Разделение на два набора данных СКД

Разберем вариант архитектурного разделения логики отчета без использования конструкций объединения в самом запросе:

  1. Перейдем на вкладку Наборы данных в схеме компоновки данных.
  2. Создадим первый набор данных типа «Запрос» для счетов, требующих развернутого остатка, где выберем СуммаКонечныйРазвернутыйОстатокДт и нужную аналитику.
  3. Создадим второй набор данных типа «Запрос» для счетов, где необходим свернутый остаток по счету без аналитики.
  4. Объединим оба набора на уровне СКД с помощью объединения наборов данных.

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

Способ 3. Отключение автозаполнения и ручная настройка ресурсов

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

  1. На вкладке Наборы данных снимем флаг Автозаполнение.
  2. Удалим автоматически созданные роли остатков и счетов у поля Сумма, сделав его обычным числовым полем.
  3. Перейдем на вкладку Ресурсы и зададим расчет итогов вручную с помощью агрегатной функции СУММА(Сумма).

Отключение автозаполнения запрещает платформе менять структуру SQL-запроса при формировании итогового отчета, сохраняя логику вычисления остатков в точности так, как она написана в запросе.

← На главную