1С 8.3 Дата и время
Данные > Примеры кода 1С > 1С 8.3 Дата и время
Дата в 1С 8.3 - это примитивный тип данных, который всегда имеет формат: год, месяц, день, час, минута, секунда. Поэтому переменная типа дата содержит не только дату, но и время. Простой способ создания новой переменной типа дата является приравнивание к переменной строки цифр в одинарных кавычках вида 'ГГГГММДДччммсс' (если часы, минуты и секунды не указывать, то они приравниваются к 00:00:00) где:
ГГГГ — четыре цифры года (включая тысячелетие и век);
ММ — две цифры месяца;
ДД — две цифры даты;
//----------------------------------
чч — две цифры часа (в 24-х часовом формате);
мм — две цифры минут;
сс — две цифры секунд.
Оглавление:
Работа с датой и временем в 1С 8.3:
&НаКлиенте
Процедура РаботаСДатойИВременем(Команда)
// Установка даты в переменную
ТолькоДата = '20200415'; // 15.04.2020
// Преобразование строки в дату
ТолькоДата = Дата("20200415"); // 15.04.2020
// Преобразование чисел в дату отдельными частями
ТолькоДата = Дата(2020, 04, 15); // 15.04.2020
// Установка в дате: часы, минуты и секунды
ДатаВремя = '20200415162703'; // 15 апреля 2020 г. 16 ч. 27 мин. 03 сек.
// Получение года (месяца, дня, часа, минуты, секунды) у даты
Год_Даты = Год(ДатаВремя); // 2020
Месяц_Даты = Месяц(ДатаВремя); // 4
День_Даты = День(ДатаВремя); // 15
Час_Даты = Час(ДатаВремя); // 16
Минута_Даты = Минута(ДатаВремя); // 27
Секунда_Даты = Секунда(ДатаВремя); // 03
// Прибавление к дате 3 секунды
Сообщить(ДатаВремя + 3); // 15.04.2020 16:27:06
// Прибавление к дате два месяца
Сообщить(ДобавитьМесяц(ДатаВремя, 2));// 15.06.2020 16:27:03
// Вычитание от даты одного месяца
Сообщить(ДобавитьМесяц(ДатаВремя, -1));// 15.03.2020 16:27:03
// Получение текущей (рабочей) даты
Сообщить(ТекущаяДата());
КонецПроцедуры
Процедура РаботаСДатойИВременем(Команда)
// Установка даты в переменную
ТолькоДата = '20200415'; // 15.04.2020
// Преобразование строки в дату
ТолькоДата = Дата("20200415"); // 15.04.2020
// Преобразование чисел в дату отдельными частями
ТолькоДата = Дата(2020, 04, 15); // 15.04.2020
// Установка в дате: часы, минуты и секунды
ДатаВремя = '20200415162703'; // 15 апреля 2020 г. 16 ч. 27 мин. 03 сек.
// Получение года (месяца, дня, часа, минуты, секунды) у даты
Год_Даты = Год(ДатаВремя); // 2020
Месяц_Даты = Месяц(ДатаВремя); // 4
День_Даты = День(ДатаВремя); // 15
Час_Даты = Час(ДатаВремя); // 16
Минута_Даты = Минута(ДатаВремя); // 27
Секунда_Даты = Секунда(ДатаВремя); // 03
// Прибавление к дате 3 секунды
Сообщить(ДатаВремя + 3); // 15.04.2020 16:27:06
// Прибавление к дате два месяца
Сообщить(ДобавитьМесяц(ДатаВремя, 2));// 15.06.2020 16:27:03
// Вычитание от даты одного месяца
Сообщить(ДобавитьМесяц(ДатаВремя, -1));// 15.03.2020 16:27:03
// Получение текущей (рабочей) даты
Сообщить(ТекущаяДата());
КонецПроцедуры
Прибавить день к дате или вычесть день из даты в 1С 8.3:
// вариант 1:
&НаКлиенте
Процедура ОперацииДеньДата(Команда)
Сообщить(МатематикаДень('20200415', 1)); //16.04.2020 0:00:00
Сообщить(МатематикаДень('20200415', -1)); //14.04.2020 0:00:00
КонецПроцедуры
&НаКлиенте
Функция МатематикаДень(Дата, ЧислоДней)
Возврат Дата+86400*ЧислоДней;// 86400 сек.
КонецФункции
// или вариант 2 (менее универсальный):
&НаКлиенте
Функция ПолучитьСледующийДень(Дата)
// с помощью функции КонецДня прибавляем секунду к 15.04.2020 23:59:59
&НаКлиенте
Процедура ОперацииДеньДата(Команда)
Сообщить(МатематикаДень('20200415', 1)); //16.04.2020 0:00:00
Сообщить(МатематикаДень('20200415', -1)); //14.04.2020 0:00:00
КонецПроцедуры
&НаКлиенте
Функция МатематикаДень(Дата, ЧислоДней)
Возврат Дата+86400*ЧислоДней;// 86400 сек.
КонецФункции
// или вариант 2 (менее универсальный):
&НаКлиенте
Функция ПолучитьСледующийДень(Дата)
// с помощью функции КонецДня прибавляем секунду к 15.04.2020 23:59:59
Возврат КонецДня(Дата)+1;// и получаем следующий день 16.04.2020 00:00:00
КонецФункции
КонецФункции
Дополнительные функции при работе с датой в 1С 8.3:
&НаКлиенте
Процедура ДополнительныеФункцииДаты(Команда)
// Указываем дату явно:
ДатаВремя = '20200415162703'; // 15 апреля 2020 г. 16:27:03
//или
ДатаВремя = '2020.04.15:16:27:03'; // 15 апреля 2020 г. 16:27:03
Сообщить(ДеньГода(ДатаВремя)); // 15
Сообщить(ДеньНедели(ДатаВремя)); // 3 - Среда (нумерация с понедельника "1")
Сообщить(НеделяГода(ДатаВремя)); // 3 Неделя
Сообщить(НачалоГода(ДатаВремя)); // 01.01.2020 0:00:00
Сообщить(КонецГода(ДатаВремя)); // 31.12.2020 23:59:59
Сообщить(НачалоКвартала(ДатаВремя)); // 01.04.2020 0:00:00
Сообщить(КонецКвартала(ДатаВремя)); // 30.06.2020 23:59:59
Сообщить(НачалоМесяца(ДатаВремя)); // 01.04.2020 0:00:00
Сообщить(КонецМесяца(ДатаВремя)); // 30.04.2020 23:59:59
Сообщить(НачалоНедели(ДатаВремя)); // 13.04.2020 0:00:00
Сообщить(КонецНедели(ДатаВремя)); // 19.04.2020 23:59:59
Сообщить(НачалоДня(ДатаВремя)); // 15.04.2020 0:00:00
Сообщить(КонецДня(ДатаВремя)); // 15.04.2020 23:59:59
Сообщить(НачалоЧаса(ДатаВремя)); // 15.04.2020 16:00:00
Сообщить(КонецЧаса(ДатаВремя)); // 15.04.2020 16:59:59
Сообщить(НачалоМинуты(ДатаВремя)); // 15.04.2020 16:27:00
Сообщить(КонецМинуты(ДатаВремя)); // 15.04.2020 16:27:59
КонецПроцедуры
Процедура ДополнительныеФункцииДаты(Команда)
// Указываем дату явно:
ДатаВремя = '20200415162703'; // 15 апреля 2020 г. 16:27:03
//или
ДатаВремя = '2020.04.15:16:27:03'; // 15 апреля 2020 г. 16:27:03
Сообщить(ДеньГода(ДатаВремя)); // 15
Сообщить(ДеньНедели(ДатаВремя)); // 3 - Среда (нумерация с понедельника "1")
Сообщить(НеделяГода(ДатаВремя)); // 3 Неделя
Сообщить(НачалоГода(ДатаВремя)); // 01.01.2020 0:00:00
Сообщить(КонецГода(ДатаВремя)); // 31.12.2020 23:59:59
Сообщить(НачалоКвартала(ДатаВремя)); // 01.04.2020 0:00:00
Сообщить(КонецКвартала(ДатаВремя)); // 30.06.2020 23:59:59
Сообщить(НачалоМесяца(ДатаВремя)); // 01.04.2020 0:00:00
Сообщить(КонецМесяца(ДатаВремя)); // 30.04.2020 23:59:59
Сообщить(НачалоНедели(ДатаВремя)); // 13.04.2020 0:00:00
Сообщить(КонецНедели(ДатаВремя)); // 19.04.2020 23:59:59
Сообщить(НачалоДня(ДатаВремя)); // 15.04.2020 0:00:00
Сообщить(КонецДня(ДатаВремя)); // 15.04.2020 23:59:59
Сообщить(НачалоЧаса(ДатаВремя)); // 15.04.2020 16:00:00
Сообщить(КонецЧаса(ДатаВремя)); // 15.04.2020 16:59:59
Сообщить(НачалоМинуты(ДатаВремя)); // 15.04.2020 16:27:00
Сообщить(КонецМинуты(ДатаВремя)); // 15.04.2020 16:27:59
КонецПроцедуры
Преобразование в дату десятисимвольной строки в 1С 8.3:
&НаКлиенте
Процедура ПреобразованиеВДатуСтроки10Симв(Команда) // "15.04.2020" преобразуем в '15.04.2020 0:00:00'
// Строковая дата без времени преобразовывается в дату со временем:
СтрокаДаты="15.04.2020";
ТолькоДата = Дата(Сред(СтрокаДаты,7,4)+Сред(СтрокаДаты,4,2)+Сред(СтрокаДаты,0,2)); // формат даты '15.04.2020 0:00:00'
КонецПроцедуры
Процедура ПреобразованиеВДатуСтроки10Симв(Команда) // "15.04.2020" преобразуем в '15.04.2020 0:00:00'
// Строковая дата без времени преобразовывается в дату со временем:
СтрокаДаты="15.04.2020";
ТолькоДата = Дата(Сред(СтрокаДаты,7,4)+Сред(СтрокаДаты,4,2)+Сред(СтрокаДаты,0,2)); // формат даты '15.04.2020 0:00:00'
КонецПроцедуры
Проверка на пустое значение даты (заполнение) в 1С 8.3:
&НаКлиенте
Процедура ПроверкаНаПустоеЗначениеДаты(Команда)
ПустаяДата = '00010101';
//способ №1
Если ПустаяДата = '00010101' Тогда // или '00010101000000'
Сообщить("Эта дата пустая");
КонецЕсли;
//способ №2
Если ПустаяДата = '0001–01–01' Тогда
Сообщить("Эта дата пустая");
КонецЕсли;
//способ №3
Если ПустаяДата = Дата(1,1,1) Тогда // или Дата(1, 1, 1, 0, 0, 0)
Сообщить("Эта дата пустая");
КонецЕсли;
//способ №4
Если НЕ ЗначениеЗаполнено(ПустаяДата) Тогда
Сообщить("Эта дата пустая");
КонецЕсли;
КонецПроцедуры
Процедура ПроверкаНаПустоеЗначениеДаты(Команда)
ПустаяДата = '00010101';
//способ №1
Если ПустаяДата = '00010101' Тогда // или '00010101000000'
Сообщить("Эта дата пустая");
КонецЕсли;
//способ №2
Если ПустаяДата = '0001–01–01' Тогда
Сообщить("Эта дата пустая");
КонецЕсли;
//способ №3
Если ПустаяДата = Дата(1,1,1) Тогда // или Дата(1, 1, 1, 0, 0, 0)
Сообщить("Эта дата пустая");
КонецЕсли;
//способ №4
Если НЕ ЗначениеЗаполнено(ПустаяДата) Тогда
Сообщить("Эта дата пустая");
КонецЕсли;
КонецПроцедуры
Проверка на пустое значение даты в Запросе в 1С 8.3:
&НаСервере
Процедура ПроверкаНаПустоеЗначениеДатыВЗапросе(Команда)
//способ №1
Запрос = Новый Запрос("ВЫБРАТЬ
| ДатаРегистрацииЕГР
| ИЗ
| Справочник.Контрагенты
| ГДЕ
| ДатаРегистрацииЕГР = &ПустаяДата";
Запрос.УстановитьПараметр("ПустаяДата", '00010101');
//способ №2
Запрос = Новый Запрос("ВЫБРАТЬ
| ДатаРегистрацииЕГР
| ИЗ
| Справочник.Контрагенты
| ГДЕ
| ДатаРегистрацииЕГР = ДАТАВРЕМЯ(1,1,1,0,0,0)";
// или ДАТАВРЕМЯ(0001,01,01,0,0,0) или ДАТАВРЕМЯ(1,1,1)
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
КонецПроцедуры
Процедура ПроверкаНаПустоеЗначениеДатыВЗапросе(Команда)
//способ №1
Запрос = Новый Запрос("ВЫБРАТЬ
| ДатаРегистрацииЕГР
| ИЗ
| Справочник.Контрагенты
| ГДЕ
| ДатаРегистрацииЕГР = &ПустаяДата";
Запрос.УстановитьПараметр("ПустаяДата", '00010101');
//способ №2
Запрос = Новый Запрос("ВЫБРАТЬ
| ДатаРегистрацииЕГР
| ИЗ
| Справочник.Контрагенты
| ГДЕ
| ДатаРегистрацииЕГР = ДАТАВРЕМЯ(1,1,1,0,0,0)";
// или ДАТАВРЕМЯ(0001,01,01,0,0,0) или ДАТАВРЕМЯ(1,1,1)
РезультатЗапроса = Запрос.Выполнить(); Записи = РезультатЗапроса.Выбрать();
Пока Записи.Следующий() Цикл
// Обход результата запроса по каждой записи в полученной выборке
КонецЦикла;
КонецПроцедуры
Сложение двух дат в 1С 8.3:
&НаКлиенте
Функция СложениеДат(Команда)
ПустаяДата = '00010101';
Дата1 = '20200415'; // 15.04.2020
Дата2 = '20220214'; // 14.02.2022
Результат = ПустаяДата + (Дата1 - ПустаяДата) + (Дата2 - ПустаяДата);
Сообщить("Дата = "+Результат); // Дата = 29.05.4041 0:00:00
Возврат Результат;
КонецФункции
Функция СложениеДат(Команда)
ПустаяДата = '00010101';
Дата1 = '20200415'; // 15.04.2020
Дата2 = '20220214'; // 14.02.2022
Результат = ПустаяДата + (Дата1 - ПустаяДата) + (Дата2 - ПустаяДата);
Сообщить("Дата = "+Результат); // Дата = 29.05.4041 0:00:00
Возврат Результат;
КонецФункции
Сравнение двух дат в 1С 8.3:
&НаКлиенте
Процедура СравнениеДат(Команда)
Дата1 = '20200415'; // 15.04.2020
Дата2 = '20200415'; // 15.04.2020
Если Дата1.Сравнить(Дата2) = 0 Тогда
Сообщить("Даты равны");
КонецЕсли;
КонецПроцедуры
Процедура СравнениеДат(Команда)
Дата1 = '20200415'; // 15.04.2020
Дата2 = '20200415'; // 15.04.2020
Если Дата1.Сравнить(Дата2) = 0 Тогда
Сообщить("Даты равны");
КонецЕсли;
КонецПроцедуры
Расчет количества дней между датами в 1С 8.3:
&НаКлиенте
Процедура РасчетКоличестваДнейМеждуДатами(Команда)
ДатаНач = '20200415';
ДатаКон = '20200417';
РазницаВСекундах = ДатаКон - ДатаНач; // 172800 секунды
РазницаВДнях = Цел(РазницаВСекундах/86400); // 2 дня
КонецПроцедуры
Процедура РасчетКоличестваДнейМеждуДатами(Команда)
ДатаНач = '20200415';
ДатаКон = '20200417';
РазницаВСекундах = ДатаКон - ДатаНач; // 172800 секунды
РазницаВДнях = Цел(РазницаВСекундах/86400); // 2 дня
КонецПроцедуры
Расчет количества дней между датами ЗАПРОСОМ в 1С 8.3:
&НаКлиенте
Процедура РасчетКоличестваДнейМеждуДатамиЗапросом(Команда)
ДатаНач = '20200415';
ДатаКон = '20200417';
Сообщить(РазницаДатНаСервере(ДатаНач, ДатаКон, "ДЕНЬ")); //2 дня
КонецПроцедуры
&НаСервере
Функция РазницаДатНаСервере(ДатаНач, ДатаКон, СтрПериод)
//СтрПериод - может быть "ДЕНЬ", "НЕДЕЛЯ", "МЕСЯЦ", "ГОД"
Запрос = Новый Запрос("ВЫБРАТЬ РАЗНОСТЬДАТ(&ДатаНач, &ДатаКон, "+СтрПериод+") КАК РазностьДат");
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Возврат Запрос.Выполнить().Выгрузить()[0].РазностьДат;
КонецФункции
Процедура РасчетКоличестваДнейМеждуДатамиЗапросом(Команда)
ДатаНач = '20200415';
ДатаКон = '20200417';
Сообщить(РазницаДатНаСервере(ДатаНач, ДатаКон, "ДЕНЬ")); //2 дня
КонецПроцедуры
&НаСервере
Функция РазницаДатНаСервере(ДатаНач, ДатаКон, СтрПериод)
//СтрПериод - может быть "ДЕНЬ", "НЕДЕЛЯ", "МЕСЯЦ", "ГОД"
Запрос = Новый Запрос("ВЫБРАТЬ РАЗНОСТЬДАТ(&ДатаНач, &ДатаКон, "+СтрПериод+") КАК РазностьДат");
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);
Возврат Запрос.Выполнить().Выгрузить()[0].РазностьДат;
КонецФункции
Узнать текущую дату в миллисекундах в 1С 8.3:
&НаКлиенте
Процедура УзнатьТекущуюДатуВМиллисекундах(Команда)
Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах()); //79 452 791 027 745
КонецПроцедуры
Процедура УзнатьТекущуюДатуВМиллисекундах(Команда)
Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах()); //79 452 791 027 745
КонецПроцедуры
// Примечание: не совершайте чужих ошибок:
//
// Чтобы упорядочить данные в порядке поступления, разработчик добавил измерение МоментВремени И заполнил его
//
// Чтобы упорядочить данные в порядке поступления, разработчик добавил измерение МоментВремени И заполнил его
// из ТекущаяУниверсальнаяДатаВМиллисекундах(). При поступлении пакета разные наборы данных зарегистрировались одной миллисекундой
// (см.скриншот ниже).
//
// Всё работало, до тех пор, пока в обмен не добавили сценарий "удаляем данные, затем добавляем данные".
//
// Всё работало, до тех пор, пока в обмен не добавили сценарий "удаляем данные, затем добавляем данные".
// Появилась плавающая ошибка - часть данных теряется. На самом деле данные сперва приходят, потом удаляются, т.к. нарушен порядок.
//
// Вывод: точности миллисекунд может быть недостаточно.
//
// Вывод: точности миллисекунд может быть недостаточно.
// Вариант решения, например - добавить поле с порядковым номером записи, по всем записям или в рамках секунды.
Момент времени в 1С 8.3:
// Момент времени - комбинация даты и ссылки на документ.
// Момент времени используется в тех случаях, когда важно различать моменты времени для объектов,
// имеющих одинаковую дату и время, например для сравнения положений документов на временной оси.
// То есть позволяет разделить и упорядочить документы в пределах одной секунды,
// выстраивая все документы в однозначную последовательность.
// Получение данных при проведении на момент времени гарантирует,
// что будут учтены движения сделанные в ту же секунду что и проводимый документ,
// но находящиеся перед ним.
// Но есть особенность - документы проведенные в одну и ту же секунду располагаются
// в произвольном порядке, а не в порядке их физического создания (как было в 7.7).
Функция СравнитьДваДокумента(Док1, Док2)
// У "Док1" и "Док2" одинаковая дата и время: 15.04.2020 23:59:59
РезультатСравнения = Док1.МоментВремени().Сравнить(Док2.МоментВремени());
// Момент времени используется в тех случаях, когда важно различать моменты времени для объектов,
// имеющих одинаковую дату и время, например для сравнения положений документов на временной оси.
// То есть позволяет разделить и упорядочить документы в пределах одной секунды,
// выстраивая все документы в однозначную последовательность.
// Получение данных при проведении на момент времени гарантирует,
// что будут учтены движения сделанные в ту же секунду что и проводимый документ,
// но находящиеся перед ним.
// Но есть особенность - документы проведенные в одну и ту же секунду располагаются
// в произвольном порядке, а не в порядке их физического создания (как было в 7.7).
Функция СравнитьДваДокумента(Док1, Док2)
// У "Док1" и "Док2" одинаковая дата и время: 15.04.2020 23:59:59
РезультатСравнения = Док1.МоментВремени().Сравнить(Док2.МоментВремени());
Сообщить(РезультатСравнения);
Возврат РезультатСравнения;
КонецФункции
// Распространенная ошибка в формировании движений документов по регистрам:
// Не знать, что в 1 секунде времени может быть несколько тысяч документов, и для определения последовательности
// использовать поле "Дата" из документа. Необходимо использовать МоментВремени(), который равен Дата + Ссылка.
// И еще нужно иметь ввиду, что Ссылка - это не только УИД, но и идентификатор типа документа.
// Поэтому при упорядочивании внутри одной секунды сначала идут документы одного типа, а потом уже другого.
💡 Шаблоны (готовые модели) кода 1С 8.3 с тегом #Дата и время:
📰 Актуальные новости с тегом #Дата и время:
- В версии 8.3.26 реализовано получение даты последней активности пользователя
0
комментарии
____________________
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник