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