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

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

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

Суть проблемы: невидимая оптимизация СКД

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

Причина 1: Работа с физическими таблицами вместо виртуальных

В исходном запросе использовалась физическая таблица РегистрНакопления.Продажи. Рассмотрим, почему это плохая практика для СКД:

Проанализируем фрагмент исходного кода, который вызывал сложности:


ВЫБРАТЬ
    Продажи.Документ КАК Документ,
    Продажи.Номенклатура КАК Номенклатура,
    Продажи.Количество КАК Количество,
    ЦеныНоменклатурыСрезПоследних.Цена * Продажи.Количество КАК СуммаУчет
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрНакопления.Продажи КАК Продажи
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних КАК ЦеныНоменклатурыСрезПоследних
    ПО (Продажи.Номенклатура = ЦеныНоменклатурыСрезПоследних.Номенклатура)
ГДЕ
    Продажи.Период МЕЖДУ &НачДата И &КонДата

Причина 2: Роли полей и агрегация (Ресурсы)

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

Решение: Переход на виртуальные таблицы

Наиболее правильным и надежным решением является замена физической таблицы на виртуальную таблицу Обороты. Посмотрим, как преобразится запрос:

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

Рассмотрим пример правильного построения запроса для СКД:


ВЫБРАТЬ
    ПродажиОбороты.Номенклатура КАК Номенклатура,
    ПродажиОбороты.Контрагент КАК Контрагент,
    ПродажиОбороты.КоличествоОборот КАК Количество,
    ПродажиОбороты.СуммаОборот КАК Сумма,
    ЕСТЬNULL(Цены.Цена, 0) * ПродажиОбороты.КоличествоОборот КАК СуммаУчет
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачДата, &КонДата, Авто, ) КАК ПродажиОбороты
    ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ЦеныНоменклатуры.СрезПоследних(&КонДата, ВидЦен = &ВидЦен) КАК Цены
    ПО ПродажиОбороты.Номенклатура = Цены.Номенклатура

Дополнительные настройки для точности результата

Чтобы результат в СКД гарантированно совпадал с ожидаемым, выполним следующие шаги:

Шаг 1. Настройка ресурсов. Перейдите на закладку «Ресурсы» и добавьте туда все числовые поля: Количество, Сумма, СуммаУчет. Убедитесь, что в колонке «Выражение» стоит СУММА(ИмяПоля).

Шаг 2. Использование обязательных полей. Если ваше соединение с таблицей цен критически важно (например, оно фильтрует данные), а поле Цена не всегда выводится в отчет, СКД может выбросить это соединение из итогового SQL-запроса. Чтобы этого не случилось, на закладке «Наборы данных» для соответствующих полей установите флаг «Обязательное».

Шаг 3. Проверка параметров. Убедитесь, что параметры &НачалоПериода и &КонецПериода в СКД привязаны к стандартному периоду или заполняются корректно. Часто ошибка кроется в разнице между 23:59:59 и началом следующего дня.

Почему это помогло автору темы?

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

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

← На главную