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