При переходе на платформу 1С:Предприятие 8.3 разработчики нередко сталкиваются с ситуацией, когда требуется вывести дату вместе с номером недели с начала года или отобразить номер недели в пользовательском интерфейсе. Разберем, как устроено форматирование дат на платформе 1С 8.3, почему нельзя получить номер недели исключительно через форматную строку и какие существуют корректные способы решения этой задачи.
В синтаксисе форматной строки даты (параметр ДФ) платформы 1С:Предприятие 8 полностью отсутствуют спецификаторы недели года. Поддерживаются только элементы даты и времени:
д, дд, ддд (краткое наименование дня недели), дддд (полное наименование дня недели).М, ММ, МММ, ММММ.к.г, гг, гггг.ч, минуты м, секунды с и признак первой/второй половины дня вв.Спецификаторы для вывода номера недели (такие как w или W) в параметре ДФ отсутствуют, поэтому сформировать строку с номером недели одной только функцией Формат() без вспомогательных функций невозможно.
Для вычисления целочисленного номера недели во встроенном языке 1С предусмотрена глобальная функция НеделяГода(). Она принимает на вход значение типа Дата и возвращает номер недели в диапазоне от 1 до 53.
Рассмотрим, как объединить форматированную дату и номер недели с помощью стандартной функции СтрШаблон():
ТекущаяДата = ТекущаяДатаСеанса();
СтрокаВывода = СтрШаблон("%1 (неделя %2)", Формат(ТекущаяДата, "ДФ=dd.MM.yyyy"), НеделяГода(ТекущаяДата));
Если в конфигурации используется Библиотека стандартных подсистем (БСП), аналогичный результат можно получить с помощью функции подсистемы базовой функциональности:
СтрокаВывода = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
"%1 (неделя %2)",
Формат(ТекущаяДата, "ДФ=dd.MM.yyyy"),
НеделяГода(ТекущаяДата)
);
При использовании функции НеделяГода() важно учитывать, что платформа рассчитывает номер недели в строгом соответствии с международным стандартом ISO 8601. По этому стандарту:
Из-за этого правила первые дни января (например, 1, 2 или 3 января, если они выпадают на пятницу, субботу или воскресенье) могут относиться к 52-й или 53-й неделе предыдущего года. И наоборот: последние числа декабря могут относиться к 1-й неделе следующего года. Если вы формируете отчетность или вывод на форму, где год и неделя выводятся отдельно, учитывайте эту особенность стандартизации.
Разберем ситуации, когда номер недели нужно вывести в список или отчет без ручной конкатенации строк в коде:
НеделяГода(ПолеДата) для получения числового номера либо функцию Неделя(ПолеДата) для получения даты начала недели.НАЧАЛОПЕРИОДА(Дата, НЕДЕЛЯ)). Чтобы отобразить номер недели в динамическом списке, обычно используют вычисление строкового представления на сервере в обработчике ПриПолученииДанныхНаСервере либо связывают запрос списка с данными производственного календаря.