HelpF.pro

Неправильно рассчитывает номер недели в году, функция корректного расчета

Для определения номера недели в конфигурациях 1С обычно используется стандартная функция НеделяГода(). 

Например 17 октября 2016 года:

НеделяГода() возвращает 43, а по обычному календарю это 42:

Судя по всему, 1С считает по американской системе. "По европейской норме (DIN 1355 / ISO 8601) первой неделей года считается неделя, содержащая 4 января данного года (http://vsegost.com/Catalog/62/6263.shtml). А в США первой неделей считается любая неделя, содержащая первое января, независимо от числа дней".

Чтобы 1С возвращала номер недели, совпадающий с "человеческими" календарями и ежедневниками, предлагается использовать следующую функцию:

Код 1C v 8.х
 Функция НеделяГодаПоISO8601(Знач Дата, Год=Неопределено) Экспорт
    Если ДеньНедели(НачалоГода(Дата)) <= 4 тогда //если первая неделя года начинается до четверга, т.е. в ней есть четверг
        //значит год начинается с первой недели
        Год = Год(Дата);
        Неделя = НеделяГода(Дата);
        Возврат Неделя;
    Иначе
        //год начинается с последней недели прошлого года
        Неделя = НеделяГода(Дата)-1;
        
        Если Неделя = 0 тогда //если это до первой недели года
            Неделя = НеделяГодаПоISO8601(НачалоГода(Дата)-1, Год); //значит это последняя неделя прошлого года
        Иначе
            Год = Год(Дата);
        КонецЕсли;
    КонецЕсли;
    
    Возврат Неделя;
КонецФункции

// Более короткий вариант:
Функция НеделяГода_ISO8601(Дата)       
    Корректировочная = НеделяГода(Дата(Год(Дата),1,4)) - 1;
    Результат = НеделяГода(Дата) - Корректировочная;
    Результат = ?(Результат = 0, НеделяГода_ISO8601(ДобавитьМесяц(КонецГода(Дата), -12)), Результат);    
    Возврат Результат;          
КонецФункции

Опубликовано на сайте: https://HelpF.pro
Прямая ссылка: https://HelpF.pro/faq/view/1826.html