При переносе баз данных 1С на серверы под управлением Linux разработчики нередко сталкиваются с ситуацией, когда HTTP-сервисы начинают возвращать даты и числа в английском формате (например, en_US_POSIX), даже если в консоли администрирования кластера указан русский язык. Давайте разберем, почему это происходит и как заставить платформу использовать корректную локаль.
Когда 1С работает на Linux, она опирается на системные библиотеки glibc для определения региональных настроек. Если сеанс HTTP-сервиса запускается без явного указания локали, платформа может наследовать системные переменные окружения веб-сервера или ОС, которые по умолчанию настроены на POSIX (или «C»), игнорируя настройки кластера. Поскольку сеанс HTTP-сервиса создается автоматически при поступлении запроса, стандартные ключи запуска типа /VL, предназначенные для ярлыков запуска, здесь не применимы напрямую.
Первым делом проанализируем файл default.vrd, который находится в директории публикации вашего веб-сервера. Этот файл управляет поведением публикации и позволяет передать платформе параметры запуска сеанса. Мы можем попробовать принудительно задать параметры языка.
Откройте файл default.vrd в текстовом редакторе и убедитесь, что настройки локали соответствуют вашим требованиям. Попробуйте добавить параметры в строку подключения или уточнить настройки публикации:
<point xmlns="http://v8.1c.ru/8.2/virtual-resource-system"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
base="/my_service"
ib="Srvr='server';Ref='base';"
lang="ru">
</point>
После внесения изменений необходимо перезапустить веб-сервер, чтобы настройки вступили в силу.
Иногда полезно передать код локализации непосредственно в URL при обращении к HTTP-сервису. Хотя это не всегда срабатывает для уже созданного сеанса, в некоторых случаях веб-сервер корректно интерпретирует эти параметры при создании соединения:
Попробуйте добавить к адресу вашего сервиса параметры ?L=ru&VL=ru_RU. Например: http://your-server/pub/hs/doc/get?L=ru&VL=ru_RU. Это может подсказать системе, какую локаль использовать при инициализации контекста исполнения.
Если проблема сохраняется, самое время «заглянуть под капот». Давайте настроим Технологический Журнал (ТЖ), чтобы увидеть, с какими именно параметрами создается сеанс при обращении к сервису. Это поможет понять, игнорирует ли система наши настройки или просто использует дефолтное значение.
Создайте файл конфигурации logcfg.xml со следующим содержанием:
<config xmlns="http://v8.1c.ru/v8/tech-log">
<log location="/var/log/1c/logs" history="24">
<event>
<eq property="Method" value="POST"/>
</event>
<property name="all"/>
</log>
</config>
После включения ТЖ выполните запрос к сервису и изучите полученные логи. Ищите запись с параметром VL. Если там указано en_US, значит, платформа берет этот параметр из окружения пользователя, от имени которого работает процесс rphost (обычно это usr1cv8).
Часто проблема кроется в том, что системная локаль веб-сервера (Apache или Nginx) установлена на английский язык. Чтобы это исправить, нужно принудительно задать переменные окружения для процесса веб-сервера.
envvars для Apache в Debian/Ubuntu).
export LANG=ru_RU.UTF-8
export LC_ALL=ru_RU.UTF-8
Не забудьте проверить, установлена ли сама локаль в операционной системе. Выполните команду locale -a. Если ru_RU.UTF-8 отсутствует в списке, система не сможет корректно переключиться на русский язык. Добавьте её в /etc/locale.gen и выполните sudo locale-gen. Это фундаментальный шаг, без которого любые настройки 1С могут быть проигнорированы системными библиотеками.
Работая сообща над этими шагами, мы сможем добиться того, чтобы даты и числа отображались именно в том виде, который требуется для бизнес-логики вашего приложения. Помните, что ключевым моментом здесь является согласованность настроек уровня ОС, параметров публикации и переменных окружения веб-сервера.