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