Как получить и вывести номер недели с начала года в 1С 8.3?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При переходе на платформу 1С:Предприятие 8.3 разработчики нередко сталкиваются с ситуацией, когда требуется вывести дату вместе с номером недели с начала года или отобразить номер недели в пользовательском интерфейсе. Разберем, как устроено форматирование дат на платформе 1С 8.3, почему нельзя получить номер недели исключительно через форматную строку и какие существуют корректные способы решения этой задачи.

Ограничения функции Формат для дат

В синтаксисе форматной строки даты (параметр ДФ) платформы 1С:Предприятие 8 полностью отсутствуют спецификаторы недели года. Поддерживаются только элементы даты и времени:

  1. День: д, дд, ддд (краткое наименование дня недели), дддд (полное наименование дня недели).
  2. Месяц: М, ММ, МММ, ММММ.
  3. Квартал: к.
  4. Год: г, гг, гггг.
  5. Время: часы ч, минуты м, секунды с и признак первой/второй половины дня вв.

Спецификаторы для вывода номера недели (такие как w или W) в параметре ДФ отсутствуют, поэтому сформировать строку с номером недели одной только функцией Формат() без вспомогательных функций невозможно.

Штатный способ: использование встроенной функции НеделяГода

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

Рассмотрим, как объединить форматированную дату и номер недели с помощью стандартной функции СтрШаблон():


ТекущаяДата = ТекущаяДатаСеанса();
СтрокаВывода = СтрШаблон("%1 (неделя %2)", Формат(ТекущаяДата, "ДФ=dd.MM.yyyy"), НеделяГода(ТекущаяДата));

Если в конфигурации используется Библиотека стандартных подсистем (БСП), аналогичный результат можно получить с помощью функции подсистемы базовой функциональности:


СтрокаВывода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
    "%1 (неделя %2)",
    Формат(ТекущаяДата, "ДФ=dd.MM.yyyy"),
    НеделяГода(ТекущаяДата)
);

Особенности стандарта нумерации недель ISO 8601

При использовании функции НеделяГода() важно учитывать, что платформа рассчитывает номер недели в строгом соответствии с международным стандартом ISO 8601. По этому стандарту:

  1. Первым днем недели всегда считается понедельник.
  2. Первой неделей года считается та неделя, которая содержит первый четверг нового года (или содержит не менее 4 дней нового года).

Из-за этого правила первые дни января (например, 1, 2 или 3 января, если они выпадают на пятницу, субботу или воскресенье) могут относиться к 52-й или 53-й неделе предыдущего года. И наоборот: последние числа декабря могут относиться к 1-й неделе следующего года. Если вы формируете отчетность или вывод на форму, где год и неделя выводятся отдельно, учитывайте эту особенность стандартизации.

Отображение недели в динамических списках и СКД

Разберем ситуации, когда номер недели нужно вывести в список или отчет без ручной конкатенации строк в коде:

  1. Система компоновки данных (СКД): в вычисляемых полях или пользовательских полях можно напрямую использовать выражение НеделяГода(ПолеДата) для получения числового номера либо функцию Неделя(ПолеДата) для получения даты начала недели.
  2. Динамические списки: в языке запросов 1С функция получения номера недели отсутствует (доступна только конструкция НАЧАЛОПЕРИОДА(Дата, НЕДЕЛЯ)). Чтобы отобразить номер недели в динамическом списке, обычно используют вычисление строкового представления на сервере в обработчике ПриПолученииДанныхНаСервере либо связывают запрос списка с данными производственного календаря.
← На главную