Почему проверка ТипЗнч возвращает Ложь при сравнении со СправочникСсылка в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Посмотрим на пример кода, вызывающего затруднение:


Если ТипЗнч(Объект) = Тип("СправочникСсылка.Склады") Тогда
    Имя = "ВидСклада";
КонецЕсли;

В процессе отладки выясняется, что выражение ТипЗнч(Объект) возвращает представление Справочник объект: Склады (места хранения), однако само логическое условие вычисляется как Ложь.

Выясним причину ошибки

В платформе «1С:Предприятие» типы СправочникСсылка.<Имя> и СправочникОбъект.<Имя> представляют собой совершенно разные типы данных:

  1. СправочникСсылка — это неизменяемый ссылочный идентификатор элемента, хранящегося в базе данных. Ссылка содержит уникальный идентификатор (GUID) и используется для связывания данных и отображения в реквизитах.
  2. СправочникОбъект — это экземпляр данных, загруженный в оперативную память для редактирования или создания нового элемента. Он содержит полную структуру реквизитов и табличных частей и предоставляет методы записи (Записать(), Удалить()).

Функция ТипЗнч(Объект) для открытого или созданного элемента возвращает тип СправочникОбъект.Склады. При сравнении его с типом СправочникСсылка.Склады платформа возвращает Ложь, так как типы не совпадают.

Способ 1. Прямая проверка типа объектной сущности

Если в переменную гарантированно передается объект справочника, предназначенный для редактирования или записи, укажем соответствующий тип объекта в функции Тип():


Если ТипЗнч(Объект) = Тип("СправочникОбъект.Склады") Тогда
    Имя = "ВидСклада";
КонецЕсли;

Обратите внимание: работа с типами вида СправочникОбъект возможна только на стороне сервера, во внешнем соединении или в толстом клиенте. В тонком клиенте объектных типов платформы не существует.

Способ 2. Проверка через ссылку объекта

У каждого объекта справочника есть стандартное свойство Ссылка. Если логика проверки изначально рассчитана на работу со ссылочными типами, обратимся к типу свойства ссылки:


Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.Склады") Тогда
    Имя = "ВидСклада";
КонецЕсли;

Данный вариант корректно сработает и для новых элементов, которые еще не были записаны в базу данных, так как свойство Объект.Ссылка у них содержит пустую ссылку нужного типа.

Способ 3. Универсальная проверка через метаданные

Разберем универсальный подход, который одинаково корректно обрабатывает как ссылки (СправочникСсылка), так и объекты (СправочникОбъект) или выборки (СправочникВыборка). Метод Метаданные() возвращает объект метаданных конфигурации:


Если Объект.Метаданные() = Метаданные.Справочники.Склады Тогда
    Имя = "ВидСклада";
КонецЕсли;

Также можно выполнить проверку по строковому имени объекта метаданных:


Если Объект.Метаданные().Имя = "Склады" Тогда
    Имя = "ВидСклада";
КонецЕсли;

Способ 4. Безопасная проверка с защитой от ошибок времени выполнения

Прямое обращение к свойству Объект.Метаданные() приведет к аварийному завершению программы, если в переменную Объект попадет примитивный тип (число, строка), структура или значение Неопределено / Null.

Для создания отказоустойчивого кода используем поиск объекта метаданных по типу значения с помощью метода Метаданные.НайтиПоТипу():


ОбъектМД = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
Если ОбъектМД <> Неопределено И ОбъектМД = Метаданные.Справочники.Склады Тогда
    Имя = "ВидСклада";
КонецЕсли;

Этот подход гарантирует стабильную работу алгоритма независимо от переданных во входном параметре типов данных.

← На главную