Как рассчитывать интервал между датами

С помощью пользовательских сценариев можно рассчитать количество дней между двумя датами.

Расчёт длительности командировки

В качестве примера рассмотрим кейс с созданием командировки: с помощью сценария рассчитаем длительность командировки в днях.

Добавим в контекст приложения переменную типа Дата (назовем её Дата окончания командировки) и переменную типа Число (Длительность командировки в днях).

Откроем форму создания в дизайнере интерфейсов и добавим контекстные переменные Дата окончания командировки и Длительность командировки в днях на форму.
Последнюю сделаем доступной только для чтения. Будем считать, что командировка начинается в день создания элемента приложения. Текущую дату на день создания будем объявлять в сценарии.

Перейдём в настройки переменной Дата окончания командировки, нажав на шестерёнку. На вкладке События создадим сценарий на изменение значения. Откроем созданную функцию, перейдём на вкладку Сценарии и напишем сценарий.

Сценарий

async function caclDays(): Promise<void> {

        /* Обращаемся к переменной, на изменение которой завязан сценарий,
        и ставим условие, что код будет выполняться, только если она определена */
        if (Context.data.trip_end_date) {

        // Создаём новую переменную, в которую передаём текущую дату с помощью конструкции:
        let currentDate = new TDate();
        
        /* В переменную из контекста записываем количество дней, вычитая из установленной даты окончания командировки текущую дату.
        С помощью метода `asDateTime` представим обе переменные в формате 
        Дата/Время (тип Дата необходимо привести к формату Дата/Время, чтобы иметь доступ к методу расчета количества дней).
        Затем, используя метод unix, представим обе даты в виде количества секунд, прошедших от 00:00:00 01.01.1970
        Вычтем одно значение из другого; полученный результат переведём из секунд в дни, поделив его на произведение 60x60x24
        (60 секунд, 60 минут и 24 часа) */
        
        Context.data.trip_duration_in_days = (Context.data.trip_end_date.asDatetime(new TTime(0, 0, 0, 0)).unix() - currentDate.asDatetime(new TTime(0, 0, 0, 0)).unix()) / (24 * 60 * 60);
       }
}

Результат

Как только пользователь вводит дату окончания командировки, количество дней успешно записывается на форму создания элемента.

Расчёт количества дней на выполнение заказа

Рассмотрим ещё один кейс. Необходимо посчитать количество рабочих дней, которые будут затрачены на выполнение заказа (в соответствии с системным производственным календарём). На форме создания есть поля типа Дата: Дата начала производства и Планируемое время отгрузки. Переходим в настройки поля Планируемое время отгрузки и создаём сценарий на изменение значения на вкладке Событие.

Сценарий

/* Передаём в переменную количество рабочих часов между двумя датами с помощью
   метода `getWorkingTime`, который ссылается на рабочий календарь.
   Чтобы метод сработал корректно, оба аргумента должны быть представлены в формате Дата/Время,    
   поэтому переменную `Context.data.start_date` необходимо преобразовать из формата Дата
   в формат Дата/Время, указав время 00:00 */
   const workingTime = await System.productionSchedule.getWorkingTime(Context.data.start_date.asDatetime(new TTime(0, 0, 0, 0)), Context.data.end_date);

   // Записываем результат в виде рабочих дней, разделив количество часов на 8 (так как в рабочем дне восемь часов) и округлив значение
   Context.data.production_days = Math.floor(workingTime.hours / 8);

Результат

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