Разница между датами в запросе

Получение разницы между датами в запросе формата: "Дней; часов; минут"
ПРАВИЛЬНЫЙ КОД (ОТ i132) ОБРАБОТКУ ИСПРАВИЛ!!!

Ситуация следующая: Возникла необходимость получения времени отработки поручения.
В списке (1С 8.2 управляемые формы) документа есть 2 даты дата создания документа и дата его закрытия надо выводить в список разность между датами в формате (дн. час. мин.)
Думал все просто и банально, но не тут то было это все норм делается если у тебя 8.1 например. А здесь (8.2) динамический список который строится из запроса.
Вообще помучался я и решил править запрос…. Понял что всё гораздо хуже чем я это себе представлял и не найдя другого выхода / решения данной проблемы на просторах интернета, я сделал ЭТО: РазностьДатВЗапросе.epf (Хотел выложить код, но надо покупать обработку «разукрашку», вообщем кому надо будет пишите в личку я обязательно вышлю!)

PS: строго не судите первая публикация

PSS: о пользе данного запроса сужу по сообщениям в интернете … были люди которым это реально было нужно, но им давали глупые ответы… типо РАЗНОСТЬДАТ(,,Час) и т.д.

 

ВОТ ЭТО ПРАВИЛЬНЫЙ КОД (ОТ i132) ОБРАБОТКУ ИСПРАВИЛ!!!

   

    Запрос = Новый Запрос;
   
Запрос.Текст =
       
«ВЫБРАТЬ
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,
        |   РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе
        |ПОМЕСТИТЬ ВремяВсе
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВЫБОР
        |       КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, ДЕНЬ, ВремяВсе.ДниВсе) > &ДатаК
        |           ТОГДА ВремяВсе.ДниВсе — 1
        |       ИНАЧЕ ВремяВсе.ДниВсе
        |   КОНЕЦ КАК ДниВсе,
        |   ВЫБОР
        |       КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, ЧАС, ВремяВсе.ЧасыВсе) > &ДатаК
        |           ТОГДА ВремяВсе.ЧасыВсе — 1
        |       ИНАЧЕ ВремяВсе.ЧасыВсе
        |   КОНЕЦ КАК ЧасыВсе,
        |   ВЫБОР
        |       КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, МИНУТА, ВремяВсе.МинутыВсе) > &ДатаК
        |           ТОГДА ВремяВсе.МинутыВсе — 1
        |       ИНАЧЕ ВремяВсе.МинутыВсе
        |   КОНЕЦ КАК МинутыВсе,
        |   ВремяВсе.СекундыВсе
        |ПОМЕСТИТЬ ВремяКор
        |ИЗ
        |   ВремяВсе КАК ВремяВсе
        |;
        |
        |////////////////////////////////////////////////////////////////////////////////
        |ВЫБРАТЬ
        |   ВремяКор.ДниВсе КАК Дни,
        |   ВремяКор.ЧасыВсе — ВремяКор.ДниВсе * 24 КАК Часы,
        |   ВремяКор.МинутыВсе — ВремяКор.ЧасыВсе * 60 КАК Минуты,
        |   ВремяКор.СекундыВсе — ВремяКор.МинутыВсе * 60 КАК Секунды
        |ИЗ
        |   ВремяКор КАК ВремяКор»
;

    Запрос.УстановитьПараметр(«ДатаН»,Объект.ДатаН);
   
Запрос.УстановитьПараметр(«ДатаК»,Объект.ДатаК);

    Результат = Запрос.Выполнить();
   
ВыборкаДетальныеЗаписи = Результат.Выбрать();

    Если ВыборкаДетальныеЗаписи.Следующий() тогда
       
Сообщить(«»+ВыборкаДетальныеЗаписи.Дни+» «+ВыборкаДетальныеЗаписи.Часы+» «+ВыборкаДетальныеЗаписи.Минуты+» «+ВыборкаДетальныеЗаписи.Секунды+» «);
    КонецЕсли;;

