При написании кода обработок загрузки данных, интеграций или типовых модулей разработчики часто сталкиваются с ситуацией, когда условие проверки типа возвращает Ложь, хотя переменная содержит нужный элемент справочника. Проанализируем типичный пример такой ошибки и рассмотрим правильные подходы к проверке типов данных в платформе «1С:Предприятие».
Посмотрим на пример кода, вызывающего затруднение:
Если ТипЗнч(Объект) = Тип("СправочникСсылка.Склады") Тогда
Имя = "ВидСклада";
КонецЕсли;
В процессе отладки выясняется, что выражение ТипЗнч(Объект) возвращает представление Справочник объект: Склады (места хранения), однако само логическое условие вычисляется как Ложь.
В платформе «1С:Предприятие» типы СправочникСсылка.<Имя> и СправочникОбъект.<Имя> представляют собой совершенно разные типы данных:
Записать(), Удалить()).Функция ТипЗнч(Объект) для открытого или созданного элемента возвращает тип СправочникОбъект.Склады. При сравнении его с типом СправочникСсылка.Склады платформа возвращает Ложь, так как типы не совпадают.
Если в переменную гарантированно передается объект справочника, предназначенный для редактирования или записи, укажем соответствующий тип объекта в функции Тип():
Если ТипЗнч(Объект) = Тип("СправочникОбъект.Склады") Тогда
Имя = "ВидСклада";
КонецЕсли;
Обратите внимание: работа с типами вида СправочникОбъект возможна только на стороне сервера, во внешнем соединении или в толстом клиенте. В тонком клиенте объектных типов платформы не существует.
У каждого объекта справочника есть стандартное свойство Ссылка. Если логика проверки изначально рассчитана на работу со ссылочными типами, обратимся к типу свойства ссылки:
Если ТипЗнч(Объект.Ссылка) = Тип("СправочникСсылка.Склады") Тогда
Имя = "ВидСклада";
КонецЕсли;
Данный вариант корректно сработает и для новых элементов, которые еще не были записаны в базу данных, так как свойство Объект.Ссылка у них содержит пустую ссылку нужного типа.
Разберем универсальный подход, который одинаково корректно обрабатывает как ссылки (СправочникСсылка), так и объекты (СправочникОбъект) или выборки (СправочникВыборка). Метод Метаданные() возвращает объект метаданных конфигурации:
Если Объект.Метаданные() = Метаданные.Справочники.Склады Тогда
Имя = "ВидСклада";
КонецЕсли;
Также можно выполнить проверку по строковому имени объекта метаданных:
Если Объект.Метаданные().Имя = "Склады" Тогда
Имя = "ВидСклада";
КонецЕсли;
Прямое обращение к свойству Объект.Метаданные() приведет к аварийному завершению программы, если в переменную Объект попадет примитивный тип (число, строка), структура или значение Неопределено / Null.
Для создания отказоустойчивого кода используем поиск объекта метаданных по типу значения с помощью метода Метаданные.НайтиПоТипу():
ОбъектМД = Метаданные.НайтиПоТипу(ТипЗнч(Объект));
Если ОбъектМД <> Неопределено И ОбъектМД = Метаданные.Справочники.Склады Тогда
Имя = "ВидСклада";
КонецЕсли;
Этот подход гарантирует стабильную работу алгоритма независимо от переданных во входном параметре типов данных.