Дата — это один из примитивных типов данных существующих в 1С. Также как числа и строки используется абсолютно повсеместно, и следовательно знание основных функций и принципов работы с типом “Дата” приобретают просто драматическую важность.
- Функции работы с датами
- Дата
- ТекущаяДата
- ТекущаяУниверсальнаяДатаВМиллисекундах
- Год, Месяц, День, Час, Минута, Секунда
- Начало…
- Конец…
- НеделяГода, ДеньГода
- ДеньНедели
- ДобавитьМесяц
- МоментВремени
- ВвестиДату
- Типовые задачи представления данных
- Разность даты в днях, количество дней между датами
- Разница между датами в месяцах, количество месяцев между датами
- Прибавить день к дате, вычесть день из даты, отнять от даты день
- Прибавить месяц к дате, вычесть месяц из даты, отнять месяц от даты
- День недели по дате
- Сравнение дат
- Дата равна нулю (проверка на заполненность), проверка на пустую дату
В начале скажем, что значение типа дата в 1С содержит точную (с точностью до 0,1 миллисекунды) дату григорианского календаря.
Типовой порядок частей даты принятый в 1С — год, месяц, день, час, минута, секунда.
Собственно простейший способ создания новой переменной типа дата является приравнивание к переменной строки цифр в одинарных кавычках (обязательно) вида ‘ГГГГММДДччммсс’ где:
- ГГГГ — четыре цифры года (включая тысячелетие и век);
- ММ — две цифры месяца;
- ДД — две цифры даты;
- чч — две цифры часа (в 24-х часовом формате);
- мм — две цифры минут;
- сс — две цифры секунд.
Часы, минуты и секунды можно не указывать, при этом они приравниваются к нулю.
1 2 3 4 5 | &НаКлиенте Процедура ТестДата(Команда) Сообщить('20170101101010'); //01.01.2017 10:10:10 Сообщить('20170101'); //01.01.2017 0:00:00 КонецПроцедуры |
Функции работы с датами
Дата
Функция Дата() служит для создания значения типа “Дата”. Использовать ее можно двумя способами:
- Дата(x) — где параметр “x” это строка вида “ГГГГММДДччммсс”, часы, минуты и секунды можно опустить, т.е. преобразуем строку в дату;
- Дата(x, y, z, w, v, c) — в этом случае параметры “x”, “y”, “z”, “w”, “v” и “c” являются числами и означают год, месяц, день, час, минуту и секунду соответственно. Как и в предыдущем случае час, минуту и секунду можно опустить.
1 2 3 4 5 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(Дата("20170101101010")); //01.01.2017 10:10:10 Сообщить(Дата(2017,1,1)); //01.01.2017 0:00:00 КонецПроцедуры |
ТекущаяДата
Функция ТекущаяДата() просто возвращает текущую дату того компьютера на котором она исполняется. В клиент-серверных системах будет разумно инкапсулировать эту функцию в общем модуле (с исполнением на сервере) и использовать ее только таким образом.
1 2 3 4 | &НаСервере Функция ДатаНаСервере(Команда) Возврат ТекущаяДата(); КонецФункции |
ТекущаяУниверсальнаяДатаВМиллисекундах
Функция ТекущаяУниверсальнаяДатаВМиллисекундах() позволяет узнать дату в миллисекундах. Данная функция доступна начиная с версии платформы 8.2.17. Замечание о клиент-серверных системах из функции выше справедливо и для этой функции.
1 2 3 4 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах()); //63 628 364 816 246 КонецПроцедуры |
Год, Месяц, День, Час, Минута, Секунда
Функции Год(x), Месяц(x), День(x), Час(x), Минута(x) и Секунда(x) возвращают соответствующую часть переданной им даты “x” в виде числа.
1 2 3 4 5 6 7 8 9 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(Год('20170102030405')); //2017 Сообщить(Месяц('20170102030405')); //1 Сообщить(День('20170102030405')); //2 Сообщить(Час('20170102030405')); //3 Сообщить(Минута('20170102030405')); //4 Сообщить(Секунда('20170102030405')); //5 КонецПроцедуры |
Начало…
Функции вида “Начало…(x)” получают дату в параметре “x” и возвращают дату начала периода времени в соответствии с названием конкретной функции. Существуют следующие функции:
- НачалоГода;
- НачалоКвартала;
- НачалоМесяца;
- НачалоНедели;
- НачалоДня;
- НачалоЧаса;
- НачалоМинуты.
1 2 3 4 5 6 7 8 9 10 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(НачалоГода('20170410151515')); //01.01.2017 0:00:00 Сообщить(НачалоКвартала('20170410151515')); //01.04.2017 0:00:00 Сообщить(НачалоМесяца('20170410151515')); //01.04.2017 0:00:00 Сообщить(НачалоНедели('20170410151515')); //10.04.2017 0:00:00 Сообщить(НачалоДня('20170410151515')); //10.04.2017 0:00:00 Сообщить(НачалоЧаса('20170410151515')); //10.04.2017 15:00:00 Сообщить(НачалоМинуты('20170410151515')); //10.04.2017 15:15:00 КонецПроцедуры |
Конец…
Функции вида “Конец…(x)” получают дату в параметре “x” и возвращают дату окончания периода времени в соответствии с названием конкретной функции. Существуют следующие функции:
- КонецГода;
- КонецКвартала;
- КонецМесяца;
- КонецНедели;
- КонецДня;
- КонецЧаса;
- КонецМинуты.
1 2 3 4 5 6 7 8 9 10 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(КонецГода('20170410151515')); //31.12.2017 23:59:59 Сообщить(КонецКвартала('20170410151515')); //30.06.2017 23:59:59 Сообщить(КонецМесяца('20170410151515')); //30.04.2017 23:59:59 Сообщить(КонецНедели('20170410151515')); //16.04.2017 23:59:59 Сообщить(КонецДня('20170410151515')); //10.04.2017 23:59:59 Сообщить(КонецЧаса('20170410151515')); //10.04.2017 15:59:59 Сообщить(КонецМинуты('20170410151515')); //10.04.2017 15:15:59 КонецПроцедуры |
НеделяГода, ДеньГода
Функции НеделяГода(x) И ДеньГода(x) возвращают соответственно номер недели и номер дня в году для указанной даты “x”.
1 2 3 4 5 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(НеделяГода('20170410')); //16 Сообщить(ДеньГода('20170410')); //100 КонецПроцедуры |
ДеньНедели
Функция ДеньНедели(x) возвращает номер дня недели для указанной даты “x”.
1 2 3 4 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(ДеньНедели('20170410')); //1 КонецПроцедуры |
ДобавитьМесяц
Функция ДобавитьМесяц(x, y) добавляет к дате “x” количество месяцев “y”, которое может быть отрицательным, в этом случае происходит вычитание месяцев из даты “x”.
1 2 3 4 5 6 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(ДобавитьМесяц('20170331', -1)); //28.02.2017 0:00:00 Сообщить(ДобавитьМесяц('20170228', 2)); //28.04.2017 0:00:00 Сообщить(ДобавитьМесяц('20170516', -3)); //16.02.2017 0:00:00 КонецПроцедуры |
МоментВремени
МоментВремени это объект который является совокупностью даты и ссылки на какой-либо объект информационной базы. МоментВремени используется в качестве значения свойств или параметров методов других объектов, имеющих тип МоментВремени. Нужен в первую очередь для того, чтобы иметь возможность различать моменты времени для объектов имеющих одинаковую дату создания.
1 2 3 4 5 6 7 8 | &НаКлиенте Процедура ТестДата(Команда) МоментВремени1 = Новый МоментВремени('20161231235959', ТекущийДокумент); МоментВремени2 = ТекущийДокумент.МоментВремени(); Если МоментВремени1.Сравнить(МоментВремени2) = 0 Тогда КонецЕсли; КонецПроцедуры |
ВвестиДату
Функция ВвестиДату(x, y, z) вызывает диалог для ввода даты, введенная дата записывается в переменную “x”, кроме этого можно указать подсказку “y”, а также какую часть даты нужно ввести “z” Функция возвращает Истина — если ввод был произведен, Ложь — если пользователь отказался от ввода.
1 2 3 4 5 | &НаКлиенте Процедура ТестДата(Команда) Д = '00010101'; ВвестиДату(Д, "Введите дату", ЧастиДаты.ДатаВремя); КонецПроцедуры |
Выглядит это окно примерно так:
Типовые задачи представления данных
Разность даты в днях, количество дней между датами
Простым вычитанием одной даты из другой мы можем получить разность между датами в секундах, следовательно получение любого другого типа разности (в минутах, днях и тд.) является простой арифметической операцией:
1 2 3 4 5 6 7 8 | &НаКлиенте Процедура ТестДата(Команда) Д1 = '20170213'; Д2 = '20170425'; РазностьВСекундах = Д2 - Д1; РазностьВДнях = Цел(РазностьВСекундах/86400); КонецПроцедуры |
Кроме этого можно воспользоваться функцией «РАЗНОСТЬДАТ» из языка запросов:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | &НаКлиенте Процедура ТестДата(Команда) Д1 = '20170213'; Д2 = '20170425'; Сообщить(РазностьДатНаСервере(Д1, Д2, "ДЕНЬ")); //71 КонецПроцедуры &НаСервере Функция РазностьДатНаСервере(ДатаНачало, ДатаКонец, ТипРазности) Запрос = Новый Запрос("ВЫБРАТЬ РАЗНОСТЬДАТ(&ДН, &ДК, "+ТипРазности+") КАК РазностьДат"); Запрос.УстановитьПараметр("ДН", ДатаНачало); Запрос.УстановитьПараметр("ДК", ДатаКонец); Возврат Запрос.Выполнить().Выгрузить()[0].РазностьДат; КонецФункции |
Таким образом можно узнать следующие типы разности дат:
- СЕКУНДА;
- МИНУТ;
- ЧАС;
- ДЕНЬ;
- МЕСЯЦ;
- КВАРТАЛ;
- ГОД.
Разница между датами в месяцах, количество месяцев между датами
Здесь все в точности также, как и в предыдущем пункте.
Прибавить день к дате, вычесть день из даты, отнять от даты день
1 2 3 4 5 6 7 8 9 10 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(ДобавитьДень('20170425', 3)); //28.04.2017 0:00:00 Сообщить(ДобавитьДень('20170425', -3)); //22.04.2017 0:00:00 КонецПроцедуры &НаКлиенте Функция ДобавитьДень(Дата, ЧислоДней) Возврат Дата+86400*ЧислоДней; КонецФункции |
Прибавить месяц к дате, вычесть месяц из даты, отнять месяц от даты
Для прибавления/вычитания месяцев существует встроенная функция:
1 2 3 4 5 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(ДобавитьМесяц('20170425', 3)); //25.07.2017 0:00:00 Сообщить(ДобавитьМесяц('20170425', -3)); //25.01.2017 0:00:00 КонецПроцедуры |
День недели по дате
1 2 3 4 5 | &НаКлиенте Процедура ТестДата(Команда) Сообщить(ДеньНедели('20170425')); //2 Сообщить(Формат('20170425', "ДФ=dddd")); //вторник КонецПроцедуры |
Сравнение дат
Так как дата в 1С это по сути количество секунд прошедшее с начала нашей эры (т.е. число) то и сравнение производится так же как и числами. У объекта «МоментВремени» существует специальный метод «Сравнить» который позволяет сравнить один объект «МоментВремени» с другим.
1 2 3 4 5 6 | &НаКлиенте Процедура ТестДата(Команда) Если МоментВремени1.Сравнить(МоментВремени2) = 0 Тогда Сообщить("Моменты времени равны"); КонецЕсли; КонецПроцедуры |
Дата равна нулю (проверка на заполненность), проверка на пустую дату
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | &НаКлиенте Процедура ТестДата(Команда) Д1 = '00010101'; Если Д1 = '00010101' Тогда Сообщить("Пустая дата"); КонецЕсли; Если НЕ ЗначениеЗаполнено(Д1) Тогда Сообщить("Пустая дата"); КонецЕсли; Если Д1 = Дата(1,1,1) Тогда Сообщить("Пустая дата"); КонецЕсли; КонецПроцедуры |
Корисні матеріли, дякую.
«Часы, минуты и секунды можно не указывать, при этом они приравниваются к единице.» — здесь надо исправить на «приравниваются к нулю».
Спасибо, исправил.
«Год, Месяц, ДЕНЬ, Час, Минута, Секунда» А можно тут как исходную дату не ЯНВАРЬ месяц брать? Исправьте пожалуйста, что бы люди видели как наверняка как функция работает, что бы у них не бомбило как у меня)