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