helpf.pro
Регистрация
 0 
Распечатать

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

Для определения номера недели в конфигурациях 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)), Результат);    
    Возврат Результат;          
КонецФункции
Разместил:   Версии: |  Дата:   Прочитано: 820
 0 
Распечатать
Возможно, вас также заинтересует
COM-подключение к базе 7.7 из 8.2 1С 4
Если код выполняется на стороне клиента, то необходимо наличие базы 7.7 на локальной машине. Пример (На форме объекта присутствует реквизит Таблица(ТаблицаЗначений)): НаКлиенте Процедура Загрузки() ПутьКБазе="...
Cклонения по падежам 4
НаКлиенте Процедура Команда1(Команда) ФИО = " Иванов Иван Иванович" ; Падеж = 2; Пол = 1; Результат = СклонениеФИО(ФИО, Падеж, пол); Сообщить(Результат); КонецПроцедуры НаСервере Функция СклонениеФИО(ФИО, Падеж, пол) ...
База 1С при запуске уходит в дамп и вылетает 1
В последнее время частенько обращаются пользователи у которых после замены или ремонта компьютера 1С не запускается, а точнее при открытии уходит в dump и вылетает. Как правило, решение одно: Отключить аппаратное...
В учетной политике не указан вид тарифа страховых взносов. Как указать? 0
Создайте новую запись учетной политики с начала года - Например 01.01.2013 В учетной смотрите дату начала учетной политики. Поставьте дату начала года (например 01.01.13) закладка появиться должна. Проверьте Тариф страховых...
Выборка, перебор документов 3
// Выборка документов за весь период Выборка = Документы.НачислениеОтпуска.Выбрать(); Пока Выборка.Следующий() Цикл //Модуль обработки КонецЦикла; // Выборка документов за период с Даты начала по Дата окончания ...
Посмотреть все результаты поиска похожих
Вы не можете отправить комментарий анонимно, пожалуйста войдите или зарегистрируйтесь.