Новые возможности для работы с датой в запросах 1С
Даты играют важную роль в любой информационной системе. Особенно это касается 1С, где с датами приходится работать ежедневно. В статье мы рассмотрим новые и малоизвестные способы работы с датой в запросах на платформе 1С 8.3. Эти приемы помогут сэкономить время и упростить разработку отчетов и обработок.
1. Базовые операции с датой в запросе
Давайте начнем с самого простого - получения текущей даты в запросе 1С. Для этого можно воспользоваться параметром:
Параметры: ДатаНачала = ТекущаяДата(); Запрос: ВЫБРАТЬ ДатаНачала КАК ТекущаяДата ИЗ Документ.ПриходнаяНакладная КАК Док ГДЕ Док.Дата МЕЖДУ &ДатаНачала И &ДатаНачала
Таким образом, текущую дату и время мы получаем в переменной ДатаНачала, а затем используем это значение в запросе.
Еще одна распространенная задача - проверка на пустую дату. Это может пригодиться, например, чтобы определить незакрытые документы:
ЗАПРОС: ВЫБРАТЬ * ИЗ Документ.ЗаказКлиента КАК Заказ ГДЕ Заказ.ДатаЗакрытия = ДАТАВРЕМЯ(1, 1, 1)
Функция ДАТАВРЕМЯ(1, 1, 1) возвращает пустую дату. Поэтому в результате запроса мы получим только открытые заказы.
Чтобы создать в запросе произвольную дату, также воспользуемся ДАТАВРЕМЯ, передав нужные значения года, месяца и числа:
ЗАПРОС: ВЫБРАТЬ ДАТАВРЕМЯ(2022, 5, 15) КАК ДатаВыплаты
А если нужно отделить дату от времени, можно так:
ЗАПРОС: ВЫБРАТЬ ДАТА(Док.Дата) КАК ДатаБезВремени ИЗ Документ.ПриходнаяНакладная КАК Док
2. Работа с периодами времени
В 1С существует понятие периода времени - это промежуток с определенной длительностью. Чаще всего используются такие периоды, как день, неделя, месяц, квартал, год. Работать с периодами позволяют специальные функции.
Например, чтобы получить дату начала месяца по произвольной дате, можно воспользоваться НАЧАЛОПЕРИОДА:
ЗАПРОС: ВЫБРАТЬ НАЧАЛОПЕРИОДА(Док.Дата, Месяц) КАК НачалоМесяца ИЗ Документ.РасходнаяНакладная КАК Док
А для вычисления количества дней между двумя датами удобно использовать РАЗНОСТЬДАТ:
ЗАПРОС: ВЫБРАТЬ РАЗНОСТЬДАТ(Дата1, Дата2, День) КАК РазницаВДнях ИЗ ТаблицаДат КАК ТД
Таким образом, периоды времени позволяют гибко оперировать датами - находить границы периодов, сравнивать, анализировать.
3. Преобразование даты в строку
Иногда требуется преобразовать дату к строковому представлению. Например, чтобы вывести дату в определенном формате в печатной форме.
В запросе можно воспользоваться функцией ФОРМАТ:
ЗАПРОС: ВЫБРАТЬ ФОРМАТ(Док.Дата, "ДЛФ=DD.MM.YYYY") КАК ДатаВФормате ИЗ Документ.РасходнаяНакладная КАК Док
Это позволит получить дату в нужном текстовом представлении для вывода в отчете.
Кроме того, на формат отображения даты влияют региональные настройки операционной системы. Чтобы вывести дату вне зависимости от этих настроек, можно указать маску формата.
Таким образом, преобразование к строке дает дополнительные возможности для работы с датами в 1С.
4. Работа с диапазонами дат
Диапазоны дат часто используются в 1С для отбора данных за период. Это позволяет получить, например, документы или проводки за месяц, квартал или произвольный промежуток.
В запросе диапазон задается с помощью оператора МЕЖДУ:
ЗАПРОС: ВЫБРАТЬ * ИЗ Документ.РасходнаяНакладная КАК Док ГДЕ Док.Дата МЕЖДУ &ДатаНачала И &ДатаКонца
Здесь в переменные ДатаНачала и ДатаКонца мы можем передать любые даты, определяющие период.
Также для работы с диапазонами удобна функция КОНЕЦПЕРИОДА. Она позволяет получить дату окончания периода, если известна дата начала:
Параметры: ДатаНачала = ДАТАВРЕМЯ(2023,01,01); Запрос: ВЫБРАТЬ КОНЕЦПЕРИОДА(&ДатаНачала, Месяц) КАК ДатаКонца
5. Дополнительные возможности
Кроме рассмотренного, в 1С есть и другие полезные приемы для работы с датами в запросах.
Например, дату можно использовать в качестве параметра запроса. Это позволяет динамически менять диапазон дат при вызове запроса:
Параметры: НачалоПериода = Дата(1,1,2023); Запрос: ВЫБРАТЬ * ИЗ Документ.ПриходнаяНакладная КАК Док ГДЕ Док.Дата МЕЖДУ &НачалоПериода И &КонецПериода
В запрос можно также поместить дату как константу, указав ее явно:
ЗАПРОС: ВЫБРАТЬ ДАТАВРЕМЯ(2023, 12, 31) КАК КонецГода
Это позволяет использовать фиксированные даты в вычислениях и условиях.
6. Решение практических задач
Рассмотрим несколько примеров использования дат для решения реальных задач в 1С.
Например, можно вычислить возраст клиента, вычитая из текущей даты год его рождения:
ЗАПРОС: ВЫБРАТЬ (ГОД(ТЕКУЩАЯДАТА()) - ГОД(Клиент.ДатаРождения)) КАК Возраст ИЗ Справочник.Клиенты КАК Клиент
Чтобы посчитать количество рабочих дней в периоде, можно воспользоваться специальным механизмом исключения выходных и праздников в 1С.
А для сравнения дат с учетом часовых поясов удобно применять функции ЧАСОВОЙПОЯС и УСТАНОВИТЬЧАСОВОЙПОЯС.
7. Выражение даты в запросе
Иногда возникает потребность выразить дату в явном виде в тексте запроса 1С. Это может потребоваться, например, при формировании отчетов.
В таком случае используется конструкция ВЫРАЗИТЬ():
ЗАПРОС: ВЫБРАТЬ ВЫРАЗИТЬ(Док.Дата, "ДФ='%02.0d.%02.0m.%04Y'") КАК ТекстДаты ИЗ Документ.ПриходнаяНакладная КАК Док
Это позволяет гибко выразить дату в нужном текстовом виде внутри запроса.
Таким образом, выражение дат через ВЫРАЗИТЬ расширяет возможности работы с датами в 1С.