Как сделать доступными стандартные реквизиты (Владелец, Родитель) в расширении конфигурации 1С?

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

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

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

Выясняем причину: почему стандартные реквизиты «исчезают» в расширении?

Когда мы заимствуем объект метаданных (например, справочник) в расширение, платформа переносит туда лишь его базовое описание (своего рода облегченный каркас). Стандартные реквизиты, вопреки своему названию, не существуют в базе данных «сами по себе» в отрыве от структуры объекта. Они генерируются платформой динамически на основе ключевых структурных свойств справочника или документа.

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

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

Решение проблемы для реквизита Владелец

Рассмотрим по шагам, как решить проблему на примере справочника ХарактеристикиНоменклатуры, владельцами которого в типовых конфигурациях (например, в «1С:Управление торговлей 11») являются сразу несколько объектов.

Допустим, нам необходимо выполнить следующий запрос внутри расширения:


ВЫБРАТЬ
    ХарактеристикиНоменклатуры.Владелец КАК Владелец,
    ХарактеристикиНоменклатуры.ДополнительныеРеквизиты.(
        Значение КАК Значение,
        Свойство.Наименование КАК СвойствоНаименование1
    ) КАК ДополнительныеРеквизиты
ИЗ
    Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ГДЕ
    ХарактеристикиНоменклатуры.Владелец = &Владелец
    И ХарактеристикиНоменклатуры.ДополнительныеРеквизиты.Свойство.Наименование = &Наименование

Чтобы поле Владелец стало доступно в Конструкторе запросов и при компиляции кода, выполним следующие действия:

  1. Перенесем в расширение справочники, которые могут выступать владельцами для целевого справочника. Например, для характеристик номенклатуры это справочники Номенклатура и ВидыНоменклатуры. Важно: если у реквизита составной тип, необходимо заимствовать абсолютно все типы, входящие в этот состав. Если упустить хотя бы один справочник-владелец, поле останется недоступным.
  2. В дереве объектов расширения найдем заимствованный справочник (в нашем случае — ХарактеристикиНоменклатуры) и откроем его палитру свойств.
  3. Найдем свойство «Владельцы».
  4. Установим флаг контроля для этого свойства (перенесем его в расширение) и укажем в списке владельцев заимствованные ранее справочники (Номенклатура и ВидыНоменклатуры).

После выполнения этих действий платформа сопоставит связи между объектами внутри расширения, и реквизит Владелец сразу же станет доступен в Конструкторе запросов.

Как сделать доступными реквизиты Родитель и ЭтоГруппа

Аналогичная проблема часто возникает при попытке определить иерархическую структуру справочника. Если вам требуется обратиться к родителю элемента или проверить, является ли элемент группой, выполним следующие шаги:

  1. Откроем свойства заимствованного справочника в расширении.
  2. Найдем свойство «Иерархический».
  3. Поставим напротив него флаг контроля (заимствования).

Как только свойство иерархии будет перенесено в расширение, платформа автоматически сгенерирует стандартные реквизиты Родитель и ЭтоГруппа, сделав их доступными для использования в запросах и коде модулей.

Доступ к реквизитам Код и Наименование

Если вам необходимо обратиться к длине кода, изменить уникальность или переопределить длину наименования в расширении, платформа требует контроля соответствующих настроек:

  1. В палитре свойств справочника в расширении находим свойства «Длина кода» и «Длина наименования».
  2. Активируем их заимствование.
  3. Следим за тем, чтобы их значения по умолчанию соответствовали значениям в основной конфигурации, во избежание конфликтов при обновлении информационной базы (за исключением случаев, когда вы намеренно увеличиваете длину наименования в расширении).

Разница в поведении: Конфигуратор против режима «1С:Предприятие»

Проанализируем важный нюанс, который часто путает начинающих разработчиков. Если вы напишете текст запроса вручную в модуле расширения, используя реквизиты вроде Владелец без предварительной настройки свойств, этот код будет работать при запуске программы пользователем. Среда исполнения (рантайм) корректно обработает запрос, так как на уровне СУБД структура таблиц полностью объединена.

Однако отсутствие явного заимствования свойств приводит к следующим проблемам:

Рекомендация: Всегда заимствуйте контролирующие свойства (иерархию, владельцев, длину кодов) в расширение. Это является стандартом качественной разработки (best practice) в среде 1С, гарантирующим стабильность работы вашего программного кода при обновлениях системы.

← На главную