Капитально об программе 1С 8.0-8.3-8.4, 7.7

Дата в 1С запросе

Дата в запросе в 1С может быть получена:

 

Текущая дата(и время) в запросе 1С получается только в качестве параметра.

Получение дат

Как передать текущую дату в запрос?

Запрос = Новый Запрос(«ВЫБРАТЬ &ТекущаяДата»);

Запрос.УстановитьПараметр(«ТекущаяДата»,ТекущаяДата());
тзРезультатЗапроса = Запрос.Выполнить().Выгрузить();

 

Далее приводятся только тексты запросов.

Как получить начало текущего месяца?

Используем функцию НАЧАЛОПЕРИОДА(ДАТА,{ГОД,КВАРТАЛ,МЕСЯЦ,ДЕКАДА,НЕДЕЛЯ,ДЕНЬ})

ВЫБРАТЬ
  НАЧАЛОПЕРИОДА(&ТекущаяДата,МЕСЯЦ)

Конец текущего года?

ВЫБРАТЬ
  КОНЕЦПЕРИОДА(&ТекущаяДата,ГОД)

Как получить полдень текущей даты?

Добавим использование функции ДОБАВИТЬКДАТЕ(ДАТА,{ГОД,КВАРТАЛ,МЕСЯЦ,ДЕКАДА,НЕДЕЛЯ,ДЕНЬ},ЧИСЛО)

ВЫБРАТЬ
  ДОБАВИТЬКДАТЕ(НАЧАЛОПЕРИОДА(&ТекущаяДата,ДЕНЬ),ЧАС,12)

Как получить дату без времени (0:00)

ВЫБРАТЬ
   НАЧАЛОПЕРИОДА(&ТекущаяДата,ДЕНЬ)

Как задать дату-константу в запросе 1С?

ВЫБРАТЬ
  ДАТАВРЕМЯ(2017,1,1)

Возможно задать дату с точностью до секунды?

ВЫБРАТЬ
  ДАТАВРЕМЯ(2017,1,1,8,0,1)

А до милисекунды?

Нет!

Вычисления над датами

Разность в секундах,минутах,часах, днях, неделях получается при использовании функции РАЗНОСТЬДАТ(Дата1,Дата2,{ГОД,КВАРТАЛ,МЕСЯЦ,ДЕКАДА,НЕДЕЛЯ,ДЕНЬ})

Как получить номер текущего месяца?

ВЫБРАТЬ
  МЕСЯЦ(&ТекущаяДата) как ТекущийМесяц,

  РАЗНОСТЬДАТ(НАЧАЛОПЕРИОДА(&ТекущаяДата,ГОД),КОНЕЦПЕРИОДА(&ТекущаяДата,МЕСЯЦ),МЕСЯЦ) как ПолныхПрошедшихМесяцев

Как получить день недели?

ВЫБРАТЬ
  ДЕНЬНЕДЕЛИ(&ТекущаяДата) КАК НомерДня,
  ВЫБОР
  КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 1
    ТОГДА "понедельник"
  КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 2
    ТОГДА "вторник"
  КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 3
    ТОГДА "среда"
  КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 4
    ТОГДА "четверг"
  КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 5
    ТОГДА "пятница"
  КОГДА ДЕНЬНЕДЕЛИ(&ТекущаяДата) = 6
  ТОГДА "суббота"
  ИНАЧЕ "Воскресенье"
  КОНЕЦ КАК НаименованиеДняНедели

 

Сколько осталось до Нового года?

ВЫБРАТЬ
  &ТекущаяДата > ДАТАВРЕМЯ(2017, 1, 1) КАК НовыйГодНаступил,
  ВЫБОР
  КОГДА &ТекущаяДата > ДАТАВРЕМЯ(2017, 1, 1)
    ТОГДА "Да, наступил"
  ИНАЧЕ "Нет, не наступил"
  КОНЕЦ КАК Ответ,
  РАЗНОСТЬДАТ(&ТекущаяДата,ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2017, 1, 1),СЕКУНДА,-1),ДЕНЬ) как ОсталосьДней,
  РАЗНОСТЬДАТ(&ТекущаяДата,КОНЕЦПЕРИОДА(&ТекущаяДата,ДЕНЬ),ЧАС) как ОсталосьЧасов,
  РАЗНОСТЬДАТ(&ТекущаяДата,КОНЕЦПЕРИОДА(&ТекущаяДата,ЧАС),Минута) как ОсталосьМинут,
  РАЗНОСТЬДАТ(&ТекущаяДата,КОНЕЦПЕРИОДА(&ТекущаяДата,Минута),Секунда) как ОсталосьСекунд

Что еще следует знать про дату в запросах?

