Как проверить наличие реквизита в 1С: Предприятие 8.3

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

Рассмотрим основные способы проверки.

Проверка наличия свойства в Структуре

Метод Свойство(): Этот метод является предпочтительным, так как он не только проверяет наличие, но и может сразу вернуть значение свойства, если оно есть.
Метод Свойство() возвращает Истина, если свойство найдено, и Ложь – в противном случае. Значение найденного свойства помещается во второй параметр:

МояСтруктура = Новый Структура;
МояСтруктура.Вставить("Код", "001");
МояСтруктура.Вставить("Наименование", "Товар Пример");

// Проверяем наличие реквизита "Артикул"
Перем ЗначениеРеквизита;
Если МояСтруктура.Свойство("Артикул", ЗначениеРеквизита) Тогда
    Сообщить("Реквизит 'Артикул' существует. Значение: " + ЗначениеРеквизита);
Иначе
    Сообщить("Реквизит 'Артикул' НЕ существует.");
КонецЕсли;

// Проверяем наличие реквизита "Код"
Если МояСтруктура.Свойство("Код", ЗначениеРеквизита) Тогда
    Сообщить("Реквизит 'Код' существует. Значение: " + ЗначениеРеквизита);
Иначе
    Сообщить("Реквизит 'Код' НЕ существует.");
КонецЕсли;

Проверка наличия колонки в ТаблицеЗначений или ДеревеЗначений

Для таблиц и деревьев значений проверяется наличие колонки по ее имени.

Метод Найти() коллекции Колонки. Метод Найти() возвращает объект колонки, если она найдена, и Неопределено – в противном случае.

МояТЗ = Новый ТаблицаЗначений;
МояТЗ.Колонки.Добавить("Номенклатура");
МояТЗ.Колонки.Добавить("Количество");

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

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

// Для ДереваЗначений аналогично:
МоеДерево = Новый ДеревоЗначений;
МоеДерево.Колонки.Добавить("Группа");
Если МоеДерево.Колонки.Найти("Родитель") = Неопределено Тогда
    Сообщить("Колонка 'Родитель' НЕ существует в ДеревеЗначений.");
КонецЕсли;

Проверка наличия реквизита у объекта метаданных

Иногда нужно проверить, определен ли реквизит для типа объекта в конфигурации (например, для справочника, документа, его табличной части и т.д.).

Обращение к коллекции Реквизиты объекта метаданных и метод Найти():

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

// Проверка реквизита табличной части "Товары" документа "РеализацияТоваровУслуг"
ИмяРеквизитаТЧ = "СтавкаНДС";
МетаданныеДокумента = Метаданные.Документы.РеализацияТоваровУслуг; // для удобства

// Сначала проверим, есть ли вообще такая ТЧ
Если МетаданныеДокумента.ТабличныеЧасти.Найти("Товары") <> Неопределено Тогда
    Если МетаданныеДокумента.ТабличныеЧасти.Товары.Реквизиты.Найти(ИмяРеквизитаТЧ) <> Неопределено Тогда
        Сообщить("Реквизит '" + ИмяРеквизитаТЧ + "' существует в ТЧ 'Товары' документа 'РеализацияТоваровУслуг'.");
    Иначе
        Сообщить("Реквизит '" + ИмяРеквизитаТЧ + "' НЕ существует в ТЧ 'Товары'.");
    КонецЕсли;
Иначе
    Сообщить("Табличная часть 'Товары' НЕ существует в документе 'РеализацияТоваровУслуг'.");
КонецЕсли;

Если вы работаете с конкретным объектом (например, ОбъектДокумента), вы можете получить его метаданные:
ОбъектДокумента.Метаданные().Реквизиты.Найти(“ИмяНужногоРеквизита”).

Проверка наличия элемента и реквизита формы

// ЭтаФорма - объект УправляемаяФорма

// Проверка элемента формы
Если ЭтаФорма.Элементы.Найти("ИмяРеквизитаФормы") <> Неопределено Тогда // Для элементов
Иначе
    Сообщить("Элемент формы 'ИмяРеквизитаФормы' НЕ существует.");
КонецЕсли;


// Проверка для реквизитов формы через Попытку (менее предпочтительно)
Попытка
    Значение = ЭтаФорма["ИмяРеквизитаФормы"]; // или ЭтаФорма.ИмяРеквизитаФормы
    РеквизитСуществует = Истина;
Исключение
    РеквизитСуществует = Ложь;
КонецПопытки;

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

Важное замечание

Использование Попытка … Исключение для проверки наличия реквизита возможно, но считается менее производительным и “чистым” способом по сравнению со специальными методами (СвойствоНайти). Старайтесь использовать Попытка … Исключение только в тех случаях, когда других вариантов нет или они значительно усложняют код.

Заключение

Правильная проверка наличия реквизитов помогает создавать более надежный и гибкий код, который будет корректно работать в различных условиях и конфигурациях, избегая аварийного завершения из-за обращения к несуществующим данным. Выбирайте метод проверки в зависимости от типа объекта, с которым вы работаете.

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

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

5 × два =

К НАЧАЛУ