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