Как правильно передать параметр даты в запрос 1С для получения остатков на конец дня?

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

При разработке отчетов или обработок в 1С часто возникает задача получить остатки товаров на определенную дату. Одной из самых частых ошибок является передача даты с временем 00:00:00, из-за чего в выборку не попадают документы, проведенные в выбранный день. Разберем, как гарантированно получать данные на конец выбранных пользователем суток.

Почему важна корректная установка времени

В платформе 1С тип Дата всегда содержит как календарную дату, так и время. Если пользователь выбирает 11.09.2023, в системе это значение по умолчанию интерпретируется как 11.09.2023 00:00:00. При работе с виртуальными таблицами остатков (например, ТоварыНаСкладахОстаткиИОбороты), параметр Период определяет момент времени, на который выполняется срез. Если передать 00:00:00, мы получим остатки на самое начало дня, проигнорировав все приходы и расходы, случившиеся в течение этих суток.

Способ 1: Использование функции КОНЕЦПЕРИОДА в запросе

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

Рассмотрим пример того, как это выглядит в тексте запроса:


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

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

Способ 2: Использование функции КонецДня в программном коде

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

Разберем процесс по шагам:

  1. Получаем значение даты из элемента формы (например, из реквизита ДатаОтчета).
  2. Применяем функцию КонецДня() к полученному значению.
  3. Передаем полученный результат в запрос.

Пример программного кода:


ДатаДляЗапроса = КонецДня(Объект.ДатаОтчета);
Запрос = Новый Запрос;
Запрос.Текст = "...";
Запрос.УстановитьПараметр("Период", ДатаДляЗапроса);

Важные рекомендации при работе с периодами

При проектировании интерфейсов и написании кода всегда учитывайте следующие нюансы:

Используя эти методы, вы избежите классической ошибки «пропадания» документов за последний день периода и обеспечите корректное формирование складской или финансовой отчетности в 1С.

← На главную