Как реализовать режим «Только просмотр» для документов в 1С:ERP?

Программист 1С v8.3 (Управляемые формы) 1С:ERP Управление предприятием Управленческий учет
← На главную

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

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

Метод 1. Программная доработка через механизм дат запрета изменения

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

Суть метода заключается в использовании типового механизма проверки даты запрета изменения. В 1С:ERP при открытии формы документа и при его записи вызывается функция ИзменениеЗапрещено общего модуля ДатыЗапретаИзмененияСлужебный. Мы можем программно вмешаться в эту проверку.

Рассмотрим шаги по реализации:

  1. Создадим в конфигурации (или через расширение) новую роль ИТ_ТолькоПросмотрДокументов.
  2. В расширении для общего модуля ДатыЗапретаИзмененияСлужебный перехватим функцию ИзменениеЗапрещено, используя аннотацию &ИзменениеИКонтроль.
  3. Добавим проверку наличия этой роли у текущего пользователя.

Пример кода для реализации в расширении:


&ИзменениеИКонтроль("ИзменениеЗапрещено")
Функция ИТ_ИзменениеЗапрещено(Данные, ИдентификаторДанных, ОписаниеОшибки, УзелПроверкиЗапретаЗагрузки)
    УстановитьПривилегированныйРежим(Истина);
    ЗапретНайден = Ложь;

    // Вставка: если у пользователя есть наша спец. роль, сразу возвращаем запрет
    Если РольДоступна("ИТ_ТолькоПросмотрДокументов") Тогда
        ЗапретНайден = Истина;
        Возврат ЗапретНайден;
    КонецЕсли;

    // Далее идет типовой код проверки дат запрета...
    ДействующиеДаты = ДействующиеДатыЗапрета;
    // ...
    Возврат ЗапретНайден;
КонецФункции

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

Метод 2. Использование индивидуальных дат запрета изменения (Штатный способ)

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

Разберем по шагам, как это настроить:

  1. Перейдем в раздел НСИ и администрирование — Настройка пользователей и прав — Даты запрета изменения.
  2. Установим флаг «Даты запрета изменения».
  3. В ссылке «Настроить» выберем режим «По пользователям».
  4. Добавим нужного сотрудника в список.
  5. В колонке «Дата запрета» установим значение далеко в будущем, например, 31.12.3999.

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

Метод 3. Проблема использования профиля «Аудитор»

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

Если ваша цель — ограничить менеджера так, чтобы он видел только свои документы (согласно настройкам RLS), но не мог их править, то Аудитор вам не поможет. Он «раскроет» перед пользователем всю коммерческую информацию организации. Поэтому использование комбинации Основной профиль (с ограничениями RLS) + Индивидуальная дата запрета является более гибким и безопасным подходом.

Метод 4. Ограничение прав на уровне RLS (Row-Level Security)

Для более продвинутых сценариев, когда нужно запретить редактирование только определенных видов объектов, можно использовать механизм RLS. Проанализируем, как это работает на уровне СУБД.

В шаблонах ограничений прав доступа для роли можно прописать условие на право Изменение. Если у пользователя есть роль-маркер «Только просмотр», то условие для изменения объекта всегда будет возвращать Ложь. Это самый «железобетонный» метод, так как он работает на уровне запросов к базе данных и блокирует запись даже через внешние обработки, которые могут обходить проверки в экранных формах.

Важные нюансы и рекомендации

При реализации режима «Только просмотр» важно учитывать следующие моменты:

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

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

← На главную