1с документооборот комплексный процесс не переходит на следующий шаг

Обновлено: 25.06.2024

Как запустить автоматический старт процесса по документу при наступлении определенных условий?

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




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

Создадим вид для бизнес-события, которое будет формироваться при наступлении данного условия.



Теперь нужно добавить "Детектор бизнес-события". Детектор бизнес-события - это как раз та часть механизма, которая отслеживает выполнение условия и создает соответствующее событие в системе.

Добавим новый детектор в справочнике «Детекторы бизнес-событий». В его карточке укажем вид бизнес-события, который создали ранее. В поле «Выражение на встроенном языке» необходимо написать код, который проверяет, есть ли хотя бы один объект, для которого условие истинно. Если есть, то переменной «Результат» нужно присвоить значение Истина. В этом случае система создаст бизнес-событие с указанным видом.



ВАЖНО: Если не установлен флаг «Детектор включен», код детектора исполняться не будет!

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

Код детектора:

ВидыДокументов = Новый Массив;

ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка", Истина));

Запрос = Новый Запрос;

"ВЫБРАТЬ ПЕРВЫЕ 1

| Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Файлы КАК Файлы

| ПО ВнутренниеДокументы.Ссылка = Файлы.ВладелецФайла

| ЛЕВОЕ СОЕДИНЕНИЕ БизнесПроцесс.КомплексныйПроцесс.Предметы КАК КомплексныйПроцессПредметы

| ПО ВнутренниеДокументы.Ссылка = КомплексныйПроцессПредметы.Предмет

| КомплексныйПроцессПредметы.Предмет ЕСТЬ NULL

| И ВнутренниеДокументы.ВидДокумента В(&ВидыДокументов)

| И НЕ ВнутренниеДокументы.ПометкаУдаления

| И Файлы.ПодписанЭП = ИСТИНА

| И НЕ Файлы.ПометкаУдаления";

Если Не РезультатЗапроса.Пустой() Тогда


Далее необходимо выполнить обработку сформированных бизнес-событий. В нашем случае это запуск процессов по документам. Для обработки бизнес-события в программе используется справочник "Дополнительные обработчики-бизнес событий".

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



ВидыДокументов.Добавить(Справочники.ВидыВнутреннихДокументов.НайтиПоНаименованию("Служебная записка", Истина));

Запрос = Новый Запрос;

| Справочник.ВнутренниеДокументы КАК ВнутренниеДокументы

| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Файлы КАК Файлы

| ПО ВнутренниеДокументы.Ссылка = Файлы.ВладелецФайла

| ЛЕВОЕ СОЕДИНЕНИЕ БизнесПроцесс.КомплексныйПроцесс.Предметы КАК КомплексныйПроцессПредметы

| ПО ВнутренниеДокументы.Ссылка = КомплексныйПроцессПредметы.Предмет

| КомплексныйПроцессПредметы.Предмет ЕСТЬ NULL

| И ВнутренниеДокументы.ВидДокумента В(&ВидыДокументов)

| И НЕ ВнутренниеДокументы.ПометкаУдаления

| И Файлы.ПодписанЭП = ИСТИНА

| И НЕ Файлы.ПометкаУдаления";

Если Не РезультатЗапроса.Пустой() Тогда

ШаблонПроцесса = Справочники.ШаблоныКомплексныхБизнесПроцессов.НайтиПоНаименованию("Обработка записок", Истина);

Пока Выборка.Следующий() Цикл

БизнесПроцессОбъект.ЗаполнитьПоШаблонуИПредмету(ШаблонПроцесса, Документ, Документ.Подготовил);

Если ПолучитьФункциональнуюОпцию("ИспользоватьФоновыйСтартПроцессов") Тогда

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




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

Отлаживать же механизм можно частями - проконтролировать появление новых событий можно, открыв регистр сведений «Произошедшие бизнес события» (все события механизм запишет сюда), срабатывание обработчика можно увидеть тут-же по появлению флага «Обработано», а саму правильность кода обработчика — по появлению запланированного результата (в нашем примерe - создан процесс по документу).


