Характеристики на механизма за автономериране

На живо във форума Група: Отбор Публикации: 3478 От: Odessa Изказани благодарности: 1329 пъти Оценка: 977.8 -->

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

1C:Enterprise 8.1 има специален мениджър за автоматично номериране, който отговаря за издаването на номера. Използването на мениджъра за автоматично номериране ви позволява значително да увеличите паралелизма на работа поради липсата на заключване на база данни.

Механизмът за автоматично номериране ви позволява да работите в два режима: в режим с връщане на неизползвани номера и в режим без връщане на неизползвани номера. Режимът се задава от свойството на обекта с метаданни „Конфигурация“ ObjectAutonumberingMode.

  • Стойността на това свойство ReleaseAutomatically е зададена за предварително създадени конфигурации и се използва, за да се гарантира, че режимът на номериране е подобен на версия 8.0. Автоматично получените номера и кодове ще се използват в бъдеще, ако обектът, за който са получени, не е записан. Тази опция трябва да се използва за конфигурации, предназначени за версия 8.0 и използвани във версия 8.1 без промени.
  • Стойността на това свойство Do Not ReleaseAutomatically се използва за поддържане на новото поведение при номериране, въведено във версия 8.1. Предполага се, че тази опция се използва за конфигурации, в които за обекти, изискващи непрекъснато номериране, номерирането ще се прилага при писане, а не при отваряне на формуляра.
Свойството Autonumbering на формуляра на обект (елемент от каталога, документ. ) отговаря за автоматичното получаване на номера при отваряне на формуляра. Ако този имоте посочена стойността Do Not Use, което означава, че при отваряне на формата номерът няма да се попълва, а ще се получава автоматично при запис на обекта.

По този начин, за прилагане на възможни стратегии за номериране, се препоръчва използването на следните стойности на описаните свойства:

  • за обекти, които изискват непрекъснато номериране - ObjectsAutonumbering Mode = Do NotReleaseAutomatically, Autonumbering = Do NotUse;
  • за обекти, които не изискват непрекъснато номериране - Objects Autonumbering Mode = Do NotReleaseAutomatically, Autonumbering = Auto;
  • за механизма за автоматично номериране да работи подобно на версия 8.0 - ObjectsAutonumbering Mode = ReleaseAutomatically, Autonumbering = Auto.

Характеристики за съхраняване на числа и използване на префикси

Механизмът за автоматично номериране генерира числа в контекста на числови интервали и префикси. Числовото пространство, в зависимост от типа на обекта, може да съдържа метаданни, собственик, период и т.н. В числовото пространство номерът се издава в контекста на префикси. За всеки префикс се запаметява максимално издаденият номер, на базата на който се издава следващия номер. Едно и също максимално число може да съответства на няколко префикса.

Например в базата данни се съхранява максималното число 001. Получихме следващото число по префикс 0, върнахме 002. Освен това получихме следващото число по префикс 00, върнахме числото 003, т.к. в този случай максималният брой съответства на двата префикса. Механизмът за автоматично номериране взема предвид този факт и съответно променя максималния брой зависими префикси. Трябва да се отбележи, че максималният брой, съответстващ на празен префикс, се влияе от промяна на максималния брой за всеки префикс, ако надвишава максималния брой за празен префикс.Например, получихме числото 001 от празния префикс, след това от префикса 0 получихме числото 002, след това от префикса A получихме числото A01, след това от празния префикс получихме числото A02, т.к. максималният брой по празен префикс съответства на най-големия от максималните издадени числа.

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

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

Операция за автоматично номериране вразлични режими

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

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

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

При изрично задаване на номера, механизмът за автоматично номериране увеличава максималния брой, ако изрично зададеното число е по-голямо от максималното и блокира всички свободни номера, по-малки от изрично зададеното число. Блокираните безплатни номера не се използват при получаване на следващия номер. При изрично задаване на номера, префиксът не е посочен, така че механизмът за автоматично номериране използва вече издадени номера, за да определи префикса. За целта се търсят всички префикси на числовото пространство, за да се види дали изрично зададеното число пасва на префикса. Ако да, тогава намереният префикс се използва при изрично задаване на номера (може да има няколко такива префикса). Следствие от този алгоритъм е, че изричното задаване на число може да повлияе на изхода на числото за множество префикси. Например по префикс 00 получихме числото 001, след това по префикс 0 получихме число 002, след това зададохме число 005, по префикс 0 ще се получи числото 006, а по префикс 00 ще се получи числото 007, т.к. префикси 0 и00 са зависими.

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

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

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

Възстановяване на неправилно въведеното максимално число

Механизмът за автономериране има възможност да възстанови максималния брой след коригиране или изтриване на неправилно въведен максимален номер. Например, имаме текущия максимален номер AA001, потребителят е направил грешка при въвеждане на документа и е въвел изрично номера AABSD. След това автономераторът запомни въведения номер и спря да издава правилни номера, като през цялото време издава AABSD номера. Коригиран от потребителянеправилно въведен номер на документ на АА002. След това автономераторът започна да издава правилните номера - AA003, AA004. Алтернатива на коригирането може да бъде изтриването на обекта с неправилно въведен номер.

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

Алгоритъмът за възстановяване на номерацията е както следва:

  • След промяна / изтриване на номера на определен обект (в момента на писане / изтриване), автономераторът определя дали максималният брой трябва да бъде нулиран
  • Номерът трябва да бъде нулиран, ако числото, което е променено/изтрито, е било максималното записано число за това числово пространство и не е отворена транзакция, която да е получила или задала числа за това числово пространство
  • Ако номерът трябва да бъде нулиран, тогава автоматичното номериране актуализира номерирането на обекти за даденото числово пространство, като по този начин получава числото, което е станало максимално след промяна/изтриване на текущия номер. След актуализацията всички числа, върнати за повторна употреба, по-големи от максимума, се игнорират
  • Ако след погрешно въведения номер са получени и записани други номера, тогава трябва да коригирате / изтриете всички (включително погрешно въведения). След това номерацията за това числово пространство ще бъде възстановена