Имя: Пароль:
1C
 
РазностьДатПоКалендарю
,
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) Да я и не спорю. Но нельзя же игнорировать вопрос человека, который в эту тему серьезно закопался и понял, что там не работает конкретно.