В процессе разработки на платформе 1С:Предприятие часто возникает задача динамического управления доступностью элементов формы. Например, нам нужно запретить редактирование цены, если текущая строка содержит услугу, но разрешить, если это товар. Давайте разберем, как грамотно реализовать этот функционал, минимизируя использование «костылей» и обеспечивая стабильную работу интерфейса.
На сегодняшний день Условное оформление является наиболее декларативным и производительным способом управления интерфейсом. Платформа берет на себя всю нагрузку по отрисовке, что предотвращает ошибки, связанные с зацикливанием кода или неверным расчетом состояний при навигации.
Для реализации этого подхода рекомендуем выполнить следующие шаги:
ЦенаЗаблокирована типа Булево).ПриИзменении реквизитов (например, при выборе номенклатуры) рассчитывайте значение этого поля программно.ЦенаЗаблокирована равно Истина.Цена.ТолькоПросмотр в значение Истина.Этот метод считается идеологически правильным, так как он не требует частого обращения к серверу при навигации по строкам и обеспечивает наилучшую производительность формы.
Если специфика задачи не позволяет использовать Условное оформление, разработчики часто прибегают к программному управлению через события формы. Рассмотрим, как это можно реализовать через обработчик ПриАктивизацииСтроки или ПриНачалеРедактирования.
Важно помнить, что если вы управляете свойством Элементы.ИмяКолонки.Доступность, вы блокируете весь столбец целиком. Чтобы управлять конкретной ячейкой, следует обращаться к текущим данным строки:
&НаКлиенте
Процедура ТоварыПриАктивизацииСтроки(Элемент)
ТекДанные = Элементы.Товары.ТекущиеДанные;
Если ТекДанные <> Неопределено Тогда
// Управляем доступностью конкретной ячейки через свойство ТолькоПросмотр
Элементы.ТоварыЦена.ТолькоПросмотр = (ТекДанные.ВидНоменклатуры = ПредопределенноеЗначение("Перечисление.ВидыНоменклатуры.Услуга"));
КонецЕсли;
КонецПроцедуры
При использовании программного подхода обратите внимание на следующие важные аспекты:
ПриАктивизацииСтроки может вызываться многократно при изменении свойств формы. Всегда проверяйте необходимость установки значения, чтобы избежать бесконечных циклов.&НаСервереБезКонтекста.Выбор:
&НаКлиенте
Процедура ТоварыВыбор(Элемент, ВыбраннаяСтрока, Колонка, СтандартнаяОбработка)
Если Колонка.Имя = "Цена" И УсловиеЗапретаРедактирования Тогда
СтандартнаяОбработка = Ложь;
КонецЕсли;
КонецПроцедуры
Проанализируем предложенные решения, чтобы выбрать оптимальное для вашей задачи:
1. Условное оформление:
2. Программное управление в событиях:
Общий вывод: Для большинства типовых задач по ограничению доступа к ячейкам в Управляемых формах Условное оформление является стандартом индустрии. Если вы столкнулись с «торможением» формы, проверьте, не перегружена ли она слишком большим количеством правил условного оформления или тяжелыми вычислениями внутри них. В остальном — стремитесь к простоте кода и избегайте необоснованных обращений к серверу из клиентских событий формы.
Надеемся, что это руководство поможет вам реализовать задачу максимально эффективно и надежно!