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