Как запретить проведение и отмену проведения документов для определенных пользователей в 1С:Управление торговлей 10.3

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

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

Почему стандартные роли не всегда подходят?

Разберем ситуацию: у пользователя уже есть роль, например «Менеджер по продажам», в которой разрешено проведение документа «Реализация товаров и услуг». Если мы создадим новую роль «Запрет проведения» и снимем в ней соответствующие флажки, это не сработает. В системе 1С права работают по принципу аддитивности: если хотя бы в одной из назначенных ролей действие разрешено, пользователь сможет его выполнить.

Удалять право проведения из типовых ролей — трудоемкий процесс, который усложнит обновление программы в будущем. Поэтому мы проанализируем программные способы решения этой задачи.

Способ 1. Использование подписки на событие (рекомендуемый вариант)

Использование подписки на событие — это наиболее «чистый» способ с точки зрения программирования. Мы не вносим изменения в модуль самого документа, а выносим логику в отдельный общий модуль. Рассмотрим этот процесс по шагам.

  1. Создадим новый Общий модуль (например, РаботаСПравамиПользователей). Установим свойства «Сервер», «Вызов сервера».
  2. Создадим в дереве метаданных объект Подписка на событие.
  3. В поле «Источник» выберем нужный тип документа (или несколько типов).
  4. В поле «Событие» выберем ПередЗаписью.
  5. В поле «Обработчик» укажем процедуру из нашего общего модуля.

Проанализируем пример кода для обработчика подписки:


Процедура ПередЗаписьюДокументаДляЗапретаПроведения(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт

    // 1. Проверяем, не происходит ли загрузка данных (обмен)
    Если Источник.ОбменДанными.Загрузка Тогда
        Возврат;
    КонецЕсли;

    // 2. Определяем, является ли действие проведением или отменой проведения
    Если РежимЗаписи = РежимЗаписиДокумента.Проведение 
       ИЛИ РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения Тогда
        
        // 3. Проверяем наличие роли или специального права
        Если НЕ РольДоступна("ПолныеПрава") И НЕ РольДоступна("РазрешеноПроведениеДокументов") Тогда
            
            Сообщить("У вас недостаточно прав для проведения или отмены проведения этого документа!", СтатусСообщения.Важное);
            Отказ = Истина; // Прерываем запись документа
            
        КонецЕсли;
        
    КонецЕсли;

КонецПроцедуры

В данном примере мы используем проверку РежимЗаписи. Это позволяет нам оставить пользователю возможность просто сохранять изменения в документе (режим Запись), но блокировать попытки повлиять на учет.

Способ 2. Интеграция в механизм «Дополнительные права пользователей»

В 1С:УТ 10.3 уже есть встроенный механизм управления правами через План видов характеристик ПраваПользователей. Вместо того чтобы «жестко» прописывать роли в коде, мы можем добавить новое право прямо в пользовательский интерфейс. Это позволит администратору базы данных включать или выключать запрет без привлечения программиста.

Рассмотрим, как это реализовать:

  1. Откроем в конфигураторе План видов характеристик ПраваПользователей.
  2. Добавим новый предопределенный элемент, например: РазрешитьПроведениеРеализаций.
  3. В подписке на событие или в модуле документа заменим проверку роли на проверку значения этого права.

Для этого в УТ 10.3 обычно используется функция УправлениеПользователями.ПолучитьЗначениеПраваПользователя(). Посмотрим на пример реализации:


ПравоРазрешено = УправлениеПользователями.ПолучитьЗначениеПраваПользователя(ПланыВидовХарактеристик.ПраваПользователей.РазрешитьПроведениеРеализаций);

Если НЕ ПравоРазрешено И (РежимЗаписи = РежимЗаписиДокумента.Проведение ИЛИ РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения) Тогда
    Отказ = Истина;
    ТекстСообщения = "Действие запрещено настройками дополнительных прав пользователя.";
    ОбщегоНазначения.СообщитьОбОшибке(ТекстСообщения);
КонецЕсли;

Важные технические нюансы

При реализации любого из способов необходимо учитывать несколько критически важных моментов, чтобы не нарушить работу системы в целом.

1. Игнорирование при обмене данными
Всегда добавляйте проверку Если ОбменДанными.Загрузка Тогда Возврат; КонецЕсли;. Если этого не сделать, автоматические обмены (например, с «1С:Бухгалтерией») могут перестать работать, так как система будет блокировать запись документов, приходящих из других баз под техническим пользователем.

2. Разграничение действий
Иногда нужно запретить только отмену проведения, но разрешить само проведение (или наоборот). Для этого нужно более детально анализировать РежимЗаписи. Помните, что РежимЗаписиДокумента.Проведение срабатывает и при первом проведении, и при перепроведении уже проведенного документа.

3. Использование расширений (для платформы 8.3)
Хотя УТ 10.3 — это конфигурация на обычных формах, современные версии платформы 8.3 позволяют использовать Расширения. Это самый современный и безопасный способ. Вы можете создать расширение, добавить в него процедуру-префикс &Перед для метода ПередЗаписью модуля документа. Это позволит вообще не снимать основную конфигурацию с поддержки.

Резюме

Подведем итог нашего анализа. Для запрета проведения в УТ 10.3 мы выяснили следующее:

Выбрав комбинированный подход (подписка на событие + проверка через План видов характеристик), вы получите надежное и масштабируемое решение, которое будет понятно и другим разработчикам, сопровождающим систему.

← На главную