1С 8 время

При написании запросов на языке 1С довольно часть встречается необходимость работы с переменными типа «Дата». В данной статье мы рассмотрим основные приемы — передача текущей даты, проверка на пустое значение, произвольная дата.

Текущая дата

При написании запросов зачастую необходимо сравнивать данные с текущей датой. Во встроенном языке 1С есть функция ТекущаяДата(). Она позволяет определить текущее время и дату на компьютере. Для произведения операций с текущей датой необходимо передавать в запрос значение этой функции в качестве параметра.

Ниже представлен запрос, выбирающий все файлы, присоединенные к авансовым отчетам с датой создания до настоящего момента:

ПримерЗапроса = Новый Запрос;
ПримерЗапроса.Текст =»
|ВЫБРАТЬ
| АвансовыйОтчетПрисоединенныеФайлы.Ссылка
|ИЗ
| Справочник.АвансовыйОтчетПрисоединенныеФайлыКАК АвансовыйОтчетПрисоединенныеФайлы
|ГДЕ
| АвансовыйОтчетПрисоединенныеФайлы.Дата < &ТекДата»;
ПримерЗапроса.УстановитьПараметр(«ТекДата», ТекущаяДата());

Произвольная дата

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

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по .
Будем рады помочь Вам!

Обратите внимание, что используя эту функцию в примере выше, в качестве входных параметров мы передавали только три числа (год, месяц, день). Последние три (час, минута, секунда) не являются обязательными и при отсутствии заменяются на «0», то есть начало дня.

В рамках данного примера будут получены все файлы, присоединенные к авансовым отчетам до конца прошлого 2016 года. В связи с этим мы укажем час, минуту и секунду, чтобы сравнивать моментом времени «31 декабря 2016 г 23:59:59».

ВЫБРАТЬ
АвансовыйОтчетПрисоединенныеФайлы.Ссылка
ИЗ
Справочник.АвансовыйОтчетПрисоединенныеФайлы КАК АвансовыйОтчетПрисоединенныеФайлы
ГДЕ
АвансовыйОтчетПрисоединенныеФайлы.Дата < ДАТАВРЕМЯ(2016, 12, 31, 23, 59, 59)

Пустая дата

Осуществить проверку переменной на то, содержит ли она в себе незаполненную дату проще всего обычным сравнением. В этом примере мы, используя запрос, выберем все поступления денежных средств на р/с, у которых не заполнена входящая дата.

ВЫБРАТЬ
ПоступлениеНаРасчетныйСчет.Ссылка
ИЗ
Документ.ПоступлениеНаРасчетныйСчет КАК ПоступлениеНаРасчетныйСчет
ГДЕ
ПоступлениеНаРасчетныйСчет.ДатаВходящегоДокумента = ДАТАВРЕМЯ(1, 1, 1)

В программе 1с 8-ой версии Дата это объект, который состоит из самой календарной даты и времени.

При программировании можно использовать следующие конструкции для оперирования временем:

Чтобы получить объект «Дата» существует несколько способов. Например, чтобы установить программно дату «30.12.2010 23:59:59»:

Док.Дата = ‘20101230235959’ ;
Док.Дата = Дата(«20101230235959»);
Док.Дата = Дата(2010,12,30,23,59,59);
Док.Дата = Дата(«2010-12-30 23:59:59»);

В запросах для получения даты используется метод «ДатаВремя»:

ДатаВремя(2010,12,30,23,59,59)

Пустая дата это нулевая секунда нулевого года, а т.к. отсчет идет от Рождества Христова, то и получается следующая запись:

ПустаяДата = Дата(0001,01,01,00,00,00);
//Причем секунды записывать не обязательно.
ПустаяДата = Дата(0001,01,01);

В запросе это будет выглядеть проще:

ДатаВремя(1,1,1)

Чтобы вычислить разницу дат нужно из большей даты вычесть меньшую, но при этом программа вернет разницу в секундах.
Разность дат:

РазностьВСекундах = Дата(«20101230235959») — Дата(«20081115035529»);//67 032 270

