Как программно запустить бизнес-процесс 1С:Документооборота из другой конфигурации (УТ, ERP, КА)?

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

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

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

Способ №1. Прямой программный запуск через API веб-сервисов БИД

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

  1. Создание и синхронизация самого объекта-предмета (например, «Внутреннего документа» в ДО) на основе документа нашей учетной системы.
  2. Инициализация бизнес-процесса по заранее настроенному шаблону и его запуск с привязкой к созданному предмету.

Рассмотрим подробнее программный код для реализации первого этапа. Для того чтобы связать наш документ в УТ с новым документом в ДО, мы воспользуемся возможностями общего модуля ИнтеграцияС1СДокументооборот:


// Этап 1. Создание связанного объекта (предмета) в 1С:Документообороте
ИнтегрированныйОбъект = Новый Структура;
ИнтегрированныйОбъект.Вставить("Объект", ОбъектСсылка);
ИнтегрированныйОбъект.Вставить("ПравилоЗаполнения", 
    Справочники.ПравилаИнтеграцииС1СДокументооборотом.НайтиПоНаименованию("ТвоеПравилоИнтеграции"));
ИнтегрированныйОбъект.Вставить("ТипОбъектаДокументооборота", "DMInternalDocument");
ИнтегрированныйОбъект.Вставить("ИдентификаторОбъектаДокументооборота", Строка(ОбъектСсылка.УникальныйИдентификатор()));

ОбъектXDTO = ИнтеграцияС1СДокументооборот.ПолучитьXDTOИзмененийИзОбъекта(ИнтегрированныйОбъект);
Прокси = ИнтеграцияС1СДокументооборотПовтИсп.ПолучитьProxy();

Запрос = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, "DMGetNewObjectRequest");
Запрос.type = ИнтегрированныйОбъект.ТипОбъектаДокументооборота;
Результат = Прокси.execute(Запрос);
ИнтеграцияС1СДокументооборот.ПроверитьВозвратВебСервиса(Прокси, Результат);

ЕстьФайлы = Ложь;
Если ОбъектXDTO.files.Count() > 0 Тогда
    files = Новый Массив;
    ЕстьФайлы = Истина;
    Для Каждого file Из ОбъектXDTO.files Цикл
        files.Добавить(file);
    КонецЦикла;
    ОбъектXDTO.files.Clear();
КонецЕсли;
    
ОбъектXDTO.author = Результат.author;
ОбъектXDTO.subdivision = Результат.subdivision;
ИнтеграцияС1СДокументооборот.СоздатьНовыйОбъект(Прокси, ОбъектXDTO);

Если ЕстьФайлы Тогда
    Для Каждого file Из files Цикл
        ОбъектXDTO.files.Добавить(file);
    КонецЦикла;
    ИнтеграцияС1СДокументооборот.ЗаписатьОбъект(Прокси, ОбъектXDTO);
КонецЕсли;

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


// Этап 2. Создание и запуск бизнес-процесса по шаблону
Предмет = Новый Структура;
Предмет.Вставить("id", мИдентификаторОбъектаДокументооборота); // Идентификатор, полученный на Этапе 1
Предмет.Вставить("type", "DMInternalDocument");

ИдентификаторШаблона = ПолучитьGUIDШаблонаСогласования(); // Функция должна возвращать GUID шаблона из ДО
Шаблон = Новый Структура;
Шаблон.Вставить("id", ИдентификаторШаблона);
Шаблон.Вставить("type", "DMBusinessProcessApprovalTemplate"); // Тип шаблона (например, согласование)

Прокси = ИнтеграцияС1СДокументооборотПовтИсп.ПолучитьProxy();
ШаблонПроцесса = ИнтеграцияС1СДокументооборот.НовыйБизнесПроцессПоШаблону(Прокси, "DMBusinessProcessApproval", Шаблон, Предмет);

НовыйПроцесс = ИнтеграцияС1СДокументооборот.СоздатьОбъект(Прокси, ШаблонПроцесса.ObjectId.type);
ИнтеграцияС1СДокументооборот.ЗаполнитьЗначенияСвойствXDTO(Прокси, НовыйПроцесс, ШаблонПроцесса);

РезультатЗапуска = ИнтеграцияС1СДокументооборот.ЗапуститьБизнесПроцесс(Прокси, НовыйПроцесс);
БизнесПроцессID = РезультатЗапуска.businessProcess.objectID.id;

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

Критически важная рекомендация: Избегайте синхронных вызовов в транзакции!

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

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

Правильное архитектурное решение — асинхронный запуск:

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

Способ №2. Альтернативный «безкодовый» метод автоматического старта

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

Рассмотрим этот элегантный метод по шагам:

  1. Настройка интеграции в УТ: В настройках интеграции с ДО для целевого документа (например, договора) мы определяем правило интеграции. Настраиваем его таким образом, чтобы при записи или проведении документа в УТ данные автоматически отправлялись в ДО через стандартные подписки БИД (например, ИнтеграцияС1СДокументооборотПередЗаписьюДокумента). В результате в ДО автоматически создается связанный «Внутренний документ».
  2. Настройка правил автозапуска в ДО: Переходим в базу «1С:Документооборот». Открываем раздел Управление процессами -> Шаблоны процессов (или настройки видов документов). Находим нужный шаблон процесса и переходим к настройке автозапуска.
  3. Привязка к бизнес-событию: Настраиваем правило автозапуска, указав в качестве стартового события «Создание внутреннего документа» определенного вида. Дополнительно можно наложить гибкие условия (например, запускать процесс только в том случае, если сумма документа превышает 100 000 рублей).

Таким образом, связка работает автоматически: как только БИД создает карточку документа в Документообороте, сама база ДО перехватывает это событие и мгновенно инициализирует соответствующий процесс согласования. Никакого программного кода веб-сервисов в вашей УТ писать при этом не требуется!

Управление таймаутом веб-сервиса

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

Чтобы избежать аварийного прерывания соединения, мы рекомендуем программно переопределить таймаут веб-сервиса. Для этого в БИД предусмотрен специальный модуль ИнтеграцияС1СДокументооборотомПереопределяемый. Найдите в нем процедуру ПриОпределенииТаймаутаСервиса и задайте увеличенный интервал ожидания для ресурсоемких операций:


Процедура ПриОпределенииТаймаутаСервиса(ИмяМетода, Таймаут) Экспорт
    
    // Если выполняется тяжелая операция создания и запуска процесса, увеличиваем таймаут до 120 секунд
    Если ИмяМетода = "execute" Или ИмяМетода = "СоздатьНовыйОбъект" Тогда
        Таймаут = 120;
    КонецЕсли;
    
КонецПроцедуры

Резюмируя, отметим: для простых и стандартных сценариев всегда отдавайте приоритет Способу №2 (автозапуск на стороне ДО по событию создания объекта через стандартную БИД). Он надежнее, не требует поддержки кастомного кода и легко настраивается силами администратора. Если же логика требует сложного программного контроля, используйте Способ №1, но обязательно оборачивайте его в асинхронную очередь задач, чтобы обеспечить бесперебойную работу пользователей в основной учетной системе.

← На главную