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