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