25 Comments

  1. ediks

    А не покупайте «разукрашку» — возьмите с диска ИТС аналогичную. 😀

    Reply
  2. Trakt0risT

    Понял… щас поищу, отредактирую!

    Reply
  3. fishca

    да и скриншот запроса из конфигуратора еще никто не отменял 🙂

    Reply
  4. Trakt0risT

    Получилось) А скрином запрос большой )))

    Ну вот так нормально должно быть.

    Reply
  5. i132

    можно сделать проще:

    ВЫБРАТЬ

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе

    ПОМЕСТИТЬ ВремяВсе

    ;

    ////////////////////////////////////////////////////////////­////////////////////

    ВЫБРАТЬ

    ВремяВсе.ДниВсе как Дни,

    ВремяВсе.ЧасыВсе-ВремяВсе.ДниВсе*24 как Часы,

    ВремяВсе.МинутыВсе-ВремяВсе.ЧасыВсе*60 как Минуты,

    ВремяВсе.СекундыВсе-ВремяВсе.МинутыВсе*60 как Секунды

    ИЗ

    ВремяВсе КАК ВремяВсе

    Reply
  6. Trakt0risT

    (5) i132, Выполнил Ваш код, но ничего не вышло объясню почему наглядно!!! (я пробовал очень много вариантов!)

    Reply
  7. i132

    (6) ой извините не проверил переход 23:59:59 — 00:00:01 вот исправленный запрос:

    ВЫБРАТЬ

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе

    ПОМЕСТИТЬ ВремяВсе

    ;

    ////////////////////////////////////////////////////////////­////////////////////

    ВЫБРАТЬ

    Выбор Когда ДобавитьКДате(&ДатаН,День,ВремяВсе.ДниВсе)>&ДатаК Тогда ДниВсе-1

    Иначе ВремяВсе.ДниВсе Конец Как ДниВсе,

    Выбор Когда ДобавитьКДате(&ДатаН,Час,ВремяВсе.ЧасыВсе)>&ДатаК Тогда ЧасыВсе-1

    Иначе ВремяВсе.ЧасыВсе Конец Как ЧасыВсе,

    Выбор Когда ДобавитьКДате(&ДатаН,МИНУТА,ВремяВсе.МинутыВсе)>&ДатаК Тогда МинутыВсе-1

    Иначе ВремяВсе.МинутыВсе Конец Как МинутыВсе,

    ВремяВсе.СекундыВсе

    ПОМЕСТИТЬ ВремяКор

    ИЗ

    ВремяВсе

    ;

    ////////////////////////////////////////////////////////////­////////////////////

    Выбрать

    ВремяКор.ДниВсе как Дни,

    ВремяКор.ЧасыВсе-ВремяКор.ДниВсе*24 как Часы,

    ВремяКор.МинутыВсе-ВремяКор.ЧасыВсе*60 как Минуты,

    ВремяКор.СекундыВсе-ВремяКор.МинутыВсе*60 как Секунды

    ИЗ

    ВремяКор

    РS маленькая хитрость: если полсе слов Запрос.Текст=встать на начало следущей строки — конструктор поместит запрос с этой позициии -без большого отступа.

    Reply
  8. fishca

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

    Reply
  9. V_V_V

    (7) Разницу дат победил легко. А теперь прекращаем заниматься фигней и оптимизируем запросы в УТП… 🙂

    Reply
  10. Trakt0risT

    (7) i132, Это реально круто! Молодец.

    Я конечно завтра проверю! ))

    Reply
  11. Trakt0risT

    (7) i132, Запрос супер, проверил все работает!

    Обработку исправил! публикацию тоже!

    Reply
  12. Trakt0risT

    Одно обидно я так и не смог применить Код i132.

    Потому что запрос динамического списка не поддерживает вложенные таблицы… и мне пришлось вернуться к моему первому варианту ( обидно.

    Reply
  13. i132

    12. опять поймали на ощибке -пришлось проверить как работает динамический список — вложенные таблицы он как раз поддерживает (проверил на фаловом варианте) -то что не поддерживает пакетные запросы не обратил внимание.

    Сразу была мысль что можно было делать вложеннымит запросами — но тогда получается не так красиво.

    Такой запрос работает в динамическом списке (проверил):

    ВЫБРАТЬ

    ВремяКор.МинутыВсе КАК Минуты,

    ВремяКор.СекундыВсе — ВремяКор.МинутыВсе * 60 КАК Секунды

    ИЗ (ВЫБРАТЬ

    ВЫБОР

    КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, МИНУТА, ВремяВсе.МинутыВсе) > &ДатаК

    ТОГДА ВремяВсе.МинутыВсе — 1

    ИНАЧЕ ВремяВсе.МинутыВсе

    КОНЕЦ КАК МинутыВсе,

    ВремяВсе.СекундыВсе КАК СекундыВсе

    ИЗ (ВЫБРАТЬ

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,

    РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе

    ) КАК ВремяВсе

    ) КАК ВремяКор

    Reply
  14. Trakt0risT

    (13) i132, М-да теперь точно не поспоришь! ))) Работает…Супер ) Спасибо большое … всё грамотно.

    PS: Перепутал пакетный с вложенными 😉

    Reply
  15. AlexO

    Автор, так а чем РАЗНОСТЬДАТ не устроила? получил и пересчитал ))

    Получается, обработка не к документу — а вручную даты вставлять?

    Reply
  16. Trakt0risT

    (15) AlexO, Ту немного сложнее РАЗНОСТЬДАТ выдает данные в ВСЕГОСекундах, ВсегоМинут и т.д. Тоесть есть секунд может быть очень много, а не 60 как должно быть. Попробуй ).

    Это обработка для демонстрации кода, тоесть теперь кидаешь в неё любой документ и вместо ДатаН и ДатаК подставляешь любые даты из документа.

    Делалось для динамического списка 8.2

    Reply
  17. Trakt0risT

    Вопрос в продолжение извращения:

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

    Ну тоесть: Есть колонка Дни 6 есть часы 20 есть минуты 13, как сделать одну колонку «6 дн. 20 ч. 13 м.»

    Так и не смог победить!

    НУ или резонный вопрос можно ли объединить в списке (динамическом) Несколько колонок в одну!

    Reply
  18. v.l.

    Боян.

    У меня валялась чья-то обработка, с елочкой на форме и показывающая время до нового года..

    Сделана одним простым запросом, без временных таблиц.

    Reply
  19. i132

    (17) не знаю — не получается… :-/

    зато запрос можно написать проще 😉

    ВЫБРАТЬ

    ДЕНЬГода(СмещеннаяДата)-1+(Год(СмещеннаяДата)-1)*365 как Дни,

    Час(СмещеннаяДата) как Часы,

    Минута(СмещеннаяДата) как Минуты,

    Секунда(СмещеннаяДата) как Секунды

    Из (Выбрать

    ДобавитьКДате(ДАТАВРЕМЯ(1,1,1),СЕКУНДА,РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА)) Как СмещеннаяДата

    ) как Подзапрос

    Если надо измените запрос на случай больше 4х лет, с учетом висосоксных лет.

    Reply
  20. AlexO

    (19) i132,

    ага, т.е. следующий високосный год не учтен? 😉

    Reply
  21. detec

    Было бы замечательно, если в запросе отображалась бы ещё разница в годах, месяцах и днях.

    Reply
  22. shomo

    Да с высокосными годами какая-то проблема…. хотя все правильно и система должна была самостоятельно это отработать…

    Reply
  23. i132

    (22) в чем проблема с високосными годами? — в запросе (19) надо учитывать что в 0004 году 366 дней.

    (17) (число=>Строка) можно извращаться как http://kb.mista.ru/article.php?id=666.

    разницу времени можно пердставить как «1:01:01» -Вывести колонку запроса(19) СмещеннаяДата с форматом время(«ДЛФ=T»)

    еще вариант время 2ч 13минут преобразовать в число 213.00 (ч*100+м*1+с*0.01) и Вывести с форматом (ЧДЦ=2; ЧРД=м; ЧРГ=ч; ЧГ=2) => получится 2ч13м00

    Reply
  24. i132

    Еще варант преобразования в запросе числа в строку: http://forum.mista.ru/topic.php?id=388253#23

    ЧислоСтрокой = «00»;

    Для N = 0 По 99 Цикл

    ЧислоСтрокой = ЧислоСтрокой + Формат(N,»ЧЦ=2; ЧВН=»);

    КонецЦикла;

    |»»20″» + ПОДСТРОКА(&ЧислоСтрокой, (ГОД(&ТекДата) — 2000) * 2 + 1, 2)

    |+ «»/»» + ПОДСТРОКА(&ЧислоСтрокой, МЕСЯЦ(&ТекДата) * 2 + 1, 2)

    | + «»/»» + ПОДСТРОКА(&ЧислоСтрокой, ДЕНЬ(&ТекДата) * 2 + 1, 2) КАК ДатаСтрокой,

    Reply
  25. Trakt0risT

    Полезный код возьму на заметку. ))

    Reply

Leave a Comment

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