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