Как в СКД настроить таблицу с фиксированными колонками остатков и динамическими колонками по видам движений?

Программист 1С v8.3 (Управляемые формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При разработке отчетов в системе компоновки данных (СКД) часто возникает задача создания «бухгалтерского» вида таблицы. Типичный пример: в начале строки идет Начальный остаток, затем — динамический набор колонок, зависящий от данных (например, Виды движений: «Приход», «Расход», «Списание»), а завершается строка Конечным остатком. Стандартная группировка колонок в СКД по умолчанию пытается поместить все выбранные ресурсы во все колонки группировки, что портит структуру отчета. Разберем подробно, как решить эту задачу несколькими способами.

Метод 1: Разделение колонок на три независимые группировки (Решение автора темы)

Этот способ является наиболее гибким, когда нам нужно жестко контролировать, какой ресурс в какую колонку попадает. Суть метода заключается в том, чтобы в настройках отчета на вкладке «Настройки» в иерархии колонок создать не одну группировку, а три последовательных элемента.

Проанализируем шаги настройки:

  1. Создание группировки для начального остатка: Добавляем в колонки «Детальные записи» (без указания поля группировки). В настройках этой конкретной группировки переходим на вкладку «Выбранные поля», снимаем флаг Авто и вручную добавляем только те ресурсы, которые отвечают за начальный остаток (например, КоличествоНачальныйОстаток и ВесНачальныйОстаток).
  2. Создание динамической группировки: Следом добавляем группировку по полю, которое должно расширяться вправо (например, ВидДвиженияПтицы). Аналогично, на вкладке «Выбранные поля» для этой группировки отключаем Авто и добавляем ресурсы оборотов: Количество и Вес. Теперь эти колонки будут создаваться динамически только для тех видов движений, которые есть в базе.
  3. Создание группировки для конечного остатка: Снова добавляем «Детальные записи» в самый конец списка колонок. Отключаем Авто в выбранных полях и указываем ресурсы КоличествоКонечныйОстаток и ВесКонечныйОстаток.

Рассмотрим, почему это работает. СКД при построении таблицы последовательно выводит все указанные группировки колонок. Так как в первой и третьей группировке нет поля группировки, они выводятся как статичные столбцы. А средняя группировка размножается по количеству уникальных значений в данных.

Метод 2: Оптимизация запроса и использование виртуальных таблиц

Часто программисты допускают ошибку, пытаясь соединить физическую таблицу регистра накопления с виртуальной таблицей остатков. Рассмотрим пример запроса, который может привести к проблемам с производительностью:


ВЫБРАТЬ
    Регистр.Период,
    Регистр.Регистратор,
    Регистр.ВидДвиженияПтицы,
    Регистр.Количество КАК КоличествоОборот,
    Остатки.КоличествоНачальныйОстаток
ИЗ
    РегистрНакопления.УчетЖивойПтицы КАК Регистр
ЛЕВОЕ СОЕДИНЕНИЕ 
    РегистрНакопления.УчетЖивойПтицы.ОстаткиИОбороты(&Начало, &Конец, Авто, , ) КАК Остатки
ПО 
    Регистр.Регистратор = Остатки.Регистратор

Выясним причину, почему это плохо: такое соединение порождает избыточность данных (дубли) и сильно нагружает сервер. Правильнее использовать одну виртуальную таблицу ОстаткиИОбороты с периодичностью Авто или Запись. Система сама сопоставит обороты и остатки на каждый момент времени. Чтобы получить дополнительные реквизиты из регистратора, мы можем обратиться к ним через точку в полях выбора СКД.

Метод 3: Использование вычисляемого поля для управления порядком

Если нам нужно, чтобы колонки стояли в строго определенном порядке, но при этом мы хотим использовать одну группировку для всех данных, можно применить «сортировочное» вычисляемое поле. Проанализируем ситуацию: нам нужно, чтобы «Начальный остаток» был первым, «Виды движений» — в середине, а «Конечный остаток» — последним.

  1. Создаем вычисляемое поле ПорядокКолонок.
  2. В запросе или в выражении вычисляемого поля прописываем логику:
    
    ВЫБОР 
        КОГДА ТипЗаписи = "НачальныйОстаток" ТОГДА 0 
        КОГДА ТипЗаписи = "Оборот" ТОГДА 1 
        ИНАЧЕ 2 
    КОНЕЦ
    
  3. В настройках СКД добавляем это поле в группировку колонок и устанавливаем по нему сортировку.

Однако этот метод сложнее в настройке «Выбранных полей», поэтому разделение на три группировки (как в Методе 1) остается более предпочтительным для визуального конструирования.

Дополнительная настройка: Вертикальное расположение ресурсов

Рассмотрим ситуацию, когда ресурсов много (например, «Количество», «Вес», «Сумма», «Количество голов»). Если оставить настройки по умолчанию, таблица станет слишком широкой и нечитаемой. В СКД есть механизм, позволяющий расположить ресурсы друг под другом внутри одной колонки группировки.

Посмотрим на шаги настройки:

  1. Переходим на вкладку «Настройки».
  2. Выбираем уровень всей таблицы или конкретной группировки.
  3. На вкладке «Другие настройки» находим параметр Расположение ресурсов.
  4. Устанавливаем значение Вертикально.

В этом случае в динамической колонке «Приход» значения веса и количества будут отображаться в две строки, что значительно сэкономит место.

Как скрыть пустые динамические колонки?

Пользователи часто просят не выводить виды движений, по которым за выбранный период не было данных. По умолчанию СКД и так не выводит пустые группировки, но если вы используете сложные соединения (как в Методе 2 через ЛЕВОЕ СОЕДИНЕНИЕ), в данных могут появиться записи со значениями NULL или 0, которые заставят колонку отобразиться.

Чтобы гарантированно скрыть такие колонки, выполним следующие действия:

  1. Выделяем группировку по полю ВидДвиженияПтицы в настройках.
  2. Переходим на вкладку «Отбор» этой группировки (не путать с общим отчетом!).
  3. Добавляем условие: Количество Оборот Не равно 0.

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

Важность настройки ролей полей

Для корректного расчета остатков в итоговых строках (по складам, организациям или иерархии номенклатуры) необходимо проверить Роли полей на вкладке «Набор данных». Для поля начального остатка должна стоять роль Остаток, тип Начальный. В поле «Имя» указывается общее имя для пары остатков (например, Количество), чтобы СКД понимала связь между ними. Это предотвратит простое суммирование остатков там, где нужно выводить значение на начало и конец периода.

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

← На главную