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