Как в расширении формы вывести владельца элемента и его реквизиты в табличной части

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

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

Анализ проблемы заимствования системных полей

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

Решение 1: Проверка флагов заимствования и свойств реквизита

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

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

Важный момент: Иногда платформа требует перевыбрать связи в расширении, даже если они кажутся правильными. Убедимся, что свойства реквизита в расширении полностью идентичны свойствам в основной конфигурации.

Решение 2: Использование механизма «Путь к данным»

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

Добавим в колонку табличной части новое поле надписи. В свойстве ПутьКДанным этого элемента пропишем цепочку обращения. Например, если в табличной части Запасы есть колонка Серия, то путь будет выглядеть так:

Объект.Запасы.Серия.Владелец.Артикул

Чтобы это работало, должны быть выполнены два условия:

Решение 3: Настройка «Связи параметров выбора»

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

Посмотрим, как настроить эту связь:

  1. Выберем элемент формы (колонку), где выбирается серия.
  2. В палитре свойств найдем пункт Связи параметров выбора.
  3. Установим связь по владельцу, указав в качестве источника поле, содержащее номенклатуру (например, Объект.Запасы.Номенклатура).

Это заставляет платформу пересчитать контекст и зачастую «проявляет» скрытые до этого реквизиты владельца в списке доступных полей выбора.

Решение 4: Программное получение данных (если точка не работает)

В сложных случаях, когда обращение через точку в ПутьКДанным приводит к снижению производительности или платформа блокирует такое обращение, мы можем воспользоваться программным методом. Проанализируем ситуацию: нам нужно заполнить данные владельца при чтении формы или при изменении серии.

Создадим обработчик события ПриИзменении для поля серии в расширении формы. Пример кода может выглядеть следующим образом:


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

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

Особенности работы с составными типами

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

Итоги и рекомендации

Подведем итог нашему исследованию. Для того чтобы успешно «достать» владельца и его реквизиты на форме расширения, следует придерживаться следующего алгоритма:

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

← На главную