Как изменить локаль с английской на русскую в HTTP-сервисах 1С на CentOS 7

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

При работе с 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С умеет анализировать заголовок Accept-Language и на его основе устанавливать язык сеанса.

Если мы вызываем HTTP-сервис программно из другой базы 1С или внешнего приложения, добавим следующую строку кода при формировании запроса:


// Пример добавления заголовка в объект HTTPЗапрос
Запрос = Новый HTTPЗапрос(Ресурс);
Запрос.Заголовки.Вставить("Accept-Language", "ru-ru,ru;q=0.8");
// Теперь при обработке этого запроса 1С установит русскую локаль для сеанса

Этот метод хорош тем, что он не требует доступа к настройкам сервера, но он помогает только в том случае, если вы контролируете вызывающую сторону.

Способ 2. Настройка переменных окружения Apache через systemd

Если мы хотим решить проблему глобально на стороне сервера, чтобы любой входящий запрос обрабатывался в русской локали, нам нужно заставить процесс Apache «увидеть» нужные переменные окружения. В современных дистрибутивах Linux с системой инициализации systemd это делается через переопределение параметров сервиса.

Выполним следующие шаги:

  1. Откроем редактор переопределений для сервиса Apache: systemctl edit httpd.
  2. В открывшемся файле добавим секцию, устанавливающую переменные 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С будет использовать её для всех новых соединений.

Способ 3. Параметры в файле публикации default.vrd

Выясним, как можно задать язык для конкретной публикации. Каждый 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" заставляет платформу игнорировать настройки клиента и всегда использовать русский язык для данного сервиса.

Способ 4. Глобальная настройка в файле conf.cfg

Если нам необходимо установить русский язык для всей платформы 1С на сервере Linux, воспользуемся файлом conf.cfg. На Linux этот файл располагается по иным путям, нежели в Windows. Рассмотрим, где его искать:

Проанализируем содержимое файла. Если его нет — создадим его. Добавим в него параметр SystemLanguage:

SystemLanguage=RU

Важный момент: Убедитесь, что у пользователя apache (или того, под которым запущен веб-сервер) есть права на чтение этого файла и каталогов платформы в /opt/1cv8/.

Способ 5. Принудительное форматирование в коде 1С

В ситуациях, когда настройки сервера недоступны, а локаль сеанса все равно определяется неверно, мы можем использовать явное указание локали в функциях форматирования. Это гарантирует, что пользователь увидит дату в нужном формате независимо от настроек Apache или Accept-Language.

Посмотрим на пример использования функции Формат() с явным указанием параметра Л (Locale):


// Вместо обычного вывода:
ПредставлениеДаты = Формат(ТекущаяДата(), "ДЛФ=DT"); 

// Используем явную локаль:
ПредставлениеДаты = Формат(ТекущаяДата(), "ДЛФ=DT; Л=ru_RU");
// Результат всегда будет: 02.04.2019 11:02:01

Этот метод является наиболее трудозатратным, так как требует изменения кода во всех местах вывода данных, но он обеспечивает 100% предсказуемый результат в любых условиях окружения.

Подводя итог, наиболее правильным архитектурным решением для Linux-серверов является комбинация Способа 2 (настройка systemd для Apache) и Способа 3 (параметр в default.vrd). Это позволяет централизованно управлять языковой средой без необходимости вмешательства в программный код конфигурации.

← На главную