Асинхронната концепция за програмиране в "1C Enterprise 8" или изпълнението на програмен код "в

  • програмиране
  • enterprise

Концепция за асинхронно програмиране

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

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

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

програмен

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

програмен

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

Фонови задачи в 1C:Enterprise 8

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

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

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

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

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

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

Преди това автоматичното изпълнение на задачи изискваше стартиране на отделна допълнителна сесия 1C:Enterprise, използвана като планировчик на задачи. И в тази сесия беше необходимо периодично да се изпълнява вграденият езиков метод ExecuteJobProcessing(). Този подход беше доста тромав, неудобен и силно ограничаваше употребатафонови и планирани задачи във файловата версия на работата.

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

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

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

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

Пример за изпълнение на асинхронен код в 1C:Enterprise 8

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

Нека демонстрираме цялата простота и елегантност на асинхронното изпълнение на код в 1C:Enterprise 8!

Стъпка 1. Нека създадем нов IB за разработка на конфигурация

Стъпка 2. В конфигурацията добавете общия модул "AsynchronousHandlers"

Защо добавихме общ модул? Всичко е тукпросто: за извършване на асинхронни операции в 1C:Enterprise 8 се използват фонови задачи, които имат свой собствен мениджър - "BackgroundTask Manager". Този обект има метод "Run", с помощта на който се стартира фоновата задача.

Нека се обърнем към асистента за синтаксис.

концепция

Следователно ще ни трябва общ модул.

програмен

Стъпка 3. В общия модул "AsynchronousHandlers" добавете процедурата за експортиране OurDurationOperation()

Стъпка 4. Добавете обработка "AsynchronousProgrammingConcept" към конфигурацията (можете да създадете външна обработка)

програмиране

Добавете един атрибут към формуляра:

Стъпка 5. Според асистента за синтаксис, попълнете модула на формуляра

Стъпка 6. Стартирайте и тествайте!

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

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

концепция

Можем да отстраняваме грешки в програмния код, който работи на „заден план“, ако зададем подходящото свойство в опциите за отстраняване на грешки.

асинхронната

Пример за изпълнение на асинхронен код в 1C:Enterprise 8 с помощта на BSP

Нека разгледаме пример за внедряване на концепцията за асинхронно програмиране в 1C:Enterprise 8 в BSP, използвайки примера за обработка на Current Affairs.

асинхронната

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

програмен

Нека анализираме програмния код на формата.

Събитието на формуляра "OnCreateOnServer" извиква процедурата "RunBackgroundJob" - това е, от което се нуждаем.

концепция

Без да се разсейваме от нюансите, анализираме тази процедура

програмиране

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

И какво следва? И тогава трябва да хванем момента на задачата.

За да направят това, разработчиците използват метода ConnectWaitHandler( , , ).

програмиране

В процедурата за кука Plugin_CheckJobCompletion() разработчиците извикват функцията JobCompleted(JobIdentifier) ​​​​​

enterprise

Тази функция проверява изпълнението на фоново задание по ID.

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

enterprise

програмен

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