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