При разработке отчетов в Системе компоновки данных (СКД) разработчики часто сталкиваются со специфическим поведением платформы при работе с виртуальными таблицами регистра бухгалтерии. Рассмотрим распространенную ситуацию: в одной части запроса требуется получить остаток с разворотным сальдо по аналитике (полю Субконто), а во второй части — свернутый остаток только по счету.
При тестировании запроса в консоли всё работает корректно, однако при переносе текста в СКД отчет сворачивает данные по всем счетам либо принудительно разворачивает субконто во всех ветках объединения. Разберем причинно-следственные связи этой проблемы и изучим проверенные варианты ее решения.
Проанализируем исходный запрос, который вызывает некорректное поведение в СКД:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Субконто1 КАК ВидПлатежа,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокДт КАК Сумма,
ХозрасчетныйОстаткиИОбороты.Счет.Наименование,
ХозрасчетныйОстаткиИОбороты.Счет
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоТекущегоПериода {(&НачалоТекущегоПериода)}, &КонецТекущегоПериода {(&КонецТекущегоПериода)}, Авто, , Счет В (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Субконто1 КАК ВидПлатежа,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК Сумма,
ХозрасчетныйОстаткиИОбороты.Счет.Наименование,
ХозрасчетныйОстаткиИОбороты.Счет
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоТекущегоПериода {(&НачалоТекущегоПериода)}, &КонецТекущегоПериода {(&КонецТекущегоПериода)}, Авто, , Счет В иерархии(&Счет2), , ) КАК ХозрасчетныйОстаткиИОбороты
Причины сбоя заключаются в следующих особенностях платформы 1С:
СуммаКонечныйРазвернутыйОстатокДт автоматически теряет аналитическую детализацию и превращается в обычный свернутый остаток.ОБЪЕДИНИТЬ ВСЕ. Из-за этого вторая часть запроса, задуманная как свернутая, также начинает группироваться по субконто.Наиболее надежный способ — скрыть прямые обращения к виртуальным таблицам регистра бухгалтерии от оптимизатора СКД. Для этого поместим результат объединения двух выборок во временную таблицу, а в финальном пакете выберем данные из нее.
Рассмотрим пример реализации:
ВЫБРАТЬ
ХозрасчетныйОстаткиИОбороты.Субконто1 КАК ВидПлатежа,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйРазвернутыйОстатокДт КАК Сумма,
ХозрасчетныйОстаткиИОбороты.Счет КАК Счет
ПОМЕСТИТЬ ВТ_Данные
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоТекущегоПериода, &КонецТекущегоПериода, Авто, , Счет В (&Счет), , ) КАК ХозрасчетныйОстаткиИОбороты
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
NULL КАК ВидПлатежа,
ХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстатокДт КАК Сумма,
ХозрасчетныйОстаткиИОбороты.Счет КАК Счет
ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоТекущегоПериода, &КонецТекущегоПериода, Авто, , Счет В иерархии(&Счет2), , ) КАК ХозрасчетныйОстаткиИОбороты;
ВЫБРАТЬ
ВТ_Данные.ВидПлатежа КАК ВидПлатежа,
ВТ_Данные.Сумма КАК Сумма,
ВТ_Данные.Счет КАК Счет,
ВТ_Данные.Счет.Наименование КАК СчетНаименование
ИЗ
ВТ_Данные КАК ВТ_Данные
Обратите внимание: во второй части объединения мы подставляем NULL в поле ВидПлатежа. Это исключает принудительную детализацию второй части по субконто.
Разберем вариант архитектурного разделения логики отчета без использования конструкций объединения в самом запросе:
СуммаКонечныйРазвернутыйОстатокДт и нужную аналитику.При таком подходе роли полей первого набора данных не оказывают никакого влияния на поля второго набора, что полностью исключает конфликт ролей.
Если необходимо сохранить структуру из одного запроса, проанализируем порядок действий по ручной настройке параметров схемы:
Сумма, сделав его обычным числовым полем.СУММА(Сумма).Отключение автозаполнения запрещает платформе менять структуру SQL-запроса при формировании итогового отчета, сохраняя логику вычисления остатков в точности так, как она написана в запросе.