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