Как в управляемой форме 1С вывести данные из реквизитов связанного объекта в табличную часть без программирования?

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

При разработке интерфейсов на управляемых формах часто возникает задача: в табличной части документа (например, Товары) при выборе некоторого объекта (например, Партия) нужно сразу увидеть информацию, которая хранится внутри этого объекта (например, Контрагент или Склад этой партии). Многие разработчики по привычке начинают писать программный код в обработчике ПриИзменении, но платформа 1С предоставляет мощный механизм, позволяющий сделать это визуальными средствами. Разберем подробно, как это работает, и какие есть нюансы.

Постановка задачи и анализ ситуации

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

Важно понимать различие между реквизитом объекта и реквизитом формы. Если Поставщик — это просто реквизит формы, то он не сохраняется в базе данных. Как только пользователь закроет форму, значение исчезнет. Если мы хотим видеть его снова при открытии, нам придется либо считывать его программно, либо использовать «магию» пути к данным.

Решение №1: Использование свойства «ПутьКДанным» (через точку)

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

Рассмотрим по шагам, как это настроить:

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

Почему это удобно? Платформа берет на себя всю работу по получению данных. Когда в строке выбрана Партия, система автоматически обращается к этому объекту в базе данных, извлекает реквизит Контрагент и отображает его в колонке. Если вы измените партию, значение контрагента обновится мгновенно без единой строчки кода.

Нюансы работы с составными типами данных

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

Проанализируем, как ведет себя система в этом случае:

Решение №2: Связи параметров выбора

Иногда под «связью реквизитов» понимают не просто отображение, а ограничение списка выбора. Если нам нужно, чтобы при выборе партии в списке отображались только те документы, которые относятся к уже выбранному в форме поставщику, мы используем механизм «Связи параметров выбора».

Разберем, как это настроить в палитре свойств:

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

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

Когда все же необходимо программное решение?

Несмотря на мощь визуальных настроек, рассмотрим ситуации, когда без кода не обойтись:

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

В таких случаях мы используем событие ПриИзменении на клиенте и серверный вызов для получения данных:


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

&НаСервереБезКонтекста
Функция ПолучитьКонтрагентаИзПартии(СсылкаНаПартию)
    // Простая проверка типа и получение данных
    Возврат ОбщегоНазначения.ЗначениеРеквизитаОбъекта(СсылкаНаПартию, "Контрагент");
КонецФункции

Подведем итоги

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

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

← На главную