Всички абонаменти за събития. Присвояване на манипулатори на събития с помощта на абонаменти за събития 1c абонамент за събитие след запис

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

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

Приложимост

Статията разглежда платформата 1C:Enterprise версия 8.3. Представената информация е подходяща за текущите версии на платформата.

Абонаменти за събития

Статията разглежда няколко примера за използване на един от спомагателните обекти на платформата 1C:Enterprise 8 - абонаменти за събития.

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

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

Абонаменти за събитияса описани в темата са често срещанипрозорци на конфигурационен обект (фиг. 1).

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

  1. Работи манипулатор на събития BeforeWrite()в обектния модул на документа.
  2. Ако по време на изпълнение на манипулатора параметърът Отказпридобива стойност Вярноили се повдигне изключение, обработката на събитието се прекъсва.
  3. Ако обработката на събитието не е била прекъсната във втората стъпка, тогава се изпълняват външни манипулатори (абонаменти за събитие), дефинирани за събитието BeforeWrite().
  4. Ако по време на изпълнение на външния манипулатор параметърът Отказпридобива стойност Вярноили е хвърлено изключение, изпълнението на външния манипулатор се прекъсва.

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

Проблем 1

Проверете за дублиране на имена, когато записвате елемента на директорията „Контрагенти“ - без да променяте модулите на самата директория.

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

Флаг Клиент (обикновено приложение)наличен, ако в параметрите на конфигуратора е зададен режим на редактиране Управлявано приложение и редовно приложение.

В темата са често срещанипрозорец за конфигурационни обекти създайте нов абонамент за събитие. В палитрата със свойства въведете името на абонамента Проверка на името на директорията. В полето за избор Източникмаркирайте тип данни DirectoryObject.Counterparties. В полето за избор Събитиеизберете събитие BeforeWrite(). След като това събитие бъде обработено, ще се задейства процедурата за обработка на абонамент за събитие (фиг. 2).

В полето за избор Манипулаторпоказва общия модул, в който се намира манипулаторът на абонамент за събитие. Кликнете върху бутона Отвори в това поле и изберете модула Обработчици на абонаменти за събитияи натиснете Добре. Системата автоматично ще създаде процедура в общия модул с параметри ИзточникИ Отказ. В параметъра Източниксе предава обект, за който е създаден абонамент за събитие – DirectoryObject. . В параметъра Отказзнакът за отказ от записване на елемента се предава.

В процедура Проверка на DirectoryNameBeforeRecording()изпълнява се заявка към директория Контрагенти. Името на записвания елемент на директорията се предава като параметър на заявката Контрагенти. Ако елемент със същото име вече е в базата данни, тогава параметърът Отказе зададено на стойност Вярно(въвеждането на елемента се отменя) и се извежда съответното диагностично съобщение.

Списък на процедурите Проверка на DirectoryNameBeforeRecording()

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

Проблем 2

Създайте регистър за договаряне на натрупване „Изхвърляне“ Пари” и осигурете формирането на движения в този регистър при осчетоводяване на документа „Касов разходен ордер”, като използвате механизма за абонаменти за събития.

Създайте нов договаряем регистър с името Разпореждания с пари в брой. Изберете регистратора „Нареждане за касова бележка“. Добавете размери на регистъра:

Създайте ресурс за регистър:

Сума, Тип Номер, Дължина – 15, точност – 2.

В документ “Разходен касов ордер” създайте реквизитите СтатияДвиженияс тип данни DirectoryLink.ArticlesMoneyMovements.

Име - Движения по разпореждане с парични средства;
източник - DocumentObject.RKO;
събитие - ОбработкаПровеждане.

В общия модул Обработчици на абонаменти за събитиясъздайте манипулатор . Процесорът заобикаля табличната част на документа „Разходен касов ордер” и генерира движения в натрупващия регистър Разпореждания с пари в брой.

Списък на процедурите Движения при изхвърляне на CashProcessingProcessing()

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

Проблем 3

Осигурете подмяната на основната форма на документа „Разходен касов ордер“.

Създайте нов документ формуляр „Касов ордер” с име DocumentFormClient. Направете произволни промени във формуляра, например променете реда на контролите. За да извикате този формуляр, трябва да използвате абонамент за събитие ProcessGetForm()в модул за управление на документи “Приходен касов ордер”.

Създайте нов абонамент за събитие:

Име - MainFormRKO;
източник - DocumentManager.RKO;
събитие - ProcessingFormReceive.

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

Списък на процедурите MainFormRKOFormReceivingProcessing()

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

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

  • Нарастваща сложност на алгоритмите.
  • Можете да се абонирате само за събития на обекти и мениджъри на обекти.

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

При разработването или модифицирането на приложни решения на платформата 1C:Enterprise 8.x много често е необходимо да се извършат стандартни действия за група конфигурационни обекти (например директории). За да не се описват действията, извършвани в модула на всеки обект, разработчикът може да използва стандартния механизъм на платформата - абонамент за събития.

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

