Почему строковый ресурс не отображается в кросс-таблице СКД и как его вывести?

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

При создании отчетов в системе компоновки данных (СКД) 1С разработчики часто сталкиваются с проблемой, когда нечисловой ресурс, например, ссылочный тип или строка, не отображается в ячейках кросс-таблицы, оставаясь пустым. Эта ситуация особенно актуальна для периодических регистров сведений, где требуется вывести актуальное значение ресурса на пересечении различных группировок, таких как день и час. В этой статье мы подробно разберем, почему возникает такая проблема, и рассмотрим несколько проверенных решений.

Представим, что у нас есть периодический регистр сведений "ТВ_Программа" без измерений, но с ресурсом "ТВ_Передача" типа СправочникСсылка.ТВ_Передачи. Наша задача — построить отчет, где по горизонтали будут даты, по вертикали — часы, а на пересечении — название "ТВ_Передачи" для соответствующего часа и дня. При этом для каждой "клетки" всегда гарантировано одно значение.

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


ВЫБРАТЬ
    ТВ_Программа.ТВ_Передача.Наименование КАК ТВ_Передача,
    ДЕНЬ(ТВ_Программа.Период) КАК День,
    ЧАС(ТВ_Программа.Период) КАК Час
ИЗ
    РегистрСведений.ТВ_Программа КАК ТВ_Программа
ГДЕ
    МИНУТА(ТВ_Программа.Период) >= 46
    И ТВ_Программа.Период МЕЖДУ &С И &По

Несмотря на то, что ресурс ТВ_Передача добавлен на закладку "Ресурсы" с функцией "Максимум" (или другой агрегатной функцией, подходящей для нечисловых данных, например, "Минимум" или "Последнее"), и выбран в списке полей на закладке "Настройки", он может не отображаться в таблице. Давайте выясним, что ему "не нравится", и как это исправить.

Основные причины, по которым ресурс может не отображаться

Прежде чем перейти к решениям, рассмотрим основные причины, по которым строковый или ссылочный ресурс может не выводиться в СКД-отчете:

  1. Отсутствие или некорректная агрегатная функция: Для нечисловых ресурсов (ссылок, строк) необходимо указать агрегатную функцию на вкладке "Ресурсы" СКД. Наиболее подходящие — Максимум, Минимум, Последнее. Они позволяют выбрать одно значение из множества при агрегации.
  2. Неправильные настройки группировок: Ресурс должен быть корректно выбран в полях группировки, в которой он должен отображаться. Для таблиц (кросс-таблиц) поле ресурса обычно выбирают в группировке колонки.
  3. Настройка "Расположение общих итогов" = Нет: Если для группировки или для всего отчета установлено "Расположение общих итогов = Нет", это может привести к тому, что колонки с ресурсами будут пустыми или вообще не выведутся. СКД часто "ожидает" наличия итогов для корректного размещения ресурсов. Рекомендуется использовать "Авто" или "Начало/Конец", а затем уже настраивать скрытие итогов другими способами.
  4. Особенности вывода ссылочных типов: Ресурсы ссылочного типа (например, СправочникСсылка) иногда требуют более тонкой настройки или использования макетов для корректного отображения в кросс-таблицах.

Решение 1: Отображение ресурса с использованием макета и отключением общих итогов

Этот метод дает полный контроль над содержимым ячейки и позволяет точно настроить внешний вид отчета, убирая при этом ненужные системные итоги. Это наиболее надежный и гибкий способ.

  1. Отключение общих итогов:

    Для начала, мы полностью отключаем отображение общих итогов, поскольку они нам не нужны и могут вызывать проблемы с отображением ресурса. Перейдите на вкладку "Настройки" корневого элемента отчета (или для конкретных группировок, если вы хотите отключить итоги локально).

    Найдите раздел "Другие настройки" и установите параметры:

    • "Расположение общих итогов по горизонтали" в значение "Нет".
    • "Расположение общих итогов по вертикали" в значение "Нет".

    Эти настройки гарантируют, что СКД не будет формировать системные итоги, которые часто мешают или приводят к появлению пустых строк/колонок.

  2. Создание макета для ячейки ресурса:

    Чтобы СКД корректно отображала наш строковый ресурс в каждой ячейке кросс-таблицы и не вставляла его заголовок, мы создадим макет.

    1. Перейдите на вкладку "Макеты" в настройках СКД.
    2. Добавьте новый макет. В качестве "Типа макета" выберите "Макет поля" или "Макет ресурса" (для данного случая подойдет макет поля, если ресурс выбран как поле в группировке колонки).
    3. Укажите "Поле", для которого создается макет, это должен быть наш ресурс (например, ТВ_Передача).
    4. В области макета (это будет одна ячейка) выберите эту ячейку и в свойствах установите "Заполнение" в значение "Параметр".
    5. В качестве "Параметра" укажите имя вашего ресурса (например, ТВ_Передача).

    Этот макет указывает СКД, как именно выводить значение ресурса в каждой ячейке, игнорируя при этом системные заголовки ресурса. Это позволяет получить чистый вывод значения.

    Важно: Макет в СКД — это не полноценная печатная форма. Это лишь небольшая область, которая определяет, как будет выглядеть конкретный элемент (поле, ресурс, группировка) в отчете. В данном случае, это макет одной ячейки.

Решение 2: Отображение ресурса без использования макета (метод Максима Донецкого)