Дата в запросах может фигурировать не только в полях выборки, и вычислениях, но также передаваться, как параметры виртуальных таблиц.

Например:

Допустимо задание дат-констант и использование параметров, также обработка их выше приведенными функциями.

Но нельзя дату передать в параметры виртуальных таблиц из полученных ранее в этом запросе полей выборки. 

Сортировка даты в запросе производится в рамках секунды.

Момент времени документа не является датой, он сортирует более глубже, чем  дата документа, т.е. при наличии документов в одну секунду времени, сортировка по дате производится в недопустимом порядке: например в виде представления. Используйте для этого момент времени.

Внешнее  представление даты определяется представлением операционной системы, управлять из запроса, а также приводить в строковое представление в классическом запросе невозможно в отличии от СКД, где возможна пост-обработка и условное оформление.

Допускается применение функции МАКСИМУМ(),МИНИМУМ() к дата в запросе, как в группировке так и в итогах запроса.

Ошибка «неверные параметры» возникает в случае, когда вместо даты передается null, число или что-то иное.

Преобразовать строку в дату в запросе

Специальных функций нет. но возможно преобразование через функцию ПОДСТРОКА и конструкцию ВЫБОР КОГДА

[cl-popup title=»Запрос,приводится в академических целях» btn_label=»Открыть текст запроса» size=»m» border_radius=»3″]ВЫБРАТЬ
"20161012" КАК Параметр,
&Парам = "20161012" КАК ВерныйПараметр,
ПОДСТРОКА(&Парам, 1, 1) КАК символ1,
ПОДСТРОКА(&Парам, 2, 1) КАК символ2,
ПОДСТРОКА(&Парам, 3, 1) КАК символ3,
ПОДСТРОКА(&Парам, 4, 1) КАК символ4
ПОМЕСТИТЬ Расчеты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Расчеты.Параметр,
Расчеты.ВерныйПараметр,
ВЫБОР
КОГДА Расчеты.символ1 = "2"
ТОГДА 2
КОГДА Расчеты.символ1 = "1"
ТОГДА 1
ИНАЧЕ 0
КОНЕЦ * 1000 + ВЫБОР
КОГДА Расчеты.символ2 = "0"
ТОГДА 0
КОГДА Расчеты.символ2 = "1"
ТОГДА 1
КОГДА Расчеты.символ2 = "2"
ТОГДА 2
КОГДА Расчеты.символ2 = "3"
ТОГДА 3
КОГДА Расчеты.символ2 = "4"
ТОГДА 4
КОГДА Расчеты.символ2 = "5"
ТОГДА 5
КОГДА Расчеты.символ2 = "6"
ТОГДА 6
КОГДА Расчеты.символ2 = "7"
ТОГДА 7
КОГДА Расчеты.символ2 = "8"
ТОГДА 8
ИНАЧЕ 9
КОНЕЦ * 100 + ВЫБОР
КОГДА Расчеты.символ3 = "0"
ТОГДА 0
КОГДА Расчеты.символ3 = "1"
ТОГДА 1
КОГДА Расчеты.символ3 = "2"
ТОГДА 2
КОГДА Расчеты.символ3 = "3"
ТОГДА 3
КОГДА Расчеты.символ3 = "4"
ТОГДА 4
КОГДА Расчеты.символ3 = "5"
ТОГДА 5
КОГДА Расчеты.символ3 = "6"
ТОГДА 6
КОГДА Расчеты.символ3 = "7"
ТОГДА 7
КОГДА Расчеты.символ3 = "8"
ТОГДА 8
ИНАЧЕ 9
КОНЕЦ * 10 + ВЫБОР
КОГДА Расчеты.символ4 = "0"
ТОГДА 0
КОГДА Расчеты.символ4 = "1"
ТОГДА 1
КОГДА Расчеты.символ4 = "2"
ТОГДА 2
КОГДА Расчеты.символ4 = "3"
ТОГДА 3
КОГДА Расчеты.символ4 = "4"
ТОГДА 4
КОГДА Расчеты.символ4 = "5"
ТОГДА 5
КОГДА Расчеты.символ4 = "6"
ТОГДА 6
КОГДА Расчеты.символ4 = "7"
ТОГДА 7
КОГДА Расчеты.символ4 = "8"
ТОГДА 8
ИНАЧЕ 9
КОНЕЦ КАК НомерГода
ПОМЕСТИТЬ Цифры
ИЗ
Расчеты КАК Расчеты
;

////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
цифры.Параметр,
цифры.ВерныйПараметр,
цифры.НомерГода,
ДобавитьКДате(ДАТАВРЕМЯ(1,1,1),ГОД,цифры.НомерГода-1)
ИЗ
Цифры КАК цифры[/cl-popup]

Про использование пустой даты в запросе.