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