При разработке управленческих отчетов (например, финансового баланса или движения денежных средств) часто возникает задача вывести данные в строго определенной структуре. Руководству может потребоваться отчет, в котором строки прихода и расхода выводятся последовательно, итоговая сумма группы располагается вверху рядом с заголовком раздела, а внизу рассчитывается конечный остаток.
Разберем основные варианты решения этой задачи средствами Системы компоновки данных (СКД) в 1С на управляемых формах без отказа от стандартного механизма отборов и настроек.
Рассмотрим наименее трудоемкий вариант, при котором иерархия отчета выстраивается прямо в настройках схемы компоновки данных на вкладке Настройки.
Если данные по приходу, расходу и остаткам можно разделить на уровне группировок, добавим в дерево структуры отчета несколько последовательных элементов:
Приход.Расход с аналогичной вложенной детализацией.Такой подход позволяет обойтись без написания программного кода вывода табличного документа и сохраняет весь функционал СКД.
Проанализируем ситуацию, когда данные необходимо собрать из множества регистров (например, из 7 источников) и выстроить строго регламентированный порядок строк. Для этого удобно использовать конструирование искусственных полей сортировки в запросе с помощью ОБЪЕДИНИТЬ ВСЕ.
Разберем пример запроса, формирующего единый набор данных с признаком раздела:
ВЫБРАТЬ
1 КАК РазделПорядок,
"Приход денег" КАК РазделПредставление,
Приход.СтатьяДвижения КАК Расшифровка,
Приход.Сумма КАК Сумма
ИЗ
РегистрНакопления.ДенежныеСредства.Обороты(&НачалоПериода, &КонецПериода, , ПриходРасход = ЗНАЧЕНИЕ(Перечисление.ПриходРасход.Приход)) КАК Приход
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
2 КАК РазделПорядок,
"Расход денег" КАК РазделПредставление,
Расход.СтатьяДвижения КАК Расшифровка,
Расход.Сумма КАК Сумма
ИЗ
РегистрНакопления.ДенежныеСредства.Обороты(&НачалоПериода, &КонецПериода, , ПриходРасход = ЗНАЧЕНИЕ(Перечисление.ПриходРасход.Расход)) КАК Расход
После создания такого запроса настраиваем группировку по полю РазделПредставление и задаем сортировку по полю РазделПорядок. В итоге отчет выведет разделы строго один за другим.
Посмотрим, как вывести итоговую сумму раздела в одной строке с его названием (например, «Приход денег | Сумма прихода итого»), не перенося итоги в нижнюю строку.
ОстатокИтого.ВычислитьВыражение().Если требования к оформлению строки итогов или остатка очень строгие, выделим оформление через вкладку Макеты схемы компоновки данных. Это позволяет не переписывать отчет «по старинке» процедурно, а оформить только нужные ячейки:
Выясним причину, почему не следует отказываться от СКД в пользу процедурного вывода отчета в управляемых формах. При ручном выводе табличного документа разработчику приходится самостоятельно реализовывать механизм сохранения и восстановления настроек отбора.
При использовании СКД система автоматически управляет объектом КомпоновщикНастроек. Чтобы отборы пользователя сохранялись между сеансами работы программы, достаточно выполнить следующие шаги:
Отчет.КомпоновщикНастроек.Настройки.Отбор.Таким образом, комбинируя возможности запросов СКД, настройку структуры группировок и макеты оформления, можно реализовать отчет любой сложности без потери стандартного функционала управляемого приложения.