Но есть случаи, когда системный механизм связывания элементов управления с данными формы задействовать невозможно. Эти случаи делятся на две категории:
- Данные являются частью объекта или должны быть жестко синхронизированы с объектом.
- Редактируются логически связанные с главным объектом данные.
Например, у элемента справочника "Номенклатура" есть реквизит "Картинка" типа ХранилищеЗначения, в котором хранится фотография товара. Для отображения фотографии товара в форме нужно передать данные из реквизита объекта в элемент управления. Так как элемент управления "Картинка" не поддерживает связь с данными, то передачу данных нужно осуществлять программно. Кроме написания самого кода, пересылающего данные из реквизита в элемент управления, требуется определить все случаи, когда нужно это делать. Считывание и пересылку картинки в элемент управления достаточно делать при присваивании нового значения реквизиту формы, который содержит редактируемый объект, и при перечитывании редактируемого объекта. Если редактируемый объект является основным реквизитом формы, то для отслеживания этих случаев можно воспользоваться событием формы "При изменении данных". В том числе, оно вызывается перед открытием формы, когда ее основному реквизиту назначается редактируемое значение. Поэтому при открытии формы не нужно отдельно передавать данные в элемент управления "Картинка". Данное событие вызывается при любом изменении значения основного реквизита формы. Обработчик этого события может иметь следующий вид:
Процедура ПриИзмененииДанных()
ЭлементыФормы.ПолеКартинки.Картинка = Картинка.Получить();
КонецПроцедуры
Помещение измененной картинки в реквизит справочника можно осуществлять при выборе новой картинки.
Процедура ВыборКартинкиНажатие(Элемент)
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
Диалог.Заголовок = "Выбор картинки";
Диалог.ПредварительныйПросмотр = Истина;
Диалог.ПроверятьСуществованиеФайла = Истина;
Диалог.Фильтр = "Формат BMP(*.bmp)|*.bmp|Все файлы(*.*)|*.*";
Если Диалог.Выбрать() Тогда
ЭлементыФормы.ПолеКартинки.Картинка = Новый Картинка(Диалог.ПолноеИмяФайла);
Картинка = Новый ХранилищеЗначения(ЭлементыФормы.ПолеКартинки.Картинка);
КонецЕсли;
КонецПроцедуры
Во вторую категорию входят случаи, когда нужно в форме объекта редактировать логически связанные с ним данные. Примером может служить редактирование списка подчиненного справочника или регистра сведений в форме главного объекта. Например, справочник валют связан с курсом валют, хранящимся в регистре сведений. В форме элемента справочника валют для редактирования курсов размещается табличное поле, связанное со списком регистра сведений курсов валют. Для отображения курсов только по текущей валюте у списка нужно установить отбор и синхронизировать его при изменении ссылки валюты. Ссылка может изменяться в следующих случаях: присвоение нового значения реквизиту формы, хранящего значение объекта справочника валюты, и запись нового объекта справочника валюты. При записи нового объекта происходит установка значения его ссылки. Поэтому при записи нового объекта нужно установить новый отбор у связанных с ним списков. Для отслеживания всех этих случаев, нужно установить обработчик изменения данных на ссылку редактируемого объекта.
Сделать это можно в теле модуля формы следующим образом:
ПодключитьОбработчикИзмененияДанных("СправочникОбъект.Ссылка", "ПриИзмененииСсылки", Ложь);
Сам обработчик может иметь следующий вид:
Процедура ПриИзмененииСсылки(Путь)
СписокКурсыВалют.Отбор.Валюта.Установить(Ссылка);
КонецПроцедуры
Это позволит синхронизировать список курсов валюты с редактируемым объектом валюты и отображать в списке данные, соответствующие выбранной валюте.