При переходе на работу с Системой компоновки данных (СКД) разработчики часто сталкиваются с тем, что привычные системные параметры НачалоПериода и КонецПериода ведут себя не так, как в старых версиях платформы или обычных запросах. Особенно остро эта проблема возникает при построении отчетов по документам, где в отличие от виртуальных таблиц регистров эти параметры не формируются автоматически.
В этой статье мы подробно разберем, куда пропадают стандартные параметры, как правильно настроить удобный выбор интервала дат для пользователя с помощью типа данных СтандартныйПериод, избежим распространенных синтаксических ошибок и научимся выводить настройки на форму отчета.
Выясним причину этого поведения платформы. В СКД автоматическое создание параметров НачалоПериода и КонецПериода происходит только тогда, когда в тексте запроса используются виртуальные таблицы регистров накопления, сведений или бухгалтерии (например, РегистрНакопления.Продажи.Обороты). Платформа анализирует запрос и сама добавляет эти параметры на вкладку «Параметры».
Если же мы пишем запрос к физической таблице документов (например, к таблице Документ.РеализацияТоваровУслуг), СКД не находит виртуальных таблиц и, соответственно, не создает параметры по умолчанию. В этом случае нам необходимо объявить их самостоятельно и связать с удобным пользовательским интерфейсом выбора периода.
Для того чтобы пользователь мог выбирать период в одно нажатие (например, «Этот месяц», «Прошлый квартал», «Вчера»), мы настроим связь между удобным типом СтандартныйПериод и техническими параметрами начала и окончания интервала.
Рассмотрим этот процесс по шагам:
Период и установите для него тип данных СтандартныйПериод. Этот параметр будет виден пользователю.НачалоПериода и КонецПериода. Установите для них тип данных Дата.НачалоПериода пропишите:
&Период.ДатаНачала
КонецПериода пропишите:
&Период.ДатаОкончания
НачалоПериода и КонецПериода установите флаг «Ограничение доступности». Это скроет технические параметры от пользователя, чтобы не загромождать интерфейс, оставив доступным только красивое поле Период.Проанализируем распространенную ошибку, из-за которой отчеты часто перестают работать или выдают сообщения вида «Ожидается выражение "И"» или «Не задано значение параметра "НачалоПериода"». Ошибка кроется в путанице синтаксиса встроенного языка запросов и языка выражений СКД.
Запомните главное правило написания функций приведения даты к началу или концу периода:
КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
КонецПериода(&Период.ДатаОкончания, "День")
Если вы напишете в параметрах схему без кавычек (например, КонецПериода(&Период.ДатаОкончания, День)), СКД выдаст ошибку и значение параметра останется пустым.
Многие разработчики не знают о важной особенности платформы 1С: свойства объекта СтандартныйПериод автоматически инициализируют время границ интервала:
&Период.ДатаНачала всегда инициализируется временем 00:00:00.&Период.ДатаОкончания всегда инициализируется временем 23:59:59.Это означает, что если в параметрах схемы для КонецПериода указано выражение &Период.ДатаОкончания, то в запрос уже передается дата со временем окончания дня. Использовать дополнительную обработку КОНЕЦПЕРИОДА(..., ДЕНЬ) в самом запросе становится избыточным, но часто применяется разработчиками «для страховки».
Посмотрим на пример правильного построения запроса для выборки документов за период с использованием оператора МЕЖДУ. Обратите внимание, что условие накладывается на поле Дата документа:
ВЫБРАТЬ
РеализацияТоваровУслуг.Ссылка КАК Ссылка,
РеализацияТоваровУслуг.Номер КАК Номер,
РеализацияТоваровУслуг.Дата КАК Дата,
РеализацияТоваровУслуг.Проведен КАК Проведен,
РеализацияТоваровУслуг.Организация КАК Организация,
РеализацияТоваровУслуг.СуммаДокумента КАК СуммаДокумента
ИЗ
Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И &КонецПериода
Если вы хотите перестраховаться от сброса времени в параметре &КонецПериода к началу дня (00:00:00), можно написать условие в запросе следующим образом:
ГДЕ
РеализацияТоваровУслуг.Дата МЕЖДУ &НачалоПериода И КОНЕЦПЕРИОДА(&КонецПериода, ДЕНЬ)
Если ваш отчет формируется программно через встроенный язык 1С, хорошей практикой для точного включения документов, записанных на самую последнюю секунду дня, является использование объекта Граница. Рассмотрим пример кода:
// Получаем компоновщик настроек отчета
Настройки = КомпоновщикНастроек.Настройки;
// Установка начала периода
ПараметрНачало = Настройки.ПараметрыДанных.Элементы.Найти(Новый ПараметрКомпоновкиДанных("НачалоПериода"));
Если ПараметрНачало <> Неопределено Тогда
ПараметрНачало.Значение = НачалоДня(ВыбраннаяДатаНачала);
ПараметрНачало.Использование = Истина;
КонецЕсли;
// Установка конца периода с использованием Границы (включая последнюю секунду)
ПараметрКонец = Настройки.ПараметрыДанных.Элементы.Найти(Новый ПараметрКомпоновкиДанных("КонецПериода"));
Если ПараметрКонец <> Неопределено Тогда
ПараметрКонец.Значение = Новый Граница(КонецДня(ВыбраннаяДатаОкончания), ВидГраницы.Включая);
ПараметрКонец.Использование = Истина;
КонецЕсли;
Чтобы пользователю не приходилось каждый раз открывать глубокие настройки отчета для изменения дат, вынесем параметр Период непосредственно на форму отчета в область быстрых настроек. Разберем, как это сделать:
Период.После выполнения этих действий при открытии отчета поле выбора периода будет отображаться прямо над кнопкой «Сформировать», предоставляя пользователю удобный доступ ко всем стандартным интервалам дат платформы 1С.