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

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

При разработке отчетов на системе компоновки данных (СКД) начинающие разработчики часто сталкиваются с ситуацией, когда при незаполненных датах периода отчет возвращает пустой результат. Это происходит из-за того, что в тексте запроса жестко прописано условие ГДЕ, которое при пустых значениях параметров превращается в сравнение с пустой датой (01.01.0001). В итоге ни один документ или запись регистра не попадает в этот интервал.

В этой статье мы подробно рассмотрим, как правильно спроектировать схему компоновки данных, чтобы отчет корректно работал как с установленным фильтром по датам, так и без него. Мы разберем несколько методов: от классического использования расширения языка запросов до программной обработки.

Метод 1. Использование расширения языка запросов (фигурные скобки)

Это самый «правильный» и стандартный способ для платформы 1С. Суть его заключается в том, чтобы сделать условие по периоду необязательным. Рассмотрим ситуацию на примере запроса к документам. Если мы напишем обычное условие:


ВЫБРАТЬ
    ОтчетОРозничныхПродажах.Ссылка КАК Ссылка
ИЗ
    Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
ГДЕ
    ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания

То при незаполненных параметрах система будет искать документы за интервал с 0001 года по 0001 год. Чтобы этого избежать, мы проанализируем использование расширения языка запросов СКД. Нам нужно заключить условие в фигурные скобки {}. Пропишем запрос следующим образом:


ВЫБРАТЬ
    ОтчетОРозничныхПродажах.Ссылка КАК Ссылка
ИЗ
    Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
{ГДЕ
    (ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания)}

Важный нюанс: при таком подходе само слово ГДЕ внутри фигурных скобок указывает СКД, что это условие должно добавляться в итоговый SQL-запрос только в том случае, если параметры &ДатаНачала или &ДатаОкончания установлены пользователем. Если они не заполнены, СКД просто «вырежет» этот кусок из запроса, и мы получим данные за всё время. Для отладки и проверки выполнения запросов из схемы компоновки данных подойдёт инженерная консоль запросов для 1С.

Метод 2. Настройка условий на вкладке «Компоновка данных»

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

  1. Откроем конструктор запроса в схеме СКД.
  2. Перейдем на вкладку «Компоновка данных».
  3. В этой вкладке выберем подвкладку «Условия».
  4. Перетащим поле Дата в список условий и укажем вид сравнения Между, а в качестве значений — наши параметры.

В этом случае в основном тексте запроса (на первой вкладке конструктора) поле ГДЕ должно отсутствовать. СКД сама управляет этим фильтром. Если пользователь в настройках отчета снимет галочку с использования периода, условие автоматически исключится из выполнения.

Метод 3. Логические условия в тексте запроса

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


ВЫБРАТЬ
    ОтчетОРозничныхПродажах.Ссылка КАК Ссылка
ИЗ
    Документ.ОтчетОРозничныхПродажах КАК ОтчетОРозничныхПродажах
ГДЕ
    (ОтчетОРозничныхПродажах.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания)
    ИЛИ (&ДатаНачала = ДАТАВРЕМЯ(1, 1, 1) И &ДатаОкончания = ДАТАВРЕМЯ(1, 1, 1))

Проанализируем эту конструкцию: если обе даты не заполнены, вторая часть условия после ИЛИ становится истинной для всех записей, и отчет выводит все данные. Однако этот метод менее эффективен с точки зрения производительности SQL, так как оптимизатору сложнее строить план запроса с подобными логическими операторами.

Метод 4. Использование выражений в параметрах СКД

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

Пример выражения для &ДатаОкончания:

ВЫБОР КОГДА &ДатаОкончания = ДАТАВРЕМЯ(1,1,1) ТОГДА ДАТАВРЕМЯ(3999,12,31) ИНАЧЕ &ДатаОкончания КОНЕЦ

Аналогично для &ДатаНачала можно установить ДАТАВРЕМЯ(1,1,1), хотя она и так является пустой по умолчанию. Таким образом, даже при «пустом» вводе пользователя, запрос в базу данных уйдет с конкретными границами (от начала времен до далекого будущего).

Метод 5. Работа с виртуальными таблицами

Если наш отчет строится не по документам, а по виртуальным таблицам (например, РегистрНакопления.Продажи.Обороты), поведение системы по умолчанию отличается. Рассмотрим настройки параметров виртуальной таблицы:


ВЫБРАТЬ
    ПродажиОбороты.Номенклатура,
    ПродажиОбороты.КоличествоОборот
ИЗ
    РегистрНакопления.Продажи.Обороты(&НачалоПериода, &КонецПериода) КАК ПродажиОбороты

В виртуальных таблицах СКД работает умнее: если параметры &НачалоПериода и &КонецПериода не заполнены, платформа 1С автоматически подставляет значения, соответствующие отсутствию ограничений. Проблема «пустого результата» чаще характерна именно для физических таблиц (документов, справочников), где используется явное условие ГДЕ.

Почему метод с фигурными скобками может «не работать»?

Рассмотрим распространенную ошибку, которую часто допускают разработчики (как в сообщении №12 обсуждения). Если вы прописали условие в фигурных скобках, но при этом оставили такое же условие в обычном разделе ГДЕ, отчет все равно будет возвращать пустоту.

Правило: если вы используете динамическое формирование условий через {} или вкладку «Компоновка данных», убедитесь, что в основном тексте запроса нет жестких фильтров по этим же полям. Проанализируем пример ошибки:


// ТАК ДЕЛАТЬ НЕЛЬЗЯ
ВЫБРАТЬ ... ГДЕ Дата МЕЖДУ &Начало И &Конец
{ГДЕ (Дата МЕЖДУ &Начало И &Конец)}

В данном случае условие без скобок всегда будет ограничивать результат, даже если условие в скобках будет игнорироваться.

Рекомендации по использованию «Стандартного периода»

Для удобства пользователя в современных конфигурациях рекомендуется использовать один параметр типа СтандартныйПериод. Мы можем назвать его ПериодОтчета. Затем:

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

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

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

← На главную