Как ограничить права пользователей на создание РКО только с одной хозяйственной операцией в 1С:Управление торговлей?

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

При организации работы кассиров и операторов в конфигурации 1С:Управление торговлей 11 часто возникает задача ограничить создание кассовых документов. Типичный сценарий: пользователю необходимо разрешить оформление документа Расходный кассовый ордер (РКО) исключительно с одной хозяйственной операцией (например, Сдача в банк), полностью запретив создание и проведение документов с другими операциями (оплата поставщику, выдача подотчетнику, сдача в другую кассу и т.д.).

Разберем основные варианты решения этой задачи: от штатной настройки ограничений на уровне записей (RLS) до использования расширений конфигурации и пользовательских настроек интерфейса.

Вариант 1. Штатная настройка через профили групп доступа и RLS

В типовых конфигурациях на базе БСП (Библиотеки Стандартных Подсистем), включая 1С:Управление торговлей, предусмотрен механизм разграничения прав по видам доступа, в том числе по хозяйственным операциям. Однако при его настройке часто совершают ошибку: создают профиль, в который добавляют все существующие роли конфигурации за исключением роли ПолныеПрава.

Проанализируем, почему такой подход приводит к ошибке: права доступа в платформе 1С работают по принципу логического ИЛИ (аддитивность прав). Если пользователю назначено несколько ролей, дающих право на добавление или изменение документа РасходныйКассовыйОрдер, и хотя бы в одной из них не включен шаблон ограничения RLS по хозяйственным операциям, платформа разрешит создание документа с любой операцией.

Основная роль, отвечающая за работу с кассовыми документами, называется ДобавлениеИзменениеДокументовПоКассе. В ней предопределены шаблоны ограничений на уровне записей.

Посмотрим на типовой шаблон RLS для прав Добавление и Изменение объекта Документ.РасходныйКассовыйОрдер:


#ПоЗначениямРасширенный( "Документ.РасходныйКассовыйОрдер","Добавление","", 
"ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходныйКассовыйОрдер.РасшифровкаПлатежа КАК Т1 ПО Т.Ссылка = Т1.Ссылка", "", 
"Организации","Т.Организация","И", 
"Кассы","Т.Касса","И", 
"ХозяйственныеОперации","Т.ХозяйственнаяОперация", 
"И ВЫБОР КОГДА", 
"Условие","Т.ХозяйственнаяОперация В (Значение(Перечисление.ХозяйственныеОперации.ОплатаПоставщику), Значение(Перечисление.ХозяйственныеОперации.ВозвратОплатыКлиенту))","ТОГДА", 
"ГруппыПартнеров","Т1.Партнер", 
"КОГДА Т.ХозяйственнаяОперация = Значение(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствПодотчетнику) ТОГДА", 
"ГруппыФизическихЛиц","Т.ПодотчетноеЛицо", 
"КОГДА Т.ХозяйственнаяОперация = Значение(Перечисление.ХозяйственныеОперации.ВыдачаДенежныхСредствВКассуККМ) ТОГДА", 
"КассыККМ","Т.КассаККМ", 
"ИНАЧЕ ИСТИНА КОНЕЦ", 
"","","", "","","", "","","", "","","", "","","", "","","", "","","", "","","" )

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

  1. Перейдем в раздел НСИ и администрирование → Настройки пользователей и прав → Группы доступа и убедимся, что включена опция Ограничивать доступ на уровне записей.
  2. Создадим новый профиль групп доступа путем копирования типового профиля Кассир (не создавая профиль с нуля и не включая лишние роли).
  3. На вкладке Ограничения доступа для вида доступа Хозяйственные операции установим значение Все запрещены, исключения назначаются в группах доступа.
  4. Создадим новую Группу доступа с данным профилем, выберем нужного пользователя и в табличной части разрешенных значений укажем только одну операцию: Сдача в банк.
  5. Проверим, чтобы пользователю не были назначены другие группы доступа, содержащие полные или расширенные финансовые роли.

Важная особенность RLS: механизм RLS проверяет права в момент записи или проведения объекта в базу данных, но не скрывает запрещенные элементы из выпадающего списка выбора реквизита ХозяйственнаяОперация на форме документа. Если пользователь выберет запрещенную операцию и попытается записать документ, платформа выдаст системную ошибку нарушения прав доступа.

Вариант 2. Программное ограничение через расширение конфигурации

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

Рассмотрим реализацию двух механизмов в расширении:

  1. Ограничение списка выбора на форме: в расширении заимствуем форму документа ФормаДокумента и перехватываем процедуру ПриСозданииНаСервере или ПослеСозданияНаСервере.
  2. Контроль при записи: создаем подписку на событие ПередЗаписью для объекта ДокументОбъект.РасходныйКассовыйОрдер.

Посмотрим на пример кода модуля формы в расширении для фильтрации списка выбора:


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

Для гарантированной защиты на уровне базы данных добавим обработчик события перед записью:


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

Вариант 3. Настройка видимости элементов интерфейса через пользовательские настройки

Для простых ситуаций, когда пользователи не обладают навыками изменения формы, можно скорректировать доступные команды интерфейса штатными средствами без программирования:

  1. Откроем форму журнала кассовых документов или форму создания РКО.
  2. Через меню Еще → Изменить форму отключим видимость команд и реквизитов, позволяющих выбирать произвольные операции.
  3. Для массового применения настроек перейдем в раздел НСИ и администрирование → Настройки пользователей и прав → Персональные настройки пользователей → Копирование настроек и перенесем скорректированную форму целевым пользователям.

Выясним итог: для надежного разграничения прав рекомендуется использовать настройку профилей групп доступа на базе профиля «Кассир» или расширение конфигурации с контролем события ПередЗаписью и программным заполнением списка выбора.

← На главную