Почему данные в отчете СКД отличаются от результата в консоли запросов?

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

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

Анализ исходной ситуации

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

Давайте посмотрим на структуру типичного запроса, который может вызывать подобные сложности:


ВЫБРАТЬ РАЗРЕШЕННЫЕ
    втРазличные.Организация КАК Организация,
    втРазличные.Банк КАК Банк,
    СУММА((втРазличные.РыночнаяСтавка - втРазличные.Ставка) * втРазличные.СуммаРазмещенияВРублях / 100 / 365) КАК ВыпадающийДоходВМесяц,
    СУММА(втРазличные.ОперативныйОстаток) КАК СреднедневныйОстаток
ПОМЕСТИТЬ втОсновнаяТаблица
ИЗ
    втРазличные КАК втРазличные
СГРУППИРОВАТЬ ПО
    втРазличные.Организация,
    втРазличные.Банк;

Проанализируем основные факторы, которые заставляют СКД менять логику выполнения этого кода.

Причина 1: Механизм оптимизации запроса и «Автозаполнение»

Главное отличие СКД от обычной консоли заключается в работе Компоновщика макета. Если в настройках набора данных установлен флаг «Автозаполнение», СКД берет на себя управление текстом запроса. Она анализирует, какие поля пользователь выбрал в настройках отчета (вкладка «Выбранные поля»), и «вырезает» из итогового SQL-запроса все, что считает лишним.

Рассмотрим, к чему это приводит:

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

Решение: Попробуйте отключить «Автозаполнение» и вручную определить список доступных полей. Также проверьте, чтобы все ключевые поля, по которым строится уникальность записей, были в составе ресурсов или группировок.

Причина 2: Влияние ресурсов и двойная агрегация

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

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

Причина 3: Параметры и виртуальные таблицы

СКД специфически обрабатывает параметры. В запросе автора используются параметры &НачалоМесяца и &Дата.

Важно помнить:

Методика правильной отладки

Чтобы понять, «тупит» ли программа или допущена ошибка в логике, нельзя ограничиваться простой консолью запросов. Выполним следующие шаги — для этого подойдёт утилита для пошаговой отладки и поиска ошибок.

  1. Использование консоли СКД: Скачайте или воспользуйтесь встроенной консолью компоновки данных. Она позволяет увидеть исполняемый запрос — тот самый текст на языке SQL (или языке запросов 1С), который генерирует компоновщик после применения всех настроек, группировок и отборов.
  2. Сравнение текстов: Сравните текст из консоли СКД с вашим исходным текстом. Ищите добавленные условия ГДЕ и измененные составы полей во временных таблицах.
  3. Анализ детальных записей: Выведите в отчете СКД детальные записи без группировок, включая все поля из временных таблиц (например, из втДоп). Добавьте отбор по конкретной проблемной организации. Это сразу покажет, в какой момент данные начинают «множиться».

Особенности 1С:Управление холдингом (УХ)

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

Совет: Протестируйте отчет под пользователем с полными правами. Если результат совпадет с консолью — проблема в настройках доступа RLS — для этой цели есть обработка для детального анализа ограничений RLS.

Подводя итог: СКД — это не просто «пускатель запросов», а мощный генератор кода. Большинство проблем «неверных цифр» решается детальным анализом исполняемого запроса через специализированные инструменты отладки компоновки.

← На главную