Почему в отчете СКД не отображаются поля «Номенклатура» и «Характеристика» при добавлении остатка в кросс-таблицу?

Программист 1С v8.3 (Управляемые формы) 1С:Управление торговлей Управленческий учет Торговля и дистрибуция
← На главную

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

Первое инстинктивное действие — добавить поле НачальныйОстаток прямо в группировку строк. Однако при таких настройках происходит неожиданное: поля Номенклатура и Характеристика просто пропадают из отчета, и отображается только сам начальный остаток. Проанализируем причину такого поведения платформы и рассмотрим несколько надежных способов решения этой задачи.

Выясним причину: почему ломается структура отчета?

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

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

Но если мы просто сделаем остаток ресурсом, он начнет выводиться на пересечении каждой строки и каждой колонки (под каждым складом). Как же закрепить его слева? Рассмотрим детально несколько подходов.

Способ 1. Независимая настройка «Выбранных полей» (Оптимальный вариант)

Чтобы сделать НачальныйОстаток полноценным ресурсом, но запретить ему размножаться по динамическим колонкам складов и клиентов, нам нужно переопределить состав полей для каждой группировки в отдельности. Посмотрим на алгоритм действий:

  1. Откроем схему компоновки данных и перейдем на вкладку Ресурсы. Убедимся, что поле НачальныйОстаток добавлено в список ресурсов (наряду с количеством, суммой и т.д.).
  2. Перейдем на вкладку Настройки и выделим в структуре отчета группировку строк (ту, где указаны Номенклатура и Характеристика).
  3. В нижней части окна перейдем на вкладку Выбранные поля для этой конкретной группировки.
  4. Снимем флажок Авто (это отключит наследование полей от глобальных настроек отчета).
  5. Добавим вручную нужные поля: Номенклатура, Характеристика и наш ресурс НачальныйОстаток.
  6. Теперь выделим в структуре группировку колонок (там, где Организация, Склад, Клиент) или саму Таблицу целиком.
  7. Снова перейдем на вкладку Выбранные поля, снимем флажок Авто.
  8. Добавим туда только те ресурсы, которые должны выводиться внутри сетки кросс-таблицы (например, обороты, количество продаж или конечный остаток по конкретному складу). Поле НачальныйОстаток из этого списка нужно строго исключить.

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

Способ 2. Архитектурное решение через несколько наборов данных

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

Рассмотрим, как это реализовать:

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

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

Способ 3. Использование «пустой» группировки в колонках

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

  1. В структуру колонок нашей Таблицы добавим новую группировку, но не будем указывать в ней какое-либо поле (оставим поле пустым). Это своеобразный аналог детальных записей, но для структуры колонок.
  2. Выделим эту пустую группировку и в ее Выбранных полях (убрав Авто) укажем только ресурс НачальныйОстаток.
  3. А в основной группировке колонок (по складам) переопределим выбранные поля так, чтобы ресурса начального остатка там не было.

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

Способ 4. Применение функции ВычислитьВыражение()

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

Для этого в настройках ресурса НачальныйОстаток (на вкладке Ресурсы в колонке «Выражение») мы можем использовать специальную функцию платформы. Рассмотрим пример кода:

ВычислитьВыражение("Сумма(НачальныйОстаток)", "Номенклатура")

Используя конструкцию ВычислитьВыражение, мы явно указываем компоновщику: «Независимо от того, в какой колонке (складе) ты сейчас находишься, посчитай сумму начального остатка в целом по группировке Номенклатура». Это заставит систему игнорировать разрезы по складам для данного поля и выдавать общий итог для всей строки.

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

← На главную