Существует также способ, который позволяет добиться желаемого результата без прямого создания макета, используя специфические настройки СКД. Этот метод может быть проще в реализации, но его поведение может быть более зависимым от версий платформы, поскольку он относится к "недокументированным возможностям".

  1. Выбранные поля всего отчета:

    На вкладке "Настройки" вашего отчета, в списке "Выбранные поля" для самого верхнего элемента (корня отчета или основной таблицы), необходимо оставить только ваш ресурс (например, ТВ_Передача). Убедитесь, что там нет никаких "Автополей" или других полей.

  2. Выбранные поля группировки колонок:

    Найдите группировку, которая формирует колонки вашего отчета (в нашем случае, это, скорее всего, группировка по полю День). Для этой группировки на вкладке "Выбранные поля" выполните следующие действия:

    • Удалите "Автополе", если оно там присутствует.
    • Добавьте поле, по которому осуществляется данная группировка (например, День). Это поле отвечает за отображение заголовков колонок (дат) и помогает СКД правильно сопоставить данные.
  3. Настройка "Расположение ресурсов" для корня отчета:

    Перейдите на вкладку "Другие настройки" корневого элемента отчета. Найдите параметр "Расположение ресурсов" и установите его в значение "Вертикально".

    Эта настройка является ключевой в данном методе. Обычно "Расположение ресурсов" по умолчанию стоит "Горизонтально", что предполагает, что каждый ресурс будет занимать отдельную колонку. Изменение на "Вертикально" заставляет СКД иначе обрабатывать вывод ресурсов в ячейках, что в данном случае помогает вывести строковый ресурс.

Этот подход также эффективно решает проблему появления названия ресурса (например, "ТВ_Передача") в заголовке отчета, оставляя только значения в ячейках.

Дополнительные рекомендации и устранение проблем

Давайте подробнее рассмотрим некоторые аспекты, которые помогут вам в работе со СКД и предотвращении подобных проблем:

Проверка запроса в консоли

Всегда начинайте отладку с проверки вашего запроса в консоли запросов. Убедитесь, что запрос возвращает данные, которые вы ожидаете увидеть, и что поля имеют нужные значения и типы.


ВЫБРАТЬ
    ТВ_Программа.ТВ_Передача.Наименование КАК ТВ_Передача,
    ДЕНЬ(ТВ_Программа.Период) КАК День,
    ЧАС(ТВ_Программа.Период) КАК Час
ИЗ
    РегистрСведений.ТВ_Программа КАК ТВ_Программа
ГДЕ
    МИНУТА(ТВ_Программа.Период) >= 46
    И ТВ_Программа.Период МЕЖДУ &С И &По

Если запрос возвращает пустые данные или данные не соответствуют ожиданиям, проблема может быть в самом запросе, а не в настройках СКД.

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

Для строковых и ссылочных ресурсов крайне важно правильно выбрать агрегатную функцию на вкладке "Ресурсы".

В случае, когда ресурс не отображается даже при правильной агрегатной функции, это часто указывает на проблему с компоновкой самой таблицы, а не с данными или агрегацией.

Отключение общих итогов и проблема "двоения"

Изначальная попытка отключить итоги путем установки "Расположение итогов = Нет" для группировок часто приводит к некорректному отображению ресурсов. В некоторых случаях это может вызвать "двоение" строк и колонок, где часть из них остаются пустыми, а ресурс "лезет" в заголовок.

Выясняется, что установка "Итоги = Авто" для группировок в СКД обычно решает проблему "двоения" строк и колонок. Однако при этом появляются системные итоги, которые нам не нужны. Чтобы их убрать, необходимо:

  1. Установить "Расположение итогов = Авто" для всех группировок, чтобы избежать двоения.
  2. После этого, на вкладке "Другие настройки" корневого элемента отчета, установить "Расположение общих итогов по горизонтали = Нет" и "Расположение общих итогов по вертикали = Нет". Это позволяет сохранить корректную структуру таблицы без двоения и при этом убрать лишние итоги.

Удаление заголовка ресурса из шапки отчета

Часто в заголовке отчета или над колонкой с ресурсом появляется его название, например, "ТВ_Передача". Если вы хотите убрать этот заголовок и оставить только само значение, можно использовать следующие подходы:

Работа с периодическими регистрами сведений

В данном случае, мы получаем данные из периодического регистра сведений "ТВ_Программа". Использование функций ДЕНЬ() и ЧАС() от поля Период является стандартным и правильным подходом для группировки данных по часам и дням. Если вам необходимо получить самое актуальное значение на определенный момент времени, обычно применяют виртуальные таблицы СрезПоследних или СрезПервых.

Наш запрос уже учитывает специфику, выбирая данные с МИНУТА(ТВ_Программа.Период) >= 46, что может означать выбор передачи, которая "стартует" ближе к концу часа, или определяет временной интервал, относящийся к конкретному часу.

Заключение

Проблема с отображением строковых или ссылочных ресурсов в кросс-таблицах СКД является довольно распространенной. Мы рассмотрели два основных способа ее решения:

  1. Метод с использованием макета и отключением общих итогов: Этот подход является наиболее гибким и надежным, предоставляя полный контроль над внешним видом ячейки. Он позволяет избежать проблем с "недокументированными возможностями" платформы.
  2. Метод без макета, с использованием настроек "Расположение ресурсов = Вертикально": Более простой в реализации, но потенциально менее стабильный в долгосрочной перспективе из-за зависимости от внутренних механизмов платформы.

Выбирайте метод, который лучше всего соответствует вашим требованиям к гибкости и надежности. В обоих случаях, правильная настройка агрегатных функций, общих итогов и выбранных полей является ключевым условием для успешного вывода ресурсов в отчетах СКД.

← На главную