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

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

В практике сопровождения самописных конфигураций на платформе 1С:Предприятие 8.3 часто возникает задача: перевести информационную базу в режим «только для чтения». Это может потребоваться при переходе на новую систему, аудите или после закрытия отчетного периода, когда редактирование данных должно быть разрешено только администраторам. Рассмотрим, как реализовать этот механизм максимально эффективно, учитывая нюансы управляемых форм и отсутствие БСП (Библиотеки стандартных подсистем).

Метод 1. Использование глобальных подписок на события (Решение автора)

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

Разберем реализацию по шагам:

  1. Создание общего модуля: Создадим модуль (например, ОбщийМодульСервер) с установленными флажками «Сервер» и «Внешнее соединение». В нем мы опишем логику проверки прав.
  2. Создание подписок: Нам необходимо создать три подписки на события для разных типов объектов:
    • ЗапретРедактированияСправочников (Источник: СправочникОбъект, Событие: ПередЗаписью)
    • ЗапретРедактированияДокументов (Источник: ДокументОбъект, Событие: ПередЗаписью)
    • ЗапретРедактированияРегистров (Источник: РегистрСведенийНаборЗаписей, РегистрНакопленияНаборЗаписей, Событие: ПередЗаписью)

Рассмотрим пример кода обработчика, который необходимо разместить в общем модуле:


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

    // Проверяем условие даты (если нужно ограничить запись с определенного момента)
    ДатаЗапрета = '20231231'; // Пример даты
    
    Если Источник.Метаданные().Имя = "Документы" Тогда
        Если Источник.Дата <= ДатаЗапрета Тогда
            Сообщить("Редактирование данных заблокировано администратором!");
            Отказ = Истина;
        КонецЕсли;
    Иначе
        // Для справочников и других объектов блокируем всё
        Сообщить("База работает в режиме только для чтения.");
        Отказ = Истина;
    КонецЕсли;
КонецПроцедуры

Важный нюанс: Не забудьте создать подписку на событие ПередУдалением. Если вы ограничите только запись, пользователи с соответствующими правами все равно смогут физически удалять объекты через Shift+Delete.

Метод 2. Управление доступностью форм (Интерфейсный подход)

Подписки на события эффективно блокируют запись в базу, но с точки зрения пользователя интерфейс остается активным: кнопки «Провести» и «Записать» доступны, поля ввода открыты, а редактирование настроек всех пользователей остается возможным. Чтобы сделать работу комфортнее, проанализируем ситуацию и программно установим свойство формы ТолькоПросмотр.

Для реализации этого подхода выполним следующие действия:

  1. Выясним, какие формы требуют блокировки. В идеале — все формы объектов.
  2. В общем модуле создадим процедуру настройки формы:

Процедура УстановитьРежимПросмотраДляФормы(Форма) Экспорт
    Если НЕ РольДоступна("ПолныеПрава") Тогда
        Форма.ТолькоПросмотр = Истина;
    КонецЕсли;
КонецПроцедуры

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

Метод 3. Механизм RLS (Row Level Security)

Рассмотрим более профессиональный и надежный метод — ограничение прав на уровне записей (RLS). В отличие от подписок, RLS работает на уровне СУБД, что исключает любые обходные пути изменения данных.

Разберем алгоритм настройки:

  1. Создайте новую роль, например, ТолькоПросмотрВсего.
  2. В этой роли для всех объектов (Справочники, Документы, Регистры) установите права на Чтение и Просмотр.
  3. Права на Добавление, Изменение и Удаление оставьте пустыми или пропишите в них условие ГДЕ ЛОЖЬ.

Важно понимать аддитивность ролей: В 1С права суммируются. Если у пользователя есть роль Менеджер (с правом записи) и вы добавите ему роль ТолькоПросмотр, он все равно сможет записывать документы. Чтобы база стала «только для чтения», вам нужно либо изменить существующие роли, либо временно забрать у пользователей все роли, кроме новой ограничивающей роли и роли Пользователь.

Метод 4. Оптимизация через параметры сеанса

Постоянная проверка роли РольДоступна() или запрос к константам в каждой подписке может создавать избыточную нагрузку на сервер. Проанализируем, как ускорить этот процесс.

Рекомендуется создать Параметр сеанса (например, РежимТолькоДляЧтения типа Булево). Значение этого параметра должно вычисляться один раз при запуске системы в Модуле сеанса (процедура УстановкаПараметровСеанса).

Посмотрим на пример кода в модуле сеанса:


Процедура УстановкаПараметровСеанса(ТребуемыеПараметры)
    Если ПараметрыСеанса.РежимТолькоДляЧтения = Неопределено Тогда
        // Проверяем роль или константу
        Если РольДоступна("ПолныеПрава") Тогда
            ПараметрыСеанса.РежимТолькоДляЧтения = Ложь;
        Иначе
            ПараметрыСеанса.РежимТолькоДляЧтения = Истина;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Теперь в ваших подписках на события вместо вызова функций проверки прав достаточно просто обращаться к ПараметрыСеанса.РежимТолькоДляЧтения. Это работает мгновенно, так как значение хранится в памяти сервера для текущего сеанса.

Особенности работы с регистрами

Выясним причину, по которой иногда данные все равно «просачиваются» в базу, несмотря на подписки. Для регистров сведений с режимом записи «Независимый», подписка ПередЗаписью на объект не сработает, если запись идет через МенеджерЗаписи.

Поэтому при настройке подписок для регистров всегда выбирайте в качестве источника РегистрСведенийНаборЗаписей. Это гарантирует, что любое изменение данных (даже одной строки) будет перехвачено системой.

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

← На главную