При работе с расширениями конфигурации в платформе «1С:Предприятие 8.3» разработчики часто сталкиваются с неприятной ситуацией: при написании запроса или обращении к свойствам объектов в коде стандартные реквизиты, такие как Владелец, Родитель или ЭтоГруппа, оказываются недоступными. Конструктор запросов выдает ошибку, а автоподстановка кода отказывается показывать эти поля.
В этой статье мы подробно разберем, почему возникает эта проблема, как устроена механика платформы при работе с заимствованными объектами и по шагам настроим свойства объектов в расширении, чтобы сделать любые стандартные реквизиты доступными для разработки.
Когда мы заимствуем объект метаданных (например, справочник) в расширение, платформа переносит туда лишь его базовое описание (своего рода облегченный каркас). Стандартные реквизиты, вопреки своему названию, не существуют в базе данных «сами по себе» в отрыве от структуры объекта. Они генерируются платформой динамически на основе ключевых структурных свойств справочника или документа.
Если в самом расширении эти ключевые свойства не помечены как контролируемые (или заимствованные), конфигуратор в контексте расширения считает, что у объекта нет владельцев, иерархии или кода. В результате среда разработки блокирует обращение к соответствующим полям.
При этом возникает интересная особенность: в режиме «1С:Предприятие» (в рантайме) написанный «вслепую» код может успешно выполняться. Это происходит потому, что при запуске системы конфигурация и расширение полностью объединяются в единую физическую структуру. Тем не менее писать код вслепую — плохая практика, которая приводит к ошибкам проверки применимости расширения и лишает разработчика удобных инструментов отладки.
ВладелецРассмотрим по шагам, как решить проблему на примере справочника ХарактеристикиНоменклатуры, владельцами которого в типовых конфигурациях (например, в «1С:Управление торговлей 11») являются сразу несколько объектов.
Допустим, нам необходимо выполнить следующий запрос внутри расширения:
ВЫБРАТЬ
ХарактеристикиНоменклатуры.Владелец КАК Владелец,
ХарактеристикиНоменклатуры.ДополнительныеРеквизиты.(
Значение КАК Значение,
Свойство.Наименование КАК СвойствоНаименование1
) КАК ДополнительныеРеквизиты
ИЗ
Справочник.ХарактеристикиНоменклатуры КАК ХарактеристикиНоменклатуры
ГДЕ
ХарактеристикиНоменклатуры.Владелец = &Владелец
И ХарактеристикиНоменклатуры.ДополнительныеРеквизиты.Свойство.Наименование = &Наименование
Чтобы поле Владелец стало доступно в Конструкторе запросов и при компиляции кода, выполним следующие действия:
Номенклатура и ВидыНоменклатуры. Важно: если у реквизита составной тип, необходимо заимствовать абсолютно все типы, входящие в этот состав. Если упустить хотя бы один справочник-владелец, поле останется недоступным.ХарактеристикиНоменклатуры) и откроем его палитру свойств.Номенклатура и ВидыНоменклатуры).После выполнения этих действий платформа сопоставит связи между объектами внутри расширения, и реквизит Владелец сразу же станет доступен в Конструкторе запросов.
Родитель и ЭтоГруппаАналогичная проблема часто возникает при попытке определить иерархическую структуру справочника. Если вам требуется обратиться к родителю элемента или проверить, является ли элемент группой, выполним следующие шаги:
Как только свойство иерархии будет перенесено в расширение, платформа автоматически сгенерирует стандартные реквизиты Родитель и ЭтоГруппа, сделав их доступными для использования в запросах и коде модулей.
Код и НаименованиеЕсли вам необходимо обратиться к длине кода, изменить уникальность или переопределить длину наименования в расширении, платформа требует контроля соответствующих настроек:
Проанализируем важный нюанс, который часто путает начинающих разработчиков. Если вы напишете текст запроса вручную в модуле расширения, используя реквизиты вроде Владелец без предварительной настройки свойств, этот код будет работать при запуске программы пользователем. Среда исполнения (рантайм) корректно обработает запрос, так как на уровне СУБД структура таблиц полностью объединена.
Однако отсутствие явного заимствования свойств приводит к следующим проблемам:
Рекомендация: Всегда заимствуйте контролирующие свойства (иерархию, владельцев, длину кодов) в расширение. Это является стандартом качественной разработки (best practice) в среде 1С, гарантирующим стабильность работы вашего программного кода при обновлениях системы.