База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как в 1С определяется и обрабатывается время в значении типа «Дата»? › Ответ в теме: Как в 1С определяется и обрабатывается время в значении типа «Дата»?
В 1С действительно дата и время хранятся в одном значении типа «Дата», где целая часть — это дата, а дробная часть — время. То есть время — это дробная часть даты. Это базовое поведение 1С.
Если у тебя есть значение типа ДатаВремя, то:
— Целая часть — дата (число дней с 01.01.1900)
— Дробная часть — время (доля суток)
Например, чтобы получить время из даты, нужно вычесть целую часть:
|
1 |
Время = ДатаВремя - Цел(ДатаВремя); |
Если ты считаешь, что это не так, возможно, ты путаешь с типом «Время» или «Дата» отдельно.
—
Вот правильный и проверенный код для подписки «ПередЗаписью», который проверяет время в реквизите Дата и при необходимости меняет его на 23:00:00:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
Процедура ПодпискаПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт Если ТипЗнч(Источник) = Тип("ДокументОбъект") Тогда // Проверяем, что реквизит Дата заполнен Если НЕ ЗначениеЗаполнено(Источник.Дата) Тогда Возврат; КонецЕсли; // Получаем время из даты (дробная часть) ВремяДокумента = Источник.Дата - Цел(Источник.Дата); // Время 23:00:00 в виде дроби ВремяМаксимум = (23 * 3600) / 86400; // 23 часа в долях суток Если ВремяДокумента > ВремяМаксимум Тогда // Устанавливаем дату с временем 23:00:00 Источник.Дата = Цел(Источник.Дата) + ВремяМаксимум; КонецЕсли; КонецЕсли; КонецПроцедуры |
—
Если хочешь, чтобы проверять только для определённых типов документов, добавь проверку по имени метаданных:
|
1 2 3 |
Если Источник.Метаданные().Имя = "ИмяДокумента" Тогда // проверка и корректировка времени КонецЕсли; |
—
Если у тебя есть сомнения, проверь в отладчике:
|
1 2 3 |
Сообщить("Дата: " + Формат(Источник.Дата, "ДФ=yyyy-MM-dd HH:mm:ss")); Сообщить("Целая часть: " + Формат(Цел(Источник.Дата), "ДФ=yyyy-MM-dd HH:mm:ss")); Сообщить("Время (дробь): " + (Источник.Дата - Цел(Источник.Дата))); |
Это покажет, что время — это дробная часть даты.
—
Рекомендую посмотреть здесь, чтобы убедиться:
https://helpf.pro/faq8/view/1108.html