Для тестирования программы 1С:Документооборот вам достаточно заполнить форму, нажав на кнопку ниже.

Как в 1С:Документообороте поставить на паузу процесс до выполнения условия?

В статье используются следующие механизмы 1С:Документооборот КОРП версии 2.1.18.11: комплексный процесс в виде схемы, эскалации, этапы обработки документов.

Очень часто комплексный процесс (или ветку процесса) нужно поставить на паузу, пока не выполнится определенное условие. В данной статье показан один из способов реализации данного функционала.

Видео-урок "Как поставить на паузу процесс до выполнения условия" доступен в теме Бизнес-процессы видеокурса Самоучитель 1С:Документооборот для специалистов и администраторов.

Открываем демо версию 1С:Документооборот 8 КОРП под пользователем Администратор.

Открываем Виды документов в разделе НСИ.


Находим вид внутреннего документа Договор аренды оборудования. В нем установлена нужная нам настройка Использовать этапы обработки документа.


И обращаем внимание на этапы обработки документа, заданные у вида документа.


В шаблоне комплексного процесса (КП) сделаем два параллельных вложенных КП. В одной ветке у нас будут этапы 2-5, 8. В другой ветке 6 и 7, причем этап 7 должен начаться только после того, как в параллельной ветке завершится этап 5.

Переходим в раздел Управление процессами и открываем Шаблоны процессов.


Создаем новый комплексный процесс в виде схемы 1с документооборота.


На схему добавим две параллельные ветки (два вложенных комплексных процесса):

  • Согласование и подписание договора.
  • Получение и оплата счета.


Первая ветка содержит этапы 2, 3, 4, 5, 8.


Вторая ветка содержит этапы 6 и 7.


Однако этап 7 "Оплатить счет" надо запускать только после этапа 5 "Подписания договора" в параллельной ветке.

Для решения этой задачи создадим новую роль Робот. И сделаем промежуточный шаг на эту роль "Ожидание подписания договора".


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


Чтобы из кода скрипта не искать этап по наименованию (а наименование этапа может со временем измениться), лучше использовать механизм локальных констант. Как их сделать рассказано в видеокурсе для специалистов и администраторов в теме Бизнес-события.


Также локальные константы уже реализованы одной из функций в продукте "Академическое гиперрасширение для 1С:Документооборота".


Мы воспользуемся расширением (его можно бесплатно тестировать 3 дня). Загрузим его на нашу базу и получим демо-лицензию.


После этого открываем локальные константы.


Создадим новую локальную константу ЭтапПодписатьУДиректора.


Далее нам нужно написать скрипт, который проставляет у документа, что этот этап пройден. В том же расширении имеется встроенный эмулятор скриптов. Воспользуемся им для написания скрипта.




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


Пройденность этапа заполнилась скриптом. Полный текст скрипта можно взять в библиотеке скриптов. Этот скрипт входит в список тех скриптов, которые находятся в свободном доступе.

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

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

Проблема

Для работы с большими повторяющимися комплексными бизнес-процессами чаще всего используются шаблоны, в которых прописывается полный маршрут обработки предмета. На этапе создания шаблона и в момент запуска процесса происходит проверка, в результате которой система устанавливает верность схемы. Чем сложнее схема, тем дольше проверка. Но некоторые моменты могут увеличивать длительность проверки до абсолютно неприемлемых в работе значений.

На проекте заказчика я столкнулся с тем, что обработка схемы длилась больше 10 минут. Ранее я предполагал, что проверки, занимающие много времени, вызваны загруженностью рабочего сервера.

«1С:ДО»: как сократить время запуска комплексных процессов по шаблону

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

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

«1С:ДО»: как сократить время запуска комплексных процессов по шаблону

Решение

Я переработал схему комплексного процесса в сторону максимального отказа от разделений в тех точках, где это возможно. Часть процессов заменил на те, в которых допускается параллельность внутри, например, согласование. На отметке в 3 разделения время обработки схемы снизилось до приемлемых значений.

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

Читайте также: