Как настроить корректную установку состояния документа при параллельном согласовании в 1С:Документооборот

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

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

Разберем детально, почему это происходит и как настроить схему процесса таким образом, чтобы состояние документа принимало значение «Согласовано» исключительно в том случае, если все параллельные участники ответили положительно.

Анализ механизма автоматической установки состояний

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

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

Решение для версии 1С:Документооборот 2.1: Использование условий после слияния

Рассмотрим по шагам, как обойти эту проблему в версии 2.1, используя визуальный конструктор схем. Основная идея заключается в том, чтобы отобрать у действий «Согласование» право менять статус документа и передать это право отдельному блоку в конце процесса.

  1. Отключение автоматической установки состояния. Откроем настройки каждого действия «Согласование» в шаблоне комплексного процесса. В зависимости от точной версии конфигурации, нам нужно убедиться, что промежуточные действия не будут перезаписывать финальный статус раньше времени. Если это невозможно сделать флажком, переходим к следующему шагу.
  2. Настройка точки слияния. В схеме процесса после двух параллельных веток обязательно ставится блок «Слияние». Важно понимать: этот блок лишь ожидает завершения всех входящих в него веток, но он не анализирует их результат.
  3. Добавление блока «Условие». Сразу после точки «Слияние» добавим блок «Условие». Именно здесь мы будем проверять совокупный результат.
  4. Программная проверка результатов. В блоке «Условие» выберем тип «Выражение на встроенном языке». Нам необходимо проанализировать задачи, выполненные в рамках данного бизнес-процесса. Разберем пример логики:

// Пример логики для блока "Условие"
// Проверяем задачи текущего комплексного процесса
Запрос = Новый Запрос;
Запрос.Текст = 
    "ВЫБРАТЬ
    |	Задачи.РезультатВыполнения КАК Результат
    |ИЗ
    |	Задача.ЗадачаИсполнителя КАК Задачи
    |ГДЕ
    |	Задачи.БизнесПроцесс = &БизнесПроцесс
    |	И Задачи.ТочкаМаршрута В (&ТочкиСогласования)";

Запрос.УстановитьПараметр("БизнесПроцесс", Объект.Ссылка);
// Указываем точки маршрута, результаты которых нам важны
Запрос.УстановитьПараметр("ТочкиСогласования", СписокТочекСогласования); 

РезультатЗапроса = Запрос.Выполнить().Выбрать();
ВсеСогласовали = Истина;

Пока РезультатЗапроса.Следующий() Цикл
    Если РезультатЗапроса.Результат <> Перечисления.РезультатыСогласования.Согласовано Тогда
        ВсеСогласовали = Ложь;
        Прервать;
    КонецЕсли;
КонецЦикла;

Результат = ВсеСогласовали;

Если условие возвращает Истина, направляем процесс по ветке, где стоит действие, устанавливающее итоговый статус «Согласован». Если Ложь — направляем на ветку обработки отрицательного результата.

Решение для версии 1С:Документооборот 3.0: Группы действий

Выясним, как обстоят дела в новой версии 3.0. Здесь концепция «Комплексного процесса» заменена на «Обработку», а управление маршрутами стало более гибким. В версии 3.0 проблема решается гораздо проще за счет Групп действий.

Рассмотрим алгоритм настройки:

  1. Создадим новую «Обработку» документа.
  2. Добавим Группу действий.
  3. В настройках группы установим порядок выполнения «Все одновременно».
  4. Поместим внутрь этой группы два действия «Согласование».
  5. В правилах обработки укажем, что итоговое состояние документа зависит от результата всей группы.

В 3.0 система автоматически вычисляет «вес» результата. Если в группе «Все одновременно» хотя бы один участник нажал «Не согласовано», итоговый результат группы будет отрицательным, и общее состояние документа не изменится на «Согласован» автоматически.

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

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

В свойствах точки маршрута (например, после слияния) выберем событие «При выполнении». Здесь мы можем принудительно установить состояние документа, используя программный интерфейс системы. Посмотрим на пример кода, который можно использовать в обработчике:


// Установка состояния документа через API 1С:Документооборот
Предмет = ЗадачаОбъект.Предметы[0].Предмет; // Получаем основной предмет процесса
НовоеСостояние = Справочники.СостоянияДокументов.НайтиПоНаименованию("Согласован");

Если ЗначениеЗаполнено(Предмет) И ЗначениеЗаполнено(НовоеСостояние) Тогда
    // Используем типовой механизм установки состояния
    СостоянияДокументов.УстановитьСостояние(Предмет, НовоеСостояние);
КонецЕсли;

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

Использование справочника «Результаты выполнения действий»

Выясним причину, по которой система иногда считает «Согласовано с замечаниями» положительным результатом, а иногда нет. В системе существует скрытый от обычного пользователя справочник «Результаты выполнения действий».

Рекомендуется проверить настройки в этом справочнике:

Итоги и рекомендации

Подведем итог нашему исследованию. Если вы столкнулись с тем, что документ преждевременно переходит в состояние «Согласован» при параллельной работе:

  1. В версии 2.1 откажитесь от автоматического изменения состояния внутри действий и используйте блок «Условие» после «Слияния» для проверки итогов всех веток.
  2. В версии 3.0 используйте механизм Групп действий с типом исполнения «Все одновременно» — это штатное решение проблемы.
  3. При необходимости сложной логики (например, если нужно учитывать мнение только определенных ролей) используйте скрипты на встроенном языке в точках маршрута схемы.

Такой комплексный подход позволит вам создать надежный бизнес-процесс, в котором статус документа всегда будет отражать реальную картину согласования всеми ответственными лицами.

← На главную