При разработке отчетов на базе Системы компоновки данных (СКД) в конфигурации 1С:Управление нашей фирмой (УНФ) 3.0 программисты часто сталкиваются с неприятным эффектом: в итоговом результате строки начинают дублироваться. Особенно это заметно при использовании временных интервалов (день, неделя, месяц). Вроде бы группировка настроена верно, но в детальных записях мы видим повторяющиеся значения, что ведет к некорректному расчету ресурсов.
Типичная ситуация выглядит следующим образом: мы создаем группировку по полю ПериодДень, внутри которой располагаем группировку по регистратору или заказу. В результате в отчете выводится заголовок даты (например, 07.11.2023), под ним — конкретный заказ, а под заказом — снова строка с той же самой датой. Это не только портит визуальный вид, но и заставляет 1С суммировать ресурсы (сумму, количество) дважды. Проанализируем основные причины этого поведения и способы их устранения.
Одной из самых частых причин является игнорирование вкладки «Роли» в конструкторе схемы компоновки данных. Для системы СКД поле типа «Дата» — это просто набор цифр, пока мы явно не укажем его назначение. Выясним, как это настроить и почему важно заполнять СКД: описание полей отчёта:
Период или Дата).Если роль не указана, СКД может обрабатывать поле как обычное измерение, что при наличии «Детальных записей» приводит к выводу значения на каждом уровне иерархии. Если же роль настроена верно, система понимает, что это период, и схлопывает его согласно структуре отчета.
Посмотрим на вкладку «Ресурсы». Ошибки в расчетах часто возникают из-за того, что ресурс (например, СуммаОборота) рассчитывается по всем доступным полям. Если иерархия настроена избыточно (например, Период -> Заказ -> Детальные записи), система будет пытаться подвести итог на каждом узле.
Решение: В колонке «Рассчитывать по...» для каждого ресурса следует явно указать те группировки, по которым должен подводиться итог. Не оставляйте это поле пустым, если структура вашего отчета сложнее, чем плоский список. Это предотвратит математическое задвоение сумм, даже если визуально лишняя строка останется. Для тонкой настройки отображения итогов можно использовать инструкцию по выводу ресурса СКД в определенных колонках.
В 1С:УНФ отчеты строятся на виртуальных таблицах (Обороты, ОстаткиИОбороты). Проанализируем ситуацию: если в параметрах виртуальной таблицы в поле Периодичность указано значение День, а в самой настройке СКД выбрана группировка по другому периоду или добавлены поля, дробящие этот период (например, время или номер строки из регистра), данные будут дублироваться.
Это происходит потому, что виртуальная таблица выдает срез данных, который физически содержит несколько записей для одного и того же дня (например, если было несколько движений в разные секунды). Чтобы избежать этого, убедитесь, что в запросе СКД выбран правильный метод дополнения и периодичность соответствует уровню группировки в настройках отчета.
Рассмотрим еще одну интересную особенность СКД. В настройках группировки (вкладка «Настройки» -> «Иерархия группировки») существует опция «Дополнение периодов». Она предназначена для того, чтобы в отчете выводились даже те даты, в которых не было движений (для красивого графика или непрерывной шкалы).
Однако, если эта функция включена некорректно, 1С принудительно генерирует строки. Если при этом в «Выбранных полях» детальных записей присутствуют данные, которые не могут быть сопоставлены с дополненными датами, могут возникать визуальные дубли. Проверьте настройки дополнения и попробуйте отключить их для тестирования.
Проанализируем состав выбранных полей. Часто разработчик добавляет поле Период в саму группировку, а затем, по привычке, добавляет это же поле в «Детальные записи».
Рассмотрим пример: В структуре отчета у нас есть:
ДатаЗаказПокупателяЕсли в пункте «Детальные записи» в списке «Выбранные поля» стоит галочка напротив Дата, то СКД выведет дату дважды: один раз как заголовок группы, второй раз — как элемент самой нижней строки. Решение простое: удалите поля периодов из состава детальных записей, если они уже используются как уровни группировки.
В 1С:УНФ активно используются Дополнительные реквизиты и сведения. Рассмотрим ситуацию: вы добавили в отчет Заказ и какое-то его дополнительное свойство. Если у Заказа случайно заполнено два значения одного и того же свойства (или произошло неявное соединение с таблицей характеристик), СКД выполнит «левое соединение».
Хотя в самом запросе вы можете не писать СОЕДИНЕНИЕ, система компоновки сделает это автоматически при обращении через точку к дополнительным реквизитам. В итоге одна строка превращается в две. Проверьте, нет ли у объектов данных нескольких значений характеристик, которые могут «размножать» строки.
Иногда причина кроется во внутреннем кэше или избыточном автозаполнении полей. Если флаг «Автозаполнение» включен, СКД сама добавляет в выборку поля, которые считает нужными для связей. Это может привести к тому, что в выборку попадают скрытые поля с разным временем (секундами), из-за чего группировка «День» не может «схлопнуться».
Как показывает практика, если вы запутались в настройках, самым эффективным способом будет:
Для закрепления материала разберем правильную структуру запроса в СКД, которая минимизирует риск задвоения:
ВЫБРАТЬ
ПродажиОбороты.ПериодДень КАК ПериодДень,
ПродажиОбороты.ЗаказПокупателя КАК ЗаказПокупателя,
ПродажиОбороты.СуммаОборот КАК СуммаОборот
ИЗ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, Авто, ) КАК ПродажиОбороты
При такой выборке важно, чтобы в Ролях поля ПериодДень было указано, что это период, а в настройках структуры группировка по дню была выше, чем группировка по заказу. И помните: детальные записи должны содержать только те поля, которые уникальны для самой нижней строки отчета.