„AN26000001“ казва повече от „S00001“: това е оферта, тя е от 2026 г. и е първата. Много предприятия, особено тези, които преминават от по-стара система към Odoo, искат да запазят точно този формат на номерата на документите си. Самият Odoo номерира оферти, поръчки и експедиционни бележки със собствени поредици (S00001, WH/OUT/00001, P00001), а фактурите – с префикса на дневника и годината (INV/2026/00001).
За тази цел разработихме модула Document Numbering by Prefix and Year (document_number_prefix_year) за Odoo 19. Той е достъпен в GitHub като свободен софтуер под лиценз LGPL-3:
github.com/Alex0176/odoo-document-number-prefix-year
Откровено уточнение още в началото: В Biricon IT Services не използваме този модул. Публикуваме го, защото е завършен, документиран и снабден с тестове и може да спести работа на други. Ако ще го използвате, прочетете разделите за ограниченията и тестовете прочетете.
Схемата за номерация
Всеки номер се състои от три части: префикс за съответния вид документ, година и брояч с фиксиран брой цифри. Префиксът, форматът на годината (26 или 2026) и броят цифри се задават за всяка фирма в Настройки → Номерация на документи.
Обхванати са оферти, клиентски поръчки, клиентски фактури и кредитни известия, експедиционни бележки, приемания на стоки и поръчки за покупка. Префиксите на изображението са само примери: AN, AU, RE, GU, LI, WE, BE. Ако оставите даден префикс празен, за съответния вид документ се запазва стандартната номерация на Odoo. Така модулът не променя нищо, докато не го настроите.
Как работи номерацията
- Отначало всяка година. При смяна на годината броячът започва отново от 1.
- Продължаване след импортирани номера. Модулът търси най-големия съществуващ номер със същия префикс и година, независимо от дължината му. Ако в базата данни има
AN26119от старата система, следващата оферта ще бъде с номерAN26000120. Именно затова модулът е подходящ при миграция: старите документи се импортират с оригиналните си номера, а новите продължават номерацията без прекъсване. - Нов номер на поръчка при потвърждаване. По желание потвърдената оферта получава номер от поредицата за поръчки. Номерът на офертата се запазва в полето Номер на офертата в поръчката и се вижда във формуляра, списъка и търсенето.
- Номериране на фактурите при осчетоводяване. Клиентските фактури и кредитните известия получават номер едва при осчетоводяване, а не при създаване. Затова изтритите чернови не оставят пропуски в номерацията. Годината се взема от Датата на фактурата: фактура от 30.12.2025 г., осчетоводена на 2.1.2026 г., получава номер
RE25…. - Всичко останало се запазва. Фактурите от доставчици, плащанията, счетоводните записи и производствените поръчки запазват стандартните поредици на Odoo. Съществуващите имена никога не се променят, дори ако изключите модула.
Деликатният момент: двама потребители едновременно
Собственото присвояване на номера изглежда лесно: намирате най-големия номер и добавяте единица. Но престава да бъде лесно, когато двама потребители създадат оферта в един и същи момент. И двамата прочитат „най-голям номер = 0“ и присвояват AN26000001. За собствените си поредици Odoo използва последователности в базата данни. При самостоятелно реализирана номерация този механизъм липсва, а за офертите и поръчките за покупка в Odoo освен това няма проверка за уникалност на името: два документа с един и същи номер просто се записват.
Очевидната защита е заключване. Модулът поставя заключване в базата данни (PostgreSQL Advisory Lock) за всяка комбинация от фирма, префикс и година, което остава до края на транзакцията. Вторият потребител изчаква първият да приключи. Това обаче не е достатъчно и го установихме чрез опит върху копие на работната база данни:
Odoo работи с ниво на изолация REPEATABLE READ. Състоянието на базата данни, което дадена транзакция вижда, се фиксира при първата ѝ заявка. Потребител Б вече разполага с това състояние, преди А да е приключил. Ако след това Б изчака заключването и го получи, той прочита от старото си състояние „най-голям номер = 0“ и присвоява номера повторно. Заключването е определило реда, но не е обновило видимите данни.
Решението е второ прочитане през отделна, краткотрайна връзка с базата данни, която вижда всички вече потвърдени редове. Използва се по-голямата от двете стойности. Първото прочитане остава необходимо, защото само то вижда номерата, които същата транзакция вече е присвоила, но още не е потвърдила, например при импортиране на няколко документа наведнъж.
Проверихме това с две транзакции, при които доказуемо втората е получила своето състояние преди потвърждаването на първата и след това е изчакала заключването. Без второто прочитане и двете поръчки получиха един и същи номер, а с него – номера 1 и 2.
Важно уточнение: Този опит е ръчна проверка. Той не е част от автоматизираните тестове, защото изисква две реални връзки с базата данни, които тестовата среда на Odoo (една-единствена транзакция за всеки тест) не предоставя.
Техническа реализация
| Документ | Точка на включване |
|---|---|
| Оферта | sale.order.create, когато името е празно, / или New |
| Клиентска поръчка | sale.order.action_confirm, преди стандартното потвърждаване |
| Фактура, кредитно известие | account.move._set_next_sequence, извиква се при осчетоводяване |
| Експедиционна бележка, приемане на стоки | stock.picking.create според вида на операцията |
| Поръчка за покупка | purchase.order.create |
- Брояч. Регулярен израз (
^<Stamm>([0-9]{1,15})$, като специалните символи в основата се екранират) намира най-големия номер за всяка фирма, включително сред имената без зададена фирма. - Фактури.
_set_next_sequenceзаписва името и извиква_compute_split_sequence, за да се запази правилната работа на логиката за номерация в Odoo (префикс, номер и разпознаване на годината за следващата фактура в дневника). - Настройки. Фирмените полета
document_number_*се отразяват вres.config.settings. Настройките не допускат префикси с интервали или с цифра в края. - Превод. Включен е превод на немски.
Инсталиране и настройка
- Поставете папката
document_number_prefix_yearв пътя за допълнителни модули. - Обновете списъка с приложения и инсталирайте модула. Необходими са Продажби, Покупки, Склад и Счетоводство.
- В Настройки → Номерация на документи въведете префиксите, формата на годината и броя цифри.
- Първо изпробвайте върху копие. Номерът на документа не може да бъде върнат автоматично впоследствие, а при фактурите с него са свързани задълженията за съхранение и проверка.
ограниченията
- Офертите се номерират при създаване. Изтритите или анулираните оферти оставят пропуски в номерацията. Същото важи за всяка клиентска поръчка, създадена от друг модул: пазарските колички в онлайн магазина (
website_sale) са поръчки със статус Оферта и всяка използва по един номер. Без пропуски са само фактурите и кредитните известия, защото се номерират при осчетоводяване. - Не променяйте формата на годината, след като сте започнали работа. При основа
AN26модулът прочита съществуващия номерAN2026000001като брояч26000001. Определете формата преди първия документ. - Брояч с най-много 15 цифри. По-дългите поредици от цифри след основата се игнорират при търсенето на най-големия номер.
- Няма отделни поредици за всеки дневник или склад. Броячът е общ за всяка комбинация от фирма, префикс и година. Няколко дневника за продажби споделят един брояч за фактурите.
- Префиксите не могат да съдържат интервали или да завършват с цифра, защото иначе префиксът, годината и броячът вече няма да могат да се разграничават.
- Обработват се само посочените видове документи.
тестовете
Модулът включва десет автоматизирани теста. Те проверяват:
- оферта и потвърждаване: номер на офертата и поръчката, запазване на номера на офертата
- Продължаване на номерацията след импортиран номер (
AN26119→AN26000120) - без последващо преномериране на съществуващи документи
- фактура, кредитно известие и смяна на годината според датата на фактурата
- поръчка за покупка и експедиционни бележки
- празен префикс: запазва се стандартният номер на Odoo
- година с четири цифри
- префикс със специални символи
- няколко номера в една транзакция
- много дългите поредици от цифри се игнорират
Команда за изпълнение:
odoo-bin -d <Testdatenbank> -i document_number_prefix_year --test-enable --test-tags=/document_number_prefix_year --stop-after-init
Тестовете се изпълняват с обикновени транзакции. Поведението при едновременно създаване от двама потребители не е обхванато; то е проверено ръчно върху копие на базата данни, както е описано по-горе. Ако използвате модула в система с много едновременни потребители, повторете тази проверка със собствената си база данни.
Правно уточнение относно номера на фактурата
Съгласно § 11 UStG фактурите трябва да имат пореден номер, който се присвоява еднократно за идентифициране на фактурата. Модулът номерира фактурите при осчетоводяване и използва отделен брояч за всеки префикс и година, което съответства на това изискване. Дали конкретните Ви настройки (няколко дневника, кредитни известия със собствен префикс, смяна на годината) отговарят на изискванията на Вашия данъчен консултант, трябва да уточните с него. Тази публикация не представлява правна консултация.
Често задавани въпроси
Защо просто не се настроят поредиците на Odoo?
При фактурите това е възможно чрез префикса на дневника. За офертите, клиентските поръчки, експедиционните бележки и поръчките за покупка обаче няма обща схема с префикс, година и брояч, който се рестартира при смяна на годината, а броячът не отчита импортирани стари номера. Именно това осигурява модулът.
Презаписва ли се съществуващата номерация?
Не. Модулът присвоява само нови номера. Вече записаните имена остават непроменени, включително при изключване на модула.
Как да го изключа отново?
Изчистете префикса за съответния вид документ. След това Odoo отново ще го номерира самостоятелно. Деинсталирането също не променя вече присвоените номера.
Използвате ли го самите Вие?
Не. При нас се използва стандартната номерация на Odoo. Проверихме модула с автоматизираните тестове и описания ръчен опит, но не и в реална работна среда с много потребители.
Работи ли с Odoo 17 или 18?
Тествали сме го само с Odoo 19.0 Community. Възможно е да работи и с други версии, но не сме проверявали.
Под какъв лиценз се разпространява?
Под LGPL-3. Сигнали за грешки и предложения за подобрения можете да подавате като Issue в хранилището в GitHub и ще се радваме да ги получим.
Съдействие от Biricon IT Services
Поддържаме инсталации на Odoo за малки и средни предприятия: от внедряването през персонализациите и миграциите до текущата експлоатация. Ако искате да запазите номерата на документите си при миграция, да възложите проверка на номерацията под натоварване или да внедрите безопасно модул като този в работната си среда, с радост ще Ви помогнем. Други наши разработки: Търговски регистър и проверка на адреси за австрийски клиенти, Продуктови комплекти като раздел в офертата и Web RBL, списъкът за блокиране на злонамерен трафик.
Актуално към: 3 ноември 2026 г. Версия на модула 19.0.1.0.0. Всички номера в примерите и изображенията са произволно избрани.