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

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

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

Вариант 1. Прямая запись ссылки на бизнес-процесс в реквизит документа

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

Разберем по шагам, как это реализуется программно в модуле бизнес-процесса.

Шаг 1. Передача документа-основания в бизнес-процесс

В процедуре ОбработкаЗаполнения модуля бизнес-процесса принимаем ссылку на документ и сохраняем её в реквизит бизнес-процесса (например, ОбъектСогласования или ДокументОснование):


Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
    Если ТипЗнч(ДанныеЗаполнения) = Тип("ДокументСсылка.ЗаказПокупателя") Тогда
        ОбъектСогласования = ДанныеЗаполнения;
    КонецЕсли;
КонецПроцедуры

Шаг 2. Запись ссылки на бизнес-процесс в документ

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


Процедура ПриЗаписи(Отказ)
    Если ЗначениеЗаполнено(ОбъектСогласования) Тогда
        ДокументОбъект = ОбъектСогласования.ПолучитьОбъект();
        Если ДокументОбъект <> Неопределено Тогда
            ДокументОбъект.СсылкаНаБП = Ссылка;
            ДокументОбъект.Записать();
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Недостатки и риски прямой записи в документ (циклические ссылки)

Несмотря на простоту реализаций, прямой метод создания перекрестных (циклических) ссылок между документом и бизнес-процессом имеет существенные технические ограничения:

  1. Конфликты блокировок и транзакций: если в момент старта бизнес-процесса документ открыт на редактирование пользователем или заблокирован фоновым процессом, вызов Записать() приведет к ошибке блокировки или исключению из-за изменения версии объекта.
  2. Ограничение «Один к одному»: хранение единственной ссылки в реквизите документа не позволит запустить повторный бизнес-процесс (например, на повторное согласование после доработки), так как новое значение просто перезапишет прежнюю ссылку и история будет утеряна.
  3. Избыточные права и логика: для записи ссылки пользователю понадобятся права на изменение самого документа-основания. Кроме того, повторный вызов записи документа вызовет подписки на события записи и может повлиять на статусы документа.

Вариант 2. Использование независимого регистра сведений (рекомендуемый способ)

Выясним, как избежать циклических связей и связанных с ними блокировок. Оптимальным решением является создание независимого регистра сведений (например, СвязиОбъектовБизнесПроцессов).

Структура регистра:

  1. Измерение: Документ (Произвольная ссылка на документ).
  2. Измерение или Ресурс: БизнесПроцесс (Ссылка на бизнес-процесс).

При записи или старте бизнес-процесса формируется запись в регистр сведений:


МенеджерЗаписи = РегистрыСведений.СвязиОбъектовБизнесПроцессов.СоздатьМенеджерЗаписи();
МенеджерЗаписи.Документ = ОбъектСогласования;
МенеджерЗаписи.БизнесПроцесс = Ссылка;
МенеджерЗаписи.Период = ТекущаяДата();
МенеджерЗаписи.Записать();

Преимущества данного подхода:

  1. Не нужно модифицировать и перезаписывать сам документ-основание.
  2. Поддерживается связь «один ко многим» — к одному документу можно привязать несколько бизнес-процессов.
  3. Запись в регистр проходит быстро и не вызывает блокировок объекта документа.

Вариант 3. Динамическое получение данных без хранения ссылки в документе

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

1. Отображение формы документа:

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

2. Использование Критериев отбора:

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

3. Динамические списки и журналы:

В списках документов для вывода признака наличия бизнес-процесса настраивается ЛЕВОЕ СОЕДИНЕНИЕ с таблицей бизнес-процессов или регистра сведений. Чтобы соединение работало быстро, реквизит ДокументОснование в бизнес-процессе должен быть проиндексирован (свойство Индексировать).

← На главную