Сокращение числа процедур в модуле формы

Платформа: 1С: Предприятие 8
Дата: 
06/11/2010

Если ваша обработка работает с файлами, то наверняка в ее форме есть поле ввода, связанное с реквизитом обработки или реквизитом формы, в котором хранится путь к выбранному файлу/папке, и наверняка там есть кнопка выбора, связанная с процедурой в модуле формы, вызывающей диалог выбора файла.
Получается, что количество процедур в модуле формы = количеству полей ввода.
И если все параметры диалога одинаковы, то эти процедуры различаются буквально в полстрочки!

Процедура ПолеВвода1НачалоВыбора (Элемент, СтандартнаяОбработка)
ВыборПапки = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.ВыборКаталога);
Если ВыборПапки.Выбрать() Тогда
Реквизит1 = ВыборПапки.Каталог;
КонецЕсли;
КонецПроцедуры

Процедура ПолеВвода2НачалоВыбора (Элемент, СтандартнаяОбработка)
ВыборПапки = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.ВыборКаталога);
Если ВыборПапки.Выбрать() Тогда
Реквизит2 = ВыборПапки.Каталог;
КонецЕсли;
КонецПроцедуры

Процедура ПолеВводаNНачалоВыбора (Элемент, СтандартнаяОбработка)
ВыборПапки = Новый ДиалогВыбораФайла (РежимДиалогаВыбораФайла.ВыборКаталога);
Если ВыборПапки.Выбрать() Тогда
РеквизитN = ВыборПапки.Каталог;
КонецЕсли;
КонецПроцедуры

И, казалось бы, нельзя никак эти процедуры унифицировать, ведь реквизит каждый раз нужен разный и никак не понять, какой нужен в данном случае. Но на самом деле имя реквизита уже заложено в одном из аргументов этих функций. Если точнее, то вот здесь: Элемент.Данные.
Но код

Элемент.Данные = ВыборПапки.Каталог;

выдаст ошибку и правильно сделает. Надо присваивать значение не свойству элемента формы, а реквизиту, считанному из него. Таким образом, если мы захотим создать универсальную процедуру выбора, нам нужно будет внутри неё каждый раз формировать её код заново, основываясь на значении аргумента Элемент.Данные, а затем исполнять его. И 1С позволяет это сделать!

Процедура ВыборПапки(Элемент, СтандартнаяОбработка)
ВыборПапки = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
Если ВыборПапки.Выбрать() Тогда
Выполнить(Элемент.Данные + "= ВыборПапки.Каталог;");
КонецЕсли;
КонецПроцедуры

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