Разберем классическую ситуацию, с которой часто сталкиваются разработчики при настройке отчетов на базе Системы Компоновки Данных (СКД) в 1С. Допустим, перед нами стоит задача: вывести кросс-таблицу, где в строках располагаются Номенклатура и Характеристика, а в колонках динамически разворачиваются Организация, Склад и Клиент. При этом заказчик хочет видеть статичную колонку НачальныйОстаток рядом с номенклатурой, чтобы она показывала общий остаток по всем складам и не дублировалась под каждым конкретным складом или клиентом в правой части таблицы.
Первое инстинктивное действие — добавить поле НачальныйОстаток прямо в группировку строк. Однако при таких настройках происходит неожиданное: поля Номенклатура и Характеристика просто пропадают из отчета, и отображается только сам начальный остаток. Проанализируем причину такого поведения платформы и рассмотрим несколько надежных способов решения этой задачи.
Добавление поля с числовыми данными (в нашем случае — остатками) напрямую в список группировок строк кросс-таблицы грубо нарушает внутреннюю логику вывода СКД. Система начинает воспринимать НачальныйОстаток как очередное измерение (разрез учета), а не как количественный показатель.
Когда платформа пытается построить матрицу кросс-таблицы, она ищет пересечения всех измерений строк с измерениями колонок. Если для такого искусственного «измерения» не находится корректных пересечений в колонках, или если логика группировок конфликтует, СКД может скрывать соседние поля или выводить структуру некорректно. Запомним важное правило: числовые показатели для таблиц обязательно должны назначаться ресурсами на вкладке Ресурсы. Только тогда платформа сможет правильно вычислять итоги и распределять данные по ячейкам.
Но если мы просто сделаем остаток ресурсом, он начнет выводиться на пересечении каждой строки и каждой колонки (под каждым складом). Как же закрепить его слева? Рассмотрим детально несколько подходов.
Чтобы сделать НачальныйОстаток полноценным ресурсом, но запретить ему размножаться по динамическим колонкам складов и клиентов, нам нужно переопределить состав полей для каждой группировки в отдельности. Посмотрим на алгоритм действий:
Ресурсы. Убедимся, что поле НачальныйОстаток добавлено в список ресурсов (наряду с количеством, суммой и т.д.).Настройки и выделим в структуре отчета группировку строк (ту, где указаны Номенклатура и Характеристика).Выбранные поля для этой конкретной группировки.Авто (это отключит наследование полей от глобальных настроек отчета).Номенклатура, Характеристика и наш ресурс НачальныйОстаток.Организация, Склад, Клиент) или саму Таблицу целиком.Выбранные поля, снимем флажок Авто.НачальныйОстаток из этого списка нужно строго исключить.В результате этих настроек колонка начального остатка жестко привяжется к группировке строк. Она будет выведена один раз слева, рядом с номенклатурой, а под динамическими колонками складов выводиться не будет. Это именно то, что обычно просит заказчик.
Если отчет сложный, архитектурно правильным подходом в СКД будет разделение запроса на два независимых набора данных. Это позволит системе самой разобраться с уровнями детализации без сложных манипуляций с выбранными полями.
Рассмотрим, как это реализовать:
Номенклатура и Характеристика). В этом запросе вообще не должно быть полей Организация, Склад или Клиент.Связи наборов данных.Номенклатура и Характеристика.НачальныйОстаток ресурсом.При построении таблицы платформа автоматически увидит, что ресурс НачальныйОстаток физически не имеет измерений склада и клиента. СКД не станет пытаться разворачивать его в матрице колонок, а самостоятельно выведет его общей суммой сбоку, на уровне группировки номенклатуры.
Существует еще один интересный прием конструирования кросс-таблиц. Мы можем использовать фиктивную группировку для вывода общих итоговых колонок.
Таблицы добавим новую группировку, но не будем указывать в ней какое-либо поле (оставим поле пустым). Это своеобразный аналог детальных записей, но для структуры колонок.Выбранных полях (убрав Авто) укажем только ресурс НачальныйОстаток.В итоге платформа сформирует отдельную фиксированную колонку. В зависимости от глобальных настроек расположения итогов (слева или справа), эта колонка будет выведена до или после динамических складов, содержа в себе общий остаток по товару.
В более сложных нетиповых ситуациях, когда стандартные настройки группировок не помогают или конфликтуют с другими требованиями отчета, мы можем жестко зафиксировать расчет ресурса с помощью языка выражений СКД.
Для этого в настройках ресурса НачальныйОстаток (на вкладке Ресурсы в колонке «Выражение») мы можем использовать специальную функцию платформы. Рассмотрим пример кода:
ВычислитьВыражение("Сумма(НачальныйОстаток)", "Номенклатура")
Используя конструкцию ВычислитьВыражение, мы явно указываем компоновщику: «Независимо от того, в какой колонке (складе) ты сейчас находишься, посчитай сумму начального остатка в целом по группировке Номенклатура». Это заставит систему игнорировать разрезы по складам для данного поля и выдавать общий итог для всей строки.
Применяя эти методы, мы можем гибко управлять внешним видом кросс-таблиц в 1С, решая задачи любой сложности и предоставляя пользователям удобные, читаемые отчеты без лишнего дублирования данных.