Часто при разработке отчетов в системе компоновки данных (СКД) разработчики сталкиваются с ситуацией, когда запрос, идеально работающий в консоли, в отчете ведет себя непредсказуемо. Одной из самых частых проблем является «пропадание» записей при использовании виртуальных таблиц с параметрами периода, особенно если в запросе производится соединение нескольких таблиц.
Давайте вместе разберемся, почему это происходит и как заставить СКД корректно обрабатывать ваши параметры.
Когда вы используете виртуальные таблицы, например РегистрНакопления.Закупки.Обороты(&НачалоПериода, &КонецПериода, Авто), СКД пытается «помочь» вам. Если в настройках набора данных включено автоматическое заполнение, система автоматически создает параметры для этих таблиц. Даже если вы уже объявили свои параметры на закладке «Параметры», СКД принудительно переопределяет их своими значениями, часто ограничивая данные первой таблицы периодом второй или навязывая свои системные фильтры.
Это приводит к тому, что при соединении таблиц (например, ВНУТРЕННЕЕ СОЕДИНЕНИЕ) записи, не входящие в «навязанный» системой интервал, просто отсекаются, и вы видите пустой отчет или неполные данные.
Самый простой и эффективный способ «успокоить» СКД — это использование фигурных скобок в тексте запроса. Фигурные скобки сообщают системе, что параметр является «мягким» и его не нужно принудительно переопределять, если он уже задан разработчиком.
Рассмотрим, как изменить текст вашего запроса:
ВЫБРАТЬ
ЗакупкиОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
ЗакупкиОбороты.Контрагент КАК Поставщик
ПОМЕСТИТЬ ВТ
ИЗ
РегистрНакопления.Закупки.Обороты({&НачалоПериода}, {&КонецПериода}, Авто, ) КАК ЗакупкиОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК СуммаПродаж,
ВТ.Поставщик КАК Поставщик
ИЗ
РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты({&НачалоПериода}, {&КонецПериода}, Авто, ) КАК ВыручкаИСебестоимостьПродажОбороты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
ПО ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Номенклатура = ВТ.Номенклатура
Добавление { } вокруг параметров периода внутри виртуальных таблиц дает СКД понять, что эти параметры являются необязательными и не требуют жесткого управления со стороны системы.
Если вы хотите полностью контролировать процесс, вы можете не прописывать параметры внутри виртуальных таблиц, а настроить их связь на вкладке «Параметры» СКД.
&ПериодНачала.ПериодНачала и ПериодКонца), имеют нужные свойства: доступность для пользователя, установленное значение или связь с параметрами самого отчета.Если отчет получается сложным и СКД «мешает» своими автоматическими действиями, вы всегда можете отключить опцию Автозаполнение в свойствах набора данных.
Важно помнить: при отключении автозаполнения система перестает сама добавлять поля в «Выбранные поля» и «Параметры». Вам придется:
Это более трудоемкий путь, но он дает 100% гарантию того, что СКД не совершит никаких действий без вашего ведома. Этот метод рекомендуется использовать только в очень сложных отчетах, где стандартные механизмы СКД вступают в конфликт с логикой запроса.
Работая с СКД, всегда помните, что это не просто SQL-транслятор, а полноценный движок, который анализирует и модифицирует запрос. Если вы видите, что данные пропадают или отборы не работают так, как ожидалось:
{ }.Использование этих простых правил поможет вам избежать головной боли при разработке отчетов и сделает вашу работу с СКД стабильной и предсказуемой.