Разработка и Конфигурация · 13 мин
Как проверить наличие метаданных в 1С
Способы проверить наличие метаданных в 1С: через конфигуратор, запросы, метод Метаданные.НайтиПоПолномуИмени и встроенный язык. Примеры кода и типичные ошибки.
Метаданные в 1С — это описание структуры конфигурации: справочники, документы, регистры, перечисления, отчёты и другие объекты, из которых состоит прикладное решение. Проверить их наличие требуется в двух типовых ситуациях: когда администратор или разработчик визуально ищет объект в дереве конфигурации и когда программный код должен убедиться, что нужный объект существует, прежде чем обращаться к нему.
Второй сценарий особенно важен в расширениях, внешних обработках и универсальных обменах: если код обратится к несуществующему объекту напрямую, пользователь получит ошибку исполнения, а обработка завершится аварийно. Правильная проверка позволяет заранее определить, есть ли объект в конфигурации, и корректно обработать его отсутствие.
Ниже разобраны все рабочие способы: визуальный поиск в конфигураторе, методы встроенного языка, проверка через запрос и типичные ошибки, которые приводят к ложным результатам.
Что считается метаданными и зачем проверять их наличие
К метаданным относятся все объекты дерева конфигурации: справочники, документы, журналы документов, перечисления, планы видов характеристик, планы счетов, регистры сведений, накопления, бухгалтерии и расчёта, отчёты, обработки, общие модули, роли, подсистемы и другие сущности. У каждого объекта есть имя, заданное разработчиком, и полное имя вида Справочник.Номенклатура или Документ.РеализацияТоваровУслуг.
Проверка наличия метаданных нужна в нескольких практических случаях. Первый — написание универсального кода, который должен работать в разных конфигурациях: например, обработка обмена обращается к документу «ЗаказКлиента», но в части баз этого документа нет. Второй — расширения конфигурации, где заимствованный объект может быть удалён при обновлении основной конфигурации. Третий — диагностика после обновления: разработчик убеждается, что новые объекты действительно добавлены в базу.
Важно различать проверку наличия объекта метаданных и проверку наличия данных. Метаданные описывают саму структуру (есть ли справочник «Номенклатура» в конфигурации), а данные — конкретные записи внутри него (есть ли в нём элемент с определённым наименованием). Это разные задачи с разными инструментами.
Проверка наличия объекта в конфигураторе визуально
Самый простой способ убедиться, что объект существует, — найти его в дереве конфигурации. Откройте конфигуратор, выполните команду «Конфигурация → Открыть конфигурацию» и дождитесь построения дерева объектов. Далее возможны два подхода.
Первый — поиск по дереву: нажмите Ctrl+F в окне конфигурации и введите имя объекта. Поиск работает по именам и синонимам, поэтому можно искать как «Номенклатура», так и «Товары». Второй — глобальный поиск по всей конфигурации через Ctrl+Shift+F: он находит упоминания объекта не только в дереве, но и в модулях, что полезно, когда нужно понять, где объект используется.
- 1Откройте конфигуратор и команду «Конфигурация → Открыть конфигурацию».
- 2Нажмите Ctrl+F в окне дерева конфигурации и введите имя объекта.
- 3Если объект не найден, проверьте правильность имени и поищите по синониму.
- 4Для поиска всех мест использования объекта примените Ctrl+Shift+F по всей конфигурации.
- 5Если объект нужен в расширении — проверьте отдельно дерево расширения: заимствованные объекты отображаются там, а не в основной конфигурации.
Если конфигурация закрыта от изменений (типовая на полной поддержке), дерево всё равно доступно для просмотра и поиска — ограничение касается только редактирования. Если конфигуратор показывает пустое дерево, проверьте, открыта ли конфигурация: команда «Открыть конфигурацию» могла не выполняться.
Программная проверка через Метаданные.НайтиПоПолномуИмени
Основной программный способ — метод глобального контекста Метаданные.НайтиПоПолномуИмени(). Он принимает строку с полным именем объекта и возвращает объект описания метаданных либо Неопределено, если объект не найден. Именно проверка на Неопределено и даёт ответ о наличии объекта.
ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура");
Если ОбъектМетаданных = Неопределено Тогда
Сообщить("Объект в конфигурации отсутствует");
Иначе
Сообщить("Объект найден: " + ОбъектМетаданных.ПолноеИмя());
КонецЕсли;
Метод безопасен: он не вызывает исключения при отсутствии объекта, поэтому подходит для проверок перед обращением к данным. Обратите внимание на точность полного имени: вид объекта указывается в единственном числе без пробелов (Документ, а не Документы), регистр букв значения не имеет, а вот лишние пробелы и опечатки приведут к результату Неопределено даже при существующем объекте.
Для вложенных объектов — реквизитов, табличных частей, измерений регистров — полное имя строится через точку, например Документ.РеализацияТоваровУслуг.ТабличнаяЧасть.Товары или Справочник.Номенклатура.Реквизит.Артикул. Это позволяет проверять наличие не только объектов целиком, но и отдельных реквизитов, что критично для универсальных обработок заполнения.
Функция ЕстьОбъектМетаданных(ПолноеИмя)
Возврат Метаданные.НайтиПоПолномуИмени(ПолноеИмя) <> Неопределено;
КонецФункции
// Примеры вызова:
// ЕстьОбъектМетаданных("Документ.ЗаказКлиента")
// ЕстьОбъектМетаданных("Справочник.Номенклатура.Реквизит.Артикул")Альтернативные способы: перебор коллекций и обращение через имя
Если заранее известен вид объекта, наличие можно проверить прямым обращением к коллекции метаданных: Метаданные.Справочники.Найти("Номенклатура"). Метод Найти у коллекций метаданных возвращает объект или Неопределено, не вызывая ошибки. Этот вариант удобен, когда имя объекта хранится без указания вида.
Ещё один подход — перебор коллекции в цикле, когда нужно не просто проверить один объект, а получить список подходящих. Например, найти все документы, у которых есть реквизит «Организация»:
Для Каждого Документ Из Метаданные.Документы Цикл
Если Документ.Реквизиты.Найти("Организация") <> Неопределено Тогда
Сообщить(Документ.Имя);
КонецЕсли;
КонецЦикла;
Существует и приём через попытку прямого обращения: Метаданные.Справочники["Номенклатура"] с обёрткой в Попытка...Исключение. Однако этот способ хуже: обращение по индексу к несуществующему элементу вызывает исключение, а перехват исключений медленнее и затрудняет отладку. Используйте Найти или НайтиПоПолномуИмени — они предназначены именно для безопасной проверки.
Сравнение способов проверки
Универсальный: работает с любым видом объекта и вложенными реквизитами. Требует точного полного имени.
Подходит, когда вид объекта известен заранее. Не работает для объектов другого вида.
Работает, но медленнее и засоряет логику исключениями. Применять только если другие варианты недоступны.
Для ручной проверки разработчиком. Не подходит для программной логики.
Проверка наличия данных внутри объекта метаданных
Частая смежная задача — объект существует, но нужно понять, есть ли в нём записи. Для таблиц (справочников, документов, регистров) это делается запросом с ограничением выборки. Запрос вида ВЫБРАТЬ ПЕРВЫЕ 1 Ссылка ИЗ Справочник.Номенклатура с проверкой Не РезультатЗапроса.Пустой() быстро отвечает на вопрос, есть ли хотя бы один элемент.
Учтите ограничение: текст запроса формируется статически, и если объекта метаданных нет, запрос упадёт с ошибкой ещё на этапе выполнения. Поэтому для универсального кода сначала проверяйте наличие объекта через Метаданные.НайтиПоПолномуИмени, и только потом стройте запрос. Имя таблицы в запрос можно подставить строковой подстановкой через СтрЗаменить или конкатенацию, но аккуратно: подставляйте только проверенные имена из метаданных, а не произвольный пользовательский ввод.
Особенности для расширений и внешних обработок
В расширениях конфигурации проверка метаданных имеет нюанс: Метаданные.НайтиПоПолномуИмени в сеансе с подключённым расширением видит и заимствованные, и собственные объекты расширения. Это удобно, но помните: при отключении расширения его объекты исчезают из метаданных сеанса, и код основной конфигурации, обращающийся к ним без проверки, начнёт падать.
Для внешних обработок и отчётов, запускаемых в разных базах, обязательный паттерн — проверка перед использованием. Обработка, рассчитанная на «Управление торговлей», при запуске в «Бухгалтерии» не найдёт часть документов. Корректное поведение — при открытии проверить наличие всех нужных объектов и вывести понятное сообщение о несовместимости вместо аварийной ошибки.
Также учитывайте режим совместимости и права: объект может существовать в метаданных, но у текущего пользователя не быть прав на него. Проверка прав выполняется отдельно функцией ПравоДоступа("Чтение", Метаданные.Справочники.Номенклатура) — наличие объекта и доступ к нему проверяются независимо.
Типичные ошибки при проверке метаданных
Наиболее частая ошибка — неправильное полное имя. Множественное число вида (Справочники.Номенклатура вместо Справочник.Номенклатура), пробелы, лишние точки — всё это даёт Неопределено, и код молча считает, что объекта нет. При сомнениях скопируйте полное имя из свойств объекта в конфигураторе или получите его программно через Метаданные.Справочники.Номенклатура.ПолноеИмя().
Вторая ошибка — путать имя объекта с синонимом. Синоним («Товары и услуги») предназначен для интерфейса и может меняться, в проверках используется только имя, заданное в свойствах объекта латиницей или кириллицей без пробелов. Третья ошибка — проверять наличие объекта один раз при запуске и кэшировать результат в долгоживущем сеансе: после динамического обновления конфигурации состав метаданных может измениться, и кэш станет недостоверным.
Как проверить результат
Возвращает объект, у которого можно получить ПолноеИмя()
Возвращает Неопределено — проверьте точность имени
Объект находится по Ctrl+F в дереве конфигурации
Объект не найден ни по имени, ни по синониму — его нет в конфигурации
Запрос выполняется без ошибки, возможен пустой результат
Ошибка «Таблица не найдена» — объект отсутствует или имя указано неверно
Частые вопросы
Как проверить наличие реквизита у объекта?
Используйте полное имя с вложенностью: Метаданные.НайтиПоПолномуИмени("Справочник.Номенклатура.Реквизит.Артикул"). Альтернатива — сначала получить объект метаданных, затем вызвать Найти у коллекции реквизитов: ОбъектМетаданных.Реквизиты.Найти("Артикул"). Оба способа возвращают Неопределено при отсутствии реквизита.
Чем отличается НайтиПоПолномуИмени от НайтиПоИмени?
НайтиПоПолномуИмени принимает полное имя с указанием вида объекта («Документ.ЗаказКлиента») и работает для любых типов, включая вложенные. НайтиПоИмени требует отдельно передать вид объекта и короткое имя. Для универсальных проверок удобнее первый вариант — одна строка вместо двух параметров.
Можно ли проверить метаданные без прав администратора?
Да. Чтение метаданных через встроенный язык доступно любому пользователю — объектная модель метаданных не требует административных прав. Ограничения возникают только при попытке обратиться к данным объекта, на который у пользователя нет прав, поэтому дополнительно проверяйте доступ через ПравоДоступа.
Почему объект есть в конфигураторе, но НайтиПоПолномуИмени возвращает Неопределено?
Чаще всего причина в опечатке или неверном формате полного имени: множественное число вида, пробелы, неверный регистр вложенных имён. Реже — база работает на старой версии конфигурации: изменения сохранены в конфигураторе, но конфигурация базы данных не обновлена. Выполните «Обновить конфигурацию базы данных» и повторите проверку.
Как проверить наличие объекта, добавленного расширением?
Так же, через Метаданные.НайтиПоПолномуИмени — в сеансе с подключённым расширением его объекты видны в метаданных. Если метод возвращает Неопределено, проверьте, подключено ли расширение в текущем сеансе и не отключено ли оно настройками безопасности (флажок «Безопасный режим» или «Защита от опасных действий»).
Как получить список всех объектов определённого вида?
Переберите соответствующую коллекцию в цикле: Для Каждого Элемент Из Метаданные.Документы Цикл ... КонецЦикла. У каждого элемента доступны свойства Имя, Синоним, ПолноеИмя(). Так можно выгрузить полный состав конфигурации для сравнения с эталоном или документирования.
Что важно запомнить
Программная проверка наличия метаданных делается через Метаданные.НайтиПоПолномуИмени с контролем результата на Неопределено; визуальная — поиском в дереве конфигурации. Полное имя должно быть точным: вид в единственном числе, без пробелов. Наличие объекта, права на него и наличие данных внутри — три разные проверки, которые комбинируются по мере необходимости.