Как отключить автоматическую группировку и нежелательное суммирование строк в отчетах СКД 1С

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

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

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

Анализ исходной ситуации

Рассмотрим реальный запрос, с которым возникла проблема в конфигурации «1С:Управление торговлей 11»:


ВЫБРАТЬ
    ЗаказКлиентаТовары.Ссылка КАК Заказ,
    ВЫБОР
        КОГДА ЗаказКлиентаТовары.Ссылка.СпособДоставки = ЗНАЧЕНИЕ(Перечисление.СпособыДоставки.СиламиПеревозчика)
            ТОГДА ЗаказКлиентаТовары.Ссылка.ПеревозчикПартнер
        ИНАЧЕ ""
    КОНЕЦ КАК Доставка,
    ЗаказКлиентаТовары.Ссылка.Контрагент КАК Контрагент,
    ЗаказКлиентаТовары.Номенклатура.Артикул КАК Артикул,
    ЗаказКлиентаТовары.Номенклатура КАК Номенклатура,
    ВЫРАЗИТЬ(ЗаказКлиентаТовары.Количество КАК ЧИСЛО(10, 0)) КАК Количество,
    ВЫРАЗИТЬ(ЗаказКлиентаТовары.Цена КАК ЧИСЛО(10, 2)) КАК ЦенаПродажи,
    ВЫРАЗИТЬ(ЦеныНоменклатурыПоставщиковСрезПоследних.Цена КАК ЧИСЛО(10, 2)) КАК ЦенаЗакупки,
    ЗаказКлиентаТовары.Ссылка.Комментарий КАК Комментарий,
    ЗаказКлиентаТовары.НомерСтроки КАК НомерСтроки
ИЗ
    Документ.ЗаказКлиента.Товары КАК ЗаказКлиентаТовары
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатурыПоставщиков.СрезПоследних КАК ЦеныНоменклатурыПоставщиковСрезПоследних
    ПО ЗаказКлиентаТовары.Номенклатура = ЦеныНоменклатурыПоставщиковСрезПоследних.Номенклатура
ГДЕ
    ЗаказКлиентаТовары.Ссылка.Проведен
    И ЗаказКлиентаТовары.Ссылка.Дата МЕЖДУ &НачалоПериода И &КонецПериода

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

Способ №1. Использование «Детальных записей»

Самый простой и логичный способ вывести строки запроса в СКД «как есть» (без какого-либо сворачивания и агрегации) — это использование специального элемента структуры компоновки под названием <Детальные записи>.

Разберем этот процесс по шагам:

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

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

Способ №2. Использование составных группировок (без лишней иерархии)

Часто бизнес-требования диктуют необходимость группировать данные (например, по контрагенту или заказу), но внутри этой группировки строки с разной ценой не должны объединяться. Если мы просто добавим группировку по Номенклатура, а внутри нее сделаем подчиненную группировку по цене, отчет станет неудобным для чтения — пользователю придется раскрывать бесконечные «плюсики» иерархии.

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

  1. В структуре настроек СКД создайте одну группировку.
  2. В свойствах этой группировки на вкладке Поля группировки добавьте сразу несколько полей. Например: сначала Номенклатура, а затем вторым полем — ЦенаПродажи.
  3. В результате система сформирует плоскую, красивую таблицу. Каждая строка отчета будет представлять собой уникальную комбинацию номенклатуры и цены. Если в одном заказе один и тот же товар был продан по цене 100 рублей и по цене 120 рублей, они выведутся двумя отдельными строками на одном уровне иерархии, без лишней вложенности.

Способ №3. Использование уникального ключа строки в группировке

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

В представленном выше запросе уже выбирается поле ЗаказКлиентаТовары.НомерСтроки КАК НомерСтроки. Поскольку номер строки внутри табличной части конкретного документа всегда уникален, мы можем использовать его в качестве ключа группировки:

  1. Добавьте поле НомерСтроки в список полей вашей группировки на вкладке Настройки.
  2. Вы можете объединить его в составную группировку вместе с полями Номенклатура, ЦенаПродажи и Заказ.
  3. Чтобы колонка с номером строки не портила внешний вид отчета, ее можно просто скрыть, убрав флажок видимости на вкладке Выбранные поля, или задать ей нулевую ширину. При этом группировка по ней продолжит работать, обеспечивая раздельный вывод каждой физической строки документа.

Способ №4. Тонкая настройка вкладки «Ресурсы»

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

Выясним, как правильно настроить ресурсы в нашем случае:

Способ №5. Роли полей в наборе данных

Когда в запросе СКД используются левые соединения (как в нашем примере с регистром сведений ЦеныНоменклатурыПоставщиков.СрезПоследних), оптимизатор СКД может попытаться упростить запрос перед отправкой в СУБД. Это иногда приводит к неожиданному «схлопыванию» результатов.

Чтобы жестко зафиксировать вывод ключевых полей, проанализируем настройки вкладки Набор данных:

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

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

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

← На главную