Закажите бесплатный расчет стоимости вашей задачи по 1С!
Перезвоним за 10 минут! (в рабочие часы)

Работа с датами в 1С 8.3 на примерах

В 1С значение типа «Дата» – это календарная дата григорианского календаря (с 01 января 0001 года по 31 декабря 3999 год) и время с точностью до 0,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. Мы работаем в Москве и области.

Остались вопросы?

СПРОСИТЕ в комментариях!

Комментариев: 5 на “Работа с датами в 1С 8.3 на примерах
  1. Добрый день. А как можно рассчитать количество возраста в неделях в модуле конфигурации? Какой код нужно писать?

    Ответить

  2. А как посчитать сумму дат начала месяца и конца

    Ответить

  3. как при вводе двух дат.сделать так чтоб вывоодилосьссобщение что обе даты в пределах одной недели

    Ответить

  4. а как получить дату из момента времени? пожалуйста

    Ответить

  5. &НаКлиенте
    Процедура РасчитатьКоличесвоДнейДоНовогоГода(Команда)
    КоличествоДней = РасчитатьКоличесвоДнейДоНовогоГодаНаСервере();
    Сообщить(«Дней до нового года : » + КоличествоДней);
    КонецПроцедуры

    &НаСервере
    Функция РасчитатьКоличесвоДнейДоНовогоГодаНаСервере()

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

    Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    КоличествоДней = ВыборкаДетальныеЗаписи.ДнейДоКонцаГода;
    КонецЦикла;

    Возврат КоличествоДней + 1;

    КонецФункции

    Ответить

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

Ваш адрес email не будет опубликован.