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