1с сравнение дат в коде
1с сравнение дат в коде
Вступайте в мою группу помощник программиста.
В ней мы обсуждаем программирование в 1С.
Дата
Значения данного типа содержит дату григорианского календаря (с 01 января 0001 года) и время с точностью до 0,1 миллисекунды.
Литералы:
Строка цифр, заключенная в одинарные кавычки вида: ‘ГГГГММДДччммсс’, где:
Во встроенном языке в литерале типа Дата обязательно должно задаваться значение года, месяца и дня. Для задания даты соответствующей началу отсчета достаточно указать ‘00010101’. Допускается при указании литералов типа Дата опускать последние символы (секунды, минуты, часы и т.д.). Это означает, что данные параметры будут равны нулю (для времени) или единице (для даты). В литерале даты допускается использование различных разделителей.
Работа с типом Дата в языке 1С 8.3, 8.2 (в примерах)
С уважением, Владимир Милькин (преподаватель школы 1С программистов и разработчик обновлятора).
Подписывайтесь и получайте новые статьи и обработки на почту (не чаще 1 раза в неделю). |
Вступайте в мою группу ВКонтакте, Одноклассниках, Facebook или Google+ — самые последние обработки, исправления ошибок в 1С, всё выкладываю там в первую очередь.
Как помочь сайту: расскажите (кнопки поделиться ниже) о нём своим друзьям и коллегам. Сделайте это один раз и вы внесете существенный вклад в развитие сайта. На сайте нет рекламы, но чем больше людей им пользуются, тем больше сил у меня для его поддержки.
Нажмите одну из кнопок, чтобы поделиться:
1с сравнение дат в коде
При работе с датами 1С, типовой порядок частей даты – год, месяц, день, час, минуты, секунды. При этом часы, минуты, секунды можно пропустить.
При создании даты из строки («приведение к дате») можно указать в локализованном формате (день.месяц.год часы:минуты:секунды), но только полностью.
Работа с датами 1С — Пустая дата 1С
Чтобы проверить дату 1С на заполненность – ее сравнивают с «пустой датой». При наличии в справочнике/документе реквизита с типом дата, если пользователь не заполнил это поле, то ее значение также будет – «пустая дата».
«Пустая дата» — это 01.01.0001 00:00:00.
Например:
ПустаяДата = ‘00010101000000’;
Если НужнаяДата = ‘00010101000000’ Тогда
Сообщить(«Вы не заполнили очень нужную дату»);
КонецЕсли;
Работа с датами 1С — Дата в реквизитах (справочников, документов и т.п.)
При указании типа реквизита можно указать использовать:
Для получения даты и времени используется функция 1С ТекущаяДата().
Очень важно место – где вызывается эта функция – на клиенте или на сервере. Подробнее см. тему «Режим исполнения/Исполнение». Часто бывает, что на клиентских машинах время немного разное, поэтому стараются везде использовать серверное время – даже если оно установлено на сервере не верно, то хотя бы у всех клиентов будет одинаковое неверное время.
Для того, чтобы получить серверную дату (дату, установленную в операционной системе компьютера сервера), обычно в конфигурации создают общий модуль с установленной галочкой «Сервер» в свойствах, и в нем создают функцию
//функция расположена в общем модуле, например с именем СерверныеФункции
//в свойствах общего модуля установлена галочка «Сервер» и не установлена галочка «Клиент»
Функция ПолучитьДатуСервера() Экспорт
Возврат ТекущаяДата();
КонецФункции
//вызов этой функции для использования из другого модуля выглядит так
ДокументОбъект.Дата = СерверныеФункции.ПолучитьДатуСервера(); //ИмяМодуля.ИмяФункции()
Также в тонком клиенте непосредственно у функций модулей указывается где она будет исполнена:
Начало и конец дня
Используется в отчетах и запросах, требующих получить данные за период – день, месяц, год.
Так например период с «01.01.2012 00:00:00» по «31.01.2012 00:00:00» неверен, так как не включает в себя один день месяца (но включает в себя одну секунду последнего дня месяца).
Работа с датами 1С — Сравнение дат
Дата содержит дату и время. При сравнении дат (без учета времени) их обычно приводят к началу дня (месяца, года).
Например:
Дата1 = Дата(«30.10.2012 12:00:00»);
Если НачалоДня(Дата1) = НачалоДня(ДокументСсылка.Дата) Тогда
Сообщить(«Документ введен заданной датой»);
КонецЕсли;
На всякий случай, пример сравнения даты в периоде:
Если ДокументСсылка.Дата >= НачалоМесяца(ТекущаяДата()) и
ДокументСсылка.Дата
Дата является числом секунд. Если мы хотим не просто узнать – больше ли одна дата другой – но и на сколько больше, то получаем разницу в секундах.
Например:
СНачалаДня = ТекущаяДата() – НачалоДня(ТекущаяДата());
Сообщить(«С начала дня прошло » + Строка(СНачалаДня) + » секунд»);
Сообщить(«С начала дня прошло » + Строка(СНачалаДня/60) + » минут»);
Сообщить(«С начала дня прошло » + Строка(СНачалаДня/60/60) + » часов»);
Также мы можем изменить дату, при изменении мы добавляем или отнимаем количество секунд:
НачалоЭтогоДня = НачалоДня(ТекущаяДата());
НачалоПредыдущегоДня = НачалоДня(НачалоЭтогоДня – 1); //убираем секунду – делая «вчера» и берем начало дня у «вчера»
НачалоПредыдущегоДня = НачалоЭтогоДня – 24*60*60; //другой способ – отнимаем 24 часа – 24(часа)*60(получились минуты)*60(секунды)
Момент времени – это расширенное представление даты, применимое к документам (и соответственно регистрам).
Оно требуется для сравнения времени документов, если дата и время документов одно и то же. Соответственно его можно использовать при отборах в запросах.
Момент времени можно получить у документа следующими способами:
//способ 1
МоментВремениДокумента = ДокументСсылка.МоментВремени();
Форматирование дат (перевод значения даты в строковое представление с учетом локализации, для вывода пользователю) подробнее в статье про форматирование в 1С.
Работа с датами в 1С
Дата в 1С один из примитивных типов данных в системе. Дата всегда имеет формат год, месяц, день, час, минута, секунда. Таким образом, переменная типа дата содержит не только дату, но и время.
Очевидно, что очень часто программистам приходится работать с датой и временем и естественно, по мере работы возникают вопросы, ответы на которые приходится где то искать. Я накидал для себя небольшую шпаргалку по работе с датами.
Хранение дат в системе
В базе данных даты хранятся с точностью до секунд. Для реквизитов типа «дата» можно установить вариант хранения «дата и время», «только дата», «только время».
Переменные типа «дата» всегда представляют дату с секундами. Отсчет дат ведется с Рождества Христова (наша эра), т.е. с 01.01.0001 00:00:00 по Григорианскому календарю. Начальная дата — это не совсем дата. Это значение в системе используется для представления «пустой даты» (аналог пустой ссылки для ссылочных типов или пустой строки «» для строкового типа).
Максимальная дата — 31.12.3999 23:59:59
Как получить текущую дату и время?
Как явно указать нужную дату?
Пустая дата в 1С
Как соединить дату и время?
Как сложить две даты
Как вычислить количество дней между двумя датами
Если у вас есть еще какие то интересные заметки — пиши в комментариях, с радостью добавлю в эту статью.
Как добавить к дате секунду, минуту, час, день
Дата представляет собой количество секунд, прошедших с 1 января 0001 года 00:00:00. Поэтому, чтобы добавить к дате дни, часы, минуты и т.д., нужно прибавить соответствующее количество секунд:
Функции языка запросов 1С. Работа с датами
Функции работы с датами
Дата — один из примитивных типов данных в системе 1С:Предприятие. Дата всегда имеет формат год, месяц, день, час, минута, секунда. Таким образом, переменная типа дата содержит не только дату, но и время.
Одной из первых моих статей в этой рубрике была небольшая шпаргалка по работе с датами, но о датах в запросах там было написано очень мало. В запросах 1С с датами приходится работать довольно часто, особенно когда запрос строится к объектам метаданных в которых содержится периодическая информация. Как правило это регистры (сведений, накопления, расчета, бухгалтерии).
Функция Год
Функция Квартал
Возвращает номер квартала даты (целочисленное значение от 1 до 4)
Предположим, в ЗаказПокупателя передаем заказ №100 от 12.03.2016, в этом случае наш запрос вернет НомерКвартала = 1
Функция Месяц
Принимает параметр типа ДАТА. Возвращает номер месяца даты (целочисленное значение от 1 до 12).
Функция ДеньГода
Принимает параметр типа ДАТА. Возвращает номер дня в году (целочисленное значение от 1 до 366).
Запрос вернет — 175
Функция День
Принимает параметр типа ДАТА. Возвращает номер дня в месяце (целочисленное значение от 1 до 31).
Функция Неделя
Принимает параметр типа ДАТА. Возвращает номер недели в году.
Функция ДеньНедели
Принимает параметр типа ДАТА. Возвращает номер дня недели (целочисленной значение от 1 (понедельник) до 7 (воскресенье)).
Функция Час
Принимает параметр типа ДАТА. Возвращает час суток (целочисленное значение от 0 до 23).
Функция Минута
Принимает параметр типа ДАТА. Возвращает минуты часа (целочисленное значение от 0 до 59).
Функция Секунда
Принимает параметр типа ДАТА. Возвращает секунды минуты (целочисленное значение от 0 до 59).
Функция НачалоПериода
Функция возвращает для указанной даты начало периода в который она входит. Период может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ
Запрос вернет – 01.06.2016
Функция КонецПериода
Функция возвращает для указанной даты конец периода в который она входит. Период может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ
Запрос вернет – 30.06.2016
Функция ДобавитьКДате
Функция добавляет к дате указанное количество временных интервалов.
Получаем дату 15.10.2016 0:00:00 Очень удобно, что не приходится задумываться о количестве дней в месяцах.
Количество может быть и отрицательным. Тогда отсчет интервала производится в обратную сторону.
Функция РазностьДат
Функция рассчитывает календарную разницу между двумя датами и ее нельзя использовать в местах, где необходимо рассчитать банковских или рабочих дней. Тип может принимать следующие значения: МИНУТА, ЧАС, ДЕНЬ, НЕДЕЛЯ, МЕСЯЦ, КВАРТАЛ, ГОД, ДЕКАДА, ПОЛУГОДИЕ
Функции для работы с датой в 1С
Получение частей даты
С помощью функций Год, Месяц, День, Час, Минута, Секунда из даты можно получить какую-либо ее часть:
День года и день недели
Функция День возвращает порядковый номер в месяце. То есть для 3 июня это будет 3. Функция ДеньГода вернет порядковый номер дня в году:
Для определения дня недели есть функция ДеньНедели, которая возвращает порядковый номер дня недели:
Начало и конец периода
Чтобы привести дату к началу определенного периода можно использовать функции НачалоМинуты, НачалоЧаса, НачалоДня, НачалоНедели, НачалоМесяца, НачалоКвартала, НачалоГода:
С помощью функций КонецМинуты, КонецЧаса, КонецДня, КонецНедели, КонецМесяца, КонецКвартала, КонецГода можно получить конец определенного периода:
Арифметические операции с датами
К дате можно прибавлять количество секунд, можно вычесть из одной даты другую, чтобы получить разность в секундах. Чтобы к одной дате прибавить или вычесть месяц можно использовать функцию ДобавитьМесяц:
Текущая дата
Функция ТекущаяДата возвращает системную дату компьютера. Может использоваться как на сервере, так и на клиенте. Причем если сервер и клиент это разные компьютеры и дата или время на них не совпадает, то данная функция вернет разные значения:
Часовые пояса
1С позволяет работать в одной информационной базе из разных часовых поясов. Часовой пояс может быть определен для:
Если часовой пояс не задан для сеанса, то используется часовой пояс информационной базы. Если для информационной базы часовой пояс тоже не задан, то используется часовой пояс сервера.
Часовой пояс информационной базы сохраняется в базе данных, часовой пояс сеанса должен устанавливаться при начале каждого сеанса.
Для установки часового пояса сеанса используется функция УстановитьЧасовойПоясСеанса. Чтобы получить текущее значение часового пояса сеанса предназначена функция ЧасовойПоясСеанса:
Для работы с часовым поясом информационной базы предназначены функции УстановитьЧасовойПоясИнформационнойБазы и ПолучитьЧасовойПоясИнформационнойБазы. Изменение часового пояса информационной базы возможно только в монопольном режиме. Чтобы изменение часового пояса информационной базы вступило в силу нужно перезайти в базу.
Чтобы получить часовой пояс сервера нужно использовать функцию ЧасовойПояс:
На сервере для получения текущей даты и времени нужно использовать функцию ТекущаяДатаСеанса. Данная функция получает дату и время с учетом часового пояса. То есть если сервер физически установлен в часовом поясе «Europe/Moscow», а подключение к нему выполняется из часового пояса «Asia/Krasnoyarsk», то функция ТекущаяДата вернет дату и время сервера, что не будет корректным. А если при старте сеанса в Красноярке установить часовой пояс «Asia/Krasnoyarsk», то функция ТекущаяДатаСеанса приведет время к часовому поясу сеанса пользователя.
Чтобы узнать все возможные часовые пояса можно воспользоваться функцией ПолучитьДопустимыеЧасовыеПояса. Данная функция вернет массив со всеми возможными часовыми поясами:
С помощью функции ПредставлениеЧасовогоПояса можно получить представление часового пояса:
Универсальная дата
С помощью функции ТекущаяУниверсальнаяДата можно получить дату и время UTC. С помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах можно получить количество миллисекунд, начиная с 01.01.0001 года:
С помощью функции ТекущаяУниверсальнаяДатаВМиллисекундах можно получить замер времени в миллисекундах:
Также есть функции МестноеВремя и УниверсальноеВремя, которые позволяют получить местное время из универсального и универсальное время из местного:
Сравнение функций
Для сравнения функций работы с часовыми поясами представим, что есть информационная база, которая физически находится в Москве. Для данной базы методом УстановитьЧасовойПоясИнформационнойБазы был установлен часовой пояс «Europe/Moscow». А также есть пользователи из Красноярска, которые тоже работают с этой информационной базой. Для них при старте системы, в модуле сеанса устанавливается часовой пояс «Asia/Krasnoyarsk» с помощью метода УстановитьЧасовойПоясСеанса. Результаты представлены в таблице, вызовы всех функций были выполнены на сервере: