Нередко разработчики сталкиваются с ситуацией: при интерактивной работе пользователя или обычном клиент-серверном вызове прикладной код 1С отрабатывает на русском языке, а при обращении через опубликованный HTTP-сервис системные типы внезапно возвращаются на английском языке. Например, строковое представление типа объекта вместо привычного Документ возвращает Document, из-за чего ломаются условия вида Лев(ТипЗнч(ИсточникОбъект), 8) = "Документ".
Разберем детально, почему так происходит, какие механизмы платформы 1С и операционной системы отвечают за локализацию контекста HTTP-сервисов, как правильно сконфигурировать серверное окружение и как переписать прикладной код, чтобы навсегда исключить подобные ошибки.
Когда пользователь работает в толстом или тонком клиенте, язык интерфейса и системных представлений инициализируется на основе настроек запуска клиентского приложения, параметров информационной базы или региональных настроек текущего интерактивного профиля Windows. В случае с HTTP-сервисами процесс инициализации контекста устроен совершенно иначе:
ApplicationPoolIdentity, IUSR или NETWORK SERVICE). Если операционная система изначально была англоязычной, профиль системных служб по умолчанию (ветка .DEFAULT в реестре) сохраняет английские региональные стандарты, даже если для конкретного администратора уже установлен русский интерфейс.default.vrd или переданного в заголовке Basic-авторизации). Если в карточке этого пользователя в поле Основной язык значение не выбрано, платформа пытается определить язык по системным установкам процесса веб-сервера.Accept-Language: ru-RU в клиентском HTTP-запросе не меняет язык запущенного сеанса 1С. Платформа фиксирует язык при инициализации соединения, и стандартные заголовки веб-клиента на внутренние системные типы 1С действия не оказывают.Проанализируем исходную проверку:
// Ненадежный вариант, зависящий от языка интерфейса:
Если Лев(ТипЗнч(ИсточникОбъект), 8) = "Документ" Тогда
// Обработка документа
КонецЕсли;
Опираться на строковое представление типа платформы крайне не рекомендуется, так как оно зависит от языка локализации конкретного сеанса. Проверку принадлежности объекта или ссылки к метаданным документов необходимо выполнять через объектную модель метаданных платформы.
Рассмотрим универсальный способ проверки через функцию Метаданные.НайтиПоТипу(). Он корректно работает как для объектов (ДокументОбъект), так и для ссылок (ДокументСсылка), выборок и любых других типов данных:
ТипПроверяемогоЗначения = ТипЗнч(ИсточникОбъект);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипПроверяемогоЗначения);
Если ОбъектМетаданных <> Неопределено И Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
// Значение гарантированно является документом (ссылкой или объектом)
КонецЕсли;
Если в процедуру гарантированно передается прикладной объект или ссылка (значения, обладающие методом Метаданные()), можно использовать прямую проверку:
Если Метаданные.Документы.Содержит(ИсточникОбъект.Метаданные()) Тогда
// Обработка документа
КонецЕсли;
Если в конфигурации используется Библиотека стандартных подсистем (БСП), воспользуемся готовой универсальной функцией общего модуля:
Если ОбщегоНазначения.ЭтоДокумент(ИсточникОбъект) Тогда
// Обработка документа
КонецЕсли;
Такой подход полностью исключает человеческий фактор и делает код абсолютно независимым от системного языка сервера, пула IIS и региональных настроек сеанса.
Разберем быструю настройку внутри информационной базы, которая позволяет принудительно задать русский язык для сеанса веб-сервиса:
Посмотрим, как задать параметры локализации непосредственно на уровне публикации веб-сервера. В каталоге публикации веб-приложения находится конфигурационный файл default.vrd. В строке подключения к базе данных можно явно передать параметр Locale.
Откроем default.vrd в текстовом редакторе и дополним атрибут ib:
<!-- Для клиент-серверного варианта базы -->
ib="Srvr="ИмяСервера";Ref="ИмяБазы";Locale="ru_RU";"
<!-- Для файлового варианта базы -->
ib="File="C:\Bases\MyBase";Locale="ru_RU";"
После сохранения изменений выполним перезапуск веб-сервера IIS командой iisreset в командной строке.
Параметр SystemLanguage в конфигурационном файле conf.cfg определяет язык интерфейса и системных сообщений платформы по умолчанию. Если система установлена на англоязычной ОС, платформа может автоматически выбирать английский язык.
Рассмотрим правила применения этой настройки:
wsisapi.dll), файл конфигурации необходимо редактировать в каталоге 64-битной платформы: C:\Program Files\1cv8\conf\conf.cfg. Если пул 32-битный — в каталоге C:\Program Files (x86)\1cv8\conf\conf.cfg.conf.cfg и добавим строку:
SystemLanguage=RU
conf.cfg внутри подкаталога конкретной версии платформы, используемой в публикации (например, C:\Program Files\1cv8\8.3.XX.XXXX\conf\conf.cfg).Если операционная система изначально была установлена на английском языке, системные учетные записи служб (включая учетные записи IIS и службы сервера 1С) сохраняют английскую системную локаль. Исправим это системными средствами Windows:
После применения этих параметров все системные службы Windows, процессы IIS и серверные процессы 1С будут запускаться в полноценном русскоязычном региональном окружении.