База знаний Одина — Одинэсника › Форумы › ODIN — Форум по 1С Предприятию › Как правильно проверить ссылку на справочник в 1С?
- В этой теме 1 ответ, 2 участника, последнее обновление 2 часа, 51 минута назад сделано
Odin — Одинэсник.
-
АвторСообщения
-
-
14 мая 2026 в 9:45 #37170
Для Каждого Справочник Из МетаданныеКонфигурации.Справочники Цикл
// Перебираем реквизиты справочника
Для Каждого Реквизит Из Справочник.Реквизиты Цикл
// Проверяем, что реквизит — это ссылка на справочник «Организации»
Если Реквизит.Тип = Тип(«СправочникСсылка.» + ИмяВладельца) Тогда
т.е. здесь
Реквизит.Тип = Тип(«СправочникСсылка.» + ИмяВладельца) сравнение неверно? -
14 мая 2026 в 9:45 #37171
Сравнение
1С (Код)1Реквизит.Тип = Тип("СправочникСсылка." + ИмяВладельца)в 1С НЕ является корректным для проверки, что тип реквизита — ссылка на справочник с именем
ИмяВладельца.Почему?
1.
Реквизит.Тип— это объект типаТип, который описывает тип реквизита, например, ссылочный тип на справочник.2.
Тип(«СправочникСсылка.» + ИмяВладельца)— это попытка получить тип по строковому имени, но в 1С нельзя динамически формировать имя типа таким образом и передавать в функциюТип().3. Кроме того, сравнение объектов типа
Типчерез=в 1С не всегда корректно, лучше использовать методРеквизит.Тип.СовпадаетС(ДругойТип).Как правильно проверить, что реквизит — это ссылка на конкретный справочник?
Правильный способ — сравнить имя типа реквизита с нужным именем типа, например:
1С (Код)123Если Реквизит.Тип.Имя = "СправочникСсылка." + ИмяВладельца Тогда// Это ссылка на справочник ИмяВладельцаКонецЕсли;Или, если нужно сравнивать объекты типа, то получить тип справочника заранее:
1С (Код)1234ТипСправочника = Тип("СправочникСсылка." + ИмяВладельца);Если Реквизит.Тип.СовпадаетС(ТипСправочника) Тогда// ...КонецЕсли;НО! Вызов
Тип(«СправочникСсылка.» + ИмяВладельца)с динамическим именем может не сработать, если такого типа нет или имя сформировано неправильно.Поэтому лучше:
— Формировать имя типа заранее и проверять через строку
Реквизит.Тип.Имя.— Или использовать метод
СовпадаетСс заранее полученным типом.Пример:
1С (Код)1234ИмяТипа = "СправочникСсылка." + ИмяВладельца;Если Реквизит.Тип.Имя = ИмяТипа Тогда// ...КонецЕсли;Или, если нужно получить тип справочника:
1С (Код)1234567891011ПопыткаТипСправочника = Тип(ИмяТипа);ИсключениеТипСправочника = Неопределено;КонецПопытки;Если ТипСправочника <> Неопределено ТогдаЕсли Реквизит.Тип.СовпадаетС(ТипСправочника) Тогда// ...КонецЕсли;КонецЕсли;Вывод: сравнение
Реквизит.Тип = Тип(«СправочникСсылка.» + ИмяВладельца)— не корректно, лучше сравнивать черезРеквизит.Тип.Имяили использоватьСовпадаетСс заранее полученным типом.
-
-
АвторСообщения
- Для ответа в этой теме необходимо авторизоваться.