ПРАВИЛЬНЫЙ КОД (ОТ i132) ОБРАБОТКУ ИСПРАВИЛ!!!
Ситуация следующая: Возникла необходимость получения времени отработки поручения.
В списке (1С 8.2 управляемые формы) документа есть 2 даты дата создания документа и дата его закрытия надо выводить в список разность между датами в формате (дн. час. мин.)
Думал все просто и банально, но не тут то было это все норм делается если у тебя 8.1 например. А здесь (8.2) динамический список который строится из запроса.
Вообще помучался я и решил править запрос…. Понял что всё гораздо хуже чем я это себе представлял и не найдя другого выхода / решения данной проблемы на просторах интернета, я сделал ЭТО: РазностьДатВЗапросе.epf (Хотел выложить код, но надо покупать обработку «разукрашку», вообщем кому надо будет пишите в личку я обязательно вышлю!)
PS: строго не судите первая публикация
PSS: о пользе данного запроса сужу по сообщениям в интернете … были люди которым это реально было нужно, но им давали глупые ответы… типо РАЗНОСТЬДАТ(,,Час) и т.д.
ВОТ ЭТО ПРАВИЛЬНЫЙ КОД (ОТ i132) ОБРАБОТКУ ИСПРАВИЛ!!!
Запрос = Новый Запрос;
Запрос.Текст =
«ВЫБРАТЬ
| РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
| РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,
| РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,
| РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе
|ПОМЕСТИТЬ ВремяВсе
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВЫБОР
| КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, ДЕНЬ, ВремяВсе.ДниВсе) > &ДатаК
| ТОГДА ВремяВсе.ДниВсе — 1
| ИНАЧЕ ВремяВсе.ДниВсе
| КОНЕЦ КАК ДниВсе,
| ВЫБОР
| КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, ЧАС, ВремяВсе.ЧасыВсе) > &ДатаК
| ТОГДА ВремяВсе.ЧасыВсе — 1
| ИНАЧЕ ВремяВсе.ЧасыВсе
| КОНЕЦ КАК ЧасыВсе,
| ВЫБОР
| КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, МИНУТА, ВремяВсе.МинутыВсе) > &ДатаК
| ТОГДА ВремяВсе.МинутыВсе — 1
| ИНАЧЕ ВремяВсе.МинутыВсе
| КОНЕЦ КАК МинутыВсе,
| ВремяВсе.СекундыВсе
|ПОМЕСТИТЬ ВремяКор
|ИЗ
| ВремяВсе КАК ВремяВсе
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВремяКор.ДниВсе КАК Дни,
| ВремяКор.ЧасыВсе — ВремяКор.ДниВсе * 24 КАК Часы,
| ВремяКор.МинутыВсе — ВремяКор.ЧасыВсе * 60 КАК Минуты,
| ВремяКор.СекундыВсе — ВремяКор.МинутыВсе * 60 КАК Секунды
|ИЗ
| ВремяКор КАК ВремяКор»;
Запрос.УстановитьПараметр(«ДатаН»,Объект.ДатаН);
Запрос.УстановитьПараметр(«ДатаК»,Объект.ДатаК);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() тогда
Сообщить(«»+ВыборкаДетальныеЗаписи.Дни+» «+ВыборкаДетальныеЗаписи.Часы+» «+ВыборкаДетальныеЗаписи.Минуты+» «+ВыборкаДетальныеЗаписи.Секунды+» «);
КонецЕсли;;





