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