Поэтому надо исходить из того какой тип результата нас интересует. Например, если нас интересует только разница в днях, то можно написать так:

РазностьВСекундах = Дата(«20101230235959») — Дата(«20081115035529»);
РазностьВДнях = РазностьВСекундах/86400;

В случае если нужна полная разница(Лет, месяцев, дней) между датами то есть следующие варианты:
1. Алгоритм который первый приходит в голову, НЕ точный:

РазностьВСекундах = Дата(«20101230235959») — Дата(«20081115035529»);
РазностьВДнях = РазностьВСекундах/86400;
ПолнаяРазница = «Лет: » + Цел(РазностьВДнях/365) + » Месяцев: » + Цел((РазностьВДнях%365)/30) + » Дней: » + (РазностьВДнях%365)%30;

Ещё раз подчеркну, что предыдущий алгоритм приблизительный т.к. не учитывает точное количество дней в месяце.

2. Более точен следующий алгоритм описанный в типовой конфигурации, например, в ЗУП:

Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт
Лет = 0;
Месяцев = 0;
Дней = 0;
Если Дата1 > Дата2 Тогда
ВременнаяДата = Дата1;
Если День(ВременнаяДата) < День(Дата2) Тогда
Дней = (ВременнаяДата — ДобавитьМесяц(ВременнаяДата,-1))/86400;
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
КонецЕсли;
Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
Месяцев = 12;
КонецЕсли;
Лет = Макс( Год(ВременнаяДата) — Год(Дата2), 0);
Месяцев = Макс(Месяцев + Месяц(ВременнаяДата) — Месяц(Дата2), 0);
Дней = Макс(Дней + День(ВременнаяДата) — День(Дата2), 0);
// скорректируем отображаемое значение, если «вмешалось» разное количество дней в месяцах
Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
Дней = Дней + (День(КонецМесяца(Дата2)) — День(НачалоМесяца(Дата2))) — (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) — День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
КонецЕсли;
КонецЕсли;
КонецПроцедуры // РазобратьРазностьДат

Для запросов же можно использовать способ предложенный здесь: http://kb.mista.ru/article.php?id=664
Автор взял за основу предыдущую процедуру и перевел её на язык запросов так для вычисления года нужно записать следующее(я немного изменил запрос для наглядности):

|ВЫБОР
| КОГДА ГОД(ВЫБОР
| КОГДА МЕСЯЦ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ) < МЕСЯЦ(&ДатаНачала)

| ТОГДА ДОБАВИТЬКДАТЕ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ, МЕСЯЦ, -12)
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ
| КОНЕЦ) — ГОД(&ДатаНачала) > 0
| ТОГДА ГОД(ВЫБОР
| КОГДА МЕСЯЦ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ) < МЕСЯЦ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ, МЕСЯЦ, -12)
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ
| КОНЕЦ) — ГОД(&ДатаНачала)
| ИНАЧЕ 0
|КОНЕЦ

Для месяца:

|ВЫБОР
| КОГДА ВЫБОР
| КОГДА МЕСЯЦ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ) < МЕСЯЦ(&ДатаНачала)
| ТОГДА 12
| ИНАЧЕ 0
| КОНЕЦ + МЕСЯЦ(ВЫБОР
| КОГДА МЕСЯЦ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ) < МЕСЯЦ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ, МЕСЯЦ, -12)
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ
| КОНЕЦ) — МЕСЯЦ(&ДатаНачала) > 0
| ТОГДА ВЫБОР
| КОГДА МЕСЯЦ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ) < МЕСЯЦ(&ДатаНачала)
| ТОГДА 12
| ИНАЧЕ 0
| КОНЕЦ + МЕСЯЦ(ВЫБОР
| КОГДА МЕСЯЦ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ) < МЕСЯЦ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ, МЕСЯЦ, -12)
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ
| КОНЕЦ) — МЕСЯЦ(&ДатаНачала)
| ИНАЧЕ 0
|КОНЕЦ

Для дня:

