Как проверить наличие реквизита в 1C 8.5

Метод 1: Проверка через Метаданные

Этот подход использует статическую структуру конфигурации, описанную в дереве метаданных. Он отвечает на вопрос: «Задуман ли разработчиком реквизит с таким именем для этого типа объектов?»

// Проверка наличия реквизита у справочника "Контрагенты"
Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти("ИНН") = Неопределено Тогда
    Сообщить("Реквизит не найден в конфигурации!");
КонецЕсли;

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

Метод 2: Проверка с использованием алгоритмов БСП

В отличие от первого подхода, функции БСП отвечают на вопрос: «Имеет ли прямо сейчас этот конкретный экземпляр объекта (которым может быть форма, структура или запись табличной части) свойство или реквизит с заданным именем?»

Достигается это хитрым, но эффективным приемом. Функция создает временную структуру с полем-«маркером» и с помощью метода ЗаполнитьЗначенияСвойств() пытается перенести в нее значение из проверяемого объекта. Если значение в структуре изменилось, значит, свойство существует.

// Эта функция внутри выполняет алгоритм, описанный выше
Результат = ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита);

Этот метод универсален и подходит для подавляющего большинства практических задач.

В арсенале БСП есть также функция ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта). Находится функция в общем модуле ОбщегоНазначения. Но если перейти в код функции, то можно понять, что это по сути тот же метод 1, описанный выше, только вынесенный в отдельную функцию. Она проверяет наличие реквизита в метаданных.

Где вызывается — на клиенте или на сервере?

Проверка напрямую через метаданные может быть вызвана только на сервере, либо на клиенте через серверный вызов. Логично, что и функция ОбщегоНазначения.ЕстьРеквизитОбъекта(ИмяРеквизита, МетаданныеОбъекта) может быть вызывана только на сервере или на клиенте через серверный вызов. А вот универсальная функция ОбщегоНазначенияКлиентСервер.ЕстьРеквизитИлиСвойствоОбъекта(Объект, ИмяРеквизита) может быть вызвана как на клиенте, так и на сервере, что только подкрепляет ее универсальность.

Оставьте комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Отправьте форму и мы вам перезвоним

Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу
Сайт itviar.ru использует cookie для персонализации и хранения настроек.
Отправляя форму вы соглашаетесь с политикой конфиденциальности и даете согласие на обработку персональных данных компании ИП Рыжиченко Антону Ивановичу