Как настроить роль с доступом только к двум документам в 1С:Бухгалтерия 3.0?

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

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

В этой статье мы подробно разберем, как решить эту задачу с минимальными затратами времени и сил. Мы проанализируем как стандартные бескодовые методы, заложенные в Библиотеку стандартных подсистем (БСП), так и программные способы реализации ограничений через расширения и подписки на события.

---

Способ №1. Типовой бескодовый метод (через профили групп доступа БСП)

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

Для решения нашей задачи мы можем обойтись без программирования вообще, настроив права прямо в режиме «1С:Предприятие»:

  1. Перейдем в раздел Администрирование — Настройки пользователей и прав — Профили групп доступа.
  2. Создадим новый профиль и назовем его, например, «Торговый представитель (ограниченный)».
  3. В списке разрешенных ролей (раздел «Разрешенные действия (роли)») найдем и отметим галочками общие роли на чтение данных системы. Обычно это роли вида Чтение данных бухгалтерии или базовые роли чтения документов.
  4. Найдем конкретные точечные роли для наших двух документов и добавим их в профиль:
    • Добавление и изменение счетов на оплату покупателям (для Счета на оплату).
    • Добавление и изменение актов сверки взаиморасчетов (для Акта сверки).
  5. Сохраним созданный профиль и назначим его нужному пользователю через справочник Группы доступа или карточку пользователя.

Преимущества: Конфигурация остается полностью типовой. Нет никаких сложностей при последующих обновлениях программы.

---

Способ №2. Использование расширений конфигурации

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

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

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

Посмотрим на пример перехвата события в модуле формы документа, который должен быть доступен только для чтения:


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

---

Способ №3. Реализация через единую подписку на событие «ПередЗаписью»

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

В подписке на событие ПередЗаписью для документов всегда доступен входящий параметр Отказ. Если установить Отказ = Истина, платформа прервет запись и откатит транзакцию БД. Это самый надежный способ контроля прав, так как он работает на уровне СУБД — даже если пользователь попытается записать документ программно, через обработку или обмен данными.

Вместо того чтобы изменять модули 6–8 документов, мы создадим одну общую подписку на событие для типа ДокументОбъект:

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

Проанализируем пример серверного кода для обработчика этой подписки:


Процедура КонтрольЗаписиДокументовПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

    // Если запись инициирована системными механизмами обмена или загрузки, проверку можно пропустить
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

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

КонецПроцедуры

---

Важные нюансы работы с новыми ролями в БСП

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

Регистрация метаданных в БСП

В БСП информация о ролях и объектах кэшируется в служебных регистрах сведений. Если вы просто добавите роль в Конфигураторе, система в режиме «1С:Предприятие» может её «не увидеть». Чтобы обновить справочник Идентификаторы объектов метаданных и реестры прав, необходимо выполнить одну из следующих процедур:


Процедура ОбновитьПараметрыБСП() Экспорт
    УстановитьПривилегированныйРежим(Истина);
    Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();
КонецПроцедуры

Особенности тестирования под Полными правами

Частая ошибка начинающих разработчиков — попытка протестировать ограничения, находясь под учетной записью Администратора с включенной ролью Полные права. В БСП заложена архитектурная особенность: при наличии полных прав система игнорирует большинство кастомных ограничений интерфейса, так как администратор по умолчанию имеет неограниченный доступ ко всем метаданным. Для проверки работы созданной роли обязательно создайте отдельного тестового пользователя в справочнике Пользователи и настройте его права без включения роли Полные права.

---

Резюме

Мы рассмотрели три отличных варианта решения задачи ограничения прав в БП 3.0. Лучшей практикой является использование Способа №1 (типовые профили групп доступа), так как он не требует внесения изменений в код и гарантирует легкое обновление программы. Если же вам требуется жесткий контроль на уровне СУБД или уникальное поведение форм — используйте связку из Расширения конфигурации и Подписки на событие ПередЗаписью.

← На главную