Почему в отчете СКД типа «Таблица» не выводятся данные в ячейках и как это исправить?

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

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

Причина поведения СКД: специфика структуры «Таблица»

Для понимания проблемы проанализируем внутреннюю логику работы СКД. В схеме компоновки данных существуют разные типы элементов структуры отчета:

  1. Список: линейный вывод данных, где в выбранных полях могут присутствовать любые поля (как группировочные, так и детальные).
  2. Таблица: двумерная матрица пересечения строк и колонок.

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

Пошаговое решение: объявление нечислового поля ресурсом

Рассмотрим, как правильно настроить схему компоновки данных, чтобы вывести перечисление или строку в ячейку таблицы.

Посмотрим на исходный запрос к регистру сведений:


ВЫБРАТЬ
    СтатусБригад.Период КАК Период,
    СтатусБригад.Бригада КАК Бригада,
    СтатусБригад.Статус КАК Статус
ИЗ
    РегистрСведений.СтатусБригад КАК СтатусБригад

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

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

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

    Максимум(Статус)

    Или:

    Минимум(Статус)
  4. Перейдем на вкладку «Настройки», выберем структуру «Таблица» и убедимся, что поле Статус добавлено в «Выбранные поля» всей таблицы или вложенных группировок.

Варианты функций агрегации для нечисловых данных

В зависимости от бизнес-логики задачи СКД предоставляет несколько способов агрегации строковых и ссылочных данных:

  1. Максимум(Поле) / Минимум(Поле): СКД сравнивает элементы по внутреннему порядку перечисления, алфавиту или ссылке и возвращает ровно одно значение. Идеально подходит, когда на пересечении измерений гарантированно существует только одно актуальное значение.
  2. СоединитьСтроки(Поле, ", "): специальная функция языка выражений СКД, которая объединяет все значения, попавшие в группировку, в одну текстовую строку через заданный разделитель. Это полезно, если в одну дату у объекта или бригады может быть зафиксировано несколько состояний.
  3. СоединитьСтроки(Поле, Символы.ПС): объединение значений с переносом на новую строку, что делает ячейку многострочной и улучшает читаемость.

Учет скрытых измерений регистра сведений

Проанализируем распространенную ситуацию, когда в регистре сведений присутствуют дополнительные измерения (например, Объект), которые не были выведены в строки или колонки отчета.

Если одна бригада в один и тот же день работала на двух разных объектах с разными статусами, в выборку попадут две записи. Если для ресурса указано Максимум(Статус), СКД выведет только одно из значений, потеряв второе.

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

  1. Добавление иерархии в строки таблицы: в структуре отчета в группировку строк добавим подчиненную группировку: сначала Бригада, а внутри нее — Объект. В этом случае матрица детализируется, и каждый статус займет собственную строку.
  2. Конкатенация данных в ресурсе: настроим вычисление ресурса так, чтобы он сразу содержал наименование объекта и статус: СоединитьСтроки(Строка(Объект) + ": " + Строка(Статус), Символы.ПС)

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

← На главную