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

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

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

Метод 1. Использование поля Выражение в закладке Параметры

Рассмотрим наиболее правильный и стандартный способ решения проблемы. В СКД рекомендуется разделять параметры, которые видит пользователь, и параметры, которые используются в тексте запроса. Проанализируем, как это реализовать:

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

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

Метод 2. Переименование параметров для обхода автоматической логики СКД

Выясним причину, по которой иногда функции в выражениях не срабатывают. СКД обладает встроенными механизмами управления параметрами виртуальных таблиц. Если платформа видит стандартные имена параметров, такие как &Период или &НачалоПериода/&КонецПериода, она может игнорировать ваши настройки и применять собственную логику приведения дат.

Разберем, как обойти это ограничение:

  1. В тексте запроса заменим названия параметров в круглых скобках виртуальных таблиц на нестандартные. Например, вместо &КонецПериода напишем &МояДатаКонца.
    
    ВЫБРАТЬ
        ПродажиОбороты.Номенклатура,
        ПродажиОбороты.КоличествоОборот
    ИЗ
        РегистрНакопления.Продажи.Обороты(, &МояДатаКонца, , ) КАК ПродажиОбороты
    
  2. После этого на закладке Параметры появится новый параметр МояДатаКонца.
  3. Теперь для него можно смело задавать любое выражение приведения к концу дня, и СКД не будет его "перебивать".

Метод 3. Проверка состава даты и типов данных

Проанализируем ситуацию, когда даже правильное выражение не дает результата. Часто проблема кроется в настройках типов. Если в колонке Тип для параметра указано Дата, платформа может на уровне СУБД отсекать время, даже если вы применили функцию КОНЕЦПЕРИОДА.

Что нужно проверить:

В настройках параметра в колонке Тип нажмите на кнопку выбора и убедитесь, что в поле Состав даты выбрано значение Дата и время. Если выбрано Дата, то время 23:59:59 всегда будет превращаться в 00:00:00.

Метод 4. Работа с виртуальными таблицами СрезПоследних

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

Если конструкция в тексте запроса вида СрезПоследних(КОНЕЦПЕРИОДА(&Период, ДЕНЬ)) не возвращает нужные данные, рассмотрим альтернативный вариант через использование временных таблиц. Посмотрим на пример кода, который гарантированно находит актуальные записи:


ВЫБРАТЬ
    Рег.Сотрудник,
    МАКСИМУМ(Рег.Период) КАК МаксДата
ПОМЕСТИТЬ втМаксДаты
ИЗ
    РегистрСведений.КатегорииСотрудников КАК Рег
ГДЕ
    Рег.Период <= КОНЕЦПЕРИОДА(&Период, ДЕНЬ)
СГРУППИРОВАТЬ ПО
    Рег.Сотрудник;

///////////////////////////////////////////

ВЫБРАТЬ
    втМаксДаты.Сотрудник,
    КатегорииСотрудников.Категория
ИЗ
    втМаксДаты КАК втМаксДаты
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.КатегорииСотрудников КАК КатегорииСотрудников
    ПО втМаксДаты.Сотрудник = КатегорииСотрудников.Сотрудник
    И втМаксДаты.МаксДата = КатегорииСотрудников.Период

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

Метод 5. Использование функции ДОБАВИТЬКДАТЕ

В некоторых случаях, чтобы "захватить" все движения за секунду 23:59:59 (особенно в старых версиях платформы или при специфических настройках границ), используется метод добавления одной секунды к концу дня, что переводит время на 00:00:00 следующего дня.

Проанализируем пример выражения для параметра:

ДОБАВИТЬКДАТЕ(КОНЕЦПЕРИОДА(&ДатаКонца, "ДЕНЬ"), "СЕКУНДА", 1)

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

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

Для корректного отображения данных на конец дня в СКД мы рекомендуем придерживаться следующего алгоритма:

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