При необходимости модифицировать типовую логику конфигурации без снятия с поддержки разработчики часто используют механизм расширений. Рассмотрим типовую ситуацию: в конфигурации «Управление торговлей 11» требуется при формировании задач бизнес-процесса БизнесПроцесс.Задание автоматически создавать напоминание для исполнителя. При попытке перехватить процедуру модуля объекта с помощью директивы &После разработчик сталкивается с синтаксической ошибкой вида: Ожидается определение процедуры/функции &После. Выясним, почему возникает данная ошибка и какими способами можно реализовать требуемую логику.
Разберем пример кода, добавленного в модуль расширения:
&После("ВыполнитьПриСозданииЗадач")
Процедура ВыполнитьПриСозданииЗадач_После(ТочкаМаршрутаБизнесПроцесса, ФормируемыеЗадачи, Отказ)
Сообщить("Ололо");
КонецПроцедуры
Синтаксический контроль платформы выдает ошибку на символе амперсанда директивы. Проанализируем причину такого поведения:
&Перед, &После, &Вместо) для модулей объектов, менеджеров и общих модулей стали поддерживаться платформой начиная с версии 8.3.9. Если у основной конфигурации установлен режим совместимости «Версия 8.3.8» (что характерно для некоторых релизов УТ 11.3), платформа блокирует синтаксис аннотаций методов в расширении. При этом отключение или повышение режима совместимости у самого расширения не дает результата: решающее значение имеет именно режим совместимости конфигурации-владельца.ВыполнитьПриСозданииЗадач в модулях бизнес-процессов часто объявлена без ключевого слова Экспорт. В версиях платформы 8.3.9–8.3.11 механизм расширений позволял модифицировать исключительно экспортные методы. Возможность переопределения неэкспортных процедур появилась позже (в 8.3.12 через &Вместо и в 8.3.14 через &ИзменениеИКонтроль).Посмотрим на практические способы решения задачи создания напоминания исполнителю в таких условиях.
Если бизнес-процесс стартует интерактивно непосредственно пользователем из интерфейса, перехват можно реализовать на уровне управляемой формы, так как модификация форм в расширениях поддерживается на более ранних режимах совместимости:
БизнесПроцесс.Задание.Форма.ФормаОбъекта).ПослеЗаписи или обработчик команды старта процесса).НапоминанияПользователя.Главный недостаток данного подхода заключается в том, что логика не сработает при программном создании или автоматическом продвижении бизнес-процесса (например, регламентным заданием или через фоновые задания).
Вместо попыток вмешаться в логику генерации задач внутри бизнес-процесса более надежно отслеживать момент сохранения самого объекта задачи. Бизнес-процесс при прохождении точки маршрута формирует задачи и выполняет их запись в информационную базу. Целевым объектом здесь является Задача.ЗадачаИсполнителя.
Если режим совместимости конфигурации обновлен до 8.3.9 или выше, перехватим обработчик ПриЗаписи модуля объекта Задача.ЗадачаИсполнителя:
&После("ПриЗаписи")
Процедура Расш1_ПриЗаписи(Отказ)
// Проверяем, что задача новая и относится к нужному виду бизнес-процесса
Если ЭтоНовый() И ТипЗнч(БизнесПроцесс) = Тип("БизнесПроцессСсылка.Задание") Тогда
Если ЗначениеЗаполнено(Исполнитель) Тогда
// Формируем напоминание для исполнителя задачи
НапоминанияПользователя.УстановитьНапоминание(ЭтотОбъект, Исполнитель, СрокИсполнения);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
В типовых конфигурациях на базе БСП для работы с напоминаниями предусмотрен общий модуль НапоминанияПользователя, а сами данные регистрируются в регистре сведений НапоминанияПользователя, где в качестве предмета выступает ссылка на созданный объект Задача.ЗадачаИсполнителя.
Если конфигурация работает в режиме совместимости 8.3.10 и выше, наиболее чистым архитектурным решением является добавление подписки на событие в расширение:
ПодпискаНаСобытие.ЗадачаОбъект.ЗадачаИсполнителя.ПриЗаписи.Этот способ позволяет полностью абстрагироваться от модулей бизнес-процесса и гарантирует срабатывание логики как при интерактивном, так и при фоновом создании задач.
Если режим совместимости 8.3.8 строго зафиксирован и не позволяет использовать подписки и перехват серверных модулей в расширениях, а логику требуется запускать независимо от интерактивных форм, применим регламентную обработку:
Задача.ЗадачаИсполнителя с левым соединением к регистру РегистрСведений.НапоминанияПользователя по полю Предмет.Таким образом, даже при жестких ограничениях режима совместимости платформы можно реализовать требуемую функциональность оповещения пользователей без изменения типовой конфигурации.