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

Узнайте секрет функции КОНЕЦПЕРИОДА в запросах 1С 8.3. Простой способ найти последнее число месяца для отчётов и остатков без лишних сложностей.

Бесплатная консультация юриста

+7 (800) 301-07-30

Реклама jurik.ru

При разработке отчётов и обработок в 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С.