Разработчики 1С часто сталкиваются с загадочной ситуацией: один и тот же запрос в консоли выдает полный набор данных, но стоит перенести его в Схему компоновки данных (СКД), как часть строк бесследно исчезает. Это вызывает недоумение, особенно когда речь идет о сложных отчетах с использованием временных таблиц, объединений (ОБЪЕДИНИТЬ ВСЕ) и соединений. Давайте подробно разберем причины такого поведения и способы решения проблемы.
Проанализируем пример запроса, который часто становится источником проблем в СКД. Рассмотрим ситуацию, когда используются полные соединения и условия в секции ГДЕ. Посмотрим на фрагмент кода:
ВЫБРАТЬ
ЕСТЬNULL(ПланыПродажОбороты.СуммаОборот, 0) КАК СуммаПлан,
ЕСТЬNULL(ПродажиОбороты.СуммаОборот, 0) КАК СуммаФакт
ПОМЕСТИТЬ ВТ_Продажи
ИЗ
РегистрНакопления.ПланыПродаж.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПланыПродажОбороты
ПОЛНОЕ СОЕДИНЕНИЕ
РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода, , ) КАК ПродажиОбороты
ПО ПланыПродажОбороты.Заказ = ПродажиОбороты.ЗаказПокупателя
ГДЕ
ПланыПродажОбороты.ДокументПланирования.Статус = &Статус
Выясним причину, по которой такой запрос может выдавать неверные данные в СКД. В обычном запросе условие ГДЕ, наложенное на поле из таблицы, которая участвует в ПОЛНОМ СОЕДИНЕНИИ, фактически превращает его в ВНУТРЕННЕЕ СОЕДИНЕНИЕ (Inner Join), если в поле попадает NULL. Однако СКД идет дальше: при включенном автозаполнении компоновщик может накладывать пользовательские отборы непосредственно на виртуальные таблицы. Если данные в одной из таблиц не соответствуют отбору, вся строка может выпасть из результата еще до момента объединения. Разобраться в нюансах совмещения таблиц поможет материал о механике соединений в запросах.
Одной из самых частых причин (в 99% случаев по мнению опытных разработчиков) является неправильная настройка ролей полей на закладке Наборы данных. Разберем по шагам, на что нужно обратить внимание:
Рассмотрим ситуацию, когда на отчет накладывается глобальный отбор (например, по Организации или Складу). Посмотрим, как это работает в СКД. Если поле отбора связано с полем запроса, который обращается к виртуальной таблице (например, РегистрНакопления.Продажи.Обороты), СКД пытается оптимизировать выполнение и прокидывает это условие внутрь параметров виртуальной таблицы.
Если ваша виртуальная таблица не вложена во вложенный запрос, а используется напрямую, результат может быть неожиданным. Условие установится "внутри" таблицы, и если там нет данных, соответствующих отбору, объединение с другими таблицами (даже если это ЛЕВОЕ СОЕДИНЕНИЕ) не вернет ожидаемых строк из основной таблицы. Чтобы этого избежать, иногда полезно отключать автозаполнение для конкретных полей или использовать фигурные скобки {} для явного указания мест применения отборов.
Система компоновки данных — это не просто инструмент вывода, это мощный генератор запросов. Проанализируем, что происходит при использовании режима Автозаполнение. Компонент КомпоновщикМакета анализирует, какие поля выбрал пользователь, и перестраивает исходный текст запроса.
Если у вас сложный запрос с несколькими ОБЪЕДИНИТЬ ВСЕ, как в примере автора темы, СКД может решить, что один из подзапросов не влияет на конечный результат (если из него не выбраны уникальные поля), и просто исключит его из исполнения. Рассмотрим пример: если во втором запросе объединения выбираются те же поля, что и в первом, но с другими условиями, и СКД посчитает эти условия избыточными или конфликтующими с глобальными настройками, данные могут "схлопнуться".
Иногда причина кроется вовсе не в коде запроса, а в механизмах платформы по сохранению настроек пользователя. Рассмотрим ситуацию: вы изменили запрос в конфигураторе, добавили новые поля или условия, но при запуске отчета в режиме "1С:Предприятие" видите старый результат.
Почему это происходит? Платформа сохраняет настройки отчета (варианты, отборы, состав полей) для каждого пользователя. В управляемых формах этот кэш может быть особенно "живучим". Посмотрим, как решить эту проблему:
НачалоПериода и КонецПериода) установлены верно. Часто в СКД параметры имеют свои значения по умолчанию, которые перекрывают те, что вы ожидаете увидеть в коде.Если данные все равно не выводятся, проанализируем ситуацию с помощью инструментов отладки. Самый эффективный метод — использование Консоли компоновки данных. Для интерактивной работы со схемами в тонком клиенте подойдет универсальный конструктор отчетов СКД для управляемых форм.
В этой консоли можно получить не исходный текст запроса, который вы написали, а исполняемый запрос — тот самый текст, который СКД отправляет на сервер СУБД после всех своих трансформаций. Сравните этот текст с оригиналом. Вы увидите, какие условия были добавлены, какие соединения удалены и куда компоновщик "подставил" параметры. Как правило, после анализа исполняемого запроса причина пропадания данных становится очевидной: либо лишнее условие ГДЕ во вложенном запросе, либо некорректная работа с NULL в соединениях.
Помните, что СКД — это декларативное описание того, что вы хотите получить, а не жесткий алгоритм исполнения запроса. Уделяйте внимание ролям полей, обязательным связям и настройкам параметров, и тогда ваши отчеты всегда будут показывать верные данные.