|
РазностьДатПоКалендарю | ☑ | ||
---|---|---|---|---|
0
ikolegov
02.12.24
✎
10:03
|
Добрый день.
В одном из отчетов ERP УСО при поиске ошибки столкнулся с такой функцией ГрафикиРаботы.РазностьДатПоКалендарю(Календарь,ДатаНачала,ДатаОкончания) если датаНачала =31.12.24 а датаОкончания в 25 году, например 01.01.25 получает почему-то минус 251 стоит поставить дату начала 30.12.24 тогда все нормально |
|||
1
Волшебник
02.12.24
✎
10:03
|
Ну так напишите свою функцию, более правильную.
|
|||
2
Ненавижу 1С
гуру
02.12.24
✎
10:04
|
(0) календарь/график заполнен на 2025 год?
|
|||
3
ikolegov
02.12.24
✎
10:49
|
(2) Да заполнен
|
|||
4
Доминошник
02.12.24
✎
14:10
|
(0) По-моему, в этой проверке
Если Год(ДатаНачала) <> Год(ДатаОкончания) И КонецДня(ДатаНачала) <> КонецГода(ДатаНачала) Тогда
вторая часть - лишняя. |
|||
5
ikolegov
02.12.24
✎
15:16
|
(4) Вы согласны, что функция работает неправильно?
Проверял и на ERP последней версии. Там такая же ситуация |
|||
6
Гена
гуру
02.12.24
✎
15:42
|
(4) Происки релиза платформы?
(5) Давайте проверим мысль Доминошника: поставьте остановы и давайте значения для даты начала 31.12.2024 КонецДня(ДатаНачала) КонецГода(ДатаНачала) |
|||
7
Доминошник
02.12.24
✎
15:50
|
(5) Да, согласен.
Как я понял, ошибка - если дата начала попадает на 31 декабря. (6) Думаю, "проблемы" |
|||
8
Мультук
гуру
02.12.24
✎
15:55
|
(5)
КалендарныеГрафики -- Календарь -- Год -- ДатаГрафика Ресурсы -- ДеньВключенВГрафик -- КоличествоДнейВГрафикеСНачалаГода Казалось бы простой запрос должен вернуть кол-во дней. Но кто же идёт простым путём... ВЫБРАТЬ КОЛИЧЕСТВО(*) ИЗ РегистрСведений.КалендарныеГрафики как т1 ГДЕ т1.ДатаГрафика МЕЖДУ &ДатаНачала и ДатаОкончания И т1.ДеньВключенВГрафик = Истина И т1.Календарь = &Календарь "Они там сначала строят ВТ, затем складывают, потом вычитают. 6 запросов не считая легких увлечений |
|||
9
Гена
гуру
02.12.24
✎
15:53
|
(7) А почему раньше никто не замечал?
Всё-таки надо дождаться проверки (6) |
|||
11
Eiffil123
02.12.24
✎
16:13
|
(9) это как проблема 29 февраля. ее замечают раз в 4 года.
|
|||
12
Волшебник
02.12.24
✎
16:22
|
(11) Правило високосного года немного сложнее, чем делимость на 4:
1. Если год делится на 4 без остатка, он високосный, но см. также два следующих правила: 2. Если год делится на 100 (годы оканчиваются двумя нулями, например, 1900, 2100), это не високосный год, за исключением случаев из условия 3. 3. Если год делится на 400 — он високосный. Функция Високосный(Год) Если Год % 400 = 0 Тогда Возврат Истина; ИначеЕсли Год % 100 = 0 Тогда Возврат Ложь; ИначеЕсли Год % 4 = 0 Тогда Возврат Истина; Иначе Возврат Ложь; КонецЕсли; КонецФункции |
|||
13
Гена
гуру
02.12.24
✎
16:27
|
(11) Нет. Здесь что-то с платформой. Смотрим:
ДатыГрафика = Новый Массив;
ДатыГрафика.Добавить(ДатаНачала); Если Год(ДатаНачала) <> Год(ДатаОкончания) И КонецДня(ДатаНачала) <> КонецГода(ДатаНачала) Тогда // Если даты разных годов, то добавляем "границы" годов. Для НомерГода = Год(ДатаНачала) По Год(ДатаОкончания) - 1 Цикл ДатыГрафика.Добавить(Дата(НомерГода, 12, 31)); КонецЦикла; КонецЕсли; ДатыГрафика.Добавить(ДатаОкончания); Мысль логичная: если даты внутри года, то они так и остаются. Если же в разных годах, то между ними добавляют 31 декабря: ДатаНачала 31.12.2024 ДатаОкончания Ну а потом идёт запрос к РС КалендарныеГрафики к ресурсу КоличествоДнейВГрафикеСНачалаГода Сбой может произойти только если неправильно сработают КонецДня(ДатаНачала) КонецГода(ДатаНачала) При этом ошибочно задвоится начало дня 31 декабря: 31.12.2024 31.12.2024 01.01.2025 Тогда далее в запросе получим хрень. Дубль три: скорее всего платформа. А логика программы безупречна. В силу того, что КоличествоДнейВГрафикеСНачалаГода разбито по годам, то при переходе через НГ надо обязательно вставлять 31.12 Пусть автор проверит у себя КонецДня(31.12.2024) КонецГода(31.12.2024) |
|||
14
Доминошник
02.12.24
✎
16:28
|
(7) Думаю, причина в том, что редко кто пытался вычислить разность дат исходя из начальной - последний день года.
|
|||
15
Гена
гуру
02.12.24
✎
16:32
|
(14) Здрасьте. Как раз условие по "И" именно для 31 декабря как даты начала. Эрго разработчики этот момент как раз и ПРОДУМАЛИ давным-давно.
|
|||
16
Доминошник
02.12.24
✎
16:36
|
(13) Вот результат запроса "по конфигурации"
31.12.2024 = 366 01.01.2025 = 1 (в графике все дни рабочие) А дальше - начинается "чудо вычисления" ПодробностиКоличествоДнейВГрафике = Неопределено; ДобавлятьПервыйДень = Ложь; Пока Выборка.Следующий() Цикл Если КоличествоДнейВГрафике = Неопределено Тогда КоличествоДнейВГрафике = Выборка.КоличествоДнейВГрафикеСНачалаГода; ДобавлятьПервыйДень = Выборка.ДеньВключенВГрафик; Иначе КоличествоДнейВГрафике = КоличествоДнейВГрафике - Выборка.КоличествоДнейВГрафикеСНачалаГода; КонецЕсли; КонецЦикла; Возврат - КоличествоДнейВГрафике + ?(ДобавлятьПервыйДень, 1, 0); И, соответственно, получаем: КоличествоДнейВГрафике = 366 (1-й шаг) КоличествоДнейВГрафике = 365 (2-й шаг) Возврат = (- КоличествоДнейВГрафике) = - 365 Если бы в результате запроса было 31.12.2024 = 366 31.12.2024 = 366 01.01.2025 = 1 то получили бы КоличествоДнейВГрафике = 366 (1-й шаг) КоличествоДнейВГрафике = 0 (2-й шаг) КоличествоДнейВГрафике = 1 (3-й шаг) Возврат = (- КоличествоДнейВГрафике) = - 1 Для простоты опустил "ДобавлятьПервыйДень" |
|||
17
Гена
гуру
02.12.24
✎
16:46
|
(16) Давайте проверим. Пусть автор уберёт этот кусок с "И". Тогда мы получим:
31.12.2024 31.12.2024 01.01.2025 |
|||
18
Гена
гуру
02.12.24
✎
16:49
|
Кстати, откуда тогда у автора 251, если перед запросом имеем:
248 248 1 ? |
|||
19
Eiffil123
02.12.24
✎
16:52
|
а зачем такое уродство? нельзя просто запросом собрать количество ненулевых записей по регистру МЕЖДУ &ДатаНачала и &ДатаОкончания?
|
|||
20
Гена
гуру
02.12.24
✎
16:58
|
(19) Скорее всего для быстроты. Ведь Вы правильно заметили, что в РС уже прописано количество рабочих дней с начала года. Что быстрее: собирать за 20 лет все ненулевые записи или просто арифметически вычесть/сложить уже имеющиеся количества?
|
|||
21
Волшебник
02.12.24
✎
17:00
|
(19) Вы только гляньте-гляньте!
https://www.turboconf.ru/Templates/BspDetails/obshhijmodul-kalendarnyegrafiki-raznostdatpokalendaryu/raznost-dat-po-kalendaryu А мы ещё боремся за почётное звание дома высокой культуры и быта! |
|||
22
Eiffil123
02.12.24
✎
17:05
|
(20) 20 лет - это 7300 записей с отбором по определенному календарю (если это реально нужно). Запрос это прожует моментально.
При этом я сомневаюсь что кто-то держит записи за 20 лет назад. ЗУП и ERP вышли позже. |
|||
23
Eiffil123
02.12.24
✎
17:06
|
(21) вообще не понимаю людей, которые ЗУП любят. это же кошмар.
|
|||
24
Гена
гуру
02.12.24
✎
17:10
|
(21) Странно. У меня в последнем релизе БП в этой функции стоит
2020,01,01 вместо %1 |
|||
25
Доминошник
02.12.24
✎
17:18
|
(24) Судя по копирайту в ссылке (2019 год) - это довольно старая версия БСП
|
|||
26
Волшебник
02.12.24
✎
17:18
|
(24) Наверное, на турбоконфе старая версия этой функции
|
|||
27
Гена
гуру
02.12.24
✎
17:27
|
(22) Тогда согласен. Переделывайте эту функцию.
Это дробление по годам некрасиво ) |
|||
28
SleepyHead
гуру
02.12.24
✎
17:28
|
(9) В ЗУпе та же проблем, я давно заметил. Проще свое написать.
|
|||
29
Гена
гуру
02.12.24
✎
17:31
|
(28) А чего молчали как партизан? Этой функции хрен знает сколько лет )
|
|||
30
SleepyHead
гуру
02.12.24
✎
17:42
|
(29) Никто не спрашивал. Да и не такая серьезная проблема, пишешь расчёт под свои задачи и забываешь об этом.
|
|||
31
Волшебник
02.12.24
✎
18:14
|
(30) Я так сразу и сказал (1)
|
|||
32
mikecool
02.12.24
✎
18:54
|
(31) "человеку не важен сыр, человеку важно быть правым", что и доказывает в (5)
|
|||
33
SleepyHead
гуру
03.12.24
✎
05:12
|
(31) Да я и не спорю. Но нельзя же игнорировать вопрос человека, который в эту тему серьезно закопался и понял, что там не работает конкретно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |