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