|   |   | 
| 
 | РазностьДатПоКалендарю | ☑ | ||
|---|---|---|---|---|
| 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) Да я и не спорю. Но нельзя же игнорировать вопрос человека, который в эту тему серьезно закопался и понял, что там не работает конкретно.     | 
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |