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