При работе с HTTP-сервисами 1С, опубликованными на веб-сервере Apache под управлением ОС Linux (например, CentOS 7), разработчики часто сталкиваются с ситуацией, когда соединение с информационной базой устанавливается с локалью English, USA. Это приводит к тому, что все системные сообщения, форматы дат и чисел внутри сеанса принимают англоязычный вид (например, формат даты 4/2/2019 11:02:01 AM вместо привычного российского стандарта). Рассмотрим подробнее, почему это происходит и как мы можем исправить эту ситуацию несколькими способами.
Проблема кроется в том, что модуль расширения веб-сервера 1С при создании нового сеанса ориентируется на окружение, в котором запущен процесс Apache (httpd). Если в настройках службы Apache или в профиле пользователя, от имени которого запускается сервис, явно не указаны языковые параметры, 1С может инициализировать сеанс с настройками по умолчанию, которыми часто является американская локаль. Даже если системная локаль всей ОС CentOS установлена как ru_RU.UTF-8, процесс веб-сервера может ее не наследовать в полной мере.
Проанализируем доступные методы решения — от программных манипуляций в коде до глубокой настройки конфигурационных файлов сервера.
Самый быстрый способ повлиять на локаль сеанса со стороны клиента — это передача специального заголовка. Модуль расширения веб-сервера 1С умеет анализировать заголовок Accept-Language и на его основе устанавливать язык сеанса.
Если мы вызываем HTTP-сервис программно из другой базы 1С или внешнего приложения, добавим следующую строку кода при формировании запроса:
// Пример добавления заголовка в объект HTTPЗапрос
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Accept-Language", "ru-ru,ru;q=0.8");
// Теперь при обработке этого запроса 1С установит русскую локаль для сеанса
Этот метод хорош тем, что он не требует доступа к настройкам сервера, но он помогает только в том случае, если вы контролируете вызывающую сторону.
Если мы хотим решить проблему глобально на стороне сервера, чтобы любой входящий запрос обрабатывался в русской локали, нам нужно заставить процесс Apache «увидеть» нужные переменные окружения. В современных дистрибутивах Linux с системой инициализации systemd это делается через переопределение параметров сервиса.
Выполним следующие шаги:
systemctl edit httpd.LANG и LC_ALL:
[Service]
Environment="LANG=ru_RU.UTF-8"
Environment="LC_ALL=ru_RU.UTF-8"
После сохранения файла необходимо перезагрузить конфигурацию systemd и сам веб-сервер:
systemctl daemon-reload
systemctl restart httpd
Теперь процесс веб-сервера будет работать в контексте русской локали, и модуль 1С будет использовать её для всех новых соединений.
Выясним, как можно задать язык для конкретной публикации. Каждый HTTP-сервис описывается в файле default.vrd. Мы можем принудительно указать язык интерфейса прямо в атрибутах точки подключения. Найдем блок vrs:point и добавим атрибут defaultLanguage.
Пример структуры файла:
<vrs:point xmlns:vrs="http://v8.1c.ru/8.2/virtual-resource-system"
base="/MyService"
ib="Connect='Srvr=Server1C;Ref=Base1C;'"
defaultLanguage="ru">
</vrs:point>
Установка defaultLanguage="ru" заставляет платформу игнорировать настройки клиента и всегда использовать русский язык для данного сервиса.
Если нам необходимо установить русский язык для всей платформы 1С на сервере Linux, воспользуемся файлом conf.cfg. На Linux этот файл располагается по иным путям, нежели в Windows. Рассмотрим, где его искать:
/opt/1cv8/common/conf.cfg/opt/1cv8/x86_64/8.3.XX.XXXX/conf/conf.cfgПроанализируем содержимое файла. Если его нет — создадим его. Добавим в него параметр SystemLanguage:
SystemLanguage=RU
Важный момент: Убедитесь, что у пользователя apache (или того, под которым запущен веб-сервер) есть права на чтение этого файла и каталогов платформы в /opt/1cv8/.
В ситуациях, когда настройки сервера недоступны, а локаль сеанса все равно определяется неверно, мы можем использовать явное указание локали в функциях форматирования. Это гарантирует, что пользователь увидит дату в нужном формате независимо от настроек Apache или Accept-Language.
Посмотрим на пример использования функции Формат() с явным указанием параметра Л (Locale):
// Вместо обычного вывода:
ПредставлениеДаты = Формат(ТекущаяДата(), "ДЛФ=DT");
// Используем явную локаль:
ПредставлениеДаты = Формат(ТекущаяДата(), "ДЛФ=DT; Л=ru_RU");
// Результат всегда будет: 02.04.2019 11:02:01
Этот метод является наиболее трудозатратным, так как требует изменения кода во всех местах вывода данных, но он обеспечивает 100% предсказуемый результат в любых условиях окружения.
Подводя итог, наиболее правильным архитектурным решением для Linux-серверов является комбинация Способа 2 (настройка systemd для Apache) и Способа 3 (параметр в default.vrd). Это позволяет централизованно управлять языковой средой без необходимости вмешательства в программный код конфигурации.