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

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

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

Многие начинающие разработчики пытаются решить эту задачу на уровне запроса, используя конструкцию ВЫБОР КОГДА. Рассмотрим, почему это неэффективно, и разберем правильные способы реализации такой структуры отчета, а также выясним, как правильно выводить дополнительные реквизиты (например, единицы измерения) в отдельные колонки.

Метод 1. Использование структуры «Таблица» в настройках СКД

Разберем ситуацию, когда нам нужно «развернуть» данные. Попытка прописать каждое подразделение в запросе через ВЫБОР ведет к тому, что при добавлении нового подразделения в справочник вам придется переписывать код. СКД позволяет сделать это динамически.

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

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

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

Метод 2. Вывод единиц измерения в отдельную колонку

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

Рассмотрим порядок действий:

Способ А: Настройка выбранных полей группировки

Вместо того чтобы создавать отдельную вложенную группировку для единицы измерения, мы добавим её как поле внутри группировки Номенклатура. Выберем в структуре строку Номенклатура, перейдем на её вкладку «Выбранные поля» и добавим туда поле Номенклатура.ЕдиницаДляОтчетов (или аналогичный реквизит).

Способ Б: Управление расположением реквизитов

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

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

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

Метод 3. Регулирование данных на этапе запроса (псевдо-Pivot)

Хотя пользователь в теме выразил желание «урегулировать это в запросе», в языке запросов 1С нет прямого оператора PIVOT. Однако, если количество колонок фиксировано и известно заранее (например, отчет по двум конкретным видам цен или двум складам), можно использовать следующий подход в тексте запроса:


ВЫБРАТЬ
    Продажи.Номенклатура КАК Номенклатура,
    СУММА(ВЫБОР
            КОГДА Продажи.Подразделение = &Подразделение1
                ТОГДА Продажи.Количество
            ИНАЧЕ 0
        КОНЕЦ) КАК КолВо_Цех1,
    СУММА(ВЫБОР
            КОГДА Продажи.Подразделение = &Подразделение2
                ТОГДА Продажи.Количество
            ИНАЧЕ 0
        КОНЕЦ) КАК КолВо_Цех2
ИЗ
    РегистрНакопления.Продажи КАК Продажи
ГДЕ
    Продажи.Период МЕЖДУ &НачалоПериода И &КонецПериода
СГРУППИРОВАТЬ ПО
    Продажи.Номенклатура

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

Тонкая настройка внешнего вида колонок подразделений

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

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

Работа с иерархией подразделений

Если в организации есть вложенность (например, Департамент -> Цех -> Участок), СКД позволяет отобразить это в колонках. В настройках группировки Подразделение выберем тип «Иерархия». В этом случае в отчете появятся сгруппированные колонки: сначала общая колонка департамента (как итог), а затем вложенные колонки цехов. Если же итоговые колонки по родительским подразделениям не нужны, выберем тип «Только иерархия» или «Элементы».

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

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

← На главную