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

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

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

Причина 1. Сохраненные пользовательские настройки и кэш варианта

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

Проанализируем способы полной очистки таких настроек:

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

КлючОбъекта = "Отчет.ВзаиморасчетыСКлиентами";
ХранилищеПользовательскихНастроекОтчетов.Удалить(КлючОбъекта, Неопределено, Неопределено);
ХранилищеВариантовОтчетов.Удалить(КлючОбъекта, Неопределено, Неопределено);

Причина 2. Механизм автозаполнения СКД

По умолчанию для набора данных «Запрос» включен флаг Автозаполнение. В этом режиме компоновщик анализирует используемые в варианте поля и автоматически дописывает их в секции ВЫБРАТЬ и СГРУППИРОВАТЬ ПО итогового SQL-запроса. Если в отборе, сортировке или выбранных полях присутствует скрытое измерение (например, АналитикаУчетаПоПартнерам), СКД принудительно добавит его в группировку СУБД, что разобьет свернутую строку клиента на несколько записей.

Чтобы исключить влияние автозаполнения, выполним следующие шаги:

  1. Отключим флаг Автозаполнение в свойствах набора данных.
  2. В тексте запроса явно опишем разрешенные для компоновщика конструкции с помощью фигурных скобок:

ВЫБРАТЬ
    Взаиморасчеты.Партнер КАК Партнер,
    СУММА(Взаиморасчеты.СуммаОстаток) КАК Сумма
{ВЫБРАТЬ
    Партнер.*,
    Сумма}
ИЗ
    РегистрНакопления.РасчетыСКлиентами.Остатки(&Период, {Партнер.* КАК Партнер}) КАК Взаиморасчеты
{ГДЕ
    Взаиморасчеты.Партнер.* КАК Партнер}
СГРУППИРОВАТЬ ПО
    Взаиморасчеты.Партнер

Причина 3. Особенности работы дерева наборов данных и структуры отчета

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

Разберем по шагам, как настроить ресурсы и структуру схемы:

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

Причина 4. Объединение через временные таблицы в едином запросе

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


ВЫБРАТЬ
    Таблица1.Партнер КАК Партнер,
    Таблица1.Сумма КАК Сумма
ПОМЕСТИТЬ ВТ_ВсеДанные
ИЗ
    &ТаблицаИсточник1 КАК Таблица1

ОБЪЕДИНИТЬ ВСЕ

ВЫБРАТЬ
    Таблица2.Партнер,
    Таблица2.Сумма
ИЗ
    &ТаблицаИсточник2 КАК Таблица2
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВТ.Партнер КАК Партнер,
    СУММА(ВТ.Сумма) КАК СуммаОстаток
ИЗ
    ВТ_ВсеДанные КАК ВТ
СГРУППИРОВАТЬ ПО
    ВТ.Партнер

Такой подход гарантирует, что данные сначала объединятся и свернутся средствами СУБД до уровня партнера, и только потом будут переданы в компоновщик для окончательного оформления.

← На главную