Как вывести строковые значения в ячейках таблицы в СКД?

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

При построении отчетов в системе компоновки данных (СКД) разработчики часто сталкиваются с ситуацией, когда в структуре отчета используется объект Таблица (кросс-таблица), но ячейки на пересечении строк и колонок остаются абсолютно пустыми. Например, если в строки выведены сотрудники, в колонки — даты, а в ячейках требуется отобразить строковое поле вроде отработанного времени в формате «ЧЧ:ММ» или текстовый комментарий.

Выясним причину такого поведения платформы 1С и разберем по шагам все способы решения этой задачи.

Почему таблица СКД не выводит обычные поля в ячейках данных

Проанализируем базовый механизм работы кросс-таблицы в СКД. Область пересечения строк и колонок предназначена строго для вывода числовых показателей и агрегированных величин. Платформа ожидает, что на пересечении координат «Строка – Колонка» располагаются данные из вкладки Ресурсы.

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

Способ 1. Добавление поля в ресурсы без агрегатной функции

Рассмотрим самый простой способ вывода строки в ячейку таблицы. Если в исходных данных гарантируется, что на одно пересечение строки и колонки (например, конкретный сотрудник и конкретная дата) приходится строго одна запись, агрегатная функция не требуется.

Разберем настройку по шагам:

  1. Открываем схему компоновки данных и переходим на вкладку Ресурсы.
  2. Добавляем поле (например, ОтработанноеВремя) в список ресурсов.
  3. В колонке Выражение указываем само имя поля без каких-либо функций: ОтработанноеВремя.
  4. В настройках варианта отчета проверяем, чтобы в таблице на уровне строк была нужная группировка (Сотрудник), в колонках — группировка по дате (ДатаРаботы), а в выбранных полях таблицы присутствовал созданный ресурс ОтработанноеВремя.

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

Способ 2. Использование функции «Максимум» или «Минимум»

Посмотрим на классический прием: в выражении ресурса на вкладке Ресурсы можно написать:

Максимум(ОтработанноеВремя)

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

Способ 3. Объединение значений с помощью функции «СоединитьСтроки»

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

Разберем настройку ресурса:

  1. Переходим на вкладку Ресурсы.
  2. Выбираем поле ОтработанноеВремя.
  3. В колонке Выражение прописываем вызов функции: СоединитьСтроки(ОтработанноеВремя, ", ")

Теперь, если за одну дату зафиксировано несколько записей (например, «04:00» и «03:30»), платформа выведет в ячейку результат «04:00, 03:30», не потеряв ни одной записи.

Способ 4. Перевод времени в число и форматирование (рекомендуемый подход)

Хранение и передача отработанного времени в строковом виде «ЧЧ:ММ» лишает отчет возможности подведения итогов по строкам (всего за период по сотруднику) и колонкам (всего за день по подразделению). Чтобы построить полноценный отчет с итогами, рекомендуется передавать в СКД время в виде числа — в секундах, минутах или долях часа.

Рассмотрим, как правильно организовать такой расчет:

  1. В источнике данных передаем числовое поле, например ВремяВСекундах.
  2. На вкладке Ресурсы рассчитываем стандартную сумму: Сумма(ВремяВСекундах).
  3. Для красивого представления времени в формате «ЧЧ:ММ» на вкладке Наборы данных в колонке Выражение представления поля (или прямо в выражении ресурса) вызываем экспортную функцию общего модуля конфигурации: МойОбщийМодуль.ВремяСекундыВФорматЧЧММ(Сумма(ВремяВСекундах))

Пример реализации такой функции в общем модуле с признаком вызова на сервере:


Функция ВремяСекундыВФорматЧЧММ(Знач ВсегоСекунд) Экспорт
    Если Не ЗначениеЗаполнено(ВсегоСекунд) Тогда
        Возврат "";
    КонецЕсли;
    
    Часы = Цел(ВсегоСекунд / 3600);
    Минуты = Цел((ВсегоСекунд % 3600) / 60);
    
    Возврат Формат(Часы, "ЧЦ=2; ЧО=0; ЧВН=") + ":" + Формат(Минуты, "ЧЦ=2; ЧО=0; ЧВН=");
КонецФункции

Такой подход обеспечивает корректное суммирование общего баланса времени свыше 24 часов как по отдельным дням, так и в итоговых строках отчета.

Способ 5. Настройка через макеты СКД

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

  1. Переходим на вкладку Макеты схемы компоновки данных.
  2. Нажимаем Добавить макет и выбираем Макет поля или Макет группировки.
  3. Указываем конкретную область ячеек таблицы и связываем ее с параметрами макета, указав в качестве значения требуемое текстовое поле.

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

← На главную