Работа с датами в 1С 8.3 на примерах
В 1С значение типа «Дата» – это календарная дата григорианского календаря (с 01 января 0001 года по 31 декабря 3999 год) и время с точностью до 0,1 миллисекунды. Разработчику неизбежно приходится сталкиваться с данным типом, поэтому в этой статье предлагаю ознакомиться с его основными функциями и принципами работы.
Содержание
- 1 «Дата» в модулях 1С
- 1.1 Как инициализировать дату
- 1.2 Функции для работы с датой
- 1.2.1 Получить текущую дату
- 1.2.2 Получить отдельные части даты
- 1.2.3 Определить дату и время начала некоторого периода из даты
- 1.2.4 Определить дату и время конца некоторого периода из даты
- 1.2.5 Определить номер недели или дня в году
- 1.2.6 Определить номер дня в неделе
- 1.2.7 Как отнять или прибавить к дате в 1С год, месяц, день, час, минуту, секунду
- 1.2.8 Формат даты в 1С
- 1.3 Как вызвать диалоговое окно для ввода даты
- 2 «Дата» в запросах 1С
«Дата» в модулях 1С
Как инициализировать дату
С помощью литерала встроенного языка
// Формат 'ГГГГММДДччммсс' Дата = '20200105212930'; // 05.01.2020 21:29:30 // Формат 'ГГГГ.ММ.ДД:чч:мм:сс' Дата = '2020.01.05:21:29:30'; // 05.01.2020 21:29:30 // Формат 'ГГГГ-ММ-ДД-чч-мм-сс' Дата = '2020-01-05-21-29-30'; // 05.01.2020 21:29:30 // Допустимо не указывать часы, минуты и секунды НачалоДня = '2020.01.05'; // 05.01.2020 00:00:00
С помощью функции 1С Дата()
Дата = Дата("20200105212930"); // 05.01.2020 21:29:30 Дата = Дата(2020,01,05,21,29,30); // 05.01.2020 21:29:30
Как указать пустую дату
ПустаяДата = Дата(1,1,1);
Функции для работы с датой
Получить текущую дату
// Получим текущую дату на компьютере. Формат возвращаемой даты по умолчанию ' ДД.ММ. ГГГГ:чч:мм:сс' Дата = ТекущаяДата();
Получить отдельные части даты
Г = Год('2020.01.05:21:29:30'); // 2020
Следует заметить, что пробел в номере года вставляется при установках по умолчанию (подразумевается, что не установлен признак группировки в региональных установках).
М = Месяц('2020.01.05:21:29:30'); // 1 Д = День('2020.01.05:21:29:30'); // 5 Ч = Час('2020.01.05:21:29:30'); // 21 Мин = Минута('2020.01.05:21:29:30'); // 29 Сек = Секунда('2020.01.05:21:29:30'); // 30
Определить дату и время начала некоторого периода из даты
Для решения таких задач существует набор функций НачалоГода(<Дата>), НачалоКвартала(<Дата>), НачалоМесяца(<Дата>), НачалоНедели(<Дата>), НачалоДня(<Дата>), НачалоЧаса(<Дата>), НачалоМинуты(<Дата>). В параметр <Дата> задаётся значение даты начало периода, которого необходимо определить.
Пример:
НачалоПериода = НачалоМесяца('2020.02.05:21:29:30'); // 01.02.2020 0:00:00
Определить дату и время конца некоторого периода из даты
Для получения конца периода из даты, можно использовать специальные функции НачалоГода(<Дата>), НачалоКвартала(<Дата>), НачалоМесяца(<Дата>), НачалоНедели(<Дата>), НачалоДня(<Дата>), НачалоЧаса(<Дата>), НачалоМинуты(<Дата>). Параметр <Дата> принимает значение «нашей даты», аналогично, как и в функции Начало…().
Пример:
КонецПериода = КонецМесяца('2020.02.05:21:29:30'); // 29.02.2020 23:59:59
Определить номер недели или дня в году
Номер1 = НеделяГода('2020.02.05:21:29:30'); // 6 Номер2 = ДеньГода('2020.02.05:21:29:30'); // 36
Определить номер дня в неделе
Номер = ДеньНедели('2020.02.05:21:29:30'); // 3
Как отнять или прибавить к дате в 1С год, месяц, день, час, минуту, секунду
//Начнём с простого. Прибавим секунду. Результат = НашаДата + 1; // Прибавим минуту. В минуте 60 сек соответственно: Результат = НашаДата + 60; //Прибавим два часа. В часе 60 минут. Результат = НашаДата + 60 * 60 * 2; //Прибавим два дня. В одном дне 24 часа. КоличествоДней = 2; Результат = НашаДата + КоличествоДней * 60 * 60 * 24;
Если вы только начинаете программировать в 1С или просто хотите систематизировать свои знания - попробуйте Школу программирования 1С нашего друга Владимира Милькина. Пошаговые и понятные уроки даже для новичка с поддержкой учителя.
Попробуйте бесплатно по ссылке >>
Чтобы прибавить, вычесть месяц или год правильно использовать функцию ДобавитьМесяц(<Дата>, <ЧислоМесяцев>). Если параметру <ЧислоМесяцев> задать отрицательное значение, то число месяцев отнимается.
//Месяц КоличествоМесяцев = 2; Результат = ДобавитьМесяц(НашаДата, КоличествоМесяцев); //Год КоличествоЛет = 2; Результат = ДобавитьМесяц(НашаДата, КоличествоЛет * 12);
Формат даты в 1С
Функция Формат(<Значение>, <ФорматнаяСтрока>). В параметре <ФорматнаяСтрока> перечисляются параметры форматирования через символ «;». Возвращаемый тип строка.
Примеры:
Дата = '2020.02.05:21:29:30'; ДатаФормат1 = Формат(Дата, "ДФ=""дд ММММ гггг 'г.' ЧЧ:мм:сс"""); // "05 февраля 2020 г. 21:29:30" ДатаФормат2 = Формат(Дата, "ДФ=""дд/ММ-гггг"""); // "05/02-2020" ДатаФормат3 = Формат(Дата, "ДЛФ=ДД"); // "5 февраля 2020 г."; ДатаФормат4 = Формат(Дата, "ДЛФ=Д"); // "05.02.2020"; ДатаФормат5 = Формат(Дата, "ДЛФ=В"); // "21:29:30";
Для задания параметра <ФорматнаяСтрока> можно воспользоваться «конструктором форматной строки». При написании кода вызвать его не составляет труда. Необходимо только нажать правую кнопку «мыши» и из контекстного меню выбрать одноимённый конструктор.
На вкладке «Дата» задаём нужный нам формат.
Как вызвать диалоговое окно для ввода даты
Модальный режим:
&НаКлиенте Процедура ВводДатыМодально(Команда) Дата = '0001.01.01'; Если ВвестиДату(Дата, "Введите дату", ЧастиДаты.Дата) Тогда Сообщить("Введена дата : " + Дата); КонецЕсли; КонецПроцедуры
Не модальный режим:
&НаКлиенте Процедура ВводДаты(Команда) Оповещение = Новый ОписаниеОповещения("ПослеВводаДаты", ЭтотОбъект); ПоказатьВводДаты(Оповещение, , "Введите дату", ЧастиДаты.Дата); КонецПроцедуры &НаКлиенте Процедура ПослеВводаДаты(Дата, Параметры) Экспорт Если Не Дата = Неопределено Тогда Сообщить("Введена дата : " + Дата); КонецЕсли; КонецПроцедуры
«Дата» в запросах 1С
Инициализация даты в запросах
Функция ДАТАВРЕМЯ()
Синтаксис: Функция ДАТАВРЕМЯ(<Год>, <Месяц>, <День>, <Час>, <Минута>, <Секунда>)
Стоит отметить, что параметры данной функции принимают только литералы в отличие от схожей на неё функции для работы с датой в модулях Дата(). Например запись с передачей в функцию полей выборки из временной таблицы ДАТАВРЕМЯ(вт.Год, вт.Месяц, вт.День) выдаст ошибку.
"ВЫБРАТЬ | ДАТАВРЕМЯ(2019, 12, 31, 23, 59, 59) КАК КонецГода" | .... // Допустимо не указывать часы, минуты, секунды. "ВЫБРАТЬ | ДАТАВРЕМЯ(2019, 12, 31) КАК НачалоДня" // 31.12.2019 00:00:00 | ....
Пустая дата
"ВЫБРАТЬ | ДАТАВРЕМЯ(1, 1, 1) КАК ПустаяДата" | ....
Текущая дата и работа с условием по дате в запросе
Так же не стоит забывать, что передать в запрос дату можно с помощью параметра. Для указания текущей даты это единственный вариант.
"ВЫБРАТЬ //… выбираемые поля |ГДЕ | Таблица.Дата = &ТекущаяДата" Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата());
Получить отдельные части даты. Функции: ГОД, КВАРТАЛ, МЕСЯЦ, ДЕНЬ, ЧАС, МИНУТА, СЕКУНДА
В запросе получить отдельные части даты возможно с помощью одноимённых функций ГОД(), КВАРТАЛ(), МЕСЯЦ(), ДЕНЬ(), ЧАС(), МИНУТА(), СЕКУНДА().
Пример:
"ВЫБРАТЬ | МЕСЯЦ(ДАТАВРЕМЯ(2019, 12, 31)) КАК Месяц" // 12 | ....
Получить начало, конец некоторого периода
Существует две функции для решения таких задач. Соответственно НАЧАЛОПЕРИОДА(<Дата>, <Период>) и КОНЕЦПЕРИОДА(<Дата>, <Период>).
Где в параметр <Дата> указывается «наша дата», а в параметр <Период> задаётся значение периода (Год, Полугодие, Квартал, Месяц, Декада, Неделя, День, Час, Минута).
Пример:
"ВЫБРАТЬ | НАЧАЛОПЕРИОДА(ДАТАВРЕМЯ(2019, 12, 31), МЕСЯЦ) КАК НачалоМесяца" | ....
Аналогично и для функции КОНЕЦПЕРИОДА().
Добавить сдвиг к дате
Для решения таких задач пригодится функция ДОБАВИТЬКДАТЕ(<Дата>, <Тип>, <Количество>). В параметр <Дата> задаётся «наша дата», в параметр <Тип> временной интервал (Год, Полугодие, Месяц и т.д.).
Пример:
"ВЫБРАТЬ | ДОБАВИТЬКДАТЕ(ДАТАВРЕМЯ(2019, 12, 31), ДЕНЬ, 1) КАК ДатаСоСдвигом" | ....
Использование функции РАЗНОСТЬДАТ()
Синтаксис:
РАЗНОСТЬДАТ(<Дата1>, <Дата2>, <Тип>). Где параметр <Дата1> принимает значение начальной даты, а параметр <Дата2> конечной. В параметре <Тип> указывается в разрезе, какой временной единицы необходимо получить результат. Рассмотрим работу данной функции на примере, а именно узнаем, сколько дней осталось до «Нового Года». Результат выведем в окно сообщений.
&НаКлиенте Процедура РасчитатьКоличесвоДнейДоНовогоГода(Команда) КоличествоДней = РасчитатьКоличесвоДнейДоНовогоГодаНаСервере(); Сообщить("Дней до нового года : " + КоличествоДней); КонецПроцедуры &НаСервере Функция РасчитатьКоличесвоДнейДоНовогоГодаНаСервере() Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | РАЗНОСТЬДАТ(&ТекущаяДата, КОНЕЦПЕРИОДА(&ТекущаяДата, ГОД), ДЕНЬ) КАК ДнейДоКонцаГода"; Запрос.УстановитьПараметр("ТекущаяДата", ТекущаяДата()); РезультатЗапроса = Запрос.Выполнить(); ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать(); Пока ВыборкаДетальныеЗаписи.Следующий() Цикл КоличествоДней = ВыборкаДетальныеЗаписи.ДнейДоКонцаГода; КонецЦикла; Возврат КоличествоДней + 1; КонецФункции
К сожалению, мы физически не можем проконсультировать бесплатно всех желающих, но наша команда будет рада оказать услуги по внедрению и обслуживанию 1С. Более подробно о наших услугах можно узнать на странице Услуги 1С или просто позвоните по телефону +7 (499) 350 29 00. Мы работаем в Москве и области.
СПРОСИТЕ в комментариях!
Шпион:
Добрый день. А как можно рассчитать количество возраста в неделях в модуле конфигурации? Какой код нужно писать?
Аноним:
А как посчитать сумму дат начала месяца и конца
ТотСамый:
как при вводе двух дат.сделать так чтоб вывоодилосьссобщение что обе даты в пределах одной недели
Студент:
а как получить дату из момента времени? пожалуйста
CtrlCCtrlV:
&НаКлиенте
Процедура РасчитатьКоличесвоДнейДоНовогоГода(Команда)
КоличествоДней = РасчитатьКоличесвоДнейДоНовогоГодаНаСервере();
Сообщить(«Дней до нового года : » + КоличествоДней);
КонецПроцедуры
&НаСервере
Функция РасчитатьКоличесвоДнейДоНовогоГодаНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ТекущаяДата, КОНЕЦПЕРИОДА(&ТекущаяДата, ГОД), ДЕНЬ) КАК ДнейДоКонцаГода»;
Запрос.УстановитьПараметр(«ТекущаяДата», ТекущаяДата());
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
КоличествоДней = ВыборкаДетальныеЗаписи.ДнейДоКонцаГода;
КонецЦикла;
Возврат КоличествоДней + 1;
КонецФункции