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