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

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

Как определить тип данных в 1С: практическое руководство

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

При разработке и доработке конфигураций 1С регулярно возникает задача: понять, какой тип данных содержится в переменной, реквизите или параметре. От этого зависит логика обработки — например, ссылка это или строка, документ или справочник, число или дата. Ошибка в определении типа приводит к падению кода с сообщением вида «Преобразование значения к типу Число не может быть выполнено» или к тихим логическим ошибкам, которые сложно отловить.

Встроенный язык 1С предоставляет несколько инструментов для определения типа: функции ТипЗначения(), ТипЗнч(), Тип(), а также конструкцию запросов ССЫЛКА и оператор ЕСТЬ NULL. Каждый инструмент работает в своём контексте, и важно понимать разницу между ними, чтобы выбрать правильный способ.

Что такое тип данных в 1С и почему это важно

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

Типы в 1С делятся на примитивные (Число, Строка, Дата, Булево, Неопределено, NULL) и ссылочные/объектные (ссылки на справочники, документы, перечисления, объекты данных, коллекции вроде Массива и ТаблицыЗначений). У реквизитов объектов метаданных тип задаётся в конфигураторе и может быть составным — например, реквизит «Контрагент» может хранить ссылку и на справочник «Контрагенты», и на справочник «Организации».

Функция ТипЗнч() — основной способ в коде

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

Типичный пример проверки выглядит так: Если ТипЗнч(Документ) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда ... КонецЕсли. Для примитивных типов используются имена без указания объекта метаданных: Тип("Число"), Тип("Строка"), Тип("Дата"), Тип("Булево").

1c
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
    Сообщить("Это ссылка на номенклатуру");
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
    Сообщить("Это число");
Иначе
    Сообщить("Другой тип: " + ТипЗнч(Значение));
КонецЕсли;

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

Функция ТипЗначения() и работа через XMLType

Функция ТипЗначения(Значение) доступна в тонком клиенте и внешних соединениях там, где ТипЗнч() может быть недоступна в определённых контекстах выполнения. В большинстве типовых сценариев серверного и клиентского кода обе функции взаимозаменяемы, но ТипЗнч() встречается в коде конфигураций значительно чаще.

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

Как определить тип реквизита или колонки метаданных

Отдельная задача — узнать не тип конкретного значения, а тип, заданный для реквизита в конфигурации. Для этого используется объект метаданных и его свойство Тип, которое возвращает объект «ОписаниеТипов». Например: Метаданные.Справочники.Номенклатура.Реквизиты.Артикул.Тип.

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

Для колонок таблицы значений и дерева значений тип также хранится в объекте колонки: ТаблицаЗначений.Колонки.ИмяКолонки.ТипЗначения. Это полезно при динамическом построении таблиц, когда состав колонок формируется программно.

Определение типа в запросах: ССЫЛКА, ВЫРАЗИТЬ, ЕСТЬ NULL

В языке запросов 1С нет прямого аналога ТипЗнч(), но есть конструкции, решающие ту же задачу. Оператор ССЫЛКА проверяет, является ли поле ссылкой на указанный тип: ГДЕ Товары.Номенклатура ССЫЛКА Справочник.Номенклатура. Такое условие незаменимо при работе с составными типами, когда в одном поле могут лежать ссылки разных объектов.

Оператор ВЫРАЗИТЬ приводит значение к заданному типу, а конструкция ВЫБОР ... КОГДА ... ССЫЛКА ... ТОГДА позволяет строить разную логику для разных типов прямо в запросе. Для соединений важна проверка ЕСТЬ NULL: при левом соединении отсутствующие значения приходят как NULL, и сравнение с NULL обычным равенством не сработает — только через ЕСТЬ NULL или функцию ЕСТЬNULL().

Способы проверки типа

ТипЗнч() + Тип()

Код модулей. Точное сравнение с конкретным типом. Не работает в запросах.

ССЫЛКА в запросе

Проверка ссылочного типа поля в запросе. Только для ссылок, не для примитивов.

ВЫРАЗИТЬ()

