При создании отчетов в системе компоновки данных (СКД) 1С разработчики часто сталкиваются с проблемой, когда нечисловой ресурс, например, ссылочный тип или строка, не отображается в ячейках кросс-таблицы, оставаясь пустым. Эта ситуация особенно актуальна для периодических регистров сведений, где требуется вывести актуальное значение ресурса на пересечении различных группировок, таких как день и час. В этой статье мы подробно разберем, почему возникает такая проблема, и рассмотрим несколько проверенных решений.
Представим, что у нас есть периодический регистр сведений "ТВ_Программа" без измерений, но с ресурсом "ТВ_Передача" типа СправочникСсылка.ТВ_Передачи. Наша задача — построить отчет, где по горизонтали будут даты, по вертикали — часы, а на пересечении — название "ТВ_Передачи" для соответствующего часа и дня. При этом для каждой "клетки" всегда гарантировано одно значение.
Пример запроса для получения данных из регистра может выглядеть так:
ВЫБРАТЬ
ТВ_Программа.ТВ_Передача.Наименование КАК ТВ_Передача,
ДЕНЬ(ТВ_Программа.Период) КАК День,
ЧАС(ТВ_Программа.Период) КАК Час
ИЗ
РегистрСведений.ТВ_Программа КАК ТВ_Программа
ГДЕ
МИНУТА(ТВ_Программа.Период) >= 46
И ТВ_Программа.Период МЕЖДУ &С И &По
Несмотря на то, что ресурс ТВ_Передача добавлен на закладку "Ресурсы" с функцией "Максимум" (или другой агрегатной функцией, подходящей для нечисловых данных, например, "Минимум" или "Последнее"), и выбран в списке полей на закладке "Настройки", он может не отображаться в таблице. Давайте выясним, что ему "не нравится", и как это исправить.
Прежде чем перейти к решениям, рассмотрим основные причины, по которым строковый или ссылочный ресурс может не выводиться в СКД-отчете:
Максимум, Минимум, Последнее. Они позволяют выбрать одно значение из множества при агрегации.СправочникСсылка) иногда требуют более тонкой настройки или использования макетов для корректного отображения в кросс-таблицах.Этот метод дает полный контроль над содержимым ячейки и позволяет точно настроить внешний вид отчета, убирая при этом ненужные системные итоги. Это наиболее надежный и гибкий способ.
Для начала, мы полностью отключаем отображение общих итогов, поскольку они нам не нужны и могут вызывать проблемы с отображением ресурса. Перейдите на вкладку "Настройки" корневого элемента отчета (или для конкретных группировок, если вы хотите отключить итоги локально).
Найдите раздел "Другие настройки" и установите параметры:
Эти настройки гарантируют, что СКД не будет формировать системные итоги, которые часто мешают или приводят к появлению пустых строк/колонок.
Чтобы СКД корректно отображала наш строковый ресурс в каждой ячейке кросс-таблицы и не вставляла его заголовок, мы создадим макет.
ТВ_Передача).ТВ_Передача).Этот макет указывает СКД, как именно выводить значение ресурса в каждой ячейке, игнорируя при этом системные заголовки ресурса. Это позволяет получить чистый вывод значения.
Важно: Макет в СКД — это не полноценная печатная форма. Это лишь небольшая область, которая определяет, как будет выглядеть конкретный элемент (поле, ресурс, группировка) в отчете. В данном случае, это макет одной ячейки.
Существует также способ, который позволяет добиться желаемого результата без прямого создания макета, используя специфические настройки СКД. Этот метод может быть проще в реализации, но его поведение может быть более зависимым от версий платформы, поскольку он относится к "недокументированным возможностям".
На вкладке "Настройки" вашего отчета, в списке "Выбранные поля" для самого верхнего элемента (корня отчета или основной таблицы), необходимо оставить только ваш ресурс (например, ТВ_Передача). Убедитесь, что там нет никаких "Автополей" или других полей.
Найдите группировку, которая формирует колонки вашего отчета (в нашем случае, это, скорее всего, группировка по полю День). Для этой группировки на вкладке "Выбранные поля" выполните следующие действия:
День). Это поле отвечает за отображение заголовков колонок (дат) и помогает СКД правильно сопоставить данные.Перейдите на вкладку "Другие настройки" корневого элемента отчета. Найдите параметр "Расположение ресурсов" и установите его в значение "Вертикально".
Эта настройка является ключевой в данном методе. Обычно "Расположение ресурсов" по умолчанию стоит "Горизонтально", что предполагает, что каждый ресурс будет занимать отдельную колонку. Изменение на "Вертикально" заставляет СКД иначе обрабатывать вывод ресурсов в ячейках, что в данном случае помогает вывести строковый ресурс.
Этот подход также эффективно решает проблему появления названия ресурса (например, "ТВ_Передача") в заголовке отчета, оставляя только значения в ячейках.
Давайте подробнее рассмотрим некоторые аспекты, которые помогут вам в работе со СКД и предотвращении подобных проблем:
Всегда начинайте отладку с проверки вашего запроса в консоли запросов. Убедитесь, что запрос возвращает данные, которые вы ожидаете увидеть, и что поля имеют нужные значения и типы.
ВЫБРАТЬ
ТВ_Программа.ТВ_Передача.Наименование КАК ТВ_Передача,
ДЕНЬ(ТВ_Программа.Период) КАК День,
ЧАС(ТВ_Программа.Период) КАК Час
ИЗ
РегистрСведений.ТВ_Программа КАК ТВ_Программа
ГДЕ
МИНУТА(ТВ_Программа.Период) >= 46
И ТВ_Программа.Период МЕЖДУ &С И &По
Если запрос возвращает пустые данные или данные не соответствуют ожиданиям, проблема может быть в самом запросе, а не в настройках СКД.
Для строковых и ссылочных ресурсов крайне важно правильно выбрать агрегатную функцию на вкладке "Ресурсы".
Максимум или Минимум: Эти функции подойдут, если вы хотите получить первое или последнее значение в алфавитном порядке или по внутреннему представлению ссылки.Последнее или Первое: Могут использоваться, если вы работаете с регистрами, где важно хронологическое значение.Количество(Различные ...): Позволяет проверить, сколько уникальных значений ресурса встречается в каждой ячейке. Если эта функция показывает 1, это подтверждает, что в каждой ячейке присутствует только одно значение, которое должно было отобразиться.В случае, когда ресурс не отображается даже при правильной агрегатной функции, это часто указывает на проблему с компоновкой самой таблицы, а не с данными или агрегацией.
Изначальная попытка отключить итоги путем установки "Расположение итогов = Нет" для группировок часто приводит к некорректному отображению ресурсов. В некоторых случаях это может вызвать "двоение" строк и колонок, где часть из них остаются пустыми, а ресурс "лезет" в заголовок.
Выясняется, что установка "Итоги = Авто" для группировок в СКД обычно решает проблему "двоения" строк и колонок. Однако при этом появляются системные итоги, которые нам не нужны. Чтобы их убрать, необходимо:
Часто в заголовке отчета или над колонкой с ресурсом появляется его название, например, "ТВ_Передача". Если вы хотите убрать этот заголовок и оставить только само значение, можно использовать следующие подходы:
В данном случае, мы получаем данные из периодического регистра сведений "ТВ_Программа". Использование функций ДЕНЬ() и ЧАС() от поля Период является стандартным и правильным подходом для группировки данных по часам и дням. Если вам необходимо получить самое актуальное значение на определенный момент времени, обычно применяют виртуальные таблицы СрезПоследних или СрезПервых.
Наш запрос уже учитывает специфику, выбирая данные с МИНУТА(ТВ_Программа.Период) >= 46, что может означать выбор передачи, которая "стартует" ближе к концу часа, или определяет временной интервал, относящийся к конкретному часу.
Проблема с отображением строковых или ссылочных ресурсов в кросс-таблицах СКД является довольно распространенной. Мы рассмотрели два основных способа ее решения:
Выбирайте метод, который лучше всего соответствует вашим требованиям к гибкости и надежности. В обоих случаях, правильная настройка агрегатных функций, общих итогов и выбранных полей является ключевым условием для успешного вывода ресурсов в отчетах СКД.