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