Как в СКД сделать период необязательным для заполнения?

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

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

В чем причина проблемы?

В обычном запросе 1С любое написанное условие в секции ГДЕ является жестким ограничением. Рассмотрим стандартный запрос:


ВЫБРАТЬ
    ОС_СписаниеИнвентарногоОбъекта.Учреждение,
    ОС_СписаниеИнвентарногоОбъекта.ОС,
    ОС_СписаниеИнвентарногоОбъекта.Количество,
    ОС_СписаниеИнвентарногоОбъекта.СуммаДокумента
ИЗ
    Документ.ОС_СписаниеИнвентарногоОбъекта КАК ОС_СписаниеИнвентарногоОбъекта
ГДЕ
    ОС_СписаниеИнвентарногоОбъекта.Дата >= &НачалоПериода 
    И ОС_СписаниеИнвентарногоОбъекта.Дата <= &КонецПериода

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

Решение проблемы: расширение языка запросов СКД

Для создания гибких отчетов в Системе компоновки данных реализован мощный механизм — **расширение языка запросов**. Оно позволяет помечать определенные условия как необязательные с помощью фигурных скобок {}.

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

Рассмотрим по шагам, как настроить этот функционал в вашем отчете.

Шаг 1. Модернизация текста запроса в СКД

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


ВЫБРАТЬ
    ОС_СписаниеИнвентарногоОбъекта.Учреждение,
    ОС_СписаниеИнвентарногоОбъекта.ОС,
    ОС_СписаниеИнвентарногоОбъекта.Количество,
    ОС_СписаниеИнвентарногоОбъекта.СуммаДокумента
ИЗ
    Документ.ОС_СписаниеИнвентарногоОбъекта КАК ОС_СписаниеИнвентарногоОбъекта
{ГДЕ
    ОС_СписаниеИнвентарногоОбъекта.Дата >= &НачалоПериода,
    ОС_СписаниеИнвентарногоОбъекта.Дата <= &КонецПериода}

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

Шаг 2. Настройка параметров компоновки данных

Перейдем на закладку Параметры в схеме компоновки данных. Нам необходимо настроить три параметра для удобной работы пользователя:

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

Шаг 3. Вывод параметра в пользовательские настройки

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

  1. Выделим параметр ПериодОтчета на вкладке Параметры.
  2. В правой нижней части экрана нажмем кнопку Свойства элемента пользовательских настроек (значок с шестеренкой).
  3. Установим флаг Включать в пользовательские настройки.
  4. Режим редактирования укажем как Быстрый доступ.

Теперь при запуске отчета пользователь увидит удобное поле выбора периода с флажком использования. Если флаг установлен и период выбран — отчет отфильтрует данные. Если снять флажок у поля «Период» — отчет без проблем сформируется за всю историю ведения учета.

Важные нюансы при работе с конструктором запросов

Проанализируем некоторые подводные камни, которые могут возникнуть при дальнейшей разработке отчета:

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

← На главную