К статье
Практический материал

Разработка и Конфигурация · 11 мин

Как в 1С проверить существование реквизита на форме

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

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

Во встроенном языке 1С нет отдельной функции вида «РеквизитСуществует», поэтому проверку выполняют обходными способами: поиском по имени в коллекции реквизитов формы, перебором коллекции или перехватом исключения. Ниже разобраны все рабочие варианты для управляемых и обычных форм, а также проверка реквизитов объекта метаданных.

Важно различать три разные задачи: проверка реквизита формы (служебной переменной формы), проверка реквизита объекта данных (справочника, документа) и проверка элемента формы (поля на экране). Для каждой задачи используется свой механизм, и их нельзя подменять друг другом.

Что именно проверяем: реквизит формы, объекта или элемент формы

Реквизит формы — это переменная, объявленная в дереве реквизитов формы в конфигураторе или добавленная программно. К ней обращаются через ЭтотОбъект.ИмяРеквизита в модуле формы или через ЭлементыФормы в обычном приложении. Реквизит формы может быть связан с данными объекта (основной реквизит «Объект») или существовать самостоятельно.

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

Ошибка в выборе механизма — частая причина ложных выводов. Например, реквизит объекта существует в метаданных, но не выведен на форму: проверка через метаданные вернёт «есть», а обращение на форме через Элементы — «нет». Сначала определите, какой уровень вам нужен, затем выбирайте способ проверки.

Проверка реквизита формы на управляемой форме

На управляемой форме коллекцию реквизитов возвращает метод ПолучитьРеквизиты(). Он принимает необязательный параметр — путь к родительскому реквизиту — и возвращает массив объектов типа ДанныеФормыЭлементКоллекции с полями Имя, Путь, ТипЗначения и другими. Проверка сводится к поиску нужного имени в этом массиве.

&НаСервере

Функция РеквизитФормыСуществует(ИмяРеквизита)

Реквизиты = ПолучитьРеквизиты();

Для Каждого Реквизит Из Реквизиты Цикл

Если Реквизит.Имя = ИмяРеквизита Тогда

Возврат Истина;

КонецЕсли;

КонецЦикла;

Возврат Ложь;

КонецФункции

Если реквизит расположен внутри таблицы значений или другого составного реквизита, передайте путь в ПолучитьРеквизиты: например, ПолучитьРеквизиты("Товары") вернёт колонки табличной части формы. Вызов без параметра возвращает только реквизиты верхнего уровня, поэтому колонки таблиц в нём не найдутся.

Обратите внимание на регистр: во встроенном языке имена реквизитов регистронезависимы, но при сравнении строк через «=» сравнение также регистронезависимое, поэтому дополнительной нормализации не требуется. Однако лишние пробелы в имени сравнение не прощает — передавайте имя без пробелов.

Порядок проверки на управляемой форме
  1. 1
    Вызовите ПолучитьРеквизиты() для верхнего уровня или ПолучитьРеквизиты(Путь) для вложенных
  2. 2
    Переберите массив и сравните поле Имя с искомым именем
  3. 3
    Если реквизит найден — безопасно обращайтесь к нему через ЭтотОбъект[ИмяРеквизита]
  4. 4
    Если не найден — выведите понятное сообщение или выполните альтернативную ветку логики

Проверка через обращение по строковому имени

Когда имя реквизита известно только как строка (например, пришло из настроек или параметров), удобно обращаться через квадратные скобки: ЭтотОбъект[ИмяРеквизита]. Но если реквизита нет, такое обращение вызовет исключение. Безопасный вариант — обернуть обращение в попытку.

&НаКлиенте

Процедура ЗаполнитьЕслиЕсть(ИмяРеквизита, Значение)

Попытка

ЭтотОбъект[ИмяРеквизита] = Значение;

Исключение