|ВЫБОР
| КОГДА ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1), &ДатаОкончания, ДЕНЬ)
| ИНАЧЕ 0
| КОНЕЦ + ДЕНЬ(ВЫБОР
| КОГДА МЕСЯЦ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ) < МЕСЯЦ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ, МЕСЯЦ, -12)
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ
| КОНЕЦ) — ДЕНЬ(&ДатаНачала) > 0
| ТОГДА ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА РАЗНОСТЬДАТ(ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1), &ДатаОкончания, ДЕНЬ)
| ИНАЧЕ 0
| КОНЕЦ + ДЕНЬ(ВЫБОР
| КОГДА МЕСЯЦ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ) < МЕСЯЦ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ, МЕСЯЦ, -12)
| ИНАЧЕ ВЫБОР
| КОГДА ДЕНЬ(&ДатаОкончания) < ДЕНЬ(&ДатаНачала)
| ТОГДА ДОБАВИТЬКДАТЕ(&ДатаОкончания, МЕСЯЦ, -1)
| ИНАЧЕ &ДатаОкончания
| КОНЕЦ
| КОНЕЦ) — ДЕНЬ(&ДатаНачала)
| ИНАЧЕ 0
|КОНЕЦ

Время

Для получения значений времени используются следующие методы:

СекундаДаты = Секунда(Дата(«20081115035529»)); // 29
МинутаДаты = Минута(Дата(«20081115035529»)); // 55
ЧасДаты = Час(Дата(«20081115035529»)); // 3

В запросах для получения времени используются функции с такими же названиями:

Секунда(ДатаВремя(2008,11,15,03,55,29))
Минута(ДатаВремя(2008,11,15,03,55,29))
Час(ДатаВремя(2008,11,15,03,55,29))

«Дата» – это один из простых типов данных в 1С, который используется повсеместно. Переменная типа «Дата» имеет формат – год, месяц, день, час, минута, секунда. Таким образом, она содержит не только дату, но и время.

Иногда случаются ситуации, когда происходит запись в регистр значений очень большого объема информации, при этом последовательность их записи имеет значение. Тут важна более точная информация о времени записи. Начиная с версии 1С:Предприятие 8.2.17, была реализована возможность работы со временем в миллисекундах, используя функцию получения числа миллисекунд, прошедших с 1 января 0001 года, 0:00:00 UTC.

Синтаксис:

ТекущаяУниверсальнаяДатаВМиллисекундах()

Возвращаемое значение:

Тип: Число.

Описание:

Получается текущая универсальная дата в миллисекундах (в UTC, начиная с 01.01.0001 00:00:00).

Код 1C v 8.2 УП

ТекущаяУниверсальнаяДатаВМиллисекундах()

Например, нам требуется узнать время выполнения запроса с точностью до миллисекунд.

Запрос=Новый Запрос; Запрос.Текст=»…»; ДатаНачала=ТекущаяУниверсальнаяДатаВМиллисекундах(); Результат = Запрос.Выполнить(); ДатаОкончания=ТекущаяУниверсальнаяДатаВМиллисекундах(); ВремяВыполненияЗапроса = ДатаОкончания—ДатаНачала;

В старших версиях 1С переменная с типом «Дата» тоже содержала в своем значении миллисекунды, только это нигде не показывалось и не выделялось.

Код 1C v 8.х

ИсходнаяДата = ТекущаяДата(); //обычная текущая дата НоваяДата=ИсходнаяДата + 0.328; //прибавляем к текущей дате миллисекунды Миллисекунды = (НоваяДата — ИсходнаяДата) * 1000; //получаем миллисекунды из даты

В версиях 1С:Предприятие 7.7 тоже можно было реализовать такую возможность.

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

Создать переменную с типом дата можно несколькими способами:

Способ 1:

Присвоение переменной значения типа ‘ГГГГММДДччммсс’ или ‘ГГГГ.ММ.ДД:чч:чч:сс’

‘20100304235959’ — вернет дату 04.03.2010 23:59:59.

‘2011.10.09:22:10:12’ — вернет дату 09.10.2011 22:10:12.

Способ 2:

Использование функции глобального контекста Дата (Год, Месяц, День, час, минуты, секунды).

Дата(2010, 07, 14, 12, 13, 14) — вернет значение 14.07.2010 12:13:14

