В процессе администрирования и доработки конфигурации «1С:Бухгалтерия предприятия 3.0» (включая локализацию для Казахстана) часто возникает задача тонкой настройки прав доступа. Типичный сценарий: необходимо создать роль для сотрудника (например, «Торговый представитель»), которому разрешено создавать и редактировать исключительно два документа (например, Счет на оплату и Акт сверки взаиморасчетов), а все остальные объекты системы должны быть доступны только для просмотра.
В этой статье мы подробно разберем, как решить эту задачу с минимальными затратами времени и сил. Мы проанализируем как стандартные бескодовые методы, заложенные в Библиотеку стандартных подсистем (БСП), так и программные способы реализации ограничений через расширения и подписки на события.
---
Прежде чем открывать Конфигуратор и писать код, давайте проанализируем возможности типового функционала. Разработчики БСП уже спроектировали права доступа очень детально. В современных версиях «1С:Бухгалтерии 3.0» практически для каждого значимого документа выделены отдельные точечные роли на чтение и изменение.
Для решения нашей задачи мы можем обойтись без программирования вообще, настроив права прямо в режиме «1С:Предприятие»:
Чтение данных бухгалтерии или базовые роли чтения документов.Добавление и изменение счетов на оплату покупателям (для Счета на оплату).Добавление и изменение актов сверки взаиморасчетов (для Акта сверки).Преимущества: Конфигурация остается полностью типовой. Нет никаких сложностей при последующих обновлениях программы.
---
Если в вашей версии конфигурации отсутствуют столь детальные стандартные роли или вам требуется внедрить кастомную логику интерфейса (например, скрывать определенные кнопки на формах), ни в коем случае не снимайте основную конфигурацию с поддержки. Для этих целей идеально подходят Расширения конфигурации.
Разберем по шагам, как решить задачу через расширение:
ТорговыйПредставитель. Настроим в ней права «Чтение» и «Просмотр» для всех объектов, а права «Интерактивное добавление», «Редактирование» и «Запись» — только для объектов Документ.СчетНаОплатуПокупателю и Документ.АктСверкиВзаиморасчетов.ПриСозданииНаСервере с помощью аннотации &После или &Вместо прямо в расширении.Посмотрим на пример перехвата события в модуле формы документа, который должен быть доступен только для чтения:
&После("ПриСозданииНаСервере")
Процедура Расш_ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// Проверяем, назначена ли пользователю наша роль из расширения
Если РольДоступна("ТорговыйПредставитель") Тогда
// Переводим форму в режим "Только просмотр"
ЭтаФорма.ТолькоПросмотр = Истина;
КонецЕсли;
КонецПроцедуры
---
Среди разработчиков на форумах часто встречается заблуждение, будто при событии ПередЗаписью на уровне подписок нельзя отменить транзакцию записи объекта. Это грубая ошибка!
В подписке на событие ПередЗаписью для документов всегда доступен входящий параметр Отказ. Если установить Отказ = Истина, платформа прервет запись и откатит транзакцию БД. Это самый надежный способ контроля прав, так как он работает на уровне СУБД — даже если пользователь попытается записать документ программно, через обработку или обмен данными.
Вместо того чтобы изменять модули 6–8 документов, мы создадим одну общую подписку на событие для типа ДокументОбъект:
КонтрольЗаписиДокументовТорговогоПредставителя).ДокументОбъект (или перечислим конкретные типы документов, которые хотим заблокировать).ПередЗаписью.Проанализируем пример серверного кода для обработчика этой подписки:
Процедура КонтрольЗаписиДокументовПередЗаписью(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
// Если запись инициирована системными механизмами обмена или загрузки, проверку можно пропустить
Если Источник.ОбменДанными.Загрузка Тогда
Возврат;
КонецЕсли;
// Проверяем наличие роли "ТорговыйПредставитель"
Если РольДоступна("ТорговыйПредставитель") Тогда
// Определяем типы документов, которые разрешено создавать и менять
ТипСчета = Тип("ДокументОбъект.СчетНаОплатуПокупателю");
ТипАкта = Тип("ДокументОбъект.АктСверкиВзаиморасчетов");
ТекущийТипОбъекта = ТипЗнч(Источник);
// Если тип записываемого документа не совпадает с разрешенными
Если ТекущийТипОбъекта <> ТипСчета И ТекущийТипОбъекта <> ТипАкта Тогда
// Если документ новый (создается впервые), или существующий документ пытаются изменить
Отказ = Истина;
// Выводим понятное сообщение пользователю
ОбщегоНазначенияКлиентСервер.СообщитьПользователю(
"У вас нет прав на создание или изменение данного документа! Разрешены только Счета на оплату и Акты сверки."
);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
---
Если вы решили пойти по пути создания новой роли в конфигурации (или внутри расширения), вам обязательно нужно учесть специфику работы Библиотеки стандартных подсистем.
В БСП информация о ролях и объектах кэшируется в служебных регистрах сведений. Если вы просто добавите роль в Конфигураторе, система в режиме «1С:Предприятие» может её «не увидеть». Чтобы обновить справочник Идентификаторы объектов метаданных и реестры прав, необходимо выполнить одну из следующих процедур:
/C ЗапуститьОбновлениеИнформационнойБазы.ОбновлениеВспомогательныхДанных.epf).
Процедура ОбновитьПараметрыБСП() Экспорт
УстановитьПривилегированныйРежим(Истина);
Константы.ПараметрыРаботыПользователей.СоздатьМенеджерЗначения().ОбновитьОбщиеПараметры();
КонецПроцедуры
Частая ошибка начинающих разработчиков — попытка протестировать ограничения, находясь под учетной записью Администратора с включенной ролью Полные права. В БСП заложена архитектурная особенность: при наличии полных прав система игнорирует большинство кастомных ограничений интерфейса, так как администратор по умолчанию имеет неограниченный доступ ко всем метаданным. Для проверки работы созданной роли обязательно создайте отдельного тестового пользователя в справочнике Пользователи и настройте его права без включения роли Полные права.
---
Мы рассмотрели три отличных варианта решения задачи ограничения прав в БП 3.0. Лучшей практикой является использование Способа №1 (типовые профили групп доступа), так как он не требует внесения изменений в код и гарантирует легкое обновление программы. Если же вам требуется жесткий контроль на уровне СУБД или уникальное поведение форм — используйте связку из Расширения конфигурации и Подписки на событие ПередЗаписью.