![]() |
![]() |
![]() |
|
Вопрос возможностей формата даты в 1С Vstur, zenik, Мимо Проходил, Гена, Irbis, maxar, Fish, vbus, Silgis, Климов Сергей, Timon1405, SleepyHead, программистище, Мультук, Многолетний Апельсин, obs191, DemonShinji2, TormozIT, Лодырь, findpol, Mankubus, yanikolay, Волшебник, ЕRPe, Dmitrii, CepeLLlka, LuckyStar, Garykom, Шурик71, Лкарсо22, MM, chelentano, El_Duke, craxx, PR, takefive, Гипервизор, sikuda, vladko, PLUT, ads55, ndrv, Джордж1, Crusher, RomanYS, Terrixus, scanduta, arsik, abfm, elka302, Skylark, Kigo_Kigo, reloc, DiMel_77, Mraque, Ильф, Кир Пластелинин, Prog_man, b_ru, misssss, vyaz, segn, runuts, dedmoroz777
| ☑ | ||
---|---|---|---|---|
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 | КОНЕЦ КАК РабочийДень Ну а со временем в первом и последнем дне разберётесь - там трудно испортить.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |