К статье
Практический материал

Разработка и Конфигурация · 10 мин

ТипЗначения в 1С как строка: способы получения и сравнения типов

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

Задача представить тип значения в 1С в виде строки возникает в журналировании, отладке, построении универсальных обработок и при сравнении типов через текст. Встроенный язык не даёт прямой функции «ТипЗначенияКакСтрока», но предлагает несколько рабочих способов: функцию ТипЗнч() с последующим преобразованием, XMLТип(), строковое представление типа и работу с ОписаниеТипов. У каждого подхода есть свои границы применимости.

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

Как устроен тип «Тип» и почему нет простого имени

В 1С тип значения — это отдельный объект встроенного языка, получаемый функцией ТипЗнч(Значение). Он поддерживает сравнение на равенство и строковое представление, но не содержит свойства с именем. Это осознанное решение платформы: типы ссылочных объектов неразрывно связаны с метаданными, а примитивные типы (Число, Строка, Дата, Булево) — с внутренними механизмами.

Строковое представление типа зависит от варианта встроенного языка конфигурации. Если конфигурация разработана на английском варианте, Строка(ТипЗнч(Истина)) вернёт «Boolean», в русском — «Булево». Код, который сравнивает результат с литералом «Булево», сломается при переносе. Это первая причина, по которой строковое представление нельзя считать идентификатором типа.

Способы получить тип значения строкой

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

ТипЗначения = ТипЗнч(МоеЗначение);

ИмяТипаXML = XMLТип(ТипЗначения).ИмяТипа;

// Для ссылки на справочник: "CatalogRef.Номенклатура"

// Для числа: "decimal", для строки: "string"

Второй вариант — конструктор Тип("ИмяТипа"), который выполняет обратное преобразование: из строки создаёт объект типа. Это полезно, когда имя типа хранится в настройках или приходит извне. Например, Тип("СправочникСсылка.Контрагенты") вернёт объект типа, пригодный для сравнения и для построения описания типов.

Третий подход — использование ОписаниеТипов. У объекта есть метод СодержитТип() и коллекция Типы(), что позволяет перебрать допустимые типы реквизита и получить их строковые представления. Это удобно при анализе метаданных: Метаданные.Справочники.Номенклатура.Реквизиты.Артикул.Тип даёт описание типов реквизита без обращения к данным.

Сравнение способов

Строка(ТипЗнч(Значение))

Быстро и читаемо для пользователя, но зависит от языка конфигурации. Не подходит для сравнения в коде.

XMLТип(Тип).ИмяТипа

Стабильное имя, подходит для логирования и логики. Для примитивов возвращает XML-имена (string, decimal), а не привычные «Строка», «Число».

Тип("ИмяТипа")

Обратное преобразование строки в тип. Требует русского имени вида «СправочникСсылка.Х», вызывает исключение при неверном имени.

Сравнение типов: строки против объектов

Правильный способ проверить тип значения — сравнение объектов типов напрямую: Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда. Такое сравнение работает быстро, не зависит от локализации и проверяется синтаксическим контролем. Именно этот вариант следует использовать в прикладном коде всегда, когда имя типа известно на этапе разработки.

Сравнение через строки оправдано в узких сценариях: когда имя типа приходит из внешнего источника (файл настроек, параметр HTTP-запроса, таблица соответствий) и заранее неизвестно. В этом случае строку сначала преобразуют в тип через Тип(ИмяСтрокой), оборачивая вызов в попытку, а затем сравнивают уже объекты. Прямое сравнение Строка(ТипЗнч(А)) = "СправочникСсылка.Номенклатура" — распространённая ошибка, которая маскирует опечатки и ломается при смене языка.

Функция ЭтоТипПоИмени(Значение, ИмяТипаСтрокой)

Попытка

ИскомыйТип = Тип(ИмяТипаСтрокой);

Исключение

Возврат Ложь;

КонецПопытки;

Возврат ТипЗнч(Значение) = ИскомыйТип;

КонецФункции

Практические сценарии применения

Журналирование и отладка

При записи диагностической информации строковое имя типа помогает быстро понять, что попало в переменную. Здесь уместно Строка(ТипЗнч(Значение)) или XMLТип(ТипЗнч(Значение)).ИмяТипа — оба варианта читаемы. Для значения Неопределено и Null строковое представление типа выводится корректно, что удобно при разборе ошибок обмена.

Универсальные обработки и обмены

В механизмах сериализации, произвольных выгрузках и универсальных отчётах типы колонок и полей часто описываются строками. Рекомендуемый формат — имена метаданных вида «СправочникСсылка.Номенклатура», потому что они напрямую принимаются конструктором Тип(). Для примитивных типов используйте «Строка», «Число», «Дата», «Булево».

Анализ составного типа реквизита

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

Порядок действий
  1. 1
    Определите цель: отображение пользователю, логирование или программное сравнение.
  2. 2
    Для отображения используйте Строка(ТипЗнч(Значение)).
  3. 3
    Для логики и логов используйте XMLТип(ТипЗнч(Значение)).ИмяТипа.
  4. 4
    Для сравнения преобразуйте строку в тип через Тип(Имя) внутри Попытка/Исключение.
  5. 5
    Проверьте результат на значениях Неопределено, Null и на составных типах реквизитов.

Частые ошибки и ограничения

Первая ошибка — ожидание, что XMLТип() вернёт русские имена примитивов. Для числа это будет «decimal», для даты — «dateTime», для строки — «string». Если нужны имена в терминах встроенного языка, потребуется таблица соответствия. Вторая ошибка — попытка получить имя типа у значения, которое само является типом: ТипЗнч(Тип("Число")) вернёт тип «Тип», а не «Число».

Третья группа проблем связана с составными типами. ТипЗнч() всегда возвращает один конкретный тип хранимого значения, даже если реквизит объявлен составным. Чтобы узнать все допустимые типы, нужно обращаться к метаданным, а не к значению. Также помните, что конструктор Тип() чувствителен к точности написания: «СправочникСсылка.Номенклатура» и «Справочники.Номенклатура» — разные строки, вторая вызовет исключение.

Типичные ошибки
01
Сравнение Строка(ТипЗнч(А)) с литералом — ломается при смене языка конфигурации и скрывает опечатки.
02
Вызов Тип(ИмяСтрокой) без Попытка/Исключение — неверное имя обрывает выполнение кода ошибкой.
03
Ожидание русских имён от XMLТип — примитивы возвращаются как string, decimal, dateTime.
04
Попытка узнать составной тип реквизита через ТипЗнч значения — возвращается только тип конкретного хранимого значения, а не всё описание типов.

Как проверить результат

После внедрения преобразования проверьте его на контрольном наборе значений: примитивное число, строка, дата, булево, ссылка на справочник, ссылка на документ, Неопределено, Null. Убедитесь, что строковые имена соответствуют ожидаемому формату и что обратное преобразование через Тип() восстанавливает исходный тип для ссылочных объектов.

Для кода сравнения типов полезен отдельный тест: передайте заведомо неверное имя строкой и убедитесь, что функция возвращает управляемый результат (например, Ложь), а не падает с исключением. Это гарантирует устойчивость при работе с внешними настройками.

Контрольные точки

Как проверить результат

Имя ссылочного типа
Норма

Формат «СправочникСсылка.Имя» или «CatalogRef.Имя» из XMLТип

Тревожный признак

Пустая строка или локализованное представление там, где нужна стабильность

Обратное преобразование Тип(Имя)
Норма

Возвращённый тип равен исходному ТипЗнч(Значение)

Тревожный признак

Исключение или несовпадение типов

Некорректное имя строкой
Норма

Функция возвращает Ложь или Неопределено

Тревожный признак

Необработанное исключение останавливает код

FAQ

Как получить имя типа значения строкой в 1С?

Используйте Строка(ТипЗнч(Значение)) для отображения или XMLТип(ТипЗнч(Значение)).ИмяТипа для стабильного машинного имени. Отдельной функции «имя типа» во встроенном языке нет.

Можно ли сравнивать типы через строки?

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

Как создать тип из строки?

Конструктором Тип("СправочникСсылка.Номенклатура") или Тип("Число"). Оборачивайте вызов в Попытка/Исключение, если строка приходит из внешнего источника — неверное имя вызывает ошибку выполнения.

Почему XMLТип возвращает «decimal» вместо «Число»?

XMLТип работает с типами XML Schema, поэтому примитивы возвращаются как string, decimal, dateTime, boolean. Для ссылочных объектов возвращаются имена вида CatalogRef.Имя. Если нужны русские имена, постройте таблицу соответствия.

Как узнать все допустимые типы составного реквизита?

Через метаданные: получите ОписаниеТипов реквизита и переберите коллекцию Типы(). Метод СодержитТип(Тип) проверяет, входит ли конкретный тип в описание.

Что вернёт ТипЗнч для Неопределено и Null?

Для Неопределено — тип «Неопределено», для Null — тип «Null». Строковые представления выводятся корректно, что удобно при отладке обменов и запросов.

Итог

Что важно запомнить

Для отображения типа используйте Строка(ТипЗнч()), для стабильного имени — XMLТип().ИмяТипа, для сравнения — сами объекты типов. Строковые сравнения типов зависят от локализации и допустимы только после преобразования строки в тип через Тип() с обработкой исключений.