Как получить тип объекта строкой вида СправочникСсылка.Контрагенты в 1С

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

При разработке механизмов обмена данными, синхронизации или ведении регистров соответствий часто возникает необходимость сохранить точное каноническое имя типа данных на русском языке, например "СправочникСсылка.Контрагенты" или "ДокументСсылка.РеализацияТоваровУслуг".

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

Почему стандартные функции платформы не подходят

Проанализируем типичные ошибки и поведение системных функций при попытке получить строковое имя типа:

  1. Использование функции XMLТипЗнч():
    Если мы вызовем конструкцию XMLТипЗнч(Объект).ИмяТипа, то получим англоязычное имя схемы XDTO, например "CatalogRef.Контрагенты". Это происходит потому, что механизмы XML-сериализации в платформе стандартизированы на английском языке независимо от языка конфигурации. Для русских регистров соответствий такой формат не всегда подходит.
  2. Использование функции Строка(ТипЗнч()):
    Приведение типа к строке через Строка(ТипЗнч(Ссылка)) возвращает пользовательское представление с синонимом объекта и двоеточием, например "Справочник ссылка: Контрагенты". Этот текст зависит от языка текущего сеанса пользователя и не является валидным системным именем типа.
  3. Использование метода Метаданные().ПолноеИмя():
    Свойство ПолноеИмя() возвращает имя объекта метаданных вида "Справочник.Контрагенты", пропуская слово "Ссылка", что делает строку несовместимой с системной функцией Тип().

Решение 1: Использование Библиотеки стандартных подсистем (БСП)

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

Посмотрим на пример правильного получения строкового представления типа объекта:


// Передаем в функцию именно объект типа "Тип"
ТипОбъекта = ТипЗнч(ОбъектСинхронизации);
ИмяТипаСтрокой = ОбщегоНазначения.СтроковоеПредставлениеТипа(ТипОбъекта);

// В результате переменная ИмяТипаСтрокой будет содержать: "СправочникСсылка.Контрагенты"

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

Если в дальнейшем вам потребуется выполнить обратную операцию и получить объект Тип из сохраненной строки, используем парную функцию БСП:


ТипВосстановленный = ОбщегоНазначения.ТипПоСтроковомуПредставлению("СправочникСсылка.Контрагенты");

Решение 2: Получение имени типа на чистой платформе (без БСП)

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

Разберем вариант с разбором полного имени метаданных:


ТипОбъекта = ТипЗнч(ОбъектСинхронизации);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипОбъекта);

Если ОбъектМетаданных <> Неопределено Тогда
    ЧастиИмени = СтрРазделить(ОбъектМетаданных.ПолноеИмя(), ".");
    // Превращаем "Справочник.Контрагенты" в "СправочникСсылка.Контрагенты"
    ИмяТипаСтрокой = ЧастиИмени[0] + "Ссылка." + ЧастиИмени[1];
Иначе
    // Для примитивных типов или типов без прямых метаданных
    ИмяТипаСтрокой = XMLТипЗнч(ОбъектСинхронизации).ИмяТипа;
КонецЕсли;

Также рассмотрим альтернативный вариант через проверку принадлежности к коллекциям ссылочных типов менеджеров метаданных:


ТипОбъекта = ТипЗнч(ОбъектСинхронизации);
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипОбъекта);

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

Итоги

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

← На главную