Разработка и Конфигурация · 9 мин
Как определить тип данных в 1С: практическое руководство
Как определить тип данных значения в 1С: функции ТипЗначения, ТипЗнч, Тип(), сравнение типов, проверка в запросах и типичные ошибки разработчиков.
При разработке и доработке конфигураций 1С регулярно возникает задача: понять, какой тип данных содержится в переменной, реквизите или параметре. От этого зависит логика обработки — например, ссылка это или строка, документ или справочник, число или дата. Ошибка в определении типа приводит к падению кода с сообщением вида «Преобразование значения к типу Число не может быть выполнено» или к тихим логическим ошибкам, которые сложно отловить.
Встроенный язык 1С предоставляет несколько инструментов для определения типа: функции ТипЗначения(), ТипЗнч(), Тип(), а также конструкцию запросов ССЫЛКА и оператор ЕСТЬ NULL. Каждый инструмент работает в своём контексте, и важно понимать разницу между ними, чтобы выбрать правильный способ.
Что такое тип данных в 1С и почему это важно
1С использует строгую типизацию значений, хотя переменные встроенного языка объявляются без указания типа. Одна и та же переменная в разные моменты времени может содержать строку, число, ссылку на объект или значение Неопределено. Платформа сама присваивает тип каждому значению, и именно этот тип определяет, какие операции допустимы.
Типы в 1С делятся на примитивные (Число, Строка, Дата, Булево, Неопределено, NULL) и ссылочные/объектные (ссылки на справочники, документы, перечисления, объекты данных, коллекции вроде Массива и ТаблицыЗначений). У реквизитов объектов метаданных тип задаётся в конфигураторе и может быть составным — например, реквизит «Контрагент» может хранить ссылку и на справочник «Контрагенты», и на справочник «Организации».
Функция ТипЗнч() — основной способ в коде
Функция ТипЗнч(Значение) возвращает объект типа «Тип», описывающий тип переданного значения. Это самый частый способ проверки в модуле. Сам по себе результат малоинформативен — обычно его сравнивают с конкретным типом, полученным через функцию Тип().
Типичный пример проверки выглядит так: Если ТипЗнч(Документ) = Тип("ДокументСсылка.РеализацияТоваровУслуг") Тогда ... КонецЕсли. Для примитивных типов используются имена без указания объекта метаданных: Тип("Число"), Тип("Строка"), Тип("Дата"), Тип("Булево").
Если ТипЗнч(Значение) = Тип("СправочникСсылка.Номенклатура") Тогда
Сообщить("Это ссылка на номенклатуру");
ИначеЕсли ТипЗнч(Значение) = Тип("Число") Тогда
Сообщить("Это число");
Иначе
Сообщить("Другой тип: " + ТипЗнч(Значение));
КонецЕсли;Обратите внимание: ТипЗнч() возвращает объект, который можно вывести в строковом виде — это удобно при отладке. Строковое представление типа «СправочникСсылка.Номенклатура» или «Число» помогает быстро понять, что фактически лежит в переменной, без запуска конфигуратора.
Функция ТипЗначения() и работа через XMLType
Функция ТипЗначения(Значение) доступна в тонком клиенте и внешних соединениях там, где ТипЗнч() может быть недоступна в определённых контекстах выполнения. В большинстве типовых сценариев серверного и клиентского кода обе функции взаимозаменяемы, но ТипЗнч() встречается в коде конфигураций значительно чаще.
Для задач интеграции и обмена данными тип иногда определяют через XML-сериализацию: метод XMLТипЗнч(Значение) возвращает описание типа в терминах XML, что полезно при работе с XDTO-пакетами и веб-сервисами. Это узкий сценарий, но при обмене между разными конфигурациями он помогает сопоставить типы, имена которых в базах различаются.
Как определить тип реквизита или колонки метаданных
Отдельная задача — узнать не тип конкретного значения, а тип, заданный для реквизита в конфигурации. Для этого используется объект метаданных и его свойство Тип, которое возвращает объект «ОписаниеТипов». Например: Метаданные.Справочники.Номенклатура.Реквизиты.Артикул.Тип.
Объект «ОписаниеТипов» позволяет проверить, входит ли конкретный тип в составной тип реквизита, с помощью метода СодержитТип(Тип). Это стандартный приём в универсальных обработках: сначала получают описание типов реквизита, затем проверяют, допустимо ли записать туда значение определённого типа.
Для колонок таблицы значений и дерева значений тип также хранится в объекте колонки: ТаблицаЗначений.Колонки.ИмяКолонки.ТипЗначения. Это полезно при динамическом построении таблиц, когда состав колонок формируется программно.
Определение типа в запросах: ССЫЛКА, ВЫРАЗИТЬ, ЕСТЬ NULL
В языке запросов 1С нет прямого аналога ТипЗнч(), но есть конструкции, решающие ту же задачу. Оператор ССЫЛКА проверяет, является ли поле ссылкой на указанный тип: ГДЕ Товары.Номенклатура ССЫЛКА Справочник.Номенклатура. Такое условие незаменимо при работе с составными типами, когда в одном поле могут лежать ссылки разных объектов.
Оператор ВЫРАЗИТЬ приводит значение к заданному типу, а конструкция ВЫБОР ... КОГДА ... ССЫЛКА ... ТОГДА позволяет строить разную логику для разных типов прямо в запросе. Для соединений важна проверка ЕСТЬ NULL: при левом соединении отсутствующие значения приходят как NULL, и сравнение с NULL обычным равенством не сработает — только через ЕСТЬ NULL или функцию ЕСТЬNULL().
Способы проверки типа
Код модулей. Точное сравнение с конкретным типом. Не работает в запросах.
Проверка ссылочного типа поля в запросе. Только для ссылок, не для примитивов.
Приведение составного типа к конкретному в запросе. Требует знания целевого типа заранее.
Проверка типов реквизитов метаданных и колонок. Не работает с произвольными значениями напрямую.
Проверка типа в отладчике и табло
Во время отладки тип значения виден сразу: в табло (окно «Вычислить выражение», Shift+F9) рядом со значением отображается его тип. Это самый быстрый способ понять, что пришло в переменную, не меняя код. Достаточно поставить точку останова, выделить выражение и нажать Shift+F9.
Для сложных структур — массивов, структур, таблиц значений — в табло можно развернуть содержимое и посмотреть тип каждого элемента. Если значение недоступно на клиенте (например, объект данных, живущий только на сервере), отладчик покажет соответствующее ограничение — это тоже сигнал о типе и контексте исполнения.
- 1Поставьте точку останова перед строкой, где используется значение
- 2Откройте табло (Shift+F9) и вычислите выражение с переменной
- 3Посмотрите колонку «Тип» в результате
- 4При необходимости вычислите ТипЗнч(Переменная) прямо в табло
- 5Скорректируйте логику кода под фактический тип или добавьте проверку
Типичные ошибки при определении типов
Частая ошибка — сравнение типа строкой: Если Строка(ТипЗнч(Х)) = "Число". Такой код хрупок, зависит от локализации и медленнее прямого сравнения типов. Всегда используйте сравнение объектов типа через Тип().
Вторая распространённая проблема — путаница между ссылкой и объектом. ДокументСсылка.РеализацияТоваровУслуг и ДокументОбъект.РеализацияТоваровУслуг — разные типы. Если процедура получает ссылку, а код рассчитывает на объект с возможностью изменения данных, проверка типа должна это учитывать, иначе запись объекта завершится ошибкой.
Третья группа ошибок связана со значениями Неопределено и NULL. Проверка ТипЗнч() = Тип("Строка") не отловит Неопределено, а в запросе NULL требует отдельной обработки. Перед проверкой типа нередко стоит явно проверить значение на Неопределено и NULL.
Частые вопросы
Чем ТипЗнч() отличается от Тип()?
ТипЗнч(Значение) возвращает тип конкретного переданного значения. Тип("ИмяТипа") создаёт описание типа по его имени для сравнения. Обычно они используются в паре: результат ТипЗнч сравнивается с результатом Тип.
Как проверить, что значение — ссылка любого вида?
Используйте метод Справочники.ТипВсеСсылки().СодержитТип(ТипЗнч(Значение)) или аналогичные наборы для документов. Для проверки «ссылка вообще» можно последовательно проверить составные типы всех ссылочных менеджеров либо воспользоваться функциями общих модулей типовых конфигураций, например ОбщегоНазначения.ЭтоСсылка().
Как определить тип значения в составном реквизите документа?
Возьмите конкретное значение реквизита и примените ТипЗнч() — составной тип описывает допустимые варианты, но конкретное значение всегда имеет один тип. В запросе используйте ВЫБОР с проверками ССЫЛКА для каждого возможного типа.
Почему сравнение ТипЗнч() с Тип() возвращает Ложь, хотя типы «одинаковые»?
Чаще всего причина в различии Ссылка/Объект: значение является ДокументОбъект, а проверка идёт на ДокументСсылка. Также проверьте точное имя метаданного в строке Тип("...") — опечатка в имени даёт другой тип или ошибку выполнения.
Как узнать тип значения в запросе без изменения текста запроса?
Выполните запрос, получите выборку и в коде проверьте тип поля через ТипЗнч(Выборка.ИмяПоля). Альтернатива — добавить в запрос поле с ВЫБОР ... КОГДА Поле ССЫЛКА ... ТОГДА "ИмяТипа", чтобы тип возвращался строкой прямо из запроса.
Что важно запомнить
В коде тип определяют через ТипЗнч() со сравнением через Тип(), в запросах — через ССЫЛКА, ВЫРАЗИТЬ и ЕСТЬ NULL, типы реквизитов метаданных — через ОписаниеТипов. При отладке быстрее всего посмотреть тип в табло. Не забывайте про различие Ссылка/Объект и значения Неопределено и NULL.