Неправильно рассчитывает номер недели в году, функция корректного расчета Для определения номера недели в конфигурациях 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)), Результат);
Возврат Результат;
КонецФункции
Категория:
Работа с Датами (Временем) Как по Номеру Недели Года получить Дату Код 1C v 8.х //Как из номера, числа недели вернуть первую Дату этой недели?
Функция ДатаПоНомеруНедели(НомерНедели, Год = Неопределено)
Возврат НачалоНедели(Дата(?(Год=Неопределено, Год(ТекущаяДата()), Год),1,1)+(НомерНедели-НеделяГода(Дата(?(Год = Неопределено, Год(ТекущаяДата()), Год), 1, 1))) * 604800);
КонецФункции
//ПРИМЕРЫ ОБРАЩЕНИЯ:
ТекДата = ТекущаяДата();
Сообщить("Текущая Дата - "+Строка(ТекДата));
Сообщить("Неделя года - "+Строка(НеделяГода(ТекДата)));
Сообщить("--------------------------");
Сообщить(ДатаПоНомеруНедели(НеделяГода(ТекДата)));
Сообщить(ДатаПоНомеруНедели(НеделяГода(ТекДата), 2005));
// В окно сообщений будет выведено:
//
// Текущая Дата - 20.08.2010 0:00:00
// Неделя года - 34
// ----------------------------
// 16.08.2010 0:00:00
// 15.08.2005 0:00:00
Тема обсуждения на Mista.ru Категория:
Работа с Датами (Временем) Функция описывает период, определяемый датой и периодичностью Код 1C v 8.х
// Функция описывает период, определяемый датой и периодичностью
Функция ПолучитьПериодСтрокой(ДатаВПериоде, Периодичность) Экспорт
Если Периодичность = "Год" Тогда
ФорматДаты = "ДФ='гггг ""г.""'";
ИначеЕсли Периодичность = "Квартал" Тогда
ФорматДаты = "ДФ='к"" квартал"" гггг ""г.""'";
ИначеЕсли Периодичность = "Месяц" Тогда
ФорматДаты = "ДФ='ММММ гггг ""г.""'";
ИначеЕсли Периодичность = "Неделя" Тогда
ФорматДаты = "ДФ='""Неделя (""дд.ММ.гггг'";
ИначеЕсли Периодичность = "День" Тогда
ФорматДаты = "ДФ='дд.ММ.гггг ""г.""'";
Иначе
ФорматДаты = "";
КонецЕсли;
СтрокаПериод = "" + Формат(ДатаВПериоде, ФорматДаты);
Если Периодичность = "Неделя" И ТипЗнч(ДатаВПериоде) = Тип("Дата") Тогда
СтрокаПериод = "" + НеделяГода(ДатаВПериоде) + "-ая " + СтрокаПериод + Формат(КонецНедели(ДатаВПериоде), "ДФ='"" - ""дд.ММ.гггг)'");
КонецЕсли;
Возврат СтрокаПериод;
КонецФункции
//Обращение и результат
Сообщить(ПолучитьПериодСтрокой(Дата(2009,03,09),"Квартал")); // 1 квартал 2009 г.
Сообщить(ПолучитьПериодСтрокой(Дата(2009,03,09),"День")); // 09.03.2009 г..
Категория:
Работа с Датами (Временем)