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