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