Skip to Content

Нумары дакументаў у Odoo 19 з прэфікса, года і лічыльніка — модуль document_number_prefix_year і пастка пры адначасовым стварэнні

3 лістапада 2026 г. | Odoo 19 Community | Уласная распрацоўка
3 лістапада 2026 г. by
Нумары дакументаў у Odoo 19 з прэфікса, года і лічыльніка — модуль document_number_prefix_year і пастка пры адначасовым стварэнні

Модуль document_number_prefix_year для Odoo 19: нумары дакументаў з прэфікса, года і лічыльніка

«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) і колькасць разрадаў задаюцца для кожнай кампаніі ў раздзеле Налады → Нумарацыя дакументаў.

Структура нумара дакумента AN26000001 з прэфікса, года і лічыльніка, з табліцай тыпаў дакументаў

Падтрымліваюцца камерцыйныя прапановы, заказы кліентаў, рахункі кліентам і крэдыт-ноты, накладныя на адгрузку, паступленні тавараў і заказы на закупку. Прэфіксы на ілюстрацыі — толькі прыклады: 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. Стан базы даных, які бачыць транзакцыя, фіксуецца пры яе першым запыце. Карыстальнік B ужо мае гэты стан да таго, як A скончыць працу. Калі B пасля гэтага чакае блакіроўкі і атрымлівае яе, ён чытае са свайго старога стану «найбольшы нумар = 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. У наладах нельга задаць прэфікс з прабеламі або лічбай у канцы.
  • Пераклад. Пераклад на нямецкую мову ўключаны.

Усталяванне і наладжванне

  1. Змясціце папку document_number_prefix_year у каталог, пазначаны ў шляху да дадаткаў.
  2. Абнавіце спіс праграм і ўсталюйце модуль. Для яго працы патрэбныя Продажы, Закупкі, Склад і Бухгалтэрыя.
  3. У раздзеле Налады → Нумарацыя дакументаў задайце прэфіксы, фармат года і колькасць разрадаў.
  4. Спачатку праверце на копіі. Пазней аўтаматычна вярнуць ранейшы нумар дакумента не атрымаецца, а для рахункаў з нумарам звязаныя абавязкі захоўвання і праверкі.

абмежаванні

Шэсць абмежаванняў модуля: кошыкі, фармат года, адна серыя на кампанію, правілы прэфіксаў, мала тэстаў, толькі пералічаныя дакументы

  • Прапановы нумаруюцца пры стварэнні. Выдаленыя або скасаваныя прапановы пакідаюць пропускі. Тое самае датычыцца кожнага заказу кліента, створанага іншым модулем: кошыкі інтэрнэт-крамы (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. Усе нумары ў прыкладах і на ілюстрацыях выбраны адвольна.