При проектировании сложных бизнес-процессов в системе «1С:Документооборот» разработчики и аналитики часто сталкиваются с избыточностью задач. Типичный пример: процесс согласования договора состоит из множества шагов, проходящих по различным ролям. На практике один и тот же сотрудник может выступать в роли инициатора (автора), непосредственного руководителя и, например, профильного директора. Если система будет слепо отправлять задачи на каждом шаге, пользователю придется согласовывать один и тот же документ по несколько раз. Это вызывает раздражение сотрудников, увеличивает сроки обработки документов и создает лишнюю нагрузку на базу данных.
В рамках этой статьи мы подробно разберем, как научить систему автоматически пропускать шаги, если согласование от этого пользователя уже было получено на более ранних этапах, а также как настроить корректный пропуск шагов, предназначенных исключительно для филиалов, без зависания процесса. Мы рассмотрим решения как для версии 1С:Документооборот 2.1 (с использованием условий маршрутизации на встроенном языке), так и для новой линейки 1С:Документооборот 3.0 (с помощью встроенных умных механизмов).
Прежде чем переходить к написанию кода и настройкам, важно понять фундаментальный принцип работы бизнес-процессов в 1С. Система оценивает условия маршрутизации до момента создания задачи исполнителю, а не во время ее выполнения. Проанализируем этот механизм на простом жизненном примере.
Представим, что мы идем на прогулку. На развилке дорог мы задаем вопрос: «Хочешь лимонад?». Если попутчик отвечает «Да», мы сворачиваем в проулок к киоску (система создает задачу исполнителю). Если ответ «Нет», мы продолжаем движение прямо по главному проспекту (система пропускает этот шаг и переходит к следующему). Точно так же работает и условная маршрутизация в «1С:Документооборот».
Когда процесс доходит до определенного шага, система вычисляет заданное для этого шага условие (которое может быть написано как в конструкторе, так и на встроенном языке 1С). Если результат вычисления равен Истина, шаг активируется и создается задача. Если результат равен Ложь, шаг просто игнорируется, и система мгновенно переходит к следующему этапу. Для тестирования и отладки таких правил пригодится инструмент для проверки условий маршрутизации.
Рассмотрим ситуацию, когда четвертый шаг процесса — это согласование у директора филиала (например, в г. Абакан), но документ может быть создан и в головном офисе, где директора филиала нет. Нам нужно сделать так, чтобы для головного офиса этот шаг автоматически пропускался.
Выясним, как это реализовать. Нам необходимо настроить условие маршрутизации для шага 4. Если документ создан в филиале Абакан, условие должно возвращать Истина, во всех остальных случаях — Ложь.
Для этого в шаблоне процесса на четвертом шаге мы устанавливаем флаг «Использовать условия» и привязываем к нему условие маршрутизации. Код проверки на встроенном языке будет выглядеть следующим образом:
Если Предмет.ДополнительныеРеквизиты[0].Значение = Справочники.СтруктураПредприятия.НайтиПоНаименованию("Абакан") Тогда
Результат = Истина;
Иначе
Результат = Ложь;
КонецЕсли;
Важное предупреждение: обращение к дополнительным реквизитам по индексу [0] — это крайне нестабильная практика, так как порядок реквизитов в базе данных может измениться. Безопаснее находить нужный дополнительный реквизит по его свойству (метаданным). Тем не менее, приведенный алгоритм наглядно показывает суть: если условие возвращает Ложь (заявка из головного офиса), система сама поймет, что шаг выполнять не нужно, и сразу перейдет к шагу 5. Дополнительно указывать «куда переходить в случае Ложь» в настройках шага не требуется.
При этом поведение системы различается в зависимости от версии программы:
Если один и тот же пользователь должен согласовать документ на разных этапах, возникает не только методологическая проблема («зачем согласовывать дважды?»), но и техническая ошибка платформы. В «1С:Документооборот» (особенно версии 2.1) существует жесткое ограничение: в рамках одного цикла согласования у одного физического лица не может быть двух активных виз на один и тот же документ.
Если система попытается записать вторую визу для того же человека, процесс заблокируется, а пользователь увидит критическую ошибку транзакции. Давайте разберем три основных способа решения этой проблемы.
Самый надежный способ узнать, согласовывал ли уже пользователь этот документ ранее — обратиться к табличной части виз документа. Мы можем написать программное условие маршрутизации на встроенном языке 1С, которое будет выполняться перед стартом очередного шага.
Рассмотрим пример кода, который проверяет, содержится ли уже успешная виза от конкретного сотрудника (например, руководителя автора документа) в истории согласования:
// Определяем проверяемого сотрудника (в данном случае руководитель того, кто подготовил документ)
ПроверяемыйСотрудник = Предмет.Подготовил.Руководитель;
Результат = Истина; // По умолчанию шаг НЕ пропускаем (задача должна создаться)
// Обходим коллекцию виз согласования документа
Для Каждого СтрокаВизы Из Предмет.ВизыСогласования Цикл
// Проверяем, совпадает ли исполнитель визы с нашим сотрудником
// и было ли решение положительным ("Согласовано")
Если СтрокаВизы.Исполнитель = ПроверяемыйСотрудник
И СтрокаВизы.РезультатСогласования = Перечисления.РезультатыСогласования.Согласовано Тогда
// Если успешная виза от этого человека уже есть, возвращаем Ложь
// Шаг маршрутизации будет пропущен
Результат = Ложь;
Прервать;
КонецЕсли;
КонецЦикла;
Этот код универсален. Изменяя переменную ПроверяемыйСотрудник, мы можем подставлять туда автора документа (Предмет.Автор или Предмет.Подготовил), конкретного пользователя из роли или любого другого участника процесса. В качестве готовой альтернативы можно использовать расширение для автоматического закрытия повторных задач согласования.
Если вы не хотите использовать программирование, можно настроить условия маршрутизации в пользовательском режиме с помощью стандартного конструктора условий. Разберем логику построения такого процесса.
Допустим, на шаге 2 документ согласовывает непосредственный руководитель автора. На шаге 8 настроено согласование у определенной роли, которую на данный момент также исполняет этот руководитель. Чтобы исключить повторное согласование на шаге 8, мы можем добавить для него условие маршрутизации со следующей логикой:
«Исполнитель Шага 8 НЕ РАВЕН Подготовил.Подразделение.Руководитель»
Если это условие выполняется (то есть текущий исполнитель шага 8 — это другое лицо), то задача создается. Если они равны, условие возвращает Ложь, и шаг 8 успешно пропускается, так как руководитель уже выразил свое мнение на шаге 2.
Если вы работаете в современной редакции 1С:Документооборот 3.0, разработчики фирмы «1С» уже добавили штатный механизм для решения этой проблемы, который не требует написания кода или создания сложных условий вручную.
Этот механизм называется «Вытеснение участников согласования». Разберем по шагам, как его активировать и использовать:
Как это работает на практике? Если один и тот же сотрудник назначен в процессе и согласующим, и утверждающим (подписывающим) лицом, программа автоматически «вытеснит» его из этапа согласования. Шаг согласования для него будет пропущен, так как его финальное решение при утверждении/подписании документа имеет более высокий приоритет. Также в системе можно настроить ранги подразделений, благодаря чему руководитель вышестоящего подразделения будет автоматически вытеснять нижестоящего сотрудника, исключая дублирование задач.
Мы проанализировали различные методы оптимизации процессов согласования в системе «1С:Документооборот». Подведем итог:
Предмет.ВизыСогласования, чтобы своевременно выявлять уже полученные подписи сотрудников и избегать ошибок уникальности виз.