Приведение составного типа к конкретному в запросе. Требует знания целевого типа заранее.

ОписаниеТипов.СодержитТип()

Проверка типов реквизитов метаданных и колонок. Не работает с произвольными значениями напрямую.

Проверка типа в отладчике и табло

Во время отладки тип значения виден сразу: в табло (окно «Вычислить выражение», Shift+F9) рядом со значением отображается его тип. Это самый быстрый способ понять, что пришло в переменную, не меняя код. Достаточно поставить точку останова, выделить выражение и нажать Shift+F9.

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

Порядок действий при неизвестном типе
  1. 1
    Поставьте точку останова перед строкой, где используется значение
  2. 2
    Откройте табло (Shift+F9) и вычислите выражение с переменной
  3. 3
    Посмотрите колонку «Тип» в результате
  4. 4
    При необходимости вычислите ТипЗнч(Переменная) прямо в табло
  5. 5
    Скорректируйте логику кода под фактический тип или добавьте проверку

Типичные ошибки при определении типов

Частая ошибка — сравнение типа строкой: Если Строка(ТипЗнч(Х)) = "Число". Такой код хрупок, зависит от локализации и медленнее прямого сравнения типов. Всегда используйте сравнение объектов типа через Тип().

Вторая распространённая проблема — путаница между ссылкой и объектом. ДокументСсылка.РеализацияТоваровУслуг и ДокументОбъект.РеализацияТоваровУслуг — разные типы. Если процедура получает ссылку, а код рассчитывает на объект с возможностью изменения данных, проверка типа должна это учитывать, иначе запись объекта завершится ошибкой.

Третья группа ошибок связана со значениями Неопределено и NULL. Проверка ТипЗнч() = Тип("Строка") не отловит Неопределено, а в запросе NULL требует отдельной обработки. Перед проверкой типа нередко стоит явно проверить значение на Неопределено и NULL.

Типичные ошибки
01
Сравнение типа через строковое представление вместо Тип() — код ломается при смене языка интерфейса
02
Смешение Ссылка и Объект одного метаданного — попытка записать ссылку как объект вызывает исключение
03
Игнорирование NULL в запросах с левым соединением — условия по таким полям молча отсекают строки
04
Проверка типа реквизита составного типа только под один вариант — остальные типы теряются без сообщений

Частые вопросы

Чем ТипЗнч() отличается от Тип()?

ТипЗнч(Значение) возвращает тип конкретного переданного значения. Тип("ИмяТипа") создаёт описание типа по его имени для сравнения. Обычно они используются в паре: результат ТипЗнч сравнивается с результатом Тип.

Как проверить, что значение — ссылка любого вида?

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

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

Возьмите конкретное значение реквизита и примените ТипЗнч() — составной тип описывает допустимые варианты, но конкретное значение всегда имеет один тип. В запросе используйте ВЫБОР с проверками ССЫЛКА для каждого возможного типа.

Почему сравнение ТипЗнч() с Тип() возвращает Ложь, хотя типы «одинаковые»?

Чаще всего причина в различии Ссылка/Объект: значение является ДокументОбъект, а проверка идёт на ДокументСсылка. Также проверьте точное имя метаданного в строке Тип("...") — опечатка в имени даёт другой тип или ошибку выполнения.

Как узнать тип значения в запросе без изменения текста запроса?

Выполните запрос, получите выборку и в коде проверьте тип поля через ТипЗнч(Выборка.ИмяПоля). Альтернатива — добавить в запрос поле с ВЫБОР ... КОГДА Поле ССЫЛКА ... ТОГДА "ИмяТипа", чтобы тип возвращался строкой прямо из запроса.

Итог

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

В коде тип определяют через ТипЗнч() со сравнением через Тип(), в запросах — через ССЫЛКА, ВЫРАЗИТЬ и ЕСТЬ NULL, типы реквизитов метаданных — через ОписаниеТипов. При отладке быстрее всего посмотреть тип в табло. Не забывайте про различие Ссылка/Объект и значения Неопределено и NULL.