При разработке отчетов на базе системы компоновки данных (СКД) разработчики нередко сталкиваются с ситуацией: в тексте набора данных прописана явная группировка по ключевому полю (например, по клиенту или партнеру), в консоли запросов суммы идеально сворачиваются, однако при формировании отчета в режиме «1С:Предприятие» группировка распадается на отдельные строки с положительными и отрицательными суммами. Разберем подробно, почему так происходит и как исправить эту проблему.
Самая распространенная причина, из-за которой изменения в схеме не применяются — использование платформой ранее сохраненных настроек отчета для текущего пользователя. Когда отчет уже запускался в режиме предприятия, 1С сохраняет его структуру (выбранные поля, порядок группировок, отборы) в системных хранилищах. При повторном открытии платформа накладывает эти старые настройки поверх новой схемы, игнорируя внесенные в конфигураторе изменения.
Проанализируем способы полной очистки таких настроек:
ХранилищеПользовательскихНастроекОтчетов, найдем нужный отчет и удалим сохраненные записи. Аналогичную операцию выполним в обработке ХранилищеВариантовОтчетов.
КлючОбъекта = "Отчет.ВзаиморасчетыСКлиентами";
ХранилищеПользовательскихНастроекОтчетов.Удалить(КлючОбъекта, Неопределено, Неопределено);
ХранилищеВариантовОтчетов.Удалить(КлючОбъекта, Неопределено, Неопределено);
По умолчанию для набора данных «Запрос» включен флаг Автозаполнение. В этом режиме компоновщик анализирует используемые в варианте поля и автоматически дописывает их в секции ВЫБРАТЬ и СГРУППИРОВАТЬ ПО итогового SQL-запроса. Если в отборе, сортировке или выбранных полях присутствует скрытое измерение (например, АналитикаУчетаПоПартнерам), СКД принудительно добавит его в группировку СУБД, что разобьет свернутую строку клиента на несколько записей.
Чтобы исключить влияние автозаполнения, выполним следующие шаги:
ВЫБРАТЬ
Взаиморасчеты.Партнер КАК Партнер,
СУММА(Взаиморасчеты.СуммаОстаток) КАК Сумма
{ВЫБРАТЬ
Партнер.*,
Сумма}
ИЗ
РегистрНакопления.РасчетыСКлиентами.Остатки(&Период, {Партнер.* КАК Партнер}) КАК Взаиморасчеты
{ГДЕ
Взаиморасчеты.Партнер.* КАК Партнер}
СГРУППИРОВАТЬ ПО
Взаиморасчеты.Партнер
Если в схеме компоновки используется Набор данных — Объединение, состоящий из множества вложенных запросов, СКД выполняет каждый запрос независимо. Свертка одинаковых строк из разных наборов происходит исключительно на этапе расчета ресурсов компоновщика.
Разберем по шагам, как настроить ресурсы и структуру схемы:
Сумма) с выражением расчета Сумма(Сумма). Если поле не указано на этой вкладке, СКД воспринимает его как измерение и выводит каждую строку раздельно.Партнер, а не элемент Детальные записи.Когда отчет содержит 10 и более источников данных, использование дерева объединений СКД усложняет отладку и расчет итогов. Надежнее использовать один Набор данных — Запрос с временными таблицами:
ВЫБРАТЬ
Таблица1.Партнер КАК Партнер,
Таблица1.Сумма КАК Сумма
ПОМЕСТИТЬ ВТ_ВсеДанные
ИЗ
&ТаблицаИсточник1 КАК Таблица1
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Таблица2.Партнер,
Таблица2.Сумма
ИЗ
&ТаблицаИсточник2 КАК Таблица2
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВТ.Партнер КАК Партнер,
СУММА(ВТ.Сумма) КАК СуммаОстаток
ИЗ
ВТ_ВсеДанные КАК ВТ
СГРУППИРОВАТЬ ПО
ВТ.Партнер
Такой подход гарантирует, что данные сначала объединятся и свернутся средствами СУБД до уровня партнера, и только потом будут переданы в компоновщик для окончательного оформления.