Для обновления свойств всех элементов формы в зависимости от ее реквизитов я в большинстве случаев создаю одну главную процедуру и вызываю ее при любом изменении влияющих реквизитов формы.
В случае управляемой формы такая процедура должна быть доступна и на клиенте и на сервере и не должна делать серверных вызовов. К сожалению в модуле управляемой формы недоступна директива компиляции &НаКлиентеНаСервере, а вместо нее есть &НаКлиентеНаСервереБезКонтекста. Поэтому у этой процедуры я всегда делаю параметр ЭтаФорма и передаю в него саму форму. Таким образом в теле процедуры контекст формы будет доступен через этот параметр.
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) НастроитьЭлементыФормы(ЭтаФорма); КонецПроцедуры &НаКлиенте Процедура Реквизит2ПриИзменении(Элемент) НастроитьЭлементыФормы(ЭтаФорма); КонецПроцедуры &НаКлиентеНаСервереБезКонтекста Процедура НастроитьЭлементыФормы(ЭтаФорма) Элементы = ЭтаФорма.Элементы; Элементы.Реквизит1.Видимость = ЭтаФорма.Реквизит2; КонецПроцедуры
Однако контекстная подсказка конфигуратора не будет понимать, что в параметре ЭтаФорма находится контекстная форма. Чтобы заставить ее думать, что там находится контекстная форма, можно применить следующую комбинацию инструкций препроцессора и директив компиляции
#Если Сервер И Не Сервер Тогда &НаСервере #Иначе &НаКлиентеНаСервереБезКонтекста #КонецЕсли
Правда в EDT парсер модуля ломается на такой легальной конструкции и исправлять эту ошибку не собираются.
В итоге модуль будет выглядеть так
&НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) НастроитьЭлементыФормы(ЭтаФорма); КонецПроцедуры &НаКлиенте Процедура Реквизит2ПриИзменении(Элемент) НастроитьЭлементыФормы(ЭтаФорма); КонецПроцедуры // Реальная директива здесь - &НаКлиентеНаСервереБезКонтекста, остальные директивы нужны для контекстной подсказки по параметру ЭтаФорма #Если Сервер И Не Сервер Тогда &НаСервере #Иначе &НаКлиентеНаСервереБезКонтекста #КонецЕсли Процедура НастроитьЭлементыФормы(ЭтаФорма) Элементы = ЭтаФорма.Элементы; Элементы.Реквизит1.Видимость = ЭтаФорма.Реквизит2; КонецПроцедуры