Стандартно поведение

Нека нашият пример използва определена директория "SimpleDirectory". Той има абонаменти за събития, създадени за всяко събитие, в което разработчикът може да се намеси. Процедурите за обработка на събития се намират в съответния общ модул на сървъра.

Редът на извикване на манипулатори на абонаменти е същият като при стандартното поведение на платформата при работа с този обект. Тъй като в нашия пример обмисляме работа с директория, предлагам да разгледаме схемата за извикване на манипулатори в зависимост от действия с обект (вижте следващата екранна снимка).

Както виждаме, в началния етап се извикват манипулаторите на събития „ProcessingFill“ (за създаване на нов елемент) или „On Copying“ (за създаване на елемент въз основа на съществуващ). И в двата случая, след извикване на посочените манипулатори, се изпълнява процедурата "OnInstallNewCode", където разработчикът може да зададе префикс в кода или да замени поведението на платформата при присвояване на нов код.

При записване на елемент от директория, дали нов елементили съществуващи се наричат ​​три манипулатора: “ProcessingFillCheck” (на този етап манипулаторът може да провери коректността на въведените данни и, ако има грешки, да откаже запис), “BeforeWrite” (докато обектът не бъде записан в базата данни, можете да коригирате стойностите на детайлите и да проверите кои - допълнителни условия) и след това „OnRecord“ (направен е запис в базата данни, но транзакцията не е затворена, разработчикът може да провери данните след записа и, ако е необходимо, анулирайте транзакцията).

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

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

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

Недокументираната страна

Сега нека разгледаме една интересна ситуация. Да кажем, че за нашата директория "SimpleDirectory" са дефинирани три абонамента за събитието "BeforeRecord":

В какъв ред смятате, че ще бъдат извикани манипулаторите за тези абонаменти? Нека не гадаем. Ще дам резултата от записването на елемент, където манипулаторът за всеки абонамент показва съобщение с името на извикания абонамент (вижте следната екранна снимка).

От екранната снимка не е трудно да се досетите, че редът на извикване на процедурите за обработка на абонаменти за събития съответства на реда на обектите с метаданни в клона „Абонаменти за събития“. Тази функция не е описана в никаква справочна литература за платформата 1C:Enterprise, така че трябва да внимавате, когато я използвате в конфигурацията, тъй като недокументираните функции могат да се променят от версия на версия на 1C:Enterprise и в същото време да отсъстват от списък с промени в програмата.

Отстъпление

Може да попитате: „Защо да създавате множество абонаменти за едно събитие на конфигурационен обект?“ Отговорът е лесен. Ако няколко души участват в разработката, тогава намесата в създадените от тях механизми може да доведе до неправилна работапрограми. В такива случаи най-логичното би било да се създадат отделни абонаменти за събития за всеки разработчик в съответствие с поставената задача. Разбира се, възможно е в бъдеще те да бъдат комбинирани в една процедура за обработка.

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

Много често има нужда да се присвои манипулатор на цял документ или няколко отделни наведнъж. Например всеки документ съдържа атрибута „Потребител“. Или просто добавихме такъв общ реквизит. Можем да видим дали този детайл е попълнен само като сами наблюдаваме целия процес. Но как да направим това?

Абонаменти за събития в 1C

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

Задайте име и добавете нов абонамент към събитието 1C

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

Когато казваме „документи и справки“, ние много опростяваме нещата, защото в действителност можете да използвате много различни обекти. Един недостатък е, че не можете да се абонирате за събития във формата.

Броят на събитията, които могат да бъдат избрани, зависи от самия обект. Трябва да сте много внимателни, защото ако изберете много обекти, списъкът ще ви покаже само онези събития, които всеки от избраните обекти може да има. (Събития, които са общи за всички избрани обекти).


След като завършите всички тези стъпки, всичко, което остава, е да създадете манипулираща функция. За да направите това, трябва да имате общ модул в конфигурацията с отметка до елемента „Северен“. Когато щракнете върху бутона „лупа“, ще се създаде манипулираща функция.

Успяхме да абонираме всички документи за събитието „Преди запис“. Сега функцията ще се изпълнява при запис на всеки документ, който съдържа проверка. Ако проверката е отрицателна, тогава, за да откажете да запишете документа, трябва да зададете параметъра на функцията
Неуспех = Вярно.

Тази статия е анонс на нова функционалност.
Не се препоръчва да използвате съдържанието на тази статия, за да научите нови функции.
Пълно описаниенова функционалност ще бъде предоставена в документацията за съответната версия.
Пълен списъкпромените в новата версия са изброени във файла v8Update.htm.

Внедрено в EDT версия 1.7.0.567.

В 1C:Enterprise Development Tools (EDT) внедрихме прототип на нов инструмент. Работното име на този инструмент е редактор Всички абонаменти за събития. Това ще ви помогне удобно да анализирате абонаментите за всички събития, които съществуват в решението на приложението.

Абонаменти за събития

