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

Получение разницы между датами в запросе формата: "Дней; часов; минут"
ПРАВИЛЬНЫЙ КОД (ОТ 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 не будет опубликован. Обязательные поля помечены *