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

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

Разработчики 1С часто сталкиваются с загадочной ситуацией: один и тот же запрос в консоли выдает полный набор данных, но стоит перенести его в Схему компоновки данных (СКД), как часть строк бесследно исчезает. Это вызывает недоумение, особенно когда речь идет о сложных отчетах с использованием временных таблиц, объединений (ОБЪЕДИНИТЬ ВСЕ) и соединений. Давайте подробно разберем причины такого поведения и способы решения проблемы.

Анализ структуры запроса и влияние соединений

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


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

Выясним причину, по которой такой запрос может выдавать неверные данные в СКД. В обычном запросе условие ГДЕ, наложенное на поле из таблицы, которая участвует в ПОЛНОМ СОЕДИНЕНИИ, фактически превращает его в ВНУТРЕННЕЕ СОЕДИНЕНИЕ (Inner Join), если в поле попадает NULL. Однако СКД идет дальше: при включенном автозаполнении компоновщик может накладывать пользовательские отборы непосредственно на виртуальные таблицы. Если данные в одной из таблиц не соответствуют отбору, вся строка может выпасть из результата еще до момента объединения. Разобраться в нюансах совмещения таблиц поможет материал о механике соединений в запросах.

Проблема ролей полей в СКД

Одной из самых частых причин (в 99% случаев по мнению опытных разработчиков) является неправильная настройка ролей полей на закладке Наборы данных. Разберем по шагам, на что нужно обратить внимание:

  1. Обязательные поля: Если в вашем запросе есть связи между таблицами, но поля, по которым эти связи строятся, не выбраны пользователем в настройках отчета и не отмечены флажком Обязательное в схеме, СКД может оптимизировать запрос и просто выбросить "ненужное" соединение. В итоге данные, которые должны были подтянуться через это соединение, пропадают.
  2. Игнорировать значения NULL: В настройках связей наборов данных (если их несколько) проверьте этот флаг. Если он установлен, строки с пустыми значениями связи будут отсекаться.
  3. Роль "Период": Если отчет строится с группировкой по периодам, важно правильно указать роли для полей дат, иначе итоги и остатки могут рассчитываться некорректно или данные не попадут в нужный интервал.

Влияние глобальных отборов на виртуальные таблицы

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

Если ваша виртуальная таблица не вложена во вложенный запрос, а используется напрямую, результат может быть неожиданным. Условие установится "внутри" таблицы, и если там нет данных, соответствующих отбору, объединение с другими таблицами (даже если это ЛЕВОЕ СОЕДИНЕНИЕ) не вернет ожидаемых строк из основной таблицы. Чтобы этого избежать, иногда полезно отключать автозаполнение для конкретных полей или использовать фигурные скобки {} для явного указания мест применения отборов.

Автозаполнение и оптимизация текста запроса

Система компоновки данных — это не просто инструмент вывода, это мощный генератор запросов. Проанализируем, что происходит при использовании режима Автозаполнение. Компонент КомпоновщикМакета анализирует, какие поля выбрал пользователь, и перестраивает исходный текст запроса.

Если у вас сложный запрос с несколькими ОБЪЕДИНИТЬ ВСЕ, как в примере автора темы, СКД может решить, что один из подзапросов не влияет на конечный результат (если из него не выбраны уникальные поля), и просто исключит его из исполнения. Рассмотрим пример: если во втором запросе объединения выбираются те же поля, что и в первом, но с другими условиями, и СКД посчитает эти условия избыточными или конфликтующими с глобальными настройками, данные могут "схлопнуться".

Кэширование настроек и проблемы форм

Иногда причина кроется вовсе не в коде запроса, а в механизмах платформы по сохранению настроек пользователя. Рассмотрим ситуацию: вы изменили запрос в конфигураторе, добавили новые поля или условия, но при запуске отчета в режиме "1С:Предприятие" видите старый результат.

Почему это происходит? Платформа сохраняет настройки отчета (варианты, отборы, состав полей) для каждого пользователя. В управляемых формах этот кэш может быть особенно "живучим". Посмотрим, как решить эту проблему:

  1. Попробуйте переименовать внешний отчет в конфигураторе. Это заставит систему создать новую запись в кэше настроек.
  2. В режиме пользователя воспользуйтесь кнопкой Установить стандартные настройки. Это сбросит текущий вариант отчета к тому виду, который вы настроили в схеме компоновки.
  3. Убедитесь, что параметры периода (НачалоПериода и КонецПериода) установлены верно. Часто в СКД параметры имеют свои значения по умолчанию, которые перекрывают те, что вы ожидаете увидеть в коде.

Практические советы по диагностике

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

В этой консоли можно получить не исходный текст запроса, который вы написали, а исполняемый запрос — тот самый текст, который СКД отправляет на сервер СУБД после всех своих трансформаций. Сравните этот текст с оригиналом. Вы увидите, какие условия были добавлены, какие соединения удалены и куда компоновщик "подставил" параметры. Как правило, после анализа исполняемого запроса причина пропадания данных становится очевидной: либо лишнее условие ГДЕ во вложенном запросе, либо некорректная работа с NULL в соединениях.

Помните, что СКД — это декларативное описание того, что вы хотите получить, а не жесткий алгоритм исполнения запроса. Уделяйте внимание ролям полей, обязательным связям и настройкам параметров, и тогда ваши отчеты всегда будут показывать верные данные.

← На главную