Как установить режим «Только просмотр» для группы справочника в 1С

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

В процессе разработки на платформе 1С:Предприятие часто возникает задача разграничения прав или логики работы с иерархическими данными. Одной из типовых задач является запрет редактирования групп справочника при сохранении возможности редактирования самих элементов. Простого запрета на запись в модуле объекта бывает недостаточно, так как пользователь все равно может вносить изменения в поля формы, которые не сохранятся, что вызывает путаницу. Рассмотрим подробно, как реализовать полноценную блокировку интерфейса для групп.

Решение 1. Использование программных событий формы

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

Разберем пример кода, который необходимо разместить в модуле формы группы (или в форме элемента, если она универсальная):


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
    
    // Проверяем, что это не новый объект и это действительно группа
    Если Не Объект.Ссылка.Пустая() И Объект.ЭтоГруппа Тогда
        ЭтаФорма.ТолькоПросмотр = Истина;
    КонецЕсли;
    
КонецПроцедуры

Почему мы используем Объект.Ссылка.Пустая()? Это позволяет оставить возможность создания новых групп, если это требуется по условиям задачи, но запретить редактирование уже существующих. Если же нужно запретить даже создание, это условие можно убрать. Установка свойства ТолькоПросмотр для всей формы автоматически блокирует все поля ввода и скрывает стандартные кнопки «Записать и закрыть» и «Записать».

Решение 2. Перехват формы в модуле менеджера

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

Перейдем в модуль менеджера справочника и проанализируем следующий код:


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

Этот метод хорош тем, что он централизован. Вам не нужно заходить в каждую форму справочника — достаточно прописать логику в одном месте. Платформа 1С при открытии формы проверит эти параметры и сама установит режим ТолькоПросмотр.

Решение 3. Настройка ограничений на уровне записей (RLS)

Рассмотрим более жесткий и архитектурно правильный подход для многопользовательских систем — использование RLS (Record Level Security). Если запрет редактирования групп должен действовать для определенных ролей пользователей независимо от того, какую форму или обработку они используют, лучше настроить права в Конфигураторе.

Выясним алгоритм настройки:

  1. Создайте или выберите нужную роль в конфигурации.
  2. Найдите ваш справочник в списке объектов роли.
  3. Для права «Изменение» установите ограничение доступа.
  4. В тексте условия пропишите: ГДЕ ЭтоГруппа = ЛОЖЬ.

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

Решение 4. Использование механизмов БСП

В современных конфигурациях (например, УТ 11, ERP 2, БП 3.0), построенных на базе Библиотеки стандартных подсистем (БСП), существует штатный механизм блокировки реквизитов. Рассмотрим, как это работает. Проанализируем ситуацию: нам нужно заблокировать не всю форму, а только данные самого объекта, сохранив работоспособность кнопок печати или других сервисных функций.

Для этого в модуле формы в событии ПриЧтенииНаСервере или ПриСозданииНаСервере можно вызвать метод общего модуля БСП:


// Пример для конфигураций с БСП
ОбщегоНазначенияКлиентСервер.УстановитьСвойствоЭлементовФормы(Элементы, "ТолькоПросмотр", Истина, "ГруппаШапка, ГруппаРеквизиты");

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

Решение 5. Расширения конфигурации

Если вы работаете с типовой конфигурацией и не хотите снимать её с поддержки, все вышеперечисленные программные методы (особенно ОбработкаПолученияФормы) рекомендуется выносить в Расширение. Посмотрим, как это реализовать:

  1. Создайте новое расширение.
  2. Добавьте в него нужный справочник.
  3. В модуле менеджера справочника в расширении создайте обработчик события &Вместо("ОбработкаПолученияФормы") или используйте &После.

Это позволит сохранить чистоту основной конфигурации и легко обновлять систему в будущем.

Важные рекомендации и итоги

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

Помните: визуальная блокировка в форме не защищает данные от изменения через внешние обработки, загрузки из Excel или через COM-соединение. Для стопроцентной гарантии неизменности групп всегда дублируйте проверку в модуле объекта:


Процедура ПередЗаписью(Отказ)
    
    Если ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;
    
    Если ЭтоГруппа И Не ЭтоНовый() Тогда
        // Выводим сообщение пользователю
        ТекстСообщения = "Редактирование групп этого справочника запрещено администратором.";
        ОбщегоНазначенияКлиентСервер.СообщитьПользователю(ТекстСообщения, , , , Отказ);
    КонецЕсли;
    
КонецПроцедуры

Используя сочетание визуальной блокировки (для удобства пользователя) и проверки в модуле объекта (для безопасности данных), вы создадите надежное и понятное решение в среде 1С.

← На главную