Региональные настройки в Bitrix D7: \Bitrix\Main\Context\Culture
Зачем отдельный объект Culture
В D7 строковые представления дат на витрине и в административке не должны жёстко прошиваться в шаблонах: они зависят от языка сайта и выбранных шаблонов в региональных настройках. За это отвечает \Bitrix\Main\Context\Culture — объект с полями вроде FORMAT_DATE, FORMAT_DATETIME, FORMAT_NAME, CHARSET, DIRECTION, WEEK_START. Его удобно читать из текущего Context или поднимать из таблицы b_culture через ORM.
Текущие региональные настройки хита
Для активного запроса достаточно взять культуру у singleton-контекста приложения:
$culture = \Bitrix\Main\Context::getCurrent()->getCulture();В отладке вы увидите набор полей (языковой код, сортировка, форматы, признак направления RTL и т.д.). На продакшене не печатайте объект целиком в публичный вывод — это лишний шум и утечка конфигурации.
Свой экземпляр на время задачи
Иногда нужно временно отформатировать данные по правилам другой локали (отчёт, выгрузка, письмо). Создайте отдельный объект с нужным набором полей и при необходимости передайте его в Context::setCulture() — но делайте это точечно, чтобы не сломать компоненты, завязанные на глобальные форматы текущего сайта:
use Bitrix\Main\Context\Culture;
$culture = new Culture([
'FORMAT_DATE' => 'MM/DD/YYYY',
'FORMAT_DATETIME' => 'MM/DD/YYYY HH:MI:SS',
'FORMAT_NAME' => '#NAME# #LAST_NAME#',
'CHARSET' => 'UTF-8',
'DIRECTION' => 'Y',
'WEEK_START' => 0,
]);Загрузка из базы по идентификатору
Метод Culture::wakeUp($cultureId) восстанавливает объект по числовому ID записи региональных настроек. Удобно, когда у вас в настройках модуля или в пользовательских полях хранится ссылка на конкретную строку таблицы культур, а не символьный код языка сайта:
$cultureId = 1;
$culture = \Bitrix\Main\Context\Culture::wakeUp($cultureId);Геттеры форматов и кодировки
На практике чаще всего нужны человекочитаемые строки формата для DateTime или отображения имени пользователя по шаблону из административной части:
$charset = $culture->getCharset();
$dateFormat = $culture->getDateFormat();
$dateTimeFormat = $culture->getDateTimeFormat();Состав полей синхронизирован с тем, что задаётся в настройках языков интерфейса; не дублируйте те же литералы в своём коде, если уже есть объект Culture.
Справочник всех культур в системе
ORM-таблица \Bitrix\Main\Localization\CultureTable повторяет содержимое b_culture. Типичный разбор без лишней логики:
$result = \Bitrix\Main\Localization\CultureTable::getList();
while ($row = $result->fetch()) {
// ID, CODE, NAME, FORMAT_DATE, FORMAT_DATETIME, ...
}Используйте выборку, когда строите селекты «язык/формат» в собственных модулях или сверяете доступные культуры с мультиязычностью сайта.
Практические замечания
- Глобальная подмена культуры на весь хит без причины опасна для кешируемых фрагментов и компонентов, которые читают форматы при первой инициализации.
- В агентах и CLI-скриптах контекст может быть не тем же, что у веб-запроса: при необходимости явно инициализируйте сайт и язык до чтения
getCulture(). - Для HTTP-деталей запроса (а не только форматов) смотрите обзор
Context::getCurrent()целиком: там жеgetRequest(),getSite()и язык интерфейса.
Итог
Минимальный набор API: Context::getCurrent()->getCulture() для текущих форматов, конструктор Culture или wakeUp() для явных профилей, getDateFormat() / getDateTimeFormat() / getCharset() для интеграции с вашим кодом и CultureTable::getList() для перебора записей справочника.
Не хотите копаться сами?
Починю за 1-3 дня. Без предоплаты — оплата по результату.
15+ лет опыта с 1С-Битрикс · Без предоплаты · 7 дней гарантии