При автоматизации бизнес-процессов в платформах 1С часто возникает задача: пользователь создает бизнес-процесс на основании документа, и требуется быстро видеть прямо из документа, какой именно процесс по нему запущен. Рассмотрим подробно, как решить эту задачу, какие существуют способы реализации, с какими техническими ограничениями можно столкнуться и какое решение считается наиболее оптимальным с точки зрения архитектуры 1С.
Проанализируем классический подход: в документе добавляется реквизит (например, БизнесПроцесс с типом ссылки на нужный бизнес-процесс). При создании бизнес-процесса на основании документа ссылка на бизнес-процесс записывается в этот реквизит.
Разберем по шагам, как это реализуется программно в модуле бизнес-процесса.
Шаг 1. Передача документа-основания в бизнес-процесс
В процедуре ОбработкаЗаполнения модуля бизнес-процесса принимаем ссылку на документ и сохраняем её в реквизит бизнес-процесса (например, ОбъектСогласования или ДокументОснование):
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
ОбъектСогласования = ДанныеЗаполнения;
КонецЕсли;
КонецПроцедуры
Шаг 2. Запись ссылки на бизнес-процесс в документ
После того как бизнес-процесс записан и у него сформировалась ссылка, обратимся к документу-основанию и запишем в его реквизит созданный бизнес-процесс. Сделать это можно в обработчике ПриЗаписи или ПослеЗаписи модуля бизнес-процесса:
Процедура ПриЗаписи(Отказ)
Если ЗначениеЗаполнено(ОбъектСогласования) Тогда
ДокументОбъект = ОбъектСогласования.ПолучитьОбъект();
Если ДокументОбъект <> Неопределено Тогда
ДокументОбъект.СсылкаНаБП = Ссылка;
ДокументОбъект.Записать();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Несмотря на простоту реализаций, прямой метод создания перекрестных (циклических) ссылок между документом и бизнес-процессом имеет существенные технические ограничения:
Записать() приведет к ошибке блокировки или исключению из-за изменения версии объекта.Выясним, как избежать циклических связей и связанных с ними блокировок. Оптимальным решением является создание независимого регистра сведений (например, СвязиОбъектовБизнесПроцессов).
Структура регистра:
Документ (Произвольная ссылка на документ).БизнесПроцесс (Ссылка на бизнес-процесс).При записи или старте бизнес-процесса формируется запись в регистр сведений:
МенеджерЗаписи = РегистрыСведений.СвязиОбъектовБизнесПроцессов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Документ = ОбъектСогласования;
МенеджерЗаписи.БизнесПроцесс = Ссылка;
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Записать();
Преимущества данного подхода:
Посмотрим, как решить задачу визуализации без создания дополнительных реквизитов в документе или отдельных регистров.
1. Отображение формы документа:
При открытии формы документа в обработчике ПриСозданииНаСервере выполняется быстрый запрос к таблице бизнес-процессов, где в качестве реквизита основания указан данный документ. Найдена ссылка на БП выводится в надпись или гиперссылку формы.
2. Использование Критериев отбора:
В платформе 1С предусмотрен объект конфигурации КритерийОтбора. Настроив критерий отбора по реквизиту бизнес-процесса ДокументОснование, можно штатно получать список всех связанных процессов для любого документа.
3. Динамические списки и журналы:
В списках документов для вывода признака наличия бизнес-процесса настраивается ЛЕВОЕ СОЕДИНЕНИЕ с таблицей бизнес-процессов или регистра сведений. Чтобы соединение работало быстро, реквизит ДокументОснование в бизнес-процессе должен быть проиндексирован (свойство Индексировать).