Механизм бизнес-событий на конкретном примере

18.02.19

Разработка - Механизмы типовых конфигураций

Есть в системе 1С:Документооборот механизм бизнес-событий. Когда мне понадобилось решить конкретную задачу, гугление ни к чему конкретному не привело. Хотелось так «вжух» и всё понять про данный механизм, но в итоге пришлось лезть в код 1С и смотреть реализацию данного механизма. В данной публикации поделюсь результатами исследований, может, кому-то это поможет быстро и легко во всём разобраться.

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

Вроде всё просто: отлавливаем создание вида связи «В ответ на» и запускаем бизнес-процесс «Ознакомление» с нужными параметрами. Но, зайдя в справочник «Виды бизнес-событий» ничего похожего на создание связи не обнаруживаем. Нам подходит только бизнес событие «Изменение входящего документа», в котором мы уже ручками будем отслеживать создание связи и запускать бизнес процесс.

Как механизм бизнес-событий работает в 1С:Документооборот? Рассмотрим на примере «Изменения входящего документа»:

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

Вот такой несложный механизм.

Получается, что нам нужно всю логику разместить в дополнительном обработчике бизнес события для вида бизнес события «Изменение входящего документа» и «Создание входящего документа» т. к. при создании входящего документа на основании исходящего предварительной записи карточки документа перед созданием связи не производится.

Итак, начнём.

 
 Код дополнительного обработчика бизнес-события
Отладка = Ложь;
	
Если Отладка Тогда
	ЗаписьЖурналаРегистрации("Обработка создания связи входящего документа", УровеньЖурналаРегистрации.Информация,,,
	"Процесс запущен");
КонецЕсли;	
// (1)
СвязьДокумента = Справочники.ТипыСвязей.ПолученВОтветНа;
// ищем связанные документы (2)
Запрос = Новый Запрос;
Запрос.Текст = 
	"ВЫБРАТЬ
	|	СвязиДокументов.СвязанныйДокумент
	|ИЗ
	|	РегистрСведений.СвязиДокументов КАК СвязиДокументов
	|ГДЕ
	|	СвязиДокументов.Документ = &Документ
	|	И СвязиДокументов.ТипСвязи = &ТипСвязи
	|
	|УПОРЯДОЧИТЬ ПО
	|	СвязиДокументов.ДатаУстановки";

Запрос.УстановитьПараметр("Документ", Событие.Источник);
Запрос.УстановитьПараметр("ТипСвязи", СвязьДокумента);

РезультатЗапроса = Запрос.Выполнить();

Если РезультатЗапроса.Пустой() И Отладка Тогда
	ЗаписьЖурналаРегистрации("Обработка создания связи входящего документа", УровеньЖурналаРегистрации.Информация,
			Метаданные.Справочники.ВнутренниеДокументы, Событие.Источник,
			"У документа не обнаружено нужного типа связи");
