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

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

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

Причина 1: Динамическое изменение текста запроса компоновщиком

Важно понимать, что СКД — это не просто инструмент для выполнения SQL-подобных запросов. Это мощный генератор кода. Когда мы нажимаем кнопку «Сформировать», компоновщик макета анализирует настройки отчета (выбранные поля, отборы, группировки) и перестраивает исходный текст запроса. Если в консоли запросов выполняется ровно то, что написано в редакторе, то СКД может:

  1. Удалить из запроса поля, которые не выбраны в текущем варианте отчета или не используются в расчете итогов.
  2. Добавить дополнительные соединения, если используются характеристики или обращения через точку.
  3. Изменить условия в виртуальных таблицах для оптимизации производительности.

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

Причина 2: Управление параметрами в виртуальных таблицах

В тексте запроса автора используются виртуальные таблицы остатков и оборотов. Проанализируем фрагмент:


РегистрБухгалтерии.Типовой.ОстаткиИОбороты(
    &НачалоПериода,
    &КонецПериода,
    Месяц,
    ,
    Счет В (ВЫБРАТЬ Счета.Счет ИЗ Счета КАК Счета),
    ,
) КАК ТиповойОстаткиИОбороты

В консоли запросов параметры &НачалоПериода и &КонецПериода передаются напрямую. Однако в СКД существует механизм автозаполнения. Если в схеме компоновки включено автозаполнение, СКД пытается самостоятельно управлять периодами. Чтобы система корректно подставляла значения из стандартных настроек «Период», рекомендуется использовать фигурные скобки. Это позволяет СКД гибко управлять параметрами в зависимости от того, установлены они пользователем или нет.

Правильный синтаксис для СКД в параметрах виртуальной таблицы выглядит так:


РегистрБухгалтерии.Типовой.ОстаткиИОбороты(
    {&НачалоПериода},
    {&КонецПериода},
    Месяц,
    ,
    Счет В (ВЫБРАТЬ Счета.Счет ИЗ Счета КАК Счета),
    ,
) КАК ТиповойОстаткиИОбороты

Использование фигурных скобок {} указывает компоновщику, что эти параметры являются расширением и должны обрабатываться с учетом настроек компоновки. Если пользователь не заполнит дату начала, СКД просто проигнорирует этот фрагмент, в то время как обычный запрос выдаст ошибку или пустой результат.

Причина 3: Проблема составных типов и полей Субконто

В запросах к бухгалтерским регистрам часто встречается работа с полями Субконто1, Субконто2 и т.д. Эти поля имеют составной тип данных. Рассмотрим логику выбора подразделения в исходном коде:


ВЫБОР
    КОГДА ТиповойОстаткиИОбороты.Счет = ЗНАЧЕНИЕ(ПланСчетов.Типовой.ОсновноеПроизводство)
        ТОГДА ТиповойОстаткиИОбороты.Субконто1
    ИНАЧЕ ТиповойОстаткиИОбороты.Субконто2
КОНЕЦ КАК Подр

Когда такие поля участвуют в ПОЛНОМ СОЕДИНЕНИИ, как в примере автора:

ПО ПервПериод.Подр = ВторПериод.Подр И ПервПериод.Статья = ВторПериод.Статья

СКД может столкнуться с трудностями при определении типа данных на уровне СУБД. В консоли запросов типы определяются «на лету», но в СКД при построении временных таблиц важно явно типизировать значения. Для этого используем функцию ВЫРАЗИТЬ. Это гарантирует, что при соединении таблиц система будет сравнивать объекты одного и того же типа (например, Справочник.Подразделения), а не пытаться сопоставить неопределенные ссылки.

Пример оптимизированного выбора с типизацией:


ВЫБОР
    КОГДА ТиповойОстаткиИОбороты.Счет = ЗНАЧЕНИЕ(ПланСчетов.Типовой.ОсновноеПроизводство)
        ТОГДА ВЫРАЗИТЬ(ТиповойОстаткиИОбороты.Субконто1 КАК Справочник.Подразделения)
    ИНАЧЕ ВЫРАЗИТЬ(ТиповойОстаткиИОбороты.Субконто2 КАК Справочник.Подразделения)
КОНЕЦ КАК Подр

Причина 4: Роли полей и уровни детализации

Еще один важный аспект — как СКД интерпретирует структуру данных. В консоли мы видим «плоскую» таблицу. В СКД результат зависит от настроек на вкладке «Настройки» -> «Детальные записи» или «Группировки».

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

Как увидеть реальный запрос СКД?

Чтобы окончательно выяснить причину расхождений, необходимо проанализировать исполняемый запрос. Это тот текст, который СКД реально отправляет на сервер базы данных после всех оптимизаций. Для этого выполним следующие шаги:

  1. Воспользуемся специальной обработкой «Консоль системы компоновки данных» (ее можно найти на ИТС или в составе инструментов разработчика).
  2. Загрузим в нее схему отчета и установим те же параметры, что и в отчете.
  3. Перейдем на закладку «Исполняемый запрос».
  4. Скопируем полученный текст и выполним его в обычной консоли запросов.

Обычно на этом этапе становится очевидно, какие условия добавила СКД, какие поля она исключила из выборки и как интерпретировала параметры периодов. Разница часто кроется в автоматических отборах по Организации или Периоду, которые СКД неявно добавляет в секцию ГДЕ или в параметры виртуальных таблиц.

Практические рекомендации

Подводя итог, разберем по шагам, как избежать расхождений:

Соблюдение этих правил превратит СКД из «черного ящика» в предсказуемый и эффективный инструмент разработки отчетов.

← На главную