Платформата 1C:Enterprise ви позволява да създавате абонаменти за събития на конфигурационни обекти в приложното решение. Абонаментът е процедура, която ще бъде изпълнена след изпълнението на оригиналния манипулатор на събития. Удобството на абонаментите се крие във факта, че една процедура може да бъде „абонирана“ за събитие, принадлежащо към различни конфигурационни обекти. Така, ако има алгоритъм, който трябва да се изпълни както при запис на организация, така и при запис на отдел, той може да се намира в абонамента и тогава дори няма да се налага да променяте манипулаторите за това събитие в самите обекти.

Оказва се, че абонаментът е удобен и универсален механизъм. Но в големите приложни решения броят на абонаментите за събития може да достигне няколкостотин. Става неудобно да ги анализирате в конфигурационното дърво, в линеен списък. Например в решение за приложение 1C:Enterprise management (ERP)повече от 340 абонамента за събития.

EDT прави работата с абонаменти донякъде по-лесна, като ги показва в панела Схема, когато се отвори модул на обект на приложение.


Това показване на абонаменти е удобно за редица задачи, свързани с редактиране на модул. Но все още не е подходящ, когато трябва бързо да намерите и анализирате всички алгоритми, които се изпълняват в абонаменти, когато настъпи определено събитие.

Всички абонаменти за събития

За да се отървем от неудобствата, изброени по-горе, внедрихме универсален начин за представяне на абонаменти, събития, конфигурационни обекти и процедури, в които са внедрени алгоритми за абонамент.


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


От лявата страна редакторът показва всички събития и във всяко събитие всичките му абонаменти. Когато изберете конкретен абонамент, горе вдясно се показва списък с конфигурационни обекти, за чиито събития абонаментът е „абониран“. А модулът и процедурата, в която се намира алгоритъмът за абонамент, са показани долу вдясно. Чрез двукратно щракване върху процедура можете да я отворите във вградения езиков редактор.

Докато сте в редактора, можете да анализирате не само отделни абонаменти, но и всички абонаменти, свързани с едно събитие. Ако изберете събитие, редакторът ще покаже всички модули и всички процедури, подписани за обработка на това събитие.


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


Извикването на редактора чрез контекстна команда (на конфигурационен обект) ви позволява незабавно да намалите броя на абонаментите, показани в редактора. Например, можете да преглеждате абонаменти само за онези събития, които се обработват в обектния модул или в модула на мениджъра.


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


Обърнете внимание, че с този филтър можете да избирате не само конкретни обекти, които са източник на събития, но и набори от типове като DirectoryObject, Обект на документи други. Такива набори от типове включват всички директории или всички документи, които са в конфигурацията.

Чрез търсене по низ можете бързо да намерите само тези абонаменти, които се отнасят до механизма, който ви интересува.


По всяко време можете бързо да филтрирате съдържанието по събитие или източник, показан в редактора. Например намерихте абонамент Проверете формулата за изчисление. Неговият източник е планът на видовете изчисления Задържа.


Използвайки контекстната команда в плана за типове изчисления, можете бързо да видите само тези абонаменти, които са свързани с неговите събития.


Автоматично добавяне на точки на прекъсване

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

Първо, можете да извикате този инструмент директно в редактора.


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


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


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


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

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

Преди да записваме всеки документ, искаме да проверим дали този детайл е попълнен.

Как да го направим?

Абонаменти за 1C събития

Абонаментът за 1C събития е , той се намира в клона за конфигурация Общи/Абонаменти за 1C събития.

Абонирането за 1C събитие ви позволява да зададете манипулатор, когато възникне събитие за няколко обекта (директории, документи).

Нека добавим нов абонамент към събитието 1C и зададем името.

В свойството за абонамент за събитие 1C Източник - трябва да изберете един или повече документи, директории - обекти, върху които поставяме манипулатора.

В свойството за абонамент за събития 1C трябва да изберете една от опциите за стандартни събития, които могат да възникнат с избраните документи и директории.

Ние опростяваме, като казваме „документи и справочници“ - всъщност можете да използвате много 1C обекти. За съжаление не можете да се абонирате за събития на 1C форма - например при отваряне на формуляр, за което много програмисти съжаляват.

Наборът от възможни събития зависи от обекта. Бъдете внимателни, защото ако изберете няколко (множество) обекта, тогава списъкът със събития ще съдържа само онези събития, които всеки от избраните обекти може да има (т.е. събития, общи за всички избрани обекти).

След това всичко, което остава, е да създадете функция за обработка. За да направите това, конфигурацията трябва да има отметка в квадратчето за сървър в свойствата. Когато щракнете върху бутона "лупа", ще се създаде функция - манипулатор.

Всичко! Току-що се абонирахме за събитието 1C BeforeRecording за всички документи. Сега, когато записваме всеки документ, ще се изпълнява нашата функция, която включва проверка.

За да откажете да напишете документ, ако проверката е отрицателна, трябва да зададете параметъра на функцията

Дял