Книга знаний

1С:Предприятие / v8 / Приемы программирования / Запросы

v8: Вычисление разности дат в годах, днях и месяцах запросом

Задача: вывести в отчете разность между двумя датами в годах, месяцах и днях, используя копоновку данных, но не добавляя функции в общие модули (т.к. конфигурация на поддержке)Автор статьи: monomo1 | Редакторы:
Последняя редакция №4 от 23.04.08 | История
URL: http://kb.mista.ru/article.php?id=664

Ключевые слова: РазностьДат, разность дат, компоновка данных, стаж, запрос, ЗУП


Этот код можно использовать в расчитываемом поле компановки данных, а если разбить на три части (отдельно расчет годом, отдельно - месяцев, отдельно - дней), то и в обычном запросе.
В коде &Период - это дата, которой заканчивается отсчет, а ДанныеОРаботе.ДатаПриема - дата, с которой начинается отсчет.
Алгоримт работы аналогичен функции из ЗУП'а
Текст функции:
// Процедура вычисляет количество лет, месяцев и дней между двумя датами

//
// Параметры
//  Дата1    – дата, первая дата (более поздняя, часто текущая, стаж определяется по состоянию на эту дату)
//  Дата2    – дата, вторая дата (ранняя дата, с нее начинается "течение" стажа)
//  Лет        – Число, в этот параметр будет записано кол-во лет между двумя датами (Дата1-Дата2)
//  Месяцев    – Число, в этот параметр будет записано кол-во месяцев между двумя датами (Дата1-Дата2)
//  Дней    – Число, в этот параметр будет записано кол-во дней между двумя датами (Дата1-Дата2)
//
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0) Экспорт
   
   Лет        = 0;
   Месяцев    = 0;
   Дней    = 0;
   Если Дата1 > Дата2 Тогда
       
       ВременнаяДата = Дата1;
       Если День(ВременнаяДата) < День(Дата2) Тогда
           Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
           ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
       КонецЕсли;
       Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
           ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
           Месяцев = 12;
       КонецЕсли;
       Лет        = Макс(             Год(ВременнаяДата)        - Год(Дата2),    0);
       Месяцев    = Макс(Месяцев    + Месяц(ВременнаяДата)    - Месяц(Дата2),    0);
       Дней    = Макс(Дней        + День(ВременнаяДата)    - День(Дата2),    0);
       
       // скорректируем отображаемое значение, если "вмешалось" разное количество дней в месяцах
       Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет*12-Месяцев)-Дней*86400) Тогда
           Дней = Дней + (День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
       КонецЕсли;
       
   КонецЕсли;

КонецПроцедуры    // РазобратьРазностьДат


Текст кода вычисляемого поля копоновки данных:

   СТРОКА(
   ВЫБОР
       КОГДА Год(ВЫБОР
                   КОГДА МЕСЯЦ(ВЫБОР
                                   КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                   ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                   ИНАЧЕ &Период
                               КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
                   ТОГДА ДобавитьКДате(ВЫБОР
                                           КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                           ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                           ИНАЧЕ &Период
                                       КОНЕЦ,"МЕСЯЦ",-12)
                   ИНАЧЕ
                       ВЫБОР
                           КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                           ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                           ИНАЧЕ &Период
                       КОНЕЦ
                   КОНЕЦ) - Год(ДанныеОРаботе.ДатаПриема) > 0
       ТОГДА Год(ВЫБОР
                       КОГДА МЕСЯЦ(ВЫБОР
                                       КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                       ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                       ИНАЧЕ &Период
                                   КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
                       ТОГДА ДобавитьКДате(ВЫБОР
                                               КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                               ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                               ИНАЧЕ &Период
                                           КОНЕЦ,"МЕСЯЦ",-12)
                       ИНАЧЕ
                           ВЫБОР
                               КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                               ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                               ИНАЧЕ &Период
                           КОНЕЦ
                       КОНЕЦ) - Год(ДанныеОРаботе.ДатаПриема)
       ИНАЧЕ 0
   КОНЕЦ) + " г. "
   
   +СТРОКА(
   ВЫБОР
       КОГДА ВЫБОР
               КОГДА МЕСЯЦ(ВЫБОР
                               КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                               ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                               ИНАЧЕ &Период
                           КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
                 ТОГДА 12
                 ИНАЧЕ 0
               КОНЕЦ + Месяц(ВЫБОР
                               КОГДА МЕСЯЦ(ВЫБОР
                                               КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                 ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                 ИНАЧЕ &Период
                                             КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
                               ТОГДА ДобавитьКДате(ВЫБОР
                                                       КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                         ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                         ИНАЧЕ &Период
                                                     КОНЕЦ,"МЕСЯЦ",-12)
                                 ИНАЧЕ ВЫБОР
                                             КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                             ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                             ИНАЧЕ &Период
                                       КОНЕЦ
                             КОНЕЦ) - Месяц(ДанныеОРаботе.ДатаПриема) > 0
       ТОГДА ВЫБОР
                   КОГДА МЕСЯЦ(ВЫБОР
                                   КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                   ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                   ИНАЧЕ &Период
                               КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
                   ТОГДА 12
                   ИНАЧЕ 0
             КОНЕЦ  + Месяц(ВЫБОР
                                 КОГДА МЕСЯЦ(ВЫБОР
                                                 КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                 ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                 ИНАЧЕ &Период
                                             КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
                                 ТОГДА ДобавитьКДате(ВЫБОР
                                                         КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                         ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                         ИНАЧЕ &Период
                                                     КОНЕЦ,"МЕСЯЦ",-12)
                                 ИНАЧЕ
                                     ВЫБОР
                                         КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                         ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                         ИНАЧЕ &Период
                                     КОНЕЦ
                                 КОНЕЦ) - Месяц(ДанныеОРаботе.ДатаПриема)
       ИНАЧЕ 0
  КОНЕЦ) +" мес. "
   
+ СТРОКА(ВЫБОР
                       КОГДА (ВЫБОР
                                   КОГДА ДЕНЬ(&Период) < ДЕНЬ(ДанныеОРаботе.ДатаПриема)
                                   ТОГДА РазностьДат(ДобавитьКДате(&Период,"МЕСЯЦ",-1),&Период,"ДЕНЬ")
                                   ИНАЧЕ 0
                             КОНЕЦ    + День(ВЫБОР
                                                 КОГДА МЕСЯЦ(ВЫБОР
                                                                 КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                                 ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                                 ИНАЧЕ &Период
                                                             КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
                                                 ТОГДА ДобавитьКДате(ВЫБОР
                                                                         КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                                         ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                                         ИНАЧЕ &Период
                                                                     КОНЕЦ,"МЕСЯЦ",-12)
                                                 ИНАЧЕ ВЫБОР
                                                             КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                             ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                             ИНАЧЕ &Период
                                                       КОНЕЦ
                                             КОНЕЦ) - День(ДанныеОРаботе.ДатаПриема)) > 0
                       ТОГДА ВЫБОР
                                   КОГДА ДЕНЬ(&Период) < ДЕНЬ(ДанныеОРаботе.ДатаПриема)
                                   ТОГДА РазностьДат(ДобавитьКДате(&Период,"МЕСЯЦ",-1),&Период,"ДЕНЬ")
                                   ИНАЧЕ 0
                             КОНЕЦ    + День(ВЫБОР
                                                 КОГДА МЕСЯЦ(ВЫБОР
                                                                 КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                                 ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                                 ИНАЧЕ &Период
                                                             КОНЕЦ) < МЕСЯЦ(ДанныеОРаботе.ДатаПриема)
                                                 ТОГДА ДобавитьКДате(ВЫБОР
                                                                         КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                                         ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                                         ИНАЧЕ &Период
                                                                     КОНЕЦ,"МЕСЯЦ",-12)
                                                 ИНАЧЕ ВЫБОР
                                                             КОГДА День(&Период) < День(ДанныеОРаботе.ДатаПриема)
                                                             ТОГДА ДобавитьКДате(&Период,"МЕСЯЦ",-1)
                                                             ИНАЧЕ &Период
                                                       КОНЕЦ
                                             КОНЕЦ) - День(ДанныеОРаботе.ДатаПриема)
                       ИНАЧЕ 0
                                                     
                   КОНЕЦ) + " дн."
>                                                                                          

Описание | Рубрикатор | Поиск | ТелепатБот | Захваченные статьи | Установки | Форум
© Станислав Митичкин (Волшебник), 2005-2025 | Mista.ru

Яндекс.Метрика