Этой же функцией можно преобразовать строку в дату.

Дата(20100714121314) — вернет значение 14.07.2010 12:13:14

Способ 3 (для запросов):

Использование выражения ДАТАВРЕМЯ (Год, Месяц, День, час, минута, секунда)

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

Дата (2010, 07, 14) — вернет значение 14.07.2010 0:00:00

Способ 4:

Еще можно попросить пользователя ввести нужную дату. Для этого необходимо воспользоваться функцией ВвестиДату(Дата, Подсказка, ЧастьДаты). Первый параметр задает переменную, которой будет присвоено введенное значение. Второй параметр — это заголовок диалогового окна, третий параметр определяет, какую часть типа дата необходимо ввести. Он может принимать следующие значения:

  • ЧастиДаты.Дата — будут введены только год, месяц и день;
  • ЧастиДаты.Время — будут введены только часы, минуты, секунды. В этом случае дата будет иметь вид 0001.01.01 чч:мм:сс.
  • ЧастиДаты.ДатаВремя — будут введены все составляющие даты и времени.

Способ 5 (получить текущую дату и время)

Дата=ТекущаяДата();

Проверка пустой даты

Часто бывает необходимо проверить, введена дата или нет. Пустая дата — это первое января 1 года, 0 часов, 0 минут, 0 секунд. Проверка может выглядеть следующим образом:

Если ПроверяемаяДата=Дата(1,1,1) Тогда
//действие при пустой дате
КонецЕсли;

Использование даты в реквизитах

В реквизитах справочников, документов и т.д. можно использовать:

  • дату, тогда время всегда равно 00:00:00;
  • только время, тогда дата равна 01.01.0001;
  • дату и время.

Получение отдельных составляющих даты

Получить год:

Результат=Год(Дата);

Получить месяц:

Результат=Месяц(Дата);

Получить номер дня в месяце:

Результат=День(Дата);

Получить номер дня в году:

Результат=ДеньГода(Дата);

Получить номер дня в неделе:

Результат=ДеньНедели(Дата);

Получить номер недели в году:

Результат=НеделяГода(Дата);

Получить час:

Результат=Час(Дата);

Получить минуту:

Результат=Минута(Дата);

Получить секунду:

Результат=Секунда(Дата);

Операции по преобразованию дат

Дата представляет собой количество секунд, прошедших с 1 января 0001 года 00:00:00. Поэтому, чтобы добавить к дате дни, часы, минуты и т.д., нужно прибавить соответствующее количество секунд.

Результат=Дата + 1; //Прибавили секунду
Результат=Дата + 2*60; //Прибавили 2 минуты
Результат=Дата + 3*60*60*24; //Прибавили 3 дня

Прибавить или отнять от даты один или несколько месяцев:

Результат=ДобавитьМесяц(Дата, 2); //Добавляет к дате 2 месяца
Результат=ДобавитьМесяц(Дата, -2) //Отнимает от даты 2 месяца

Получить конец или начало периода:

Результат=НачалоКвартала(Дата); // Возвращает дату начала квартала, время 00:00:00
Результат=КонецКвартала(Дата); //Возвращает дату конца квартала, время 23:59:59
Результат=НачалоМесяца(Дата); // Возвращает дату начала месяца, время 00:00:00
Результат=КонецМесяца(Дата); //Возвращает дату конца месяца, время 23:59:59
Результат=НачалоНедели(Дата); // Возвращает дату начала недели, время 00:00:00
Результат=КонецНедели(Дата); //Возвращает дату конца недели, время 23:59:59
Результат=НачалоДня(Дата); // Дата остается прежней, время 00:00:00
Результат=КонецДня(Дата); // Дата остается прежней, время 23:59:59
Результат=НачалоЧаса(Дата); //Дата и час остаются прежними, минуты и секунды 00:00
Результат=КонецЧаса(Дата); //Дата и час остаются прежними, минуты и секунды 59:59
Результат=НачалоМинуты(Дата); //Дата, час и минута остаются прежними, секунды 00
Результат=КонецМинуты(Дата); //Дата, час и минута остаются прежними, секунды 59

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *