Почему ТипЗнч() в 1С возвращает значение на английском языке и как это исправить?

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

В практике разработки на платформе 1С:Предприятие часто встречается ситуация, когда код, успешно работающий в одной базе или на одном сервере, внезапно начинает выдавать ошибки в другом окружении. Одной из таких коварных проблем является получение англоязычного представления типа объекта при использовании функции ТипЗнч(). Например, вместо привычного «Справочник объект» система возвращает «Catalog object». Если ваша логика завязана на анализе строки, это неизбежно приведет к сбою.

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

Выясняем причину: почему язык меняется?

Разберем ситуацию, описанную в обсуждении. При обмене данными между двумя базами через шину, в «Базе-источнике» выполняется код, который пытается определить тип объекта через строковое представление. Рассмотрим фрагмент:


ТипЗначения = Строка(ТипЗнч(Источник));
Если Лев(ТипЗначения, 10) = "Справочник" Тогда
    // Какая-то логика
КонецЕсли;

Проблема здесь заключается в том, что функция Строка(), примененная к результату ТипЗнч(), возвращает локализованное строковое представление. Это представление напрямую зависит от текущего языка сеанса 1С. Если сеанс запущен с английским интерфейсом, результатом будет «Catalog object», и условие Лев(ТипЗначения, 10) = "Справочник" никогда не выполнится.

Проанализируем основные факторы, которые заставляют 1С «переходить на английский»:

  1. Параметры запуска: Если информационная база запускается с ключом /L en, интерфейс и все системные строки будут на английском.
  2. Настройки пользователя в Конфигураторе: У конкретного пользователя 1С в настройках может быть принудительно установлен язык интерфейса «Английский».
  3. Региональные настройки сервера: Если код выполняется на стороне сервера (в фоновом задании или серверном модуле), платформа ориентируется на настройки учетной записи, под которой запущена служба 1С:Предприятие (например, USR1CV8). Если в Windows или Linux для этой учетной записи установлена локаль en-US, строковые представления типов будут англоязычными.
  4. Специфика COM-соединения: При подключении через COM-соединение язык сеанса определяется параметром в строке подключения. Если он не указан, может быть выбран язык по умолчанию, установленный в системе.

Способ 1. Прямое сравнение типов (Рекомендуемый)

Самый правильный способ избежать проблем с локализацией — никогда не приводить тип к строке для сравнения. Рассмотрим, как переписать условие, используя функцию Тип(). Этот метод работает одинаково стабильно независимо от того, какой язык интерфейса установлен у пользователя.


Источник = ОбъектИнтеграции.ПолучитьОбъект();
Если ТипЗнч(Источник) = Тип("СправочникОбъект.СделкиСКлиентами") Тогда
    // Логика для конкретного справочника
КонецЕсли;

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

Способ 2. Работа с метаданными

Проанализируем использование объекта Метаданные. Метод ПолноеИмя() всегда возвращает внутреннее имя объекта на английском языке, которое зашито в платформу и не зависит от настроек интерфейса. Это делает его идеальным инструментом для проверок в коде.


МетаДанныеОбъекта = Источник.Метаданные();
ПолноеИмя = МетаДанныеОбъекта.ПолноеИмя(); // Вернет, например, "Catalog.СделкиСКлиентами"

Если Лев(ПолноеИмя, 7) = "Catalog" Тогда
    // Мы точно знаем, что это справочник
КонецЕсли;

Обратите внимание: в метаданных справочник всегда называется Catalog, документ — Document, регистр сведений — InformationRegister. Это константы платформы, которые никогда не изменятся в зависимости от языка пользователя.

Способ 3. Использование методов БСП

Если вы работаете в современной типовой конфигурации (например, ERP, УТ 11, БП 3.0), в вашем распоряжении есть библиотека стандартных подсистем (БСП). Разберем, как упростить проверку с помощью общего модуля ОбщегоНазначения.

Функции БСП инкапсулируют в себе правильные проверки метаданных и делают код более читаемым:


// Проверка, является ли объект справочником
Если ОбщегоНазначения.ЭтоСправочник(Источник.Метаданные()) Тогда
    Префикс = "Справочник.";
КонецЕсли;

// Получение имени базового типа
ИмяТипа = ОбщегоНазначения.ИмяБазовогоТипаПоОбъектуМетаданных(Источник.Метаданные());

Этот подход считается «золотым стандартом» разработки, так как он минимизирует количество ошибок и делает код понятным для других разработчиков.

Способ 4. Использование функции XMLТипЗнч

Существует еще один интересный метод — использование функции XMLТипЗнч(). Она возвращает специальный объект типа ТипXML, у которого есть свойство ИмяТипа. Рассмотрим этот пример:


ДанныеXML = XMLТипЗнч(Источник);
Если ДанныеXML.ИмяТипа = "CatalogObject.СделкиСКлиентами" Тогда
    // Объект опознан стабильно
КонецЕсли;

Этот метод часто используется при сериализации данных, но он также отлично подходит для универсальной идентификации типов объектов, так как возвращает «платформенные» имена.

Как проверить настройки локализации на сервере?

Если вы все же хотите выяснить, почему система выдает английские строки, проделаем следующие шаги для анализа окружения:

  1. Проверка через меню «Пуск»: Как советовали в обсуждении, на сервере под управлением Windows посмотрите, как называется папка в меню. Если «1C:Enterprise» — скорее всего, установлена английская версия платформы или английский язык в системе по умолчанию.
  2. Параметры службы: Проверьте, под каким пользователем запущена служба 1C:Enterprise 8.3 Server Agent. Зайдите в систему под этим пользователем и проверьте региональные настройки в панели управления.
  3. Язык интерфейса в 1С: Зайдите в меню Сервис -> Параметры и проверьте вкладку «Общие». Там можно явно указать язык интерфейса, который будет использоваться при запуске из Конфигуратора.

Резюме

Мы выяснили, что полагаться на строковое представление ТипЗнч() — это грубая методическая ошибка. Платформа 1С:Предприятие спроектирована как многоязычная система, и представление объектов в ней всегда будет зависеть от контекста сеанса.

Главные выводы для разработчика:

Соблюдение этих простых правил сделает ваши интеграции и обмены данными надежными и независимыми от того, на каком сервере или под каким пользователем они выполняются.

← На главную