Почему не добавляется новая колонка в СКД и как решить эту проблему?

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

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

В этой статье мы подробно разберем природу этого поведения платформы «1С:Предприятие», выясним причины, по которым СКД скрывает нересурсные поля, и рассмотрим по шагам несколько эффективных способов решения этой проблемы.

Почему СКД скрывает простые поля на уровне группировок?

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

  1. Детальные записи: это строки отчета, которые выводятся напрямую из базы данных «как есть», без какого-либо группирования или сворачивания. На этом уровне СКД без проблем отображает любые поля: как числовые ресурсы, так и обычные текстовые реквизиты или константы.
  2. Группировки (например, группировка по полю «Подразделение» или «Контрагент»): на этом уровне система выполняет свертку детальных записей. Физически в строку группировки невозможно вывести детальное значение простого поля, если в рамках этой группы оказалось несколько различных записей с разными значениями. СКД просто «не знает», какое именно из детальных значений нужно показать в строке группировки. Чтобы не вводить пользователя в заблуждение случайным или непредсказуемым значением, платформа по умолчанию полностью игнорирует и скрывает нересурсные поля в строках группировок.

Рассмотрим конкретный пример. Предположим, мы добавили в запрос набора данных новое расчетное поле-константу:


ВЫБРАТЬ
    Продажи.Подразделение КАК Подразделение,
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.СуммаОборот КАК Сумма,
    10 КАК КолонкаТест
ИЗ
    РегистрНакопления.Продажи.Обороты КАК Продажи

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

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

Способ 1. Добавление поля в поля группировки

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

  1. Откроем вкладку «Настройки» в схеме компоновки данных.
  2. В окне структуры отчета выберем нужную группировку (например, Подразделение).
  3. В нижней части экрана перейдем на вкладку «Поля группировки».
  4. Добавим наше новое поле КолонкаТест в этот список.

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

Способ 2. Вывод через детальные записи

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

  1. В структуре отчета на вкладке «Настройки» удалим все существующие группировки верхнего уровня.
  2. Добавим новую группировку, но оставим поле группировки пустым. В структуре отчета появится элемент с названием «Детальные записи».
  3. На вкладке «Выбранные поля» укажем нужные нам колонки, включая наше новое поле КолонкаТест.

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

Способ 3. Преобразование поля в ресурс (с правильной агрегатной функцией)

Часто разработчики идут по пути наименьшего сопротивления и просто переносят поле на вкладку «Ресурсы». Действительно, ресурсы СКД выводит на любых уровнях группировки без дополнительных условий. Но здесь скрывается серьезная ловушка.

Если мы оставим для нашего поля КолонкаТест стандартную агрегатную функцию СУММА(КолонкаТест), то на уровне группировок и общих итогов значение 10 будет суммироваться пропорционально количеству детальных строк в этой группе. Вместо ожидаемой десятки мы получим огромные числа (например, 150 или 3400), что полностью исказит смысл отчета.

Чтобы избежать этой ошибки при использовании ресурсов для констант или текстовых реквизитов, настроим агрегатную функцию правильно:

  1. Перейдем на вкладку «Ресурсы» схемы компоновки данных.
  2. Добавим поле КолонкаТест в список ресурсов.
  3. В колонке «Выражение» вместо стандартной суммы укажем функцию получения экстремума, например: МАКСИМУМ(КолонкаТест) или МИНИМУМ(КолонкаТест).

При использовании функций МАКСИМУМ или МИНИМУМ на любом уровне группировок и итогов система вернет ровно значение константы (в нашем случае 10), не выполняя математического сложения строк.

Способ 4. Связывание поля через роли (Реквизит группировки)

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

Рассмотрим, как связать наше поле с основным измерением:

  1. Перейдем на вкладку «Наборы данных» схемы компоновки.
  2. Найдем в списке полей наше новое поле и перейдем в колонку «Роль».
  3. Откроем диалоговое окно настройки роли поля.
  4. В параметре «Родительское поле» выберем то поле группировки, к которому логически относится наша колонка (например, Подразделение).

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

Способ 5. Сброс кэша и восстановление стандартных настроек

Бывает и так: разработчик выполнил все настройки абсолютно верно, применил один из описанных выше способов, запускает отчет в режиме «1С:Предприятие», но колонки все равно нет. Почему это происходит?

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

Для решения этой проблемы выполним сброс настроек одним из двух способов:

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

← На главную