Почему при вызове через HTTP-сервис 1С тип объекта возвращается на английском языке и как это исправить

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

Нередко разработчики сталкиваются с ситуацией: при интерактивной работе пользователя или обычном клиент-серверном вызове прикладной код 1С отрабатывает на русском языке, а при обращении через опубликованный HTTP-сервис системные типы внезапно возвращаются на английском языке. Например, строковое представление типа объекта вместо привычного Документ возвращает Document, из-за чего ломаются условия вида Лев(ТипЗнч(ИсточникОбъект), 8) = "Документ".

Разберем детально, почему так происходит, какие механизмы платформы 1С и операционной системы отвечают за локализацию контекста HTTP-сервисов, как правильно сконфигурировать серверное окружение и как переписать прикладной код, чтобы навсегда исключить подобные ошибки.

Выясним причину англоязычной локализации HTTP-сеанса

Когда пользователь работает в толстом или тонком клиенте, язык интерфейса и системных представлений инициализируется на основе настроек запуска клиентского приложения, параметров информационной базы или региональных настроек текущего интерактивного профиля Windows. В случае с HTTP-сервисами процесс инициализации контекста устроен совершенно иначе:

  1. Контекст системного пула веб-сервера. При публикации на IIS рабочий процесс пула приложений исполняется под специализированной учетной записью (чаще всего ApplicationPoolIdentity, IUSR или NETWORK SERVICE). Если операционная система изначально была англоязычной, профиль системных служб по умолчанию (ветка .DEFAULT в реестре) сохраняет английские региональные стандарты, даже если для конкретного администратора уже установлен русский интерфейс.
  2. Язык учетной записи 1С. Вызов HTTP-сервиса выполняется от имени конкретного пользователя информационной базы (указанного в настройках публикации default.vrd или переданного в заголовке Basic-авторизации). Если в карточке этого пользователя в поле Основной язык значение не выбрано, платформа пытается определить язык по системным установкам процесса веб-сервера.
  3. Отсутствие влияния HTTP-заголовков клиента. Передача заголовка Accept-Language: ru-RU в клиентском HTTP-запросе не меняет язык запущенного сеанса 1С. Платформа фиксирует язык при инициализации соединения, и стандартные заголовки веб-клиента на внутренние системные типы 1С действия не оказывают.

Решение 1. Исправление прикладного кода (рекомендуемый стандарт разработки)

Проанализируем исходную проверку:


// Ненадежный вариант, зависящий от языка интерфейса:
Если Лев(ТипЗнч(ИсточникОбъект), 8) = "Документ" Тогда
    // Обработка документа
КонецЕсли;

Опираться на строковое представление типа платформы крайне не рекомендуется, так как оно зависит от языка локализации конкретного сеанса. Проверку принадлежности объекта или ссылки к метаданным документов необходимо выполнять через объектную модель метаданных платформы.

Рассмотрим универсальный способ проверки через функцию Метаданные.НайтиПоТипу(). Он корректно работает как для объектов (ДокументОбъект), так и для ссылок (ДокументСсылка), выборок и любых других типов данных:


ТипПроверяемогоЗначения = ТипЗнч(ИсточникОбъект);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипПроверяемогоЗначения);

Если ОбъектМетаданных <> Неопределено И Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
    // Значение гарантированно является документом (ссылкой или объектом)
КонецЕсли;

Если в процедуру гарантированно передается прикладной объект или ссылка (значения, обладающие методом Метаданные()), можно использовать прямую проверку:


Если Метаданные.Документы.Содержит(ИсточникОбъект.Метаданные()) Тогда
    // Обработка документа
КонецЕсли;

Если в конфигурации используется Библиотека стандартных подсистем (БСП), воспользуемся готовой универсальной функцией общего модуля:


Если ОбщегоНазначения.ЭтоДокумент(ИсточникОбъект) Тогда
    // Обработка документа
КонецЕсли;

Такой подход полностью исключает человеческий фактор и делает код абсолютно независимым от системного языка сервера, пула IIS и региональных настроек сеанса.

Решение 2. Указание основного языка в карточке пользователя 1С

Разберем быструю настройку внутри информационной базы, которая позволяет принудительно задать русский язык для сеанса веб-сервиса:

  1. Откроем информационную базу в режиме Конфигуратор.
  2. Перейдем в главное меню: Администрирование > Пользователи.
  3. Найдем пользователя, под которым авторизуется HTTP-сервис (или служебную учетную запись интеграции).
  4. Откроем свойства пользователя и в реквизите Основной язык принудительно выберем значение Русский вместо значения Не указан.
  5. Сохраним изменения. Теперь все сеансы этого пользователя будут гарантированно инициализироваться с русской локалью.

Решение 3. Указание локали в файле публикации default.vrd

Посмотрим, как задать параметры локализации непосредственно на уровне публикации веб-сервера. В каталоге публикации веб-приложения находится конфигурационный файл default.vrd. В строке подключения к базе данных можно явно передать параметр Locale.

Откроем default.vrd в текстовом редакторе и дополним атрибут ib:


<!-- Для клиент-серверного варианта базы -->
ib="Srvr=&quot;ИмяСервера&quot;;Ref=&quot;ИмяБазы&quot;;Locale=&quot;ru_RU&quot;;"

<!-- Для файлового варианта базы -->
ib="File=&quot;C:\Bases\MyBase&quot;;Locale=&quot;ru_RU&quot;;"

После сохранения изменений выполним перезапуск веб-сервера IIS командой iisreset в командной строке.

Решение 4. Настройка файла conf.cfg и учет разрядности платформы

Параметр SystemLanguage в конфигурационном файле conf.cfg определяет язык интерфейса и системных сообщений платформы по умолчанию. Если система установлена на англоязычной ОС, платформа может автоматически выбирать английский язык.

Рассмотрим правила применения этой настройки:

  1. Определим разрядность рабочего пула IIS. Если в IIS для пула приложений включен 64-битный режим и используется 64-битный модуль расширения веб-сервера (wsisapi.dll), файл конфигурации необходимо редактировать в каталоге 64-битной платформы: C:\Program Files\1cv8\conf\conf.cfg. Если пул 32-битный — в каталоге C:\Program Files (x86)\1cv8\conf\conf.cfg.
  2. Откроем файл conf.cfg и добавим строку: SystemLanguage=RU
  3. Также данную настройку можно поместить в файл conf.cfg внутри подкаталога конкретной версии платформы, используемой в публикации (например, C:\Program Files\1cv8\8.3.XX.XXXX\conf\conf.cfg).
  4. После внесения правок перезапустим службу сервера 1С:Предприятия и веб-сервер IIS.

Решение 5. Копирование региональных стандартов в системные учетные записи Windows

Если операционная система изначально была установлена на английском языке, системные учетные записи служб (включая учетные записи IIS и службы сервера 1С) сохраняют английскую системную локаль. Исправим это системными средствами Windows:

  1. На сервере откроем классическую Панель управления (Control Panel).
  2. Перейдем в раздел Часы и регион > Региональные стандарты (Region).
  3. Перейдем на вкладку Дополнительно (Administrative).
  4. В блоке «Язык программ, не поддерживающих Юникод» нажмем кнопку Изменить язык системы... и выберем Русский (Россия).
  5. В блоке «Экран приветствия и учетные записи новых пользователей» нажмем кнопку Копировать параметры....
  6. В нижней части открывшегося окна установим оба флажка: Экран приветствия и системные учетные записи и Новые учетные записи пользователей.
  7. Нажмем ОК и обязательно выполним полную перезагрузку операционной системы сервера.

После применения этих параметров все системные службы Windows, процессы IIS и серверные процессы 1С будут запускаться в полноценном русскоязычном региональном окружении.

← На главную