V8 Методика перевизначення та виклику обробників подій форми, Книга знань

Ключові слова: обробник, виклик, подія, форма, оновлення, перевизначення, типова, заміна

Наприклад, є конфігурація, яка є доопрацьованою типовою. Ви її постійно оновлюєте та додаєте дедалі більше своїх змін. Оновлювати в загальному випадку з кожним разом стає все складніше і довше. Помітну частину ваших доробок становлять вставки на початок і кінець обробників подій форми. А також нові обробники, які деякі ще й призначають у режимі редагування конфігурації (статично), що ускладнює процес оновлення.

Пропонований метод полягає в тому, щоб оголосити в модулі форми свої обробники подій, які будуть викликати старі обробники та виконувати потрібний код до і після цього виклику. Установка нових обробників буде проводитись у розділі основної програми модуля форми шляхом виклику загальної процедури, скажімо "Встановити ДіюФорми". Ця процедура в динамічно доданому невидимому елементі форми зберігатиме всі старі обробники для кожної перевизначеної події, що дозволить досить просто викликати їх через загальну функцію, скажімо "Отримати Стару ДіюФорми". Дотримуючись рекомендацій 1С, а також для зручності, візьмемо заправило: імена нових обробників слід формувати як [ ][ . ][ ] та параметри їх називати стандартно. Субелементи – елементи всередині елементів форми. Індекси субелементів означають рівень вкладеності.

Випадок 1. Додаємо вставку на початок та кінець наявних у типовій обробників подій форми.

Зазвичай роблять приблизно так.

Все працює і виглядає непогано. Однак після оновлення нам доводиться вручну вносити це в нову версію обробника, якщо в ньому відбулися зміни щодо старого релізу.

Тепер слід робити так.

Таким чином, при оновленні в загальному випадку нам потрібно буде лише додати один блок до розділу операторів основної програми. Строго кажучи, цей блок потрібно помістити в кінець цього розділу, т.к. у ньому можуть бути конкурентні призначення оброблювачів. Однак у типових конфігураціях це трапляється вкрай рідко. Альтернативним варіантом є винесення установки всіх обробників, крімПередВідкриттям, новий обробникПередВідкриттям. Бо розділ основної програми модуля форми майже ніколи не змінюється, то для нього в налаштуванні об'єднання просто приберемо галочку, чим повністю виключимо ручну правку модуля форми після оновлення.

Випадок 2. Додаємо новий обробник події елемента форми.

Зазвичай роблять приблизно так.

Як слід чинити в цьому випадку? Знову за тією ж схемою.

Тепер нам не страшний доданий в одному з майбутніх релізів обробник цієї події та його ім'я! Як тільки він з'явиться, наш обробник його викликатиме там, де ми прописали.

Окремо хочеться згадати про нові елементи форми. Якщо ви додали у форму свій елемент і хочете зробити для нього обробник якоїсь події, то має сенс і в цьому випадку робити так само. Адже в новому релізі можуть додати елемент форми того самого функціонального призначення. Якщо він буде з тим самим ім'ям, що й ваш, то вам після оновлення навіть нічого міняти не доведеться. А якщо ім'я буде інше, то просто потрібно буде виправити назву вашого оброблювача та параметр у виклику його встановлення.

Необхідні процедури та функції загального модуля

Спершу процедура перевизначення події. Для зберігання старих обробників подій ми використовуємо хитрість, запропоновануГенієм 1СКнига знань: v8: Де у формі зберігатипроміжні дані? Суть її полягає в динамічному додаванні нульових розмірів службового елемента форми для зберігання в ньому списку значень у властивостіСписокВибору. Тобто. спочатку перевіряємо чи є елемент форми із заданим ім'ям (у прикладі "старі Обробники"). Якщо його немає, то творимо. Потім отримуємо обробник потрібної дії форми чи елемента форми. Зберігаємо його у властивостіСписокВиборуслужбового елемента форми. Встановлюємо новий обробник, ім'я якого формуємо за нашим правилом [+] [+]. +] [+]. Параметр "пЛиВиключне" відповідає за перевірку наявності старого оброблювача. Така перевірка може знадобитися для призначення обробників, які не викликають старий обробник (наприклад,ПочатокВибору). Параметр "пПсевдонімЕлементуФорми" дозволяє нам призначити кільком однотипним подіям один обробник через вказівку однакового псевдоніма при встановленні обробника.

Тепер функція для отримання виразу мовою 1С, яке можна виконати в модулі форми з метою запуску старого оброблювача і передачі потрібних параметрів. Якщо старого оброблювача не було призначено для події, функція поверне порожній рядок. Спочатку наведено допоміжну функцію отримання рядка аргументів.

Тепер функція для отримання виразу мовою 1С, яке можна виконати в модулі форми з метою запуску актуального оброблювача та передачі йому потрібних параметрів. Якщо актуального обробника не було призначено для події, функція поверне порожній рядок.

Та й допоміжні функції парсингу (розбору) рядка та отримання типу посилання.

Як програмно викликати обробник події форми з її модуля, не прив'язуючись до імені обробника?

В цьому випадку нам допоможе функція ЛксОтриматиДіюФорми(), якаповертає текст для виклику обробника події. Перед здійсненням самого виклику необхідно ініціалізувати параметри оброблювача.

Приклад виклику подіїПочатокВиборудля елемента форми з ім'ям "Склад":

Як програмно викликати обробник події форми будь-якого модуля, не прив'язуючись до імені обробника?

Для цього трюку в модулі форми звичайно доведеться розмістити метод, що виконують довільний код через методВиконати:

Ініціалізацію параметрів обробника події природно необхідно розміщувати у параметрі "Вираз".

Приклад виклику обробника подіїПочатокВиборудля елемента форми з ім'ям "Склад":

Для спрощення створення нових обробників розумно написати загальний шаблон. Ось мій:

Також можна написати приватні шаблони для ще більшого прискорення розробки. Тоді вам навіть не доведеться шукати/згадувати стандартний рядок параметрів обробника події.

Наприклад шаблон для обробника подіїПриЗміні:

А ось шаблон для обробника події кнопки:

Я успішно застосовую цю методику на практиці. Реалізовано уніфіковані обробники однотипних подій форми, що дозволяє не прив'язуватись до імені елемента форми. Багато типів подій обробляються майже глобально при збереженні виклику типових та наявності нових обробників.

Думаю, що описана методика заслуговує на платформну реалізацію.