При внедрении бесшовной интеграции между учетными системами семейства «1С:Предприятие» (такими как 1С:Управление торговлей, 1С:ERP или 1С:Комплексная автоматизация) и 1С:Документооборотом часто возникает задача автоматизации рутинных операций. Стандартный функционал Библиотеки интеграции с документооборотом (БИД) позволяет пользователям запускать процессы согласования, исполнения или ознакомления вручную по кнопке из интерфейса. Однако на практике бизнес требует полной автоматизации: например, при проведении заказа клиента или договора в УТ процесс согласования в «1С:Документообороте» должен стартовать самостоятельно, без участия пользователя.
В этой статье мы подробно разберем, как реализовать автостарт бизнес-процесса ДО из внешней конфигурации. Мы рассмотрим несколько альтернативных подходов — от прямого программного вызова веб-сервисов до асинхронного выполнения и настройки автозапуска на стороне самого «1С:Документооборота» без написания сложного кода.
Этот способ подходит в тех случаях, когда нам необходимо полностью контролировать процесс создания предмета и запуска бизнес-процесса непосредственно из кода нашей учетной системы (например, УТ). Процедуру можно логически разделить на два последовательных этапа:
Рассмотрим подробнее программный код для реализации первого этапа. Для того чтобы связать наш документ в УТ с новым документом в ДО, мы воспользуемся возможностями общего модуля ИнтеграцияС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С позволяет настроить автостарт бизнес-процесса целиком на стороне «1С:Документооборота», задействовав штатный функционал синхронизации БИД.
Рассмотрим этот элегантный метод по шагам:
ИнтеграцияС1СДокументооборотПередЗаписьюДокумента). В результате в ДО автоматически создается связанный «Внутренний документ».Таким образом, связка работает автоматически: как только БИД создает карточку документа в Документообороте, сама база ДО перехватывает это событие и мгновенно инициализирует соответствующий процесс согласования. Никакого программного кода веб-сервисов в вашей УТ писать при этом не требуется!
Если вы все же выбрали путь программного взаимодействия через веб-сервисы, вы можете столкнуться со специфической ошибкой превышения времени ожидания (таймаута). При создании сложных документов с тяжелыми вложениями или запуске процессов с разветвленной маршрутизацией сервер ДО может обрабатывать запрос дольше стандартного лимита времени (который обычно составляет 30 секунд).
Чтобы избежать аварийного прерывания соединения, мы рекомендуем программно переопределить таймаут веб-сервиса. Для этого в БИД предусмотрен специальный модуль ИнтеграцияС1СДокументооборотомПереопределяемый. Найдите в нем процедуру ПриОпределенииТаймаутаСервиса и задайте увеличенный интервал ожидания для ресурсоемких операций:
Процедура ПриОпределенииТаймаутаСервиса(ИмяМетода, Таймаут) Экспорт
// Если выполняется тяжелая операция создания и запуска процесса, увеличиваем таймаут до 120 секунд
Если ИмяМетода = "execute" Или ИмяМетода = "СоздатьНовыйОбъект" Тогда
Таймаут = 120;
КонецЕсли;
КонецПроцедуры
Резюмируя, отметим: для простых и стандартных сценариев всегда отдавайте приоритет Способу №2 (автозапуск на стороне ДО по событию создания объекта через стандартную БИД). Он надежнее, не требует поддержки кастомного кода и легко настраивается силами администратора. Если же логика требует сложного программного контроля, используйте Способ №1, но обязательно оборачивайте его в асинхронную очередь задач, чтобы обеспечить бесперебойную работу пользователей в основной учетной системе.