При разработке на платформе 1С:Предприятие часто возникает необходимость проверить, существует ли определенный реквизит у объекта, в структуре, таблице значений или в метаданных. Это особенно актуально при работе с универсальными механизмами, доработками или при интеграции с различными конфигурациями, где набор реквизитов может отличаться. Неправильное обращение к несуществующему реквизиту приведет к ошибке времени выполнения.
Рассмотрим основные способы проверки.
Проверка наличия свойства в Структуре
Метод Свойство(): Этот метод является предпочтительным, так как он не только проверяет наличие, но и может сразу вернуть значение свойства, если оно есть.
Метод Свойство() возвращает Истина, если свойство найдено, и Ложь – в противном случае. Значение найденного свойства помещается во второй параметр:
МояСтруктура = Новый Структура; МояСтруктура.Вставить("Код", "001"); МояСтруктура.Вставить("Наименование", "Товар Пример"); // Проверяем наличие реквизита "Артикул" Перем ЗначениеРеквизита; Если МояСтруктура.Свойство("Артикул", ЗначениеРеквизита) Тогда Сообщить("Реквизит 'Артикул' существует. Значение: " + ЗначениеРеквизита); Иначе Сообщить("Реквизит 'Артикул' НЕ существует."); КонецЕсли; // Проверяем наличие реквизита "Код" Если МояСтруктура.Свойство("Код", ЗначениеРеквизита) Тогда Сообщить("Реквизит 'Код' существует. Значение: " + ЗначениеРеквизита); Иначе Сообщить("Реквизит 'Код' НЕ существует."); КонецЕсли;
Проверка наличия колонки в ТаблицеЗначений или ДеревеЗначений
Для таблиц и деревьев значений проверяется наличие колонки по ее имени.
Метод Найти() коллекции Колонки. Метод Найти() возвращает объект колонки, если она найдена, и Неопределено – в противном случае.
МояТЗ = Новый ТаблицаЗначений; МояТЗ.Колонки.Добавить("Номенклатура"); МояТЗ.Колонки.Добавить("Количество"); // Проверяем наличие колонки "Цена" Если МояТЗ.Колонки.Найти("Цена") = Неопределено Тогда Сообщить("Колонка 'Цена' НЕ существует в ТаблицеЗначений."); Иначе Сообщить("Колонка 'Цена' существует в ТаблицеЗначений."); КонецЕсли; // Проверяем наличие колонки "Количество" Если МояТЗ.Колонки.Найти("Количество") = Неопределено Тогда Сообщить("Колонка 'Количество' НЕ существует."); Иначе Сообщить("Колонка 'Количество' существует."); КонецЕсли; // Для ДереваЗначений аналогично: МоеДерево = Новый ДеревоЗначений; МоеДерево.Колонки.Добавить("Группа"); Если МоеДерево.Колонки.Найти("Родитель") = Неопределено Тогда Сообщить("Колонка 'Родитель' НЕ существует в ДеревеЗначений."); КонецЕсли;
Проверка наличия реквизита у объекта метаданных
Иногда нужно проверить, определен ли реквизит для типа объекта в конфигурации (например, для справочника, документа, его табличной части и т.д.).
Обращение к коллекции Реквизиты объекта метаданных и метод Найти():
// Проверка реквизита справочника "Контрагенты" ИмяРеквизитаДляПроверки = "ИНН"; Если Метаданные.Справочники.Контрагенты.Реквизиты.Найти(ИмяРеквизитаДляПроверки) <> Неопределено Тогда Сообщить("Реквизит '" + ИмяРеквизитаДляПроверки + "' существует в справочнике 'Контрагенты'."); Иначе Сообщить("Реквизит '" + ИмяРеквизитаДляПроверки + "' НЕ существует в справочнике 'Контрагенты'."); КонецЕсли; // Проверка реквизита табличной части "Товары" документа "РеализацияТоваровУслуг" ИмяРеквизитаТЧ = "СтавкаНДС"; МетаданныеДокумента = Метаданные.Документы.РеализацияТоваровУслуг; // для удобства // Сначала проверим, есть ли вообще такая ТЧ Если МетаданныеДокумента.ТабличныеЧасти.Найти("Товары") <> Неопределено Тогда Если МетаданныеДокумента.ТабличныеЧасти.Товары.Реквизиты.Найти(ИмяРеквизитаТЧ) <> Неопределено Тогда Сообщить("Реквизит '" + ИмяРеквизитаТЧ + "' существует в ТЧ 'Товары' документа 'РеализацияТоваровУслуг'."); Иначе Сообщить("Реквизит '" + ИмяРеквизитаТЧ + "' НЕ существует в ТЧ 'Товары'."); КонецЕсли; Иначе Сообщить("Табличная часть 'Товары' НЕ существует в документе 'РеализацияТоваровУслуг'."); КонецЕсли;
Если вы работаете с конкретным объектом (например, ОбъектДокумента), вы можете получить его метаданные:
ОбъектДокумента.Метаданные().Реквизиты.Найти(“ИмяНужногоРеквизита”).
Проверка наличия элемента и реквизита формы
// ЭтаФорма - объект УправляемаяФорма // Проверка элемента формы Если ЭтаФорма.Элементы.Найти("ИмяРеквизитаФормы") <> Неопределено Тогда // Для элементов Иначе Сообщить("Элемент формы 'ИмяРеквизитаФормы' НЕ существует."); КонецЕсли; // Проверка для реквизитов формы через Попытку (менее предпочтительно) Попытка Значение = ЭтаФорма["ИмяРеквизитаФормы"]; // или ЭтаФорма.ИмяРеквизитаФормы РеквизитСуществует = Истина; Исключение РеквизитСуществует = Ложь; КонецПопытки; Если РеквизитСуществует Тогда Сообщить("Реквизит формы 'ИмяРеквизитаФормы' существует (проверено через Попытку)."); Иначе Сообщить("Реквизит формы 'ИмяРеквизитаФормы' НЕ существует (проверено через Попытку)."); КонецЕсли;
Важное замечание
Использование Попытка … Исключение для проверки наличия реквизита возможно, но считается менее производительным и “чистым” способом по сравнению со специальными методами (Свойство, Найти). Старайтесь использовать Попытка … Исключение только в тех случаях, когда других вариантов нет или они значительно усложняют код.
Заключение
Правильная проверка наличия реквизитов помогает создавать более надежный и гибкий код, который будет корректно работать в различных условиях и конфигурациях, избегая аварийного завершения из-за обращения к несуществующим данным. Выбирайте метод проверки в зависимости от типа объекта, с которым вы работаете.