![]() |
![]() |
![]() |
|
Вопрос возможностей формата даты в 1С | ☑ | ||
---|---|---|---|---|
0
findpol
03.09.25
✎
17:14
|
Отцы, приветствую и сразу поясняю, что такое ТЗ получил от аналитега.
Хотят из реквизита с типом дата получить в форме списка значение вида " 1 д 1 час 1 мин", т.е. срок в днях, часах и минутах. Невозможно же такое сделать форматной строкой, а надо в реквизит уже писать текстом по этому шаблону и текстом выводить. Верно? |
|||
1
Волшебник
03.09.25
✎
17:15
|
Верно. Это же не дата, а интервал
|
|||
2
Kigo_Kigo
03.09.25
✎
17:17
|
ну и сделай дату строкой отфарматируй ее как тебе надао строковыми функциями
|
|||
3
shuhard
03.09.25
✎
17:19
|
(0) всё верно
|
|||
4
Asmody
03.09.25
✎
17:19
|
(0) в реквизите типа Дата написано "03.09.2025 17:19:23"
Это сколько в днях-минутах-часах? |
|||
5
findpol
03.09.25
✎
17:23
|
(4) согласен, но это же люди после старших капитанских курсов пишут.. Всегда кажется, может, пропустил что и они дело говорят.
|
|||
6
Волшебник
03.09.25
✎
17:26
|
(5) они же не программисты
|
|||
7
Tarlich
03.09.25
✎
17:31
|
... (Удалите - сори)
|
|||
8
Asmody
03.09.25
✎
17:31
|
(7) формат ДЛФ=Д не подходит?
|
|||
9
ejikbeznojek
03.09.25
✎
17:34
|
ДФ='д "день" ЧЧ "час" mm "минута"'
Если от пустой даты часы и дни отсчитаны. Ну или посчитать разностью дат, если есть точка отсчёта. |
|||
10
PR
03.09.25
✎
17:34
|
(0) Нельзя, потому что если будет не 1 минута, то будет показываться " д час 1 мин", ну или "0 д 0 час 1 мин"
|
|||
11
Гена
гуру
03.09.25
✎
17:37
|
(0) Здравствуй, сынок. Перевожу на русский язык - от ТЕКУЩЕЙ даты (точное время на компе) хотят видеть свой результат.
|
|||
12
findpol
04.09.25
✎
09:39
|
(9) не выйдет, потому что и так предел это 31 день, а период может быть и 90 дней.
|
|||
13
findpol
03.09.25
✎
17:42
|
(11) не, там у меня есть две даты между которыми нужен интервал. Не от текущей.
|
|||
14
PR
03.09.25
✎
17:46
|
(13) В общем, считай сам, выводи строкой, там не сложно
|
|||
15
Garykom
гуру
03.09.25
✎
17:49
|
Главное чтоб не запросом это...
|
|||
16
Гена
гуру
03.09.25
✎
17:54
|
(13) Х = РАЗНОСТЬДАТ(<Дата1>, <Дата2>, МИНУТА)
далее целое от деления на 24*60 = Дней Дробную часть делим на 60 и берём целое = Часов Евойная дробная часть = Минут |
|||
17
findpol
03.09.25
✎
17:55
|
(14) да, я накидал уже, спасибо. Мне надо по календарю, т.е. будни, рабочие, переход через год, начало/окончание рабочего дня учесть и всё такое.
|
|||
18
findpol
03.09.25
✎
17:56
|
(15) кодом буду делать потому что запросом это если и возможно, то будет такой зверь, что хрен отладишь.
|
|||
19
Климов Сергей
03.09.25
✎
17:59
|
||||
20
findpol
03.09.25
✎
18:04
|
(19) спасибо, Сергей. См (17) - там не просто разность двух дат.
|
|||
21
PR
03.09.25
✎
18:07
|
(15) Да там элементарно в запросе посчитать
|
|||
22
PR
03.09.25
✎
18:07
|
(17) А, ну так ты сразу и сказал бы, тогда точно сам считай
|
|||
23
Гена
гуру
03.09.25
✎
18:21
|
(17) Давайте сюда свой код - мне интересно.
|
|||
24
Волшебник
03.09.25
✎
18:34
|
(23) кхм... Там надо ещё соблюдать масштаб. Если интервал 1 год или хотя бы месяц, то нет смысла показывать часы.
|
|||
25
Garykom
гуру
03.09.25
✎
18:39
|
Имхо я бы выводил только один показатель
В дробном варианте Типа 1.2д или 1.5ч или 10м |
|||
26
findpol
03.09.25
✎
18:40
|
(25) ну так да, но заказчик видит иначе ))
|
|||
27
PR
03.09.25
✎
18:44
|
(26) Рекомендую тебе сразу для сортировки и отбора сделать еще одно поле РазностьВСекундах
|
|||
28
Гена
гуру
03.09.25
✎
18:46
|
Это... так код можно глянуть?
|
|||
29
findpol
03.09.25
✎
19:17
|
(28) я его на коленке накидал в ночи под свою задачу, поэтому там есть неоптимальные вещи, которые, если будет не лень, я перепишу, но на данный момент код сделан как шла моя мысль ))
Есть пока не обработанные моменты как больше двух лет не делал, разные календари в разных годах и т.д. Но, повторюсь, просто накидал для тестов и конкретно у меня календари не мешают. Подробности&НаСервере Функция ПолучитьРабочихМинутМеждуДатами(ЗНАЧ ДатаНачала,ЗНАЧ ДатаОкончания, ЧасН, ЧасО) Если ДатаНачала > ДатаОкончания Тогда ИтогоСрокМинут = 0; ИначеЕсли Год(ДатаНачала) = Год(ДатаОкончания) Тогда Если НачалоДня(ДатаНачала) = НачалоДня(ДатаОкончания) Тогда ИтогоСрокМинут = РабочихМинутВнутриДня(ДатаНачала, ДатаОкончания, ЧасН, ЧасО); Иначе МинутПоГраницам = РабочихМинутПоДвумГраницамИнтервалаОтдельно(ДатаНачала, ДатаОкончания, ЧасН, ЧасО); ДнейМеждуДат = РабочихДнейМеждуИсключаяГраничныеДаты(ДатаНачала, ДатаОкончания); МинутМеждуДат = ДнейМеждуДат * 10 * 60; ИтогоСрокМинут = МинутПоГраницам + МинутМеждуДат; КонецЕсли; ИначеЕсли Год(ДатаНачала) = Год(ДатаОкончания) - 1 Тогда //Первый год ДатаОкончанияПГ = КонецГода(ДатаНачала); Если НачалоДня(ДатаНачала) = НачалоДня(ДатаОкончанияПГ) Тогда МинутПервыйГод = РабочихМинутВнутриДня(ДатаНачала, ДатаОкончанияПГ, ЧасН, ЧасО); Иначе МинутПоГраницам = РабочихМинутПоДвумГраницамИнтервалаОтдельно(ДатаНачала, ДатаОкончанияПГ, ЧасН, ЧасО); ДнейМеждуДат = РабочихДнейМеждуИсключаяГраничныеДаты(ДатаНачала, ДатаОкончанияПГ); МинутМеждуДат = ДнейМеждуДат * 10 * 60; МинутПервыйГод = МинутПоГраницам + МинутМеждуДат; КонецЕсли; //Второй год ДатаНачалаВГ = НачалоГода(ДатаОкончания); Если НачалоДня(ДатаНачалаВГ) = НачалоДня(ДатаОкончания) Тогда МинутВторойГод = РабочихМинутВнутриДня(ДатаНачалаВГ, ДатаОкончания, ЧасН, ЧасО); Иначе МинутПоГраницам = РабочихМинутПоДвумГраницамИнтервалаОтдельно(ДатаНачалаВГ, ДатаОкончания, ЧасН, ЧасО); ДнейМеждуДат = РабочихДнейМеждуИсключаяГраничныеДаты(ДатаНачалаВГ, ДатаОкончания); МинутМеждуДат = ДнейМеждуДат * 10 * 60; МинутВторойГод = МинутПоГраницам + МинутМеждуДат; КонецЕсли; ИтогоСрокМинут = МинутПервыйГод + МинутВторойГод; Иначе ИтогоСрокМинут = 599940; КонецЕсли; Возврат ИтогоСрокМинут; КонецФункции &НаСервере Функция РабочихДнейМеждуИсключаяГраничныеДаты(ДатаНачала, ДатаОкончания, КалендарьОтбора = Неопределено) Результат = 0; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | КОЛИЧЕСТВО(*) КАК Дней |ИЗ РегистрСведений.КалендарныеГрафики как т1 |ГДЕ | т1.ДатаГрафика > &ДатаН | И т1.ДатаГрафика < &ДатаО | И т1.ДеньВключенВГрафик = Истина"; Если НЕ КалендарьОтбора = Неопределено Тогда Запрос.УстановитьПараметр("Календарь", КалендарьОтбора); Запрос.Текст = Запрос.Текст + " И т1.Календарь = &Календарь"; КонецЕсли; Запрос.УстановитьПараметр("ДатаН", НачалоДня(ДатаНачала)); Запрос.УстановитьПараметр("ДатаО", НачалоДня(ДатаОкончания)); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Результат = Выборка.Дней; КонецЕсли; Возврат Результат; КонецФункции &НаСервере Функция РабочихМинутВнутриДня(ДатаНачала, ДатаОкончания, ЧасН, ЧасО) РабочийДень = ДеньЯвляетсяРабочим(ДатаОкончания); Если РабочийДень Тогда ДатаНачалаРабочегоДня = НачалоДня(ДатаНачала) + 9 * 60 * 60; ДатаОкончанияРабочегоДня = НачалоДня(ДатаОкончания) + 19 * 60 * 60; Если ДатаНачала < ДатаНачалаРабочегоДня Тогда ДатаНачала = ДатаНачалаРабочегоДня КонецЕсли; Если ДатаОкончания > ДатаОкончанияРабочегоДня Тогда ДатаОкончания = ДатаОкончанияРабочегоДня КонецЕсли; Если ДатаОкончания > ДатаНачала Тогда Результат = (ДатаОкончания - ДатаНачала) / 60; Иначе Результат = 0; КонецЕсли; Иначе Результат = 0; КонецЕсли; Возврат Результат; КонецФункции &НаСервере Функция РабочихМинутПоДвумГраницамИнтервалаОтдельно(ДатаНачала, ДатаОкончания, ЧасН, ЧасО) //Считаем минуты по левой границе интервала ГраницаРабочийДень = ДеньЯвляетсяРабочим(ДатаНачала); Если ГраницаРабочийДень Тогда ДатаНачалаРабочегоДня = НачалоДня(ДатаНачала) + 9 * 60 * 60; ДатаОкончанияРабочегоДня = НачалоДня(ДатаНачала) + 19 * 60 * 60; Если ДатаНачала < ДатаНачалаРабочегоДня Тогда ДатаНачала = ДатаНачалаРабочегоДня КонецЕсли; Если ДатаОкончанияРабочегоДня > ДатаНачала Тогда МинутЛеваяГраница = (ДатаОкончанияРабочегоДня - ДатаНачала) / 60; Иначе МинутЛеваяГраница = 0; КонецЕсли; Иначе МинутЛеваяГраница = 0; КонецЕсли; //Считаем минуты по правой границе интервала ГраницаРабочийДень = ДеньЯвляетсяРабочим(ДатаОкончания); Если ГраницаРабочийДень Тогда ДатаНачалаРабочегоДня = НачалоДня(ДатаОкончания) + 9 * 60 * 60; ДатаОкончанияРабочегоДня = НачалоДня(ДатаОкончания) + 19 * 60 * 60; Если ДатаОкончания <= ДатаНачалаРабочегоДня Тогда МинутПраваяГраница = 0; ИначеЕсли ДатаОкончания >= ДатаОкончанияРабочегоДня Тогда МинутПраваяГраница = 10 * 60; Иначе МинутПраваяГраница = (ДатаОкончания - ДатаНачалаРабочегоДня) / 60; КонецЕсли; Иначе МинутПраваяГраница = 0; КонецЕсли; Результат = МинутЛеваяГраница + МинутПраваяГраница; Возврат Результат; КонецФункции &НаСервере Функция ДеньЯвляетсяРабочим(ДатаДляПроверки, КалендарьОтбора = Неопределено) Результат = Ложь; Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | т1.ДатаГрафика |ИЗ РегистрСведений.КалендарныеГрафики КАК т1 |ГДЕ | т1.ДатаГрафика = &ДатаП | И т1.ДеньВключенВГрафик = Истина"; Если НЕ КалендарьОтбора = Неопределено Тогда Запрос.УстановитьПараметр("Календарь", КалендарьОтбора); Запрос.Текст = Запрос.Текст + " И т1.Календарь = &Календарь"; КонецЕсли; Запрос.УстановитьПараметр("ДатаП", НачалоДня(ДатаДляПроверки)); Выборка = Запрос.Выполнить().Выбрать(); Если Выборка.Следующий() Тогда Результат = Истина; КонецЕсли; Возврат Результат; КонецФункции |
|||
30
findpol
03.09.25
✎
19:01
|
Ну и где-то часы остались вместо параметров..
|
|||
31
Garykom
гуру
03.09.25
✎
19:02
|
(29) Эмм раз у тебя один фиг запросы
То перенеси код из основной функции по максимуму так же в запросы с ВТ И да сразу не для пары дат а для таблицы |
|||
32
Волшебник
03.09.25
✎
19:14
|
(31) у профессионалов запросы в циклах не тормозят
|
|||
33
Garykom
гуру
03.09.25
✎
19:21
|
(32) Но зачем делать несколько простых запросов, когда можно всего один посложней?
|
|||
34
findpol
03.09.25
✎
19:28
|
(33) я пока просто накидал простой в отладке код, решающий мою задачу и повторяющий ход мысли.
Далее буду оптимизировать и дорабатывать при встраивании в конфу. |
|||
35
Волшебник
03.09.25
✎
19:29
|
(33) Я ж без претензий. Это пусть они думают
|
|||
36
Гена
гуру
03.09.25
✎
19:37
|
(29) Сын мой, проще надо быть... проще...
Глянул этот РС Календарные графики - там же подённые данные и никаких переходов года не надо. К тому же в БП есть готовая Функция РазностьДатПроизводственныхКалендарейПоВидамДней(ПроизводственныйКалендарь, НачалоПериода, ОкончаниеПериода) Экспорт Достаточно такой рыбы: Функция КоличествоРабочихДнейПоГрафику(НачалоПериода, КонецПериода, График)
ЕвойныйКалендарь = График.ЕвойныйКалендарь(); ДанныеКалендаря = РасчетЗарплатыБазовый.РазностьДатПроизводственныхКалендарейПоВидамДней( ЕвойныйКалендарь, НачалоПериода, КонецПериода); Возврат ДанныеКалендаря.Получить(Перечисления.ВидыДнейПроизводственногоКалендаря.Рабочий); КонецФункции |
|||
37
Гена
гуру
03.09.25
✎
19:40
|
Не пугайтесь справочника Календари. У него синоним - Графики работы.
|
|||
38
Волшебник
03.09.25
✎
19:50
|
(36) фейковый программный код
|
|||
39
Гена
гуру
03.09.25
✎
19:57
|
(38) Отнюдь, рабочий код, только язык поправить )
Суть в том, что почти во всех конфигурациях 1С, даже в УТ, есть графики работы. РС заполняется по КАЖДОМУ дню, которые уже раскрашены в рабочие и выходные. Нет проблем ну очень короткой функцией получить их количество по выбранному виду между двумя датами. Запросом, Волшебник, запросом ) Коротким. |
|||
40
Волшебник
04.09.25
✎
10:34
|
(39) Перепишите на Python
|
|||
41
findpol
03.09.25
✎
19:59
|
(36) это в ЗУПе есть такой модуль "РасчетЗарплатыБазовый"?
|
|||
42
Волшебник
03.09.25
✎
20:03
|
(41) это галлюцинации
|
|||
43
findpol
03.09.25
✎
20:06
|
(36) просто рабочих дней можно и запросом получить - основная сложность в получении минут рабочего дня по границам с учетом рабочего времени.
Переход через год нужен потому, что с новым годом меняется календарь. На один рабочий день, например, 01.03.2025 может быть две записи в регистре потому что два календаря (офис, склад и т.д.), а за два года календаря может быть 4 и т.д. Соответственно, в переходе через год мы задаём корректный календарь для каждого года. |
|||
44
Гена
гуру
03.09.25
✎
20:08
|
(41) В БП. Для ЗУПа, КА и ЕРП ещё проще. Там графики тем более подённые в регистрах и вообще собирается разность дат типовыми функциями.
|
|||
45
Гена
гуру
03.09.25
✎
20:10
|
(43) Так Вы от графика идите к рабочим дням, а не наоборот. Тогда и переход не нужен.
|
|||
46
Гена
гуру
03.09.25
✎
20:13
|
Короче, всё ясно. Неинтересно. Действуйте.
|
|||
47
findpol
04.09.25
✎
10:19
|
(44) в УТ нет. Посмотрел в БП - ну тот же запрос, только ещё избыточные данные будут для конкретной задачи. Решил не перетягивать метод, а использовать свой.
|
|||
48
findpol
04.09.25
✎
10:24
|
Раз уже такая пьянка, то прикладываю код после оптимизации. Буду рад объективной критике:
&НаСервере Функция ПолучитьРабочихМинутМеждуДатами(ДатаНачала, ДатаОкончания, ЧасН, ЧасО, Календарь = Неопределено) Если ДатаНачала >= ДатаОкончания ИЛИ ЧасН < 0 ИЛИ ЧасО > 24 ИЛИ ЧасН >= ЧасО Тогда Возврат 0; КонецЕсли; ПродолжительностьРабДня = (ЧасО - ЧасН) * 60; НачалоДняН = НачалоДня(ДатаНачала); НачалоДняК = НачалоДня(ДатаОкончания); // Получаем все рабочие дни в интервале одним запросом РабочиеДниМножество = ПолучитьРабочиеДниВИнтервале(НачалоДняН, НачалоДняК, Календарь); // Обработка случая, когда обе даты в одном дне Если НачалоДняН = НачалоДняК Тогда Если РабочиеДниМножество.Получить(НачалоДняН) <> Неопределено Тогда Возврат РасчетМинутВДень(ДатаНачала, ДатаОкончания, ЧасН, ЧасО); Иначе Возврат 0; КонецЕсли; КонецЕсли; Общееминуты = 0; // Обрабатываем начальный день Если РабочиеДниМножество.Получить(НачалоДняН) <> Неопределено Тогда Общееминуты = Общееминуты + РасчетМинутВДень(ДатаНачала, КонецДня(НачалоДняН), ЧасН, ЧасО); КонецЕсли; // Обрабатываем конечный день Если РабочиеДниМножество.Получить(НачалоДняК) <> Неопределено Тогда Общееминуты = Общееминуты + РасчетМинутВДень(НачалоДня(НачалоДняК), ДатаОкончания, ЧасН, ЧасО); КонецЕсли; // Обрабатываем полные дни между КоличествоДней = РабочиеДниМножество.Количество(); // Вычитаем начальный и конечный дни, если они рабочие Если РабочиеДниМножество.Получить(НачалоДняН) <> Неопределено Тогда КоличествоДней = КоличествоДней - 1; КонецЕсли; Если РабочиеДниМножество.Получить(НачалоДняК) <> Неопределено Тогда КоличествоДней = КоличествоДней - 1; КонецЕсли; // Убедимся, что количество дней не отрицательное КоличествоДней = Макс(КоличествоДней, 0); Общееминуты = Общееминуты + КоличествоДней * ПродолжительностьРабДня; Возврат Общееминуты; КонецФункции &НаСервере Функция ПолучитьРабочиеДниВИнтервале(ДатаНачала, ДатаОкончания, Календарь = Неопределено) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | т1.ДатаГрафика КАК Дата |ИЗ | РегистрСведений.КалендарныеГрафики КАК т1 |ГДЕ | т1.ДатаГрафика >= &ДатаНачала | И т1.ДатаГрафика <= &ДатаОкончания | И т1.ДеньВключенВГрафик = Истина"; Если Календарь <> Неопределено Тогда Запрос.Текст = Запрос.Текст + " И т1.Календарь = &Календарь"; Запрос.УстановитьПараметр("Календарь", Календарь); КонецЕсли; Запрос.УстановитьПараметр("ДатаНачала", ДатаНачала); Запрос.УстановитьПараметр("ДатаОкончания", ДатаОкончания); РезультатЗапроса = Запрос.Выполнить(); Выборка = РезультатЗапроса.Выбрать(); Результат = Новый Соответствие; Пока Выборка.Следующий() Цикл Результат.Вставить(Выборка.Дата, Истина); КонецЦикла; Возврат Результат; КонецФункции &НаСервере Функция РасчетМинутВДень(ДатаНачала, ДатаОкончания, ЧасН, ЧасО) НачалоРабочегоДня = НачалоДня(ДатаНачала) + ЧасН * 3600; КонецРабочегоДня = НачалоДня(ДатаНачала) + ЧасО * 3600; // Ограничиваем расчет рабочим временем дня Если ДатаНачала < НачалоРабочегоДня Тогда ДатаНачала = НачалоРабочегоДня; КонецЕсли; Если ДатаОкончания > КонецРабочегоДня Тогда ДатаОкончания = КонецРабочегоДня; КонецЕсли; Если ДатаНачала >= ДатаОкончания Тогда Возврат 0; КонецЕсли; Возврат (ДатаОкончания - ДатаНачала) / 60; КонецФункции |
|||
49
findpol
04.09.25
✎
10:21
|
Лично мне не очень нравится момент с соответствием, в котором передаются рабочие дни, но как сделать лучше?
|
|||
50
Волшебник
04.09.25
✎
10:30
|
(48) два раза проверяется условие: Если РабочиеДниМножество.Получить(НачалоДняН) <> Неопределено Тогда
Аналогично для конечного дня. Можно так: // Обрабатываем начальный день Если РабочиеДниМножество.Получить(НачалоДняН) <> Неопределено Тогда Общееминуты = Общееминуты + РасчетМинутВДень(ДатаНачала, КонецДня(НачалоДняН), ЧасН, ЧасО); КоличествоДней = КоличествоДней - 1; КонецЕсли; // Обрабатываем конечный день Если РабочиеДниМножество.Получить(НачалоДняК) <> Неопределено Тогда Общееминуты = Общееминуты + РасчетМинутВДень(НачалоДня(НачалоДняК), ДатаОкончания, ЧасН, ЧасО); КоличествоДней = КоличествоДней - 1; КонецЕсли; // Обрабатываем полные дни между КоличествоДней = РабочиеДниМножество.Количество(); |
|||
51
Fish
гуру
04.09.25
✎
10:36
|
Можно ещё склонение добавить, чтобы писал красиво:
"5 дней 3 часа 12 минут" и "2 дня 5 часов 31 минута" Тут надо курить функцию ПолучитьСклоненияСтрокиПоЧислу |
|||
52
Гена
гуру
04.09.25
✎
10:39
|
(48) Полная хрень плясать от рабочих минут, а не от дней. Потому что как минимум есть у всех укороченные предпраздничные дни, а у многих и длины смен разные на неделе - это раз. Про полночь забыли - это два. Для каждого прошедшего месяца уже давно посчитано в регистре среднего заработка и количество рабочих дней, и количество рабочих часов/минут для любых графиковых мерцаний - это три. График мог меняться - это четыре.
А впрочем, делайте что хотите. Вы свободный человек свободной страны. P.S. Вас бы я к себе не взял. |
|||
53
Garykom
гуру
04.09.25
✎
10:43
|
(52) А отпуска и отгулы не забыли?
Т.е. ты предлагаешь не просто по рабочему календарю, а по каждому сотруднику отдельно-индивидуально? |
|||
54
Гена
гуру
04.09.25
✎
10:43
|
(53) Естественно, только индивидуально. Через Пользователь -> ФЛ -> Сотрудник
У директора - одни данные, у сторожа - другие. Либо пусть автор перестанет мямлить и озвучит конкретную задачу. Может ему нужна только пятидневка. |
|||
55
Fish
гуру
04.09.25
✎
10:44
|
(52) Ещё обязательно надо учитывать обеды и посещение сортира.
|
|||
56
findpol
04.09.25
✎
10:45
|
(52) пляшем от дней, но в итоге нужно вывести минуты на форму, поэтому после получения дней переходим к подсчёту минут.
Про полночь не забыли. Вы же о том, что рабочий день мог начаться в 22:00 первого дня, а закончиться в 8:0 второго? Это я понимаю, но решил не реализовывать т.к. для моей задачи не требуется. Я делаю в УТ, тут, если не путаю, нет регистров о которых вы говорите. Если есть - поделитесь, пожалуйста. З.Ы. Жаль, но у нас ещё есть время изменить ваше решение )) |
|||
57
Гена
гуру
04.09.25
✎
10:45
|
(55) ЗУП Корп, кстати, обеды учитывает.
|
|||
58
Гена
гуру
04.09.25
✎
10:46
|
(56) Нет, я на Вас махнул рукой.
|
|||
59
findpol
04.09.25
✎
10:51
|
(54) это не расчёт ЗП, а вычисление сроков в УТ по общему календарю в общем для офисных подразделений. Поэтому индивидуальные графики, отгулы и больничные не играют роли.
Мне интересно было решить задачу, посмотреть скорость работы, сделать более-менее универсальный инструмент (без фанатизма) для похожих задач с целью повторного использования в иных задачах и проектах. Конечно, я не пытался на коленке написать альтернативу ЗУП, да и смысла в этом нет. |
|||
60
Гена
гуру
04.09.25
✎
10:54
|
(59) Каких сроков в УТ? Что же нужно клещами каждый нюанс вытягивать.
Конкретно: сроки между чем и чем? Список чего имеется? |
|||
61
findpol
04.09.25
✎
11:01
|
(60) в УТ падают данные (в рамках самописной интеграции): событие, дата начала, дата окончания.
Вот между ними и нужно посчитать срок. Почему минуты (не нужно клещами каждый нюанс вытягивать): точность нужна до минут, чаще всего интервал это минуты. |
|||
62
Гена
гуру
04.09.25
✎
11:13
|
(61) Рабочие дни и часы/минуты для первого и последнего дня нужны по какому графику/календарю, для всех одинаковому?
|
|||
63
Гена
гуру
04.09.25
✎
11:15
|
ДатаНачало и ДатаКонца - они всегда внутри рабочего времени или нет?
|
|||
64
findpol
04.09.25
✎
11:18
|
(62) да, по одному календарю для всех.
ДатаНачало и ДатаКонца могут попасть как на нерабочие дни, так и на рабочие, но в нерабочее время. |
|||
65
Гена
гуру
04.09.25
✎
11:45
|
(64) Тогда нам только нужен вот этот регистр (см. рис.)
Двумя запросами (вложенным или левым соединением?) найдёте количество рабочих дней между ДатаНачало +1 и ДатаКонца -1 Не забудьте в запросе забить: | ВЫБОР
| КОГДА ГрафикиРаботы.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий) | ИЛИ ГрафикиРаботы.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный) | ТОГДА 1 | ИНАЧЕ 0 | КОНЕЦ КАК РабочийДень Ну а со временем в первом и последнем дне разберётесь - там трудно испортить.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |