При разработке на платформе 1С:Предприятие 8 программисты часто сталкиваются с ситуацией, когда на стороне клиента необходимо программно определить тип объекта в виде технической строки, например, "ДокументСсылка.РеализацияТоваровУслуг". Стандартная функция ТипЗнч() при попытке преобразования в строку выдает синоним типа (например, "Реализация товаров и услуг"), который зависит от языка сеанса и настроек интерфейса. Это делает использование синонимов для логических проверок крайне ненадежным и неудобным.
В этой статье мы подробно разберем, как обойти это ограничение и получить внутреннее имя объекта метаданных, используя доступные инструменты тонкого и веб-клиента.
Разберем ситуацию: у нас есть переменная Параметр, содержащая ссылку на документ. Если мы напишем Строка(ТипЗнч(Параметр)), платформа вернет нам представление типа из метаданных (Синоним). Почему это плохо для разработки?
Рассмотрим рабочие способы получения правильного технического имени.
Это самый быстрый и эффективный способ получения информации о типе на стороне клиента без обращения к серверу. Функция XMLТипЗнч() возвращает специальный объект типа ТипXML, который содержит свойства ИмяТипа и URIПространстваИмен.
Проанализируем пример кода, который преобразует XML-тип в привычный формат 1С:
&НаКлиенте
Функция ПолучитьИмяТипаНаКлиенте(Значение)
ТипXML = XMLТипЗнч(Значение);
Если ТипXML = Неопределено Тогда
Возврат "";
КонецЕсли;
ВнутреннееИмя = ТипXML.ИмяТипа;
// Заменяем XML-префиксы на стандартные имена 1С
ВнутреннееИмя = СтрЗаменить(ВнутреннееИмя, "DocumentRef.", "ДокументСсылка.");
ВнутреннееИмя = СтрЗаменить(ВнутреннееИмя, "CatalogRef.", "СправочникСсылка.");
ВнутреннееИмя = СтрЗаменить(ВнутреннееИмя, "EnumRef.", "ПеречислениеСсылка.");
Возврат ВнутреннееИмя;
КонецФункции
Этот метод хорош тем, что он не требует серверного вызова, а значит, работает мгновенно. Однако стоит учитывать, что префиксы в XML (например, DocumentRef) могут отличаться от внутренних имен метаданных 1С, поэтому их нужно обрабатывать через СтрЗаменить().
Если нам нужно получить максимально полную информацию о типе и мы хотим использовать универсальные механизмы платформы, можно задействовать сериализатор XDTO. Этот метод более трудоемкий, но позволяет "вытащить" описание типа из XML-структуры объекта.
Рассмотрим, как это реализовать:
&НаКлиенте
Функция ПолучитьИмяТипаЧерезXDTO(Параметр)
пФабрика = Новый ФабрикаXDTO();
пТип = ТипЗнч(Параметр);
ДанныеXML = Новый ЗаписьXML;
ДанныеXML.УстановитьСтроку();
пСериализаторXDTO = Новый СериализаторXDTO(пФабрика);
пСериализаторXDTO.ЗаписатьXML(ДанныеXML, пТип);
СтрокаXML = ДанныеXML.Закрыть();
// В полученной строке будет содержаться описание типа в формате XML
// Далее можно распарсить строку для извлечения имени
Возврат СтрокаXML;
КонецФункции
Важный нюанс: Создание Новый ФабрикаXDTO() на клиенте может быть ресурсозатратным, если вызывать это в цикле. Данный метод лучше использовать для разовых сложных проверок.
Если ваша задача — сделать механизм максимально универсальным и вы не хотите вручную прописывать замены для всех типов (Справочники, Документы, Планы видов характеристик и т.д.), самым надежным решением будет один раз спросить имя типа у сервера и запомнить его.
Разберем реализацию с использованием кэша на клиенте. Это позволит избежать повторных обращений к серверу для одного и того же типа данных в рамках одного сеанса.
// Глобальная переменная в модуле управляемого приложения или общем модуле
&НаКлиенте
Перем КэшТипов Экспорт;
&НаКлиенте
Функция ПолучитьПолноеИмяТипаУниверсально(Ссылка)
Если КэшТипов = Неопределено Тогда
КэшТипов = Новый Соответствие;
КонецЕсли;
ТекущийТип = ТипЗнч(Ссылка);
ИмяИзКэша = КэшТипов.Получить(ТекущийТип);
Если ИмяИзКэша <> Неопределено Тогда
Возврат ИмяИзКэша;
КонецЕсли;
// Если в кэше нет, идем на сервер
ПолноеИмя = ПолучитьИмяТипаНаСервере(ТекущийТип);
КэшТипов.Вставить(ТекущийТип, ПолноеИмя);
Возврат ПолноеИмя;
КонецФункции
&НаСервереБезКонтекста
Функция ПолучитьИмяТипаНаСервере(ТипОбъекта)
// Используем метаданные для получения точного имени
Возврат Метаданные.НайтиПоТипу(ТипОбъекта).ПолноеИмя();
КонецФункции
Преимущества этого подхода:
"Документ.РеализацияТоваровУслуг").Если вы решили использовать Способ 1 (XMLТипЗнч), вам пригодится список основных соответствий имен типов в XML и в 1С:
Проанализировав все варианты, мы рекомендуем использовать комбинированный подход: для простых задач и высокой скорости — XMLТипЗнч, а для сложных систем с большим количеством метаданных — неконтекстный серверный вызов с обязательным кэшированием результата на стороне клиента.