Как заблокировать редактирование всех реквизитов документа кроме нескольких выбранных полей в 1С?

Программист 1С v8.3 (Обычные формы) IT и автоматизация бизнеса
← На главную

При настройке прав и интерфейсов пользователей часто возникает задача ограничить изменение данных в документе. Если установить свойство ЭтаФорма.ТолькоПросмотр = Истина, платформа полностью запретит изменение любых данных на форме. Однако нередко требуется заблокировать 60–70 реквизитов, оставив доступными для редактирования лишь два-три конкретных поля (например, комментарий, статус согласования или дату контроля).

Разберем основные подходы к решению этой задачи: от программного обхода элементов интерфейса до визуальной группировки и создания специализированных форм.

Способ 1. Программный обход коллекции элементов формы

Самый прямой путь, когда на форме расположено множество полей, — это перебор коллекции элементов в цикле при открытии формы с отключением их доступности или установкой режима только для чтения, исключая разрешенные реквизиты.

Рассмотрим пример кода для обычных форм (коллекция ЭлементыФормы), где разрешено редактирование только полей НазваниеЗаказа и Дата:


СписокРазрешенных = Новый Соответствие;
СписокРазрешенных.Вставить("НАЗВАНИЕЗАКАЗА", Истина);
СписокРазрешенных.Вставить("ДАТА", Истина);

Для Каждого Элемент Из ЭтаФорма.ЭлементыФормы Цикл
    ИмяЭлемента = ВРег(Элемент.Имя);
    
    // Пропускаем разрешенные реквизиты
    Если СписокРазрешенных[ИмяЭлемента] <> Неопределено Тогда
        Элемент.Доступность = Истина;
    Иначе
        // Отключаем доступность остальных полей
        Элемент.Доступность = Ложь;
    КонецЕсли;
КонецЦикла;

Разберем частую ошибку при написании условий: если используется функция ВРег() для приведения имени элемента к верхнему регистру, строка сравнения также должна быть записана заглавными буквами. Сравнение вида ВРег(Элемент.Имя) = "НазваниеЗаказа" всегда вернет Ложь, так как левая часть приведена к регистру "НАЗВАНИЕЗАКАЗА".

Разница между свойствами «Доступность» и «ТолькоПросмотр»

При управлении элементами интерфейса важно учитывать различие между двумя свойствами:

  1. Доступность = Ложь: элемент становится серым и блеклым, пользователь не может выделить текст, скопировать данные в буфер обмена или перейти в поле с помощью клавиши Tab.
  2. ТолькоПросмотр = Истина: поле сохраняет стандартную контрастность, текст легко читается и доступен для выделения и копирования, но редактирование данных заблокировано.

Если требуется оставить возможность копирования информации, предпочтительнее программно устанавливать свойство ТолькоПросмотр = Истина у конкретных элементов формы (полей ввода, таблиц).

Способ 2. Группировка элементов на этапе разработки

Чтобы избежать обхода коллекций в цикле, можно оптимизировать структуру формы в конфигураторе:

  1. Создаем общую группу элементов (или страницу), в которую помещаем все блокируемые поля документа.
  2. Реквизиты, которые должны оставаться доступными для пользователя, выносим за пределы этой группы (например, в отдельную верхнюю или нижнюю панель).
  3. В коде формы блокируем группу одной командой:

Элементы.ГруппаОсновныхРеквизитов.ТолькоПросмотр = Истина;

При отключении доступности или включении режима просмотра для группы свойство автоматически унаследуют все дочерние элементы управления, расположенные внутри нее.

Важное предостережение: если разрешенный элемент находится внутри родительской группы, у которой установлено Доступность = Ложь, он останется недоступным, даже если явно присвоить ему Элемент.Доступность = Истина.

Способ 3. Вынесение редактируемых данных в отдельную форму

Если документ содержит большое количество реквизитов и сложную логику проведения, открытие основной формы с точечным разрешением полей может привести к случайному перепроведению документа и созданию избыточной нагрузки на базу данных.

В таких случаях эффективнее создать небольшую вспомогательную обработку или отдельную форму:

  1. На отдельной форме размещаются только те 3 реквизита, которые разрешено менять пользователю.
  2. По кнопке сохранения выполняется программная запись документа без полного перепроведения или с изменением только требуемых реквизитов на сервере.

Способ 4. Хранение настроек доступности в макете или регистре сведений

Если требования к списку разрешенных полей часто меняются или зависят от роли пользователя, жестко прописывать имена реквизитов в коде не рекомендуется. Проанализируем более гибкие варианты:

  1. Макет настроек: в объект внедряется макет типа ТабличныйДокумент со списком имен реквизитов и флагами доступности. При открытии код считывает макет и настраивает видимость. Это позволяет корректировать логику без изменения программного кода.
  2. Регистр сведений: создается регистр, хранящий соответствия вида ТипДокумента - ИмяРеквизита - РольПользователя - Разрешено. При открытии документа форма обращается к регистру и динамически применяет ограничения.
← На главную