V8 Техника за замяна и извикване на манипулатори на събития на формуляри, Книга със знания

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

Например, има конфигурация, която е модифициран стандарт. Вие непрекъснато го актуализирате и добавяте все повече и повече от вашите промени. В общия случай обновяването става по-трудно и по-дълго всеки път. Значителна част от вашата персонализация е вмъкването в началото и края на манипулатори на събития на формуляра. Както и нови манипулатори, които някои също задават в режим на редактиране на конфигурацията (статично), което допълнително усложнява процеса на актуализиране.

Предложеният метод е да декларирате свои собствени манипулатори на събития в модула на формуляра, който ще извика старите манипулатори и ще изпълни необходимия код преди и след това извикване. Задаването на нови манипулатори ще се извърши в основната програмна секция на модула на формуляра чрез извикване на обща процедура, да речем „SetFormAction“. Тази процедура върху динамично добавен невидим елемент на формуляр ще запази всички стари манипулатори за всяко отменено събитие, което прави сравнително лесно извикването им чрез обща функция, да речем „GetOldFormAction“. Следвайки препоръките на 1C, а също и за удобство, нека вземем правилото: имената на новите манипулатори трябва да се формират като [ ][ . ][ ] и параметри, за да ги наречем стандартни. Поделементите са елементи в елементите на формата. Индексите на поделементите показват нивото на вложеност.

Случай 1. Добавяме вмъкване в началото и края на манипулаторите на събития във формата, налични в стандартната форма.

Обикновено го правят така.

Всичко работи и изглежда добре. Въпреки това, след актуализацията, ние трябва ръчно да добавим това към новата версия на манипулатора, ако се е променило по отношение на старото издание.

Сега трябва да направите това.

По този начин, когато актуализираме, като цяло ще трябва да добавим само един блок към секцията с изявления на основната програма. Строго погледнато, този блок трябва да бъде поставен в самия край на този раздел, т.к може да съдържа едновременни присвоявания на манипулатори. Това обаче е изключително рядко в типичните конфигурации. Алтернатива е да преместите настройката на всички манипулатори с изключение наBeforeOpenкъм нов манипулаторBeforeOpen. Тъй като разделът на основната програма на модула формуляр почти никога не се променя, ние просто ще премахнем отметката от квадратчето за него в настройката за сливане, което напълно ще изключи ръчното редактиране на модула формуляр след актуализацията.

Случай 2: Добавяне на нов манипулатор на събитие на елемент на формуляр.

Обикновено го правят така.

Какво трябва да се направи в този случай? Отново по същия начин.

Сега не се страхуваме от манипулатора на това събитие, добавен в една от бъдещите версии и неговото име! Веднага щом се появи, нашият манипулатор ще го извика там, където сме се регистрирали.

Отделно бих искал да спомена новите елементи на формата. Ако сте добавили вашия елемент към формуляра и искате да направите манипулатор на събития за него, тогава има смисъл да направите същото в този случай. Всъщност в новата версия те могат да добавят елемент на форма със същата функционална цел. Ако има същото име като вашето, тогава дори няма да се налага да променяте нищо след актуализацията. И ако името е различно, тогава просто трябва да коригирате името на вашия манипулатор и параметъра в извикването, за да го инсталирате.

Необходими процедури и функции на общия модул

Първо, процедурата за предефиниране на събитието. За да съхраняваме стари манипулатори на събития, ние използваме трик, предложен отGenius 1CBook of Knowledge: v8: Къде да съхраняваме във формулярамеждинни данни? Неговата същност е динамично добавяне на нулеви размери към обслужващия елемент на формуляра, за да съхрани списъка със стойности в него в свойствотоSelectionList. Тези. Първо проверяваме дали има елемент на формуляр с даденото име (в примера "pOldHandlers"). Ако не съществува, тогава ние го създаваме. След това получаваме манипулатора за желаното действие на формуляр или елемент на формуляр. Записваме го в свойствотоSelectionListна сервизния елемент на формата. Инсталираме нов манипулатор, чието име се формира според нашето правило [ + ] [ + . + ] [ + ]. Параметърът "pLiExclusive" отговаря за проверката на наличието на стария манипулатор. Такава проверка може да е необходима за присвояване на манипулатори, които не извикват стария манипулатор (напримерSelectionStart). Параметърът "pFormElementAlias" ни позволява да присвоим един и същ манипулатор на няколко събития от един и същи тип, като посочим един и същ псевдоним, когато задаваме манипулатора.

Сега функция за получаване на израз на езика 1C, който може да се изпълни в модула на формуляра, за да стартира стария манипулатор и да му предаде необходимите параметри. Ако старият манипулатор не е бил присвоен на събитието, функцията ще върне празен низ. Първо, има помощна функция за получаване на низ от аргументи.

Сега функция за получаване на израз на езика 1C, който може да се изпълни в модула на формуляра, за да стартира действителния манипулатор и да му предаде необходимите параметри. Ако към събитието не е присвоен действителен манипулатор, функцията ще върне празен низ.

Е, помощни функции за парсване (парсване) на низ и получаване на типа на връзката.

Как програмно да се извика манипулатор на събитие на формуляр от неговия модул, без да се обвързва с името на манипулатора?

В този случай ще ни помогне функцията LxGetFormAction(), коятовръща текста за извикване на манипулатора на събития. Преди да се изпълни самото извикване, е необходимо да се инициализират параметрите на манипулатора.

Пример за извикване на събитиетоChoiceStart​​​​за елемента на формуляра с име "Warehouse":

Как да извикате програмно манипулатор на събитие на формуляр от който и да е модул, без да сте обвързани с името на манипулатора?

За този трик, в модула на формуляра, разбира се, ще трябва да поставите метод, който изпълнява произволен код чрез методаRun:

Инициализирането на параметрите на манипулатора на събития естествено трябва да се постави в параметъра "Израз".

Пример за извикване на манипулатора на събитиеChoiceStart​​​​за елемента на формуляра с име "Warehouse":

За да улесните създаването на нови манипулатори, е разумно да напишете общ шаблон. Ето го моя:

Можете също така да пишете частни шаблони, за да ускорите още повече разработката. Тогава дори не е нужно да търсите/запомняте низа на параметрите на стандартния манипулатор на събития.

Например шаблон за манипулатора на събитиеOnChange:

А ето и шаблона за манипулатора на събития на бутона:

Приложих тази техника успешно на практика. Внедрени унифицирани манипулатори за еднотипни събития на формуляра, което ви позволява да не сте обвързани с името на елемента на формуляра. Много видове събития се обработват почти глобално, като същевременно се запазва извикването на типовите и наличието на нови манипулатори.

Мисля, че описаната техника заслужава внедряване на платформа.