Почему в СКД не срабатывает отбор и пропадают данные при соединении таблиц?

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

Часто при разработке отчетов в системе компоновки данных (СКД) разработчики сталкиваются с ситуацией, когда запрос, идеально работающий в консоли, в отчете ведет себя непредсказуемо. Одной из самых частых проблем является «пропадание» записей при использовании виртуальных таблиц с параметрами периода, особенно если в запросе производится соединение нескольких таблиц.

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

Суть проблемы: конфликт автозаполнения

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

Это приводит к тому, что при соединении таблиц (например, ВНУТРЕННЕЕ СОЕДИНЕНИЕ) записи, не входящие в «навязанный» системой интервал, просто отсекаются, и вы видите пустой отчет или неполные данные.

Решение 1: Использование «мягких» параметров

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

Рассмотрим, как изменить текст вашего запроса:


ВЫБРАТЬ
    ЗакупкиОбороты.АналитикаУчетаНоменклатуры.Номенклатура КАК Номенклатура,
    ЗакупкиОбороты.Контрагент КАК Поставщик
ПОМЕСТИТЬ ВТ
ИЗ
    РегистрНакопления.Закупки.Обороты({&НачалоПериода}, {&КонецПериода}, Авто, ) КАК ЗакупкиОбороты
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
    ВыручкаИСебестоимостьПродажОбороты.СуммаВыручкиОборот КАК СуммаПродаж,
    ВТ.Поставщик КАК Поставщик
ИЗ
    РегистрНакопления.ВыручкаИСебестоимостьПродаж.Обороты({&НачалоПериода}, {&КонецПериода}, Авто, ) КАК ВыручкаИСебестоимостьПродажОбороты
        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ВТ КАК ВТ
        ПО ВыручкаИСебестоимостьПродажОбороты.АналитикаУчетаНоменклатуры.Номенклатура = ВТ.Номенклатура

Добавление { } вокруг параметров периода внутри виртуальных таблиц дает СКД понять, что эти параметры являются необязательными и не требуют жесткого управления со стороны системы.

Решение 2: Настройка через вкладку «Параметры»

Если вы хотите полностью контролировать процесс, вы можете не прописывать параметры внутри виртуальных таблиц, а настроить их связь на вкладке «Параметры» СКД.

  1. Перейдите на вкладку Наборы данных.
  2. В поле параметров виртуальной таблицы установите выражение, например: &ПериодНачала.
  3. Перейдите на вкладку Параметры.
  4. Убедитесь, что параметры, которые вы используете (например, ПериодНачала и ПериодКонца), имеют нужные свойства: доступность для пользователя, установленное значение или связь с параметрами самого отчета.
  5. Используйте опцию «Ограничение доступности», если хотите скрыть технические параметры от пользователя и выводить только параметры периода, доступные в стандартных настройках СКД.

Решение 3: Отключение автозаполнения

Если отчет получается сложным и СКД «мешает» своими автоматическими действиями, вы всегда можете отключить опцию Автозаполнение в свойствах набора данных.

Важно помнить: при отключении автозаполнения система перестает сама добавлять поля в «Выбранные поля» и «Параметры». Вам придется:

  1. Вручную прописать все поля на вкладке Наборы данных.
  2. Самостоятельно настроить все параметры, которые используются в запросе, на вкладке Параметры.

Это более трудоемкий путь, но он дает 100% гарантию того, что СКД не совершит никаких действий без вашего ведома. Этот метод рекомендуется использовать только в очень сложных отчетах, где стандартные механизмы СКД вступают в конфликт с логикой запроса.

Подведем итоги

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

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

← На главную