Неправильно рассчитывает номер недели в году, функция корректного расчета Для определения номера недели в конфигурациях 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 ) ) ;
Тема обсуждения на Mista.ru Категория:
Работа с Датами (Временем) Функция описывает период, определяемый датой и периодичностью Код 1C v 8.х
Функция ПолучитьПериодСтрокой(ДатаВПериоде, Периодичность) Экспорт
Если Периодичность = "Год" Тогда
ФорматДаты = "ДФ='гггг "" г."" '" ;
ИначеЕсли Периодичность = "Квартал" Тогда
ФорматДаты = "ДФ='к"" квартал"" гггг "" г."" '" ;
ИначеЕсли Периодичность = "Месяц" Тогда
ФорматДаты = "ДФ='ММММ гггг "" г."" '" ;
ИначеЕсли Периодичность = "Неделя" Тогда
ФорматДаты = "ДФ='"" Неделя ("" дд.ММ.гггг'" ;
ИначеЕсли Периодичность = "День" Тогда
ФорматДаты = "ДФ='дд.ММ.гггг "" г."" '" ;
Иначе
ФорматДаты = "" ;
КонецЕсли ;
СтрокаПериод = "" + Формат( ДатаВПериоде, ФорматДаты) ;
Если Периодичность = "Неделя" И ТипЗнч( ДатаВПериоде) = Тип( "Дата" ) Тогда
СтрокаПериод = "" + НеделяГода( ДатаВПериоде) + "-ая " + СтрокаПериод + Формат( КонецНедели( ДатаВПериоде) , "ДФ='"" - "" дд.ММ.гггг)'" ) ;
КонецЕсли ;
Возврат СтрокаПериод;
КонецФункции
Сообщить( ПолучитьПериодСтрокой( Дата( 2009 , 03 , 09 ) , "Квартал" ) ) ;
Сообщить( ПолучитьПериодСтрокой( Дата( 2009 , 03 , 09 ) , "День" ) ) ;
Категория:
Работа с Датами (Временем)