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