Особливості роботи механізму автонумерації

Живе на форумі Група: Команда Повідомлень: 3478 З: Одеса Дякую сказали: 1329 разів Рейтинг: 977.8 --> ;

Механізм автонумерації в 1С:Підприємстві 8.1 має на меті забезпечити більш ефективну та передбачувану роботу з номерами порівняно з механізмом автонумерації попередньої версії платформи.

У 1С:Підприємстві 8.1 реалізовано спеціальний менеджер автонумерації, який відповідає за видачу номерів. Використання менеджера автонумерації дозволяє суттєво підвищити паралельність роботи за рахунок відсутності блокувань бази даних.

Механізм автонумерації дозволяє працювати у двох режимах: у режимі з поверненням невикористаних номерів та у режимі без повернення невикористаних номерів. Режим встановлюється властивістю об'єкта метаданих "Конфігурація" РежимАвтонумераціїОб'єктів.

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

Таким чином, для реалізації можливих стратегій нумерації рекомендується використовувати такі значення описаних властивостей:

  • для об'єктів, що вимагають безперервної нумерації - РежимАвтонумераціїОб'єктів = НеЗвільнятиАвтоматично, Автонумерація = НеВикористовувати;
  • для об'єктів, що не потребують безперервної нумерації - РежимАвтонумераціїОб'єктів = НеЗвільняти Автоматично, Автонумерація = Авто;
  • для роботи механізму автонумерації аналогічно версії 8.0 - РежимАвтонумераціїОб'єктів = Звільняти Автоматично, Автонумерація = Авто.

Особливості зберігання номерів та використання префіксів

Механізм автонумерації видає номери у межах просторів номерів і префіксів. Простір номера в залежності від типу об'єкта може містити метадані, власника, період та ін. У межах номерів номер видається в розрізі префіксів. По кожному префіксу зберігається максимальний номер, на підставі якого видається наступний номер. Один і той самий максимальний номер може відповідати кільком префіксам.

Наприклад, у БД зберігається максимальний номер 001. Ми отримали черговий номер префіксу 0, нам повернули 002. Далі, ми отримали черговий номер префіксу 00, нам повернули номер 003, т.к. у цьому випадку максимальний номер відповідає обом префіксам. Механізм автонумерації враховує цей факт та змінює максимальний номер залежних префіксів відповідним чином. Слід зазначити, що на максимальний номер, що відповідає порожньому префіксу, впливає зміна максимального номера за будь-яким префіксом, якщо він перевищує максимальний номер за порожнім префіксом.Наприклад, ми за порожнім префіксом отримали номер 001, далі за префіксом 0 отримали номер 002, далі за префіксом А отримали номер А01, далі за порожнім префіксом отримали номер А02, т.к. максимальний номер за порожнім префіксом відповідає найбільшому з максимальних виданих номерів.

У режимі автоматичного повернення номерів механізм автонумерації кожного простору номерів і префіксу зберігає список вільних номерів. Номер стає вільним, якщо він не записаний у базу даних, а об'єкт було видалено з пам'яті або після автоматичного отримання номера номер встановлено явно. Під явним встановленням номера маємо на увазі будь-яку зміну номера об'єкта, не пов'язане з його автоматичним отриманням. Це може бути програмне встановлення номера через властивість об'єкта Номер або Код (залежно від типу об'єкта) або заповнення номера у формі об'єкта вручну. Номер може бути вільним також при відкаті транзакції.

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

Робота автонумерації врізних режимах

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

При першому отриманні номера за певним простором номерів та префіксом виконується неблокуюче читання максимального номера бази даних, тобто. механізм автонумерації використовує базу даних для отримання максимального номера за певним простором номерів та префіксом лише один раз.

При наступних спробах отримати черговий номер механізм автонумерації використовує вільні номери, а також максимальний номер цього простору номерів і префіксу, як було описано раніше.

При явній установці номера механізм автонумерації збільшує максимальний номер, якщо явно встановлюваний номер більший за максимальний і блокує всі вільні номери менші за явно встановлюваний номер. Блоковані вільні номери не використовуються для отримання чергового номера. При явному встановленні номера префікс не вказується, тому механізм автонумерації використовує вже видані номери для визначення префікса. Для цього по всіх префіксах простору номерів шукається, чи підходить номер, що явно встановлюється, під префікс. Якщо так, знайдений префікс використовується при явній установці номера (таких префіксів може бути кілька). Наслідком цього алгоритму є те, що явне встановлення номера може вплинути на видачу номерів за кількома префіксами. Наприклад, за префіксом 00 ми отримали номер 001, далі за префіксом 0 отримали номер 002, далі ми встановили номер 005, за префіксом 0 буде отримано номер 006, а за префіксом 00 буде отримано номер 007, т.к. префікси 0 та00 є залежними.

При видаленні об'єкта автонумератор повідомляється про цей факт з тим, щоб, якщо максимальний номер простору номерів (або кількох просторах номерів), відповідному номеру, що видаляється, ще не був завантажений, врахувати факт наявності номера, що видаляється при завантаженні максимального номера.

Деякі реквізити об'єкта можуть впливати на номер. Так, наприклад, власник і батько довідника, батько плану виду характеристик, дата документа або бізнес-процесу беруть участь у формуванні простору номерів, в рамках якого видається номер об'єкта. Їх зміна неявно тягне за собою зміну простору номерів об'єкта і еквівалентно тому, як автонумератор реагує на явну установку номера. Наприклад, маємо довідник із нумерацією в межах підпорядкування. Маємо елемент довідника з номером 001, який знаходиться у групі 001. При перенесенні елемента довідника до групи з номером 002 механізм автонумерації повертає номер 001 за простором номерів батька 001 та виконує дії щодо явної установки номера 001 у просторі номерів батька 002.

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

Відновлення за помилково введеного максимального номера

Механізм автонумерації має можливість відновлення максимального номера після виправлення або видалення неправильно введеного максимального номера. Наприклад, маємо поточний максимальний номер АА001, користувач під час введення документа помилився і явно ввів номер ААБСД. Після цього автонумератор запам'ятав введений номер та перестав видавати коректні номери, весь час видаючи номер ААБСД. Користувач виправивнеправильно введений номер документа на АА002. Після цього автонумератор почав видавати правильні номери – АА003, АА004. Альтернативою виправленню може бути видалення об'єкта з неправильно введеним номером.

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

Алгоритм роботи відновлення нумерації наступний:

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