1с как из даты получить время
Перейти к содержимому

1с как из даты получить время

  • автор:

Как получить дату и время без секунд?

В зависимости от того, где нужно использовать полученный результат, есть два способа получить дату и время без секунд:

А) Как дату для дальнейшего использования

В этом случае лучше всего воспользоваться функцией НачалоМинуты(), например, так:

ДатаБезСекунд = НачалоМинуты(ТекущаяДата()); 

Б) Как строку для вывода на печать

Здесь мы можем либо привести значение, полученное на предыдущем шаге, к строке:

ПредставлениеДаты = Строка(ДатаБезСекунд); 

Либо воспользоваться функцией Формат() и в одно действие получить нужное представление даты:

ПредставлениеДаты = Формат(ТекущаяДата(), "ДФ='dd.MM.yyyy HH:mm:00'"); 
ПредставлениеДаты = Формат(НачалоМинуты(ТекущаяДата()), "ДЛФ=DT"); 

Читайте также:

  • Как определить начало и конец периода программно?
  • Структура форматной строки

1с как из даты получить время

есть поле дата, формат: дата и время.
нужно, чтоб в реквизит записывалось только время. т.е. тип дата формата время.
как это можно получить?
если формат(), то на выходе строка, а нужно именно дата/время.

время = дата — началодня(дата)

Что значит «дата/время» в контексте «только время»?

Т.е. тебе нужна дата 01.01.0001 ? Ты не можешь «отрезать» дату т.к. это не предусмотрено конструктивом. Но ты можешь через форматную строку её не показывать.

Не припомню я такого формата — время.
(1) даст разницу в секундах. Автор, видимо, хочет в шестидесятиричной системе, с разделителем.

(1) выдает некое количество секунд
А какой смысл? Что тебе надо?
Формат(ТекущаяДата(), «ДЛФ=T»)

(2) когда описываем тип реквизита, если тип дата, то можно выбрать формат: дата, время либо дата время. вот реквизит именно формат время

(6) это дает в результате строку
+(6) Дальше как с датой

время = дата(‘00010101’) + (Дата-НачалоДня(Дата));

(7) При выборе значения формата — Время используется нулевая дата.

(5) да, надо именно так.

(7) В 1С времени без даты не бывает по определению. Как вариант можно использовать «нулевую дату» (01.01.0001) но это черевато возможными траблами в будущем.

поэтому если нужен формат «время», то сохраняйте признак форматной строки и используйте «текущую дату» или например «фиксированную дату» 01.01.2010 (но это зависит от бизнес-логики)

(13) Использование «нулевой» даты является штатным режимом работы с временем в 1С. О каких подводных камнях вы говорите?

Я не услышал, какую прикладныю задачу пытается решить автор, и не представляю, как ему, бедному, помочь.

(10) так получилось, спасибо!!

(14) клиент хочет, чтоб при создание дока в тч можно было проставлять время посещения, чтоб можно было менять, но если не заполнено, то по умолчанию ставилось текущее.

(14) всё что входит в синтаксис — штатно. Но из практики грабли с «нулевой датой» — типичны. к сожалению многие прогеры не проводят контроль на наличие «нулевой даты» (особенно если дата нулевая, а вот время — нет)

(16) Вы неверно оценили задачу.

В прикладном смысле «время посещения» неразрывно связано с датой посещения, поэтому используйте текущую дату полностью!

В форме документа, в колонке табличной части можно указать формат отображения!
В этом случае будет сохраняться правильное значение, а отображаться — нужное по заданию.
В запросе всегда легко можно обрезать дату, оставив время, а вот наоборот — привязать время к дате — уже сложнее. В 1С не определен оператор + для значений типа «Дата».

(17) «Типичные» — они хотябы гуглятся, или только в вашем сознании на уровне рефлексов?

(18) «На уровне рефлексов»: «В 1С не определен оператор + для значений типа «Дата».(с) — это глупости

Дата1 = Дата2 + 200; — нормальный оператор для переменной Дата1, Дата2 с типом дата

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

ПРИМЕРЫ КОДА 1С

Дата в 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:

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

//способ №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 — ПустаяДата );

Сообщить ( «Дата fs10lh1-5 cf2″>+ Результат ); // Дата = 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 секунде времени может быть несколько тысяч документов, и для определения последовательности

// использовать поле «Дата» из документа. Необходимо использовать МоментВремени(), который равен Дата + Ссылка.

// И еще нужно иметь ввиду, что Ссылка — это не только УИД, но и идентификатор типа документа.

// Поэтому при упорядочивании внутри одной секунды сначала идут документы одного типа, а потом уже другого.

Работа с датами в 1С

Дата в 1С один из примитивных типов данных в системе. Дата всегда имеет формат год, месяц, день, час, минута, секунда. Таким образом, переменная типа дата содержит не только дату, но и время.

Очевидно, что очень часто программистам приходится работать с датой и временем и естественно, по мере работы возникают вопросы, ответы на которые приходится где то искать. Я накидал для себя небольшую шпаргалку по работе с датами.

Хранение дат в системе

В базе данных даты хранятся с точностью до секунд. Для реквизитов типа “дата” можно установить вариант хранения “дата и время”, “только дата”, “только время”.

Переменные типа “дата” всегда представляют дату с секундами. Отсчет дат ведется с Рождества Христова (наша эра), т.е. с 01.01.0001 00:00:00 по Григорианскому календарю. Начальная дата – это не совсем дата. Это значение в системе используется для представления “пустой даты” (аналог пустой ссылки для ссылочных типов или пустой строки “” для строкового типа).

Максимальная дата – 31.12.3999 23:59:59

Как получить текущую дату и время?

Дата = ТекущаяДата(); 

Как явно указать нужную дату?

  • Литералом встроенного языка вида ‘ГГГГММДДччммсс’ :
'20201103160457' // вернет значение 03.11.2020 16:04:57 '2021.05.09:11:00:05' // получим 09.05.2021 11:00:05 
  • Функцией глобального контекста Дата():
Дата(2020, 06, 4, 18,45, 23) // вернет значение 04.06.2020 18:45:23 Дата(2021, 2, 16) // вернет значение 16.02.2021 0:00:00 
  • Если нам необходимо в тексте запроса указать конкретную дату — тогда используем литерал ДАТАВРЕМЯ():
ДАТАВРЕМЯ(2019, 10, 04) 

Пустая дата в 1С

В текстах модулей
Дата 
 Запрос   Запрос  

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

Ваш адрес email не будет опубликован. Обязательные поля помечены *