Сообщить("Реквизит """ + ИмяРеквизита + """ отсутствует на форме");

КонецПопытки;

КонецПроцедуры

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

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

Если нужно узнать, есть ли реквизит у справочника, документа или другого объекта конфигурации, работают с метаданными. У объекта метаданных есть коллекции Реквизиты, СтандартныеРеквизиты и ТабличныеЧасти. Поиск выполняется методом Найти, который возвращает Неопределено, если реквизит не найден.

Функция РеквизитОбъектаСуществует(Ссылка, ИмяРеквизита)

МетаданныеОбъекта = Ссылка.Метаданные();

Если МетаданныеОбъекта.Реквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда

Возврат Истина;

КонецЕсли;

Если МетаданныеОбъекта.СтандартныеРеквизиты.Найти(ИмяРеквизита) <> Неопределено Тогда

Возврат Истина;

КонецЕсли;

Возврат Ложь;

КонецФункции

Не забывайте про стандартные реквизиты: «Ссылка», «Код», «Наименование», «Дата», «Номер», «Проведен» хранятся в отдельной коллекции СтандартныеРеквизиты, и поиск только в Реквизиты их не обнаружит. Для табличных частей проверка двухуровневая: сначала найти табличную часть в ТабличныеЧасти, затем искать колонку в её коллекции Реквизиты.

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

Элемент формы (поле ввода, надпись, кнопка) проверяется через коллекцию Элементы управляемой формы: Элементы.Найти("ИмяЭлемента"). Метод возвращает Неопределено, если элемента нет. Помните, что у элемента формы и реквизита могут быть разные имена: элемент связан с реквизитом через свойство ПутьКДанным.

В обычных формах (толстый клиент, обычное приложение) реквизиты формы доступны через коллекцию РеквизитыФормы, а элементы — через ЭлементыФормы. Проверка строится аналогично: перебор коллекции или попытка обращения по имени. Если конфигурация работает в обоих режимах, код проверки придётся разделить директивами препроцессора.

Сравнение способов проверки

Перебор ПолучитьРеквизиты()

Универсально для управляемой формы, даёт дополнительные сведения (путь, тип). Требует цикла, чуть длиннее в коде.

Попытка с обращением ЭтотОбъект[Имя]

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

Поиск в метаданных

Единственный способ для реквизитов объектов. Не отвечает на вопрос, выведен ли реквизит на конкретную форму.

Элементы.Найти()

Проверяет визуальный элемент, а не данные. Полезно перед управлением видимостью и доступностью.

Частые ошибки и их последствия

Ошибки при проверке реквизитов обычно приводят либо к падению кода с исключением, либо к тихой неработоспособности логики, когда ветка «реквизита нет» выполняется всегда. Ниже — типичные сценарии, которые стоит проверить в первую очередь.

Типичные ошибки
01
Поиск колонки табличной части формы в ПолучитьРеквизиты() без указания пути — колонка не находится, логика ошибочно считает реквизит отсутствующим
02
Сравнение результата метаданные.Реквизиты.Найти() с Ложь вместо Неопределено — проверка всегда даёт неверный результат
03
Проверка реквизита объекта через Элементы формы — элемент может быть не выведен, хотя реквизит в метаданных есть
04
Игнорирование стандартных реквизитов — Код, Наименование, Дата не находятся через коллекцию Реквизиты
05
Передача имени с пробелом или опечаткой — сравнение строк не срабатывает, ошибка воспроизводится нестабильно

Отдельный риск — динамически добавленные реквизиты. Если реквизит создаётся программно через ИзменитьРеквизиты, он появляется в коллекции только после выполнения этого метода. Проверка до вызова ИзменитьРеквизиты закономерно вернёт отсутствие реквизита.

Как убедиться, что проверка работает правильно

После внедрения проверки протестируйте оба сценария: когда реквизит есть и когда его нет. Для этого временно переименуйте реквизит в конфигураторе или передайте заведомо несуществующее имя и убедитесь, что код корректно переходит в альтернативную ветку без исключения.

Контрольные точки

Как проверить результат

Обращение к существующему реквизиту
Норма

Значение читается и записывается без ошибок

Тревожный признак

Исключение «Поле объекта не обнаружено»

Проверка несуществующего имени
Норма

Функция возвращает Ложь, выполняется запасная ветка

Тревожный признак

Код падает с исключением или возвращает Истина

Колонка табличной части формы
Норма

Находится через ПолучитьРеквизиты(Путь)

Тревожный признак

Не находится при вызове без параметра

Полезная практика — вынести проверку существования в общий серверный модуль и вызывать её из любых форм. Это убирает дублирование кода и упрощает сопровождение: если логику проверки потребуется изменить, правка будет в одном месте.

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

Часто задаваемые вопросы

Есть ли в 1С готовая функция «РеквизитСуществует»?

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

Почему ПолучитьРеквизиты() не находит колонку таблицы формы?

Без параметра метод возвращает только реквизиты верхнего уровня. Колонки таблицы значений или табличной части формы находятся через ПолучитьРеквизиты("ИмяТаблицы"), где параметр — путь к родительскому реквизиту.

Чем отличается проверка реквизита от проверки элемента формы?

Реквизит — это данные, элемент — визуальное поле на экране. Реквизит может существовать без элемента (не выведен на форму), а элемент всегда связан с реквизитом через ПутьКДанным. Проверка элемента выполняется через Элементы.Найти(), реквизита — через ПолучитьРеквизиты().

Как проверить наличие реквизита «Комментарий» у любого документа?

Получите метаданные объекта через Ссылка.Метаданные() и выполните Реквизиты.Найти("Комментарий"). Если результат не равен Неопределено — реквизит есть. Для универсальности дополнительно проверьте коллекцию СтандартныеРеквизиты.

Можно ли проверить реквизит на клиенте без вызова сервера?

Метод ПолучитьРеквизиты доступен и на клиенте в управляемой форме, поэтому перебор коллекции работает без серверного вызова. А вот обращение к метаданным возможно только на сервере — для проверки реквизитов объекта потребуется серверная процедура.

Что делать, если проверка нужна для динамически созданного реквизита?

Выполняйте проверку после вызова ИзменитьРеквизиты — до него реквизит в коллекции отсутствует. Если порядок вызовов не гарантирован, храните признак создания реквизита в отдельной переменной формы и ориентируйтесь на него.

Итог

Что важно запомнить

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