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