Недели нумеруют по разному в зависимости от потребностей. 1С в функции НеделяГода() выбрала вариант в котором 1 января всегда относится к первой неделе года. При этом неделя на границе года делится на части: первая половина недели может относиться к прошлому году, а вторая к следующему.
По стандарту ISO 8601 принятому и в России (ГОСТ ИСО 8601-2001) первой неделей года является та неделя, на которую попадает первый четверг года. При этом 1-3 января могут попасть не в 1 неделю, а в 52 или 53 неделю предыдущего года, а 29-31 декабря не в 52 или 53 неделю, а в 1 неделю следующего года. Зато недели не делятся на части и всегда имеют уникальный номер. Первый день недели всегда - понедельник.
Первая функция вычисляет уникальный номер недели. Рассчитывается количество недель от первого четверга года, который по ISO 8601 всегда относится к первой неделе года, до четверга заданной недели. Возвращается строка в формате гггг-Wнн, где гггг - четырехзначный номер года, нн - двухзначный номер недели из диапазона 1-53.
Функция НеделяIso8601(Дата)
Перем ЧетвергТойЖеНедели;
Перем Год;
Перем НомерНедели;
ЧетвергТойЖеНедели = Дата - (ДеньНедели(Дата) - 4) * 24 * 3600;
Год = Год(ЧетвергТойЖеНедели);
НомерНедели = Цел((ДеньГода(ЧетвергТойЖеНедели) - 1) / 7) + 1;
Возврат Формат(Год, "ЧЦ=4;ЧВН=;ЧГ=0") + "-W" + Формат(НомерНедели, "ЧЦ=2;ЧВН=;ЧГ=0");
КонецФункции
Вторая функция находит дату начала недели, заданной строкой в формате гггг-Wнн. Используется тот факт, что 4 января всегда относится к первой неделе года, это тоже следует из ISO 8601. По нему находится начало первой недели и прибавляется количество дней до заданной недели.
Функция НачалоНеделиIso8601(Неделя)
Перем ЧетвёртоеЯнваряТогоЖеГода;
Перем НачалоПервойНедели;
Перем Год;
Перем НомерНедели;
Год = Число(Лев(Неделя, 4));
НомерНедели = Число(Сред(Неделя, 7, 2));
ЧетвёртоеЯнваряТогоЖеГода = Дата(Год, 1, 4);
НачалоПервойНедели = ЧетвёртоеЯнваряТогоЖеГода - (ДеньНедели(ЧетвёртоеЯнваряТогоЖеГода) - 1) * 24 * 3600;
Возврат НачалоПервойНедели + (НомерНедели - 1) * 7 * 24 * 3600;
КонецФункции
Другой вариант функции работает через вычисление юлианской даты
по непонятному алгоритму из
статьи на Астронет со множеством неописанных констант. Проверено в интервале с 0001-01-01 по 3999-12-31, алгоритмы дают одинаковые результаты.
Функция НомерНеделиIso8601(Дата)
Перем J;
Перем d4;
Перем L;
Перем d1;
J = НомерЮлианскогоДня(Дата);
d4 = (J + 31741 - (J % 7)) % 146097 % 36524 % 1461;
L = Цел(d4 / 1460);
d1 = ((d4 - L) % 365) + L;
Возврат Цел(d1 / 7) + 1;
КонецФункции
Функция НомерЮлианскогоДня(Дата)
Перем a;
Перем y;
Перем m;
Перем JDN;
a = Цел((14 - Месяц(Дата)) / 12);
y = Год(Дата) + 4800 - a;
m = Месяц(Дата) + 12 * a - 3;
JDN = День(Дата) + Цел((153 * m + 2) / 5) + 365 * y + Цел(y / 4) - Цел(y / 100) + Цел(y / 400) - 32045;
Возврат JDN;
КонецФункции