Как получить техническое имя типа на клиенте в 1С

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

При разработке на платформе 1С:Предприятие 8 программисты часто сталкиваются с ситуацией, когда на стороне клиента необходимо программно определить тип объекта в виде технической строки, например, "ДокументСсылка.РеализацияТоваровУслуг". Стандартная функция ТипЗнч() при попытке преобразования в строку выдает синоним типа (например, "Реализация товаров и услуг"), который зависит от языка сеанса и настроек интерфейса. Это делает использование синонимов для логических проверок крайне ненадежным и неудобным.

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

Проблема использования функции ТипЗнч на клиенте

Разберем ситуацию: у нас есть переменная Параметр, содержащая ссылку на документ. Если мы напишем Строка(ТипЗнч(Параметр)), платформа вернет нам представление типа из метаданных (Синоним). Почему это плохо для разработки?

  1. Мультиязычность: В англоязычном интерфейсе вернется одно значение, в русскоязычном — другое.
  2. Изменчивость: Синоним может быть легко изменен в конфигураторе, что приведет к поломке логики в коде.
  3. Отсутствие префикса: Синоним не говорит нам, является ли объект справочником, документом или перечислением.

Рассмотрим рабочие способы получения правильного технического имени.

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

Это самый быстрый и эффективный способ получения информации о типе на стороне клиента без обращения к серверу. Функция XMLТипЗнч() возвращает специальный объект типа ТипXML, который содержит свойства ИмяТипа и URIПространстваИмен.

Проанализируем пример кода, который преобразует XML-тип в привычный формат 1С:


&НаКлиенте
Функция ПолучитьИмяТипаНаКлиенте(Значение)
    ТипXML = XMLТипЗнч(Значение);
    Если ТипXML = Неопределено Тогда
        Возврат "";
    КонецЕсли;
    
    ВнутреннееИмя = ТипXML.ИмяТипа;
    
    // Заменяем XML-префиксы на стандартные имена 1С
    ВнутреннееИмя = СтрЗаменить(ВнутреннееИмя, "DocumentRef.", "ДокументСсылка.");
    ВнутреннееИмя = СтрЗаменить(ВнутреннееИмя, "CatalogRef.", "СправочникСсылка.");
    ВнутреннееИмя = СтрЗаменить(ВнутреннееИмя, "EnumRef.", "ПеречислениеСсылка.");
    
    Возврат ВнутреннееИмя;
КонецФункции

Этот метод хорош тем, что он не требует серверного вызова, а значит, работает мгновенно. Однако стоит учитывать, что префиксы в XML (например, DocumentRef) могут отличаться от внутренних имен метаданных 1С, поэтому их нужно обрабатывать через СтрЗаменить().

Способ 2: Сериализация через XDTO

Если нам нужно получить максимально полную информацию о типе и мы хотим использовать универсальные механизмы платформы, можно задействовать сериализатор XDTO. Этот метод более трудоемкий, но позволяет "вытащить" описание типа из XML-структуры объекта.

Рассмотрим, как это реализовать:


&НаКлиенте
Функция ПолучитьИмяТипаЧерезXDTO(Параметр)
    пФабрика = Новый ФабрикаXDTO();
    пТип = ТипЗнч(Параметр);
    
    ДанныеXML = Новый ЗаписьXML;
    ДанныеXML.УстановитьСтроку();
    
    пСериализаторXDTO = Новый СериализаторXDTO(пФабрика);
    пСериализаторXDTO.ЗаписатьXML(ДанныеXML, пТип);
    
    СтрокаXML = ДанныеXML.Закрыть();
    // В полученной строке будет содержаться описание типа в формате XML
    // Далее можно распарсить строку для извлечения имени
    Возврат СтрокаXML;
КонецФункции

Важный нюанс: Создание Новый ФабрикаXDTO() на клиенте может быть ресурсозатратным, если вызывать это в цикле. Данный метод лучше использовать для разовых сложных проверок.

Способ 3: Неконтекстный серверный вызов с кэшированием

Если ваша задача — сделать механизм максимально универсальным и вы не хотите вручную прописывать замены для всех типов (Справочники, Документы, Планы видов характеристик и т.д.), самым надежным решением будет один раз спросить имя типа у сервера и запомнить его.

Разберем реализацию с использованием кэша на клиенте. Это позволит избежать повторных обращений к серверу для одного и того же типа данных в рамках одного сеанса.


// Глобальная переменная в модуле управляемого приложения или общем модуле
&НаКлиенте
Перем КэшТипов Экспорт;

&НаКлиенте
Функция ПолучитьПолноеИмяТипаУниверсально(Ссылка)
    
    Если КэшТипов = Неопределено Тогда
        КэшТипов = Новый Соответствие;
    КонецЕсли;
    
    ТекущийТип = ТипЗнч(Ссылка);
    ИмяИзКэша = КэшТипов.Получить(ТекущийТип);
    
    Если ИмяИзКэша <> Неопределено Тогда
        Возврат ИмяИзКэша;
    КонецЕсли;
    
    // Если в кэше нет, идем на сервер
    ПолноеИмя = ПолучитьИмяТипаНаСервере(ТекущийТип);
    КэшТипов.Вставить(ТекущийТип, ПолноеИмя);
    
    Возврат ПолноеИмя;
    
КонецФункции

&НаСервереБезКонтекста
Функция ПолучитьИмяТипаНаСервере(ТипОбъекта)
    // Используем метаданные для получения точного имени
    Возврат Метаданные.НайтиПоТипу(ТипОбъекта).ПолноеИмя();
КонецФункции

Преимущества этого подхода:

Сводная таблица соответствий XML-типов

Если вы решили использовать Способ 1 (XMLТипЗнч), вам пригодится список основных соответствий имен типов в XML и в 1С:

Проанализировав все варианты, мы рекомендуем использовать комбинированный подход: для простых задач и высокой скорости — XMLТипЗнч, а для сложных систем с большим количеством метаданных — неконтекстный серверный вызов с обязательным кэшированием результата на стороне клиента.

← На главную