Как вывести строковое поле (например, номер заказа) в перекрестье таблицы СКД?

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

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

Почему текстовые поля не выводятся в перекрестье кросс-таблицы?

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

По умолчанию СКД предлагает сделать ресурсами только числовые поля (Количество, Сумма и т.д.). Текстовые или ссылочные поля (такие как Номер) автоматически ресурсами не становятся. Если мы просто перетащим такое поле в выбранные поля таблицы, СКД не поймет, как его сгруппировать, и ячейка останется пустой.

Кроме того, здесь важную роль играет платформа и тип используемых форм. На Управляемых формах (УФ) в платформе 8.3 используется более современный процессор вывода отчетов. Он умеет "на лету" корректировать мелкие ошибки настройки и неявное дублирование полей. На Обычных формах (или при использовании старого процессора вывода) СКД крайне чувствительна к настройкам иерархии и при любом конфликте просто скрывает данные.

Способ 1. Исправление наследования выбранных полей в структуре СКД

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

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

Для решения проблемы выполним следующие шаги:

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

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

Способ 2. Объявление текстового поля ресурсом

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

Разберем, как правильно настроить такое поле на вкладке "Ресурсы":

  1. Перейдем на вкладку "Ресурсы" в СКД.
  2. Перетащим наше поле (например, Номер) в список ресурсов.
  3. В колонке "Выражение" укажем одну из подходящих функций в зависимости от логики данных.

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

Максимум(Номер)

или

Минимум(Номер)

Если же на пересечении строки и колонки может оказаться несколько различных документов, и нам нужно вывести номера их всех, идеальным решением будет использование функции СоединитьСтроки. Запишем выражение следующим образом:

СоединитьСтроки(Номер, ", ")

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

Альтернативные методы решения

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

Использование собственных макетов оформления. Если нам нужно не просто вывести строковое значение, а задать для него особый формат (например, добавить статический префикс, изменить шрифт или цвет фона ячейки в зависимости от условий), мы можем использовать вкладку "Макеты". Создав собственный макет для поля или макет группировки, мы получаем полный контроль над выводом ячеек в результирующий табличный документ, полностью обходя стандартные ограничения кросс-таблиц.

Создание вспомогательного вычисляемого поля. Иногда требуется визуально "пристыковать" текстовую колонку к кросс-таблице без превращения ее в полноценный ресурс. Для этого мы можем создать вычисляемое поле с пустым выражением:

""

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

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

← На главную