При работе с расширениями в 1С:Предприятие 8.3 программисты часто сталкиваются с ситуацией, когда при заимствовании формы или объекта метаданных некоторые стандартные реквизиты, такие как Владелец, ведут себя непредсказуемо. Они могут не отображаться в списке доступных полей или не подтягивать связанные данные, такие как Артикул или Код владельца. Разберем подробно, как решить эту задачу, опираясь на опыт разработчиков и внутренние механизмы платформы.
Когда мы заимствуем форму, на которой расположена табличная часть с элементами подчиненного справочника (например, справочник СерииНоменклатуры, подчиненный справочнику Номенклатура), платформа должна автоматически предоставлять доступ к полю Владелец. Однако в расширениях связь между объектами может «разрываться», если не соблюдены определенные условия заимствования метаданных. Проанализируем основные причины, по которым реквизиты владельца могут отсутствовать в дереве доступных полей формы расширения.
Первым делом рассмотрим визуальный редактор формы в расширении. Часто проблема кроется в том, что реквизиты заимствованы не полностью. Выполним следующие шаги:
Серия).Владелец отсутствует, значит, оно не проброшено из основной конфигурации корректно.Владелец стояла галочка, подтверждающая его заимствование.Важный момент: Иногда платформа требует перевыбрать связи в расширении, даже если они кажутся правильными. Убедимся, что свойства реквизита в расширении полностью идентичны свойствам в основной конфигурации.
Если нам нужно не просто видеть владельца, но и вывести его специфический реквизит (например, Артикул номенклатуры), мы можем использовать возможности платформы по обращению через точку непосредственно в интерфейсе. Рассмотрим, как это сделать без написания программного кода:
Добавим в колонку табличной части новое поле надписи. В свойстве ПутьКДанным этого элемента пропишем цепочку обращения. Например, если в табличной части Запасы есть колонка Серия, то путь будет выглядеть так:
Объект.Запасы.Серия.Владелец.Артикул
Чтобы это работало, должны быть выполнены два условия:
Номенклатура) должен быть заимствован в расширение.Артикул справочника Номенклатура также должен быть добавлен в расширение.Как показывает практика, часто реквизит Владелец начинает корректно отображаться и заполняться только после того, как в расширении будут явно указаны Связи параметров выбора. Выясним причину этого поведения: платформа в контексте расширения может терять автоматическую связь по владельцу, если она не задана жестко в свойствах элемента формы.
Посмотрим, как настроить эту связь:
Связи параметров выбора.Объект.Запасы.Номенклатура).Это заставляет платформу пересчитать контекст и зачастую «проявляет» скрытые до этого реквизиты владельца в списке доступных полей выбора.
В сложных случаях, когда обращение через точку в ПутьКДанным приводит к снижению производительности или платформа блокирует такое обращение, мы можем воспользоваться программным методом. Проанализируем ситуацию: нам нужно заполнить данные владельца при чтении формы или при изменении серии.
Создадим обработчик события ПриИзменении для поля серии в расширении формы. Пример кода может выглядеть следующим образом:
&НаКлиенте
Процедура Расш1_СерияПриИзменении(Элемент)
ТекущиеДанные = Элементы.Запасы.ТекущиеДанные;
Если ТекущиеДанные <> Неопределено Тогда
// Получаем владельца и его артикул через серверный вызов или кэшированную функцию
ИнфоОВладельце = ПолучитьДанныеВладельца(ТекущиеДанные.Серия);
ТекущиеДанные.АртикулВладельца = ИнфоОВладельце.Артикул;
КонецЕсли;
КонецПроцедуры
Для реализации этого метода нам может потребоваться добавить реквизит в колонку формы (но не в саму таблицу базы данных, чтобы избежать ошибок реструктуризации). В расширениях часто возникает ошибка «Использование метаданных, влияющих на структуры данных, недопустимо». Это происходит, если вы пытаетесь добавить новый реквизит в существующую таблицу документа. Чтобы обойти это ограничение, добавляйте реквизиты в саму форму (как элементы оформления) или в реквизиты формы (в список колонок на уровне интерфейса), не меняя структуру данных объекта Документ.
Разберем еще один нюанс. Если у справочника Серии владелец имеет составной тип (например, это может быть и Номенклатура, и Партия), то в расширении необходимо заимствовать все типы, входящие в этот составной тип. Если вы заимствуете только Номенклатуру, платформа может ограничить доступ к свойствам поля Владелец, так как для нее тип поля остается не полностью определенным в контексте расширения.
Подведем итог нашему исследованию. Для того чтобы успешно «достать» владельца и его реквизиты на форме расширения, следует придерживаться следующего алгоритма:
Владелец в дереве объектов.Связи параметров выбора для явного указания контекста владельца.Следуя этим правилам, вы сможете гибко настраивать интерфейс заимствованных форм, предоставляя пользователям всю необходимую информацию о владельцах элементов без нарушения целостности основной конфигурации.