Подписываемся на события
Почему-то многие 1С-девелоперы забывают про использование такой прекрасной штуки как "Подписка на события". При помощи этого объекта конфигурации можно творить настоящую магию во время разработки своих/доработке чужих конфигураций. В чем заключается эта магия? В первую очередь в гибкости метода.
Например, тебе требуется повлиять на запись какого-то объекта. Для пущей наглядности представим, что нам требуется заполнить какой-то реквизит во время записи нового элемента. Эта же операция должна выполняться для пяти разных справочников. Подобную задачу легко решить прямо в лоб: создаем где-нибудь экспортную процедуру и для каждого справочника создаем обработчик события "ПередЗаписью" в котором производим вызов созданной процедуры, выполняющей необходимые действия.
В итоге мы получаем: общий модуль (как вариант) с нашей экспортной процедурой и обработчики события "ПередЗаписью" для каждого справочника. Если появляется новый справочник, то нам опять придется создавать для него обработчик события "ПередЗаписью" и прописывать в нем вызов процедуры.
Такое решение задачи нельзя назвать оптимальным хотя бы по нескольким причинам:
1. Нам необходимо помнить (читай документировать) список справочников, для которых мы определяем однотипный обработчик события "ПередЗаписью". Через определенный промежуток времени трудно вспомнить для каких справочников выполняется данный код, а для каких нет. Чтобы это выяснить придется тупо проверять все.
2. Если завтра потребуется перевесить вызов нашей процедуры на другое событие, то придется опять заходить в каждый справочник и все править вручную. В итоге, чем больше справочников с вызовом процедуры "Х", тем больше проблем мы себе приобретаем. Кроме того, мы опять упираемся в самую первую причину. Мы не можем сразу сказать для каких справочников производится вызов процедуры "Х". Раз не можем, то наверняка где-то забудем переопределить обработчик, и наш код будет работать не так, как мы этого ожидаем.
3. Внося свой код в обработчики событий объектов при доработке типовой конфигурации мы сразу копаем себе могилу с устрашающей надписью на надгробии "Обновление типовой конфигурации затерло мои изменения". Вносить доработки в типовые конфигурации нужно очень осторожно и по возможности стараться не трогать внутренности типовых объектов. Об этом я уже говорил в отдельном посте. Если хочется выполнить свой код перед записью нового элемента справочника (как пример), то ни в коем случае нельзя трогать обработчик "ПередЗаписью", иначе очередное обновление конфы может запросто затереть все твои начинания (если зевнешь).
Можно еще долго перечислять минусы подобного подхода разработки, но я сразу перейду к описанию решения. На мой взгляд, оно полностью перекрывает перечисленные проблемы и выглядит достаточно красиво. Попробуем решить ту же самую задачу (заполнение определенного реквизита у пяти разных справочников) средствами объекта конфигурации "Подписки на события". Последовательность действий будет такой:
1. Создаем новый общий модуль. Я люблю называть такие модули "ПодпискиНаСобытия". Чтобы данный модуль был пригоден для использования в подписках необходимо снять у него флаг "Глобальный" и установить флажок "Сервер" (все это делается в объектном инспекторе).
2. Создаем новый объект конфигурации типа "Подписка на события".
3. В качестве значения для свойства "Источник" (в объектном инспекторе) определяем справочники, за событиями которых, мы будем следить. Ты можешь выбрать как один справочник, так и не сколько. Более того, платформа не ограничивает нас выбором объектов одинакового типа. Ты можешь выбрать справочники и документы. Главное, чтобы нужное событие с одинаковыми параметрами было у обоих типов.
4. Выбираем событие на которое будем оформлять подписку. Для нашей псевдозадачи лучше всего подойдет "ПередЗаписью".
5. Определяем обработчик события - процедура, которая будет вызываться при возникновении выбранного нами события. Ты можешь описать эту процедуру самостоятельно, а можешь в свойстве "Обработчик", созданной подписки нажать на кнопку с изображение лупы. Перед тобой появится окно с выбором модуля, в котором может быть создана процедура для подписки. В нашем случае нужно выбрать модуль "ПодпискиНаСобытия".
Результатом всех этих манипуляций ты получишь заготовку для своей процедуры. Выглядеть она будет примерно так:
Процедура КонтрагентыПередЗаписью(Источник, Отказ) Экспорт КонецПроцедуры;
В созданной процедуре количество параметров больше на один, чем в процедуре-оригинале (ту, которую мы определяем при создании реального обработчика события "ПередЗаписью"). Для любой процедуры, которая создается в рамках подписки, первым параметром всегда будет "Источник". В нем содержится объект-источник для данного события.
Таким образом, мы получили достаточно компактное решение, которое легко поддерживать и масштабировать. Мы всегда можем точно узнать для каким объектов конфигурации оно срабатывает (для это требуется просто заглянуть в свойства подписки), мы не трогали другие объекты конфигурации и нет никаких преград для масштабирования. Думаю, плюсы очевидны.
- Spider_NET's блог
- Добавить комментарий
- 2966 просмотров
Комментарии
3 комментария(ев)Дата: ПТ, 24/02/2012 - 20:58
Я сам буквально недавно познакомился с подпиской на события. Просто офигенная штука. Может быть мега полезно при внесении изменений в типовую конфигурацию. Ибо не нужно править документы\справочники\регистры. Достаточно лишь поставить хук на выполнение определенной операции. Рекомендую всем взять на заметку. =)
Дата: Пнд, 05/03/2012 - 14:22
А при обновление данная фича как себя ведет? Не пропадает?
Дата: Пнд, 05/03/2012 - 18:30
При обновлении, при условии что вы создали новую подписку а не модифицировали существующую, данная фича не пропадет не коим образом!