Почему реквизит документа доступен в коде и на форме, но отсутствует в реквизитах объекта и не виден в запросе?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

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

Анализ проблемы: проявление в коде и конфигураторе

Рассмотрим типовую ситуацию. При работе с документом в коде выполняется стандартное чтение и запись данных:


Док = МойДокумент.ПолучитьОбъект();
Док.НужныйРеквизит = ПодставитьНужноеЗначение;
Док.Записать();

Код выполняется без ошибок, свойство успешно модифицируется и сохраняется в базе данных. На форме документа элемент управления также привязан к данным и отображает значение. Однако при попытке найти это поле в конфигураторе в ветке Документы -> [ИмяДокумента] -> Реквизиты нужного поля нет, а в некоторых консолях запросов оно не отображается в списке доступных полей таблицы.

Главная причина такого поведения — использование объекта метаданных «Общий реквизит».

Механизм общих реквизитов в 1С

Выясним, как устроены общие реквизиты и почему они ведут себя именно так:

  1. Расположение в метаданных: Общие реквизиты находятся в общей ветке конфигурации: Общие -> Общие реквизиты. Они создаются один раз и могут использоваться сразу во множестве документов, справочников или других объектов конфигурации. Именно поэтому в дереве самого документа такой реквизит не отображается.
  2. Состав и автоиспользование: В палитре свойств общего реквизита задается список объектов (свойство «Состав») и режим включения («Использовать» или «Автоиспользование»). Если документ включен в состав, платформа автоматически добавляет физическую колонку в таблицу базы данных для этого документа.
  3. Доступность в объектной модели: Для встроенного языка общий реквизит ничем не отличается от стандартного реквизита документа. Обращение к нему выполняется напрямую через точку: ДокументОбъект.ИмяОбщегоРеквизита.
  4. Использование в запросах: В тексте запроса к общему реквизиту обращаются стандартно:

ВЫБРАТЬ
    Док.Ссылка КАК Документ,
    Док.ИмяОбщегоРеквизита КАК ЗначениеРеквизита
ИЗ
    Документ.РеализацияТоваровУслуг КАК Док

Если внешняя консоль запросов не выводит поле в дереве полей, это может быть связано с особенностями построения метаданных в самой обработке или с режимом разделения данных.

Особенности разделения данных (Data Separation)

Общие реквизиты часто применяются в качестве разделителей данных в архитектуре разделенных баз (SaaS, работа в сервисе, разделение по организациям или областям данных). Рассмотрим важные нюансы:

  1. Если общий реквизит является разделителем данных, платформа на уровне платформенного механизма и СУБД автоматически накладывает неявный отбор по значению разделителя текущего сеанса.
  2. Если запрос выполняется в сеансе, где разделение выключено или не установлено, прямое обращение к таблице может возвращать пустой результат либо требовать явной настройки параметров разделения сеанса.

Другие причины отсутствия реквизита в метаданных документа

Если вы столкнулись с ситуацией, когда поле есть на форме, но отсутствует в реквизитах документа, проанализируем другие возможные варианты реализации:

  1. Реквизит добавлен через расширение конфигурации: Если поле добавлено в расширении (*.cfe), в основной конфигурации оно отображаться не будет. При этом в пользовательском режиме реквизит полностью функционален.
  2. Дополнительные реквизиты и сведения (БСП): Механизм БСП позволяет выводить дополнительные поля на форму динамически. Данные таких полей хранятся в табличной части ДополнительныеРеквизиты или в независимом регистре сведений ДополнительныеСведения, а не в виде отдельных колонок таблицы документа.
  3. Реквизит формы с программной обработкой: Поле может являться реквизитом самой формы (не объекта), а чтение и запись данных могут выполняться разработчиком вручную в обработчиках событий при открытии и перед записью документа.
  4. Несовпадение имени и заголовка элемента: Проверьте свойство «ПутьКДанным» (DataPath) элемента формы. Отображаемый заголовок или имя элемента могут отличаться от реального имени реквизита в базе данных.

Пошаговый алгоритм поиска реквизита

Разберем по шагам, как быстро локализовать происхождение реквизита:

  1. Откройте форму документа в конфигураторе и выделите элемент управления.
  2. В палитре свойств элемента проверьте свойство «Данные» (или «ПутьКДанным»). Убедитесь, к какому именно объекту и полю привязан элемент.
  3. Если поле привязано к Объект.[ИмяПоля] (или ДокументОбъект.[ИмяПоля]), но в ветке реквизитов документа его нет — перейдите в ветку Общие -> Общие реквизиты и найдите реквизит с таким именем.
  4. Проверьте состав общего реквизита и убедитесь, что для вашего документа установлено использование этого реквизита.
← На главную