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

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

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

Причины расхождения поведения запроса в консоли и СКД

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

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

Способ 1. Использование расширения языка СКД для фиксации параметров

Если для конкретной виртуальной таблицы (например, оборотов регистра бухгалтерии) требуется использовать фиксированный период или отдельный параметр, не зависящий от глобального периода отчета, необходимо применить синтаксис расширения языка компоновки данных — фигурные скобки {}. Посмотрим на пример явного переопределения параметров:


ВЫБРАТЬ
	ХозрасчетныйОбороты.Счет КАК Счет,
	ХозрасчетныйОбороты.СуммаОборотДт КАК ОборотДт
ИЗ
	РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоСпец, &КонецСпец, , , , , , ) 
	{РегистрБухгалтерии.Хозрасчетный.Обороты(&НачалоСпец, &КонецСпец, , , , , , )} КАК ХозрасчетныйОбороты

Дублирование параметров виртуальной таблицы в фигурных скобках сообщает генератору запросов СКД, что для данной таблицы нужно использовать строго указанные параметры &НачалоСпец и &КонецСпец, а не подставлять значения стандартного периода отчета.

Способ 2. Разделение параметров через формулы на вкладке «Параметры»

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

  1. Создаем один доступный пользователю параметр с типом СтандартныйПериод, например с именем ПериодОтчета.
  2. Для системных параметров НачалоПериода и КонецПериода устанавливаем флаг Ограничение доступности (скрываем их от пользователя).
  3. В колонке Выражение для скрытых параметров указываем формулы получения дат:
    Для НачалоПериода: &ПериодОтчета.ДатаНачала
    Для КонецПериода: &ПериодОтчета.ДатаОкончания
  4. Для дополнительных виртуальных таблиц создаем отдельные параметры (также с ограничением доступности) и вычисляем их через выражения СКД, например: ДобавитьКДате(&ПериодОтчета.ДатаНачала, "МЕСЯЦ", -1) или НачалоПериода(&ПериодОтчета.ДатаНачала, "ГОД").

Способ 3. Управление отборами и предотвращение фильтрации временных таблиц

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

  1. Задаем явные псевдонимы для полей отбора в секции {ГДЕ ...} финального пакета запроса:

ВЫБРАТЬ
	ИтоговаяТаблица.Номенклатура КАК Номенклатура,
	ИтоговаяТаблица.Количество КАК Количество
ИЗ
	ВТ_Итоги КАК ИтоговаяТаблица
{ГДЕ
	ИтоговаяТаблица.Номенклатура.* КАК НоменклатураОтбор}
  1. На вкладке Наборы данных в свойствах критически важных полей (колонка Роль) при необходимости включаем флаг Обязательное. Это гарантирует, что поле и связанные с ним соединения не будут выброшены оптимизатором СКД, даже если поле не выведено в видимые колонки отчета.

Способ 4. Использование нескольких наборов данных

Если в отчете соединяются принципиально разные источники с несогласованными периодами, разберем альтернативный вариант — разделение на несколько наборов данных типа Запрос:

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