КонецЕсли;	

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
	СвязанныйДокумент = ВыборкаДетальныеЗаписи.СвязанныйДокумент;
	// проверяем наличие процесса ознакомление у нового документа
	// он может быть завершён, но главное, чтобы он был (3)
	Запрос = Новый Запрос;
	Запрос.Текст = "ВЫБРАТЬ ПЕРВЫЕ 1
				   |	ОзнакомлениеПредметы.Ссылка КАК Ссылка
				   |ИЗ
				   |	БизнесПроцесс.Ознакомление.Предметы КАК ОзнакомлениеПредметы
				   |ГДЕ
				   |	НЕ ОзнакомлениеПредметы.Ссылка.ПометкаУдаления
				   |	И ОзнакомлениеПредметы.Предмет = &Предмет
				   |	И ОзнакомлениеПредметы.РольПредмета = ЗНАЧЕНИЕ(Перечисление.РолиПредметов.Основной)";
	
	Запрос.УстановитьПараметр("Предмет", Событие.Источник);
	РезультатЗапроса = Запрос.Выполнить();
	// если это только что внесённый документ, то по нему нет ознакомлений
	НоваяСвязь = РезультатЗапроса.Пустой();
	
	Если НоваяСвязь Тогда							
		// создаём бизнес процесс Ознакомление (4)
		БизнесПроцесс = БизнесПроцессы.Ознакомление.СоздатьБизнесПроцесс();
		БизнесПроцесс.Автор = Событие.Автор;
		БизнесПроцесс.Наименование = НСтр("ru='Ознакомиться с входящим документом ""'") + Строка(Событие.Источник) + """";
		БизнесПроцесс.Описание = НСтр("ru = 'На Ваш исходящий документ '")
			+ Строка(СвязанныйДокумент) + НСтр("ru = ', был получен ответ, Вам рекомендовано ознакомиться с ним.'");
		Мультипредметность.ДобавитьПредмет(БизнесПроцесс, Событие.Источник);
		БизнесПроцесс.Дата = ТекущаяДата();
		БизнесПроцесс.СрокИсполненияПроцесса = БизнесПроцесс.Дата + 3 * 86400;
		БизнесПроцесс.Состояние =  Перечисления.СостоянияБизнесПроцессов.Активен;
		
		НоваяСтрока = БизнесПроцесс.Исполнители.Добавить();
		НоваяСтрока.Исполнитель = СвязанныйДокумент.Подготовил;
		
		Попытка
			БизнесПроцесс.Записать();
			БизнесПроцесс.Старт();
			
			ЗаписьЖурналаРегистрации("Обработка создания связи входящего документа", УровеньЖурналаРегистрации.Информация,
				Метаданные.БизнесПроцессы.Исполнение, БизнесПроцесс.Ссылка,
					"Создан процесс ознакомления на основе связи с документом " + Строка(СвязанныйДокумент));
		Исключение
			ЗаписьЖурналаРегистрации("Обработка создания связи входящего документа", УровеньЖурналаРегистрации.Ошибка,,,
				"Процесс ознакомления не был создан, ошибка " + ОписаниеОшибки());
		КонецПопытки;					
	Иначе	
		Если Отладка Тогда
			ЗаписьЖурналаРегистрации("Обработка создания связи входящего документа", УровеньЖурналаРегистрации.Информация,
				Метаданные.Справочники.ВнутренниеДокументы, Событие.Источник,
				"Установлено, что связь уже была обработана");
		КонецЕсли;		
	КонецЕсли;			
КонецЦикла;		


Если Отладка Тогда
	ЗаписьЖурналаРегистрации("Обработка создания связи входящего документа", УровеньЖурналаРегистрации.Информация,,,
		"Процесс завершён");
КонецЕсли;

 

Первым делом получим ссылку на нужный тип связи (1).

Дальше проверим установлена ли эта связь у данного документа (2).

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

Алгоритм, который я предлагаю не самый точный, но рабочий.  Мы проверяем не было ли по новому документу когда-либо сформировано бизнес-процессов «Ознакомление» (3). Этот подход будет верным если при создании входящих документов автоматически не стартуют иные процессы «Ознакомление».

Ну и наконец создаём новый бизнес-процесс «Ознакомление», прикрепляем в качестве основного предмета новый документ и стартуем его выбрав в качестве исполнителя автора документа.

И всё, все счастливы, особенно исполнители исходящих запросов.

Вступайте в нашу телеграмм-группу Инфостарт

Документооборот бизнес-процесс бизнес-событие

См. также

Механизмы типовых конфигураций Программист 1С v8.3 1С:ERP Управление предприятием 2 Россия Бесплатно (free)

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

11.08.2025    2273    user1988284    0    

17

Механизмы типовых конфигураций Программист 1С v8.3 Бесплатно (free)

Каждый, кто работал с кадровыми отчетами в ЗУП, ERP или УХ, сталкивался с механизмом представлений – странным кодом запроса, где поля отображаются пустыми ссылками, а в названии временной таблицы есть слово «Представление». В статье разберем, что такое представления и как ими пользоваться. Больше не нужно ломать голову над тем, откуда и как правильно получать данные. Механизм представлений сделает это за вас.

08.07.2025    5980    user2012581    48    

53

Механизмы типовых конфигураций Программист Стажер 1С v8.3 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Бесплатно (free)

В типовых решениях типа УТ, КА, ERP при вводе строк в поля ввода осуществляется поиск по первым символам. С помощью небольшой доработки (делается через расширение) можно организовать поиск по вхождению.

02.06.2025    1434    lkey    2    

5

Работа с интерфейсом БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист 1С v8.3 1C:ERP Бесплатно (free)

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

12.05.2025    3968    PROSTO-1C    2    

18
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. sulig 66 03.12.20 10:19 Сейчас в теме
Спасибо. Кратко и понятно.
2. e-9 62 01.09.21 18:35 Сейчас в теме
Коллеги, не совсем по теме, но около: есть тестовые базы ДО на двух проектах; на одном работает ЗаписьЖурналаРегистрации (в доп. обработчике, как в этой статье) , на другом, в точно таком же простейшем обработчике - нет. Почему? Ведение ЖР включено на обеих базах, другие события активно пишутся.

Вот этот простейший обработчик (подписка - на изменение внутреннего документа, в той и другой базе):
	ИмяСобытия = "ююю";
	УровеньИнфо = УровеньЖурналаРегистрации.Информация;
	Объект = Событие.Источник;
	Инфо = "тестттт";
	ЗаписьЖурналаРегистрации(ИмяСобытия, УровеньИнфо, , Объект, Инфо);
3. hrom 69 20.11.21 20:15 Сейчас в теме
Простите, что не в тему "Документооборота", но никого не коробит запрос в цикле?

Почему в первом запросе нельзя было написать левое соединение с БизнесПроцесс.Ознакомление.Предметы и в ГДЕ написать что интересуют только документы с результатом соединения есть Null
4. soulner 487 22.11.21 12:22 Сейчас в теме
(3) Очень коробит. Прямо кушать не могу. Спасает только тот факт, что цикл там бывает редко, примерно никогда.
SkAt91; Raduga; +2 Ответить
Для отправки сообщения требуется регистрация/авторизация