А не покупайте «разукрашку» — возьмите с диска ИТС аналогичную. 😀
Понял… щас поищу, отредактирую!
да и скриншот запроса из конфигуратора еще никто не отменял 🙂
Получилось) А скрином запрос большой )))
Ну вот так нормально должно быть.
можно сделать проще:
ВЫБРАТЬ
////////////////////
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе
ПОМЕСТИТЬ ВремяВсе
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
ВремяВсе.ДниВсе как Дни,
ВремяВсе.ЧасыВсе-ВремяВсе.ДниВсе*24 как Часы,
ВремяВсе.МинутыВсе-ВремяВсе.ЧасыВсе*60 как Минуты,
ВремяВсе.СекундыВсе-ВремяВсе.МинутыВсе*60 как Секунды
ИЗ
ВремяВсе КАК ВремяВсе
(5) i132, Выполнил Ваш код, но ничего не вышло объясню почему наглядно!!! (я пробовал очень много вариантов!)
(6) ой извините не проверил переход 23:59:59 — 00:00:01 вот исправленный запрос:
ВЫБРАТЬ
////////////////////
////////////////////
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ЧАС) КАК ЧасыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, ДЕНЬ) КАК ДниВсе
ПОМЕСТИТЬ ВремяВсе
;
////////////////////////////////////////////////////////////
ВЫБРАТЬ
Выбор Когда ДобавитьКДате(&ДатаН,День,ВремяВсе.ДниВсе)>&ДатаК Тогда ДниВсе-1
Иначе ВремяВсе.ДниВсе Конец Как ДниВсе,
Выбор Когда ДобавитьКДате(&ДатаН,Час,ВремяВсе.ЧасыВсе)>&ДатаК Тогда ЧасыВсе-1
Иначе ВремяВсе.ЧасыВсе Конец Как ЧасыВсе,
Выбор Когда ДобавитьКДате(&ДатаН,МИНУТА,ВремяВсе.МинутыВсе)>&ДатаК Тогда МинутыВсе-1
Иначе ВремяВсе.МинутыВсе Конец Как МинутыВсе,
ВремяВсе.СекундыВсе
ПОМЕСТИТЬ ВремяКор
ИЗ
ВремяВсе
;
////////////////////////////////////////////////////////////
Выбрать
ВремяКор.ДниВсе как Дни,
ВремяКор.ЧасыВсе-ВремяКор.ДниВсе*24 как Часы,
ВремяКор.МинутыВсе-ВремяКор.ЧасыВсе*60 как Минуты,
ВремяКор.СекундыВсе-ВремяКор.МинутыВсе*60 как Секунды
ИЗ
ВремяКор
РS маленькая хитрость: если полсе слов Запрос.Текст=встать на начало следущей строки — конструктор поместит запрос с этой позициии -без большого отступа.
(4) рука потянулась к минусу, быстрее исправляй запрос чтобы выглядел по человечески
(7) Разницу дат победил легко. А теперь прекращаем заниматься фигней и оптимизируем запросы в УТП… 🙂
(7) i132, Это реально круто! Молодец.
Я конечно завтра проверю! ))
(7) i132, Запрос супер, проверил все работает!
Обработку исправил! публикацию тоже!
Одно обидно я так и не смог применить Код .
Потому что запрос динамического списка не поддерживает вложенные таблицы… и мне пришлось вернуться к моему первому варианту ( обидно.
12. опять поймали на ощибке -пришлось проверить как работает динамический список — вложенные таблицы он как раз поддерживает (проверил на фаловом варианте) -то что не поддерживает пакетные запросы не обратил внимание.
Сразу была мысль что можно было делать вложеннымит запросами — но тогда получается не так красиво.
Такой запрос работает в динамическом списке (проверил):
ВЫБРАТЬ
ВремяКор.МинутыВсе КАК Минуты,
ВремяКор.СекундыВсе — ВремяКор.МинутыВсе * 60 КАК Секунды
ИЗ (ВЫБРАТЬ
ВЫБОР
КОГДА ДОБАВИТЬКДАТЕ(&ДатаН, МИНУТА, ВремяВсе.МинутыВсе) > &ДатаК
ТОГДА ВремяВсе.МинутыВсе — 1
ИНАЧЕ ВремяВсе.МинутыВсе
КОНЕЦ КАК МинутыВсе,
ВремяВсе.СекундыВсе КАК СекундыВсе
ИЗ (ВЫБРАТЬ
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА) КАК СекундыВсе,
РАЗНОСТЬДАТ(&ДатаН, &ДатаК, МИНУТА) КАК МинутыВсе
) КАК ВремяВсе
) КАК ВремяКор
(13) i132, М-да теперь точно не поспоришь! ))) Работает…Супер ) Спасибо большое … всё грамотно.
PS: Перепутал пакетный с вложенными 😉
Автор, так а чем РАЗНОСТЬДАТ не устроила? получил и пересчитал ))
Получается, обработка не к документу — а вручную даты вставлять?
(15) AlexO, Ту немного сложнее РАЗНОСТЬДАТ выдает данные в ВСЕГОСекундах, ВсегоМинут и т.д. Тоесть есть секунд может быть очень много, а не 60 как должно быть. Попробуй ).
Это обработка для демонстрации кода, тоесть теперь кидаешь в неё любой документ и вместо ДатаН и ДатаК подставляешь любые даты из документа.
Делалось для динамического списка 8.2
Вопрос в продолжение извращения:
Как в запросе объединить колонки в одну???
Ну тоесть: Есть колонка Дни 6 есть часы 20 есть минуты 13, как сделать одну колонку «6 дн. 20 ч. 13 м.»
Так и не смог победить!
НУ или резонный вопрос можно ли объединить в списке (динамическом) Несколько колонок в одну!
Боян.
У меня валялась чья-то обработка, с елочкой на форме и показывающая время до нового года..
Сделана одним простым запросом, без временных таблиц.
(17) не знаю — не получается… :-/
зато запрос можно написать проще 😉
ВЫБРАТЬ
ДЕНЬГода(СмещеннаяДата)-1+(Год(СмещеннаяДата)-1)*365 как Дни,
Час(СмещеннаяДата) как Часы,
Минута(СмещеннаяДата) как Минуты,
Секунда(СмещеннаяДата) как Секунды
Из (Выбрать
ДобавитьКДате(ДАТАВРЕМЯ(1,1,1),СЕКУНДА,РАЗНОСТЬДАТ(&ДатаН, &ДатаК, СЕКУНДА)) Как СмещеннаяДата
) как Подзапрос
Если надо измените запрос на случай больше 4х лет, с учетом висосоксных лет.
(19) i132,
ага, т.е. следующий високосный год не учтен? 😉
Было бы замечательно, если в запросе отображалась бы ещё разница в годах, месяцах и днях.
Да с высокосными годами какая-то проблема…. хотя все правильно и система должна была самостоятельно это отработать…
(22) в чем проблема с високосными годами? — в запросе (19) надо учитывать что в 0004 году 366 дней.
(17) (число=>Строка) можно извращаться как .
разницу времени можно пердставить как «1:01:01» -Вывести колонку запроса(19) СмещеннаяДата с форматом время(«ДЛФ=T»)
еще вариант время 2ч 13минут преобразовать в число 213.00 (ч*100+м*1+с*0.01) и Вывести с форматом (ЧДЦ=2; ЧРД=м; ЧРГ=ч; ЧГ=2) => получится 2ч13м00
Еще варант преобразования в запросе числа в строку:
ЧислоСтрокой = «00»;
Для N = 0 По 99 Цикл
ЧислоСтрокой = ЧислоСтрокой + Формат(N,»ЧЦ=2; ЧВН=»);
КонецЦикла;
|»»20″» + ПОДСТРОКА(&ЧислоСтрокой, (ГОД(&ТекДата) — 2000) * 2 + 1, 2)
|+ «»/»» + ПОДСТРОКА(&ЧислоСтрокой, МЕСЯЦ(&ТекДата) * 2 + 1, 2)
| + «»/»» + ПОДСТРОКА(&ЧислоСтрокой, ДЕНЬ(&ТекДата) * 2 + 1, 2) КАК ДатаСтрокой,
Полезный код возьму на заметку. ))