1С 8.3 Дата и время - Программист 1С Минск. Автоматизация бизнеса.

Перейти к контенту

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

     // Получение текущей (рабочей) даты
   
Сообщить(ТекущаяДата());

КонецПроцедуры
Прибавить день к дате или вычесть день из даты в 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
  Возврат КонецДня(Дата)+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

КонецПроцедуры
Преобразование в дату десятисимвольной строки в 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'

КонецПроцедуры
Проверка на пустое значение даты (заполнение) в 1С 8.3:
&НаКлиенте
Процедура ПроверкаНаПустоеЗначениеДаты(Команда)

  ПустаяДата = '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С 8.3:
&НаКлиенте
Функция СложениеДат(Команда)

   ПустаяДата = '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С 8.3:
&НаКлиенте
Процедура РасчетКоличестваДнейМеждуДатами(Команда)

   
ДатаНач = '20200415';
   
ДатаКон = '20200417';

   
РазницаВСекундах = ДатаКон - ДатаНач; // 172800 секунды
   
РазницаВДнях = Цел(РазницаВСекундах/86400); // 2 дня

КонецПроцедуры
Расчет количества дней между датами ЗАПРОСОМ в 1С 8.3:
&НаКлиенте
Процедура РасчетКоличестваДнейМеждуДатамиЗапросом(Команда)

   
ДатаНач = '20200415';
   
ДатаКон = '20200417';

   
Сообщить(РазницаДатНаСервере(ДатаНач, ДатаКон, "ДЕНЬ")); //2 дня

КонецПроцедуры

&НаСервере
Функция РазницаДатНаСервере(ДатаНач, ДатаКон, СтрПериод)

   
//СтрПериод - может быть "ДЕНЬ", "НЕДЕЛЯ", "МЕСЯЦ", "ГОД"
   
Запрос = Новый Запрос("ВЫБРАТЬ РАЗНОСТЬДАТ(&ДатаНач, &ДатаКон, "+СтрПериод+") КАК РазностьДат");
   
Запрос.УстановитьПараметр("ДатаНач", ДатаНач);
   
Запрос.УстановитьПараметр("ДатаКон", ДатаКон);

    Возврат
Запрос.Выполнить().Выгрузить()[0].РазностьДат;

КонецФункции
Узнать текущую дату в миллисекундах в 1С 8.3:
&НаКлиенте
Процедура УзнатьТекущуюДатуВМиллисекундах(Команда)

   Сообщить(ТекущаяУниверсальнаяДатаВМиллисекундах()); //79 452 791 027 745

КонецПроцедуры
// Примечание: не совершайте чужих ошибок:
//
// Чтобы упорядочить данные в порядке поступления, разработчик добавил измерение МоментВремени И заполнил его
// из ТекущаяУниверсальнаяДатаВМиллисекундах(). При поступлении пакета разные наборы данных зарегистрировались одной миллисекундой
// (см.скриншот ниже).
//
// Всё работало, до тех пор, пока в обмен не добавили сценарий "удаляем данные, затем добавляем данные".
// Появилась плавающая ошибка - часть данных теряется. На самом деле данные сперва приходят, потом удаляются, т.к. нарушен порядок.
//
// Вывод: точности миллисекунд может быть недостаточно.
// Вариант решения, например - добавить поле с порядковым номером записи, по всем записям или в рамках секунды.



Момент времени в 1С 8.3:
// Момент времени - комбинация даты и ссылки на документ.
// Момент времени используется в тех случаях, когда важно различать моменты времени для объектов,
// имеющих одинаковую дату и время, например для сравнения положений документов на временной оси.
// То есть позволяет разделить и упорядочить документы в пределах одной секунды,
// выстраивая все документы в однозначную последовательность.
// Получение данных при проведении на момент времени гарантирует,
// что будут учтены движения сделанные в ту же секунду что и проводимый документ,
// но находящиеся перед ним.
// Но есть особенность - документы проведенные в одну и ту же секунду располагаются
// в произвольном порядке, а не в порядке их физического создания (как было в 7.7).

Функция СравнитьДваДокумента(Док1, Док2)

   // У "Док1" и "Док2" одинаковая дата и время: 15.04.2020 23:59:59
   РезультатСравнения = Док1.МоментВремени().Сравнить(Док2.МоментВремени());

   Сообщить(РезультатСравнения);
   Возврат РезультатСравнения;

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

// Распространенная ошибка в формировании движений документов по регистрам:
// Не знать, что в 1 секунде времени может быть несколько тысяч документов, и для определения последовательности
// использовать поле "Дата" из документа. Необходимо использовать МоментВремени(), который равен Дата + Ссылка.
// И еще нужно иметь ввиду, что Ссылка - это не только УИД, но и идентификатор типа документа.
// Поэтому при упорядочивании внутри одной секунды сначала идут документы одного типа, а потом уже другого.

📰 Актуальные новости с тегом #Дата и время:
  • В версии 8.3.26 реализовано получение даты последней активности пользователя
0
комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 03.04.2020
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Яндекс.Метрика
Защищенное соединение ssl
visa
mastercard
Maestro
Яндекс деньги
Назад к содержимому