Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
01 авг 2021, 14:04

Вычисление времени в пути

Автор Morikama, 11 фев 2021, 03:08

0 Пользователей и 1 гость просматривают эту тему.

Morikama

Друзья, приветствую! Помогите, пожалуйста, бьюсь уже почти сутки над элементарным.
В табличной части документа есть колонки "ВремяОтправления" "ВремяВпути" и "ВремяПрибытия".
Установлен формат ДФ=ЧЧ:мм
Таким образом, надо, чтобы 1) время в пути расчитывалось как "Время Прибытия - Время отправления" и выдавалось как ЧЧ:мм.
Помимо этого, если прибытие происходит в следующих сутках, надо в отдельной колонке поставить текстом (+1)

Пробовал вот такой код, не работает ничего

&НаСервере
Функция РазностьВремени(ВремяОтправления, ВремяПрибытия)
       Разность = ВремяПрибытия - ВремяОтправления;
    Если Разность > 0 Тогда
        Часов = Цел(Разность / 3600);
        Минут = Цел((Разность - Часов * 3600) / 60);
        Секунд = Разность - Часов * 3600 - Минут * 60;
      Возврат "ЧЧ:мм";
    Иначе
        Возврат "Разность";
    КонецЕсли;
КонецФункции


&НаКлиенте
Процедура РасписаниеВремяПрибытияПриИзменении(Элемент)
   Строка = Элементы.Расписание.ТекущиеДанные;
   ВремяПрибытия = Строка.ВремяПрибытия;
   ВремяОтправления = Строка.ВремяОтправления;
   Строка.ВремяВпути = РазностьВремени(ВремяОтправления, ВремяПрибытия);
КонецПроцедуры


antoneus

Какой тип у ВремяПрибытия, ВремяОтправления и ВремяВПути? Код лихой, конечно. Если время прибытия больше времени отправления, функция возвращает строку "ЧЧ:мм", если меньше - строку "Разность".

ls600

Как то так, под свое усмотрение.


&НаСервере
Функция РазностьВремени(ВремяОтправления, ВремяПрибытия)
Разность = ВремяПрибытия - ВремяОтправления;
Если Разность > 0 Тогда
Часов = Цел(Разность / 3600);
Минут = Цел((Разность - Часов * 3600) / 60);
Секунд = Разность - Часов * 3600 - Минут * 60;
Возврат Строка(Часов) + " ч " + ": " + Строка(Минут) + " мин";
Иначе
Возврат "Разность";
КонецЕсли;
КонецФункции

&НаСервере
Функция РазницаВДнях(ВремяОтправления, ВремяПрибытия)
    Если ВремяПрибытия > ВремяОтправления Тогда
        Возврат Окр((ВремяПрибытия - ВремяОтправления)/86400);   
    КонецЕсли;
КонецФункции

&НаКлиенте
Процедура Рассчет(Команда)

СтрокаТЧ = Элементы.Расписание.ТекущиеДанные;
ВремяОтправления = СтрокаТЧ.ВремяОтправления;
ВремяПрибытия = СтрокаТЧ.ВремяПрибытия;
РазностьЧасы = ВремяПрибытия - ВремяОтправления;
Если РазностьЧасы > 86400 Тогда
СтрокаТЧ.Сутки = РазницаВДнях(ВремяОтправления,ВремяПрибытия);
СтрокаТЧ.ВремяВпути = РазностьВремени(ВремяОтправления, ВремяПрибытия)
Иначе
СтрокаТЧ.ВремяВпути = РазностьВремени(ВремяОтправления, ВремяПрибытия);
КонецЕсли;

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


LexaK

еще вариант, всего одна процедура

&НаКлиенте
Процедура РасписаниеВремяПрибытияПриИзменении(Элемент)

Строка = Элементы.Расписание.ТекущиеДанные;
Разность = Строка.ВремяОтправления - Строка.ВремяПрибытия;
ЦелыхДней = Цел(Разность / (24 * 3600) );
Строка.КолонкаДни = ЦелыхДней; //как у вас там колонка с Днями называется?
Строка.ВремяВпути = Дата(1,1,1) + Разность - ЦелыхДней * 24 * 3600; //ВремяВпути  должен быть тип: Дата, формат "ДФ=ЧЧ:мм"
   
