Как сравнить даты в 1с
При работе с датами 1С, типовой порядок частей даты – год, месяц, день, час, минуты, секунды. При этом часы, минуты, секунды можно пропустить.
При создании даты из строки («приведение к дате») можно указать в локализованном формате (день.месяц.год часы:минуты:секунды), но только полностью.
Например:
//Работа с датами 1С — преобразовать дату в 1С из частей — год, месяц, день (плюс необязательно время)
Дата = Дата(2012,10,30); //без времени
Дата = Дата(2012,10,30,12,00,00); //со временем
//Работа с датами 1С — преобразовать дату в 1С из строки, разные способы
Дата = Дата(«20121030»); //год, месяц, день
Дата = Дата(«30.10.2012 12:00:00»); //локализованный формат, только полностью
//Работа с датами 1С — указание значения даты без приведения, напрямую
Дата = ‘20121030’; //без времени
Дата = ‘20121030120000’; //со временем
Работа с датами 1С — Пустая дата 1С
Чтобы проверить дату 1С на заполненность – ее сравнивают с «пустой датой». При наличии в справочнике/документе реквизита с типом дата, если пользователь не заполнил это поле, то ее значение также будет – «пустая дата».
«Пустая дата» — это 01.01.0001 00:00:00.
Например:
ПустаяДата = ‘00010101000000’;
Если НужнаяДата = ‘00010101000000’ Тогда
Сообщить(«Вы не заполнили очень нужную дату»);
КонецЕсли;
Работа с датами 1С — Дата в реквизитах (справочников, документов и т.п.)
При указании типа реквизита можно указать использовать:
- Только дату (время тогда всегда равно 00:00:00)
- Только время (дата тогда всегда равна 01.01.0001)
- Дату и время
Для получения даты и времени используется функция 1С ТекущаяДата().
Очень важно место – где вызывается эта функция – на клиенте или на сервере. Подробнее см. тему «Режим исполнения/Исполнение». Часто бывает, что на клиентских машинах время немного разное, поэтому стараются везде использовать серверное время – даже если оно установлено на сервере не верно, то хотя бы у всех клиентов будет одинаковое неверное время.
Для того, чтобы получить серверную дату (дату, установленную в операционной системе компьютера сервера), обычно в конфигурации создают общий модуль с установленной галочкой «Сервер» в свойствах, и в нем создают функцию
//функция расположена в общем модуле, например с именем СерверныеФункции
//в свойствах общего модуля установлена галочка «Сервер» и не установлена галочка «Клиент»
Функция ПолучитьДатуСервера() Экспорт
Возврат ТекущаяДата();
КонецФункции
//вызов этой функции для использования из другого модуля выглядит так
ДокументОбъект.Дата = СерверныеФункции.ПолучитьДатуСервера(); //ИмяМодуля.ИмяФункции()
Также в тонком клиенте непосредственно у функций модулей указывается где она будет исполнена:
Начало и конец дня
- дата начала дня выглядит так «30.10.2012 00:00:00»
- дата конца дня выглядит так «30.10.2012 23:59:59»
Используется в отчетах и запросах, требующих получить данные за период – день, месяц, год.
Так например период с «01.01.2012 00:00:00» по «31.01.2012 00:00:00» неверен, так как не включает в себя один день месяца (но включает в себя одну секунду последнего дня месяца).
Работа с датами 1С — Сравнение дат
Дата содержит дату и время. При сравнении дат (без учета времени) их обычно приводят к началу дня (месяца, года).
Например:
Дата1 = Дата(«30.10.2012 12:00:00»);
Если НачалоДня(Дата1) = НачалоДня(ДокументСсылка.Дата) Тогда
Сообщить(«Документ введен заданной датой»);
КонецЕсли;
На всякий случай, пример сравнения даты в периоде:
Если ДокументСсылка.Дата >= НачалоМесяца(ТекущаяДата()) и
ДокументСсылка.Дата
Работа с датами 1С — Изменение даты
Дата является числом секунд. Если мы хотим не просто узнать – больше ли одна дата другой – но и на сколько больше, то получаем разницу в секундах.
Например:
СНачалаДня = ТекущаяДата() – НачалоДня(ТекущаяДата());
Сообщить(«С начала дня прошло » + Строка(СНачалаДня) + » секунд»);
Сообщить(«С начала дня прошло » + Строка(СНачалаДня/60) + » минут»);
Сообщить(«С начала дня прошло » + Строка(СНачалаДня/60/60) + » часов»);
Также мы можем изменить дату, при изменении мы добавляем или отнимаем количество секунд:
НачалоЭтогоДня = НачалоДня(ТекущаяДата());
НачалоПредыдущегоДня = НачалоДня(НачалоЭтогоДня – 1); //убираем секунду – делая «вчера» и берем начало дня у «вчера»
НачалоПредыдущегоДня = НачалоЭтогоДня – 24*60*60; //другой способ – отнимаем 24 часа – 24(часа)*60(получились минуты)*60(секунды)
Работа с датами 1С — Момент времени
Момент времени – это расширенное представление даты, применимое к документам (и соответственно регистрам).
Оно требуется для сравнения времени документов, если дата и время документов одно и то же. Соответственно его можно использовать при отборах в запросах.
Момент времени можно получить у документа следующими способами:
//способ 1
МоментВремениДокумента = ДокументСсылка.МоментВремени();
Также можно сравнить момент времени с датой/временем:
МоментВремениЭталон = Новый МоментВремени( НачалоДня(ТекущаяДата()) );
Если ДокументСсылка.МоментВремени().Сравнить( МоментВремениЭталон ) = -1 Тогда
Сообщить(«Документ введен раньше, чем сегодня»);
КонецЕсли;
//Если документ введен сегодняшней датой в 00:00:00, то он все равно введен — сегодня
Работа с датами 1С — Форматирование дат
Форматирование дат (перевод значения даты в строковое представление с учетом локализации, для вывода пользователю) подробнее в статье про форматирование в 1С.
Тип Дата в языке 1С 8 – примеры работы
Тип Дата широко используется при разработке в 1С Предприятие 8, и любому разработчику 1С так или иначе приходится сталкиваться с этим типом. Ниже рассмотрены основные примеры и приемы работы с датами в 1С средствами встроенного языка.
Инициализация переменной с типом Дата
Дату можно инициализировать при помощи литералов встроенного языка, а также при помощи функции-конструктора. Минимально необходимыми при указании даты являются год, месяц и день. Часы, минуты и секунды можно не указывать.
При работе средствами встроенного языка, дата поддерживает точность до 0,1 миллисекунды.
К сожалению, ни в запросах, ни при помещении в базу данных, эта точность не сохраняется.
Функции для получения текущей даты
Получить часть даты в виде числа
Платформа 1С позволяет получить нужную часть даты – например, получить год, месяц или день. Это можно использовать для повторного конструирования новой даты из частей.
Операции над датами в 1С 8
Получить начало и конец некоторого периода по дате
Функции имеют название вида [Начало/Конец][Года/Квартала/Месяца/Недели/Дня/Часа/Минуты]Например НачалоГода, КонецГода, НачалоЧаса, КонецЧаса и т.д.
Несмотря на то, что тип Дата в 1С не поддерживает периоды Неделя и Квартал, у них также есть возможность получить начало и конец периода, так как они имеют значимое прикладное значение (при автоматизации расчета зарплаты, начислении налогов и т.п.)
Работа с датами в 1С 8.2 и 8.3
Дата — это один из примитивных типов данных существующих в 1С. Также как числа и строки используется абсолютно повсеместно, и следовательно знание основных функций и принципов работы с типом “Дата” приобретают просто драматическую важность.
В начале скажем, что значение типа дата в 1С содержит точную (с точностью до 0,1 миллисекунды) дату григорианского календаря.
Типовой порядок частей даты принятый в 1С — год, месяц, день, час, минута, секунда.
Собственно простейший способ создания новой переменной типа дата является приравнивание к переменной строки цифр в одинарных кавычках (обязательно) вида ‘ГГГГММДДччммсс’ где:
- ГГГГ — четыре цифры года (включая тысячелетие и век);
- ММ — две цифры месяца;
- ДД — две цифры даты;
- чч — две цифры часа (в 24-х часовом формате);
- мм — две цифры минут;
- сс — две цифры секунд.
Часы, минуты и секунды можно не указывать, при этом они приравниваются к нулю.
Функции с датами в запросе 1С 8.3
Когда мы, разработчики 1С, только начинаем свой путь на этой тропе, нам приходится сложно с запросами, так как мы практически не понимаем этот язык. Но со временем, мы в этом всем разбираемся и становимся хорошими специалистами.
В самом начале пути, большие сложности у нас вызывают запросы, где необходимо сделать определенные действия над датой в запросе 1С 8.3. В языке запросов есть много функций, которые помогают нам выполнять разные действия с датой.
1. ДобавитьКДате
Сегодня опишу некоторые из них. Для начала возьмем одну из простейших функций «ДобавитьКДате()». Это очень легкая функция.
Когда, в запросе мы добавляем или изменяем поле и выбираем эту функцию, то она появляется перед нам в таком вот виде:
Давайте разберем каждый из параметров функции 1С. А именно параметр 1С «Дата». Как все поняли, этот параметр именно и есть наша дата, к которой необходимо добавить какую-то дату.
Следующий, по плану, параметр у нас «Тип». Он отвечает, за то, какой именно тип увеличения даты будет. У него строго определенное количество типов, а именно:
При выборе необходимого параметра типа, на этот тип и увеличится наша дата. Например, мы выбрали тип «День», указали количество дней, которое необходимо добавить(об этом далее) и в результате получили, что к нашей дате добавилось указанное количество дней.
Итак, последний параметр «Количество». Этот параметр отвечает за количество, на которое будет увеличено дату. В зависимости от условий, оно может быть положительным или отрицательным. Если число отрицательное, то от нашей даты, будет отнято определенное количество показателей данных.
Все предельно просто и легко, но все равно стоит быть аккуратным с функциями.
2. НАЧАЛОПЕРИОДА
Следующая функция, с которой я хотел бы Вас познакомить, это НАЧАЛОПЕРИОДА().
При использовании она имеет вот такой вот вид:
Рассмотрим оба параметра этой функции. По первому все предельно ясно, это наша дата. Второй параметр, «Период», имеет такой же определенный функционал, как и второй параметр функции 1С ДОБАВИТЬКДАТЕ() и имеет такой же перечень вариантов периода.
Эта функция удобна тем, что можно привести Вашу дату к любому начальному периоду из выбранных вариантов и осуществить выборку данных за этот период.
3. КОНЕЦПЕРИОДА
Аналогичная функция, которая отвечает за приравнивание, к концу периода есть и имеет она такую форму:
У нее такие же самые параметры, как и у предыдущей описанной функции и потому смысла более подробно расписывать нет.
4. РАЗНОСТЬДАТ
И последняя функция, о которой я хотел бы рассказать, это РАЗНОСТЬДАТ().
Если Вам необходимо сравнить две даты и вывести количественную разницу этих дат, то Вам необходима именно эта функция.
При использовании она имеет такой формат:
Итак, по параметрам, все предельно ясно, «Дата1» — это дата от которой мы будем отнимать второй параметр, а именно «Дата2». В каком именно варианте периода будет рассчитываться, нам поможет последний параметр «Тип». У него такие же критерии и варианты выбора как я описал выше.
Если, к примеру, Вы захотите узнать разность дат 1С по дням, то эта функция вернет число, которое будет соответствовать количеству дней разницы между этими двумя датами.
В том случае, если первая дата, будет меньше второй, то вернется отрицательное значение разности. Это надо запомнить.
При работе с датами 1С старайтесь, чаще пользоваться функциями, которые есть у нас в языке запросов 1С 8.3. После первого примера использования функций, понимаешь, что с существованием этих инструментов, программировать становится легче.