Підписки на події
У статті розглядаються кілька прикладів застосування одного з допоміжних об'єктів платформи «1С: Підприємство 8» - підписок на події.
Підписки на події дозволяють розміщувати в загальних модулях зовнішні обробники, які будуть виконуватися після виконання певного обробника події в модулі об'єкта або модулі менеджера.
При цьому не потрібно вносити зміни в модуль об'єкта або модуль менеджера. Таким чином, виникає можливість програмного розширення модулів без їх модифікації - це дуже корисний прийом при зміні типових рішень.
Підписки на події описуються в гілці Загальні вікна об'єктів конфігурації (Рис.1).
- Виконується обробник події ПередЗапісью () в модулі об'єкта документа.
- Якщо в ході виконання обробника параметр Відмова приймає значення Істина або викликається виняток, то обробка події переривається.
- Якщо на другому кроці обробка події не переривалася, то виконуються зовнішні обробники (підписки на події), визначені для події ПередЗапісью ().
- Якщо в ході виконання зовнішнього обробника параметр Відмова приймає значення Істина або викликається виняток, то виконання зовнішнього обробника переривається.
За допомогою підписок на події можна організувати виконання різних перевірок. виконуються під час запису об'єктів в базу даних.
завдання 1
Виконати перевірку дублювання найменування при записі елемента довідника «Контрагенти» - без модифікації модулів самого довідника.
Прапор Клієнт (звичайна програма) доступний, якщо в параметрах конфігуратора встановлений режим редагування Кероване додаток і звичайна програма.
У гілці Загальні вікна об'єктів конфігурації створити нову підписку на подію. У палітрі властивостей ввести ім'я підписки ПроверкаНаіменованіяСправочніка. В поле вибору Джерело відзначити тип даних СправочнікОб'ект.Контрагенти. В поле вибору Подія вибрати подія ПередЗапісью (). Після відпрацювання цієї події буде спрацьовувати процедура обробки підписки на подію (Рис. 2).
У процедурі ПроверкаНаіменованіяСправочнікаПередЗапісью () виконується запит до довідника Контрагенти. Як параметр запиту передається найменування записується елемента довідника Контрагенти. Якщо елемент з такою назвою вже є в базі даних, то параметр Відмова встановлюється в значення Істина (запис елемента скасовується) і виводиться відповідне діагностичне повідомлення.
Лістинг процедури ПроверкаНаіменованіяСправочнікаПередЗапісью ()
На практиці може зустрітися завдання виконання рухів за додатковими регістрів при проведенні документів в типових конфігураціях. Створення додаткових регістрів дозволяє уникнути модифікації існуючих регістрів і при цьому отримати можливість додаткової обробки даних при проведенні типових документів.
Створити оборотний регістр накопичення «Вибуття грошових коштів» та забезпечити формування рухів з цього регістру при проведенні документа «Видатковий касовий ордер», використовуючи механізм підписок на події.
Створити новий оборотний регістр з ім'ям ВибитіяДенежнихСредств. Вибрати реєстратор «Видатковий касовий ордер». Додати вимірювання регістра:
Створити ресурс регістра:
Створити нову підписку на подію:
Ім'я - ДвіженіяПоВибитіюДенежнихСредств;
Джерело - ДокументОб'ект.РКО;
Подія - ОбработкаПроведенія.
Загалом модулі ОбработчікіПодпісокНаСобитія створити обробник ДвіженіяПоВибитіюДенежнихСредствОбработкаПроведенія (). У обробнику здійснюється обхід табличній частині документа «Видатковий касовий ордер» і формуються руху в регістрі накопичення ВибитіяДенежнихСредств.
Лістинг процедури ДвіженіяПоВибитіюДенежнихСредствОбработкаПроведенія ()
У типових конфігураціях може виникнути необхідність доопрацювання основної форми деякого об'єкту, наприклад документа. Це завдання можна вирішити за допомогою підписок на події. При цьому створюється копія основної форми документа. У нову форму вносяться необхідні зміни. За допомогою механізму підписок на події забезпечується відкриття нової форми замість основної форми. При цьому основна форма, яка перебуває на підтримку, залишається без зміни.
завдання 3
Забезпечити підміну основної форми документа «Видатковий касовий ордер».
Створити нову форму документа «Видатковий касовий ордер» з ім'ям ФормаДокументаКліентская. Внести до форми внесення змін у конструкцію, наприклад, поміняти порядок елементів управління. Для виклику цієї форми необхідно використовувати підписку на подію ОбработкаПолученіяФорми () в модулі менеджера документа «Видатковий касовий ордер».
Створити нову підписку на подію:
Ім'я - ОсновнаяФормаРКО;
Джерело - ДокументМенеджер.РКО;
Подія - ОбработкаПолученіяФорми.
Загалом модулі ОбработчікіПодпісокНаСобитія створити обробник ОсновнаяФормаРКООбработкаПолученіяФорми (). В обробник як параметр ВибраннаяФорма передається ім'я відкривається форми.
Параметр СтандартнаяОбработка встановлюється в значенні Брехня для відключення відкриття основної форми.
Лістинг процедури ОсновнаяФормаРКООбработкаПолученіяФорми ()
Для пошуку підписок на події, визначених для деякого об'єкта конфігурації, можна використовувати механізм пошуку посилань на об'єкти. Для цього потрібно вибрати об'єкт у вікні об'єктів конфігурації і в контекстному меню виконати команду Пошук посилань на об'єкт. В результаті виконання команди у вікні службових повідомлень буде виведений список об'єктів, в яких є посилання на шуканий об'єкт.
Таким чином, підписки на події надають можливість додавання нового функціоналу, не змінюючи існуючі модулі об'єктів. До недоліків підписок на події можна віднести:
Якщо необхідно модифікувати будь-яку подію форми, то механізм підписок на події не доступний. В цьому випадку, необхідно вносити зміни в саму форму або копіювати форму і вносити зміни в новий об'єкт.
Дякуємо! Корисно. Але [Документ] Менеджер і Подія - ОбработкаПолученіяФорми спрацьовує тільки для Керованих форм. У товстому клієнті я не добився. (Потрібна заміна на керовану) :(
У разі явного виклику форми на ім'я з тексту модуля: ОткритьФорму ( «Документ.РКО. [Форма.ФормаДокумента]»): ((.
Питання підтримки доопрацювання типових рішень - залишається відкритим «ДостаточноСложноНет».
Велике спасибі. Гарне докладний опис. За завданню №1 відпрацьовує добре, якщо користувач натискає «записати», а ось якщо натискає відразу «ОК», то випадає повідомлення про помилку:
«...: Помилка при виклику методу контексту (ЗапісатьВФорме)
ЗапісатьВФорме ();
по причині:
Не вдалося записати: «Контрагенти»!
... »