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