При работе с платформой 1С:Предприятие часто возникает специфическая проблема: при обычном формировании отчетов в интерактивном режиме пользователем все даты и суммы прописью выводятся корректно на русском языке, но стоит запустить генерацию того же документа (например, Торг-12 или счета-фактуры) через HTTP- или Web-сервис в формате PDF, как месяцы в датах и денежные суммы прописью начинают выводиться на английском языке.
Особенно часто с этим сталкиваются системные администраторы и разработчики при развертывании баз на Windows Server 2016/2019, который изначально был установлен на английском языке, а затем русифицирован с помощью языковых пакетов (Language Packs). Давайте подробно разберем, почему так происходит, и рассмотрим по шагам четыре эффективных способа решения этой проблемы.
Для того чтобы понять природу этой ошибки, выполним несложный диагностический шаг. Если в коде HTTP-сервиса вызвать функцию ТекущийКодЛокализации(), то в проблемной системе мы увидим значение en_US вместо ожидаемого ru_RU. Возникает логичный вопрос: почему сеанс веб-сервиса инициализируется с англоязычной локалью, если в самой системе и в региональных настройках информационной базы 1С везде жестко указан русский язык?
Дело в особенностях работы веб-серверов. Когда запрос к 1С поступает через Web- или HTTP-сервис, управление передается веб-серверу — чаще всего это Internet Information Services (IIS) или Apache. Эти службы работают в операционной системе Windows под специальными системными учетными записями:
ApplicationPoolIdentity или NetworkService.SYSTEM (Локальная система).Если операционная система изначально устанавливалась как англоязычная (English US), то все встроенные системные профили (SYSTEM, NetworkService, LocalService) навсегда сохраняют региональные настройки en_US. Обычная русификация интерфейса Windows через Панель управления меняет настройки только для текущего активного пользователя (например, Администратора) и для новых учетных записей, но не затрагивает уже существующие скрытые системные профили служб. В результате веб-сервер запускает рабочий процесс 1С в окружении с английской локалью, что напрямую влияет на форматирование дат и чисел.
Ниже подробно описаны четыре практических метода исправления этой ситуации.
Это самый надежный системный метод, который решает проблему глобально на уровне операционной системы. Мы принудительно скопируем правильные русские региональные настройки текущего пользователя во все системные профили служб Windows.
English (United States), то проблема именно в этом.Если вы не имеете возможности перезагрузить сервер прямо сейчас или политика безопасности запрещает менять системные настройки ОС, можно решить проблему локально для конкретной публикации 1С. Для этого мы отредактируем файл конфигурации публикации default.vrd.
Платформа 1С позволяет жестко задать язык интерфейса и код локализации для всех сеансов, запускаемых через конкретную веб-публикацию. Для этого используются параметры запуска L (язык интерфейса) и VL (код локализации).
Рассмотрим по шагам процесс изменения файла публикации:
C:\inetpub\wwwroot\ИмяВашейПубликации\. Для сервера Apache путь настраивается при публикации (например, C:\Apache24\htdocs\ИмяВашейПубликации\).default.vrd и откройте его в любом текстовом редакторе (например, Блокноте) от имени Администратора.<point>, в котором содержится строка подключения к вашей базе данных в атрибуте ib.L=ru;VL=ru_RU; сразу после указания имени сервера и базы.Проанализируем пример изменения файла default.vrd. Изначальный файл выглядит следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<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="/MyBase"
ib="Srvr="MainServer";Ref="TradeBase";">
<ws>
<point name="WebServiceName" alias="ws1.1c" enable="true"/>
</ws>
</point>
Для исправления проблемы мы изменяем значение атрибута ib следующим образом:
<?xml version="1.0" encoding="UTF-8"?>
<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="/MyBase"
ib="Srvr="MainServer";Ref="TradeBase";L="ru";VL="ru_RU";">
<ws>
<point name="WebServiceName" alias="ws1.1c" enable="true"/>
</ws>
</point>
После сохранения изменений обязательно перезапустите веб-сервер (или пул приложений в IIS), чтобы файл конфигурации прочитался заново. Теперь все сеансы, создаваемые через этот веб-сервис, гарантированно получат локализацию ru_RU.
Если ваша база опубликована на веб-сервере IIS, можно пойти по пути изоляции процессов. Вместо того чтобы пулы приложений использовали системные учетные записи по умолчанию, мы укажем для них конкретного пользователя операционной системы Windows, у которого заведомо правильно настроена русская локаль (например, учетную запись USR1CV8 или специально созданного локального пользователя).
ИмяКомпьютера\ИмяПользователя или просто имя пользователя для локальной учетной записи) и пароль. Этот пользователь должен обладать правами на запуск процессов и чтение каталогов 1С.Иногда возникают ситуации, когда у разработчика нет доступа к администрированию Windows Server или настройкам IIS/Apache, а отчеты нужно сдавать срочно. В таком случае проблему можно решить непосредственно в коде конфигурации 1С. Для этого мы будем использовать явное указание локали в функциях форматирования.
Рассмотрим, как изменить вывод чисел прописью. Стандартный вызов функции без указания локали выглядит так:
// Стандартный вызов, зависящий от настроек сеанса ОС
РезультатПрописи = ЧислоПрописью(СуммаДокумента, , "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
Чтобы исключить влияние настроек Windows на язык вывода, мы передадим код локализации во втором параметре (внутри строки параметров формата под кодом Л или L):
// Безопасный вызов с принудительной русской локалью
ПараметрыФормата = "Л=ru_RU";
РезультатПрописи = ЧислоПрописью(СуммаДокумента, ПараметрыФормата, "рубль, рубля, рублей, м, копейка, копейки, копеек, ж, 2");
Аналогичным образом поступим с форматированием дат. При выводе месяцев прописью функция Формат() часто обращается к локали сеанса. Предотвратить вывод английских названий месяцев можно, явно добавив код локали в строку формата:
// Старый вариант, который выведет "15 May 2024" в английском окружении:
ТекстДаты = Формат(ТекущаяДата(), "ДФ='dd MMMM yyyy г.'");
// Новый вариант, который всегда выведет "15 мая 2024 г.":
ТекстДаты = Формат(ТекущаяДата(), "ДФ='dd MMMM yyyy г.'; Л=ru_RU");
Этот подход требует точечного вмешательства в код формирования печатных форм (особенно в общих модулях печати), но гарантирует 100% стабильность работы независимо от настроек веб-сервера.
Мы подробно проанализировали проблему англоязычной локализации отчетов в веб-сервисах 1С на русифицированных серверах Windows. Для системного решения мы рекомендуем использовать Способ 1 (копирование региональных настроек через Панель управления) в сочетании со Способом 2 (прописывание параметров L и VL в файле default.vrd). Это полностью исключит любые неожиданности с языком интерфейса и форматами дат при интеграции 1С с внешними системами.