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