КонецПроцедуры
ответ Понравился? (в смысле пригодился?)

Morikama

Друзья, благодарю, сейчас буду пробовать, отпишусь. Не смейтесь над лихим кодом для меня все это тёмный лес :fdbsdfbsd:
[right][color=red][size=7pt]Добавлено: [time]1613054364[/time][/size][/color][/right][hr]
[quote author=LexaK link=topic=76918.msg221011#msg221011 date=1613027886]&НаКлиенте
Процедура РасписаниеВремяПрибытияПриИзменении(Элемент)


[/quote]
Здесь что-то зашевелилось, но расчёт не верный даёт. Время отправления 22:25 указал, время прибытия 00:30, должно быть время в пути 02:05, а выдаёт значение 21:55
В поле индикатора перехода суток булево сделать, при значении БЛ - пусто, при значении БИ - (+1)


Добавлено: 11 фев 2021, 17:41


Цитата: ls600 от 11 фев 2021, 09:24
Как то так, под свое усмотрение.
Это почему-то не заработало

LexaK

что-то по вашей схеме не правильно, если вы только со временем оперируете, то больше суток вообще получаться не должно
переходите на полноразмерный состав даты: ДатаВремя
тогда не важно в какой части суток начался/закончился рейс
и время в пути тоже тогда хорошо бы считать с днями
ответ Понравился? (в смысле пригодился?)

Morikama

Цитата: LexaK от 11 фев 2021, 18:04
Так вот именно, не должно. Время отправления 22:20, прибытие в 00:25 - время в пути 02.05
Даты здесь не нужны. Нужен указатель перехода суток всего лишь, что операция прибытия осуществляется уже на следующий день, собственно, любое прибытие уже после 23:59 будет осуществляться в следующих сутках.
Т.е. строка должна выглядеть так, к примеру:

Отпр   Приб          Впути
22:20  00:25 (+1)    02:05
 
Добавлено: 11 фев 2021, 18:37


Корректно заработал вот этот код:
&НаКлиенте
Процедура РасписаниеВремяПрибытияПриИзменении (Элемент)
Строка = Элементы.Расписание.ТекущиеДанные;
Строка.ВремяВПути = 0;
Вылет = Строка.ВремяОтправления;
Прилет = Строка.ВремяПрибытия;
Если Прилет < Вылет Тогда
Строка.НачБ = (Прилет + 86400 - Вылет) / 60;
Строка.ПереходСуток = Истина;
Иначе Строка.НачБ = (Прилет - Вылет) / 60;
Строка.ПереходСуток = Ложь;
КонецЕсли;
Строка.ВремяВпути = Строка.ВремяВпути + Строка.НачБ * 60;
КонецПроцедуры

LexaK

а если у вас
вылет = 10:20 , а прилет = 10:25
перехода суток нет, так как вылет < прилет
но ведь рейс не может быть 5 минут!!!
тогда надо вводить минимальную продолжительность рейса и ее учитывать

а еще не понял а что такое Строка.НачБ - ?
ответ Понравился? (в смысле пригодился?)

Morikama

Цитата: LexaK от 12 фев 2021, 10:39
вылет = 10:20 , а прилет = 10:25
тогда надо вводить минимальную продолжительность рейса и ее учитывать
а еще не понял а что такое Строка.НачБ - ?
Строка "НачБ" - скрыта в таблице, она для получения временного результата.
При отправлении в 10:20 и прибытии 10:25 перехода суток быть не может, и о том речь не велась, некорректно считалось отправление, напр. 22:50, а прибытие в 01:30 следующих суток.
Я вообще не очень понимаю, каким образом пишутся все эти коды, если нужно производить элементарные операции со временем.
Это всё было в табличной части, а не в табличной не считается ничего, пишет "Преобразование значения к типу Число не может быть выполнено"

LexaK

ЦитироватьПри отправлении в 10:20 и прибытии 10:25 перехода суток быть не может,
Это я понял!!!
я спросил: Рейс может длиться 5 минут???
ответ Понравился? (в смысле пригодился?)

Теги:

Похожие темы (5)

Рейтинг@Mail.ru Rambler's Top100

Поиск