<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="uk">
	<id>https://wiki.erp.kyiv.ua/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=R</id>
	<title>K2 ERP Wiki - Внесок користувача [uk]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.erp.kyiv.ua/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=R"/>
	<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A1%D0%BF%D0%B5%D1%86%D1%96%D0%B0%D0%BB%D1%8C%D0%BD%D0%B0:%D0%92%D0%BD%D0%B5%D1%81%D0%BE%D0%BA/R"/>
	<updated>2026-08-05T07:20:12Z</updated>
	<subtitle>Внесок користувача</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%96%D0%B4_%D0%B3%D1%83%D1%80%D0%BA%D1%96%D1%82_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D0%B8%D1%85_%D1%80%D0%B0%D0%BA%D0%B5%D1%82_%D0%B2%D0%BE%D0%BD%D0%B8_%D0%B7%D0%B0%D1%85%D0%B8%D1%89%D0%B0%D1%8E%D1%82%D1%8C_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D1%83_1%D0%A1&amp;diff=2772</id>
		<title>Під гуркіт російських ракет вони захищають російську 1С</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%96%D0%B4_%D0%B3%D1%83%D1%80%D0%BA%D1%96%D1%82_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D0%B8%D1%85_%D1%80%D0%B0%D0%BA%D0%B5%D1%82_%D0%B2%D0%BE%D0%BD%D0%B8_%D0%B7%D0%B0%D1%85%D0%B8%D1%89%D0%B0%D1%8E%D1%82%D1%8C_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D1%83_1%D0%A1&amp;diff=2772"/>
		<updated>2026-07-19T06:25:52Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Бухгалтер 1С.png|центр|міні|800x800пкс|Під гуркіт російських ракет вони захищають російську 1С]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Як коментарі під TAX Podcast показали справжній масштаб технологічної залежності України&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#fff1f1; border-left:6px solid #c62828; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Знову грім. Знову вибухи. Знову Київ та інші українські міста прокидаються від російських ракет. А паралельно частина українського бізнесу продовжує захищати російську технологічну платформу, ніби дванадцять років війни — це ще недостатня причина хоча б почати думати про технологічну незалежність.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Росія вкотре намагається знищити нашу енергетику, підприємства, будинки, життя і саме право України бути незалежною державою. А майже в той самий час під подкастом про небезпеку російського програмного забезпечення з’являються українські коментатори, які кидаються захищати 1С і BAS з такою відданістю, ніби їм за це вже нараховують премію — обов’язково через документ «Нарахування лояльності агресору».&lt;br /&gt;
&lt;br /&gt;
Саме це стало для мене справжнім шоком після виходу [https://www.youtube.com/watch?v=fKgTSDcHUAo&amp;amp;list=PLRyc83tAN5QOOCknL2Bv_gHaz0Yzgyehe TAX Podcast про 1С, BAS, санкції та майбутнє українського бізнесу]. Тема випуску була сформульована гранично чітко: чому тисячі українських компаній досі працюють на 1С і BAS, які ризики несе така залежність, чому бізнес відкладає перехід і хто повинен брати на себе відповідальність за зміну корпоративної інформаційної системи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;У подкасті взагалі не було реклами K2 ERP.&#039;&#039;&#039; Там не проводилася презентація продукту, не демонструвалися модулі, не показувалися інтерфейси, не оголошувалися тарифи і не звучали заклики негайно щось купувати. K2 ERP згадувалася лише там, де це було природно й необхідно: як доказ того, що українські технологічні альтернативи існують і що українські розробники здатні створювати власні ERP-платформи.&lt;br /&gt;
&lt;br /&gt;
Більша частина розмови була присвячена боротьбі з ворожим програмним забезпеченням, походженню 1С і BAS, санкціям, кіберризикам, відповідальності власників бізнесу та необхідності розвивати власні технології. Проте частина аудиторії вперто не захотіла чути саме це.&lt;br /&gt;
&lt;br /&gt;
Замість розмови по суті почалося колективне виробництво інформаційного шуму. Хтось оголосив випуск «PR-подкастом». Хтось вирішив, що K2 ERP нібито хоче «прийти на все готове» і забрати собі ринок 1С та BAS. Хтось витягнув максимальну можливу ціну майбутньої комплектації й почав доводити, що український продукт дорогий. Інші заявили, що наведені аргументи — «не аргументи», а в студії нібито сидять люди, які не розуміють, про що говорять.&lt;br /&gt;
&lt;br /&gt;
Виникло дивне відчуття, що під відео працює не група живих людей, а погано налаштований бот, якому завантажили один-єдиний сценарій: &#039;&#039;&#039;за будь-яку ціну не допустити розмови про російську природу 1С і BAS&#039;&#039;&#039;. Не відповідай на поставлене питання. Не аналізуй ризики. Не сперечайся з основною тезою. Переведи розмову на особистість спікера, знайди максимальну ціну, вимагай нескінченних доказів, оголоси все рекламою — і головна проблема потоне у болоті другорядних суперечок.&lt;br /&gt;
&lt;br /&gt;
== Коли немає відповіді по суті, усе оголошують рекламою ==&lt;br /&gt;
&lt;br /&gt;
Назвати подкаст рекламним — найпростіший спосіб його не слухати. Це дуже зручна інтелектуальна послуга: думати не потрібно, перевіряти сказане не потрібно, відповідати на незручні питання також не потрібно. Достатньо приклеїти ярлик «PR», після чого можна з почуттям виконаного громадянського обов’язку повернутися до російського конфігуратора.&lt;br /&gt;
&lt;br /&gt;
Але давайте все ж повернемося до змісту. У подкасті обговорювали, чому український бізнес досі залишається на 1С і BAS, хто відповідає за вибір корпоративного програмного забезпечення, які ризики створює технологічна залежність і чому підприємства роками відкладають перехід. Говорили про санкції, кібербезпеку, вартість міграції, опір персоналу, роль керівників та про відсутність системної державної політики.&lt;br /&gt;
&lt;br /&gt;
Коли людина після такої розмови пише лише про «рекламу K2 ERP», це не критика подкасту. Це демонстрація того, що вона або не слухала випуск, або свідомо намагається розмити його зміст. Бо обговорювати справжню проблему незручно. Доведеться визнати, що дванадцять років війни підприємство працювало на російській технологічній основі, не створило плану переходу і тепер гарячково шукає пояснення, чому багаторічну бездіяльність потрібно вважати професійною мудрістю.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Оголосити розмову рекламою значно легше, ніж відповісти на просте запитання: чому під час війни ваш бізнес досі працює на російській платформі?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== BAS — це не споріднена технологія. BAS — це 1С ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#eef6ff; border-left:6px solid #1565c0; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;BAS — це 1С. Не «схожа система», не «споріднена технологія» і не нова незалежна українська платформа. Це 1С, перейменована та перефарбована для продовження роботи на українському ринку. Зміна логотипу не змінила технологічної суті продукту.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тут не потрібно ховатися за дипломатичними формулюваннями. Це та сама технологічна природа: конфігуратор, метадані, довідники, документи, регістри, форми, модулі, запити, механізми проведення та загальна модель розробки.&lt;br /&gt;
&lt;br /&gt;
BAS не виникла як нова українська технологія, створена з нуля українськими інженерами. Вона з’явилася як спосіб продовжити використання продуктів екосистеми 1С після того, як російський бренд став токсичним, санкційним і незручним для відкритого просування на українському ринку.&lt;br /&gt;
&lt;br /&gt;
Змінили напис на заставці. Перемалювали логотип. Перепакували маркетинг. Почали переконувати ринок, що це вже нібито зовсім інший продукт. Але людина, яка хоча б раз відкривала конфігуратор, працювала з метаданими, запитами, формами, документами та регістрами, чудово розуміє, що відбулося.&lt;br /&gt;
&lt;br /&gt;
Один із коментаторів намагався довести, що BAS нібито стала іншою технологією, тому що в окремих функціях запитів виникли відмінності, а російська 1С за цей час «пішла вперед». Це приблизно як доводити, що автомобіль перестав бути автомобілем, тому що у новішій моделі переставили кнопку підігріву сидіння.&lt;br /&gt;
&lt;br /&gt;
Відмінності між релізами, конфігураціями чи окремими функціями не змінюють технологічної природи продукту. Навпаки, саме твердження, що BAS колись відокремилася від 1С, уже визнає її походження. Далі залишається здійснити надзвичайно складну інтелектуальну операцію: скласти два і два.&lt;br /&gt;
&lt;br /&gt;
Коли людина десять років працює в BAS, але жодного разу не відкрила конфігуратор і не зрозуміла, на якій платформі працює, це сумно. Коли вона після цього починає повчати розробників ERP-платформ і називати їх теоретиками — це вже комедія. Щоправда, комедія дуже дорога: квиток на неї десятиліттями оплачує весь український бізнес.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BAS не стала українською технологією через зміну напису на заставці. Перейменування продукту — це не технологічне імпортозаміщення. Це лише імпортозаміщення логотипу.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Перефарбована нафта, перефарбований газ і перефарбована 1С ==&lt;br /&gt;
&lt;br /&gt;
Механізм знайомий до болю. Російську нафту можна провести через посередника, змішати з іншою партією, змінити документи й маршрут. Російський газ можна кілька разів перепродати, пустити іншою трубою і назвати товаром іншої компанії. Російський бізнес можна переписати на нового власника, зареєструвати іншу юридичну особу та намалювати європейський логотип.&lt;br /&gt;
&lt;br /&gt;
Але походження від цього не змінюється. Нафта не стає демократичною після зміни танкера. Газ не вивчає європейські цінності під час проходження митниці. Російський бізнес не очищується від свого минулого після заміни таблички біля входу.&lt;br /&gt;
&lt;br /&gt;
Так само й 1С не стала українською після того, як на її місці з’явилися три латинські літери BAS. &#039;&#039;&#039;Перефарбування російського продукту не робить його українським. Воно лише дозволяє користувачеві психологічно комфортніше продовжувати робити те саме.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Найдивовижніше, що ця операція виявилася надзвичайно успішною. Для великої частини ринку зміни логотипу було достатньо, щоб оголосити проблему вирішеною. Раніше підприємство працювало на 1С, тепер воно працює на BAS — отже, у красивій презентації російського програмного забезпечення нібито стало менше.&lt;br /&gt;
&lt;br /&gt;
Те, що бухгалтер відкриває той самий конфігуратор, програміст працює з тією самою технологічною моделлю, а підприємство залишається в тій самій екосистемі, вирішили вважати несуттєвою дрібницею.&lt;br /&gt;
&lt;br /&gt;
Саме так і народжується зручна статистика. Не потрібно змінювати технології — достатньо змінити назви категорій у звіті. У нас не залишилося 1С, у нас тепер BAS. Не залишилося технологічної залежності — залишилася лише «історична сумісність». Не залишилося російського слона в кімнаті — тепер це український великий сірий консультант із цифрової трансформації.&lt;br /&gt;
&lt;br /&gt;
== Це болісно нагадує перші дні великої війни ==&lt;br /&gt;
&lt;br /&gt;
У перші дні повномасштабного вторгнення ми бачили людей, які виходили на мітинги з російськими прапорами, повторювали російські гасла, захищали агресора й переконували всіх, що опір нібито не має сенсу. Вони також розповідали, що «не все так однозначно», що Росія начебто прийшла когось рятувати, а українцям потрібно просто змиритися з новою реальністю.&lt;br /&gt;
&lt;br /&gt;
Сьогодні майже ніхто не ризикує виходити на вулицю з російським прапором. Але коли мова заходить про російські технології, ми раптом чуємо до болю знайомі інтонації: «Не треба все політизувати», «Це просто програма», «Без неї неможливо працювати», «Альтернатив немає», «BAS уже не російська», «Не потрібно поспішати», «Спочатку доведіть, що українське не гірше».&lt;br /&gt;
&lt;br /&gt;
Змінилися декорації, але залишився той самий психологічний механізм: &#039;&#039;&#039;захищати звичну російську присутність, применшувати небезпеку, висміювати тих, хто чинить опір, і вимагати дедалі нових доказів очевидного&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Тоді люди виходили з російськими прапорами. Тепер вони виходять у коментарі з прапором BAS і конфігуратором напереваги.&lt;br /&gt;
&lt;br /&gt;
Я не прирівнюю програмне забезпечення до ракет. Я говорю про інше: про дивовижну готовність частини суспільства захищати російську залежність навіть тоді, коли Росія відкрито намагається знищити Україну. Про небажання бачити причинно-наслідкові зв’язки. Про звичку шукати виправдання для російського і найменші недоліки в українському.&lt;br /&gt;
&lt;br /&gt;
Коли ворог б’є по твоїй країні, а ти витрачаєш інтелектуальну енергію не на пошук шляху до незалежності, а на захист російської платформи, питання вже не лише у програмному забезпеченні. Питання у системі цінностей.&lt;br /&gt;
&lt;br /&gt;
== «K2 ERP хоче прийти на все готове» ==&lt;br /&gt;
&lt;br /&gt;
Це один із найкумедніших аргументів, які з’явилися після випуску. K2 ERP нібито хоче прийти на готовий ринок і забрати клієнтів 1С та BAS.&lt;br /&gt;
&lt;br /&gt;
Хотілося б побачити це «готове». Ринок, який тридцять років будували під російську платформу? Компанії, які вклали мільйони у власні конфігурації 1С? Бухгалтери, які категорично не бажають вчитися? Програмісти, що сприймають появу сучасної альтернативи як особисту загрозу? Керівники, які відкладають рішення до наступного прильоту, санкційного пакета або пенсії головного бухгалтера?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не готовий ринок. Це ринок, окупований звичкою, страхом і багаторічними інвестиціями у російську технологію.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Прийти на все готове — це прийти в обладнаний офіс, увімкнути комп’ютер і почати працювати. Українські ERP-команди приходять не в обладнаний офіс, а в технологічний музей, де кожен експонат доробляли двадцять років, документацію давно загубили, а головний зберігач музею забороняє торкатися системи, тому що «воно поки працює».&lt;br /&gt;
&lt;br /&gt;
Кожного клієнта потрібно переконувати не просто змінити програму. Потрібно допомогти йому подолати накопичений страх, опір персоналу, залежність від конкретних спеціалістів, хаос у даних, сотні самописних доробок і переконання, що все українське за замовчуванням повинно бути дешевим, безпомилковим і готовим до будь-якого підприємства ще до першого реального замовлення.&lt;br /&gt;
&lt;br /&gt;
Якщо це називається «прийти на все готове», то можна лише уявити, як виглядає складний ринок.&lt;br /&gt;
&lt;br /&gt;
== Знайти максимальну ціну — ще не означає порахувати вартість ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#fff8e1; border-left:6px solid #f9a825; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Порівнювати максимальну комплектацію українського продукту з мінімальною ціною коробки BAS — це не фінансовий аналіз. Це цирковий номер із калькулятором. Справжнє порівняння повинно враховувати повну вартість володіння системою протягом кількох років.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Наступний улюблений трюк — знайти максимальну можливу ціну майбутньої комплектації K2 ERP, урочисто принести її у коментарі й оголосити продукт дорогим. Методика аналізу приголомшує своєю точністю: беремо найбільшу цифру, не дивимося, що до неї входить, не порівнюємо моделі ліцензування, не враховуємо кількість користувачів, модулі, вихідний код, інфраструктуру та обсяг адаптації — і робимо серйозне обличчя.&lt;br /&gt;
&lt;br /&gt;
При цьому повна вартість володіння 1С і BAS чомусь зникає з калькулятора. Не враховуються ліцензії, сервери, клієнтські доступи, бази даних, супровід, оновлення, зарплати програмістів, нескінченні доопрацювання, інтеграції, простої, технічний борг і залежність від людей, які десятиліттями накопичували знання лише про одну закриту екосистему.&lt;br /&gt;
&lt;br /&gt;
Не порівнюється український продукт і з реальними західними ERP-системами, де впровадження, консалтинг, ліцензії та підтримка можуть коштувати зовсім інших грошей. Західній системі дозволено бути дорогою, бо вона західна. BAS дозволено бути дорогою, бо до неї звикли. Українська система, згідно з народною економічною доктриною, повинна бути функціональнішою за SAP, простішою за Excel і бажано коштувати дешевше за підписку на музичний сервіс.&lt;br /&gt;
&lt;br /&gt;
Справжнє порівняння починається з повної вартості володіння. Скільки система коштує протягом п’яти чи десяти років? Скільки людей потрібно для її підтримки? Наскільки складно її розвивати? Які ризики вона створює? Наскільки підприємство залежить від конкретного постачальника, програміста або вузької технології? Скільки коштуватиме подальше відкладання переходу?&lt;br /&gt;
&lt;br /&gt;
Без відповідей на ці питання демонстрація однієї максимальної цифри є не аналізом, а способом налякати аудиторію і повернути її у звичне болото.&lt;br /&gt;
&lt;br /&gt;
== Великі компанії, які раптом стають дуже бідними ==&lt;br /&gt;
&lt;br /&gt;
З цією логікою я стикаюся постійно. Приходиш у велику компанію з величезними оборотами, тисячами працівників і складними бізнес-процесами. У красивому переговорному кабінеті тобі пояснюють, що підприємство багато років вкладало мільйони в 1С, тому тепер не може вкладати гроші в українське рішення.&lt;br /&gt;
&lt;br /&gt;
Це класична пастка вже понесених витрат, добре відома будь-якій людині, яка хоча б трохи розуміється на бізнесі. Компанія продовжує вкладати у застарілий напрям не тому, що він залишається найкращим, а тому, що їй психологічно боляче визнати помилковість попередніх вкладень. Замість оцінювання майбутніх ризиків та можливостей керівники стають заручниками грошей, які вже неможливо повернути.&lt;br /&gt;
&lt;br /&gt;
На 1С мільйони були. На десятиліття доопрацювань гроші були. На сервери, консультантів, програмістів, підтримку та аварійне латання гроші є й зараз. Але щойно мова заходить про українську платформу, багатомільярдна компанія раптом перетворюється на бідну студентську організацію, яка просить знижку, грант, безкоштовний пілот, безкоштовне перенесення даних і бажано ще компенсацію моральної травми від необхідності вивчити нову кнопку.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не відсутність грошей. Це відсутність пріоритету.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Бізнес завжди знаходить ресурси на те, що вважає важливим. Якщо підприємство продовжує вкладати в 1С і відмовляється вкладати в українську технологію, воно вже зробило свій вибір. Не бухгалтер, не програміст і не ринок. Вибір зробило керівництво.&lt;br /&gt;
&lt;br /&gt;
== «Ніхто нікуди не поспішає» ==&lt;br /&gt;
&lt;br /&gt;
Цю фразу часто вимовляють майже з гордістю, наче йдеться про ознаку стратегічної зрілості. Ніхто нікуди не поспішає, весь ринок працює на 1С і BAS, отже можна спокійно сидіти далі.&lt;br /&gt;
&lt;br /&gt;
Саме в цьому й полягає проблема. Якщо весь ринок одночасно робить помилку, вона не перетворюється на правильне рішення. Вона просто стає системною помилкою. Мільйони людей можуть роками користуватися небезпечною або застарілою технологією, але кількість користувачів не змінює її походження та не усуває ризиків.&lt;br /&gt;
&lt;br /&gt;
Ринок справді не поспішає. Він чекає, доки держава заборонить, оштрафує, примусить, профінансує та ще й особисто проведе кожного бухгалтера за руку до нової системи. Бізнес хоче технологічної незалежності, але бажано без рішень, витрат, навчання, відповідальності та найменшого дискомфорту.&lt;br /&gt;
&lt;br /&gt;
Росія тим часом не чекає. Вона не відкладає ракети до моменту, коли український бізнес завершить бюджетування. Вона не питає, чи зручно нам сьогодні відмовлятися від її технологій. Вона використовує будь-яку залежність як ресурс впливу, а ми продовжуємо обговорювати, чи достатньо ввічливо українські розробники попросили ринок прокинутися.&lt;br /&gt;
&lt;br /&gt;
== Дев’яносто п’ять відсотків залежності, яку сховали перейменуванням ==&lt;br /&gt;
&lt;br /&gt;
За моєю професійною оцінкою, реальне проникнення російського програмного забезпечення в український бізнес залишається на рівні &#039;&#039;&#039;90–95%&#039;&#039;&#039;. Це не офіційна державна статистика, а оцінка, сформована на основі багаторічної роботи з підприємствами різного масштабу.&lt;br /&gt;
&lt;br /&gt;
Куди не зайди, 1С або BAS знаходиться у бухгалтерії, на складі, у зарплаті, виробництві, торгівлі, окремому підрозділі чи старій базі, про яку керівництво навіть не згадало під час першої зустрічі. Навіть у компаніях, які заявляють, що давно відмовилися від 1С, раптово знаходиться окрема база для зарплати, складський облік, архів або «маленька допоміжна система», без якої чомусь зупиняється половина підприємства.&lt;br /&gt;
&lt;br /&gt;
Формально показник міг зменшитися. Але часто не тому, що підприємства перейшли на українські чи західні платформи, а тому, що 1С перестали називати 1С. Частину того самого технологічного масиву тепер записують у статистиці як BAS, локальний продукт або окрему екосистему.&lt;br /&gt;
&lt;br /&gt;
Так легко перемогти будь-яку залежність. Потрібно лише перейменувати її.&lt;br /&gt;
&lt;br /&gt;
Не відмовилися від російської платформи — змінили назву. Не провели імпортозаміщення — оновили логотип. Не створили технологічної незалежності — перемістили рядок в інший розділ таблиці. Звіт зелений, презентація красива, залежність залишилася.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Український ринок не пішов із 1С. Він значною мірою просто перейшов із напису «1С» на напис «BAS».&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== «Ваші аргументи — не аргументи» ==&lt;br /&gt;
&lt;br /&gt;
Ще одна зручна позиція — оголосити всі наведені аргументи недостатніми. Дванадцять років війни — не аргумент. Російське походження платформи — не аргумент. Санкції — не аргумент. Кіберризики — не аргумент. Технологічна залежність — не аргумент. Необхідність розвивати українські продукти — також не аргумент.&lt;br /&gt;
&lt;br /&gt;
Тоді що саме вони хочуть почути? Скільки ще має пройти років? Скільки українських міст повинні почути російські ракети, щоб питання технологічної залежності перестало здаватися передчасним? Чи потрібна персональна ракета з накладною та актом виконаних робіт, щоб керівник нарешті визнав аргумент достатньо переконливим?&lt;br /&gt;
&lt;br /&gt;
Проблема не у відсутності аргументів. &#039;&#039;&#039;Проблема в тому, що жодна кількість аргументів не переконає людину, яка захищає не позицію, а власний комфорт.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вона проситиме нові докази без кінця, тому що мета полягає не в тому, щоб переконатися. Мета — відкласти рішення. Сьогодні їй потрібні кейси. Завтра — ще більше кейсів. Післязавтра — порівняльна таблиця. Потім державна гарантія, безкоштовна міграція, десять років безпомилкової експлуатації та письмове зобов’язання, що жодному бухгалтеру не доведеться нічого вчити.&lt;br /&gt;
&lt;br /&gt;
І навіть після цього знайдеться вирішальний аргумент: «А от у нас є один звіт, який у BAS відкривається двома натисканнями».&lt;br /&gt;
&lt;br /&gt;
== «У студії сидять не спеціалісти» ==&lt;br /&gt;
&lt;br /&gt;
Коли не вдається спростувати сказане, потрібно дискредитувати того, хто говорить. Це старий, примітивний, але досі популярний прийом. Людей із десятиліттями досвіду розробки, автоматизації та впровадження корпоративних систем оголошують «теоретиками» коментатори, які іноді навіть не розрізняють платформу, конфігурацію та прикладне рішення.&lt;br /&gt;
&lt;br /&gt;
Особливо кумедно, коли фахівець, який усе життя супроводжував одну технологію, пояснює автору іншої ERP-платформи, що той не розуміється на розробці. Це нагадує ситуацію, коли досвідчений водій маршрутки приходить на авіаційний завод і з порога повідомляє інженерам, що вони нічого не знають про транспорт, бо в їхньому літаку немає валідатора для проїзних.&lt;br /&gt;
&lt;br /&gt;
Досвід роботи в 1С може бути глибоким і цінним, але він не дає автоматичної монополії на розуміння всіх технологій. Знання синтаксису однієї платформи не робить людину експертом із сучасної вебархітектури, хмарних систем, розподілених середовищ, PostgreSQL, API-first підходів, мобільних клієнтів або розробки платформ швидкого створення бізнес-застосунків.&lt;br /&gt;
&lt;br /&gt;
І навпаки, людина, яка створює сучасну ERP-платформу, має повне право оцінювати технологічні обмеження 1С і BAS. Особливо якщо до цього десятиліттями працювала з 1С, розробляла на ній, упроваджувала її, бачила її сильні та слабкі сторони й зрештою вирішила створити іншу технологічну основу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Назвати опонента некомпетентним — це не аргумент. Це словесна ширма, за якою часто ховається страх професійних змін.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Український продукт повинен бути ідеальним ще до того, як у нього почнуть вкладати ==&lt;br /&gt;
&lt;br /&gt;
Російська екосистема розвивалася десятиліттями. У неї вкладали гроші російські компанії, український бізнес, партнери, програмісти, навчальні центри та сотні тисяч замовників. Під неї створювали курси, конфігурації, інтеграції, методики та величезний кадровий ринок.&lt;br /&gt;
&lt;br /&gt;
Тепер українському продукту кажуть: спочатку наздоженіть усе це самостійно, створіть повний аналог кожної доробки, покажіть тисячі успішних упроваджень, зробіть систему дешевшою, швидшою та зручнішою — і лише тоді ми, можливо, дамо вам перше серйозне замовлення.&lt;br /&gt;
&lt;br /&gt;
Це не чесне ринкове порівняння. Це свідомо нерівні умови. Один продукт десятиліттями годував увесь ринок, а іншому пропонують довести свою зрілість, сидячи без їжі.&lt;br /&gt;
&lt;br /&gt;
Жодна технологічна індустрія так не розвивається. Продукти стають сильними завдяки реальним проєктам, вимогам клієнтів, фінансуванню, зворотному зв’язку та накопиченню галузевої експертизи. Українська ERP не виросте в ізоляції, поки український бізнес продовжує оплачувати розвиток старої російської екосистеми.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не можна тридцять років вкладати в 1С, а потім обурюватися, що українській платформі також потрібні гроші, час і клієнти.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Найстрашніше — не 1С. Найстрашніше — добровільна капітуляція мислення ==&lt;br /&gt;
&lt;br /&gt;
Після прочитання коментарів мене вразила не критика K2 ERP. Критикувати продукти нормально. Потрібно ставити складні питання, порівнювати функціональність, перевіряти архітектуру, рахувати повну вартість, вимагати відповідальності та професійності.&lt;br /&gt;
&lt;br /&gt;
Мене вразило інше: &#039;&#039;&#039;наскільки легко люди погоджуються не бачити головної проблеми&#039;&#039;&#039;. Наскільки швидко вони переходять від розмови про російський софт до обговорення характеру спікера. Як слухняно повторюють однакові тези. Як замість аналізу платформи розповідають про «PR». Як замість оцінки ризиків шукають максимальну ціну українського продукту. Як замість плану переходу пояснюють, чому ніхто нікуди не поспішає.&lt;br /&gt;
&lt;br /&gt;
Це і є добровільна технологічна капітуляція. Не тоді, коли у країни ще немає ідеальної альтернативи, а тоді, коли суспільство не хоче навіть допомагати її створювати. Коли захист звичного російського продукту стає сильнішим за бажання отримати власну технологічну незалежність.&lt;br /&gt;
&lt;br /&gt;
Мені соромно не за українських розробників, які ще не встигли створити абсолютно все. Мені соромно за багатомільярдні компанії, які після дванадцяти років війни пояснюють, що вони надто бідні для переходу. За керівників, які ховаються за бухгалтерами. За бухгалтерів, які ховаються за програмістами. За програмістів, які ховаються за конфігурацією.&lt;br /&gt;
&lt;br /&gt;
Мені соромно за всіх, хто дуже професійно перекладає відповідальність по колу, доки вона остаточно не зникає десь між регістром накопичення і планом рахунків.&lt;br /&gt;
&lt;br /&gt;
== BAS — це 1С. А підміна теми — її найкращий захист ==&lt;br /&gt;
&lt;br /&gt;
Можна ще тисячу разів назвати подкаст рекламним. Можна вигадувати приховані мотиви K2 ERP, знаходити максимальні ціни, вимагати нескінченних доказів та оголошувати некомпетентними всіх, хто говорить неприємні речі.&lt;br /&gt;
&lt;br /&gt;
Але жодна з цих маніпуляцій не відповідає на головне запитання: &#039;&#039;&#039;чому український бізнес після дванадцяти років війни досі масово працює на російській технологічній платформі?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
BAS — це 1С. Змінили назву, логотип і маркетингову упаковку, але не технологічну сутність. Ринок значною мірою залишився там само, де був. Перефарбування продукту вплинуло на сприйняття і, можливо, на формальні показники, але не звільнило країну від залежності.&lt;br /&gt;
&lt;br /&gt;
Росія б’є по Україні ракетами, а частина українців продовжує захищати російське програмне забезпечення. Не тому, що не розуміє походження BAS. Багато хто чудово все розуміє. Просто визнання правди означає необхідність діяти, витрачати гроші, вчитися, перебудовувати процеси та відповідати за рішення.&lt;br /&gt;
&lt;br /&gt;
Набагато легше оголосити все PR-акцією. Набагато зручніше вимагати ще аргументів. Набагато дешевше сьогодні сказати, що перехід надто дорогий, а завтра знову прокинутися від вибухів, відкрити російський конфігуратор і продовжити роботу так, ніби ці дві реальності жодним чином не пов’язані.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:24px 0; padding:20px 24px; background:#eef8ef; border-left:6px solid #2e7d32; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Та вони пов’язані. Технологічна залежність — це також залежність. Російська технологія не стає українською після зміни назви. BAS — це 1С. І доки український бізнес не матиме мужності назвати речі своїми іменами, справжнього технологічного звільнення не буде.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Дивіться повний випуск TAX Podcast ==&lt;br /&gt;
&lt;br /&gt;
У випуску обговорюються санкції проти 1С і BAS, технологічні та кібернетичні ризики, відповідальність керівників, вартість переходу, опір персоналу й майбутнє українського ринку корпоративного програмного забезпечення.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дивитися:&#039;&#039;&#039; [https://www.youtube.com/watch?v=fKgTSDcHUAo&amp;amp;list=PLRyc83tAN5QOOCknL2Bv_gHaz0Yzgyehe 1С та BAS під санкціями: чому бізнесу вже час переходити | TAX Podcast]&lt;br /&gt;
&lt;br /&gt;
[[Категорія:1С]]&lt;br /&gt;
[[Категорія]]&lt;br /&gt;
[[Категорія:Російське програмне забезпечення]]&lt;br /&gt;
[[Категорія:Імпортозаміщення]]&lt;br /&gt;
[[Категорія:Українські ERP-системи]]&lt;br /&gt;
[[Категорія ERP]]&lt;br /&gt;
[[Категорія:Технологічна незалежність України]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%96%D0%B4_%D0%B3%D1%83%D1%80%D0%BA%D1%96%D1%82_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D0%B8%D1%85_%D1%80%D0%B0%D0%BA%D0%B5%D1%82_%D0%B2%D0%BE%D0%BD%D0%B8_%D0%B7%D0%B0%D1%85%D0%B8%D1%89%D0%B0%D1%8E%D1%82%D1%8C_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D1%83_1%D0%A1&amp;diff=2771</id>
		<title>Під гуркіт російських ракет вони захищають російську 1С</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%96%D0%B4_%D0%B3%D1%83%D1%80%D0%BA%D1%96%D1%82_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D0%B8%D1%85_%D1%80%D0%B0%D0%BA%D0%B5%D1%82_%D0%B2%D0%BE%D0%BD%D0%B8_%D0%B7%D0%B0%D1%85%D0%B8%D1%89%D0%B0%D1%8E%D1%82%D1%8C_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D1%83_1%D0%A1&amp;diff=2771"/>
		<updated>2026-07-19T06:25:26Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Бухгалтер 1С.png|центр|міні|800x800пкс|Під гуркіт російських ракет вони захищають російську 1С]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Як коментарі під TAX Podcast показали справжній масштаб технологічної залежності України&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#fff1f1; border-left:6px solid #c62828; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Знову грім. Знову вибухи. Знову Київ та інші українські міста прокидаються від російських ракет. А паралельно частина українського бізнесу продовжує захищати російську технологічну платформу, ніби дванадцять років війни — це ще недостатня причина хоча б почати думати про технологічну незалежність.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Росія вкотре намагається знищити нашу енергетику, підприємства, будинки, життя і саме право України бути незалежною державою. А майже в той самий час під подкастом про небезпеку російського програмного забезпечення з’являються українські коментатори, які кидаються захищати 1С і BAS з такою відданістю, ніби їм за це вже нараховують премію — обов’язково через документ «Нарахування лояльності агресору».&lt;br /&gt;
&lt;br /&gt;
Саме це стало для мене справжнім шоком після виходу [https://www.youtube.com/watch?v=fKgTSDcHUAo&amp;amp;list=PLRyc83tAN5QOOCknL2Bv_gHaz0Yzgyehe TAX Podcast про 1С, BAS, санкції та майбутнє українського бізнесу]. Тема випуску була сформульована гранично чітко: чому тисячі українських компаній досі працюють на 1С і BAS, які ризики несе така залежність, чому бізнес відкладає перехід і хто повинен брати на себе відповідальність за зміну корпоративної інформаційної системи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;У подкасті взагалі не було реклами K2 ERP.&#039;&#039;&#039; Там не проводилася презентація продукту, не демонструвалися модулі, не показувалися інтерфейси, не оголошувалися тарифи і не звучали заклики негайно щось купувати. K2 ERP згадувалася лише там, де це було природно й необхідно: як доказ того, що українські технологічні альтернативи існують і що українські розробники здатні створювати власні ERP-платформи.&lt;br /&gt;
&lt;br /&gt;
Більша частина розмови була присвячена боротьбі з ворожим програмним забезпеченням, походженню 1С і BAS, санкціям, кіберризикам, відповідальності власників бізнесу та необхідності розвивати власні технології. Проте частина аудиторії вперто не захотіла чути саме це.&lt;br /&gt;
&lt;br /&gt;
Замість розмови по суті почалося колективне виробництво інформаційного шуму. Хтось оголосив випуск «PR-подкастом». Хтось вирішив, що K2 ERP нібито хоче «прийти на все готове» і забрати собі ринок 1С та BAS. Хтось витягнув максимальну можливу ціну майбутньої комплектації й почав доводити, що український продукт дорогий. Інші заявили, що наведені аргументи — «не аргументи», а в студії нібито сидять люди, які не розуміють, про що говорять.&lt;br /&gt;
&lt;br /&gt;
Виникло дивне відчуття, що під відео працює не група живих людей, а погано налаштований бот, якому завантажили один-єдиний сценарій: &#039;&#039;&#039;за будь-яку ціну не допустити розмови про російську природу 1С і BAS&#039;&#039;&#039;. Не відповідай на поставлене питання. Не аналізуй ризики. Не сперечайся з основною тезою. Переведи розмову на особистість спікера, знайди максимальну ціну, вимагай нескінченних доказів, оголоси все рекламою — і головна проблема потоне у болоті другорядних суперечок.&lt;br /&gt;
&lt;br /&gt;
== Коли немає відповіді по суті, усе оголошують рекламою ==&lt;br /&gt;
&lt;br /&gt;
Назвати подкаст рекламним — найпростіший спосіб його не слухати. Це дуже зручна інтелектуальна послуга: думати не потрібно, перевіряти сказане не потрібно, відповідати на незручні питання також не потрібно. Достатньо приклеїти ярлик «PR», після чого можна з почуттям виконаного громадянського обов’язку повернутися до російського конфігуратора.&lt;br /&gt;
&lt;br /&gt;
Але давайте все ж повернемося до змісту. У подкасті обговорювали, чому український бізнес досі залишається на 1С і BAS, хто відповідає за вибір корпоративного програмного забезпечення, які ризики створює технологічна залежність і чому підприємства роками відкладають перехід. Говорили про санкції, кібербезпеку, вартість міграції, опір персоналу, роль керівників та про відсутність системної державної політики.&lt;br /&gt;
&lt;br /&gt;
Коли людина після такої розмови пише лише про «рекламу K2 ERP», це не критика подкасту. Це демонстрація того, що вона або не слухала випуск, або свідомо намагається розмити його зміст. Бо обговорювати справжню проблему незручно. Доведеться визнати, що дванадцять років війни підприємство працювало на російській технологічній основі, не створило плану переходу і тепер гарячково шукає пояснення, чому багаторічну бездіяльність потрібно вважати професійною мудрістю.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Оголосити розмову рекламою значно легше, ніж відповісти на просте запитання: чому під час війни ваш бізнес досі працює на російській платформі?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== BAS — це не споріднена технологія. BAS — це 1С ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#eef6ff; border-left:6px solid #1565c0; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;BAS — це 1С. Не «схожа система», не «споріднена технологія» і не нова незалежна українська платформа. Це 1С, перейменована та перефарбована для продовження роботи на українському ринку. Зміна логотипу не змінила технологічної суті продукту.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тут не потрібно ховатися за дипломатичними формулюваннями. Це та сама технологічна природа: конфігуратор, метадані, довідники, документи, регістри, форми, модулі, запити, механізми проведення та загальна модель розробки.&lt;br /&gt;
&lt;br /&gt;
BAS не виникла як нова українська технологія, створена з нуля українськими інженерами. Вона з’явилася як спосіб продовжити використання продуктів екосистеми 1С після того, як російський бренд став токсичним, санкційним і незручним для відкритого просування на українському ринку.&lt;br /&gt;
&lt;br /&gt;
Змінили напис на заставці. Перемалювали логотип. Перепакували маркетинг. Почали переконувати ринок, що це вже нібито зовсім інший продукт. Але людина, яка хоча б раз відкривала конфігуратор, працювала з метаданими, запитами, формами, документами та регістрами, чудово розуміє, що відбулося.&lt;br /&gt;
&lt;br /&gt;
Один із коментаторів намагався довести, що BAS нібито стала іншою технологією, тому що в окремих функціях запитів виникли відмінності, а російська 1С за цей час «пішла вперед». Це приблизно як доводити, що автомобіль перестав бути автомобілем, тому що у новішій моделі переставили кнопку підігріву сидіння.&lt;br /&gt;
&lt;br /&gt;
Відмінності між релізами, конфігураціями чи окремими функціями не змінюють технологічної природи продукту. Навпаки, саме твердження, що BAS колись відокремилася від 1С, уже визнає її походження. Далі залишається здійснити надзвичайно складну інтелектуальну операцію: скласти два і два.&lt;br /&gt;
&lt;br /&gt;
Коли людина десять років працює в BAS, але жодного разу не відкрила конфігуратор і не зрозуміла, на якій платформі працює, це сумно. Коли вона після цього починає повчати розробників ERP-платформ і називати їх теоретиками — це вже комедія. Щоправда, комедія дуже дорога: квиток на неї десятиліттями оплачує весь український бізнес.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BAS не стала українською технологією через зміну напису на заставці. Перейменування продукту — це не технологічне імпортозаміщення. Це лише імпортозаміщення логотипу.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Перефарбована нафта, перефарбований газ і перефарбована 1С ==&lt;br /&gt;
&lt;br /&gt;
Механізм знайомий до болю. Російську нафту можна провести через посередника, змішати з іншою партією, змінити документи й маршрут. Російський газ можна кілька разів перепродати, пустити іншою трубою і назвати товаром іншої компанії. Російський бізнес можна переписати на нового власника, зареєструвати іншу юридичну особу та намалювати європейський логотип.&lt;br /&gt;
&lt;br /&gt;
Але походження від цього не змінюється. Нафта не стає демократичною після зміни танкера. Газ не вивчає європейські цінності під час проходження митниці. Російський бізнес не очищується від свого минулого після заміни таблички біля входу.&lt;br /&gt;
&lt;br /&gt;
Так само й 1С не стала українською після того, як на її місці з’явилися три латинські літери BAS. &#039;&#039;&#039;Перефарбування російського продукту не робить його українським. Воно лише дозволяє користувачеві психологічно комфортніше продовжувати робити те саме.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Найдивовижніше, що ця операція виявилася надзвичайно успішною. Для великої частини ринку зміни логотипу було достатньо, щоб оголосити проблему вирішеною. Раніше підприємство працювало на 1С, тепер воно працює на BAS — отже, у красивій презентації російського програмного забезпечення нібито стало менше.&lt;br /&gt;
&lt;br /&gt;
Те, що бухгалтер відкриває той самий конфігуратор, програміст працює з тією самою технологічною моделлю, а підприємство залишається в тій самій екосистемі, вирішили вважати несуттєвою дрібницею.&lt;br /&gt;
&lt;br /&gt;
Саме так і народжується зручна статистика. Не потрібно змінювати технології — достатньо змінити назви категорій у звіті. У нас не залишилося 1С, у нас тепер BAS. Не залишилося технологічної залежності — залишилася лише «історична сумісність». Не залишилося російського слона в кімнаті — тепер це український великий сірий консультант із цифрової трансформації.&lt;br /&gt;
&lt;br /&gt;
== Це болісно нагадує перші дні великої війни ==&lt;br /&gt;
&lt;br /&gt;
У перші дні повномасштабного вторгнення ми бачили людей, які виходили на мітинги з російськими прапорами, повторювали російські гасла, захищали агресора й переконували всіх, що опір нібито не має сенсу. Вони також розповідали, що «не все так однозначно», що Росія начебто прийшла когось рятувати, а українцям потрібно просто змиритися з новою реальністю.&lt;br /&gt;
&lt;br /&gt;
Сьогодні майже ніхто не ризикує виходити на вулицю з російським прапором. Але коли мова заходить про російські технології, ми раптом чуємо до болю знайомі інтонації: «Не треба все політизувати», «Це просто програма», «Без неї неможливо працювати», «Альтернатив немає», «BAS уже не російська», «Не потрібно поспішати», «Спочатку доведіть, що українське не гірше».&lt;br /&gt;
&lt;br /&gt;
Змінилися декорації, але залишився той самий психологічний механізм: &#039;&#039;&#039;захищати звичну російську присутність, применшувати небезпеку, висміювати тих, хто чинить опір, і вимагати дедалі нових доказів очевидного&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Тоді люди виходили з російськими прапорами. Тепер вони виходять у коментарі з прапором BAS і конфігуратором напереваги.&lt;br /&gt;
&lt;br /&gt;
Я не прирівнюю програмне забезпечення до ракет. Я говорю про інше: про дивовижну готовність частини суспільства захищати російську залежність навіть тоді, коли Росія відкрито намагається знищити Україну. Про небажання бачити причинно-наслідкові зв’язки. Про звичку шукати виправдання для російського і найменші недоліки в українському.&lt;br /&gt;
&lt;br /&gt;
Коли ворог б’є по твоїй країні, а ти витрачаєш інтелектуальну енергію не на пошук шляху до незалежності, а на захист російської платформи, питання вже не лише у програмному забезпеченні. Питання у системі цінностей.&lt;br /&gt;
&lt;br /&gt;
== «K2 ERP хоче прийти на все готове» ==&lt;br /&gt;
&lt;br /&gt;
Це один із найкумедніших аргументів, які з’явилися після випуску. K2 ERP нібито хоче прийти на готовий ринок і забрати клієнтів 1С та BAS.&lt;br /&gt;
&lt;br /&gt;
Хотілося б побачити це «готове». Ринок, який тридцять років будували під російську платформу? Компанії, які вклали мільйони у власні конфігурації 1С? Бухгалтери, які категорично не бажають вчитися? Програмісти, що сприймають появу сучасної альтернативи як особисту загрозу? Керівники, які відкладають рішення до наступного прильоту, санкційного пакета або пенсії головного бухгалтера?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не готовий ринок. Це ринок, окупований звичкою, страхом і багаторічними інвестиціями у російську технологію.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Прийти на все готове — це прийти в обладнаний офіс, увімкнути комп’ютер і почати працювати. Українські ERP-команди приходять не в обладнаний офіс, а в технологічний музей, де кожен експонат доробляли двадцять років, документацію давно загубили, а головний зберігач музею забороняє торкатися системи, тому що «воно поки працює».&lt;br /&gt;
&lt;br /&gt;
Кожного клієнта потрібно переконувати не просто змінити програму. Потрібно допомогти йому подолати накопичений страх, опір персоналу, залежність від конкретних спеціалістів, хаос у даних, сотні самописних доробок і переконання, що все українське за замовчуванням повинно бути дешевим, безпомилковим і готовим до будь-якого підприємства ще до першого реального замовлення.&lt;br /&gt;
&lt;br /&gt;
Якщо це називається «прийти на все готове», то можна лише уявити, як виглядає складний ринок.&lt;br /&gt;
&lt;br /&gt;
== Знайти максимальну ціну — ще не означає порахувати вартість ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#fff8e1; border-left:6px solid #f9a825; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Порівнювати максимальну комплектацію українського продукту з мінімальною ціною коробки BAS — це не фінансовий аналіз. Це цирковий номер із калькулятором. Справжнє порівняння повинно враховувати повну вартість володіння системою протягом кількох років.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Наступний улюблений трюк — знайти максимальну можливу ціну майбутньої комплектації K2 ERP, урочисто принести її у коментарі й оголосити продукт дорогим. Методика аналізу приголомшує своєю точністю: беремо найбільшу цифру, не дивимося, що до неї входить, не порівнюємо моделі ліцензування, не враховуємо кількість користувачів, модулі, вихідний код, інфраструктуру та обсяг адаптації — і робимо серйозне обличчя.&lt;br /&gt;
&lt;br /&gt;
При цьому повна вартість володіння 1С і BAS чомусь зникає з калькулятора. Не враховуються ліцензії, сервери, клієнтські доступи, бази даних, супровід, оновлення, зарплати програмістів, нескінченні доопрацювання, інтеграції, простої, технічний борг і залежність від людей, які десятиліттями накопичували знання лише про одну закриту екосистему.&lt;br /&gt;
&lt;br /&gt;
Не порівнюється український продукт і з реальними західними ERP-системами, де впровадження, консалтинг, ліцензії та підтримка можуть коштувати зовсім інших грошей. Західній системі дозволено бути дорогою, бо вона західна. BAS дозволено бути дорогою, бо до неї звикли. Українська система, згідно з народною економічною доктриною, повинна бути функціональнішою за SAP, простішою за Excel і бажано коштувати дешевше за підписку на музичний сервіс.&lt;br /&gt;
&lt;br /&gt;
Справжнє порівняння починається з повної вартості володіння. Скільки система коштує протягом п’яти чи десяти років? Скільки людей потрібно для її підтримки? Наскільки складно її розвивати? Які ризики вона створює? Наскільки підприємство залежить від конкретного постачальника, програміста або вузької технології? Скільки коштуватиме подальше відкладання переходу?&lt;br /&gt;
&lt;br /&gt;
Без відповідей на ці питання демонстрація однієї максимальної цифри є не аналізом, а способом налякати аудиторію і повернути її у звичне болото.&lt;br /&gt;
&lt;br /&gt;
== Великі компанії, які раптом стають дуже бідними ==&lt;br /&gt;
&lt;br /&gt;
З цією логікою я стикаюся постійно. Приходиш у велику компанію з величезними оборотами, тисячами працівників і складними бізнес-процесами. У красивому переговорному кабінеті тобі пояснюють, що підприємство багато років вкладало мільйони в 1С, тому тепер не може вкладати гроші в українське рішення.&lt;br /&gt;
&lt;br /&gt;
Це класична пастка вже понесених витрат, добре відома будь-якій людині, яка хоча б трохи розуміється на бізнесі. Компанія продовжує вкладати у застарілий напрям не тому, що він залишається найкращим, а тому, що їй психологічно боляче визнати помилковість попередніх вкладень. Замість оцінювання майбутніх ризиків та можливостей керівники стають заручниками грошей, які вже неможливо повернути.&lt;br /&gt;
&lt;br /&gt;
На 1С мільйони були. На десятиліття доопрацювань гроші були. На сервери, консультантів, програмістів, підтримку та аварійне латання гроші є й зараз. Але щойно мова заходить про українську платформу, багатомільярдна компанія раптом перетворюється на бідну студентську організацію, яка просить знижку, грант, безкоштовний пілот, безкоштовне перенесення даних і бажано ще компенсацію моральної травми від необхідності вивчити нову кнопку.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не відсутність грошей. Це відсутність пріоритету.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Бізнес завжди знаходить ресурси на те, що вважає важливим. Якщо підприємство продовжує вкладати в 1С і відмовляється вкладати в українську технологію, воно вже зробило свій вибір. Не бухгалтер, не програміст і не ринок. Вибір зробило керівництво.&lt;br /&gt;
&lt;br /&gt;
== «Ніхто нікуди не поспішає» ==&lt;br /&gt;
&lt;br /&gt;
Цю фразу часто вимовляють майже з гордістю, наче йдеться про ознаку стратегічної зрілості. Ніхто нікуди не поспішає, весь ринок працює на 1С і BAS, отже можна спокійно сидіти далі.&lt;br /&gt;
&lt;br /&gt;
Саме в цьому й полягає проблема. Якщо весь ринок одночасно робить помилку, вона не перетворюється на правильне рішення. Вона просто стає системною помилкою. Мільйони людей можуть роками користуватися небезпечною або застарілою технологією, але кількість користувачів не змінює її походження та не усуває ризиків.&lt;br /&gt;
&lt;br /&gt;
Ринок справді не поспішає. Він чекає, доки держава заборонить, оштрафує, примусить, профінансує та ще й особисто проведе кожного бухгалтера за руку до нової системи. Бізнес хоче технологічної незалежності, але бажано без рішень, витрат, навчання, відповідальності та найменшого дискомфорту.&lt;br /&gt;
&lt;br /&gt;
Росія тим часом не чекає. Вона не відкладає ракети до моменту, коли український бізнес завершить бюджетування. Вона не питає, чи зручно нам сьогодні відмовлятися від її технологій. Вона використовує будь-яку залежність як ресурс впливу, а ми продовжуємо обговорювати, чи достатньо ввічливо українські розробники попросили ринок прокинутися.&lt;br /&gt;
&lt;br /&gt;
== Дев’яносто п’ять відсотків залежності, яку сховали перейменуванням ==&lt;br /&gt;
&lt;br /&gt;
За моєю професійною оцінкою, реальне проникнення російського програмного забезпечення в український бізнес залишається на рівні &#039;&#039;&#039;90–95%&#039;&#039;&#039;. Це не офіційна державна статистика, а оцінка, сформована на основі багаторічної роботи з підприємствами різного масштабу.&lt;br /&gt;
&lt;br /&gt;
Куди не зайди, 1С або BAS знаходиться у бухгалтерії, на складі, у зарплаті, виробництві, торгівлі, окремому підрозділі чи старій базі, про яку керівництво навіть не згадало під час першої зустрічі. Навіть у компаніях, які заявляють, що давно відмовилися від 1С, раптово знаходиться окрема база для зарплати, складський облік, архів або «маленька допоміжна система», без якої чомусь зупиняється половина підприємства.&lt;br /&gt;
&lt;br /&gt;
Формально показник міг зменшитися. Але часто не тому, що підприємства перейшли на українські чи західні платформи, а тому, що 1С перестали називати 1С. Частину того самого технологічного масиву тепер записують у статистиці як BAS, локальний продукт або окрему екосистему.&lt;br /&gt;
&lt;br /&gt;
Так легко перемогти будь-яку залежність. Потрібно лише перейменувати її.&lt;br /&gt;
&lt;br /&gt;
Не відмовилися від російської платформи — змінили назву. Не провели імпортозаміщення — оновили логотип. Не створили технологічної незалежності — перемістили рядок в інший розділ таблиці. Звіт зелений, презентація красива, залежність залишилася.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Український ринок не пішов із 1С. Він значною мірою просто перейшов із напису «1С» на напис «BAS».&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== «Ваші аргументи — не аргументи» ==&lt;br /&gt;
&lt;br /&gt;
Ще одна зручна позиція — оголосити всі наведені аргументи недостатніми. Дванадцять років війни — не аргумент. Російське походження платформи — не аргумент. Санкції — не аргумент. Кіберризики — не аргумент. Технологічна залежність — не аргумент. Необхідність розвивати українські продукти — також не аргумент.&lt;br /&gt;
&lt;br /&gt;
Тоді що саме вони хочуть почути? Скільки ще має пройти років? Скільки українських міст повинні почути російські ракети, щоб питання технологічної залежності перестало здаватися передчасним? Чи потрібна персональна ракета з накладною та актом виконаних робіт, щоб керівник нарешті визнав аргумент достатньо переконливим?&lt;br /&gt;
&lt;br /&gt;
Проблема не у відсутності аргументів. &#039;&#039;&#039;Проблема в тому, що жодна кількість аргументів не переконає людину, яка захищає не позицію, а власний комфорт.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вона проситиме нові докази без кінця, тому що мета полягає не в тому, щоб переконатися. Мета — відкласти рішення. Сьогодні їй потрібні кейси. Завтра — ще більше кейсів. Післязавтра — порівняльна таблиця. Потім державна гарантія, безкоштовна міграція, десять років безпомилкової експлуатації та письмове зобов’язання, що жодному бухгалтеру не доведеться нічого вчити.&lt;br /&gt;
&lt;br /&gt;
І навіть після цього знайдеться вирішальний аргумент: «А от у нас є один звіт, який у BAS відкривається двома натисканнями».&lt;br /&gt;
&lt;br /&gt;
== «У студії сидять не спеціалісти» ==&lt;br /&gt;
&lt;br /&gt;
Коли не вдається спростувати сказане, потрібно дискредитувати того, хто говорить. Це старий, примітивний, але досі популярний прийом. Людей із десятиліттями досвіду розробки, автоматизації та впровадження корпоративних систем оголошують «теоретиками» коментатори, які іноді навіть не розрізняють платформу, конфігурацію та прикладне рішення.&lt;br /&gt;
&lt;br /&gt;
Особливо кумедно, коли фахівець, який усе життя супроводжував одну технологію, пояснює автору іншої ERP-платформи, що той не розуміється на розробці. Це нагадує ситуацію, коли досвідчений водій маршрутки приходить на авіаційний завод і з порога повідомляє інженерам, що вони нічого не знають про транспорт, бо в їхньому літаку немає валідатора для проїзних.&lt;br /&gt;
&lt;br /&gt;
Досвід роботи в 1С може бути глибоким і цінним, але він не дає автоматичної монополії на розуміння всіх технологій. Знання синтаксису однієї платформи не робить людину експертом із сучасної вебархітектури, хмарних систем, розподілених середовищ, PostgreSQL, API-first підходів, мобільних клієнтів або розробки платформ швидкого створення бізнес-застосунків.&lt;br /&gt;
&lt;br /&gt;
І навпаки, людина, яка створює сучасну ERP-платформу, має повне право оцінювати технологічні обмеження 1С і BAS. Особливо якщо до цього десятиліттями працювала з 1С, розробляла на ній, упроваджувала її, бачила її сильні та слабкі сторони й зрештою вирішила створити іншу технологічну основу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Назвати опонента некомпетентним — це не аргумент. Це словесна ширма, за якою часто ховається страх професійних змін.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Український продукт повинен бути ідеальним ще до того, як у нього почнуть вкладати ==&lt;br /&gt;
&lt;br /&gt;
Російська екосистема розвивалася десятиліттями. У неї вкладали гроші російські компанії, український бізнес, партнери, програмісти, навчальні центри та сотні тисяч замовників. Під неї створювали курси, конфігурації, інтеграції, методики та величезний кадровий ринок.&lt;br /&gt;
&lt;br /&gt;
Тепер українському продукту кажуть: спочатку наздоженіть усе це самостійно, створіть повний аналог кожної доробки, покажіть тисячі успішних упроваджень, зробіть систему дешевшою, швидшою та зручнішою — і лише тоді ми, можливо, дамо вам перше серйозне замовлення.&lt;br /&gt;
&lt;br /&gt;
Це не чесне ринкове порівняння. Це свідомо нерівні умови. Один продукт десятиліттями годував увесь ринок, а іншому пропонують довести свою зрілість, сидячи без їжі.&lt;br /&gt;
&lt;br /&gt;
Жодна технологічна індустрія так не розвивається. Продукти стають сильними завдяки реальним проєктам, вимогам клієнтів, фінансуванню, зворотному зв’язку та накопиченню галузевої експертизи. Українська ERP не виросте в ізоляції, поки український бізнес продовжує оплачувати розвиток старої російської екосистеми.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не можна тридцять років вкладати в 1С, а потім обурюватися, що українській платформі також потрібні гроші, час і клієнти.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Найстрашніше — не 1С. Найстрашніше — добровільна капітуляція мислення ==&lt;br /&gt;
&lt;br /&gt;
Після прочитання коментарів мене вразила не критика K2 ERP. Критикувати продукти нормально. Потрібно ставити складні питання, порівнювати функціональність, перевіряти архітектуру, рахувати повну вартість, вимагати відповідальності та професійності.&lt;br /&gt;
&lt;br /&gt;
Мене вразило інше: &#039;&#039;&#039;наскільки легко люди погоджуються не бачити головної проблеми&#039;&#039;&#039;. Наскільки швидко вони переходять від розмови про російський софт до обговорення характеру спікера. Як слухняно повторюють однакові тези. Як замість аналізу платформи розповідають про «PR». Як замість оцінки ризиків шукають максимальну ціну українського продукту. Як замість плану переходу пояснюють, чому ніхто нікуди не поспішає.&lt;br /&gt;
&lt;br /&gt;
Це і є добровільна технологічна капітуляція. Не тоді, коли у країни ще немає ідеальної альтернативи, а тоді, коли суспільство не хоче навіть допомагати її створювати. Коли захист звичного російського продукту стає сильнішим за бажання отримати власну технологічну незалежність.&lt;br /&gt;
&lt;br /&gt;
Мені соромно не за українських розробників, які ще не встигли створити абсолютно все. Мені соромно за багатомільярдні компанії, які після дванадцяти років війни пояснюють, що вони надто бідні для переходу. За керівників, які ховаються за бухгалтерами. За бухгалтерів, які ховаються за програмістами. За програмістів, які ховаються за конфігурацією.&lt;br /&gt;
&lt;br /&gt;
Мені соромно за всіх, хто дуже професійно перекладає відповідальність по колу, доки вона остаточно не зникає десь між регістром накопичення і планом рахунків.&lt;br /&gt;
&lt;br /&gt;
== BAS — це 1С. А підміна теми — її найкращий захист ==&lt;br /&gt;
&lt;br /&gt;
Можна ще тисячу разів назвати подкаст рекламним. Можна вигадувати приховані мотиви K2 ERP, знаходити максимальні ціни, вимагати нескінченних доказів та оголошувати некомпетентними всіх, хто говорить неприємні речі.&lt;br /&gt;
&lt;br /&gt;
Але жодна з цих маніпуляцій не відповідає на головне запитання: &#039;&#039;&#039;чому український бізнес після дванадцяти років війни досі масово працює на російській технологічній платформі?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
BAS — це 1С. Змінили назву, логотип і маркетингову упаковку, але не технологічну сутність. Ринок значною мірою залишився там само, де був. Перефарбування продукту вплинуло на сприйняття і, можливо, на формальні показники, але не звільнило країну від залежності.&lt;br /&gt;
&lt;br /&gt;
Росія б’є по Україні ракетами, а частина українців продовжує захищати російське програмне забезпечення. Не тому, що не розуміє походження BAS. Багато хто чудово все розуміє. Просто визнання правди означає необхідність діяти, витрачати гроші, вчитися, перебудовувати процеси та відповідати за рішення.&lt;br /&gt;
&lt;br /&gt;
Набагато легше оголосити все PR-акцією. Набагато зручніше вимагати ще аргументів. Набагато дешевше сьогодні сказати, що перехід надто дорогий, а завтра знову прокинутися від вибухів, відкрити російський конфігуратор і продовжити роботу так, ніби ці дві реальності жодним чином не пов’язані.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:24px 0; padding:20px 24px; background:#eef8ef; border-left:6px solid #2e7d32; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Та вони пов’язані. Технологічна залежність — це також залежність. Російська технологія не стає українською після зміни назви. BAS — це 1С. І доки український бізнес не матиме мужності назвати речі своїми іменами, справжнього технологічного звільнення не буде.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Дивіться повний випуск TAX Podcast ==&lt;br /&gt;
&lt;br /&gt;
У випуску обговорюються санкції проти 1С і BAS, технологічні та кібернетичні ризики, відповідальність керівників, вартість переходу, опір персоналу й майбутнє українського ринку корпоративного програмного забезпечення.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дивитися:&#039;&#039;&#039; [https://www.youtube.com/watch?v=fKgTSDcHUAo&amp;amp;list=PLRyc83tAN5QOOCknL2Bv_gHaz0Yzgyehe 1С та BAS під санкціями: чому бізнесу вже час переходити | TAX Podcast]&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Категорія:1С]]&lt;br /&gt;
[[index.php?title=Категорія:BAS]]&lt;br /&gt;
[[index.php?title=Категорія:Російське програмне забезпечення]]&lt;br /&gt;
[[index.php?title=Категорія:Імпортозаміщення]]&lt;br /&gt;
[[index.php?title=Категорія:Українські ERP-системи]]&lt;br /&gt;
[[index.php?title=Категорія:K2 ERP]]&lt;br /&gt;
[[index.php?title=Категорія:Технологічна незалежність України]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%96%D0%B4_%D0%B3%D1%83%D1%80%D0%BA%D1%96%D1%82_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D0%B8%D1%85_%D1%80%D0%B0%D0%BA%D0%B5%D1%82_%D0%B2%D0%BE%D0%BD%D0%B8_%D0%B7%D0%B0%D1%85%D0%B8%D1%89%D0%B0%D1%8E%D1%82%D1%8C_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D1%83_1%D0%A1&amp;diff=2770</id>
		<title>Під гуркіт російських ракет вони захищають російську 1С</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%96%D0%B4_%D0%B3%D1%83%D1%80%D0%BA%D1%96%D1%82_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D0%B8%D1%85_%D1%80%D0%B0%D0%BA%D0%B5%D1%82_%D0%B2%D0%BE%D0%BD%D0%B8_%D0%B7%D0%B0%D1%85%D0%B8%D1%89%D0%B0%D1%8E%D1%82%D1%8C_%D1%80%D0%BE%D1%81%D1%96%D0%B9%D1%81%D1%8C%D0%BA%D1%83_1%D0%A1&amp;diff=2770"/>
		<updated>2026-07-19T06:24:29Z</updated>

		<summary type="html">&lt;p&gt;R: Створена сторінка: **TOC**  = Під гуркіт російських ракет вони захищають російську 1С =  &amp;#039;&amp;#039;Як коментарі під TAX Podcast показали справжній масштаб технологічної залежності України&amp;#039;&amp;#039;  &amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#fff1f1; border-left:6px solid #c62828; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt; &amp;#039;&amp;#039;&amp;#039;...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;**TOC**&lt;br /&gt;
&lt;br /&gt;
= Під гуркіт російських ракет вони захищають російську 1С =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Як коментарі під TAX Podcast показали справжній масштаб технологічної залежності України&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#fff1f1; border-left:6px solid #c62828; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Знову грім. Знову вибухи. Знову Київ та інші українські міста прокидаються від російських ракет. А паралельно частина українського бізнесу продовжує захищати російську технологічну платформу, ніби дванадцять років війни — це ще недостатня причина хоча б почати думати про технологічну незалежність.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Росія вкотре намагається знищити нашу енергетику, підприємства, будинки, життя і саме право України бути незалежною державою. А майже в той самий час під подкастом про небезпеку російського програмного забезпечення з’являються українські коментатори, які кидаються захищати 1С і BAS з такою відданістю, ніби їм за це вже нараховують премію — обов’язково через документ «Нарахування лояльності агресору».&lt;br /&gt;
&lt;br /&gt;
Саме це стало для мене справжнім шоком після виходу [https://www.youtube.com/watch?v=fKgTSDcHUAo&amp;amp;list=PLRyc83tAN5QOOCknL2Bv_gHaz0Yzgyehe TAX Podcast про 1С, BAS, санкції та майбутнє українського бізнесу]. Тема випуску була сформульована гранично чітко: чому тисячі українських компаній досі працюють на 1С і BAS, які ризики несе така залежність, чому бізнес відкладає перехід і хто повинен брати на себе відповідальність за зміну корпоративної інформаційної системи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;У подкасті взагалі не було реклами K2 ERP.&#039;&#039;&#039; Там не проводилася презентація продукту, не демонструвалися модулі, не показувалися інтерфейси, не оголошувалися тарифи і не звучали заклики негайно щось купувати. K2 ERP згадувалася лише там, де це було природно й необхідно: як доказ того, що українські технологічні альтернативи існують і що українські розробники здатні створювати власні ERP-платформи.&lt;br /&gt;
&lt;br /&gt;
Більша частина розмови була присвячена боротьбі з ворожим програмним забезпеченням, походженню 1С і BAS, санкціям, кіберризикам, відповідальності власників бізнесу та необхідності розвивати власні технології. Проте частина аудиторії вперто не захотіла чути саме це.&lt;br /&gt;
&lt;br /&gt;
Замість розмови по суті почалося колективне виробництво інформаційного шуму. Хтось оголосив випуск «PR-подкастом». Хтось вирішив, що K2 ERP нібито хоче «прийти на все готове» і забрати собі ринок 1С та BAS. Хтось витягнув максимальну можливу ціну майбутньої комплектації й почав доводити, що український продукт дорогий. Інші заявили, що наведені аргументи — «не аргументи», а в студії нібито сидять люди, які не розуміють, про що говорять.&lt;br /&gt;
&lt;br /&gt;
Виникло дивне відчуття, що під відео працює не група живих людей, а погано налаштований бот, якому завантажили один-єдиний сценарій: &#039;&#039;&#039;за будь-яку ціну не допустити розмови про російську природу 1С і BAS&#039;&#039;&#039;. Не відповідай на поставлене питання. Не аналізуй ризики. Не сперечайся з основною тезою. Переведи розмову на особистість спікера, знайди максимальну ціну, вимагай нескінченних доказів, оголоси все рекламою — і головна проблема потоне у болоті другорядних суперечок.&lt;br /&gt;
&lt;br /&gt;
== Коли немає відповіді по суті, усе оголошують рекламою ==&lt;br /&gt;
&lt;br /&gt;
Назвати подкаст рекламним — найпростіший спосіб його не слухати. Це дуже зручна інтелектуальна послуга: думати не потрібно, перевіряти сказане не потрібно, відповідати на незручні питання також не потрібно. Достатньо приклеїти ярлик «PR», після чого можна з почуттям виконаного громадянського обов’язку повернутися до російського конфігуратора.&lt;br /&gt;
&lt;br /&gt;
Але давайте все ж повернемося до змісту. У подкасті обговорювали, чому український бізнес досі залишається на 1С і BAS, хто відповідає за вибір корпоративного програмного забезпечення, які ризики створює технологічна залежність і чому підприємства роками відкладають перехід. Говорили про санкції, кібербезпеку, вартість міграції, опір персоналу, роль керівників та про відсутність системної державної політики.&lt;br /&gt;
&lt;br /&gt;
Коли людина після такої розмови пише лише про «рекламу K2 ERP», це не критика подкасту. Це демонстрація того, що вона або не слухала випуск, або свідомо намагається розмити його зміст. Бо обговорювати справжню проблему незручно. Доведеться визнати, що дванадцять років війни підприємство працювало на російській технологічній основі, не створило плану переходу і тепер гарячково шукає пояснення, чому багаторічну бездіяльність потрібно вважати професійною мудрістю.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Оголосити розмову рекламою значно легше, ніж відповісти на просте запитання: чому під час війни ваш бізнес досі працює на російській платформі?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== BAS — це не споріднена технологія. BAS — це 1С ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#eef6ff; border-left:6px solid #1565c0; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;BAS — це 1С. Не «схожа система», не «споріднена технологія» і не нова незалежна українська платформа. Це 1С, перейменована та перефарбована для продовження роботи на українському ринку. Зміна логотипу не змінила технологічної суті продукту.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Тут не потрібно ховатися за дипломатичними формулюваннями. Це та сама технологічна природа: конфігуратор, метадані, довідники, документи, регістри, форми, модулі, запити, механізми проведення та загальна модель розробки.&lt;br /&gt;
&lt;br /&gt;
BAS не виникла як нова українська технологія, створена з нуля українськими інженерами. Вона з’явилася як спосіб продовжити використання продуктів екосистеми 1С після того, як російський бренд став токсичним, санкційним і незручним для відкритого просування на українському ринку.&lt;br /&gt;
&lt;br /&gt;
Змінили напис на заставці. Перемалювали логотип. Перепакували маркетинг. Почали переконувати ринок, що це вже нібито зовсім інший продукт. Але людина, яка хоча б раз відкривала конфігуратор, працювала з метаданими, запитами, формами, документами та регістрами, чудово розуміє, що відбулося.&lt;br /&gt;
&lt;br /&gt;
Один із коментаторів намагався довести, що BAS нібито стала іншою технологією, тому що в окремих функціях запитів виникли відмінності, а російська 1С за цей час «пішла вперед». Це приблизно як доводити, що автомобіль перестав бути автомобілем, тому що у новішій моделі переставили кнопку підігріву сидіння.&lt;br /&gt;
&lt;br /&gt;
Відмінності між релізами, конфігураціями чи окремими функціями не змінюють технологічної природи продукту. Навпаки, саме твердження, що BAS колись відокремилася від 1С, уже визнає її походження. Далі залишається здійснити надзвичайно складну інтелектуальну операцію: скласти два і два.&lt;br /&gt;
&lt;br /&gt;
Коли людина десять років працює в BAS, але жодного разу не відкрила конфігуратор і не зрозуміла, на якій платформі працює, це сумно. Коли вона після цього починає повчати розробників ERP-платформ і називати їх теоретиками — це вже комедія. Щоправда, комедія дуже дорога: квиток на неї десятиліттями оплачує весь український бізнес.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BAS не стала українською технологією через зміну напису на заставці. Перейменування продукту — це не технологічне імпортозаміщення. Це лише імпортозаміщення логотипу.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Перефарбована нафта, перефарбований газ і перефарбована 1С ==&lt;br /&gt;
&lt;br /&gt;
Механізм знайомий до болю. Російську нафту можна провести через посередника, змішати з іншою партією, змінити документи й маршрут. Російський газ можна кілька разів перепродати, пустити іншою трубою і назвати товаром іншої компанії. Російський бізнес можна переписати на нового власника, зареєструвати іншу юридичну особу та намалювати європейський логотип.&lt;br /&gt;
&lt;br /&gt;
Але походження від цього не змінюється. Нафта не стає демократичною після зміни танкера. Газ не вивчає європейські цінності під час проходження митниці. Російський бізнес не очищується від свого минулого після заміни таблички біля входу.&lt;br /&gt;
&lt;br /&gt;
Так само й 1С не стала українською після того, як на її місці з’явилися три латинські літери BAS. &#039;&#039;&#039;Перефарбування російського продукту не робить його українським. Воно лише дозволяє користувачеві психологічно комфортніше продовжувати робити те саме.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Найдивовижніше, що ця операція виявилася надзвичайно успішною. Для великої частини ринку зміни логотипу було достатньо, щоб оголосити проблему вирішеною. Раніше підприємство працювало на 1С, тепер воно працює на BAS — отже, у красивій презентації російського програмного забезпечення нібито стало менше.&lt;br /&gt;
&lt;br /&gt;
Те, що бухгалтер відкриває той самий конфігуратор, програміст працює з тією самою технологічною моделлю, а підприємство залишається в тій самій екосистемі, вирішили вважати несуттєвою дрібницею.&lt;br /&gt;
&lt;br /&gt;
Саме так і народжується зручна статистика. Не потрібно змінювати технології — достатньо змінити назви категорій у звіті. У нас не залишилося 1С, у нас тепер BAS. Не залишилося технологічної залежності — залишилася лише «історична сумісність». Не залишилося російського слона в кімнаті — тепер це український великий сірий консультант із цифрової трансформації.&lt;br /&gt;
&lt;br /&gt;
== Це болісно нагадує перші дні великої війни ==&lt;br /&gt;
&lt;br /&gt;
У перші дні повномасштабного вторгнення ми бачили людей, які виходили на мітинги з російськими прапорами, повторювали російські гасла, захищали агресора й переконували всіх, що опір нібито не має сенсу. Вони також розповідали, що «не все так однозначно», що Росія начебто прийшла когось рятувати, а українцям потрібно просто змиритися з новою реальністю.&lt;br /&gt;
&lt;br /&gt;
Сьогодні майже ніхто не ризикує виходити на вулицю з російським прапором. Але коли мова заходить про російські технології, ми раптом чуємо до болю знайомі інтонації: «Не треба все політизувати», «Це просто програма», «Без неї неможливо працювати», «Альтернатив немає», «BAS уже не російська», «Не потрібно поспішати», «Спочатку доведіть, що українське не гірше».&lt;br /&gt;
&lt;br /&gt;
Змінилися декорації, але залишився той самий психологічний механізм: &#039;&#039;&#039;захищати звичну російську присутність, применшувати небезпеку, висміювати тих, хто чинить опір, і вимагати дедалі нових доказів очевидного&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Тоді люди виходили з російськими прапорами. Тепер вони виходять у коментарі з прапором BAS і конфігуратором напереваги.&lt;br /&gt;
&lt;br /&gt;
Я не прирівнюю програмне забезпечення до ракет. Я говорю про інше: про дивовижну готовність частини суспільства захищати російську залежність навіть тоді, коли Росія відкрито намагається знищити Україну. Про небажання бачити причинно-наслідкові зв’язки. Про звичку шукати виправдання для російського і найменші недоліки в українському.&lt;br /&gt;
&lt;br /&gt;
Коли ворог б’є по твоїй країні, а ти витрачаєш інтелектуальну енергію не на пошук шляху до незалежності, а на захист російської платформи, питання вже не лише у програмному забезпеченні. Питання у системі цінностей.&lt;br /&gt;
&lt;br /&gt;
== «K2 ERP хоче прийти на все готове» ==&lt;br /&gt;
&lt;br /&gt;
Це один із найкумедніших аргументів, які з’явилися після випуску. K2 ERP нібито хоче прийти на готовий ринок і забрати клієнтів 1С та BAS.&lt;br /&gt;
&lt;br /&gt;
Хотілося б побачити це «готове». Ринок, який тридцять років будували під російську платформу? Компанії, які вклали мільйони у власні конфігурації 1С? Бухгалтери, які категорично не бажають вчитися? Програмісти, що сприймають появу сучасної альтернативи як особисту загрозу? Керівники, які відкладають рішення до наступного прильоту, санкційного пакета або пенсії головного бухгалтера?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не готовий ринок. Це ринок, окупований звичкою, страхом і багаторічними інвестиціями у російську технологію.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Прийти на все готове — це прийти в обладнаний офіс, увімкнути комп’ютер і почати працювати. Українські ERP-команди приходять не в обладнаний офіс, а в технологічний музей, де кожен експонат доробляли двадцять років, документацію давно загубили, а головний зберігач музею забороняє торкатися системи, тому що «воно поки працює».&lt;br /&gt;
&lt;br /&gt;
Кожного клієнта потрібно переконувати не просто змінити програму. Потрібно допомогти йому подолати накопичений страх, опір персоналу, залежність від конкретних спеціалістів, хаос у даних, сотні самописних доробок і переконання, що все українське за замовчуванням повинно бути дешевим, безпомилковим і готовим до будь-якого підприємства ще до першого реального замовлення.&lt;br /&gt;
&lt;br /&gt;
Якщо це називається «прийти на все готове», то можна лише уявити, як виглядає складний ринок.&lt;br /&gt;
&lt;br /&gt;
== Знайти максимальну ціну — ще не означає порахувати вартість ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:20px 0; padding:18px 22px; background:#fff8e1; border-left:6px solid #f9a825; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Порівнювати максимальну комплектацію українського продукту з мінімальною ціною коробки BAS — це не фінансовий аналіз. Це цирковий номер із калькулятором. Справжнє порівняння повинно враховувати повну вартість володіння системою протягом кількох років.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Наступний улюблений трюк — знайти максимальну можливу ціну майбутньої комплектації K2 ERP, урочисто принести її у коментарі й оголосити продукт дорогим. Методика аналізу приголомшує своєю точністю: беремо найбільшу цифру, не дивимося, що до неї входить, не порівнюємо моделі ліцензування, не враховуємо кількість користувачів, модулі, вихідний код, інфраструктуру та обсяг адаптації — і робимо серйозне обличчя.&lt;br /&gt;
&lt;br /&gt;
При цьому повна вартість володіння 1С і BAS чомусь зникає з калькулятора. Не враховуються ліцензії, сервери, клієнтські доступи, бази даних, супровід, оновлення, зарплати програмістів, нескінченні доопрацювання, інтеграції, простої, технічний борг і залежність від людей, які десятиліттями накопичували знання лише про одну закриту екосистему.&lt;br /&gt;
&lt;br /&gt;
Не порівнюється український продукт і з реальними західними ERP-системами, де впровадження, консалтинг, ліцензії та підтримка можуть коштувати зовсім інших грошей. Західній системі дозволено бути дорогою, бо вона західна. BAS дозволено бути дорогою, бо до неї звикли. Українська система, згідно з народною економічною доктриною, повинна бути функціональнішою за SAP, простішою за Excel і бажано коштувати дешевше за підписку на музичний сервіс.&lt;br /&gt;
&lt;br /&gt;
Справжнє порівняння починається з повної вартості володіння. Скільки система коштує протягом п’яти чи десяти років? Скільки людей потрібно для її підтримки? Наскільки складно її розвивати? Які ризики вона створює? Наскільки підприємство залежить від конкретного постачальника, програміста або вузької технології? Скільки коштуватиме подальше відкладання переходу?&lt;br /&gt;
&lt;br /&gt;
Без відповідей на ці питання демонстрація однієї максимальної цифри є не аналізом, а способом налякати аудиторію і повернути її у звичне болото.&lt;br /&gt;
&lt;br /&gt;
== Великі компанії, які раптом стають дуже бідними ==&lt;br /&gt;
&lt;br /&gt;
З цією логікою я стикаюся постійно. Приходиш у велику компанію з величезними оборотами, тисячами працівників і складними бізнес-процесами. У красивому переговорному кабінеті тобі пояснюють, що підприємство багато років вкладало мільйони в 1С, тому тепер не може вкладати гроші в українське рішення.&lt;br /&gt;
&lt;br /&gt;
Це класична пастка вже понесених витрат, добре відома будь-якій людині, яка хоча б трохи розуміється на бізнесі. Компанія продовжує вкладати у застарілий напрям не тому, що він залишається найкращим, а тому, що їй психологічно боляче визнати помилковість попередніх вкладень. Замість оцінювання майбутніх ризиків та можливостей керівники стають заручниками грошей, які вже неможливо повернути.&lt;br /&gt;
&lt;br /&gt;
На 1С мільйони були. На десятиліття доопрацювань гроші були. На сервери, консультантів, програмістів, підтримку та аварійне латання гроші є й зараз. Але щойно мова заходить про українську платформу, багатомільярдна компанія раптом перетворюється на бідну студентську організацію, яка просить знижку, грант, безкоштовний пілот, безкоштовне перенесення даних і бажано ще компенсацію моральної травми від необхідності вивчити нову кнопку.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не відсутність грошей. Це відсутність пріоритету.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Бізнес завжди знаходить ресурси на те, що вважає важливим. Якщо підприємство продовжує вкладати в 1С і відмовляється вкладати в українську технологію, воно вже зробило свій вибір. Не бухгалтер, не програміст і не ринок. Вибір зробило керівництво.&lt;br /&gt;
&lt;br /&gt;
== «Ніхто нікуди не поспішає» ==&lt;br /&gt;
&lt;br /&gt;
Цю фразу часто вимовляють майже з гордістю, наче йдеться про ознаку стратегічної зрілості. Ніхто нікуди не поспішає, весь ринок працює на 1С і BAS, отже можна спокійно сидіти далі.&lt;br /&gt;
&lt;br /&gt;
Саме в цьому й полягає проблема. Якщо весь ринок одночасно робить помилку, вона не перетворюється на правильне рішення. Вона просто стає системною помилкою. Мільйони людей можуть роками користуватися небезпечною або застарілою технологією, але кількість користувачів не змінює її походження та не усуває ризиків.&lt;br /&gt;
&lt;br /&gt;
Ринок справді не поспішає. Він чекає, доки держава заборонить, оштрафує, примусить, профінансує та ще й особисто проведе кожного бухгалтера за руку до нової системи. Бізнес хоче технологічної незалежності, але бажано без рішень, витрат, навчання, відповідальності та найменшого дискомфорту.&lt;br /&gt;
&lt;br /&gt;
Росія тим часом не чекає. Вона не відкладає ракети до моменту, коли український бізнес завершить бюджетування. Вона не питає, чи зручно нам сьогодні відмовлятися від її технологій. Вона використовує будь-яку залежність як ресурс впливу, а ми продовжуємо обговорювати, чи достатньо ввічливо українські розробники попросили ринок прокинутися.&lt;br /&gt;
&lt;br /&gt;
== Дев’яносто п’ять відсотків залежності, яку сховали перейменуванням ==&lt;br /&gt;
&lt;br /&gt;
За моєю професійною оцінкою, реальне проникнення російського програмного забезпечення в український бізнес залишається на рівні &#039;&#039;&#039;90–95%&#039;&#039;&#039;. Це не офіційна державна статистика, а оцінка, сформована на основі багаторічної роботи з підприємствами різного масштабу.&lt;br /&gt;
&lt;br /&gt;
Куди не зайди, 1С або BAS знаходиться у бухгалтерії, на складі, у зарплаті, виробництві, торгівлі, окремому підрозділі чи старій базі, про яку керівництво навіть не згадало під час першої зустрічі. Навіть у компаніях, які заявляють, що давно відмовилися від 1С, раптово знаходиться окрема база для зарплати, складський облік, архів або «маленька допоміжна система», без якої чомусь зупиняється половина підприємства.&lt;br /&gt;
&lt;br /&gt;
Формально показник міг зменшитися. Але часто не тому, що підприємства перейшли на українські чи західні платформи, а тому, що 1С перестали називати 1С. Частину того самого технологічного масиву тепер записують у статистиці як BAS, локальний продукт або окрему екосистему.&lt;br /&gt;
&lt;br /&gt;
Так легко перемогти будь-яку залежність. Потрібно лише перейменувати її.&lt;br /&gt;
&lt;br /&gt;
Не відмовилися від російської платформи — змінили назву. Не провели імпортозаміщення — оновили логотип. Не створили технологічної незалежності — перемістили рядок в інший розділ таблиці. Звіт зелений, презентація красива, залежність залишилася.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Український ринок не пішов із 1С. Він значною мірою просто перейшов із напису «1С» на напис «BAS».&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== «Ваші аргументи — не аргументи» ==&lt;br /&gt;
&lt;br /&gt;
Ще одна зручна позиція — оголосити всі наведені аргументи недостатніми. Дванадцять років війни — не аргумент. Російське походження платформи — не аргумент. Санкції — не аргумент. Кіберризики — не аргумент. Технологічна залежність — не аргумент. Необхідність розвивати українські продукти — також не аргумент.&lt;br /&gt;
&lt;br /&gt;
Тоді що саме вони хочуть почути? Скільки ще має пройти років? Скільки українських міст повинні почути російські ракети, щоб питання технологічної залежності перестало здаватися передчасним? Чи потрібна персональна ракета з накладною та актом виконаних робіт, щоб керівник нарешті визнав аргумент достатньо переконливим?&lt;br /&gt;
&lt;br /&gt;
Проблема не у відсутності аргументів. &#039;&#039;&#039;Проблема в тому, що жодна кількість аргументів не переконає людину, яка захищає не позицію, а власний комфорт.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Вона проситиме нові докази без кінця, тому що мета полягає не в тому, щоб переконатися. Мета — відкласти рішення. Сьогодні їй потрібні кейси. Завтра — ще більше кейсів. Післязавтра — порівняльна таблиця. Потім державна гарантія, безкоштовна міграція, десять років безпомилкової експлуатації та письмове зобов’язання, що жодному бухгалтеру не доведеться нічого вчити.&lt;br /&gt;
&lt;br /&gt;
І навіть після цього знайдеться вирішальний аргумент: «А от у нас є один звіт, який у BAS відкривається двома натисканнями».&lt;br /&gt;
&lt;br /&gt;
== «У студії сидять не спеціалісти» ==&lt;br /&gt;
&lt;br /&gt;
Коли не вдається спростувати сказане, потрібно дискредитувати того, хто говорить. Це старий, примітивний, але досі популярний прийом. Людей із десятиліттями досвіду розробки, автоматизації та впровадження корпоративних систем оголошують «теоретиками» коментатори, які іноді навіть не розрізняють платформу, конфігурацію та прикладне рішення.&lt;br /&gt;
&lt;br /&gt;
Особливо кумедно, коли фахівець, який усе життя супроводжував одну технологію, пояснює автору іншої ERP-платформи, що той не розуміється на розробці. Це нагадує ситуацію, коли досвідчений водій маршрутки приходить на авіаційний завод і з порога повідомляє інженерам, що вони нічого не знають про транспорт, бо в їхньому літаку немає валідатора для проїзних.&lt;br /&gt;
&lt;br /&gt;
Досвід роботи в 1С може бути глибоким і цінним, але він не дає автоматичної монополії на розуміння всіх технологій. Знання синтаксису однієї платформи не робить людину експертом із сучасної вебархітектури, хмарних систем, розподілених середовищ, PostgreSQL, API-first підходів, мобільних клієнтів або розробки платформ швидкого створення бізнес-застосунків.&lt;br /&gt;
&lt;br /&gt;
І навпаки, людина, яка створює сучасну ERP-платформу, має повне право оцінювати технологічні обмеження 1С і BAS. Особливо якщо до цього десятиліттями працювала з 1С, розробляла на ній, упроваджувала її, бачила її сильні та слабкі сторони й зрештою вирішила створити іншу технологічну основу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Назвати опонента некомпетентним — це не аргумент. Це словесна ширма, за якою часто ховається страх професійних змін.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Український продукт повинен бути ідеальним ще до того, як у нього почнуть вкладати ==&lt;br /&gt;
&lt;br /&gt;
Російська екосистема розвивалася десятиліттями. У неї вкладали гроші російські компанії, український бізнес, партнери, програмісти, навчальні центри та сотні тисяч замовників. Під неї створювали курси, конфігурації, інтеграції, методики та величезний кадровий ринок.&lt;br /&gt;
&lt;br /&gt;
Тепер українському продукту кажуть: спочатку наздоженіть усе це самостійно, створіть повний аналог кожної доробки, покажіть тисячі успішних упроваджень, зробіть систему дешевшою, швидшою та зручнішою — і лише тоді ми, можливо, дамо вам перше серйозне замовлення.&lt;br /&gt;
&lt;br /&gt;
Це не чесне ринкове порівняння. Це свідомо нерівні умови. Один продукт десятиліттями годував увесь ринок, а іншому пропонують довести свою зрілість, сидячи без їжі.&lt;br /&gt;
&lt;br /&gt;
Жодна технологічна індустрія так не розвивається. Продукти стають сильними завдяки реальним проєктам, вимогам клієнтів, фінансуванню, зворотному зв’язку та накопиченню галузевої експертизи. Українська ERP не виросте в ізоляції, поки український бізнес продовжує оплачувати розвиток старої російської екосистеми.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не можна тридцять років вкладати в 1С, а потім обурюватися, що українській платформі також потрібні гроші, час і клієнти.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Найстрашніше — не 1С. Найстрашніше — добровільна капітуляція мислення ==&lt;br /&gt;
&lt;br /&gt;
Після прочитання коментарів мене вразила не критика K2 ERP. Критикувати продукти нормально. Потрібно ставити складні питання, порівнювати функціональність, перевіряти архітектуру, рахувати повну вартість, вимагати відповідальності та професійності.&lt;br /&gt;
&lt;br /&gt;
Мене вразило інше: &#039;&#039;&#039;наскільки легко люди погоджуються не бачити головної проблеми&#039;&#039;&#039;. Наскільки швидко вони переходять від розмови про російський софт до обговорення характеру спікера. Як слухняно повторюють однакові тези. Як замість аналізу платформи розповідають про «PR». Як замість оцінки ризиків шукають максимальну ціну українського продукту. Як замість плану переходу пояснюють, чому ніхто нікуди не поспішає.&lt;br /&gt;
&lt;br /&gt;
Це і є добровільна технологічна капітуляція. Не тоді, коли у країни ще немає ідеальної альтернативи, а тоді, коли суспільство не хоче навіть допомагати її створювати. Коли захист звичного російського продукту стає сильнішим за бажання отримати власну технологічну незалежність.&lt;br /&gt;
&lt;br /&gt;
Мені соромно не за українських розробників, які ще не встигли створити абсолютно все. Мені соромно за багатомільярдні компанії, які після дванадцяти років війни пояснюють, що вони надто бідні для переходу. За керівників, які ховаються за бухгалтерами. За бухгалтерів, які ховаються за програмістами. За програмістів, які ховаються за конфігурацією.&lt;br /&gt;
&lt;br /&gt;
Мені соромно за всіх, хто дуже професійно перекладає відповідальність по колу, доки вона остаточно не зникає десь між регістром накопичення і планом рахунків.&lt;br /&gt;
&lt;br /&gt;
== BAS — це 1С. А підміна теми — її найкращий захист ==&lt;br /&gt;
&lt;br /&gt;
Можна ще тисячу разів назвати подкаст рекламним. Можна вигадувати приховані мотиви K2 ERP, знаходити максимальні ціни, вимагати нескінченних доказів та оголошувати некомпетентними всіх, хто говорить неприємні речі.&lt;br /&gt;
&lt;br /&gt;
Але жодна з цих маніпуляцій не відповідає на головне запитання: &#039;&#039;&#039;чому український бізнес після дванадцяти років війни досі масово працює на російській технологічній платформі?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
BAS — це 1С. Змінили назву, логотип і маркетингову упаковку, але не технологічну сутність. Ринок значною мірою залишився там само, де був. Перефарбування продукту вплинуло на сприйняття і, можливо, на формальні показники, але не звільнило країну від залежності.&lt;br /&gt;
&lt;br /&gt;
Росія б’є по Україні ракетами, а частина українців продовжує захищати російське програмне забезпечення. Не тому, що не розуміє походження BAS. Багато хто чудово все розуміє. Просто визнання правди означає необхідність діяти, витрачати гроші, вчитися, перебудовувати процеси та відповідати за рішення.&lt;br /&gt;
&lt;br /&gt;
Набагато легше оголосити все PR-акцією. Набагато зручніше вимагати ще аргументів. Набагато дешевше сьогодні сказати, що перехід надто дорогий, а завтра знову прокинутися від вибухів, відкрити російський конфігуратор і продовжити роботу так, ніби ці дві реальності жодним чином не пов’язані.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;box-sizing:border-box; width:100%; margin:24px 0; padding:20px 24px; background:#eef8ef; border-left:6px solid #2e7d32; border-radius:6px; overflow-wrap:anywhere;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Та вони пов’язані. Технологічна залежність — це також залежність. Російська технологія не стає українською після зміни назви. BAS — це 1С. І доки український бізнес не матиме мужності назвати речі своїми іменами, справжнього технологічного звільнення не буде.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Дивіться повний випуск TAX Podcast ==&lt;br /&gt;
&lt;br /&gt;
У випуску обговорюються санкції проти 1С і BAS, технологічні та кібернетичні ризики, відповідальність керівників, вартість переходу, опір персоналу й майбутнє українського ринку корпоративного програмного забезпечення.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дивитися:&#039;&#039;&#039; [https://www.youtube.com/watch?v=fKgTSDcHUAo&amp;amp;list=PLRyc83tAN5QOOCknL2Bv_gHaz0Yzgyehe 1С та BAS під санкціями: чому бізнесу вже час переходити | TAX Podcast]&lt;br /&gt;
&lt;br /&gt;
[[Категорія:1С]]&lt;br /&gt;
[[Категорія:BAS]]&lt;br /&gt;
[[Категорія:Російське програмне забезпечення]]&lt;br /&gt;
[[Категорія:Імпортозаміщення]]&lt;br /&gt;
[[Категорія:Українські ERP-системи]]&lt;br /&gt;
[[Категорія:K2 ERP]]&lt;br /&gt;
[[Категорія:Технологічна незалежність України]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%91%D1%83%D1%85%D0%B3%D0%B0%D0%BB%D1%82%D0%B5%D1%80_1%D0%A1.png&amp;diff=2769</id>
		<title>Файл:Бухгалтер 1С.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%91%D1%83%D1%85%D0%B3%D0%B0%D0%BB%D1%82%D0%B5%D1%80_1%D0%A1.png&amp;diff=2769"/>
		<updated>2026-07-19T06:24:26Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0&amp;diff=2768</id>
		<title>Головна сторінка</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0&amp;diff=2768"/>
		<updated>2026-07-19T06:24:10Z</updated>

		<summary type="html">&lt;p&gt;R: Під гуркіт російських ракет вони захищають російську 1С&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Wiki k2erp.png|центр|міні|800x800пкс|Wiki K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Про систему K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP]] — це комплексна система управління підприємством, яка об’єднує фінанси, бухгалтерію, продажі, склад, закупівлі, документообіг, CRM, аналітику та галузеві модулі в єдиному цифровому середовищі. Система допомагає автоматизувати щоденні процеси, зменшити ручну роботу й кількість помилок, контролювати ресурси в реальному часі, швидше обробляти заявки та документи, бачити повну картину бізнесу й приймати точні управлінські рішення на основі актуальних даних. Завдяки модульності, хмарному доступу та гнучкому налаштуванню K2 ERP підходить для компаній різного масштабу й допомагає бізнесу працювати прозоріше, ефективніше та впевнено масштабуватися.&lt;br /&gt;
&lt;br /&gt;
Подробно про систему читайте в статті: [[K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Відмова від 1С та BAS під ключ: перехід неминучий — питання лише в тому, хто встигне зробити його планово]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP — реальна альтернатива 1С та BAS? Бо міняти російське ПЗ на “майже те саме” — це вже не стратегія, а бізнесовий мазохізм]]&lt;br /&gt;
&lt;br /&gt;
[[ERP нового покоління: чому власна платформа K2 ERP на Python і TypeScript сильніша за спадщину 1С/BAS та важкі enterprise-рішення]]&lt;br /&gt;
&lt;br /&gt;
[[Короткі відео про роботу в K2 ERP: українська ERP, яку можна побачити в дії]]&lt;br /&gt;
&lt;br /&gt;
[[Ознайомче відео про K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Альтернатива 1С: якою вона повинна бути насправді]]&lt;br /&gt;
&lt;br /&gt;
[[Робимо бізнес разом!]]&lt;br /&gt;
&lt;br /&gt;
[[Не витрачайте роки та гроші на ERP з нуля. Об’єднуймося навколо K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Лавинний розвиток K2 ERP: чому відкрита українська ERP-система розвивається швидше за старий світ 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP йде шляхом швидкої розробки, моделей, конструкторів і об’єднання даних]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP розвиває власну систему, а не Odoo, IT-Enterprise чи SAP]]&lt;br /&gt;
&lt;br /&gt;
[[Візитка K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Хто ваш клієнт, K2?]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP відкрила безкоштовну хмару для українського бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Інструменти розробника K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Програмування зі швидкістю думки]]&lt;br /&gt;
&lt;br /&gt;
[[Чим відрізняється робота в cloud.corp2.eu від власної хмари]]&lt;br /&gt;
&lt;br /&gt;
[[Розробка K2 ERP на замовлення як правильний перехід з 1С та BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Продуктова компанія, інтегратор чи гібридна модель K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Нові можливості K2 ERP: коли система розвивається з параболічною швидкістю (травень 2026)]]&lt;br /&gt;
&lt;br /&gt;
[[Можливості K2 ERP — травень 2026]]&lt;br /&gt;
&lt;br /&gt;
[[Новий модуль «Зарплата та кадри» в K2 ERP: коли зарплата рахується, кадри не губляться, а бухгалтер більше не живе в Excel]]&lt;br /&gt;
&lt;br /&gt;
[[Виробництво без хаосу: як модуль «Виробництво» в K2 ERP веде виріб від специфікації до готової продукції]]&lt;br /&gt;
&lt;br /&gt;
== Вартість K2 ERP ==&lt;br /&gt;
[[Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування]]&lt;br /&gt;
&lt;br /&gt;
[[Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії]]&lt;br /&gt;
&lt;br /&gt;
== Перехід з 1С та BAS на K2 ERP ==&lt;br /&gt;
[[Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка]]&lt;br /&gt;
&lt;br /&gt;
== Стандартизація ==&lt;br /&gt;
[[ISO 9001 Scrum регламент K2 ERP: система якості, тижневі спринти, Zoom-записи, VDoc і Telegram-комунікації|ISO 9001 + Scrum + регламент K2 ERP: система якості, тижневі спринти, Zoom-записи, VDoc і Telegram-комунікації]]&lt;br /&gt;
&lt;br /&gt;
== Акції та пропозиції ==&lt;br /&gt;
[[Навчайте студентів працювати з українською ERP-системою K2 ERP — альтернативою 1С та BAS]]&lt;br /&gt;
&lt;br /&gt;
== Вакансії ==&lt;br /&gt;
[[Python-програмісти, які хочуть працювати з K2 ERP: не чекайте “колись”. Починайте зараз]]&lt;br /&gt;
&lt;br /&gt;
== Історія про K2 ERP ==&lt;br /&gt;
[[Звідки взявся K2® ERP]]&lt;br /&gt;
&lt;br /&gt;
== Сайти K2 ERP ==&lt;br /&gt;
[[Ресурси K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Комунікація з K2 ERP ==&lt;br /&gt;
[[Регламент K2]]&lt;br /&gt;
&lt;br /&gt;
[[Звернення через HelpDesk]]&lt;br /&gt;
&lt;br /&gt;
== Концептуальні підходи та принципи роботи ==&lt;br /&gt;
[[Кількість ліцензій BAS проти безліміту K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Концепція передпродажних модулів K2 ERP: як малими внесками перемагати великі системи]]&lt;br /&gt;
&lt;br /&gt;
[[Магія єдиної системи: чому модульний підхід K2 ERP у рази, десятки разів і навіть на порядки ефективніший за 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[AI в K2 ERP: коли облік перестає бути нудним, а бізнес починає дихати на повні груди]]&lt;br /&gt;
&lt;br /&gt;
[[Чи є ризик залежності від одного підрядника при автоматизації бізнесу?]]&lt;br /&gt;
&lt;br /&gt;
[[Другий раз платити за той самий “зоопарк” ніхто не хоче: чому перехід з 1С на K2 ERP — це не про нову кастомізацію, а про нову логіку бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Чому “олдскульні” гриди насправді рятують бізнес: краса інтерфейсу не дорівнює силі продукту]]&lt;br /&gt;
&lt;br /&gt;
[[Крос-платформеність: та сама “дрібниця”, на якій великі компанії щороку залишають купу грошей]]&lt;br /&gt;
&lt;br /&gt;
== Пояснення термінів ==&lt;br /&gt;
&lt;br /&gt;
[[Що таке ERP — і чому справжня ERP-система починається там, де закінчується звичка зводити бізнес до бухгалтерії]]&lt;br /&gt;
&lt;br /&gt;
[[Що таке CRM і чому її інтеграція з ERP відкриває нові можливості для бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[CMS у K2 ERP: сайт компанії, який не просто “висить в інтернеті”, а працює на бізнес]]&lt;br /&gt;
&lt;br /&gt;
[[Інтернет-магазин у K2 ERP: коли онлайн-продажі стають частиною єдиної системи, а не окремим головним болем]]&lt;br /&gt;
&lt;br /&gt;
== Для користувачів ==&lt;br /&gt;
&lt;br /&gt;
[[Початок роботи з K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Звіти в K2 Cloud ERP|Звіти в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[CRM Файли в K2 ERP|CRM + Файли в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Повне відео демонстрації K2 ERP доступне з оригінальним голосом інтерфейсу та реального показу роботи системи]]&lt;br /&gt;
&lt;br /&gt;
[[Хмара K2 ERP для безкоштовної реальної роботи]] &lt;br /&gt;
&lt;br /&gt;
[[Управлінський облік K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Бухгалтерія K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[CRM K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Складський облік K2 ERP (WMS)]]&lt;br /&gt;
&lt;br /&gt;
[[CMS K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Інтернет-магазин K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 VDoc]]&lt;br /&gt;
&lt;br /&gt;
[[Галузеві рішення K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Звіти та аналітика K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Поширені питання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Використання штучного інтелекту в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Для адміністраторів K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Для адміністраторів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор хмари K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор гілки K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор проєкту K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Користувачі та ролі K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Права доступу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Налаштування інтерфейсу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Друковані форми K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Кастомізація звітів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Контроль і аудит K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Для програмістів ==&lt;br /&gt;
&lt;br /&gt;
[[Розгортання системи K2 ERP Python для розробників]]&lt;br /&gt;
&lt;br /&gt;
[[Архітектура K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Встановлення K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Розгортання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Створення модулів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[База даних K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[API K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Інтеграції K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 CMS]]&lt;br /&gt;
&lt;br /&gt;
[[Розробка веб-інтерфейсів K2]]&lt;br /&gt;
&lt;br /&gt;
[[Бізнес-процеси K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Права доступу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Рекомендації для розробників K2]]&lt;br /&gt;
&lt;br /&gt;
[[Класи та команди K2 ERP Python]]&lt;br /&gt;
&lt;br /&gt;
[[Стандарти UI K2 2025]]&lt;br /&gt;
&lt;br /&gt;
== Атестаційні завдання по K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Атестаційні завдання по K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== K2 ERP PHP ==&lt;br /&gt;
&lt;br /&gt;
[[Практична робота в K2 ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
[[Інструкція по розгортанню K2 ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
[[Класи та команди K2 Cloud ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
== Довідник та модулі системи K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
== Комплексні рішення K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP технологічна платформа]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Управлінський облік]]&lt;br /&gt;
&lt;br /&gt;
== Модулі K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 Ядро]]&lt;br /&gt;
&lt;br /&gt;
[[K2 CMS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Інтернет-магазин]]&lt;br /&gt;
&lt;br /&gt;
[[К2 CRM]]&lt;br /&gt;
&lt;br /&gt;
[[К2 WMS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 VDoc (Електронний документообіг)]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Система online-навчання]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Документообіг]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Дошка оголошень]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Портал творів мистецтва]]&lt;br /&gt;
&lt;br /&gt;
[[К2 ТОІР та облік запчастин]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Update]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Фінансовий облік]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Каса]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Ресторан]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Готель]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Зарплата та кадри]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Виробництво]]&lt;br /&gt;
&lt;br /&gt;
[[K2 multi-GAAP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 HelpDesk]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Мобільний додаток Android]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Мобільний додаток IOS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Стоматологічна клініка]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Салон краси]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Бронювання послуг]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Автоперевезення]]&lt;br /&gt;
&lt;br /&gt;
== Інтеграційні модулі K2 ERP ==&lt;br /&gt;
[[K2 Модуль Медок]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Вчасно]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Птах]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Мурашина логістика]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль GPS-трекінг]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Вчасно Каса]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Ringostat до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Нова пошта]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Укрпошта]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Телеграм бот до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Whatsapp бот до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Turbosms до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Email до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Hurma]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль обмінів з банками]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Horoshop]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Rozetka]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Prom]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Hotline]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль ДПС]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Приватбанк]]&lt;br /&gt;
&lt;br /&gt;
[[Модуль Edin]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Liqpay для інтернет-магазину]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Wayforpay для інтернет-магазину]]&lt;br /&gt;
&lt;br /&gt;
== Інструментальні модулі K2 ERP ==&lt;br /&gt;
[[K2 Конструктор структури бази даних]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Конструктор звітів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Конструктор BI звітів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Реплікатор]]&lt;br /&gt;
&lt;br /&gt;
[[IDE в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Десктопні додатки ==&lt;br /&gt;
[[K2 Cloud ERP: Десктопний додаток для Linux, Windows та macOS — швидка робота з хмарами без хаосу вкладок]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Desktop — коли потужність розробки перетворюється на зручний інструмент]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Cloud ERP Desktop: один додаток замість десятків вкладок, ярликів і “вічного пошуку потрібного вікна”]]&lt;br /&gt;
&lt;br /&gt;
== Торгове та перефірійне обладнання ==&lt;br /&gt;
[[РРО та ПРРО]]&lt;br /&gt;
&lt;br /&gt;
== Модулі на PHP ==&lt;br /&gt;
[[Mantis BT K2]]&lt;br /&gt;
&lt;br /&gt;
== Робота в K2 ==&lt;br /&gt;
[[Налаштування WireGuard]]&lt;br /&gt;
&lt;br /&gt;
[[Веб-Пошта]]&lt;br /&gt;
&lt;br /&gt;
== Навігація за категоріями ==&lt;br /&gt;
Усі статті бази знань автоматично групуються за категоріями:&lt;br /&gt;
&lt;br /&gt;
* [[:Категорія:ERP-системи|ERP-системи]]&lt;br /&gt;
* [[:Категорія:Програмне забезпечення, розроблене в Україні|Українське ПЗ]]&lt;br /&gt;
* [[:Категорія:Програмне забезпечення для бізнесу|ПЗ для бізнесу]]&lt;br /&gt;
&lt;br /&gt;
== Порівняння систем ==&lt;br /&gt;
&lt;br /&gt;
[[Чим K2 ERP краще за 1С/BAS, Парус/Афіна, Бітрікс, BIMP, A5 та інші ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs BAS ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs BAS Управління торгівлею (UT)]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Парус-Підприємство]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs SAP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Microsoft Dynamics 365]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Oracle NetSuite]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Odoo]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Scoro]]&lt;br /&gt;
&lt;br /&gt;
== Партнерство ==&lt;br /&gt;
[[Умови партнерства]]&lt;br /&gt;
&lt;br /&gt;
[[Партнери K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Кейси K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Кейс: як ми посилили ТОІР транспорту Нової пошти та цифровізували облік ремонтів і деталей для Kamag]]&lt;br /&gt;
&lt;br /&gt;
== Статті по IT ==&lt;br /&gt;
&lt;br /&gt;
[[Скільки реально коштують “дешеві” ліцензії Odoo, Microsoft Dynamics і SAP у порівнянні з K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Україна має виростити власні продуктові IT-компанії. Інакше за нас це зроблять чужі]]&lt;br /&gt;
&lt;br /&gt;
[[Смерть під ковдрою ілюзій: Чому перехід з 1С на BAS у 2026 році — це найдорожчий самообман українського бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[BAS маскувалась під український продукт. А тепер російський K2 Cloud може маскувати K2 під російський? Дивний маскарад брендів триває]]&lt;br /&gt;
&lt;br /&gt;
[[BAS нема чого запропонувати ринку, крім 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Давайте називати все своїми іменами: 1С, а не BAS. Говоріть завжди 1С, не йдіть на поводу ребрендіга 1С!]]&lt;br /&gt;
&lt;br /&gt;
[[Пастка SaaS-систем]]&lt;br /&gt;
&lt;br /&gt;
[[BAS стає токсичним — чому українському бізнесу час відмовитися від 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Росія виграє. 12:0 на користь росії]]&lt;br /&gt;
&lt;br /&gt;
[[BAS у вишиванці, або 1С, яка сходила на ребрендинг]]&lt;br /&gt;
&lt;br /&gt;
[[1С нагадує наші технології 20-річної давнини. Ба, це і є технології тих часів]]&lt;br /&gt;
&lt;br /&gt;
[[BAS — це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS та іншому ворожому софту — капут]]&lt;br /&gt;
&lt;br /&gt;
[[Еволюція веде до революції]]&lt;br /&gt;
&lt;br /&gt;
[[Чому українські ERP досі не витіснили 1С та BAS з ринку України за 12 років війни]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: 30 років російського запору в українському бізнесі]]&lt;br /&gt;
&lt;br /&gt;
[[Гібридний трактор Lamborghini і гібридна ERP K2: як українська технологія може змінити ринок автоматизації]]&lt;br /&gt;
&lt;br /&gt;
[[Як російські ERP-системи змінили прапор, але не змінили код]]&lt;br /&gt;
&lt;br /&gt;
[[Кому “заборонено” 1С та BAS?]]&lt;br /&gt;
&lt;br /&gt;
[[BASкетбол з санкціями: як “українська альтернатива 1С” закидає бізнесу рекламні трьохочкові]]&lt;br /&gt;
&lt;br /&gt;
[[BAS, BaaS, BAF — це нова етикетка для старого 1С. Час називати речі своїми іменами]]&lt;br /&gt;
&lt;br /&gt;
[[Як закалявся BAS, або як 1С фарбували на Великдень]]&lt;br /&gt;
&lt;br /&gt;
[[Життя після 1С та BAS: Великий огляд українського ринку ERP-систем та реальних альтернатив у 2026 році]]&lt;br /&gt;
&lt;br /&gt;
[[Відкритий похідний код, Open Source і K2 ERP: коли програмісти відкривають капот, але не віддають ключі від усього автопарку]]&lt;br /&gt;
&lt;br /&gt;
[[Цифрова деокупація та санкції в Україні]]&lt;br /&gt;
&lt;br /&gt;
[[Український бізнес і його токсичні стосунки з 1С/BAS: сміємося, платимо, страждаємо — і далі називаємо це “автоматизацією”]]&lt;br /&gt;
&lt;br /&gt;
[[1С більше не законодавець мод. Тепер тренди створюють українські ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Безкоштовна українська хмара для малого бізнесу: стартуйте сьогодні, зростайте без обмежень]]&lt;br /&gt;
&lt;br /&gt;
[[Не продавати доступ. Продавати свободу: чому майбутнє програмного забезпечення — за відкритими системами з чесною монетизацією]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: софт для країни, де держава не довіряє бізнесу. І саме тому він не потрібен країні, яка хоче бути вільною]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: система, в якій майбутнє давно натиснуло “Вийти без збереження”]]&lt;br /&gt;
&lt;br /&gt;
== Мови програмування, тренди ==&lt;br /&gt;
[[Світ у 2025: які мови «правлять балом»]]&lt;br /&gt;
&lt;br /&gt;
== Технічні завдання K2 ERP ==&lt;br /&gt;
[[Приклади технічного завдання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Приклади розрахунків]]&lt;br /&gt;
&lt;br /&gt;
== Акції K2 ERP ==&lt;br /&gt;
[[Ловіть шару: передпродажний модуль Бухгалтерії та податкового обліку зараз включає CRM, CMS та інтернет-магазин]]&lt;br /&gt;
&lt;br /&gt;
== Інвестиції в K2 ERP ==&lt;br /&gt;
[[Інвестиції в K2 ERP — українську платформу для заміни 1С/BAS та масової автоматизації бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Хто працює в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Використання K2 ERP ==&lt;br /&gt;
[[K2: платформа, після якої старий софт починає нервово шукати валізу]]&lt;br /&gt;
&lt;br /&gt;
[[Новий модуль K2 ERP для контролю звітності: коли сотні клієнтів, десятки дедлайнів і жодного права на ой, забули]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP як український Біткоїн]]&lt;br /&gt;
&lt;br /&gt;
[[Варіанти використання K2 ERP по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[ERP продукти]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP — українська ERP для виробництва, складу, торгівлі, ФОП, агро, логістики та заміни BAS ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Всі ERP терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі бізнес-процеси]]&lt;br /&gt;
&lt;br /&gt;
[[Всі інтеграції]]&lt;br /&gt;
&lt;br /&gt;
[[Всі українські сервіси]]&lt;br /&gt;
&lt;br /&gt;
[[Всі ERP модулі]]&lt;br /&gt;
&lt;br /&gt;
[[BAS / 1С / SAP / Odoo / Dynamics]]&lt;br /&gt;
&lt;br /&gt;
[[Всі 1С конфігурації]]&lt;br /&gt;
&lt;br /&gt;
[[Всі BAS конфігурації]]&lt;br /&gt;
&lt;br /&gt;
[[Всі 1С терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі BAS терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі отраслеві рішення 1С]]&lt;br /&gt;
&lt;br /&gt;
== CRM ==&lt;br /&gt;
[[Варіанти використання K2 ERP CRM по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[CRM продукти]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP CRM - універсальна CRM для виробництва, складу, торговлі, ФОП, інтернет-магазину та заміни Bitrix24, 1C CRM]]&lt;br /&gt;
&lt;br /&gt;
[[Всі терміни CRM]]&lt;br /&gt;
&lt;br /&gt;
== Інтернет-магази ==&lt;br /&gt;
[[Варіанти використання K2 ERP інтернет-магазин по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[Продукти інтернет-магазинів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP Інтернет-магазин - універсальний інтернет-магазин для заміни ShopScript та інших російських рішень]]&lt;br /&gt;
&lt;br /&gt;
[[Всі терміни інтернет-магазинів]]&lt;br /&gt;
&lt;br /&gt;
== Санкції та докази ==&lt;br /&gt;
[[Під гуркіт російських ракет вони захищають російську 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Поглинути 1С, BAS та інший ворожий софт: чому перенесення залишків — це ще не справжня відмова]]&lt;br /&gt;
&lt;br /&gt;
[[Мені соромно за українські ЗМІ — чому медіа мають писати про український софт, K2 ERP та заміну 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Лавочка стала закриватись: 215 продуктів ворожого софту заборонено]]&lt;br /&gt;
&lt;br /&gt;
[[Український бізнес інвестує в російське, бо думає, що українське помре]]&lt;br /&gt;
&lt;br /&gt;
[[Схема мережі 1С, побудованої в Україні під виглядом BAS: коли “ми вже не 1С” звучить як “ми просто змінили табличку на дверях”]]&lt;br /&gt;
&lt;br /&gt;
[[Пертнери BAS - партнери росії]]&lt;br /&gt;
&lt;br /&gt;
[[Скільки грошей 1С намагається “збити” з українського бізнесу через листи щастя]]&lt;br /&gt;
&lt;br /&gt;
[[Не продовжуйте ІТС на BAS. Бо BAS — це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Вали російський бізнес, вали російський софт!]]&lt;br /&gt;
&lt;br /&gt;
[[Програмне забезпечення, яким можна замінити ворожий софт]]&lt;br /&gt;
&lt;br /&gt;
[[Докази, що BAS - це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Список компаній, що розповсюджують BAS, не дивлячись на санкції січня 2026]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр ворожого ПЗ і пов&#039;язаних назв]]&lt;br /&gt;
&lt;br /&gt;
[[Компанії, що почали переходити з ворожого софту]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр компаній, що досі працюють на ворожому софті]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр сервісів, що підтримують інтеграцію з ворожим софтом]]&lt;br /&gt;
&lt;br /&gt;
== Реформи ==&lt;br /&gt;
[[Реформи К2]]&lt;br /&gt;
&lt;br /&gt;
== Wikipedia ==&lt;br /&gt;
[[Різні статті]]&lt;br /&gt;
&lt;br /&gt;
== Книги ==&lt;br /&gt;
[[Архітектура 1С-підприємства]]&lt;br /&gt;
&lt;br /&gt;
[[Архітектура та розробка ERP-систем]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A1%D0%BA%D1%96%D0%BB%D1%8C%D0%BA%D0%B8_%D0%BA%D0%BE%D1%88%D1%82%D1%83%D1%94_K2_ERP:_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%96%D0%B2,_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D0%B9_%D1%82%D0%B0_%D0%BE%D0%B1%D1%81%D0%BB%D1%83%D0%B3%D0%BE%D0%B2%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F&amp;diff=2767</id>
		<title>Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A1%D0%BA%D1%96%D0%BB%D1%8C%D0%BA%D0%B8_%D0%BA%D0%BE%D1%88%D1%82%D1%83%D1%94_K2_ERP:_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%96%D0%B2,_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D0%B9_%D1%82%D0%B0_%D0%BE%D0%B1%D1%81%D0%BB%D1%83%D0%B3%D0%BE%D0%B2%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F&amp;diff=2767"/>
		<updated>2026-07-18T19:43:49Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування}}&lt;br /&gt;
[[Файл:Ціни K2 ERP.png|центр|міні|800x800пкс|Онлайн-калькулятор продуктів, ліцензій та обслуговування]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Скільки коштуватиме K2 ERP саме для вашого підприємства?&#039;&#039;&#039; Відповідь залежить від кількості користувачів, потрібних модулів, способу розміщення системи, обраного формату ліцензування та обсягу послуг команди впровадження.&lt;br /&gt;
&lt;br /&gt;
Щоб підприємству не доводилося проходити довгий «квест» із презентацій, дзвінків і запитів комерційних пропозицій лише заради розуміння базової вартості, створено &#039;&#039;&#039;онлайн-калькулятор K2 ERP&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #86c786; border-left:7px solid #2e9d43; background:#eef9f0; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:125%; font-weight:bold; color:#176b2b;&amp;quot;&amp;gt;Розрахуйте власну конфігурацію K2 ERP&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оберіть формат постачання, кількість користувачів, необхідні модулі, хостинг і пакет обслуговування. Підсумкова сума оновлюється безпосередньо в калькуляторі.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:12px; font-size:115%;&amp;quot;&amp;gt;&#039;&#039;&#039;[https://calc.corp2.eu Відкрити калькулятор K2 ERP]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Калькулятор дозволяє порівняти три основні варіанти роботи:&lt;br /&gt;
&lt;br /&gt;
* безкоштовне використання у спільній хмарі;&lt;br /&gt;
* SaaS-підписку з окремою базою даних;&lt;br /&gt;
* придбання ліцензій для встановлення на власному сервері.&lt;br /&gt;
&lt;br /&gt;
Для кожного з цих варіантів можна окремо додати пакет технічного обслуговування.&amp;lt;ref name=&amp;quot;calc&amp;quot;&amp;gt;[https://calc.corp2.eu Калькулятор продуктів і послуг K2 ERP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Навіщо потрібен калькулятор K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
ERP-система не є одним стандартним програмним продуктом з однаковою конфігурацією для кожної компанії. Одному підприємству потрібні лише CRM, фінанси та контроль оплат. Іншому необхідні бухгалтерія, зарплата, виробництво, складська логістика, документообіг, корпоративна звітність та інтеграції із зовнішніми сервісами.&lt;br /&gt;
&lt;br /&gt;
Саме тому поняття «ціна ERP» без уточнення конфігурації мало про що говорить.&lt;br /&gt;
&lt;br /&gt;
Калькулятор K2 ERP допомагає побачити, &#039;&#039;&#039;з яких складових формується вартість&#039;&#039;&#039;, і сформувати попередній бюджет ще до початку детального обстеження підприємства.&lt;br /&gt;
&lt;br /&gt;
За допомогою калькулятора можна:&lt;br /&gt;
&lt;br /&gt;
* порівняти безкоштовну хмару, SaaS і серверне ліцензування;&lt;br /&gt;
* обрати потрібні функціональні модулі;&lt;br /&gt;
* зазначити кількість користувачів;&lt;br /&gt;
* врахувати хостинг або розміщення на власному сервері;&lt;br /&gt;
* додати пакет обслуговування;&lt;br /&gt;
* розрахувати одноразові та щомісячні витрати;&lt;br /&gt;
* зберегти конфігурацію та отримати посилання;&lt;br /&gt;
* відкрити попередню комерційну пропозицію;&lt;br /&gt;
* передати сформований розрахунок колегам.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #8fbce6; border-left:7px solid #2878bd; background:#eef6fd; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Головна перевага калькулятора — прозорість.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Клієнт бачить не абстрактну «вартість автоматизації», а окремо вартість програмних модулів, інфраструктури, користувачів, оновлень і роботи спеціалістів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Три варіанти використання K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
=== Безкоштовна спільна хмара ===&lt;br /&gt;
&lt;br /&gt;
Перший варіант — безкоштовна робота у спільній хмарі &#039;&#039;&#039;K2 ERP Cloud&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Зареєструватися та почати роботу можна за адресою:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://cloud.corp2.eu cloud.corp2.eu]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
У спільній хмарі функціональні модулі доступні без оплати за самі модулі та кількість користувачів. Підприємство може знайомитися із системою, перевіряти її можливості, створювати власні структури обліку, працювати з документами, довідниками, звітами та іншими інструментами.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
За потреби до безкоштовної версії можна додати платне обслуговування:&lt;br /&gt;
&lt;br /&gt;
* консультації користувачів;&lt;br /&gt;
* налаштування системи;&lt;br /&gt;
* перенесення даних;&lt;br /&gt;
* створення форм і звітів;&lt;br /&gt;
* розробку додаткової функціональності;&lt;br /&gt;
* навчання працівників;&lt;br /&gt;
* інтеграції із зовнішніми системами.&lt;br /&gt;
&lt;br /&gt;
Безкоштовна хмара підходить для навчання, тестування, прототипування, демонстрації можливостей K2 ERP та запуску невеликих проєктів.&lt;br /&gt;
&lt;br /&gt;
=== SaaS-підписка ===&lt;br /&gt;
&lt;br /&gt;
Другий варіант — окрема база даних K2 ERP із щомісячною оплатою.&lt;br /&gt;
&lt;br /&gt;
У моделі SaaS підприємство обирає необхідні модулі та кількість користувачів. Калькулятор визначає базову щомісячну вартість конфігурації та перераховує її відповідно до заданих параметрів.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SaaS дозволяє не купувати відразу весь набір серверних ліцензій. Компанія може почати з кількох основних модулів, а потім поступово розширювати систему.&lt;br /&gt;
&lt;br /&gt;
Наприклад, перший етап може включати:&lt;br /&gt;
&lt;br /&gt;
# CRM;&lt;br /&gt;
# фінансовий облік;&lt;br /&gt;
# банківські виписки;&lt;br /&gt;
# контроль оплат;&lt;br /&gt;
# роботу з клієнтами та договорами.&lt;br /&gt;
&lt;br /&gt;
Після запуску можна додати бухгалтерський облік, зарплату, виробництво, документообіг, WMS, управлінський облік, логістику та галузеві модулі.&lt;br /&gt;
&lt;br /&gt;
У калькуляторі також можна обрати хостинг K2. Його щомісячна вартість розраховується за градацією кількості користувачів. Якщо хостинг K2 вимкнено, передбачається використання сервера клієнта та окреме одноразове розгортання системи.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ліцензія на власний сервер ===&lt;br /&gt;
&lt;br /&gt;
Третій варіант — одноразове придбання технологічної платформи та функціональних модулів.&lt;br /&gt;
&lt;br /&gt;
Такий формат підходить підприємствам, які хочуть розмістити K2 ERP:&lt;br /&gt;
&lt;br /&gt;
* у власному дата-центрі;&lt;br /&gt;
* на орендованому сервері;&lt;br /&gt;
* у приватній хмарі;&lt;br /&gt;
* у корпоративній інфраструктурі;&lt;br /&gt;
* у гібридному середовищі.&lt;br /&gt;
&lt;br /&gt;
При серверному ліцензуванні кількість користувачів не обмежується. Підприємство сплачує за технологічну платформу та обрані функціональні модулі, а не за кожне окреме робоче місце.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обов’язковою складовою серверної конфігурації є &#039;&#039;&#039;технологічна платформа K2 ERP&#039;&#039;&#039;. &#039;&#039;&#039;K2 Ядро&#039;&#039;&#039; входить до платформи без додаткової оплати.&lt;br /&gt;
&lt;br /&gt;
Серверна модель особливо вигідна для підприємств, у яких із системою працюють сотні користувачів, декілька юридичних осіб, філії, склади, виробничі майданчики або територіально розподілені підрозділи.&lt;br /&gt;
&lt;br /&gt;
== З чого формується підсумкова вартість ==&lt;br /&gt;
&lt;br /&gt;
Загальна вартість K2 ERP складається не з одного показника. Калькулятор враховує декілька основних складових.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:28%;&amp;quot; | Складова&lt;br /&gt;
! Що враховується&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Формат постачання&#039;&#039;&#039;&lt;br /&gt;
| Безкоштовна хмара, SaaS-підписка або серверна ліцензія.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Кількість користувачів&#039;&#039;&#039;&lt;br /&gt;
| Використовується під час розрахунку SaaS і хостингу.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Функціональні модулі&#039;&#039;&#039;&lt;br /&gt;
| Облік, CRM, виробництво, склад, документообіг, інтеграції та інші компоненти.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Інфраструктура&#039;&#039;&#039;&lt;br /&gt;
| Хостинг K2 або сервер підприємства.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Оновлення&#039;&#039;&#039;&lt;br /&gt;
| Сценарій щорічного продовження оновлень із другого року.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Обслуговування&#039;&#039;&#039;&lt;br /&gt;
| Погодинна робота або щомісячний пакет годин спеціалістів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для SaaS загальну логіку можна представити так:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;модулі + кількість користувачів + хостинг + обслуговування.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для серверної моделі:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;технологічна платформа + модулі + розгортання + оновлення + обслуговування.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Які продукти можна обрати ==&lt;br /&gt;
&lt;br /&gt;
Калькулятор містить велику кількість продуктів, функціональних модулів та інтеграцій K2 ERP. Їх можна підбирати відповідно до реальних процесів підприємства, а не купувати єдиний надмірно великий пакет.&lt;br /&gt;
&lt;br /&gt;
=== Фінанси, бухгалтерія та управлінський облік ===&lt;br /&gt;
&lt;br /&gt;
До цієї групи належать:&lt;br /&gt;
&lt;br /&gt;
* K2 Фінансовий облік;&lt;br /&gt;
* K2 Каса;&lt;br /&gt;
* K2 ERP Бухгалтерський облік;&lt;br /&gt;
* K2 Управлінський облік;&lt;br /&gt;
* K2 ERP Зарплата та кадри;&lt;br /&gt;
* K2 multi-GAAP;&lt;br /&gt;
* K2 SAF-T;&lt;br /&gt;
* модулі обміну з банками;&lt;br /&gt;
* інтеграції з М.E.Doc, Вчасно та ДПС.&lt;br /&gt;
&lt;br /&gt;
=== CRM і робота з клієнтами ===&lt;br /&gt;
&lt;br /&gt;
Підприємство може обрати:&lt;br /&gt;
&lt;br /&gt;
* K2 CRM;&lt;br /&gt;
* CRM для контакт-центру;&lt;br /&gt;
* інтеграцію з Ringostat;&lt;br /&gt;
* Telegram-бот;&lt;br /&gt;
* WhatsApp-бот;&lt;br /&gt;
* Email для CRM;&lt;br /&gt;
* TurboSMS;&lt;br /&gt;
* модулі управління проєктами;&lt;br /&gt;
* корпоративний чат;&lt;br /&gt;
* HelpDesk.&lt;br /&gt;
&lt;br /&gt;
=== Виробництво, склад і логістика ===&lt;br /&gt;
&lt;br /&gt;
Для операційного управління доступні:&lt;br /&gt;
&lt;br /&gt;
* K2 ERP Виробництво;&lt;br /&gt;
* K2 WMS для великого складу;&lt;br /&gt;
* ТОІР та облік запчастин;&lt;br /&gt;
* автотранспорт;&lt;br /&gt;
* автоперевезення;&lt;br /&gt;
* GPS-трекінг;&lt;br /&gt;
* інтеграції з Новою поштою та Укрпоштою;&lt;br /&gt;
* модулі транспортної та складської логістики.&lt;br /&gt;
&lt;br /&gt;
=== Документообіг та аналітика ===&lt;br /&gt;
&lt;br /&gt;
До цієї категорії входять:&lt;br /&gt;
&lt;br /&gt;
* K2 Документообіг;&lt;br /&gt;
* VDoc;&lt;br /&gt;
* конструктор структури бази даних;&lt;br /&gt;
* конструктор звітів;&lt;br /&gt;
* конструктор BI-звітів;&lt;br /&gt;
* K2 Реплікатор;&lt;br /&gt;
* система оновлень K2 Update;&lt;br /&gt;
* K2 Projects;&lt;br /&gt;
* K2 LMS.&lt;br /&gt;
&lt;br /&gt;
=== Інтернет-магазини та галузеві рішення ===&lt;br /&gt;
&lt;br /&gt;
У калькуляторі також представлені:&lt;br /&gt;
&lt;br /&gt;
* CMS;&lt;br /&gt;
* K2 Інтернет-магазин;&lt;br /&gt;
* великий інтернет-магазин;&lt;br /&gt;
* інтеграція з Horoshop;&lt;br /&gt;
* LiqPay;&lt;br /&gt;
* WayForPay;&lt;br /&gt;
* рішення для ресторану;&lt;br /&gt;
* рішення для готелю;&lt;br /&gt;
* рішення для стоматологічної клініки;&lt;br /&gt;
* рішення для салону краси;&lt;br /&gt;
* модуль бронювання послуг;&lt;br /&gt;
* модуль роботи з орендарями.&lt;br /&gt;
&lt;br /&gt;
Повний перелік продуктів, а також актуальні ціни потрібно дивитися безпосередньо в калькуляторі, оскільки склад модулів і комерційні умови можуть оновлюватися.&lt;br /&gt;
&lt;br /&gt;
== Приклади базових цін ==&lt;br /&gt;
&lt;br /&gt;
Нижче наведено декілька прикладів базової вартості, зазначеної в калькуляторі на момент публікації статті. Це не повний прайс, а лише приклади для розуміння різниці між SaaS і серверним ліцензуванням.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%; text-align:left;&amp;quot;&lt;br /&gt;
! Продукт&lt;br /&gt;
! Базова SaaS-вартість&lt;br /&gt;
! Серверна ліцензія&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP технологічна платформа&lt;br /&gt;
| —&lt;br /&gt;
| 1 500 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 CRM&lt;br /&gt;
| 35 EUR/міс&lt;br /&gt;
| 1 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Фінансовий облік&lt;br /&gt;
| 35 EUR/міс&lt;br /&gt;
| 1 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP Бухгалтерський облік&lt;br /&gt;
| 85 EUR/міс&lt;br /&gt;
| 15 000 EUR одноразово за повний пакет&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP Зарплата та кадри&lt;br /&gt;
| 70 EUR/міс&lt;br /&gt;
| 2 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP Виробництво&lt;br /&gt;
| 170 EUR/міс&lt;br /&gt;
| 5 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 WMS для великого складу&lt;br /&gt;
| 170 EUR/міс&lt;br /&gt;
| 15 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Реплікатор&lt;br /&gt;
| 180 EUR/міс&lt;br /&gt;
| 5 400 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Конструктор звітів&lt;br /&gt;
| 100 EUR/міс&lt;br /&gt;
| 3 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Управлінський облік&lt;br /&gt;
| 100 EUR/міс&lt;br /&gt;
| 3 000 EUR одноразово&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #e0bd59; border-left:7px solid #d89900; background:#fff8dc; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Зверніть увагу.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Наведені суми є базовими. Остаточна SaaS-вартість залежить від кількості користувачів, обраних модулів, хостингу та пакета обслуговування.&lt;br /&gt;
&lt;br /&gt;
Перед ухваленням рішення потрібно сформувати актуальний розрахунок на &#039;&#039;&#039;[https://calc.corp2.eu calc.corp2.eu]&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Обслуговування та робота спеціалістів ==&lt;br /&gt;
&lt;br /&gt;
Програмне забезпечення і послуги спеціалістів у калькуляторі розділені.&lt;br /&gt;
&lt;br /&gt;
Підприємство може:&lt;br /&gt;
&lt;br /&gt;
* використовувати систему самостійно;&lt;br /&gt;
* замовляти окремі години за потреби;&lt;br /&gt;
* обрати регулярний щомісячний пакет;&lt;br /&gt;
* сформувати постійну команду підтримки та розвитку.&lt;br /&gt;
&lt;br /&gt;
У калькуляторі доступна погодинна оплата, а також пакети від 12 до 350 годин на місяць.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На момент публікації передбачені такі варіанти:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Пакет&lt;br /&gt;
! Годин на місяць&lt;br /&gt;
! Вартість&lt;br /&gt;
|-&lt;br /&gt;
| Погодинна оплата&lt;br /&gt;
| За фактом&lt;br /&gt;
| 90 EUR/год&lt;br /&gt;
|-&lt;br /&gt;
| ПРОФ&lt;br /&gt;
| 12 годин&lt;br /&gt;
| 720 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Малий бізнес&lt;br /&gt;
| 30 годин&lt;br /&gt;
| 1 650 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Середній бізнес&lt;br /&gt;
| 60 годин&lt;br /&gt;
| 3 420 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Великий бізнес&lt;br /&gt;
| 80 годин&lt;br /&gt;
| 4 400 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Ексклюзив&lt;br /&gt;
| 120 годин&lt;br /&gt;
| 6 360 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Ексклюзив&lt;br /&gt;
| 180 годин&lt;br /&gt;
| 9 000 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Ексклюзив&lt;br /&gt;
| 250 годин&lt;br /&gt;
| 11 750 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Бізнес Ексклюзив&lt;br /&gt;
| 350 годин&lt;br /&gt;
| 15 750 EUR/міс&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пакет годин може використовуватися для консультацій, розробки, налаштування, інтеграцій, перенесення інформації, навчання, адміністрування та розвитку системи.&lt;br /&gt;
&lt;br /&gt;
Чим складніший проєкт і чим більше процесів автоматизується, тим більший обсяг роботи може знадобитися на початковому етапі.&lt;br /&gt;
&lt;br /&gt;
== Продовження оновлень ==&lt;br /&gt;
&lt;br /&gt;
Для серверних ліцензій у калькуляторі передбачено декілька сценаріїв щорічного продовження оновлень, починаючи з другого року:&lt;br /&gt;
&lt;br /&gt;
; Пільгове продовження&lt;br /&gt;
: Оформлюється завчасно — приблизно за три місяці до завершення поточного періоду підтримки.&lt;br /&gt;
&lt;br /&gt;
; Стандартне продовження&lt;br /&gt;
: Оформлюється вчасно, без тривалої перерви в отриманні оновлень.&lt;br /&gt;
&lt;br /&gt;
; Прострочене продовження&lt;br /&gt;
: Використовується, якщо після завершення підтримки минуло від трьох місяців до двох років.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Підприємство може одразу порівняти сценарії та оцінити майбутні витрати на підтримання системи в актуальному стані.&lt;br /&gt;
&lt;br /&gt;
== Вартість програмного забезпечення і впровадження — не одне й те саме ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #e4a3a3; border-left:7px solid #c33e3e; background:#fff1f1; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Важливо розрізняти вартість продуктів і вартість проєкту впровадження.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Калькулятор показує ліцензії, SaaS, хостинг, оновлення та обраний пакет обслуговування. Однак остаточний бюджет автоматизації залежить від стану даних, складності процесів, кількості інтеграцій та обсягу необхідних доробок.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Повноцінне впровадження може включати:&lt;br /&gt;
&lt;br /&gt;
* аналіз бізнес-процесів;&lt;br /&gt;
* підготовку технічного завдання;&lt;br /&gt;
* проєктування структури обліку;&lt;br /&gt;
* перенесення довідників і залишків;&lt;br /&gt;
* перенесення історичних даних;&lt;br /&gt;
* міграцію з 1С, BAS або інших систем;&lt;br /&gt;
* налаштування прав доступу;&lt;br /&gt;
* розробку документів, форм і звітів;&lt;br /&gt;
* інтеграцію з банками, обладнанням та зовнішніми сервісами;&lt;br /&gt;
* навчання користувачів;&lt;br /&gt;
* дослідну експлуатацію;&lt;br /&gt;
* підтримку після запуску.&lt;br /&gt;
&lt;br /&gt;
Два підприємства можуть придбати однакові програмні модулі, але мати різну вартість впровадження.&lt;br /&gt;
&lt;br /&gt;
Для однієї компанії достатньо імпортувати початкові залишки та налаштувати стандартні операції. Іншій може знадобитися перенесення багаторічної історії, інтеграція з декількома інформаційними системами, автоматизація виробництва та створення десятків спеціалізованих звітів.&lt;br /&gt;
&lt;br /&gt;
Тому калькулятор потрібно використовувати як &#039;&#039;&#039;інструмент попереднього бюджетування&#039;&#039;&#039;, а остаточний план робіт формувати після обстеження підприємства.&lt;br /&gt;
&lt;br /&gt;
== Можна почати з невеликої конфігурації ==&lt;br /&gt;
&lt;br /&gt;
Перехід на K2 ERP не означає, що підприємство повинно автоматизувати всі процеси одночасно.&lt;br /&gt;
&lt;br /&gt;
Проєкт можна розділити на послідовні етапи.&lt;br /&gt;
&lt;br /&gt;
=== Приклад першого етапу ===&lt;br /&gt;
&lt;br /&gt;
На першому етапі можна запустити:&lt;br /&gt;
&lt;br /&gt;
* CRM;&lt;br /&gt;
* облік клієнтів і договорів;&lt;br /&gt;
* фінансовий облік;&lt;br /&gt;
* імпорт банківських виписок;&lt;br /&gt;
* контроль оплат;&lt;br /&gt;
* базову управлінську звітність.&lt;br /&gt;
&lt;br /&gt;
=== Приклад другого етапу ===&lt;br /&gt;
&lt;br /&gt;
Після стабілізації першого етапу можна додати:&lt;br /&gt;
&lt;br /&gt;
* бухгалтерський і податковий облік;&lt;br /&gt;
* зарплату та кадри;&lt;br /&gt;
* документообіг;&lt;br /&gt;
* інтеграцію з М.E.Doc і Вчасно;&lt;br /&gt;
* бюджетування;&lt;br /&gt;
* розширену аналітику.&lt;br /&gt;
&lt;br /&gt;
=== Приклад третього етапу ===&lt;br /&gt;
&lt;br /&gt;
Для подальшого розвитку можна підключити:&lt;br /&gt;
&lt;br /&gt;
* виробництво;&lt;br /&gt;
* WMS;&lt;br /&gt;
* ТОІР;&lt;br /&gt;
* транспортну логістику;&lt;br /&gt;
* мобільні застосунки;&lt;br /&gt;
* інтеграції з обладнанням;&lt;br /&gt;
* корпоративні BI-звіти.&lt;br /&gt;
&lt;br /&gt;
Такий підхід дозволяє розподілити витрати в часі, швидше отримати перший практичний результат і зменшити ризики великого проєкту.&lt;br /&gt;
&lt;br /&gt;
== Як користуватися калькулятором ==&lt;br /&gt;
&lt;br /&gt;
Щоб сформувати попередній розрахунок, потрібно:&lt;br /&gt;
&lt;br /&gt;
# Відкрити &#039;&#039;&#039;[https://calc.corp2.eu калькулятор K2 ERP]&#039;&#039;&#039;.&lt;br /&gt;
# Обрати варіант постачання.&lt;br /&gt;
# Зазначити кількість користувачів.&lt;br /&gt;
# За потреби вказати назву клієнта.&lt;br /&gt;
# Обрати необхідні модулі.&lt;br /&gt;
# Увімкнути або вимкнути хостинг K2.&lt;br /&gt;
# Вибрати сценарій продовження оновлень.&lt;br /&gt;
# Додати пакет обслуговування.&lt;br /&gt;
# Переглянути підсумкову одноразову та щомісячну вартість.&lt;br /&gt;
# Зберегти конфігурацію або відкрити комерційну пропозицію.&lt;br /&gt;
&lt;br /&gt;
Для автоматичного перерахунку сум у браузері має бути ввімкнений JavaScript.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Готовий розрахунок можна зберегти, скопіювати як посилання та передати іншим учасникам проєкту.&lt;br /&gt;
&lt;br /&gt;
Це зручно, коли рішення про впровадження приймають спільно:&lt;br /&gt;
&lt;br /&gt;
* власник підприємства;&lt;br /&gt;
* фінансовий директор;&lt;br /&gt;
* головний бухгалтер;&lt;br /&gt;
* ІТ-директор;&lt;br /&gt;
* керівники підрозділів;&lt;br /&gt;
* відповідальні за виробництво, склад або логістику.&lt;br /&gt;
&lt;br /&gt;
== Як порівнювати SaaS і серверну ліцензію ==&lt;br /&gt;
&lt;br /&gt;
При порівнянні варіантів важливо оцінювати не лише початкову ціну, а й загальну вартість володіння системою протягом декількох років.&lt;br /&gt;
&lt;br /&gt;
=== SaaS може бути вигіднішим, якщо ===&lt;br /&gt;
&lt;br /&gt;
* потрібно швидко запустити проєкт;&lt;br /&gt;
* кількість користувачів невелика;&lt;br /&gt;
* немає бажання одразу купувати всі ліцензії;&lt;br /&gt;
* конфігурація буде розширюватися поступово;&lt;br /&gt;
* підприємству зручніше планувати щомісячні витрати.&lt;br /&gt;
&lt;br /&gt;
=== Серверна ліцензія може бути вигіднішою, якщо ===&lt;br /&gt;
&lt;br /&gt;
* у системі працює велика кількість користувачів;&lt;br /&gt;
* потрібне розміщення у власній інфраструктурі;&lt;br /&gt;
* підприємство хоче контролювати сервери та бази даних;&lt;br /&gt;
* планується масштабування на декілька підрозділів;&lt;br /&gt;
* система використовується як довгострокова корпоративна платформа.&lt;br /&gt;
&lt;br /&gt;
=== Безкоштовна хмара підходить, якщо ===&lt;br /&gt;
&lt;br /&gt;
* потрібно ознайомитися із K2 ERP;&lt;br /&gt;
* необхідно навчити команду;&lt;br /&gt;
* створюється прототип майбутньої системи;&lt;br /&gt;
* підприємство хоче перевірити функціональність до придбання;&lt;br /&gt;
* потрібен швидкий старт без витрат на ліцензії.&lt;br /&gt;
&lt;br /&gt;
== Прозоре ціноутворення замість «ціни за запитом» ==&lt;br /&gt;
&lt;br /&gt;
На ринку корпоративного програмного забезпечення клієнт нерідко бачить лише напис «ціна за запитом». Після цього потрібно залишити контакти, чекати дзвінка, проводити зустріч і лише потім отримувати орієнтовну суму.&lt;br /&gt;
&lt;br /&gt;
K2 ERP пропонує інший підхід.&lt;br /&gt;
&lt;br /&gt;
Підприємство може самостійно:&lt;br /&gt;
&lt;br /&gt;
* переглянути перелік продуктів;&lt;br /&gt;
* побачити базові ціни;&lt;br /&gt;
* порівняти формати постачання;&lt;br /&gt;
* додати потрібні модулі;&lt;br /&gt;
* змінити кількість користувачів;&lt;br /&gt;
* вибрати обслуговування;&lt;br /&gt;
* сформувати декілька сценаріїв;&lt;br /&gt;
* передати розрахунок керівництву.&lt;br /&gt;
&lt;br /&gt;
Калькулятор не замінює обстеження підприємства та підготовку проєктного плану. Але він дозволяє ще до початку переговорів зрозуміти порядок витрат і визначити реалістичний бюджет.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:24px 0; border:1px solid #efa765; border-left:7px solid #ed7d1a; background:#fff4e8; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:20px 24px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:130%; font-weight:bold; color:#a64a00;&amp;quot;&amp;gt;Не ворожіть над ціною ERP — розрахуйте її&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сформуйте власну конфігурацію, порівняйте SaaS і серверну ліцензію, додайте потрібні модулі та обслуговування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:14px; font-size:118%;&amp;quot;&amp;gt;&#039;&#039;&#039;[https://calc.corp2.eu Перейти до калькулятора K2 ERP]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:8px;&amp;quot;&amp;gt;&#039;&#039;&#039;[https://cloud.corp2.eu Почати безкоштовно у хмарі K2 ERP]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Висновок ==&lt;br /&gt;
&lt;br /&gt;
Не існує єдиної конфігурації K2 ERP, яка однаково підходить кожному підприємству.&lt;br /&gt;
&lt;br /&gt;
Невеликій компанії може бути достатньо CRM, фінансового обліку та декількох користувачів. Великому підприємству можуть знадобитися бухгалтерія, зарплата, виробництво, WMS, документообіг, логістика, BI, інтеграції та сотні робочих місць.&lt;br /&gt;
&lt;br /&gt;
Саме тому вартість потрібно розраховувати відповідно до реальних потреб бізнесу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Калькулятор K2 ERP дає можливість побачити структуру витрат, порівняти різні моделі та сформувати попередній бюджет без прихованих складових.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Див. також ==&lt;br /&gt;
&lt;br /&gt;
* [https://corp2.eu Офіційний сайт K2]&lt;br /&gt;
* [https://erp.kyiv.ua Публікації та відео про K2 ERP]&lt;br /&gt;
* [https://wiki.erp.kyiv.ua Документація K2 ERP]&lt;br /&gt;
* [https://cloud.corp2.eu Безкоштовна хмара K2 ERP]&lt;br /&gt;
* [https://calc.corp2.eu Калькулятор K2 ERP]&lt;br /&gt;
&lt;br /&gt;
== Джерела ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорія:K2 ERP]]&lt;br /&gt;
[[Категорія:Ціни K2 ERP]]&lt;br /&gt;
[[Категорія:Ліцензування K2 ERP]]&lt;br /&gt;
[[Категорія:SaaS]]&lt;br /&gt;
[[Категорія:ERP-системи]]&lt;br /&gt;
[[Категорія:Автоматизація бізнесу]]&lt;br /&gt;
[[Категорія:Українське програмне забезпечення]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A1%D0%BA%D1%96%D0%BB%D1%8C%D0%BA%D0%B8_%D0%BA%D0%BE%D1%88%D1%82%D1%83%D1%94_K2_ERP:_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%96%D0%B2,_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D0%B9_%D1%82%D0%B0_%D0%BE%D0%B1%D1%81%D0%BB%D1%83%D0%B3%D0%BE%D0%B2%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F&amp;diff=2766</id>
		<title>Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A1%D0%BA%D1%96%D0%BB%D1%8C%D0%BA%D0%B8_%D0%BA%D0%BE%D1%88%D1%82%D1%83%D1%94_K2_ERP:_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%96%D0%B2,_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D0%B9_%D1%82%D0%B0_%D0%BE%D0%B1%D1%81%D0%BB%D1%83%D0%B3%D0%BE%D0%B2%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F&amp;diff=2766"/>
		<updated>2026-07-18T19:43:34Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування}}&lt;br /&gt;
[[Файл:Ціни K2 ERP.png|центр|міні|800x800пкс|Онлайн-калькулятор продуктів, ліцензій та обслуговування]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Скільки коштуватиме K2 ERP саме для вашого підприємства?&#039;&#039;&#039; Відповідь залежить від кількості користувачів, потрібних модулів, способу розміщення системи, обраного формату ліцензування та обсягу послуг команди впровадження.&lt;br /&gt;
&lt;br /&gt;
Щоб підприємству не доводилося проходити довгий «квест» із презентацій, дзвінків і запитів комерційних пропозицій лише заради розуміння базової вартості, створено &#039;&#039;&#039;онлайн-калькулятор K2 ERP&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #86c786; border-left:7px solid #2e9d43; background:#eef9f0; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:125%; font-weight:bold; color:#176b2b;&amp;quot;&amp;gt;Розрахуйте власну конфігурацію K2 ERP&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оберіть формат постачання, кількість користувачів, необхідні модулі, хостинг і пакет обслуговування. Підсумкова сума оновлюється безпосередньо в калькуляторі.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:12px; font-size:115%;&amp;quot;&amp;gt;&#039;&#039;&#039;[https://calc.corp2.eu Відкрити калькулятор K2 ERP]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Калькулятор дозволяє порівняти три основні варіанти роботи:&lt;br /&gt;
&lt;br /&gt;
* безкоштовне використання у спільній хмарі;&lt;br /&gt;
* SaaS-підписку з окремою базою даних;&lt;br /&gt;
* придбання ліцензій для встановлення на власному сервері.&lt;br /&gt;
&lt;br /&gt;
Для кожного з цих варіантів можна окремо додати пакет технічного обслуговування.&amp;lt;ref name=&amp;quot;calc&amp;quot;&amp;gt;[https://calc.corp2.eu Калькулятор продуктів і послуг K2 ERP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Навіщо потрібен калькулятор K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
ERP-система не є одним стандартним програмним продуктом з однаковою конфігурацією для кожної компанії. Одному підприємству потрібні лише CRM, фінанси та контроль оплат. Іншому необхідні бухгалтерія, зарплата, виробництво, складська логістика, документообіг, корпоративна звітність та інтеграції із зовнішніми сервісами.&lt;br /&gt;
&lt;br /&gt;
Саме тому поняття «ціна ERP» без уточнення конфігурації мало про що говорить.&lt;br /&gt;
&lt;br /&gt;
Калькулятор K2 ERP допомагає побачити, &#039;&#039;&#039;з яких складових формується вартість&#039;&#039;&#039;, і сформувати попередній бюджет ще до початку детального обстеження підприємства.&lt;br /&gt;
&lt;br /&gt;
За допомогою калькулятора можна:&lt;br /&gt;
&lt;br /&gt;
* порівняти безкоштовну хмару, SaaS і серверне ліцензування;&lt;br /&gt;
* обрати потрібні функціональні модулі;&lt;br /&gt;
* зазначити кількість користувачів;&lt;br /&gt;
* врахувати хостинг або розміщення на власному сервері;&lt;br /&gt;
* додати пакет обслуговування;&lt;br /&gt;
* розрахувати одноразові та щомісячні витрати;&lt;br /&gt;
* зберегти конфігурацію та отримати посилання;&lt;br /&gt;
* відкрити попередню комерційну пропозицію;&lt;br /&gt;
* передати сформований розрахунок колегам.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #8fbce6; border-left:7px solid #2878bd; background:#eef6fd; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Головна перевага калькулятора — прозорість.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Клієнт бачить не абстрактну «вартість автоматизації», а окремо вартість програмних модулів, інфраструктури, користувачів, оновлень і роботи спеціалістів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Три варіанти використання K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
=== Безкоштовна спільна хмара ===&lt;br /&gt;
&lt;br /&gt;
Перший варіант — безкоштовна робота у спільній хмарі &#039;&#039;&#039;K2 ERP Cloud&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Зареєструватися та почати роботу можна за адресою:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://cloud.corp2.eu cloud.corp2.eu]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
У спільній хмарі функціональні модулі доступні без оплати за самі модулі та кількість користувачів. Підприємство може знайомитися із системою, перевіряти її можливості, створювати власні структури обліку, працювати з документами, довідниками, звітами та іншими інструментами.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
За потреби до безкоштовної версії можна додати платне обслуговування:&lt;br /&gt;
&lt;br /&gt;
* консультації користувачів;&lt;br /&gt;
* налаштування системи;&lt;br /&gt;
* перенесення даних;&lt;br /&gt;
* створення форм і звітів;&lt;br /&gt;
* розробку додаткової функціональності;&lt;br /&gt;
* навчання працівників;&lt;br /&gt;
* інтеграції із зовнішніми системами.&lt;br /&gt;
&lt;br /&gt;
Безкоштовна хмара підходить для навчання, тестування, прототипування, демонстрації можливостей K2 ERP та запуску невеликих проєктів.&lt;br /&gt;
&lt;br /&gt;
=== SaaS-підписка ===&lt;br /&gt;
&lt;br /&gt;
Другий варіант — окрема база даних K2 ERP із щомісячною оплатою.&lt;br /&gt;
&lt;br /&gt;
У моделі SaaS підприємство обирає необхідні модулі та кількість користувачів. Калькулятор визначає базову щомісячну вартість конфігурації та перераховує її відповідно до заданих параметрів.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SaaS дозволяє не купувати відразу весь набір серверних ліцензій. Компанія може почати з кількох основних модулів, а потім поступово розширювати систему.&lt;br /&gt;
&lt;br /&gt;
Наприклад, перший етап може включати:&lt;br /&gt;
&lt;br /&gt;
# CRM;&lt;br /&gt;
# фінансовий облік;&lt;br /&gt;
# банківські виписки;&lt;br /&gt;
# контроль оплат;&lt;br /&gt;
# роботу з клієнтами та договорами.&lt;br /&gt;
&lt;br /&gt;
Після запуску можна додати бухгалтерський облік, зарплату, виробництво, документообіг, WMS, управлінський облік, логістику та галузеві модулі.&lt;br /&gt;
&lt;br /&gt;
У калькуляторі також можна обрати хостинг K2. Його щомісячна вартість розраховується за градацією кількості користувачів. Якщо хостинг K2 вимкнено, передбачається використання сервера клієнта та окреме одноразове розгортання системи.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ліцензія на власний сервер ===&lt;br /&gt;
&lt;br /&gt;
Третій варіант — одноразове придбання технологічної платформи та функціональних модулів.&lt;br /&gt;
&lt;br /&gt;
Такий формат підходить підприємствам, які хочуть розмістити K2 ERP:&lt;br /&gt;
&lt;br /&gt;
* у власному дата-центрі;&lt;br /&gt;
* на орендованому сервері;&lt;br /&gt;
* у приватній хмарі;&lt;br /&gt;
* у корпоративній інфраструктурі;&lt;br /&gt;
* у гібридному середовищі.&lt;br /&gt;
&lt;br /&gt;
При серверному ліцензуванні кількість користувачів не обмежується. Підприємство сплачує за технологічну платформу та обрані функціональні модулі, а не за кожне окреме робоче місце.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обов’язковою складовою серверної конфігурації є &#039;&#039;&#039;технологічна платформа K2 ERP&#039;&#039;&#039;. &#039;&#039;&#039;K2 Ядро&#039;&#039;&#039; входить до платформи без додаткової оплати.&lt;br /&gt;
&lt;br /&gt;
Серверна модель особливо вигідна для підприємств, у яких із системою працюють сотні користувачів, декілька юридичних осіб, філії, склади, виробничі майданчики або територіально розподілені підрозділи.&lt;br /&gt;
&lt;br /&gt;
== З чого формується підсумкова вартість ==&lt;br /&gt;
&lt;br /&gt;
Загальна вартість K2 ERP складається не з одного показника. Калькулятор враховує декілька основних складових.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:28%;&amp;quot; | Складова&lt;br /&gt;
! Що враховується&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Формат постачання&#039;&#039;&#039;&lt;br /&gt;
| Безкоштовна хмара, SaaS-підписка або серверна ліцензія.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Кількість користувачів&#039;&#039;&#039;&lt;br /&gt;
| Використовується під час розрахунку SaaS і хостингу.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Функціональні модулі&#039;&#039;&#039;&lt;br /&gt;
| Облік, CRM, виробництво, склад, документообіг, інтеграції та інші компоненти.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Інфраструктура&#039;&#039;&#039;&lt;br /&gt;
| Хостинг K2 або сервер підприємства.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Оновлення&#039;&#039;&#039;&lt;br /&gt;
| Сценарій щорічного продовження оновлень із другого року.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Обслуговування&#039;&#039;&#039;&lt;br /&gt;
| Погодинна робота або щомісячний пакет годин спеціалістів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для SaaS загальну логіку можна представити так:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;модулі + кількість користувачів + хостинг + обслуговування.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для серверної моделі:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;технологічна платформа + модулі + розгортання + оновлення + обслуговування.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Які продукти можна обрати ==&lt;br /&gt;
&lt;br /&gt;
Калькулятор містить велику кількість продуктів, функціональних модулів та інтеграцій K2 ERP. Їх можна підбирати відповідно до реальних процесів підприємства, а не купувати єдиний надмірно великий пакет.&lt;br /&gt;
&lt;br /&gt;
=== Фінанси, бухгалтерія та управлінський облік ===&lt;br /&gt;
&lt;br /&gt;
До цієї групи належать:&lt;br /&gt;
&lt;br /&gt;
* K2 Фінансовий облік;&lt;br /&gt;
* K2 Каса;&lt;br /&gt;
* K2 ERP Бухгалтерський облік;&lt;br /&gt;
* K2 Управлінський облік;&lt;br /&gt;
* K2 ERP Зарплата та кадри;&lt;br /&gt;
* K2 multi-GAAP;&lt;br /&gt;
* K2 SAF-T;&lt;br /&gt;
* модулі обміну з банками;&lt;br /&gt;
* інтеграції з М.E.Doc, Вчасно та ДПС.&lt;br /&gt;
&lt;br /&gt;
=== CRM і робота з клієнтами ===&lt;br /&gt;
&lt;br /&gt;
Підприємство може обрати:&lt;br /&gt;
&lt;br /&gt;
* K2 CRM;&lt;br /&gt;
* CRM для контакт-центру;&lt;br /&gt;
* інтеграцію з Ringostat;&lt;br /&gt;
* Telegram-бот;&lt;br /&gt;
* WhatsApp-бот;&lt;br /&gt;
* Email для CRM;&lt;br /&gt;
* TurboSMS;&lt;br /&gt;
* модулі управління проєктами;&lt;br /&gt;
* корпоративний чат;&lt;br /&gt;
* HelpDesk.&lt;br /&gt;
&lt;br /&gt;
=== Виробництво, склад і логістика ===&lt;br /&gt;
&lt;br /&gt;
Для операційного управління доступні:&lt;br /&gt;
&lt;br /&gt;
* K2 ERP Виробництво;&lt;br /&gt;
* K2 WMS для великого складу;&lt;br /&gt;
* ТОІР та облік запчастин;&lt;br /&gt;
* автотранспорт;&lt;br /&gt;
* автоперевезення;&lt;br /&gt;
* GPS-трекінг;&lt;br /&gt;
* інтеграції з Новою поштою та Укрпоштою;&lt;br /&gt;
* модулі транспортної та складської логістики.&lt;br /&gt;
&lt;br /&gt;
=== Документообіг та аналітика ===&lt;br /&gt;
&lt;br /&gt;
До цієї категорії входять:&lt;br /&gt;
&lt;br /&gt;
* K2 Документообіг;&lt;br /&gt;
* VDoc;&lt;br /&gt;
* конструктор структури бази даних;&lt;br /&gt;
* конструктор звітів;&lt;br /&gt;
* конструктор BI-звітів;&lt;br /&gt;
* K2 Реплікатор;&lt;br /&gt;
* система оновлень K2 Update;&lt;br /&gt;
* K2 Projects;&lt;br /&gt;
* K2 LMS.&lt;br /&gt;
&lt;br /&gt;
=== Інтернет-магазини та галузеві рішення ===&lt;br /&gt;
&lt;br /&gt;
У калькуляторі також представлені:&lt;br /&gt;
&lt;br /&gt;
* CMS;&lt;br /&gt;
* K2 Інтернет-магазин;&lt;br /&gt;
* великий інтернет-магазин;&lt;br /&gt;
* інтеграція з Horoshop;&lt;br /&gt;
* LiqPay;&lt;br /&gt;
* WayForPay;&lt;br /&gt;
* рішення для ресторану;&lt;br /&gt;
* рішення для готелю;&lt;br /&gt;
* рішення для стоматологічної клініки;&lt;br /&gt;
* рішення для салону краси;&lt;br /&gt;
* модуль бронювання послуг;&lt;br /&gt;
* модуль роботи з орендарями.&lt;br /&gt;
&lt;br /&gt;
Повний перелік продуктів, а також актуальні ціни потрібно дивитися безпосередньо в калькуляторі, оскільки склад модулів і комерційні умови можуть оновлюватися.&lt;br /&gt;
&lt;br /&gt;
== Приклади базових цін ==&lt;br /&gt;
&lt;br /&gt;
Нижче наведено декілька прикладів базової вартості, зазначеної в калькуляторі на момент публікації статті. Це не повний прайс, а лише приклади для розуміння різниці між SaaS і серверним ліцензуванням.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%; text-align:left;&amp;quot;&lt;br /&gt;
! Продукт&lt;br /&gt;
! Базова SaaS-вартість&lt;br /&gt;
! Серверна ліцензія&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP технологічна платформа&lt;br /&gt;
| —&lt;br /&gt;
| 1 500 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 CRM&lt;br /&gt;
| 35 EUR/міс&lt;br /&gt;
| 1 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Фінансовий облік&lt;br /&gt;
| 35 EUR/міс&lt;br /&gt;
| 1 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP Бухгалтерський облік&lt;br /&gt;
| 85 EUR/міс&lt;br /&gt;
| 15 000 EUR одноразово за повний пакет&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP Зарплата та кадри&lt;br /&gt;
| 70 EUR/міс&lt;br /&gt;
| 2 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP Виробництво&lt;br /&gt;
| 170 EUR/міс&lt;br /&gt;
| 5 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 WMS для великого складу&lt;br /&gt;
| 170 EUR/міс&lt;br /&gt;
| 15 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Реплікатор&lt;br /&gt;
| 180 EUR/міс&lt;br /&gt;
| 5 400 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Конструктор звітів&lt;br /&gt;
| 100 EUR/міс&lt;br /&gt;
| 3 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Управлінський облік&lt;br /&gt;
| 100 EUR/міс&lt;br /&gt;
| 3 000 EUR одноразово&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #e0bd59; border-left:7px solid #d89900; background:#fff8dc; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Зверніть увагу.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Наведені суми є базовими. Остаточна SaaS-вартість залежить від кількості користувачів, обраних модулів, хостингу та пакета обслуговування.&lt;br /&gt;
&lt;br /&gt;
Перед ухваленням рішення потрібно сформувати актуальний розрахунок на &#039;&#039;&#039;[https://calc.corp2.eu calc.corp2.eu]&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Обслуговування та робота спеціалістів ==&lt;br /&gt;
&lt;br /&gt;
Програмне забезпечення і послуги спеціалістів у калькуляторі розділені.&lt;br /&gt;
&lt;br /&gt;
Підприємство може:&lt;br /&gt;
&lt;br /&gt;
* використовувати систему самостійно;&lt;br /&gt;
* замовляти окремі години за потреби;&lt;br /&gt;
* обрати регулярний щомісячний пакет;&lt;br /&gt;
* сформувати постійну команду підтримки та розвитку.&lt;br /&gt;
&lt;br /&gt;
У калькуляторі доступна погодинна оплата, а також пакети від 12 до 350 годин на місяць.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На момент публікації передбачені такі варіанти:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Пакет&lt;br /&gt;
! Годин на місяць&lt;br /&gt;
! Вартість&lt;br /&gt;
|-&lt;br /&gt;
| Погодинна оплата&lt;br /&gt;
| За фактом&lt;br /&gt;
| 90 EUR/год&lt;br /&gt;
|-&lt;br /&gt;
| ПРОФ&lt;br /&gt;
| 12 годин&lt;br /&gt;
| 720 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Малий бізнес&lt;br /&gt;
| 30 годин&lt;br /&gt;
| 1 650 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Середній бізнес&lt;br /&gt;
| 60 годин&lt;br /&gt;
| 3 420 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Великий бізнес&lt;br /&gt;
| 80 годин&lt;br /&gt;
| 4 400 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Ексклюзив&lt;br /&gt;
| 120 годин&lt;br /&gt;
| 6 360 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Ексклюзив&lt;br /&gt;
| 180 годин&lt;br /&gt;
| 9 000 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Ексклюзив&lt;br /&gt;
| 250 годин&lt;br /&gt;
| 11 750 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Бізнес Ексклюзив&lt;br /&gt;
| 350 годин&lt;br /&gt;
| 15 750 EUR/міс&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пакет годин може використовуватися для консультацій, розробки, налаштування, інтеграцій, перенесення інформації, навчання, адміністрування та розвитку системи.&lt;br /&gt;
&lt;br /&gt;
Чим складніший проєкт і чим більше процесів автоматизується, тим більший обсяг роботи може знадобитися на початковому етапі.&lt;br /&gt;
&lt;br /&gt;
== Продовження оновлень ==&lt;br /&gt;
&lt;br /&gt;
Для серверних ліцензій у калькуляторі передбачено декілька сценаріїв щорічного продовження оновлень, починаючи з другого року:&lt;br /&gt;
&lt;br /&gt;
; Пільгове продовження&lt;br /&gt;
: Оформлюється завчасно — приблизно за три місяці до завершення поточного періоду підтримки.&lt;br /&gt;
&lt;br /&gt;
; Стандартне продовження&lt;br /&gt;
: Оформлюється вчасно, без тривалої перерви в отриманні оновлень.&lt;br /&gt;
&lt;br /&gt;
; Прострочене продовження&lt;br /&gt;
: Використовується, якщо після завершення підтримки минуло від трьох місяців до двох років.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Підприємство може одразу порівняти сценарії та оцінити майбутні витрати на підтримання системи в актуальному стані.&lt;br /&gt;
&lt;br /&gt;
== Вартість програмного забезпечення і впровадження — не одне й те саме ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #e4a3a3; border-left:7px solid #c33e3e; background:#fff1f1; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Важливо розрізняти вартість продуктів і вартість проєкту впровадження.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Калькулятор показує ліцензії, SaaS, хостинг, оновлення та обраний пакет обслуговування. Однак остаточний бюджет автоматизації залежить від стану даних, складності процесів, кількості інтеграцій та обсягу необхідних доробок.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Повноцінне впровадження може включати:&lt;br /&gt;
&lt;br /&gt;
* аналіз бізнес-процесів;&lt;br /&gt;
* підготовку технічного завдання;&lt;br /&gt;
* проєктування структури обліку;&lt;br /&gt;
* перенесення довідників і залишків;&lt;br /&gt;
* перенесення історичних даних;&lt;br /&gt;
* міграцію з 1С, BAS або інших систем;&lt;br /&gt;
* налаштування прав доступу;&lt;br /&gt;
* розробку документів, форм і звітів;&lt;br /&gt;
* інтеграцію з банками, обладнанням та зовнішніми сервісами;&lt;br /&gt;
* навчання користувачів;&lt;br /&gt;
* дослідну експлуатацію;&lt;br /&gt;
* підтримку після запуску.&lt;br /&gt;
&lt;br /&gt;
Два підприємства можуть придбати однакові програмні модулі, але мати різну вартість впровадження.&lt;br /&gt;
&lt;br /&gt;
Для однієї компанії достатньо імпортувати початкові залишки та налаштувати стандартні операції. Іншій може знадобитися перенесення багаторічної історії, інтеграція з декількома інформаційними системами, автоматизація виробництва та створення десятків спеціалізованих звітів.&lt;br /&gt;
&lt;br /&gt;
Тому калькулятор потрібно використовувати як &#039;&#039;&#039;інструмент попереднього бюджетування&#039;&#039;&#039;, а остаточний план робіт формувати після обстеження підприємства.&lt;br /&gt;
&lt;br /&gt;
== Можна почати з невеликої конфігурації ==&lt;br /&gt;
&lt;br /&gt;
Перехід на K2 ERP не означає, що підприємство повинно автоматизувати всі процеси одночасно.&lt;br /&gt;
&lt;br /&gt;
Проєкт можна розділити на послідовні етапи.&lt;br /&gt;
&lt;br /&gt;
=== Приклад першого етапу ===&lt;br /&gt;
&lt;br /&gt;
На першому етапі можна запустити:&lt;br /&gt;
&lt;br /&gt;
* CRM;&lt;br /&gt;
* облік клієнтів і договорів;&lt;br /&gt;
* фінансовий облік;&lt;br /&gt;
* імпорт банківських виписок;&lt;br /&gt;
* контроль оплат;&lt;br /&gt;
* базову управлінську звітність.&lt;br /&gt;
&lt;br /&gt;
=== Приклад другого етапу ===&lt;br /&gt;
&lt;br /&gt;
Після стабілізації першого етапу можна додати:&lt;br /&gt;
&lt;br /&gt;
* бухгалтерський і податковий облік;&lt;br /&gt;
* зарплату та кадри;&lt;br /&gt;
* документообіг;&lt;br /&gt;
* інтеграцію з М.E.Doc і Вчасно;&lt;br /&gt;
* бюджетування;&lt;br /&gt;
* розширену аналітику.&lt;br /&gt;
&lt;br /&gt;
=== Приклад третього етапу ===&lt;br /&gt;
&lt;br /&gt;
Для подальшого розвитку можна підключити:&lt;br /&gt;
&lt;br /&gt;
* виробництво;&lt;br /&gt;
* WMS;&lt;br /&gt;
* ТОІР;&lt;br /&gt;
* транспортну логістику;&lt;br /&gt;
* мобільні застосунки;&lt;br /&gt;
* інтеграції з обладнанням;&lt;br /&gt;
* корпоративні BI-звіти.&lt;br /&gt;
&lt;br /&gt;
Такий підхід дозволяє розподілити витрати в часі, швидше отримати перший практичний результат і зменшити ризики великого проєкту.&lt;br /&gt;
&lt;br /&gt;
== Як користуватися калькулятором ==&lt;br /&gt;
&lt;br /&gt;
Щоб сформувати попередній розрахунок, потрібно:&lt;br /&gt;
&lt;br /&gt;
# Відкрити &#039;&#039;&#039;[https://calc.corp2.eu калькулятор K2 ERP]&#039;&#039;&#039;.&lt;br /&gt;
# Обрати варіант постачання.&lt;br /&gt;
# Зазначити кількість користувачів.&lt;br /&gt;
# За потреби вказати назву клієнта.&lt;br /&gt;
# Обрати необхідні модулі.&lt;br /&gt;
# Увімкнути або вимкнути хостинг K2.&lt;br /&gt;
# Вибрати сценарій продовження оновлень.&lt;br /&gt;
# Додати пакет обслуговування.&lt;br /&gt;
# Переглянути підсумкову одноразову та щомісячну вартість.&lt;br /&gt;
# Зберегти конфігурацію або відкрити комерційну пропозицію.&lt;br /&gt;
&lt;br /&gt;
Для автоматичного перерахунку сум у браузері має бути ввімкнений JavaScript.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Готовий розрахунок можна зберегти, скопіювати як посилання та передати іншим учасникам проєкту.&lt;br /&gt;
&lt;br /&gt;
Це зручно, коли рішення про впровадження приймають спільно:&lt;br /&gt;
&lt;br /&gt;
* власник підприємства;&lt;br /&gt;
* фінансовий директор;&lt;br /&gt;
* головний бухгалтер;&lt;br /&gt;
* ІТ-директор;&lt;br /&gt;
* керівники підрозділів;&lt;br /&gt;
* відповідальні за виробництво, склад або логістику.&lt;br /&gt;
&lt;br /&gt;
== Як порівнювати SaaS і серверну ліцензію ==&lt;br /&gt;
&lt;br /&gt;
При порівнянні варіантів важливо оцінювати не лише початкову ціну, а й загальну вартість володіння системою протягом декількох років.&lt;br /&gt;
&lt;br /&gt;
=== SaaS може бути вигіднішим, якщо ===&lt;br /&gt;
&lt;br /&gt;
* потрібно швидко запустити проєкт;&lt;br /&gt;
* кількість користувачів невелика;&lt;br /&gt;
* немає бажання одразу купувати всі ліцензії;&lt;br /&gt;
* конфігурація буде розширюватися поступово;&lt;br /&gt;
* підприємству зручніше планувати щомісячні витрати.&lt;br /&gt;
&lt;br /&gt;
=== Серверна ліцензія може бути вигіднішою, якщо ===&lt;br /&gt;
&lt;br /&gt;
* у системі працює велика кількість користувачів;&lt;br /&gt;
* потрібне розміщення у власній інфраструктурі;&lt;br /&gt;
* підприємство хоче контролювати сервери та бази даних;&lt;br /&gt;
* планується масштабування на декілька підрозділів;&lt;br /&gt;
* система використовується як довгострокова корпоративна платформа.&lt;br /&gt;
&lt;br /&gt;
=== Безкоштовна хмара підходить, якщо ===&lt;br /&gt;
&lt;br /&gt;
* потрібно ознайомитися із K2 ERP;&lt;br /&gt;
* необхідно навчити команду;&lt;br /&gt;
* створюється прототип майбутньої системи;&lt;br /&gt;
* підприємство хоче перевірити функціональність до придбання;&lt;br /&gt;
* потрібен швидкий старт без витрат на ліцензії.&lt;br /&gt;
&lt;br /&gt;
== Прозоре ціноутворення замість «ціни за запитом» ==&lt;br /&gt;
&lt;br /&gt;
На ринку корпоративного програмного забезпечення клієнт нерідко бачить лише напис «ціна за запитом». Після цього потрібно залишити контакти, чекати дзвінка, проводити зустріч і лише потім отримувати орієнтовну суму.&lt;br /&gt;
&lt;br /&gt;
K2 ERP пропонує інший підхід.&lt;br /&gt;
&lt;br /&gt;
Підприємство може самостійно:&lt;br /&gt;
&lt;br /&gt;
* переглянути перелік продуктів;&lt;br /&gt;
* побачити базові ціни;&lt;br /&gt;
* порівняти формати постачання;&lt;br /&gt;
* додати потрібні модулі;&lt;br /&gt;
* змінити кількість користувачів;&lt;br /&gt;
* вибрати обслуговування;&lt;br /&gt;
* сформувати декілька сценаріїв;&lt;br /&gt;
* передати розрахунок керівництву.&lt;br /&gt;
&lt;br /&gt;
Калькулятор не замінює обстеження підприємства та підготовку проєктного плану. Але він дозволяє ще до початку переговорів зрозуміти порядок витрат і визначити реалістичний бюджет.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:24px 0; border:1px solid #efa765; border-left:7px solid #ed7d1a; background:#fff4e8; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:20px 24px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:130%; font-weight:bold; color:#a64a00;&amp;quot;&amp;gt;Не ворожіть над ціною ERP — розрахуйте її&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сформуйте власну конфігурацію, порівняйте SaaS і серверну ліцензію, додайте потрібні модулі та обслуговування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:14px; font-size:118%;&amp;quot;&amp;gt;&#039;&#039;&#039;[https://calc.corp2.eu Перейти до калькулятора K2 ERP]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:8px;&amp;quot;&amp;gt;&#039;&#039;&#039;[https://cloud.corp2.eu Почати безкоштовно у хмарі K2 ERP]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Висновок ==&lt;br /&gt;
&lt;br /&gt;
Не існує єдиної конфігурації K2 ERP, яка однаково підходить кожному підприємству.&lt;br /&gt;
&lt;br /&gt;
Невеликій компанії може бути достатньо CRM, фінансового обліку та декількох користувачів. Великому підприємству можуть знадобитися бухгалтерія, зарплата, виробництво, WMS, документообіг, логістика, BI, інтеграції та сотні робочих місць.&lt;br /&gt;
&lt;br /&gt;
Саме тому вартість потрібно розраховувати відповідно до реальних потреб бізнесу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Калькулятор K2 ERP дає можливість побачити структуру витрат, порівняти різні моделі та сформувати попередній бюджет без прихованих складових.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Див. також ==&lt;br /&gt;
&lt;br /&gt;
* [https://corp2.eu Офіційний сайт K2]&lt;br /&gt;
* [https://erp.kyiv.ua Публікації та відео про K2 ERP]&lt;br /&gt;
* [https://wiki.erp.kyiv.ua Документація K2 ERP]&lt;br /&gt;
* [https://cloud.corp2.eu Безкоштовна хмара K2 ERP]&lt;br /&gt;
* [https://calc.corp2.eu Калькулятор K2 ERP]&lt;br /&gt;
&lt;br /&gt;
== Джерела ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Категорія:K2 ERP]]&lt;br /&gt;
[[index.php?title=Категорія:Ціни K2 ERP]]&lt;br /&gt;
[[index.php?title=Категорія:Ліцензування K2 ERP]]&lt;br /&gt;
[[index.php?title=Категорія:SaaS]]&lt;br /&gt;
[[index.php?title=Категорія:ERP-системи]]&lt;br /&gt;
[[index.php?title=Категорія:Автоматизація бізнесу]]&lt;br /&gt;
[[index.php?title=Категорія:Українське програмне забезпечення]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A1%D0%BA%D1%96%D0%BB%D1%8C%D0%BA%D0%B8_%D0%BA%D0%BE%D1%88%D1%82%D1%83%D1%94_K2_ERP:_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%96%D0%B2,_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D0%B9_%D1%82%D0%B0_%D0%BE%D0%B1%D1%81%D0%BB%D1%83%D0%B3%D0%BE%D0%B2%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F&amp;diff=2765</id>
		<title>Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A1%D0%BA%D1%96%D0%BB%D1%8C%D0%BA%D0%B8_%D0%BA%D0%BE%D1%88%D1%82%D1%83%D1%94_K2_ERP:_%D0%BE%D0%BD%D0%BB%D0%B0%D0%B9%D0%BD-%D0%BA%D0%B0%D0%BB%D1%8C%D0%BA%D1%83%D0%BB%D1%8F%D1%82%D0%BE%D1%80_%D0%BF%D1%80%D0%BE%D0%B4%D1%83%D0%BA%D1%82%D1%96%D0%B2,_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D0%B9_%D1%82%D0%B0_%D0%BE%D0%B1%D1%81%D0%BB%D1%83%D0%B3%D0%BE%D0%B2%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F&amp;diff=2765"/>
		<updated>2026-07-18T19:42:36Z</updated>

		<summary type="html">&lt;p&gt;R: Створена сторінка: {{DISPLAYTITLE:Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування}}  K2 ERP: прозорий розрахунок вартості без прихованих платежів  &amp;#039;&amp;#039;&amp;#039;Скільки коштуватиме K2 ERP саме для вашого підпр...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування}}&lt;br /&gt;
&lt;br /&gt;
[[Файл:Ціна без прихованих платежів.png|центр|міні|1000пкс|K2 ERP: прозорий розрахунок вартості без прихованих платежів]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Скільки коштуватиме K2 ERP саме для вашого підприємства?&#039;&#039;&#039; Відповідь залежить від кількості користувачів, потрібних модулів, способу розміщення системи, обраного формату ліцензування та обсягу послуг команди впровадження.&lt;br /&gt;
&lt;br /&gt;
Щоб підприємству не доводилося проходити довгий «квест» із презентацій, дзвінків і запитів комерційних пропозицій лише заради розуміння базової вартості, створено &#039;&#039;&#039;онлайн-калькулятор K2 ERP&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #86c786; border-left:7px solid #2e9d43; background:#eef9f0; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:125%; font-weight:bold; color:#176b2b;&amp;quot;&amp;gt;Розрахуйте власну конфігурацію K2 ERP&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оберіть формат постачання, кількість користувачів, необхідні модулі, хостинг і пакет обслуговування. Підсумкова сума оновлюється безпосередньо в калькуляторі.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:12px; font-size:115%;&amp;quot;&amp;gt;&#039;&#039;&#039;[https://calc.corp2.eu Відкрити калькулятор K2 ERP]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Калькулятор дозволяє порівняти три основні варіанти роботи:&lt;br /&gt;
&lt;br /&gt;
* безкоштовне використання у спільній хмарі;&lt;br /&gt;
* SaaS-підписку з окремою базою даних;&lt;br /&gt;
* придбання ліцензій для встановлення на власному сервері.&lt;br /&gt;
&lt;br /&gt;
Для кожного з цих варіантів можна окремо додати пакет технічного обслуговування.&amp;lt;ref name=&amp;quot;calc&amp;quot;&amp;gt;[https://calc.corp2.eu Калькулятор продуктів і послуг K2 ERP]&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Навіщо потрібен калькулятор K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
ERP-система не є одним стандартним програмним продуктом з однаковою конфігурацією для кожної компанії. Одному підприємству потрібні лише CRM, фінанси та контроль оплат. Іншому необхідні бухгалтерія, зарплата, виробництво, складська логістика, документообіг, корпоративна звітність та інтеграції із зовнішніми сервісами.&lt;br /&gt;
&lt;br /&gt;
Саме тому поняття «ціна ERP» без уточнення конфігурації мало про що говорить.&lt;br /&gt;
&lt;br /&gt;
Калькулятор K2 ERP допомагає побачити, &#039;&#039;&#039;з яких складових формується вартість&#039;&#039;&#039;, і сформувати попередній бюджет ще до початку детального обстеження підприємства.&lt;br /&gt;
&lt;br /&gt;
За допомогою калькулятора можна:&lt;br /&gt;
&lt;br /&gt;
* порівняти безкоштовну хмару, SaaS і серверне ліцензування;&lt;br /&gt;
* обрати потрібні функціональні модулі;&lt;br /&gt;
* зазначити кількість користувачів;&lt;br /&gt;
* врахувати хостинг або розміщення на власному сервері;&lt;br /&gt;
* додати пакет обслуговування;&lt;br /&gt;
* розрахувати одноразові та щомісячні витрати;&lt;br /&gt;
* зберегти конфігурацію та отримати посилання;&lt;br /&gt;
* відкрити попередню комерційну пропозицію;&lt;br /&gt;
* передати сформований розрахунок колегам.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #8fbce6; border-left:7px solid #2878bd; background:#eef6fd; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Головна перевага калькулятора — прозорість.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Клієнт бачить не абстрактну «вартість автоматизації», а окремо вартість програмних модулів, інфраструктури, користувачів, оновлень і роботи спеціалістів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Три варіанти використання K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
=== Безкоштовна спільна хмара ===&lt;br /&gt;
&lt;br /&gt;
Перший варіант — безкоштовна робота у спільній хмарі &#039;&#039;&#039;K2 ERP Cloud&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Зареєструватися та почати роботу можна за адресою:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[https://cloud.corp2.eu cloud.corp2.eu]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
У спільній хмарі функціональні модулі доступні без оплати за самі модулі та кількість користувачів. Підприємство може знайомитися із системою, перевіряти її можливості, створювати власні структури обліку, працювати з документами, довідниками, звітами та іншими інструментами.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
За потреби до безкоштовної версії можна додати платне обслуговування:&lt;br /&gt;
&lt;br /&gt;
* консультації користувачів;&lt;br /&gt;
* налаштування системи;&lt;br /&gt;
* перенесення даних;&lt;br /&gt;
* створення форм і звітів;&lt;br /&gt;
* розробку додаткової функціональності;&lt;br /&gt;
* навчання працівників;&lt;br /&gt;
* інтеграції із зовнішніми системами.&lt;br /&gt;
&lt;br /&gt;
Безкоштовна хмара підходить для навчання, тестування, прототипування, демонстрації можливостей K2 ERP та запуску невеликих проєктів.&lt;br /&gt;
&lt;br /&gt;
=== SaaS-підписка ===&lt;br /&gt;
&lt;br /&gt;
Другий варіант — окрема база даних K2 ERP із щомісячною оплатою.&lt;br /&gt;
&lt;br /&gt;
У моделі SaaS підприємство обирає необхідні модулі та кількість користувачів. Калькулятор визначає базову щомісячну вартість конфігурації та перераховує її відповідно до заданих параметрів.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
SaaS дозволяє не купувати відразу весь набір серверних ліцензій. Компанія може почати з кількох основних модулів, а потім поступово розширювати систему.&lt;br /&gt;
&lt;br /&gt;
Наприклад, перший етап може включати:&lt;br /&gt;
&lt;br /&gt;
# CRM;&lt;br /&gt;
# фінансовий облік;&lt;br /&gt;
# банківські виписки;&lt;br /&gt;
# контроль оплат;&lt;br /&gt;
# роботу з клієнтами та договорами.&lt;br /&gt;
&lt;br /&gt;
Після запуску можна додати бухгалтерський облік, зарплату, виробництво, документообіг, WMS, управлінський облік, логістику та галузеві модулі.&lt;br /&gt;
&lt;br /&gt;
У калькуляторі також можна обрати хостинг K2. Його щомісячна вартість розраховується за градацією кількості користувачів. Якщо хостинг K2 вимкнено, передбачається використання сервера клієнта та окреме одноразове розгортання системи.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Ліцензія на власний сервер ===&lt;br /&gt;
&lt;br /&gt;
Третій варіант — одноразове придбання технологічної платформи та функціональних модулів.&lt;br /&gt;
&lt;br /&gt;
Такий формат підходить підприємствам, які хочуть розмістити K2 ERP:&lt;br /&gt;
&lt;br /&gt;
* у власному дата-центрі;&lt;br /&gt;
* на орендованому сервері;&lt;br /&gt;
* у приватній хмарі;&lt;br /&gt;
* у корпоративній інфраструктурі;&lt;br /&gt;
* у гібридному середовищі.&lt;br /&gt;
&lt;br /&gt;
При серверному ліцензуванні кількість користувачів не обмежується. Підприємство сплачує за технологічну платформу та обрані функціональні модулі, а не за кожне окреме робоче місце.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Обов’язковою складовою серверної конфігурації є &#039;&#039;&#039;технологічна платформа K2 ERP&#039;&#039;&#039;. &#039;&#039;&#039;K2 Ядро&#039;&#039;&#039; входить до платформи без додаткової оплати.&lt;br /&gt;
&lt;br /&gt;
Серверна модель особливо вигідна для підприємств, у яких із системою працюють сотні користувачів, декілька юридичних осіб, філії, склади, виробничі майданчики або територіально розподілені підрозділи.&lt;br /&gt;
&lt;br /&gt;
== З чого формується підсумкова вартість ==&lt;br /&gt;
&lt;br /&gt;
Загальна вартість K2 ERP складається не з одного показника. Калькулятор враховує декілька основних складових.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;width:28%;&amp;quot; | Складова&lt;br /&gt;
! Що враховується&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Формат постачання&#039;&#039;&#039;&lt;br /&gt;
| Безкоштовна хмара, SaaS-підписка або серверна ліцензія.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Кількість користувачів&#039;&#039;&#039;&lt;br /&gt;
| Використовується під час розрахунку SaaS і хостингу.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Функціональні модулі&#039;&#039;&#039;&lt;br /&gt;
| Облік, CRM, виробництво, склад, документообіг, інтеграції та інші компоненти.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Інфраструктура&#039;&#039;&#039;&lt;br /&gt;
| Хостинг K2 або сервер підприємства.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Оновлення&#039;&#039;&#039;&lt;br /&gt;
| Сценарій щорічного продовження оновлень із другого року.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Обслуговування&#039;&#039;&#039;&lt;br /&gt;
| Погодинна робота або щомісячний пакет годин спеціалістів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Для SaaS загальну логіку можна представити так:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;модулі + кількість користувачів + хостинг + обслуговування.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Для серверної моделі:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;технологічна платформа + модулі + розгортання + оновлення + обслуговування.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Які продукти можна обрати ==&lt;br /&gt;
&lt;br /&gt;
Калькулятор містить велику кількість продуктів, функціональних модулів та інтеграцій K2 ERP. Їх можна підбирати відповідно до реальних процесів підприємства, а не купувати єдиний надмірно великий пакет.&lt;br /&gt;
&lt;br /&gt;
=== Фінанси, бухгалтерія та управлінський облік ===&lt;br /&gt;
&lt;br /&gt;
До цієї групи належать:&lt;br /&gt;
&lt;br /&gt;
* K2 Фінансовий облік;&lt;br /&gt;
* K2 Каса;&lt;br /&gt;
* K2 ERP Бухгалтерський облік;&lt;br /&gt;
* K2 Управлінський облік;&lt;br /&gt;
* K2 ERP Зарплата та кадри;&lt;br /&gt;
* K2 multi-GAAP;&lt;br /&gt;
* K2 SAF-T;&lt;br /&gt;
* модулі обміну з банками;&lt;br /&gt;
* інтеграції з М.E.Doc, Вчасно та ДПС.&lt;br /&gt;
&lt;br /&gt;
=== CRM і робота з клієнтами ===&lt;br /&gt;
&lt;br /&gt;
Підприємство може обрати:&lt;br /&gt;
&lt;br /&gt;
* K2 CRM;&lt;br /&gt;
* CRM для контакт-центру;&lt;br /&gt;
* інтеграцію з Ringostat;&lt;br /&gt;
* Telegram-бот;&lt;br /&gt;
* WhatsApp-бот;&lt;br /&gt;
* Email для CRM;&lt;br /&gt;
* TurboSMS;&lt;br /&gt;
* модулі управління проєктами;&lt;br /&gt;
* корпоративний чат;&lt;br /&gt;
* HelpDesk.&lt;br /&gt;
&lt;br /&gt;
=== Виробництво, склад і логістика ===&lt;br /&gt;
&lt;br /&gt;
Для операційного управління доступні:&lt;br /&gt;
&lt;br /&gt;
* K2 ERP Виробництво;&lt;br /&gt;
* K2 WMS для великого складу;&lt;br /&gt;
* ТОІР та облік запчастин;&lt;br /&gt;
* автотранспорт;&lt;br /&gt;
* автоперевезення;&lt;br /&gt;
* GPS-трекінг;&lt;br /&gt;
* інтеграції з Новою поштою та Укрпоштою;&lt;br /&gt;
* модулі транспортної та складської логістики.&lt;br /&gt;
&lt;br /&gt;
=== Документообіг та аналітика ===&lt;br /&gt;
&lt;br /&gt;
До цієї категорії входять:&lt;br /&gt;
&lt;br /&gt;
* K2 Документообіг;&lt;br /&gt;
* VDoc;&lt;br /&gt;
* конструктор структури бази даних;&lt;br /&gt;
* конструктор звітів;&lt;br /&gt;
* конструктор BI-звітів;&lt;br /&gt;
* K2 Реплікатор;&lt;br /&gt;
* система оновлень K2 Update;&lt;br /&gt;
* K2 Projects;&lt;br /&gt;
* K2 LMS.&lt;br /&gt;
&lt;br /&gt;
=== Інтернет-магазини та галузеві рішення ===&lt;br /&gt;
&lt;br /&gt;
У калькуляторі також представлені:&lt;br /&gt;
&lt;br /&gt;
* CMS;&lt;br /&gt;
* K2 Інтернет-магазин;&lt;br /&gt;
* великий інтернет-магазин;&lt;br /&gt;
* інтеграція з Horoshop;&lt;br /&gt;
* LiqPay;&lt;br /&gt;
* WayForPay;&lt;br /&gt;
* рішення для ресторану;&lt;br /&gt;
* рішення для готелю;&lt;br /&gt;
* рішення для стоматологічної клініки;&lt;br /&gt;
* рішення для салону краси;&lt;br /&gt;
* модуль бронювання послуг;&lt;br /&gt;
* модуль роботи з орендарями.&lt;br /&gt;
&lt;br /&gt;
Повний перелік продуктів, а також актуальні ціни потрібно дивитися безпосередньо в калькуляторі, оскільки склад модулів і комерційні умови можуть оновлюватися.&lt;br /&gt;
&lt;br /&gt;
== Приклади базових цін ==&lt;br /&gt;
&lt;br /&gt;
Нижче наведено декілька прикладів базової вартості, зазначеної в калькуляторі на момент публікації статті. Це не повний прайс, а лише приклади для розуміння різниці між SaaS і серверним ліцензуванням.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;width:100%; text-align:left;&amp;quot;&lt;br /&gt;
! Продукт&lt;br /&gt;
! Базова SaaS-вартість&lt;br /&gt;
! Серверна ліцензія&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP технологічна платформа&lt;br /&gt;
| —&lt;br /&gt;
| 1 500 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 CRM&lt;br /&gt;
| 35 EUR/міс&lt;br /&gt;
| 1 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Фінансовий облік&lt;br /&gt;
| 35 EUR/міс&lt;br /&gt;
| 1 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP Бухгалтерський облік&lt;br /&gt;
| 85 EUR/міс&lt;br /&gt;
| 15 000 EUR одноразово за повний пакет&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP Зарплата та кадри&lt;br /&gt;
| 70 EUR/міс&lt;br /&gt;
| 2 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 ERP Виробництво&lt;br /&gt;
| 170 EUR/міс&lt;br /&gt;
| 5 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 WMS для великого складу&lt;br /&gt;
| 170 EUR/міс&lt;br /&gt;
| 15 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Реплікатор&lt;br /&gt;
| 180 EUR/міс&lt;br /&gt;
| 5 400 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Конструктор звітів&lt;br /&gt;
| 100 EUR/міс&lt;br /&gt;
| 3 000 EUR одноразово&lt;br /&gt;
|-&lt;br /&gt;
| K2 Управлінський облік&lt;br /&gt;
| 100 EUR/міс&lt;br /&gt;
| 3 000 EUR одноразово&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #e0bd59; border-left:7px solid #d89900; background:#fff8dc; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Зверніть увагу.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Наведені суми є базовими. Остаточна SaaS-вартість залежить від кількості користувачів, обраних модулів, хостингу та пакета обслуговування.&lt;br /&gt;
&lt;br /&gt;
Перед ухваленням рішення потрібно сформувати актуальний розрахунок на &#039;&#039;&#039;[https://calc.corp2.eu calc.corp2.eu]&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Обслуговування та робота спеціалістів ==&lt;br /&gt;
&lt;br /&gt;
Програмне забезпечення і послуги спеціалістів у калькуляторі розділені.&lt;br /&gt;
&lt;br /&gt;
Підприємство може:&lt;br /&gt;
&lt;br /&gt;
* використовувати систему самостійно;&lt;br /&gt;
* замовляти окремі години за потреби;&lt;br /&gt;
* обрати регулярний щомісячний пакет;&lt;br /&gt;
* сформувати постійну команду підтримки та розвитку.&lt;br /&gt;
&lt;br /&gt;
У калькуляторі доступна погодинна оплата, а також пакети від 12 до 350 годин на місяць.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
На момент публікації передбачені такі варіанти:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%;&amp;quot;&lt;br /&gt;
! Пакет&lt;br /&gt;
! Годин на місяць&lt;br /&gt;
! Вартість&lt;br /&gt;
|-&lt;br /&gt;
| Погодинна оплата&lt;br /&gt;
| За фактом&lt;br /&gt;
| 90 EUR/год&lt;br /&gt;
|-&lt;br /&gt;
| ПРОФ&lt;br /&gt;
| 12 годин&lt;br /&gt;
| 720 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Малий бізнес&lt;br /&gt;
| 30 годин&lt;br /&gt;
| 1 650 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Середній бізнес&lt;br /&gt;
| 60 годин&lt;br /&gt;
| 3 420 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Великий бізнес&lt;br /&gt;
| 80 годин&lt;br /&gt;
| 4 400 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Ексклюзив&lt;br /&gt;
| 120 годин&lt;br /&gt;
| 6 360 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Ексклюзив&lt;br /&gt;
| 180 годин&lt;br /&gt;
| 9 000 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Ексклюзив&lt;br /&gt;
| 250 годин&lt;br /&gt;
| 11 750 EUR/міс&lt;br /&gt;
|-&lt;br /&gt;
| Бізнес Ексклюзив&lt;br /&gt;
| 350 годин&lt;br /&gt;
| 15 750 EUR/міс&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пакет годин може використовуватися для консультацій, розробки, налаштування, інтеграцій, перенесення інформації, навчання, адміністрування та розвитку системи.&lt;br /&gt;
&lt;br /&gt;
Чим складніший проєкт і чим більше процесів автоматизується, тим більший обсяг роботи може знадобитися на початковому етапі.&lt;br /&gt;
&lt;br /&gt;
== Продовження оновлень ==&lt;br /&gt;
&lt;br /&gt;
Для серверних ліцензій у калькуляторі передбачено декілька сценаріїв щорічного продовження оновлень, починаючи з другого року:&lt;br /&gt;
&lt;br /&gt;
; Пільгове продовження&lt;br /&gt;
: Оформлюється завчасно — приблизно за три місяці до завершення поточного періоду підтримки.&lt;br /&gt;
&lt;br /&gt;
; Стандартне продовження&lt;br /&gt;
: Оформлюється вчасно, без тривалої перерви в отриманні оновлень.&lt;br /&gt;
&lt;br /&gt;
; Прострочене продовження&lt;br /&gt;
: Використовується, якщо після завершення підтримки минуло від трьох місяців до двох років.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Підприємство може одразу порівняти сценарії та оцінити майбутні витрати на підтримання системи в актуальному стані.&lt;br /&gt;
&lt;br /&gt;
== Вартість програмного забезпечення і впровадження — не одне й те саме ==&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:20px 0; border:1px solid #e4a3a3; border-left:7px solid #c33e3e; background:#fff1f1; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:18px 22px;&amp;quot; |&lt;br /&gt;
&#039;&#039;&#039;Важливо розрізняти вартість продуктів і вартість проєкту впровадження.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Калькулятор показує ліцензії, SaaS, хостинг, оновлення та обраний пакет обслуговування. Однак остаточний бюджет автоматизації залежить від стану даних, складності процесів, кількості інтеграцій та обсягу необхідних доробок.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Повноцінне впровадження може включати:&lt;br /&gt;
&lt;br /&gt;
* аналіз бізнес-процесів;&lt;br /&gt;
* підготовку технічного завдання;&lt;br /&gt;
* проєктування структури обліку;&lt;br /&gt;
* перенесення довідників і залишків;&lt;br /&gt;
* перенесення історичних даних;&lt;br /&gt;
* міграцію з 1С, BAS або інших систем;&lt;br /&gt;
* налаштування прав доступу;&lt;br /&gt;
* розробку документів, форм і звітів;&lt;br /&gt;
* інтеграцію з банками, обладнанням та зовнішніми сервісами;&lt;br /&gt;
* навчання користувачів;&lt;br /&gt;
* дослідну експлуатацію;&lt;br /&gt;
* підтримку після запуску.&lt;br /&gt;
&lt;br /&gt;
Два підприємства можуть придбати однакові програмні модулі, але мати різну вартість впровадження.&lt;br /&gt;
&lt;br /&gt;
Для однієї компанії достатньо імпортувати початкові залишки та налаштувати стандартні операції. Іншій може знадобитися перенесення багаторічної історії, інтеграція з декількома інформаційними системами, автоматизація виробництва та створення десятків спеціалізованих звітів.&lt;br /&gt;
&lt;br /&gt;
Тому калькулятор потрібно використовувати як &#039;&#039;&#039;інструмент попереднього бюджетування&#039;&#039;&#039;, а остаточний план робіт формувати після обстеження підприємства.&lt;br /&gt;
&lt;br /&gt;
== Можна почати з невеликої конфігурації ==&lt;br /&gt;
&lt;br /&gt;
Перехід на K2 ERP не означає, що підприємство повинно автоматизувати всі процеси одночасно.&lt;br /&gt;
&lt;br /&gt;
Проєкт можна розділити на послідовні етапи.&lt;br /&gt;
&lt;br /&gt;
=== Приклад першого етапу ===&lt;br /&gt;
&lt;br /&gt;
На першому етапі можна запустити:&lt;br /&gt;
&lt;br /&gt;
* CRM;&lt;br /&gt;
* облік клієнтів і договорів;&lt;br /&gt;
* фінансовий облік;&lt;br /&gt;
* імпорт банківських виписок;&lt;br /&gt;
* контроль оплат;&lt;br /&gt;
* базову управлінську звітність.&lt;br /&gt;
&lt;br /&gt;
=== Приклад другого етапу ===&lt;br /&gt;
&lt;br /&gt;
Після стабілізації першого етапу можна додати:&lt;br /&gt;
&lt;br /&gt;
* бухгалтерський і податковий облік;&lt;br /&gt;
* зарплату та кадри;&lt;br /&gt;
* документообіг;&lt;br /&gt;
* інтеграцію з М.E.Doc і Вчасно;&lt;br /&gt;
* бюджетування;&lt;br /&gt;
* розширену аналітику.&lt;br /&gt;
&lt;br /&gt;
=== Приклад третього етапу ===&lt;br /&gt;
&lt;br /&gt;
Для подальшого розвитку можна підключити:&lt;br /&gt;
&lt;br /&gt;
* виробництво;&lt;br /&gt;
* WMS;&lt;br /&gt;
* ТОІР;&lt;br /&gt;
* транспортну логістику;&lt;br /&gt;
* мобільні застосунки;&lt;br /&gt;
* інтеграції з обладнанням;&lt;br /&gt;
* корпоративні BI-звіти.&lt;br /&gt;
&lt;br /&gt;
Такий підхід дозволяє розподілити витрати в часі, швидше отримати перший практичний результат і зменшити ризики великого проєкту.&lt;br /&gt;
&lt;br /&gt;
== Як користуватися калькулятором ==&lt;br /&gt;
&lt;br /&gt;
Щоб сформувати попередній розрахунок, потрібно:&lt;br /&gt;
&lt;br /&gt;
# Відкрити &#039;&#039;&#039;[https://calc.corp2.eu калькулятор K2 ERP]&#039;&#039;&#039;.&lt;br /&gt;
# Обрати варіант постачання.&lt;br /&gt;
# Зазначити кількість користувачів.&lt;br /&gt;
# За потреби вказати назву клієнта.&lt;br /&gt;
# Обрати необхідні модулі.&lt;br /&gt;
# Увімкнути або вимкнути хостинг K2.&lt;br /&gt;
# Вибрати сценарій продовження оновлень.&lt;br /&gt;
# Додати пакет обслуговування.&lt;br /&gt;
# Переглянути підсумкову одноразову та щомісячну вартість.&lt;br /&gt;
# Зберегти конфігурацію або відкрити комерційну пропозицію.&lt;br /&gt;
&lt;br /&gt;
Для автоматичного перерахунку сум у браузері має бути ввімкнений JavaScript.&amp;lt;ref name=&amp;quot;calc&amp;quot; /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Готовий розрахунок можна зберегти, скопіювати як посилання та передати іншим учасникам проєкту.&lt;br /&gt;
&lt;br /&gt;
Це зручно, коли рішення про впровадження приймають спільно:&lt;br /&gt;
&lt;br /&gt;
* власник підприємства;&lt;br /&gt;
* фінансовий директор;&lt;br /&gt;
* головний бухгалтер;&lt;br /&gt;
* ІТ-директор;&lt;br /&gt;
* керівники підрозділів;&lt;br /&gt;
* відповідальні за виробництво, склад або логістику.&lt;br /&gt;
&lt;br /&gt;
== Як порівнювати SaaS і серверну ліцензію ==&lt;br /&gt;
&lt;br /&gt;
При порівнянні варіантів важливо оцінювати не лише початкову ціну, а й загальну вартість володіння системою протягом декількох років.&lt;br /&gt;
&lt;br /&gt;
=== SaaS може бути вигіднішим, якщо ===&lt;br /&gt;
&lt;br /&gt;
* потрібно швидко запустити проєкт;&lt;br /&gt;
* кількість користувачів невелика;&lt;br /&gt;
* немає бажання одразу купувати всі ліцензії;&lt;br /&gt;
* конфігурація буде розширюватися поступово;&lt;br /&gt;
* підприємству зручніше планувати щомісячні витрати.&lt;br /&gt;
&lt;br /&gt;
=== Серверна ліцензія може бути вигіднішою, якщо ===&lt;br /&gt;
&lt;br /&gt;
* у системі працює велика кількість користувачів;&lt;br /&gt;
* потрібне розміщення у власній інфраструктурі;&lt;br /&gt;
* підприємство хоче контролювати сервери та бази даних;&lt;br /&gt;
* планується масштабування на декілька підрозділів;&lt;br /&gt;
* система використовується як довгострокова корпоративна платформа.&lt;br /&gt;
&lt;br /&gt;
=== Безкоштовна хмара підходить, якщо ===&lt;br /&gt;
&lt;br /&gt;
* потрібно ознайомитися із K2 ERP;&lt;br /&gt;
* необхідно навчити команду;&lt;br /&gt;
* створюється прототип майбутньої системи;&lt;br /&gt;
* підприємство хоче перевірити функціональність до придбання;&lt;br /&gt;
* потрібен швидкий старт без витрат на ліцензії.&lt;br /&gt;
&lt;br /&gt;
== Прозоре ціноутворення замість «ціни за запитом» ==&lt;br /&gt;
&lt;br /&gt;
На ринку корпоративного програмного забезпечення клієнт нерідко бачить лише напис «ціна за запитом». Після цього потрібно залишити контакти, чекати дзвінка, проводити зустріч і лише потім отримувати орієнтовну суму.&lt;br /&gt;
&lt;br /&gt;
K2 ERP пропонує інший підхід.&lt;br /&gt;
&lt;br /&gt;
Підприємство може самостійно:&lt;br /&gt;
&lt;br /&gt;
* переглянути перелік продуктів;&lt;br /&gt;
* побачити базові ціни;&lt;br /&gt;
* порівняти формати постачання;&lt;br /&gt;
* додати потрібні модулі;&lt;br /&gt;
* змінити кількість користувачів;&lt;br /&gt;
* вибрати обслуговування;&lt;br /&gt;
* сформувати декілька сценаріїв;&lt;br /&gt;
* передати розрахунок керівництву.&lt;br /&gt;
&lt;br /&gt;
Калькулятор не замінює обстеження підприємства та підготовку проєктного плану. Але він дозволяє ще до початку переговорів зрозуміти порядок витрат і визначити реалістичний бюджет.&lt;br /&gt;
&lt;br /&gt;
{| style=&amp;quot;width:100%; margin:24px 0; border:1px solid #efa765; border-left:7px solid #ed7d1a; background:#fff4e8; border-radius:6px;&amp;quot;&lt;br /&gt;
| style=&amp;quot;padding:20px 24px;&amp;quot; |&lt;br /&gt;
&amp;lt;div style=&amp;quot;font-size:130%; font-weight:bold; color:#a64a00;&amp;quot;&amp;gt;Не ворожіть над ціною ERP — розрахуйте її&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Сформуйте власну конфігурацію, порівняйте SaaS і серверну ліцензію, додайте потрібні модулі та обслуговування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:14px; font-size:118%;&amp;quot;&amp;gt;&#039;&#039;&#039;[https://calc.corp2.eu Перейти до калькулятора K2 ERP]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin-top:8px;&amp;quot;&amp;gt;&#039;&#039;&#039;[https://cloud.corp2.eu Почати безкоштовно у хмарі K2 ERP]&#039;&#039;&#039;&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Висновок ==&lt;br /&gt;
&lt;br /&gt;
Не існує єдиної конфігурації K2 ERP, яка однаково підходить кожному підприємству.&lt;br /&gt;
&lt;br /&gt;
Невеликій компанії може бути достатньо CRM, фінансового обліку та декількох користувачів. Великому підприємству можуть знадобитися бухгалтерія, зарплата, виробництво, WMS, документообіг, логістика, BI, інтеграції та сотні робочих місць.&lt;br /&gt;
&lt;br /&gt;
Саме тому вартість потрібно розраховувати відповідно до реальних потреб бізнесу.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Калькулятор K2 ERP дає можливість побачити структуру витрат, порівняти різні моделі та сформувати попередній бюджет без прихованих складових.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Див. також ==&lt;br /&gt;
&lt;br /&gt;
* [https://corp2.eu Офіційний сайт K2]&lt;br /&gt;
* [https://erp.kyiv.ua Публікації та відео про K2 ERP]&lt;br /&gt;
* [https://wiki.erp.kyiv.ua Документація K2 ERP]&lt;br /&gt;
* [https://cloud.corp2.eu Безкоштовна хмара K2 ERP]&lt;br /&gt;
* [https://calc.corp2.eu Калькулятор K2 ERP]&lt;br /&gt;
&lt;br /&gt;
== Джерела ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорія:K2 ERP]]&lt;br /&gt;
[[Категорія:Ціни K2 ERP]]&lt;br /&gt;
[[Категорія:Ліцензування K2 ERP]]&lt;br /&gt;
[[Категорія:SaaS]]&lt;br /&gt;
[[Категорія:ERP-системи]]&lt;br /&gt;
[[Категорія:Автоматизація бізнесу]]&lt;br /&gt;
[[Категорія:Українське програмне забезпечення]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A6%D1%96%D0%BD%D0%B8_K2_ERP.png&amp;diff=2764</id>
		<title>Файл:Ціни K2 ERP.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%A6%D1%96%D0%BD%D0%B8_K2_ERP.png&amp;diff=2764"/>
		<updated>2026-07-18T19:42:29Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0&amp;diff=2763</id>
		<title>Головна сторінка</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0&amp;diff=2763"/>
		<updated>2026-07-18T19:42:14Z</updated>

		<summary type="html">&lt;p&gt;R: Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Wiki k2erp.png|центр|міні|800x800пкс|Wiki K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Про систему K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP]] — це комплексна система управління підприємством, яка об’єднує фінанси, бухгалтерію, продажі, склад, закупівлі, документообіг, CRM, аналітику та галузеві модулі в єдиному цифровому середовищі. Система допомагає автоматизувати щоденні процеси, зменшити ручну роботу й кількість помилок, контролювати ресурси в реальному часі, швидше обробляти заявки та документи, бачити повну картину бізнесу й приймати точні управлінські рішення на основі актуальних даних. Завдяки модульності, хмарному доступу та гнучкому налаштуванню K2 ERP підходить для компаній різного масштабу й допомагає бізнесу працювати прозоріше, ефективніше та впевнено масштабуватися.&lt;br /&gt;
&lt;br /&gt;
Подробно про систему читайте в статті: [[K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Відмова від 1С та BAS під ключ: перехід неминучий — питання лише в тому, хто встигне зробити його планово]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP — реальна альтернатива 1С та BAS? Бо міняти російське ПЗ на “майже те саме” — це вже не стратегія, а бізнесовий мазохізм]]&lt;br /&gt;
&lt;br /&gt;
[[ERP нового покоління: чому власна платформа K2 ERP на Python і TypeScript сильніша за спадщину 1С/BAS та важкі enterprise-рішення]]&lt;br /&gt;
&lt;br /&gt;
[[Короткі відео про роботу в K2 ERP: українська ERP, яку можна побачити в дії]]&lt;br /&gt;
&lt;br /&gt;
[[Ознайомче відео про K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Альтернатива 1С: якою вона повинна бути насправді]]&lt;br /&gt;
&lt;br /&gt;
[[Робимо бізнес разом!]]&lt;br /&gt;
&lt;br /&gt;
[[Не витрачайте роки та гроші на ERP з нуля. Об’єднуймося навколо K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Лавинний розвиток K2 ERP: чому відкрита українська ERP-система розвивається швидше за старий світ 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP йде шляхом швидкої розробки, моделей, конструкторів і об’єднання даних]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP розвиває власну систему, а не Odoo, IT-Enterprise чи SAP]]&lt;br /&gt;
&lt;br /&gt;
[[Візитка K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Хто ваш клієнт, K2?]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP відкрила безкоштовну хмару для українського бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Інструменти розробника K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Програмування зі швидкістю думки]]&lt;br /&gt;
&lt;br /&gt;
[[Чим відрізняється робота в cloud.corp2.eu від власної хмари]]&lt;br /&gt;
&lt;br /&gt;
[[Розробка K2 ERP на замовлення як правильний перехід з 1С та BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Продуктова компанія, інтегратор чи гібридна модель K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Нові можливості K2 ERP: коли система розвивається з параболічною швидкістю (травень 2026)]]&lt;br /&gt;
&lt;br /&gt;
[[Можливості K2 ERP — травень 2026]]&lt;br /&gt;
&lt;br /&gt;
[[Новий модуль «Зарплата та кадри» в K2 ERP: коли зарплата рахується, кадри не губляться, а бухгалтер більше не живе в Excel]]&lt;br /&gt;
&lt;br /&gt;
[[Виробництво без хаосу: як модуль «Виробництво» в K2 ERP веде виріб від специфікації до готової продукції]]&lt;br /&gt;
&lt;br /&gt;
== Вартість K2 ERP ==&lt;br /&gt;
[[Скільки коштує K2 ERP: онлайн-калькулятор продуктів, ліцензій та обслуговування]]&lt;br /&gt;
&lt;br /&gt;
[[Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії]]&lt;br /&gt;
&lt;br /&gt;
== Перехід з 1С та BAS на K2 ERP ==&lt;br /&gt;
[[Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка]]&lt;br /&gt;
&lt;br /&gt;
== Стандартизація ==&lt;br /&gt;
[[ISO 9001 Scrum регламент K2 ERP: система якості, тижневі спринти, Zoom-записи, VDoc і Telegram-комунікації|ISO 9001 + Scrum + регламент K2 ERP: система якості, тижневі спринти, Zoom-записи, VDoc і Telegram-комунікації]]&lt;br /&gt;
&lt;br /&gt;
== Акції та пропозиції ==&lt;br /&gt;
[[Навчайте студентів працювати з українською ERP-системою K2 ERP — альтернативою 1С та BAS]]&lt;br /&gt;
&lt;br /&gt;
== Вакансії ==&lt;br /&gt;
[[Python-програмісти, які хочуть працювати з K2 ERP: не чекайте “колись”. Починайте зараз]]&lt;br /&gt;
&lt;br /&gt;
== Історія про K2 ERP ==&lt;br /&gt;
[[Звідки взявся K2® ERP]]&lt;br /&gt;
&lt;br /&gt;
== Сайти K2 ERP ==&lt;br /&gt;
[[Ресурси K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Комунікація з K2 ERP ==&lt;br /&gt;
[[Регламент K2]]&lt;br /&gt;
&lt;br /&gt;
[[Звернення через HelpDesk]]&lt;br /&gt;
&lt;br /&gt;
== Концептуальні підходи та принципи роботи ==&lt;br /&gt;
[[Кількість ліцензій BAS проти безліміту K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Концепція передпродажних модулів K2 ERP: як малими внесками перемагати великі системи]]&lt;br /&gt;
&lt;br /&gt;
[[Магія єдиної системи: чому модульний підхід K2 ERP у рази, десятки разів і навіть на порядки ефективніший за 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[AI в K2 ERP: коли облік перестає бути нудним, а бізнес починає дихати на повні груди]]&lt;br /&gt;
&lt;br /&gt;
[[Чи є ризик залежності від одного підрядника при автоматизації бізнесу?]]&lt;br /&gt;
&lt;br /&gt;
[[Другий раз платити за той самий “зоопарк” ніхто не хоче: чому перехід з 1С на K2 ERP — це не про нову кастомізацію, а про нову логіку бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Чому “олдскульні” гриди насправді рятують бізнес: краса інтерфейсу не дорівнює силі продукту]]&lt;br /&gt;
&lt;br /&gt;
[[Крос-платформеність: та сама “дрібниця”, на якій великі компанії щороку залишають купу грошей]]&lt;br /&gt;
&lt;br /&gt;
== Пояснення термінів ==&lt;br /&gt;
&lt;br /&gt;
[[Що таке ERP — і чому справжня ERP-система починається там, де закінчується звичка зводити бізнес до бухгалтерії]]&lt;br /&gt;
&lt;br /&gt;
[[Що таке CRM і чому її інтеграція з ERP відкриває нові можливості для бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[CMS у K2 ERP: сайт компанії, який не просто “висить в інтернеті”, а працює на бізнес]]&lt;br /&gt;
&lt;br /&gt;
[[Інтернет-магазин у K2 ERP: коли онлайн-продажі стають частиною єдиної системи, а не окремим головним болем]]&lt;br /&gt;
&lt;br /&gt;
== Для користувачів ==&lt;br /&gt;
&lt;br /&gt;
[[Початок роботи з K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Звіти в K2 Cloud ERP|Звіти в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[CRM Файли в K2 ERP|CRM + Файли в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Повне відео демонстрації K2 ERP доступне з оригінальним голосом інтерфейсу та реального показу роботи системи]]&lt;br /&gt;
&lt;br /&gt;
[[Хмара K2 ERP для безкоштовної реальної роботи]] &lt;br /&gt;
&lt;br /&gt;
[[Управлінський облік K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Бухгалтерія K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[CRM K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Складський облік K2 ERP (WMS)]]&lt;br /&gt;
&lt;br /&gt;
[[CMS K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Інтернет-магазин K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 VDoc]]&lt;br /&gt;
&lt;br /&gt;
[[Галузеві рішення K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Звіти та аналітика K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Поширені питання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Використання штучного інтелекту в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Для адміністраторів K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Для адміністраторів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор хмари K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор гілки K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор проєкту K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Користувачі та ролі K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Права доступу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Налаштування інтерфейсу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Друковані форми K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Кастомізація звітів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Контроль і аудит K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Для програмістів ==&lt;br /&gt;
&lt;br /&gt;
[[Розгортання системи K2 ERP Python для розробників]]&lt;br /&gt;
&lt;br /&gt;
[[Архітектура K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Встановлення K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Розгортання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Створення модулів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[База даних K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[API K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Інтеграції K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 CMS]]&lt;br /&gt;
&lt;br /&gt;
[[Розробка веб-інтерфейсів K2]]&lt;br /&gt;
&lt;br /&gt;
[[Бізнес-процеси K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Права доступу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Рекомендації для розробників K2]]&lt;br /&gt;
&lt;br /&gt;
[[Класи та команди K2 ERP Python]]&lt;br /&gt;
&lt;br /&gt;
[[Стандарти UI K2 2025]]&lt;br /&gt;
&lt;br /&gt;
== Атестаційні завдання по K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Атестаційні завдання по K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== K2 ERP PHP ==&lt;br /&gt;
&lt;br /&gt;
[[Практична робота в K2 ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
[[Інструкція по розгортанню K2 ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
[[Класи та команди K2 Cloud ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
== Довідник та модулі системи K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
== Комплексні рішення K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP технологічна платформа]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Управлінський облік]]&lt;br /&gt;
&lt;br /&gt;
== Модулі K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 Ядро]]&lt;br /&gt;
&lt;br /&gt;
[[K2 CMS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Інтернет-магазин]]&lt;br /&gt;
&lt;br /&gt;
[[К2 CRM]]&lt;br /&gt;
&lt;br /&gt;
[[К2 WMS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 VDoc (Електронний документообіг)]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Система online-навчання]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Документообіг]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Дошка оголошень]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Портал творів мистецтва]]&lt;br /&gt;
&lt;br /&gt;
[[К2 ТОІР та облік запчастин]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Update]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Фінансовий облік]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Каса]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Ресторан]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Готель]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Зарплата та кадри]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Виробництво]]&lt;br /&gt;
&lt;br /&gt;
[[K2 multi-GAAP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 HelpDesk]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Мобільний додаток Android]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Мобільний додаток IOS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Стоматологічна клініка]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Салон краси]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Бронювання послуг]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Автоперевезення]]&lt;br /&gt;
&lt;br /&gt;
== Інтеграційні модулі K2 ERP ==&lt;br /&gt;
[[K2 Модуль Медок]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Вчасно]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Птах]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Мурашина логістика]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль GPS-трекінг]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Вчасно Каса]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Ringostat до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Нова пошта]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Укрпошта]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Телеграм бот до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Whatsapp бот до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Turbosms до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Email до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Hurma]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль обмінів з банками]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Horoshop]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Rozetka]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Prom]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Hotline]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль ДПС]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Приватбанк]]&lt;br /&gt;
&lt;br /&gt;
[[Модуль Edin]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Liqpay для інтернет-магазину]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Wayforpay для інтернет-магазину]]&lt;br /&gt;
&lt;br /&gt;
== Інструментальні модулі K2 ERP ==&lt;br /&gt;
[[K2 Конструктор структури бази даних]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Конструктор звітів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Конструктор BI звітів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Реплікатор]]&lt;br /&gt;
&lt;br /&gt;
[[IDE в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Десктопні додатки ==&lt;br /&gt;
[[K2 Cloud ERP: Десктопний додаток для Linux, Windows та macOS — швидка робота з хмарами без хаосу вкладок]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Desktop — коли потужність розробки перетворюється на зручний інструмент]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Cloud ERP Desktop: один додаток замість десятків вкладок, ярликів і “вічного пошуку потрібного вікна”]]&lt;br /&gt;
&lt;br /&gt;
== Торгове та перефірійне обладнання ==&lt;br /&gt;
[[РРО та ПРРО]]&lt;br /&gt;
&lt;br /&gt;
== Модулі на PHP ==&lt;br /&gt;
[[Mantis BT K2]]&lt;br /&gt;
&lt;br /&gt;
== Робота в K2 ==&lt;br /&gt;
[[Налаштування WireGuard]]&lt;br /&gt;
&lt;br /&gt;
[[Веб-Пошта]]&lt;br /&gt;
&lt;br /&gt;
== Навігація за категоріями ==&lt;br /&gt;
Усі статті бази знань автоматично групуються за категоріями:&lt;br /&gt;
&lt;br /&gt;
* [[:Категорія:ERP-системи|ERP-системи]]&lt;br /&gt;
* [[:Категорія:Програмне забезпечення, розроблене в Україні|Українське ПЗ]]&lt;br /&gt;
* [[:Категорія:Програмне забезпечення для бізнесу|ПЗ для бізнесу]]&lt;br /&gt;
&lt;br /&gt;
== Порівняння систем ==&lt;br /&gt;
&lt;br /&gt;
[[Чим K2 ERP краще за 1С/BAS, Парус/Афіна, Бітрікс, BIMP, A5 та інші ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs BAS ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs BAS Управління торгівлею (UT)]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Парус-Підприємство]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs SAP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Microsoft Dynamics 365]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Oracle NetSuite]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Odoo]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Scoro]]&lt;br /&gt;
&lt;br /&gt;
== Партнерство ==&lt;br /&gt;
[[Умови партнерства]]&lt;br /&gt;
&lt;br /&gt;
[[Партнери K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Кейси K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Кейс: як ми посилили ТОІР транспорту Нової пошти та цифровізували облік ремонтів і деталей для Kamag]]&lt;br /&gt;
&lt;br /&gt;
== Статті по IT ==&lt;br /&gt;
&lt;br /&gt;
[[Скільки реально коштують “дешеві” ліцензії Odoo, Microsoft Dynamics і SAP у порівнянні з K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Україна має виростити власні продуктові IT-компанії. Інакше за нас це зроблять чужі]]&lt;br /&gt;
&lt;br /&gt;
[[Смерть під ковдрою ілюзій: Чому перехід з 1С на BAS у 2026 році — це найдорожчий самообман українського бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[BAS маскувалась під український продукт. А тепер російський K2 Cloud може маскувати K2 під російський? Дивний маскарад брендів триває]]&lt;br /&gt;
&lt;br /&gt;
[[BAS нема чого запропонувати ринку, крім 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Давайте називати все своїми іменами: 1С, а не BAS. Говоріть завжди 1С, не йдіть на поводу ребрендіга 1С!]]&lt;br /&gt;
&lt;br /&gt;
[[Пастка SaaS-систем]]&lt;br /&gt;
&lt;br /&gt;
[[BAS стає токсичним — чому українському бізнесу час відмовитися від 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Росія виграє. 12:0 на користь росії]]&lt;br /&gt;
&lt;br /&gt;
[[BAS у вишиванці, або 1С, яка сходила на ребрендинг]]&lt;br /&gt;
&lt;br /&gt;
[[1С нагадує наші технології 20-річної давнини. Ба, це і є технології тих часів]]&lt;br /&gt;
&lt;br /&gt;
[[BAS — це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS та іншому ворожому софту — капут]]&lt;br /&gt;
&lt;br /&gt;
[[Еволюція веде до революції]]&lt;br /&gt;
&lt;br /&gt;
[[Чому українські ERP досі не витіснили 1С та BAS з ринку України за 12 років війни]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: 30 років російського запору в українському бізнесі]]&lt;br /&gt;
&lt;br /&gt;
[[Гібридний трактор Lamborghini і гібридна ERP K2: як українська технологія може змінити ринок автоматизації]]&lt;br /&gt;
&lt;br /&gt;
[[Як російські ERP-системи змінили прапор, але не змінили код]]&lt;br /&gt;
&lt;br /&gt;
[[Кому “заборонено” 1С та BAS?]]&lt;br /&gt;
&lt;br /&gt;
[[BASкетбол з санкціями: як “українська альтернатива 1С” закидає бізнесу рекламні трьохочкові]]&lt;br /&gt;
&lt;br /&gt;
[[BAS, BaaS, BAF — це нова етикетка для старого 1С. Час називати речі своїми іменами]]&lt;br /&gt;
&lt;br /&gt;
[[Як закалявся BAS, або як 1С фарбували на Великдень]]&lt;br /&gt;
&lt;br /&gt;
[[Життя після 1С та BAS: Великий огляд українського ринку ERP-систем та реальних альтернатив у 2026 році]]&lt;br /&gt;
&lt;br /&gt;
[[Відкритий похідний код, Open Source і K2 ERP: коли програмісти відкривають капот, але не віддають ключі від усього автопарку]]&lt;br /&gt;
&lt;br /&gt;
[[Цифрова деокупація та санкції в Україні]]&lt;br /&gt;
&lt;br /&gt;
[[Український бізнес і його токсичні стосунки з 1С/BAS: сміємося, платимо, страждаємо — і далі називаємо це “автоматизацією”]]&lt;br /&gt;
&lt;br /&gt;
[[1С більше не законодавець мод. Тепер тренди створюють українські ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Безкоштовна українська хмара для малого бізнесу: стартуйте сьогодні, зростайте без обмежень]]&lt;br /&gt;
&lt;br /&gt;
[[Не продавати доступ. Продавати свободу: чому майбутнє програмного забезпечення — за відкритими системами з чесною монетизацією]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: софт для країни, де держава не довіряє бізнесу. І саме тому він не потрібен країні, яка хоче бути вільною]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: система, в якій майбутнє давно натиснуло “Вийти без збереження”]]&lt;br /&gt;
&lt;br /&gt;
== Мови програмування, тренди ==&lt;br /&gt;
[[Світ у 2025: які мови «правлять балом»]]&lt;br /&gt;
&lt;br /&gt;
== Технічні завдання K2 ERP ==&lt;br /&gt;
[[Приклади технічного завдання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Приклади розрахунків]]&lt;br /&gt;
&lt;br /&gt;
== Акції K2 ERP ==&lt;br /&gt;
[[Ловіть шару: передпродажний модуль Бухгалтерії та податкового обліку зараз включає CRM, CMS та інтернет-магазин]]&lt;br /&gt;
&lt;br /&gt;
== Інвестиції в K2 ERP ==&lt;br /&gt;
[[Інвестиції в K2 ERP — українську платформу для заміни 1С/BAS та масової автоматизації бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Хто працює в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Використання K2 ERP ==&lt;br /&gt;
[[K2: платформа, після якої старий софт починає нервово шукати валізу]]&lt;br /&gt;
&lt;br /&gt;
[[Новий модуль K2 ERP для контролю звітності: коли сотні клієнтів, десятки дедлайнів і жодного права на ой, забули]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP як український Біткоїн]]&lt;br /&gt;
&lt;br /&gt;
[[Варіанти використання K2 ERP по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[ERP продукти]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP — українська ERP для виробництва, складу, торгівлі, ФОП, агро, логістики та заміни BAS ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Всі ERP терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі бізнес-процеси]]&lt;br /&gt;
&lt;br /&gt;
[[Всі інтеграції]]&lt;br /&gt;
&lt;br /&gt;
[[Всі українські сервіси]]&lt;br /&gt;
&lt;br /&gt;
[[Всі ERP модулі]]&lt;br /&gt;
&lt;br /&gt;
[[BAS / 1С / SAP / Odoo / Dynamics]]&lt;br /&gt;
&lt;br /&gt;
[[Всі 1С конфігурації]]&lt;br /&gt;
&lt;br /&gt;
[[Всі BAS конфігурації]]&lt;br /&gt;
&lt;br /&gt;
[[Всі 1С терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі BAS терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі отраслеві рішення 1С]]&lt;br /&gt;
&lt;br /&gt;
== CRM ==&lt;br /&gt;
[[Варіанти використання K2 ERP CRM по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[CRM продукти]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP CRM - універсальна CRM для виробництва, складу, торговлі, ФОП, інтернет-магазину та заміни Bitrix24, 1C CRM]]&lt;br /&gt;
&lt;br /&gt;
[[Всі терміни CRM]]&lt;br /&gt;
&lt;br /&gt;
== Інтернет-магази ==&lt;br /&gt;
[[Варіанти використання K2 ERP інтернет-магазин по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[Продукти інтернет-магазинів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP Інтернет-магазин - універсальний інтернет-магазин для заміни ShopScript та інших російських рішень]]&lt;br /&gt;
&lt;br /&gt;
[[Всі терміни інтернет-магазинів]]&lt;br /&gt;
&lt;br /&gt;
== Санкції та докази ==&lt;br /&gt;
[[Поглинути 1С, BAS та інший ворожий софт: чому перенесення залишків — це ще не справжня відмова]]&lt;br /&gt;
&lt;br /&gt;
[[Мені соромно за українські ЗМІ — чому медіа мають писати про український софт, K2 ERP та заміну 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Лавочка стала закриватись: 215 продуктів ворожого софту заборонено]]&lt;br /&gt;
&lt;br /&gt;
[[Український бізнес інвестує в російське, бо думає, що українське помре]]&lt;br /&gt;
&lt;br /&gt;
[[Схема мережі 1С, побудованої в Україні під виглядом BAS: коли “ми вже не 1С” звучить як “ми просто змінили табличку на дверях”]]&lt;br /&gt;
&lt;br /&gt;
[[Пертнери BAS - партнери росії]]&lt;br /&gt;
&lt;br /&gt;
[[Скільки грошей 1С намагається “збити” з українського бізнесу через листи щастя]]&lt;br /&gt;
&lt;br /&gt;
[[Не продовжуйте ІТС на BAS. Бо BAS — це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Вали російський бізнес, вали російський софт!]]&lt;br /&gt;
&lt;br /&gt;
[[Програмне забезпечення, яким можна замінити ворожий софт]]&lt;br /&gt;
&lt;br /&gt;
[[Докази, що BAS - це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Список компаній, що розповсюджують BAS, не дивлячись на санкції січня 2026]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр ворожого ПЗ і пов&#039;язаних назв]]&lt;br /&gt;
&lt;br /&gt;
[[Компанії, що почали переходити з ворожого софту]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр компаній, що досі працюють на ворожому софті]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр сервісів, що підтримують інтеграцію з ворожим софтом]]&lt;br /&gt;
&lt;br /&gt;
== Реформи ==&lt;br /&gt;
[[Реформи К2]]&lt;br /&gt;
&lt;br /&gt;
== Wikipedia ==&lt;br /&gt;
[[Різні статті]]&lt;br /&gt;
&lt;br /&gt;
== Книги ==&lt;br /&gt;
[[Архітектура 1С-підприємства]]&lt;br /&gt;
&lt;br /&gt;
[[Архітектура та розробка ERP-систем]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2762</id>
		<title>Регістри в K2 ERP</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2762"/>
		<updated>2026-07-17T19:40:20Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ТЗ. Підсистема регістрів K2 ERP}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= 1. Паспорт документа =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Атрибут !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Назва || Технічне завдання на розробку підсистеми «Регістри» платформи K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| Шифр || K2-ERP-TZ-REG-001&lt;br /&gt;
|-&lt;br /&gt;
| Версія || 1.2 (чернетка на узгодження; мова ядра — Python; +Додатки Д, Е)&lt;br /&gt;
|-&lt;br /&gt;
| Статус || На розгляді&lt;br /&gt;
|-&lt;br /&gt;
| Замовник || &#039;&#039;[підрозділ-замовник]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Виконавець || &#039;&#039;[команда платформи K2 ERP]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Тип документа || Технічне завдання (ГОСТ 34.602 адаптовано)&lt;br /&gt;
|-&lt;br /&gt;
| Аналог / прототип || Механізм регістрів платформи «1С:Підприємство 8.3»&lt;br /&gt;
|-&lt;br /&gt;
| Мова розробки || &#039;&#039;&#039;Python 3.12+&#039;&#039;&#039; (див. розділ 4.3)&lt;br /&gt;
|-&lt;br /&gt;
| Технологічний стек || SQLAlchemy Core 2.x, Pydantic v2, Alembic, lark, psycopg 3 / pyodbc&lt;br /&gt;
|-&lt;br /&gt;
| СКБД || PostgreSQL 14+ (основна), MS SQL Server 2019+ (додаткова)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 1.1. Необхідні розширення MediaWiki ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Розширення !! Теги / шаблони !! Використано в документі !! Постачання&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Extension:Diagrams&#039;&#039;&#039; || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graphviz&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;uml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || 4 діаграми GraphViz + 5 діаграм PlantUML || Composer: &amp;lt;code&amp;gt;samwilson/diagrams&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Extension:SyntaxHighlight || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || 64 блоки коду (Python, SQL, YAML, lark) || &#039;&#039;&#039;Входить до складу MediaWiki&#039;&#039;&#039; — окремо встановлювати не потрібно&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Template:Note&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Note|текст}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || Примітки та проєктні рішення || Створюється вручну (код нижче)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Налаштування ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// LocalSettings.php — конфігурація ВІКІ, у якій публікується це ТЗ.&lt;br /&gt;
// MediaWiki написана на PHP; до мови розробки K2 ERP (Python, розділ 4.3) це не стосується.&lt;br /&gt;
wfLoadExtension( &#039;Diagrams&#039; );&lt;br /&gt;
&lt;br /&gt;
// ОБОВ&#039;ЯЗКОВО. За замовчуванням Diagrams рендерить у PNG; ER-діаграми розділу 9&lt;br /&gt;
// містять десятки колонок і в растрі нечитабельні.&lt;br /&gt;
$wgDiagramsDefaultFormat = &#039;svg&#039;;&lt;br /&gt;
&lt;br /&gt;
// Варіант А — локальний рендеринг (потрібні бінарники на веб-сервері):&lt;br /&gt;
//   apt install graphviz plantuml&lt;br /&gt;
// Варіант Б — зовнішній сервіс рендерингу (з версії 0.4.0 — опційний):&lt;br /&gt;
// $wgDiagramsServiceUrl = &#039;https://diagrams.example.com/subdir&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаблон &amp;lt;code&amp;gt;Template:Note&amp;lt;/code&amp;gt;, якщо його немає у вікі:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #36c; background:#eaf3ff; padding:8px 12px; margin:8px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ⓘ&#039;&#039;&#039; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вимоги до версії ===&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Мінімальна версія — 1.0.0&#039;&#039;&#039; (реліз від 15.03.2026). Саме в ній додано &amp;lt;code&amp;gt;$wgDiagramsDefaultFormat&amp;lt;/code&amp;gt;, без якого документ рендериться в PNG і ER-діаграми розділу 9 стають нечитабельними. Автор супроводжує підняття мажорної версії до 1 формулюванням, що проєкт вийшов на стабільність.}}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Інфобокс на mediawiki.org станом на дату складання ТЗ застарілий&#039;&#039;&#039; — показує версію 0.10.0 (2022) і сумісність «MediaWiki ≤ 1.39», тоді як у репозиторії 27 релізів і остання — 1.0.0 від 15.03.2026. &#039;&#039;&#039;Джерело істини — GitHub&#039;&#039;&#039; (&amp;lt;nowiki&amp;gt;https://github.com/samwilson/diagrams-extension/releases&amp;lt;/nowiki&amp;gt;), а не інфобокс вікі-сторінки.}}&lt;br /&gt;
&lt;br /&gt;
=== Кодування: обов&#039;язкове налаштування ===&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Найчастіша поломка цього документа.&#039;&#039;&#039; Якщо кирилиця в діаграмах виводиться як &amp;lt;code&amp;gt;◆◆◆◆◆◆&amp;lt;/code&amp;gt; (U+FFFD), проблема &#039;&#039;&#039;не в шрифтах&#039;&#039;&#039;, а в кодуванні. Java до версії 18 бере &amp;lt;code&amp;gt;file.encoding&amp;lt;/code&amp;gt; з локалі процесу. Якщо веб-сервер працює з &amp;lt;code&amp;gt;LANG=C&amp;lt;/code&amp;gt; або без локалі, PlantUML читає вхід як US-ASCII, і &#039;&#039;&#039;кожен байт UTF-8 понад 127 перетворюється на окремий &amp;lt;code&amp;gt;&amp;amp;#65533;&amp;lt;/code&amp;gt;&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Як відрізнити дві різні проблеми:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Симптом !! Діагноз !! Що робити&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;#65533;&amp;amp;#65533;&amp;amp;#65533;&amp;amp;#65533;&amp;lt;/code&amp;gt; — ромби зі знаком питання (U+FFFD). Кількість символів &#039;&#039;&#039;більша&#039;&#039;&#039; за кількість літер оригіналу: 1 кирилична літера → 2 ромби, стрілка &amp;lt;code&amp;gt;→&amp;lt;/code&amp;gt; → 3 ромби || &#039;&#039;&#039;Кодування.&#039;&#039;&#039; Байти UTF-8 декодовані як ASCII/Latin-1 — по одному &amp;lt;code&amp;gt;&amp;amp;#65533;&amp;lt;/code&amp;gt; на байт || Розділ нижче, п. «Виправлення»&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;□□□□&amp;lt;/code&amp;gt; — порожні прямокутники (tofu). Кількість &#039;&#039;&#039;збігається&#039;&#039;&#039; з кількістю літер || &#039;&#039;&#039;Шрифти.&#039;&#039;&#039; Кодування правильне, але у шрифті немає гліфів кирилиці || &amp;lt;code&amp;gt;apt install fonts-dejavu fonts-liberation&amp;lt;/code&amp;gt;. У документі вже проставлено &amp;lt;code&amp;gt;skinparam defaultFontName &amp;quot;DejaVu Sans&amp;quot;&amp;lt;/code&amp;gt; і &amp;lt;code&amp;gt;fontname=&amp;quot;DejaVu Sans&amp;quot;&amp;lt;/code&amp;gt; для GraphViz&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ð¿ÑÐ¸Ð²ÑÑ&amp;lt;/code&amp;gt; — «мохібейк» із латиниці з діакритикою || Подвійне перекодування UTF-8 ↔ Latin-1 || Перевірити &amp;lt;code&amp;gt;$wgDiagramsServiceUrl&amp;lt;/code&amp;gt; — сервіс віддає не UTF-8&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Діагностика (на сервері вікі):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# 1. Що каже сам PlantUML про своє кодування&lt;br /&gt;
java -jar /usr/share/plantuml/plantuml.jar -version | grep -i &amp;quot;Default Encoding&amp;quot;&lt;br /&gt;
#   Default Encoding: UTF-8            &amp;lt;- норма&lt;br /&gt;
#   Default Encoding: ANSI_X3.4-1968   &amp;lt;- ЦЕ ПРИЧИНА (це US-ASCII)&lt;br /&gt;
#   Default Encoding: ISO-8859-1       &amp;lt;- ЦЕ ПРИЧИНА&lt;br /&gt;
&lt;br /&gt;
# 2. Локаль процесу веб-сервера (а не вашого shell — вони різні!)&lt;br /&gt;
sudo -u www-data env | grep -E &#039;LANG|LC_&#039;&lt;br /&gt;
#   порожньо або LANG=C / LANG=POSIX -&amp;gt; причина&lt;br /&gt;
&lt;br /&gt;
# 3. Відтворення поза MediaWiki — ізолює проблему від вікі&lt;br /&gt;
printf &#039;@startuml&lt;br /&gt;
A -&amp;gt; B : кирилиця та стрілка â&lt;br /&gt;
@enduml&lt;br /&gt;
&#039;   | java -jar /usr/share/plantuml/plantuml.jar -pipe -tsvg &amp;gt; /tmp/test.svg&lt;br /&gt;
grep -c &#039;кирилиця&#039; /tmp/test.svg      # 1 = добре; 0 = поламано&lt;br /&gt;
&lt;br /&gt;
# 4. Чи є шрифти з кирилицею&lt;br /&gt;
java -jar /usr/share/plantuml/plantuml.jar -printfonts | grep -i dejavu&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Виправлення&#039;&#039;&#039; (за спаданням надійності — досить одного, але п. 1–2 разом надійніші):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// LocalSettings.php&lt;br /&gt;
&lt;br /&gt;
// СПОСІБ 1 (рекомендований): задати кодування явно в команді PlantUML.&lt;br /&gt;
// $wgDiagramsLocalCommands перевизначає команди локального рендерингу.&lt;br /&gt;
$wgDiagramsLocalCommands = [&lt;br /&gt;
    &#039;plantuml&#039; =&amp;gt; &#039;/usr/bin/java -Dfile.encoding=UTF-8 &#039;&lt;br /&gt;
                . &#039;-jar /usr/share/plantuml/plantuml.jar -charset UTF-8&#039;,&lt;br /&gt;
];&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
# СПОСІБ 2: локаль процесу веб-сервера (systemd drop-in)&lt;br /&gt;
#   /etc/systemd/system/php8.2-fpm.service.d/locale.conf&lt;br /&gt;
[Service]&lt;br /&gt;
Environment=LANG=C.UTF-8&lt;br /&gt;
Environment=LC_ALL=C.UTF-8&lt;br /&gt;
#   далі: systemctl daemon-reload &amp;amp;&amp;amp; systemctl restart php8.2-fpm&lt;br /&gt;
&lt;br /&gt;
# СПОСІБ 3 (найчистіший): Java 18+.&lt;br /&gt;
# JEP 400 зробив UTF-8 кодуванням за замовчуванням незалежно від локалі ОС —&lt;br /&gt;
# проблема зникає структурно, без прапорців.&lt;br /&gt;
java -version&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Спосіб 3 усуває цілий клас проблем і не лише для PlantUML. Якщо на сервері вікі Java 17 або старіша — це найкраща інвестиція з трьох.}}&lt;br /&gt;
&lt;br /&gt;
=== Смоук-тест перед публікацією ===&lt;br /&gt;
&lt;br /&gt;
Прогнати на цільовій вікі — по одному представнику кожного типу:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Що перевіряємо !! Де в документі !! Ознака успіху&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &#039;&#039;&#039;Кодування кирилиці&#039;&#039;&#039; || 9.1 (підписи зв&#039;язків) || Читається «є регістром», а не &amp;lt;code&amp;gt;&amp;amp;#65533;&amp;amp;#65533;&amp;amp;#65533;&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Перевіряти першим&#039;&#039;&#039; — решта тестів без цього безглузді&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Гліфи кирилиці у шрифті || 5.1, 6.1 || Немає &amp;lt;code&amp;gt;□□□&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graphviz&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;rankdir&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shape=record&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;cylinder&amp;lt;/code&amp;gt; || 5.1, 6.1, 8.8, 9.5, Д.1, Д.8 || Діаграма рендериться, підписи не обрізані&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;uml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;@startuml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;entity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skinparam linetype ortho&amp;lt;/code&amp;gt; || 9.1–9.4 || ER-модель із колонками та позначками PK/FK&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;uml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;@startgantt&amp;lt;/code&amp;gt;&#039;&#039;&#039; || &#039;&#039;&#039;7.5.1&#039;&#039;&#039; || Діаграма Ганта. &#039;&#039;&#039;Головний ризик:&#039;&#039;&#039; якщо розширення обгортає вміст у &amp;lt;code&amp;gt;@startuml&amp;lt;/code&amp;gt; автоматично, &amp;lt;code&amp;gt;@startgantt&amp;lt;/code&amp;gt; не спрацює&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &amp;lt;code&amp;gt;$wgDiagramsDefaultFormat = &#039;svg&#039;&amp;lt;/code&amp;gt; || будь-яка || У HTML сторінки &amp;lt;code&amp;gt;&amp;amp;lt;img src=&amp;quot;…&amp;lt;b&amp;gt;.svg&amp;lt;/b&amp;gt;&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;.png&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 7 || GraphViz присутній для PlantUML || 9.1–9.4 || Немає повідомлення «Dot executable does not exist». PlantUML використовує dot для розкладки — &amp;lt;code&amp;gt;plantuml&amp;lt;/code&amp;gt; без &amp;lt;code&amp;gt;graphviz&amp;lt;/code&amp;gt; зрендерить лише sequence-діаграми (7.1), а ER-моделі — ні&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Щодо п. 5.&#039;&#039;&#039; Документ використовує явні роздільники &amp;lt;code&amp;gt;@startuml…@enduml&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;@startgantt…@endgantt&amp;lt;/code&amp;gt; всередині тегів. Це відповідає нормалізованій поведінці PlantUML: розробники вимагають &amp;lt;code&amp;gt;@startXYZ&amp;lt;/code&amp;gt; усюди, зокрема з прапорцем &amp;lt;code&amp;gt;-pipe&amp;lt;/code&amp;gt;, а можливість опускати роздільник збережена лише як застаріла опція для сумісності зі старими скриптами. Перевірити на живій вікі я не мав змоги — це єдине непідтверджене припущення розділу. Якщо &amp;lt;code&amp;gt;@startgantt&amp;lt;/code&amp;gt; не відрендериться, замінити діаграму 7.5.1 на &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graphviz&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; або повернути ASCII-схему з історії правок.}}&lt;br /&gt;
&lt;br /&gt;
=== Альтернативи та запасний варіант ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Варіант !! Оцінка&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Extension:Diagrams ≥ 1.0.0&#039;&#039;&#039; &#039;&#039;(обрано)&#039;&#039; || Одне розширення на всі формати документа; не зберігає рендери як файли вікі; є дві реалізації сервісу рендерингу — PHP (Symfony) та &#039;&#039;&#039;Python&#039;&#039;&#039; (остання узгоджується зі стеком проєкту, розділ 4.3).&lt;br /&gt;
|-&lt;br /&gt;
| Extension:GraphViz + Extension:PlantUML окремо || &#039;&#039;&#039;Не рекомендується.&#039;&#039;&#039; Extension:GraphViz за даними трекера Wikimedia не супроводжується й потребує правок для роботи з актуальними версіями MediaWiki. Два розширення замість одного.&lt;br /&gt;
|-&lt;br /&gt;
| Mermaid (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;mermaid&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; у складі Diagrams або Extension:Mermaid) || Рендериться на клієнті, не потребує бінарників на сервері. Але &amp;lt;code&amp;gt;erDiagram&amp;lt;/code&amp;gt; Mermaid суттєво менш виразний за &amp;lt;code&amp;gt;entity&amp;lt;/code&amp;gt; PlantUML: ER-моделі розділу 9 містять типи, ознаки PK/FK та коментарі до полів — це не переноситься без втрат. Придатний для простих схем (5.1, Д.1).&lt;br /&gt;
|-&lt;br /&gt;
| Без розширень || Блоки діаграм відображатимуться як вихідний текст. &#039;&#039;&#039;Документ втрачає 9 із 12 схем&#039;&#039;&#039; — на відміну від версій ≤ 1.2, ASCII-дублів більше немає (див. нижче).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Що навмисно залишено ASCII-схемами ===&lt;br /&gt;
&lt;br /&gt;
Після переходу на Diagrams дублювання «діаграма + ASCII» прибрано: воно розходилося при правках. Але 8 блоків &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; залишено свідомо — для них Diagrams не дає виграшу:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Розділ !! Блок !! Чому не діаграма&lt;br /&gt;
|-&lt;br /&gt;
| 6.8.1–6.8.3 || Макети конструктора || PlantUML має &amp;lt;code&amp;gt;@startsalt&amp;lt;/code&amp;gt; для wireframe&#039;ів, але ASCII тут &#039;&#039;&#039;комунікує краще&#039;&#039;&#039;: він явно читається як ескіз і не створює хибного враження затвердженого дизайну. Salt додає рендер-ризик без користі.&lt;br /&gt;
|-&lt;br /&gt;
| 7.4.1 || Timeline підсумків і ТА || Схема несе формулу («Залишок = Підсумок(P) + Σ рухів») поряд із віссю часу. Gantt це не передає, а &amp;lt;code&amp;gt;@startuml&amp;lt;/code&amp;gt; timing — надмірність.&lt;br /&gt;
|-&lt;br /&gt;
| Д.9 || Наскрізний розрахунок ЗП || Це покроковий наратив із числами, а не структура. Діаграма не додасть змісту.&lt;br /&gt;
|-&lt;br /&gt;
| Д.11, Е.8 || Чек-лист і дерево репозиторію || Список і файлове дерево. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — рівно те, що треба.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 2. Терміни, визначення та скорочення =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Термін !! Визначення&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Регістр&#039;&#039;&#039; || Об&#039;єкт метаданих, призначений для зберігання та накопичення структурованої облікової інформації у вигляді записів фіксованої структури, з механізмами агрегації, зрізів і транзакційного зв&#039;язку з документами-реєстраторами.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РВ&#039;&#039;&#039; || Регістр відомостей (аналог «Регистр сведений»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН&#039;&#039;&#039; || Регістр накопичення (аналог «Регистр накопления»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РБ&#039;&#039;&#039; || Регістр бухгалтерії (аналог «Регистр бухгалтерии»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РР&#039;&#039;&#039; || Регістр розрахунку (аналог «Регистр расчёта»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Вимірювання&#039;&#039;&#039; (Dimension) || Поле регістру, що визначає розріз аналітики; входить у ключ запису/підсумку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ресурс&#039;&#039;&#039; (Resource) || Поле регістру, значення якого підсумовується (для РН/РБ/РР) або зберігається як значення (для РВ).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реквізит&#039;&#039;&#039; (Attribute) || Довідкове поле запису, що не бере участі в ключі та не агрегується.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реєстратор&#039;&#039;&#039; (Recorder) || Документ, який породив набір записів регістру та володіє ним.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рухи&#039;&#039;&#039; (Movements) || Записи регістру, підпорядковані конкретному реєстратору.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Набір записів&#039;&#039;&#039; (RecordSet) || Прикладний об&#039;єкт для читання/запису групи записів регістру за заданим відбором.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Підсумки&#039;&#039;&#039; (Totals) || Попередньо розраховані агрегати (залишки/обороти), що зберігаються в окремих таблицях.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ТА&#039;&#039;&#039; || Точка актуальності підсумків — момент часу, до якого підсумки розраховані.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Зріз останніх&#039;&#039;&#039; (SliceLast) || Вибірка останніх за періодом записів РВ у розрізі кожної комбінації вимірювань.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Субконто&#039;&#039;&#039; (ExtDimension, ED) || Додатковий розріз аналітики бухгалтерського рахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ПВР&#039;&#039;&#039; || План видів розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витіснення&#039;&#039;&#039; || Механізм РР: запис із вищим пріоритетом скорочує фактичний період дії запису з нижчим.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (Recalculation) || Підпорядкований РР об&#039;єкт, що реєструє записи, які потребують повторного розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Віртуальна таблиця&#039;&#039;&#039; || Обчислювана таблиця в мові запитів, що не має фізичного відповідника (Залишки, Обороти, ЗрізОстанніх тощо).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 3. Призначення, цілі та підстава розробки =&lt;br /&gt;
&lt;br /&gt;
== 3.1. Підстава ==&lt;br /&gt;
Поточна модель K2 ERP не має уніфікованого декларативного механізму накопичувального обліку. Регістроподібні структури реалізуються &#039;&#039;ad hoc&#039;&#039; — окремими таблицями та процедурами під кожну прикладну задачу, що спричиняє:&lt;br /&gt;
* дублювання коду розрахунку залишків та оборотів;&lt;br /&gt;
* відсутність гарантованої узгодженості «документ ↔ рухи»;&lt;br /&gt;
* деградацію продуктивності на великих обсягах (повний перерахунок з початку обліку);&lt;br /&gt;
* високу вартість введення нової аналітики (зміна схеми БД + правка десятків процедур).&lt;br /&gt;
&lt;br /&gt;
== 3.2. Мета ==&lt;br /&gt;
Створити в K2 ERP підсистему &#039;&#039;&#039;декларативно описуваних регістрів&#039;&#039;&#039; чотирьох типів, функціонально еквівалентну механізму регістрів «1С:Підприємство 8.3», з автоматичною генерацією схеми БД, підтримкою підсумків, віртуальних таблиць у мові запитів і транзакційного проведення документів.&lt;br /&gt;
&lt;br /&gt;
== 3.3. Цілі проєкту (вимірювані) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Ціль !! Критерій досягнення&lt;br /&gt;
|-&lt;br /&gt;
| Ц1 || Декларативне визначення регістру || Новий регістр з 5 вимірюваннями та 3 ресурсами створюється в конструкторі без написання коду; DDL генерується автоматично.&lt;br /&gt;
|-&lt;br /&gt;
| Ц2 || Автоматична агрегація || Залишки/обороти доступні запитом без ручних процедур перерахунку.&lt;br /&gt;
|-&lt;br /&gt;
| Ц3 || Продуктивність || Отримання залишків на дату за таблицею 1 млрд рухів — ≤ 200 мс (P95) на еталонному стенді.&lt;br /&gt;
|-&lt;br /&gt;
| Ц4 || Цілісність || Неможливість існування рухів без активного реєстратора (100 % сценаріїв у тесті цілісності).&lt;br /&gt;
|-&lt;br /&gt;
| Ц5 || Міграція || Перенесення ≥ 90 % наявних «регістроподібних» структур K2 на новий механізм без втрати даних.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3.4. Що НЕ входить до обсягу (Out of scope) ==&lt;br /&gt;
* Механізм розподілених інформаційних баз / реплікації рухів (окреме ТЗ).&lt;br /&gt;
* Візуальний конструктор звітів поверх регістрів (окреме ТЗ, залежність).&lt;br /&gt;
* OLAP-куби та зовнішні аналітичні вітрини.&lt;br /&gt;
* Автоматичне перенесення прикладного коду замовника (тільки дані + мапінг).&lt;br /&gt;
&lt;br /&gt;
= 4. Припущення та обмеження щодо платформи K2 ERP =&lt;br /&gt;
&lt;br /&gt;
{{Note|Розділ фіксує припущення, які &#039;&#039;&#039;обов&#039;язково&#039;&#039;&#039; підлягають верифікації з архітектором платформи до затвердження ТЗ. Місця, що потребують уточнення, позначені як &#039;&#039;[уточнити]&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
== 4.1. Припущення щодо платформи ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Припущення !! Наслідок для ТЗ&lt;br /&gt;
|-&lt;br /&gt;
| П1 || K2 ERP має підсистему метаданих із власним репозиторієм об&#039;єктів (документи, довідники, перерахування) і механізмом версіонування конфігурації. || Регістр вбудовується як новий &#039;&#039;&#039;рід&#039;&#039;&#039; об&#039;єкта метаданих у наявний репозиторій (розділ 6).&lt;br /&gt;
|-&lt;br /&gt;
| П2 || Об&#039;єкти-документи мають унікальний ідентифікатор посилання (GUID/UUID) та проведення як окрему операцію. || Реєстратор адресується парою «код типу + UUID» (розділ 8.2).&lt;br /&gt;
|-&lt;br /&gt;
| П3 || Платформа має власну мову запитів або транслятор у SQL. || Віртуальні таблиці реалізуються на рівні транслятора (розділ 7.6). Якщо мови запитів немає — потрібен окремий етап Е0 (розділ 14).&lt;br /&gt;
|-&lt;br /&gt;
| П4 || Цільова СКБД підтримує &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;INSERT ... ON CONFLICT&amp;lt;/code&amp;gt;, віконні функції, часткові та покривні індекси. || Алгоритми підсумків (розділ 10) використовують ці можливості.&lt;br /&gt;
|-&lt;br /&gt;
| П5 || Прикладний код виконується на сервері застосунків із керованими транзакціями. || Проведення документа — одна транзакція БД (розділ 7.1).&lt;br /&gt;
|-&lt;br /&gt;
| П6 || Максимальна довжина ідентифікатора об&#039;єкта БД — 63 символи (PostgreSQL). || Фізичні імена таблиць будуються за сурогатним числовим кодом, а не за іменем регістру (розділ 8.1).&lt;br /&gt;
|-&lt;br /&gt;
| П7 || Ядро платформи розробляється на &#039;&#039;&#039;Python 3.12+&#039;&#039;&#039;; допускаються C-розширення (binary-драйвери) та, за потреби, власні нативні модулі. || Визначає стек (4.3) і архітектурні принципи АП-1…АП-6 (4.4). &#039;&#039;[верифікувати: greenfield чи є наявний Python-код K2]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| П8 || Прикладний (конфігураційний) код пишеться &#039;&#039;&#039;також на Python&#039;&#039;&#039; і виконується в тому самому процесі. || Породжує питання ізоляції та безпеки виконання довільного коду — &#039;&#039;&#039;відкрите питання В12&#039;&#039;&#039;. Якщо припущення хибне (потрібна вбудована мова) — обсяг Е1 зростає на ~2 чол.-міс.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4.2. Обмеження ==&lt;br /&gt;
&lt;br /&gt;
* О1. Зміна складу вимірювань/ресурсів існуючого регістру — операція реструктуризації з простоєм; онлайн-міграція не гарантується для таблиць &amp;gt; 100 млн записів.&lt;br /&gt;
* О2. Підсистема не гарантує коректність прикладної логіки проведення — лише цілісність механізму.&lt;br /&gt;
* О3. Мінімальна дискретність періоду — 1 секунда (тип &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt;) &#039;&#039;[уточнити: чи потрібна мілісекундна]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 4.3. Технологічний стек ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шар !! Технологія !! Обґрунтування вибору&lt;br /&gt;
|-&lt;br /&gt;
| Мова ядра || &#039;&#039;&#039;Python 3.12+&#039;&#039;&#039; (цільова 3.12; щодо 3.13 — див. В14) || Рішення замовника. Наслідки — розділ 4.4.&lt;br /&gt;
|-&lt;br /&gt;
| Статична типізація || &amp;lt;code&amp;gt;mypy --strict&amp;lt;/code&amp;gt; як gate у CI || Ядро метаданих у динамічній мові без статичної перевірки — неприйнятний ризик (Р11).&lt;br /&gt;
|-&lt;br /&gt;
| Опис і валідація метаданих || &#039;&#039;&#039;Pydantic v2&#039;&#039;&#039; || Маніфест регістру (розділ 6.7) стає типізованою моделлю: валідація, крос-полеві правила та JSON Schema для конструктора — «безкоштовно». Покриває ФТ-К-01. Приклад — Е.1.&lt;br /&gt;
|-&lt;br /&gt;
| Генерація DDL, абстракція діалектів СКБД || &#039;&#039;&#039;SQLAlchemy Core 2.x&#039;&#039;&#039; (&#039;&#039;без ORM&#039;&#039;) || Ключовий вибір. &amp;lt;code&amp;gt;MetaData&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Column&amp;lt;/code&amp;gt; — готова модель схеми; діалекти PostgreSQL і MS SQL із коробки. Прямо закриває НФВ-16, НФВ-17 і знижує ризик Р7. Приклад — Е.2.&lt;br /&gt;
|-&lt;br /&gt;
| Міграції / реструктуризація || &#039;&#039;&#039;Alembic&#039;&#039;&#039; || Автогенерація &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt; при зміні складу полів (Е10, НФВ-13, НФВ-15).&lt;br /&gt;
|-&lt;br /&gt;
| Драйвери || &#039;&#039;&#039;psycopg 3&#039;&#039;&#039; (binary, pipeline mode) або &amp;lt;code&amp;gt;asyncpg&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;pyodbc&amp;lt;/code&amp;gt; для MS SQL || Pipeline mode критичний для АП-1: пакетна вставка без round-trip на рядок.&lt;br /&gt;
|-&lt;br /&gt;
| Парсер мови запитів || &#039;&#039;&#039;lark&#039;&#039;&#039; (LALR) → AST → SQLAlchemy Core || Етап Е5. Дешевше за власний парсер; граматика декларативна. Ескіз — Е.4.&lt;br /&gt;
|-&lt;br /&gt;
| Гарячі шляхи || &#039;&#039;&#039;Cython&#039;&#039;&#039; / &amp;lt;code&amp;gt;mypyc&amp;lt;/code&amp;gt;; за потреби &#039;&#039;&#039;Rust&#039;&#039;&#039; (PyO3 + maturin) || Тільки за результатами бенчмарку (АП-3, Р10, В13).&lt;br /&gt;
|-&lt;br /&gt;
| Сервер застосунків || FastAPI + uvicorn; окремий пул процесів для проведення || —&lt;br /&gt;
|-&lt;br /&gt;
| Паралелізм || &#039;&#039;&#039;Процеси&#039;&#039;&#039; + &amp;lt;code&amp;gt;asyncio&amp;lt;/code&amp;gt; для IO. &#039;&#039;&#039;Потоки — ні&#039;&#039;&#039; (GIL) || Принцип АП-5.&lt;br /&gt;
|-&lt;br /&gt;
| Тестування || pytest, pytest-benchmark, &#039;&#039;&#039;hypothesis&#039;&#039;&#039; (property-based), testcontainers || Hypothesis обов&#039;язковий для витіснення (Р5): інтервальна арифметика — ідеальний кандидат на property-based тести.&lt;br /&gt;
|-&lt;br /&gt;
| Профілювання || py-spy, scalene, &amp;lt;code&amp;gt;EXPLAIN (ANALYZE, BUFFERS)&amp;lt;/code&amp;gt; || Етап Е11.&lt;br /&gt;
|-&lt;br /&gt;
| Збірка || uv, ruff, wheels із нативними розширеннями під усі цільові платформи || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Явні заборони:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;ORM SQLAlchemy не використовується.&#039;&#039;&#039; Регістри працюють наборами записів, а не об&#039;єктами; identity map і lazy loading тут шкідливі й провокують порушення АП-1. Використовується &#039;&#039;&#039;лише Core&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;PyPy не розглядається&#039;&#039;&#039; — несумісність із binary-драйверами та нативними розширеннями.&lt;br /&gt;
* &#039;&#039;&#039;Free-threaded build (PEP 703)&#039;&#039;&#039; — моніторити, але не закладати в архітектуру (В14).&lt;br /&gt;
&lt;br /&gt;
== 4.4. Наслідки вибору Python: архітектурні принципи ==&lt;br /&gt;
&lt;br /&gt;
Python на CPU-навантаженні повільніший за компільовані мови приблизно в 30–80 разів. Проєктована архітектура цьому &#039;&#039;&#039;не суперечить&#039;&#039;&#039;: основну роботу виконує СКБД, а ядро лише формує SQL. Але це вірно &#039;&#039;&#039;тільки за умови&#039;&#039;&#039; дотримання наведених принципів — їх порушення робить цілі НФВ недосяжними.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Принцип !! Формулювання&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-1&#039;&#039;&#039; || &#039;&#039;&#039;«Жодного рядка за раз»&#039;&#039;&#039; || &#039;&#039;&#039;Заборонено:&#039;&#039;&#039; цикл Python із запитом до БД усередині; вставка рухів по одному; читання підсумків по одному ключу. &#039;&#039;&#039;Обов&#039;язково:&#039;&#039;&#039; &amp;lt;code&amp;gt;executemany&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; / pipeline, set-based &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;, один запит на набір записів. Детектор порушень — Е.7.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-2&#039;&#039;&#039; || &#039;&#039;&#039;Ядро — оркестратор, СКБД — обчислювач&#039;&#039;&#039; || Python формує SQL і передає керування. Агрегація, з&#039;єднання, сортування — в СКБД. Виняток — гарячі шляхи АП-4, де це неможливо.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-3&#039;&#039;&#039; || &#039;&#039;&#039;Гарячі шляхи ізольовані за інтерфейсом&#039;&#039;&#039; || Кожен кандидат на нативне переписування реалізується за &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt;-інтерфейсом з еталонною Python-реалізацією та бенчмарком у CI. Заміна на Cython/Rust не змінює виклик. Приклад — Е.5.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-4&#039;&#039;&#039; || &#039;&#039;&#039;Бюджет Python-часу зафіксовано&#039;&#039;&#039; || Див. 4.4.1. Перевищення бюджету — блокер приймання етапу.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-5&#039;&#039;&#039; || &#039;&#039;&#039;Паралелізм — процесами&#039;&#039;&#039; || GIL робить потоки марними для CPU-роботи. Проведення IO-bound → &amp;lt;code&amp;gt;asyncio&amp;lt;/code&amp;gt;; масштабування — пулом процесів за кількістю ядер.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-6&#039;&#039;&#039; || &#039;&#039;&#039;Типізація на межах&#039;&#039;&#039; || &amp;lt;code&amp;gt;mypy --strict&amp;lt;/code&amp;gt; на ядрі; Pydantic v2 на всіх межах. Динамічний доступ до полів регістру компенсується генерацією &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів (ФТ-К-07, Е.6).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4.1. Бюджет Python-часу на гарячих шляхах (АП-4) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шлях !! Розділ !! Обсяг операцій !! Оцінка Python !! Ризик !! Мітигація&lt;br /&gt;
|-&lt;br /&gt;
| Формування рухів документа (100 рядків × 5 регістрів) || 7.1, Д.8 || ~500 конструювань об&#039;єктів || 2–5 мс || Низький || —&lt;br /&gt;
|-&lt;br /&gt;
| Серіалізація рухів у пакетну вставку || 7.1 || ~500 кортежів || 1–3 мс || Низький || psycopg 3 pipeline / &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Оновлення підсумків || 10.2 || 1 SQL &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt; на регістр || ≈ 0 мс || Низький || set-based (Е.3)&lt;br /&gt;
|-&lt;br /&gt;
| Трансляція віртуальної таблиці || 7.3, 10.3 || парсинг + побудова AST || 1–10 мс || Середній || LRU-кеш скомпільованих запитів за хешем (текст + сигнатура параметрів)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витіснення періодів дії&#039;&#039;&#039; || 10.4 || O(\|Z\|²) на ключ; 10 тис. ключів × ~10 записів ≈ 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; інтервальних операцій || &#039;&#039;&#039;1–3 с&#039;&#039;&#039; || &#039;&#039;&#039;Високий&#039;&#039;&#039; || Sweep-line O(n log n); ізоляція за АП-3; кандидат №1 на Cython/Rust; альтернатива — перенести в SQL на &amp;lt;code&amp;gt;daterange&amp;lt;/code&amp;gt; + GiST (PostgreSQL)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Розрахунок ЗП&#039;&#039;&#039; || Д.9 || 80 тис. записів × формула || &#039;&#039;&#039;4–15 с&#039;&#039;&#039; || &#039;&#039;&#039;Високий&#039;&#039;&#039; || Заборона per-record запитів (АП-1); векторизація; кандидат №2 на нативний код&lt;br /&gt;
|-&lt;br /&gt;
| Реєстрація перерахунків || 10.5 || 1 SQL &amp;lt;code&amp;gt;INSERT … SELECT&amp;lt;/code&amp;gt; || ≈ 0 мс || Низький || set-based&lt;br /&gt;
|-&lt;br /&gt;
| Генерація DDL, реструктуризація || 8, Е.2 || холодний шлях, разова операція || — || Низький || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4.2. Висновок щодо НФВ ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! НФВ !! Ціль !! Частка Python !! Вердикт&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01…03 (залишки, обороти) || 200 мс – 2 с || &amp;lt; 1 % (робота в СКБД) || &#039;&#039;&#039;Не залежить від мови ядра&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-04 (проведення 100 рядків) || 300 мс || 5–15 мс ≈ &#039;&#039;&#039;5 %&#039;&#039;&#039; || Досяжно за дотримання АП-1&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-05 (ОСВ) || 5 с || &amp;lt; 1 % || Не залежить від мови ядра&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-06 (ЗП на 10 тис. осіб) || 10 хв || 4–15 с ≈ &#039;&#039;&#039;2,5 %&#039;&#039;&#039; || Досяжно; &#039;&#039;&#039;запас ×40&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-07 (зріз останніх) || 500 мс || &amp;lt; 1 % || Не залежить від мови ядра&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-08 (50 док/с) || — || 50 × 10 мс = 0,5 с CPU/с ≈ &#039;&#039;&#039;50 % одного ядра&#039;&#039;&#039; || Досяжно; пул процесів (АП-5)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-09 (перерахунок підсумків) || 4 год || &amp;lt; 1 % || Не залежить від мови ядра&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумок:&#039;&#039;&#039; цілі НФВ &#039;&#039;&#039;не переглядаються&#039;&#039;&#039; у зв&#039;язку з вибором Python. Натомість вводиться жорстка вимога АП-1 — її порушення робить цілі недосяжними на &#039;&#039;будь-якій&#039;&#039; мові, просто на Python розплата настає на порядок раніше й помітніше.&lt;br /&gt;
&lt;br /&gt;
= 5. Класифікація регістрів =&lt;br /&gt;
&lt;br /&gt;
== 5.1. Дерево типів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Registers {&lt;br /&gt;
  rankdir=TB;&lt;br /&gt;
  bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fillcolor=&amp;quot;#f5f5f5&amp;quot;, fontname=&amp;quot;DejaVu Sans&amp;quot;, fontsize=10];&lt;br /&gt;
  edge [fontname=&amp;quot;DejaVu Sans&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  R [label=&amp;quot;РЕГІСТР\n(абстрактний об&#039;єкт метаданих)&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI [label=&amp;quot;Регістр відомостей\n(РВ / Information)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA [label=&amp;quot;Регістр накопичення\n(РН / Accumulation)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RB [label=&amp;quot;Регістр бухгалтерії\n(РБ / Accounting)&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RC [label=&amp;quot;Регістр розрахунку\n(РР / Calculation)&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  R -&amp;gt; RI; R -&amp;gt; RA; R -&amp;gt; RB; R -&amp;gt; RC;&lt;br /&gt;
&lt;br /&gt;
  RI_np [label=&amp;quot;Неперіодичний&amp;quot;];&lt;br /&gt;
  RI_p  [label=&amp;quot;Періодичний&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_np; RI -&amp;gt; RI_p;&lt;br /&gt;
&lt;br /&gt;
  RI_i [label=&amp;quot;Незалежний\n(режим запису)&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI_s [label=&amp;quot;Підпорядкований\nреєстратору&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_i [style=dashed]; RI -&amp;gt; RI_s [style=dashed];&lt;br /&gt;
&lt;br /&gt;
  RA_b [label=&amp;quot;Вид: Залишки\n(Balance)&amp;quot;];&lt;br /&gt;
  RA_t [label=&amp;quot;Вид: Обороти\n(Turnover)&amp;quot;];&lt;br /&gt;
  RA -&amp;gt; RA_b; RA -&amp;gt; RA_t;&lt;br /&gt;
&lt;br /&gt;
  RB_c [label=&amp;quot;З кореспонденцією\n(подвійний запис)&amp;quot;];&lt;br /&gt;
  RB_n [label=&amp;quot;Без кореспонденції\n(уніграфічний)&amp;quot;];&lt;br /&gt;
  RB -&amp;gt; RB_c; RB -&amp;gt; RB_n;&lt;br /&gt;
&lt;br /&gt;
  RC_a [label=&amp;quot;З періодом дії\n(+ витіснення)&amp;quot;];&lt;br /&gt;
  RC_b [label=&amp;quot;З базовим періодом\n(+ база розрахунку)&amp;quot;];&lt;br /&gt;
  RC_g [label=&amp;quot;З графіком часу&amp;quot;];&lt;br /&gt;
  RC -&amp;gt; RC_a; RC -&amp;gt; RC_b; RC -&amp;gt; RC_g;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5.2. Порівняльна матриця типів ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Характеристика !! РВ !! РН (Залишки) !! РН (Обороти) !! РБ !! РР&lt;br /&gt;
|-&lt;br /&gt;
| Ключ запису || Вимірювання (+Період) або Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№&lt;br /&gt;
|-&lt;br /&gt;
| Незалежний запис || &#039;&#039;&#039;Так&#039;&#039;&#039; || Ні || Ні || Ні || Ні&lt;br /&gt;
|-&lt;br /&gt;
| Періодичність || Опційна || Обов&#039;язкова (Період) || Обов&#039;язкова || Обов&#039;язкова || Обов&#039;язкова&lt;br /&gt;
|-&lt;br /&gt;
| Ресурси підсумовуються || Ні || Так (±) || Так (+) || Так (Дт/Кт) || Так&lt;br /&gt;
|-&lt;br /&gt;
| Вид руху (Прихід/Витрата) || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || Дт/Кт || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця залишків || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця оборотів || — || Так (опц.) || &#039;&#039;&#039;Так&#039;&#039;&#039; || Так || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із планом рахунків || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із ПВР || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Період дії / витіснення || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Базовий період || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Графік часу || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Субконто || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерахунки || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Типові приклади || Курси валют, ціни, кадрова історія, графік роботи || Товари на складах, взаєморозрахунки || Продажі, витрати за статтями || Госпрозрахунковий, управлінський, податковий облік || Нарахування ЗП, утримання&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 6. Метамодель: як регістр задається =&lt;br /&gt;
&lt;br /&gt;
== 6.1. Місце в репозиторії метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph ConfigTree {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;; ranksep=0.35; nodesep=0.12;&lt;br /&gt;
  node [shape=box, style=&amp;quot;filled,rounded&amp;quot;, fontname=&amp;quot;DejaVu Sans&amp;quot;, fontsize=9, height=0.28];&lt;br /&gt;
  edge [arrowhead=none, color=&amp;quot;#9e9e9e&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  CFG [label=&amp;quot;Конфігурація K2 ERP&amp;quot;, fillcolor=&amp;quot;#cfd8dc&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  C1 [label=&amp;quot;Довідники&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  C2 [label=&amp;quot;Документи&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  C3 [label=&amp;quot;Плани рахунків&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  C4 [label=&amp;quot;Плани видів характеристик&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  C5 [label=&amp;quot;Плани видів розрахунку&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  REG [label=&amp;quot;РЕГІСТРИ&amp;quot;, fillcolor=&amp;quot;#1976d2&amp;quot;, fontcolor=&amp;quot;white&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  CFG -&amp;gt; C1; CFG -&amp;gt; C2; CFG -&amp;gt; C3; CFG -&amp;gt; C4; CFG -&amp;gt; C5; CFG -&amp;gt; REG [penwidth=2, color=&amp;quot;#1976d2&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI [label=&amp;quot;Регістри відомостей&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA [label=&amp;quot;Регістри накопичення&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RB [label=&amp;quot;Регістри бухгалтерії&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RC [label=&amp;quot;Регістри розрахунку&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
  REG -&amp;gt; RI; REG -&amp;gt; RA; REG -&amp;gt; RB; REG -&amp;gt; RC;&lt;br /&gt;
&lt;br /&gt;
  RI1 [label=&amp;quot;КурсиВалют&amp;quot;, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI1;&lt;br /&gt;
  RI1d [label=&amp;quot;Вимірювання: Валюта&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RI1r [label=&amp;quot;Ресурси: Курс, Кратність&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RI1 -&amp;gt; RI1d; RI1 -&amp;gt; RI1r;&lt;br /&gt;
&lt;br /&gt;
  RA1 [label=&amp;quot;ТовариНаСкладах&amp;quot;, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RA -&amp;gt; RA1;&lt;br /&gt;
  RA1d [label=&amp;quot;Вимірювання:\lНоменклатура\lСклад\lПартія\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RA1r [label=&amp;quot;Ресурси: Кількість, Сума&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RA1a [label=&amp;quot;Реквізити: Коментар&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RA1x [label=&amp;quot;Реєстратори:\lПрихіднаНакладна\lВидатковаНакладна\l…\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RA1 -&amp;gt; RA1d; RA1 -&amp;gt; RA1r; RA1 -&amp;gt; RA1a; RA1 -&amp;gt; RA1x;&lt;br /&gt;
&lt;br /&gt;
  RB1 [label=&amp;quot;Госпрозрахунковий&amp;quot;, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RB -&amp;gt; RB1;&lt;br /&gt;
  RB1d [label=&amp;quot;Вимірювання:\lОрганізація (баланс.)\lПідрозділ (небаланс.)\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RB1r [label=&amp;quot;Ресурси:\lСума (баланс.)\lКількість\lВалютнаСума\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RB1 -&amp;gt; RB1d; RB1 -&amp;gt; RB1r;&lt;br /&gt;
  RB1 -&amp;gt; C3 [style=dotted, color=&amp;quot;#c2185b&amp;quot;, arrowhead=vee, label=&amp;quot;ПланРахунків&amp;quot;, fontsize=7];&lt;br /&gt;
&lt;br /&gt;
  RC1 [label=&amp;quot;Нарахування&amp;quot;, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RC -&amp;gt; RC1;&lt;br /&gt;
  RC1d [label=&amp;quot;Вимірювання:\lСпівробітник (базове)\lПідрозділ\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RC1r [label=&amp;quot;Ресурси:\lРезультат\lВідпрацьованоДнів\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RC1p [label=&amp;quot;Перерахунки:\lПерерахунокЗаБазою\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RC1 -&amp;gt; RC1d; RC1 -&amp;gt; RC1r; RC1 -&amp;gt; RC1p;&lt;br /&gt;
  RC1 -&amp;gt; C5 [style=dotted, color=&amp;quot;#5e35b1&amp;quot;, arrowhead=vee, label=&amp;quot;ПВР&amp;quot;, fontsize=7];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6.2. Загальні властивості будь-якого регістру ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Тип !! Обов&#039;язк. !! Опис / допустимі значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt; || Ідентифікатор || Так || Унікальне в межах роду. Латиниця/кирилиця, ≤ 80 симв., без пробілів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Рядок || Ні || Подання для користувача.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Коментар&amp;lt;/code&amp;gt; || Текст || Ні || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Відомостей&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Накопичення&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Бухгалтерії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Розрахунку&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Незмінна після створення.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Незалежний&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;. Для РН/РБ/РР — примусово &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Неперіодичний&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахСекунди&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахДня&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахМісяця&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахКварталу&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахРоку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратори&amp;lt;/code&amp;gt; || Список посилань на типи документів || Умовно || Обов&#039;язково для РН/РБ/РР та підпорядкованого РВ. Порожній список = регістр непридатний до запису.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БлокуванняДаних&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Автоматичне&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt; (за замовчуванням &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВключатиДоЗвітів&amp;lt;/code&amp;gt; || Булево || Ні || Показувати в універсальному конструкторі звітів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПравоДоступуЗаЗамовчуванням&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Заборонено&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиРLS&amp;lt;/code&amp;gt; || Булево || Ні || Row-level security (розділ 7.9).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Партиціонування&amp;lt;/code&amp;gt; || Структура || Ні || &amp;lt;code&amp;gt;Немає&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодом(RANGE, крок)&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаВимірюванням(HASH, n)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.3. Поля регістру ==&lt;br /&gt;
&lt;br /&gt;
Кожне поле має:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Ідентифікація.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Роль&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Ресурс&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Реквізит&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Тип&amp;lt;/code&amp;gt; || Примітивний (&amp;lt;code&amp;gt;Число(p,s)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Рядок(n)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Булево&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;УНІ&amp;lt;/code&amp;gt;), посилальний (&amp;lt;code&amp;gt;Довідник.X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Документ.Y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перерахування.Z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланРахунків.A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланВидівХарактеристик.B&amp;lt;/code&amp;gt;) або &#039;&#039;&#039;складений&#039;&#039;&#039; (список типів).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Не індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ІндексуватиЗДодаткомВимірювань&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ведуче&amp;lt;/code&amp;gt; (Master) || Тільки для вимірювань. Якщо &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; — записи регістру видаляються разом з об&#039;єктом, на який посилається вимірювання; регістр показується у формі цього об&#039;єкта.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || Брати участь у стандартному відборі форми списку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗаборонитиНезаповненіЗначення&amp;lt;/code&amp;gt; || Валідація на запис.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Специфічні прапорці полів по типах регістрів:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Прапорець !! Застосовний до !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Балансовий&amp;lt;/code&amp;gt; || Ресурс/Вимірювання РБ || Ресурс бере участь у контролі рівності Дт=Кт; має єдине значення на запис (а не пару Дт/Кт). Вимірювання балансове — однакове для Дт і Кт.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Облік&amp;lt;/code&amp;gt; (AccountingFlag) || Ресурс РБ || Посилання на ознаку обліку рахунка з ПР; ресурс заповнюється, лише якщо ознака встановлена.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОблікСубконто&amp;lt;/code&amp;gt; || Ресурс РБ || Посилання на ознаку обліку субконто (напр. кількісний облік у розрізі субконто).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Базове&amp;lt;/code&amp;gt; (BaseDimension) || Вимірювання РР || Використовується для зіставлення записів під час отримання бази розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиПоточніЗначення&amp;lt;/code&amp;gt; || Ресурс/Реквізит РР || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.4. Специфічні властивості за типами ==&lt;br /&gt;
&lt;br /&gt;
=== 6.4.1. Регістр відомостей ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Неперіодичний … ПоПозиціїРеєстратора || Визначає наявність поля &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; і його гранулярність.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Незалежний / ПідпорядкованийРеєстратору || У незалежному ключ = (Період) + Вимірювання.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумки&amp;lt;/code&amp;gt; || — || У РВ підсумків немає; замість них — зрізи.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ключ унікальності:&#039;&#039;&#039;&lt;br /&gt;
* Незалежний неперіодичний: &amp;lt;code&amp;gt;UNIQUE(Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Незалежний періодичний: &amp;lt;code&amp;gt;UNIQUE(Період, Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Підпорядкований: &amp;lt;code&amp;gt;PK(Реєстратор, НомерРядка)&amp;lt;/code&amp;gt;, унікальність за вимірюваннями &#039;&#039;&#039;не&#039;&#039;&#039; контролюється.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.2. Регістр накопичення ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиЗалишків&amp;lt;/code&amp;gt; || Булево (тільки для виду «Залишки»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиОборотів&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодичністьПідсумківОборотів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt; (тільки для виду «Обороти»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || Список визначень агрегатів (тільки для виду «Обороти»), див. 7.4.4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимАгрегатів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 6.4.3. Регістр бухгалтерії ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланРахунків&amp;lt;/code&amp;gt; || Посилання на об&#039;єкт «План рахунків» || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039; Незмінне після створення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Кореспонденція&amp;lt;/code&amp;gt; || Булево || &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; → подвійний запис (поля &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt;); &amp;lt;code&amp;gt;Хиба&amp;lt;/code&amp;gt; → уніграфічний (&amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || Число (успадковується з ПР) || Ліміт платформи: 5 &#039;&#039;[узгодити; 1С — 3 за замовчуванням, до 5]&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пов&#039;язаний об&#039;єкт &#039;&#039;&#039;План рахунків&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* ієрархію рахунків, &amp;lt;code&amp;gt;Код&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Найменування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вид&amp;lt;/code&amp;gt; (Активний/Пасивний/Активно-пасивний);&lt;br /&gt;
* &amp;lt;code&amp;gt;Забалансовий&amp;lt;/code&amp;gt; (булево);&lt;br /&gt;
* &amp;lt;code&amp;gt;Ознаки обліку&amp;lt;/code&amp;gt; (набір булевих реквізитів, напр. «Кількісний», «Валютний»);&lt;br /&gt;
* табличну частину &amp;lt;code&amp;gt;ВидиСубконто&amp;lt;/code&amp;gt; (ВидСубконто → ПВХ, &#039;&#039;Тільки обороти&#039;&#039;, &#039;&#039;Підсумкова сума&#039;&#039;, ознаки обліку субконто);&lt;br /&gt;
* &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.4. Регістр розрахунку ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || Посилання || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Квартал&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Рік&amp;lt;/code&amp;gt; || Період реєстрації.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; || Булево || Вмикає поля &amp;lt;code&amp;gt;ПеріодДіїПочаток/Кінець&amp;lt;/code&amp;gt;, фактичні періоди дії та витіснення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріод&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;БезБазовогоПеріоду&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; || Режим отримання бази.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Графік&amp;lt;/code&amp;gt; || Посилання на РВ || Регістр-графік часу.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗначенняГрафіка&amp;lt;/code&amp;gt; || Ресурс регістру-графіка || Напр. «Значення» (1/0 — робочий день) або «Годин».&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДатаГрафіка&amp;lt;/code&amp;gt; || Вимірювання регістру-графіка типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Перерахунки&amp;lt;/code&amp;gt; || Список підпорядкованих об&#039;єктів «Перерахунок» || Див. 7.5.3.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Об&#039;єкт &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (підпорядкований РР):&lt;br /&gt;
* &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; — список, кожне зіставляється з вимірюванням основного РР (&amp;lt;code&amp;gt;ВимірюванняРегістру&amp;lt;/code&amp;gt;);&lt;br /&gt;
* правило: перерахунок реєструє «об&#039;єкт перерахунку» = (Реєстратор, ВидРозрахунку, Вимірювання…).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* &amp;lt;code&amp;gt;ВикористовуєПеріодДії&amp;lt;/code&amp;gt;;&lt;br /&gt;
* табличні частини &amp;lt;code&amp;gt;БазовіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВитісняючіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВедучіВидиРозрахунку&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;НеЗалежить&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 6.5. Стандартні реквізити (генеруються автоматично) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Реквізит !! РВ !! РН !! РБ !! РР !! Тип&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; || якщо періодичний || + || + || + (період реєстрації) || Дата/час&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Складене посилання (ДокументПосилання)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;НомерРядка&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Число(9,0)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Активність&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || — || тільки «Залишки» || — || — || Перелік {Прихід, Витрата}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt; || — || — || + (з кореспонденцією) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРухуРахунку&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || Перелік {Дебет, Кредит}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; (колекція) || — || — || + || — || Відповідність(ВидСубконто→Значення)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРозрахунку&amp;lt;/code&amp;gt; || — || — || — || + || ПВРПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДіїПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПеріодДіїКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо ПеріодДії) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріодПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;БазовийПеріодКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо БазовийПеріод) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Сторно&amp;lt;/code&amp;gt; || — || — || — || + || Булево&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.6. Кількісні обмеження метамоделі ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Ліміт !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| Кількість вимірювань || 20 || Понад 8 — попередження конструктора (деградація підсумків)&lt;br /&gt;
|-&lt;br /&gt;
| Кількість ресурсів || 20 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реквізитів || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість типів у складеному типі поля || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реєстраторів || Не обмежено ||&lt;br /&gt;
|-&lt;br /&gt;
| Максимум субконто на рахунок || 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| Довжина ключа підсумків || ≤ 900 байт (обмеження індексу MS SQL) || Валідація в конструкторі&lt;br /&gt;
|-&lt;br /&gt;
| Глибина періодичності підсумків || День / Місяць || Тиждень/Квартал — не підтримуються (обчислюються згортанням)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.7. Декларативний опис (DSL) ==&lt;br /&gt;
&lt;br /&gt;
Регістр зберігається в репозиторії у вигляді XML/YAML-маніфесту. Приклад:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр накопичення (вид: Залишки) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: ТовариНаСкладах&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  synonym: &amp;quot;Товари на складах&amp;quot;&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  writeMode: SubordinateToRecorder&lt;br /&gt;
  enableBalanceTotals: true&lt;br /&gt;
  enableTurnoverTotals: true&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура, type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true,  index: true }&lt;br /&gt;
    - { name: Склад,        type: &amp;quot;Довідник.Склади&amp;quot;,       master: true,  index: true }&lt;br /&gt;
    - { name: Партія,       type: [&amp;quot;Документ.ПрихіднаНакладна&amp;quot;, &amp;quot;Документ.ВведенняЗалишків&amp;quot;], index: false }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;ПланВидівХарактеристик.Характеристики&amp;quot;, nullable: true }&lt;br /&gt;
&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість, type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
    - { name: Сума,      type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Коментар, type: &amp;quot;Рядок(200)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ПрихіднаНакладна&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ПереміщенняТоварів&lt;br /&gt;
    - Документ.Інвентаризація&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр відомостей (періодичний, незалежний) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: КурсиВалют&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot;, master: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Курс,     type: &amp;quot;Число(15,4)&amp;quot; }&lt;br /&gt;
    - { name: Кратність, type: &amp;quot;Число(10,0)&amp;quot;, default: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр бухгалтерії ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Госпрозрахунковий&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Госпрозрахунковий&lt;br /&gt;
  correspondence: true&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Підрозділ,   type: &amp;quot;Довідник.Підрозділи&amp;quot;,  balance: false }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,       type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Кількість,  type: &amp;quot;Число(15,3)&amp;quot;, balance: false, accountingFlag: Кількісний }&lt;br /&gt;
    - { name: ВалютнаСума, type: &amp;quot;Число(15,2)&amp;quot;, balance: false, accountingFlag: Валютний }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Зміст, type: &amp;quot;Рядок(255)&amp;quot; }&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot; }&lt;br /&gt;
  recorders: [Документ.БухгалтерськаОперація, Документ.ПрихіднаНакладна]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр розрахунку ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Нарахування&lt;br /&gt;
  kind: Calculation&lt;br /&gt;
  calculationTypesPlan: ПланВидівРозрахунку.ОсновніНарахування&lt;br /&gt;
  periodicity: Month&lt;br /&gt;
  actionPeriod: true&lt;br /&gt;
  basePeriod: ByActionPeriod&lt;br /&gt;
  schedule:&lt;br /&gt;
    register: РегістрВідомостей.ГрафікРоботи&lt;br /&gt;
    valueResource: Значення&lt;br /&gt;
    dateDimension: ДатаГрафіка&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, baseDimension: true, master: true }&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Результат,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: ВідпрацьованоДнів, type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
    - { name: НормаДнів,        type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
  recalculations:&lt;br /&gt;
    - name: ПерерахунокЗаБазою&lt;br /&gt;
      dimensions:&lt;br /&gt;
        - { name: Співробітник, registerDimension: Співробітник }&lt;br /&gt;
  recorders: [Документ.НарахуванняЗарплати]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Розширений каталог із 17 прикладів регістрів усіх типів і підвидів — з деклараціями, даними у фізичних таблицях, запитами, наскрізними сценаріями та антипатернами — див. &#039;&#039;&#039;Додаток Д&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
== 6.8. UI конструктора метаданих ==&lt;br /&gt;
&lt;br /&gt;
=== 6.8.1. Загальний макет ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Конфігуратор K2 ERP ─────────────────────────────────────────────────────────┐&lt;br /&gt;
│ Файл  Правка  Конфігурація  Адміністрування  Сервіс  Довідка                  │&lt;br /&gt;
├──────────────────────┬────────────────────────────────────────────────────────┤&lt;br /&gt;
│ Дерево конфігурації  │  Регістр накопичення: ТовариНаСкладах                  │&lt;br /&gt;
│                      │  ┌──────┬─────────┬──────────┬──────────┬───────────┐  │&lt;br /&gt;
│ ▾ Регістри           │  │Основ.│Дані     │Реєстратор│Форми     │Права      │  │&lt;br /&gt;
│   ▸ відомостей       │  └──────┴─────────┴──────────┴──────────┴───────────┘  │&lt;br /&gt;
│   ▾ накопичення      │                                                        │&lt;br /&gt;
│     ▾ ТовариНаСклад. │  Ім&#039;я           [ТовариНаСкладах.............]         │&lt;br /&gt;
│       ▾ Вимірювання  │  Синонім        [Товари на складах...........]         │&lt;br /&gt;
│           Номенклат. │  Коментар       [.............................]        │&lt;br /&gt;
│           Склад      │                                                        │&lt;br /&gt;
│           Партія     │  Вид регістру   ( ) Обороти   (•) Залишки              │&lt;br /&gt;
│       ▾ Ресурси      │  Періодичність  [ У межах секунди        ▾]            │&lt;br /&gt;
│           Кількість  │  Режим запису   [ Підпорядкований реєстратору ▾]       │&lt;br /&gt;
│           Сума       │                                                        │&lt;br /&gt;
│       ▸ Реквізити    │  ☑ Дозволити підсумки залишків                        │&lt;br /&gt;
│       ▸ Форми        │  ☑ Дозволити підсумки оборотів                        │&lt;br /&gt;
│     ▸ Взаєморозрах.  │      Періодичність підсумків оборотів [Місяць  ▾]      │&lt;br /&gt;
│   ▸ бухгалтерії      │  ☐ Дозволити розділення підсумків                     │&lt;br /&gt;
│   ▸ розрахунку       │                                                        │&lt;br /&gt;
│                      │  Блокування даних  [Кероване ▾]                        │&lt;br /&gt;
│                      │  Партиціонування   [За періодом, крок: місяць ▾]       │&lt;br /&gt;
│                      │                                                        │&lt;br /&gt;
│                      │  [ Конструктор рухів... ]  [ Перевірити ]  [ Закрити ] │&lt;br /&gt;
├──────────────────────┴────────────────────────────────────────────────────────┤&lt;br /&gt;
│ ⚠ Попередження: 4 вимірювання + місячні підсумки → оцінка таблиці підсумків    │&lt;br /&gt;
│   ~ 12 млн записів/рік. Розгляньте виключення вимірювання «Партія» з підсумків.│&lt;br /&gt;
└───────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.2. Палітра властивостей поля ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Властивості: Вимірювання «Партія» ────────────────┐&lt;br /&gt;
│ Ім&#039;я                  [Партія...................]  │&lt;br /&gt;
│ Синонім               [Партія...................]  │&lt;br /&gt;
│ Тип                   [Складений тип........ [...]]│&lt;br /&gt;
│    ├ Документ.ПрихіднаНакладна                     │&lt;br /&gt;
│    └ Документ.ВведенняЗалишків                     │&lt;br /&gt;
│ Індексувати           [Не індексувати         ▾]   │&lt;br /&gt;
│ ☐ Ведуче                                           │&lt;br /&gt;
│ ☐ Основний відбір                                  │&lt;br /&gt;
│ ☐ Заборонити незаповнені значення                  │&lt;br /&gt;
│ ☑ Використовувати в підсумках                      │&lt;br /&gt;
│ Подання                                            │&lt;br /&gt;
│    Підказка           [Партія товару...........]   │&lt;br /&gt;
└────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.3. Вкладка «Реєстратори» ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ ТовариНаСкладах → Реєстратори ────────────────────────────┐&lt;br /&gt;
│ ☑ Документ.ПрихіднаНакладна                                │&lt;br /&gt;
│ ☑ Документ.ВидатковаНакладна                               │&lt;br /&gt;
│ ☑ Документ.ПереміщенняТоварів                              │&lt;br /&gt;
│ ☑ Документ.Інвентаризація                                  │&lt;br /&gt;
│ ☐ Документ.Замовлення                                      │&lt;br /&gt;
│ ☐ Документ.РахунокНаОплату                                 │&lt;br /&gt;
│                                     [Позначити всі] [Зняти]│&lt;br /&gt;
│ ─────────────────────────────────────────────────────────  │&lt;br /&gt;
│ ⓘ Знімання прапорця для документа, що має рухи, вимагає    │&lt;br /&gt;
│   очищення рухів. Знайдено рухів: 0                        │&lt;br /&gt;
└────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.4. Вимоги до конструктора ===&lt;br /&gt;
* ФТ-К-01. Валідація метаопису в реальному часі з переліком помилок/попереджень.&lt;br /&gt;
* ФТ-К-02. Попередній перегляд згенерованого DDL (кнопка «Показати SQL»).&lt;br /&gt;
* ФТ-К-03. Калькулятор оцінки обсягу таблиць підсумків (добуток кардинальностей вимірювань × кількість періодів).&lt;br /&gt;
* ФТ-К-04. Заборона неприпустимих комбінацій (напр. «Незалежний» + «Регістр накопичення»).&lt;br /&gt;
* ФТ-К-05. «Конструктор рухів» — генерація коду формування рухів за табличною частиною документа.&lt;br /&gt;
* ФТ-К-06. Порівняння/об&#039;єднання конфігурацій має коректно обробляти об&#039;єкти-регістри.&lt;br /&gt;
* ФТ-К-07. &#039;&#039;&#039;Генерація &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів&#039;&#039;&#039; для кожного регістру за метаописом. Прикладний код звертається до полів динамічно (&amp;lt;code&amp;gt;__getattr__&amp;lt;/code&amp;gt;), що недоступне для &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;; згенеровані стаби повертають статичну перевірку. Перегенеровуються при кожній зміні метаданих, перевіряються в CI (див. Е.6). &#039;&#039;Вимога специфічна для Python, аналога в 1С не має.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= 7. Функціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 7.1. Набір записів і проведення документа ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-01.&#039;&#039;&#039; Платформа надає прикладний об&#039;єкт &amp;lt;code&amp;gt;НабірЗаписів&amp;lt;/code&amp;gt; для кожного регістру з властивостями: &amp;lt;code&amp;gt;Відбір&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записувати&amp;lt;/code&amp;gt;, і методами &amp;lt;code&amp;gt;Прочитати()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записати(Заміщати)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Очистити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗаблокуватиДляЗміни()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вивантажити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Завантажити()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-02.&#039;&#039;&#039; Для документа доступна колекція &amp;lt;code&amp;gt;Рухи&amp;lt;/code&amp;gt; з наборами записів усіх регістрів, де документ вказано реєстратором.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-03. Сценарій проведення:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
skinparam defaultFontName &amp;quot;DejaVu Sans&amp;quot;&lt;br /&gt;
skinparam monochrome false&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
actor Користувач&lt;br /&gt;
participant &amp;quot;Форма\nдокумента&amp;quot; as UI&lt;br /&gt;
participant &amp;quot;Об&#039;єкт\nДокумент&amp;quot; as Doc&lt;br /&gt;
participant &amp;quot;Менеджер\nпроведення&amp;quot; as PM&lt;br /&gt;
participant &amp;quot;Набори\nзаписів&amp;quot; as RS&lt;br /&gt;
database &amp;quot;СКБД&amp;quot; as DB&lt;br /&gt;
&lt;br /&gt;
Користувач -&amp;gt; UI: Провести&lt;br /&gt;
UI -&amp;gt; Doc: Записати(РежимЗапису.Проведення)&lt;br /&gt;
activate Doc&lt;br /&gt;
Doc -&amp;gt; PM: НачатьТранзакцию()&lt;br /&gt;
PM -&amp;gt; DB: BEGIN&lt;br /&gt;
Doc -&amp;gt; Doc: ПередЗаписью()&lt;br /&gt;
Doc -&amp;gt; DB: UPDATE doc SET Проведений=1&lt;br /&gt;
Doc -&amp;gt; Doc: ОбработкаПроведения(Отказ, Режим)&lt;br /&gt;
note right of Doc&lt;br /&gt;
  Прикладний код:&lt;br /&gt;
  Рухи.ТовариНаСкладах.Записувати = Істина;&lt;br /&gt;
  Рух = Рухи.ТовариНаСкладах.Добавить();&lt;br /&gt;
  Рух.ВидРуху = ВидРухуНакопичення.Витрата;&lt;br /&gt;
  ...&lt;br /&gt;
  // контроль залишків (оперативне проведення)&lt;br /&gt;
end note&lt;br /&gt;
Doc -&amp;gt; RS: (формування рухів у пам&#039;яті)&lt;br /&gt;
Doc -&amp;gt; PM: ЗаписатьДвижения()&lt;br /&gt;
PM -&amp;gt; RS: для кожного НЗ з Записувати=Істина&lt;br /&gt;
RS -&amp;gt; DB: DELETE FROM rg_a_0012 WHERE rec_ref = :doc&lt;br /&gt;
RS -&amp;gt; DB: INSERT INTO rg_a_0012 (...) VALUES (...)&lt;br /&gt;
RS -&amp;gt; PM: ОновитиПідсумки(delta)&lt;br /&gt;
PM -&amp;gt; DB: MERGE rg_a_0012_tb (див. розд. 10.2)&lt;br /&gt;
Doc -&amp;gt; Doc: ПриЗаписи() / ПослеЗаписи()&lt;br /&gt;
alt Відмова = Хиба&lt;br /&gt;
  PM -&amp;gt; DB: COMMIT&lt;br /&gt;
  PM --&amp;gt; UI: Успіх&lt;br /&gt;
else Відмова = Істина або виключення&lt;br /&gt;
  PM -&amp;gt; DB: ROLLBACK&lt;br /&gt;
  PM --&amp;gt; UI: Помилка &amp;quot;Документ не проведено: ...&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
deactivate Doc&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-04.&#039;&#039;&#039; Запис набору записів у режимі &amp;lt;code&amp;gt;Заміщати = Істина&amp;lt;/code&amp;gt; (за замовчуванням для рухів) виконує &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt; усіх записів за відбором + &amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt; нових — атомарно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-05.&#039;&#039;&#039; Скасування проведення документа: усі набори записів за реєстратором очищуються, підсумки коригуються, документ отримує &amp;lt;code&amp;gt;Проведений = Хиба&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-06.&#039;&#039;&#039; Видалення документа-реєстратора (у т.ч. позначеного на видалення) &#039;&#039;&#039;зобов&#039;язане&#039;&#039;&#039; каскадно видалити всі його рухи в межах однієї транзакції. Реалізація — на рівні платформи (не FK, оскільки посилання поліморфне) + фонова перевірка цілісності (розділ 7.10).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-07.&#039;&#039;&#039; Режими проведення:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Режим !! Умова !! Поведінка&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Оперативне&#039;&#039;&#039; || Дата документа = поточна дата, документ у межах «оперативної точки» || Дозволено контроль залишків «на зараз»; дата може перепризначатися на поточну.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Неоперативне&#039;&#039;&#039; || Дата в минулому/майбутньому або документ перепроводиться || Контроль залишків виконується на дату документа; можливий негативний залишок за налаштуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.2. Активність записів ==&lt;br /&gt;
&#039;&#039;&#039;ФТ-08.&#039;&#039;&#039; Реквізит &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; означає, що запис фізично існує, але &#039;&#039;&#039;не&#039;&#039;&#039; впливає на підсумки та не потрапляє до віртуальних таблиць.&lt;br /&gt;
&#039;&#039;&#039;ФТ-09.&#039;&#039;&#039; Зміна активності будь-якого запису тягне коригування підсумків.&lt;br /&gt;
&#039;&#039;&#039;ФТ-10.&#039;&#039;&#039; Скасування проведення документа переводить усі його записи в &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; &#039;&#039;&#039;або&#039;&#039;&#039; видаляє їх — залежно від налаштування регістру &amp;lt;code&amp;gt;ПоведінкаПриСкасуванні&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Видаляти&amp;lt;/code&amp;gt; — за замовчуванням / &amp;lt;code&amp;gt;Деактивувати&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.3. Віртуальні таблиці ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-11.&#039;&#039;&#039; Мова запитів надає для кожного регістру набір віртуальних таблиць. Транслятор перетворює звернення до них на SQL із використанням таблиць підсумків та «живих» рухів після ТА.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Регістр !! Віртуальна таблиця !! Параметри !! Повертає&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РВ&#039;&#039;&#039; || &amp;lt;code&amp;gt;ЗрізОстанніх&amp;lt;/code&amp;gt; || (Період, Умова) || Останній запис на кожну комбінацію вимірювань з періодом ≤ Період&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗрізПерших&amp;lt;/code&amp;gt; || (Період, Умова) || Перший запис з періодом ≥ Період&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Усі записи&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РН.Залишки&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, Умова) || Вимірювання + &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, МетодДоповнення, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ПочатковийЗалишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;КінцевийЗалишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН.Обороти&#039;&#039;&#039; || &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | &#039;&#039;&#039;РБ&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, УмоваРахунку, Субконто, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахунку, Субконто, Умова, УмоваКорРахунку, КорСубконто) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (…) || Повний набір&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОборотиДтКт&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахункуДт, СубконтоДт, УмоваРахункуКт, СубконтоКт) || Кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДвиженияССубконто&amp;lt;/code&amp;gt; || (Початок, Кінець, УмоваРахунку, Субконто, Умова) || Рухи з розшифровкою субконто&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; || (Умова, Порядок…) || Значення субконто записів&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РР&#039;&#039;&#039; || &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; || (Умова) || &amp;lt;code&amp;gt;ЗначенняПеріодуДії&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняПеріодуРеєстрації&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняБазовогоПеріоду&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняФактичногоПеріодуДії&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ФактичнийПеріодДії&amp;lt;/code&amp;gt; || (Умова) || Записи з фактичними (після витіснення) межами&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; || (ВимірюванняБази, ВимірюванняОсновногоРегістру, Розрізи, ВидиРозрахунку, Умова) || Агреговані значення ресурсів базових видів розрахунку&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-12.&#039;&#039;&#039; Приклад запиту:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Залишки.Номенклатура,&lt;br /&gt;
    Залишки.Склад,&lt;br /&gt;
    Залишки.КількістьЗалишок,&lt;br /&gt;
    Обороти.КількістьПрихід,&lt;br /&gt;
    Обороти.КількістьВитрата&lt;br /&gt;
З&lt;br /&gt;
    РегістрНакопичення.ТовариНаСкладах.ЗалишкиІОбороти(&lt;br /&gt;
        &amp;amp;ПочатокПеріоду,&lt;br /&gt;
        &amp;amp;КінецьПеріоду,&lt;br /&gt;
        Місяць,&lt;br /&gt;
        Рух,&lt;br /&gt;
        Склад = &amp;amp;Склад&lt;br /&gt;
            І Номенклатура В ІЄРАРХІЇ (&amp;amp;ГрупаНоменклатури)&lt;br /&gt;
    ) ЯК Залишки&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-13.&#039;&#039;&#039; Параметри віртуальних таблиць &#039;&#039;&#039;зобов&#039;язані&#039;&#039;&#039; транслюватися у &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; підзапиту до звернення до підсумків (push-down), а не фільтруватися після агрегації.&lt;br /&gt;
&lt;br /&gt;
== 7.4. Підсумки ==&lt;br /&gt;
&lt;br /&gt;
=== 7.4.1. Модель підсумків залишків ===&lt;br /&gt;
Таблиця залишків зберігає &#039;&#039;&#039;кумулятивний залишок на початок кожного періоду&#039;&#039;&#039; + спеціальний рядок «підсумок за всі періоди» з &amp;lt;code&amp;gt;period = &#039;5999-11-01&#039;&amp;lt;/code&amp;gt; (маркер MAXPERIOD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                     Таблиця підсумків (місячна)                  ТА&lt;br /&gt;
                     ┌────┬────┬────┬────┬────┐                    ▼&lt;br /&gt;
  ─────┬────┬────┬───┴────┴────┴────┴────┴────┴────────────────────┬──────────►&lt;br /&gt;
       │    │    │  01.10  01.11  01.12  01.01  01.02             15.02      t&lt;br /&gt;
       │    │    │   ●      ●      ●      ●      ●&lt;br /&gt;
       │    │    │  бал.   бал.   бал.   бал.   бал.&lt;br /&gt;
                                                    └─ «живі» рухи ─┘&lt;br /&gt;
                                                      (сканування)&lt;br /&gt;
  Залишок на 10.02 = Підсумок(01.02) + Σ рухів (01.02 … 10.02]&lt;br /&gt;
  Залишок на 20.02 = Підсумок(01.02) + Σ рухів (01.02 … 20.02]   // після ТА — теж&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-14.&#039;&#039;&#039; Регламентна операція «Перерахунок підсумків» перебудовує таблиці підсумків з нуля.&lt;br /&gt;
&#039;&#039;&#039;ФТ-15.&#039;&#039;&#039; Регламентна операція «Встановлення періоду розрахунку підсумків» переносить ТА вперед/назад.&lt;br /&gt;
&#039;&#039;&#039;ФТ-16.&#039;&#039;&#039; При записі рухів раніше ТА підсумки коригуються &#039;&#039;інкрементально&#039;&#039; (див. 10.2), без повного перерахунку.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.2. Розділення підсумків ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-17.&#039;&#039;&#039; За увімкненого &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; у таблиці підсумків додається колонка &amp;lt;code&amp;gt;splitter smallint&amp;lt;/code&amp;gt;. Одночасні транзакції пишуть у різні «сплітери», що усуває конкуренцію за рядок. Читання агрегує по всіх сплітерах. Регламентне завдання зливає сплітери.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.3. Обороти ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-18.&#039;&#039;&#039; Таблиця оборотів зберігає агрегати за календарний період (день або місяць — за налаштуванням), без кумуляції.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.4. Агрегати (тільки РН виду «Обороти») ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-19.&#039;&#039;&#039; Агрегат — додаткова матеріалізована таблиця з підмножиною вимірювань і власною періодичністю (День/Місяць/Квартал/Рік). Оптимізатор запитів обирає найдешевший агрегат, що покриває запит.&lt;br /&gt;
&#039;&#039;&#039;ФТ-20.&#039;&#039;&#039; Режими: &amp;lt;code&amp;gt;Реальний час&amp;lt;/code&amp;gt; (оновлюється при записі рухів) / &amp;lt;code&amp;gt;Регламентний&amp;lt;/code&amp;gt; (оновлюється завданням; запит враховує рухи після дати актуальності агрегату).&lt;br /&gt;
&#039;&#039;&#039;ФТ-21.&#039;&#039;&#039; «Порадник агрегатів» аналізує статистику запитів і пропонує склад агрегатів (&amp;lt;code&amp;gt;ВизначитиОптимальніАгрегати()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.5. Механіка регістру розрахунку ==&lt;br /&gt;
&lt;br /&gt;
=== 7.5.1. Витіснення за періодом дії ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-22.&#039;&#039;&#039; Якщо у ПВР для виду розрахунку A вказано B у складі «Витісняючі види розрахунку», то запис виду B скорочує фактичний період дії запису виду A на інтервал перетину.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startgantt&lt;br /&gt;
skinparam defaultFontName &amp;quot;DejaVu Sans&amp;quot;&lt;br /&gt;
title Витіснення за періодом дії. Період реєстрації: січень 2026&lt;br /&gt;
caption Пріоритет витіснення: Лікарняний &amp;gt; Відпустка &amp;gt; Оклад&lt;br /&gt;
printscale daily&lt;br /&gt;
Project starts 2026-01-01&lt;br /&gt;
&lt;br /&gt;
-- Заявлені періоди дії (rg_c_0040.act_begin / act_end) --&lt;br /&gt;
[Оклад] as [O1] starts 2026-01-01 and ends 2026-01-31&lt;br /&gt;
[Відпустка] as [V1] starts 2026-01-10 and ends 2026-01-17&lt;br /&gt;
[Лікарняний] as [L1] starts 2026-01-14 and ends 2026-01-22&lt;br /&gt;
[O1] is colored in #BBDEFB&lt;br /&gt;
[V1] is colored in #FFE0B2&lt;br /&gt;
[L1] is colored in #F8BBD0&lt;br /&gt;
&lt;br /&gt;
-- Фактичні періоди дії після витіснення (rg_c_0040_ap) --&lt;br /&gt;
[Оклад, інтервал 0] as [O2] starts 2026-01-01 and ends 2026-01-09&lt;br /&gt;
[Оклад, інтервал 1] as [O3] starts 2026-01-23 and ends 2026-01-31&lt;br /&gt;
[Відпустка, інтервал 0] as [V2] starts 2026-01-10 and ends 2026-01-13&lt;br /&gt;
[Лікарняний, інтервал 0] as [L2] starts 2026-01-14 and ends 2026-01-22&lt;br /&gt;
[O2] is colored in #1976D2&lt;br /&gt;
[O3] is colored in #1976D2&lt;br /&gt;
[V2] is colored in #F57C00&lt;br /&gt;
[L2] is colored in #C2185B&lt;br /&gt;
@endgantt&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Ключове спостереження.&#039;&#039;&#039; Один запис «Оклад» породжує &#039;&#039;&#039;два&#039;&#039;&#039; фактичні інтервали — саме тому &amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt; має власний ключ &amp;lt;code&amp;gt;interval_no&amp;lt;/code&amp;gt; і зв&#039;язок 1:N із таблицею рухів (розділ 9.4). «Відпустка» скорочена з 17.01 до 13.01, бо лікарняний має вищий пріоритет.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-23.&#039;&#039;&#039; Фактичні періоди дії матеріалізуються у службовій таблиці &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;код&amp;amp;gt;_ap&amp;lt;/code&amp;gt; під час запису набору записів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-24.&#039;&#039;&#039; Витіснення обчислюється в межах збігу &#039;&#039;&#039;усіх&#039;&#039;&#039; вимірювань регістру та перетину періодів реєстрації, визначених ПВР.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.2. Базовий період і база розрахунку ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-25.&#039;&#039;&#039; Віртуальна таблиця &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; повертає суму ресурсів записів базових видів розрахунку, зіставлених за базовими вимірюваннями, з урахуванням режиму &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період дії&#039;&#039;&#039; перетинається з базовим періодом поточного запису; результат пропорційно розподіляється за часткою перетину (за графіком, якщо заданий);&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період реєстрації&#039;&#039;&#039; потрапляє в базовий період.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.3. Перерахунки ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-26.&#039;&#039;&#039; При записі/зміні/видаленні запису базового виду розрахунку платформа &#039;&#039;&#039;автоматично&#039;&#039;&#039; формує записи у таблиці перерахунку для всіх залежних записів (за збігом вимірювань перерахунку та потраплянням у базовий період).&lt;br /&gt;
&#039;&#039;&#039;ФТ-27.&#039;&#039;&#039; Прикладний код читає перерахунок як набір записів, перепроводить відповідні документи та очищує оброблені записи.&lt;br /&gt;
&#039;&#039;&#039;ФТ-28.&#039;&#039;&#039; Перерахунок доступний як об&#039;єкт для звіту «Документи до перерахунку».&lt;br /&gt;
&lt;br /&gt;
=== 7.5.4. Графік часу ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-29.&#039;&#039;&#039; Графік — це РВ з обов&#039;язковим вимірюванням типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; та числовим ресурсом. Віртуальна таблиця &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; повертає суму значень графіка за відповідний період (дії / реєстрації / базовий / фактичний період дії).&lt;br /&gt;
&#039;&#039;&#039;ФТ-30.&#039;&#039;&#039; Якщо у графіку є додаткові вимірювання (напр. &amp;lt;code&amp;gt;ВидГрафіка&amp;lt;/code&amp;gt;), вони зіставляються з однойменними реквізитами/вимірюваннями РР.&lt;br /&gt;
&lt;br /&gt;
== 7.6. Прикладний API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from datetime import date&lt;br /&gt;
from decimal import Decimal&lt;br /&gt;
&lt;br /&gt;
from k2.registers import AccumulationMovementType, DataLock, DataLockMode, Registers&lt;br /&gt;
from k2.documents import Document, PostingContext&lt;br /&gt;
&lt;br /&gt;
# ============ Регістр відомостей: незалежний запис ============&lt;br /&gt;
mgr = Registers.information(&amp;quot;КурсиВалют&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
rm = mgr.create_record_manager()&lt;br /&gt;
rm.Період = date(2026, 7, 17)&lt;br /&gt;
rm.Валюта = usd&lt;br /&gt;
rm.Курс = Decimal(&amp;quot;41.85&amp;quot;)&lt;br /&gt;
rm.Кратність = 1&lt;br /&gt;
rm.write(replace=True)                    # INSERT ... ON CONFLICT DO UPDATE&lt;br /&gt;
&lt;br /&gt;
# зріз останніх&lt;br /&gt;
row = mgr.get_last(date.today(), {&amp;quot;Валюта&amp;quot;: usd})&lt;br /&gt;
курс: Decimal = row.Курс&lt;br /&gt;
&lt;br /&gt;
# АП-1: масове завантаження — ОДИН запит, а не цикл із write() усередині&lt;br /&gt;
rs = mgr.create_record_set()&lt;br /&gt;
rs.load([{&amp;quot;Період&amp;quot;: d, &amp;quot;Валюта&amp;quot;: v, &amp;quot;Курс&amp;quot;: k, &amp;quot;Кратність&amp;quot;: 1}&lt;br /&gt;
         for d, v, k in nbu_rates])       # 3 000 курсів&lt;br /&gt;
rs.write(replace=True)                    # 1 × executemany, ~40 мс&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============ Регістр накопичення: рухи документа ============&lt;br /&gt;
class ВидатковаНакладна(Document):&lt;br /&gt;
&lt;br /&gt;
    def on_posting(self, ctx: PostingContext) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.ТовариНаСкладах&lt;br /&gt;
        rs.write = True                   # набір буде записано наприкінці транзакції&lt;br /&gt;
        rs.clear()&lt;br /&gt;
&lt;br /&gt;
        # АП-1: набір наповнюється генератором, запис — одним batch&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(&lt;br /&gt;
                Період=self.Дата,&lt;br /&gt;
                ВидРуху=AccumulationMovementType.EXPENSE,&lt;br /&gt;
                Номенклатура=r.Номенклатура,&lt;br /&gt;
                Склад=self.Склад,&lt;br /&gt;
                Партія=r.Партія,&lt;br /&gt;
                Кількість=r.Кількість,&lt;br /&gt;
                Сума=r.Сума,&lt;br /&gt;
            )&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        # керовані блокування перед контролем залишків&lt;br /&gt;
        with DataLock() as dl:            # __enter__ виконує lock()&lt;br /&gt;
            li = dl.add(&amp;quot;РегістрНакопичення.ТовариНаСкладах.Залишки&amp;quot;)&lt;br /&gt;
            li.mode = DataLockMode.EXCLUSIVE&lt;br /&gt;
            li.data_source = rs.unload(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Склад&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Номенклатура&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Склад&amp;quot;, &amp;quot;Склад&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            rs.write_now()                # примусовий запис до контролю&lt;br /&gt;
            self._control_balances(ctx)   # прикладна перевірка від&#039;ємних залишків&lt;br /&gt;
&lt;br /&gt;
    # ============ Регістр бухгалтерії ============&lt;br /&gt;
    def _accounting(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Госпрозрахунковий&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        for r in self.Товари:&lt;br /&gt;
            e = rs.add_accounting_entry(&lt;br /&gt;
                Період=self.Дата,&lt;br /&gt;
                Організація=self.Організація,&lt;br /&gt;
                РахунокДт=accounts[&amp;quot;281&amp;quot;],&lt;br /&gt;
                РахунокКт=accounts[&amp;quot;631&amp;quot;],&lt;br /&gt;
                Сума=r.Сума,&lt;br /&gt;
                КількістьДт=r.Кількість,&lt;br /&gt;
            )&lt;br /&gt;
            e.subconto_dt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e.subconto_dt[ВидиСубконто.Склади] = self.Склад&lt;br /&gt;
            e.subconto_kt[ВидиСубконто.Контрагенти] = self.Контрагент&lt;br /&gt;
&lt;br /&gt;
    # ============ Регістр розрахунку ============&lt;br /&gt;
    def _calculation(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Нарахування&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.append(rs.new(&lt;br /&gt;
            ВидРозрахунку=calc_types[&amp;quot;Оклад&amp;quot;],&lt;br /&gt;
            Період=self.Дата,                      # період реєстрації&lt;br /&gt;
            ПеріодДіїПочаток=date(2026, 7, 1),&lt;br /&gt;
            ПеріодДіїКінець=date(2026, 7, 31),&lt;br /&gt;
            БазовийПеріодПочаток=date(2026, 6, 1),&lt;br /&gt;
            БазовийПеріодКінець=date(2026, 6, 30),&lt;br /&gt;
            Співробітник=self.Співробітник,&lt;br /&gt;
            Результат=Decimal(0),                  # заповниться після розрахунку&lt;br /&gt;
        ))&lt;br /&gt;
        rs.write_now()&lt;br /&gt;
&lt;br /&gt;
# Отримання даних графіка та бази розрахунку — запитом (розділ 7.3), не циклом.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Про кириличні ідентифікатори.&#039;&#039;&#039; Python 3 підтримує Unicode в іменах (PEP 3131), тому &amp;lt;code&amp;gt;rm.Валюта&amp;lt;/code&amp;gt; і &amp;lt;code&amp;gt;rs.new(Номенклатура=…)&amp;lt;/code&amp;gt; — валідний код; прикладна термінологія зберігається без транслітерації. &#039;&#039;&#039;Але&#039;&#039;&#039; доступ до полів регістру динамічний, тому &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt; його не перевіряє — компенсується генерацією &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів (ФТ-К-07, Додаток Е.6). Ключові слова API (&amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) залишаються англійськими; змішування — свідомий компроміс, підлягає узгодженню (В15).}}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Антипатерн, специфічний для Python (А-15).&#039;&#039;&#039; Спокуса написати &amp;lt;code&amp;gt;for r in self.Товари: rs.add(...).write()&amp;lt;/code&amp;gt; дає 100 round-trip&#039;ів до СКБД замість одного і збільшує час проведення з 300 мс до ~10 с. Це порушення АП-1 і найчастіша помилка при переході з ORM-мислення. Детектор — Е.7.}}&lt;br /&gt;
&lt;br /&gt;
== 7.7. Блокування та конкурентність ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Вимога&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31 || Режим керованих блокувань — за замовчуванням. Рівень ізоляції транзакцій: &amp;lt;code&amp;gt;READ COMMITTED&amp;lt;/code&amp;gt; (PostgreSQL) / &amp;lt;code&amp;gt;READ COMMITTED SNAPSHOT&amp;lt;/code&amp;gt; (MS SQL).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-32 || Об&#039;єкт &amp;lt;code&amp;gt;DataLock&amp;lt;/code&amp;gt; дозволяє встановити розділювальне/виняткове блокування на «простір» регістру за значеннями вимірювань (реалізація — &amp;lt;code&amp;gt;pg_advisory_xact_lock&amp;lt;/code&amp;gt; за хешем ключа або &amp;lt;code&amp;gt;SELECT ... FOR UPDATE&amp;lt;/code&amp;gt; по таблиці підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-33 || Запис рухів документа блокує тільки записи цього реєстратора (PK містить реєстратор першим).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-34 || Оновлення підсумків не повинно призводити до дедлоків: усі &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;-операції в межах транзакції виконуються у детермінованому порядку сортування ключа.&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-35 || Гарантія: паралельне проведення двох документів з різними наборами вимірювань не конкурує (за увімкненого розділення підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-36 || Таймаут очікування блокування — 20 с (налаштовується); при перевищенні — керована помилка з текстом конфліктного ключа.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.8. Права доступу ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-37.&#039;&#039;&#039; Для регістру визначаються права: &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Додавання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Зміна&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Видалення&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перегляд&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Редагування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПереглядПідсумків&amp;lt;/code&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;ФТ-38.&#039;&#039;&#039; Обмеження на рівні записів (RLS) задаються шаблоном умови по вимірюваннях; транслюються в &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; усіх звернень, включно з віртуальними таблицями.&lt;br /&gt;
&#039;&#039;&#039;ФТ-39.&#039;&#039;&#039; &#039;&#039;Ризик:&#039;&#039; RLS на віртуальних таблицях залишків потребує узгодженості з підсумками. Рішення — RLS дозволено тільки по вимірюваннях, що входять до ключа підсумків; конструктор валідує це правило.&lt;br /&gt;
&lt;br /&gt;
== 7.9. Журналювання, аудит, службові сервіси ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-40.&#039;&#039;&#039; Реєстрація в журналі: перерахунок підсумків, зміна ТА, реструктуризація регістру, злиття сплітерів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-41.&#039;&#039;&#039; Службовий сервіс «Перевірка цілісності регістрів»:&lt;br /&gt;
* «висячі» рухи (реєстратор не існує або не проведений);&lt;br /&gt;
* розбіжність підсумків і сум рухів (контрольний перерахунок у тіньову таблицю з порівнянням);&lt;br /&gt;
* некоректні фактичні періоди дії РР;&lt;br /&gt;
* для РБ — порушення рівності Дт = Кт за балансовим ресурсом у межах реєстратора.&lt;br /&gt;
&#039;&#039;&#039;ФТ-42.&#039;&#039;&#039; Звіт «Аналіз розміру регістрів»: кількість записів, розмір таблиць та індексів, дата останнього перерахунку підсумків.&lt;br /&gt;
&lt;br /&gt;
= 8. Модель даних (як це виглядає в базі даних) =&lt;br /&gt;
&lt;br /&gt;
== 8.1. Конвенції іменування ==&lt;br /&gt;
&lt;br /&gt;
Фізичні імена &#039;&#039;&#039;не&#039;&#039;&#039; успадковують прикладні імена (обмеження довжини ідентифікатора, кирилиця, перейменування об&#039;єктів). Ім&#039;я будується за сурогатним кодом об&#039;єкта метаданих &amp;lt;code&amp;gt;&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; (4-значний hex/dec).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаблон !! Призначення !! Приклад&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_i_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр відомостей — основна таблиця || &amp;lt;code&amp;gt;rg_i_0007&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр накопичення — рухи || &amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tb&amp;lt;/code&amp;gt; || РН — підсумки залишків (Totals Balance) || &amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tt&amp;lt;/code&amp;gt; || РН — підсумки оборотів (Totals Turnover) || &amp;lt;code&amp;gt;rg_a_0012_tt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_ag&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; || РН — агрегат № n || &amp;lt;code&amp;gt;rg_a_0031_ag1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр бухгалтерії — проводки || &amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_ed&amp;lt;/code&amp;gt; || РБ — субконто (якщо винесено в дочірню таблицю) || &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tb&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки залишків за рівнем субконто k (0…N) || &amp;lt;code&amp;gt;rg_b_0020_tb2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tt&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки оборотів за рівнем субконто k || &amp;lt;code&amp;gt;rg_b_0020_tt1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tc&amp;lt;/code&amp;gt; || РБ — обороти між рахунками (кореспонденції) || &amp;lt;code&amp;gt;rg_b_0020_tc&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр розрахунку — рухи || &amp;lt;code&amp;gt;rg_c_0040&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_ap&amp;lt;/code&amp;gt; || РР — фактичні періоди дії || &amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_rc&amp;amp;lt;m&amp;amp;gt;&amp;lt;/code&amp;gt; || РР — перерахунок № m || &amp;lt;code&amp;gt;rg_c_0040_rc1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_&amp;amp;lt;*&amp;amp;gt;_&amp;amp;lt;id&amp;amp;gt;_opt&amp;lt;/code&amp;gt; || Службова: ТА підсумків, налаштування || &amp;lt;code&amp;gt;rg_a_0012_opt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;md_*&amp;lt;/code&amp;gt; || Таблиці метаданих || &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Колонки полів: &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — вимірювання, &amp;lt;code&amp;gt;r&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — ресурс, &amp;lt;code&amp;gt;a&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — реквізит, де &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; — порядковий номер поля в метаописі (стабільний, не перевикористовується після видалення поля). Мапінг «прикладне ім&#039;я ↔ фізична колонка» зберігається в &amp;lt;code&amp;gt;md_register_field&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.2. Типізація та зберігання значень ==&lt;br /&gt;
&lt;br /&gt;
=== 8.2.1. Примітивні типи ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Тип платформи !! PostgreSQL !! MS SQL&lt;br /&gt;
|-&lt;br /&gt;
| Число(p,s) || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(n) || &amp;lt;code&amp;gt;varchar(n)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(необмежена) || &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(max)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Дата / ДатаЧас || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;datetime2(0)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Булево || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| УНІ || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uniqueidentifier&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.2. Посилальні типи ===&lt;br /&gt;
* &#039;&#039;&#039;Простий&#039;&#039;&#039; (один тип): одна колонка &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r uuid NOT NULL&amp;lt;/code&amp;gt;, зовнішній ключ до таблиці об&#039;єкта. Порожнє посилання = &amp;lt;code&amp;gt;&#039;00000000-0000-0000-0000-000000000000&#039;&amp;lt;/code&amp;gt; (а не NULL — щоб зберегти семантику «пустого значення» у ключах підсумків).&lt;br /&gt;
* &#039;&#039;&#039;Складений&#039;&#039;&#039; (кілька типів / примітив + посилання): група колонок:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Колонка !! Тип !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_t&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;smallint&amp;lt;/code&amp;gt; || Код типу: 1=Невизначено, 2=Булево, 3=Число, 4=Рядок, 5=Дата, ≥100 = &amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt; посилального типу&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || Значення, якщо _t=2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_n&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(38,10)&amp;lt;/code&amp;gt; || Значення, якщо _t=3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_s&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;varchar(N)&amp;lt;/code&amp;gt; || Значення, якщо _t=4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_d&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || Значення, якщо _t=5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || Значення, якщо _t≥100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №1.&#039;&#039;&#039; Для складених типів обрано «широку» денормалізацію (кілька колонок), а не JSONB/варіант, тому що: (а) колонки індексуються та беруть участь у ключах підсумків; (б) B-tree по &amp;lt;code&amp;gt;(d1_t, d1_r)&amp;lt;/code&amp;gt; дає range-scan, JSONB — ні; (в) сумісно з обома цільовими СКБД. Ціна — до 6 колонок на одне складене поле.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.3. Реєстратор ===&lt;br /&gt;
Завжди складений (будь-який з дозволених документів):&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_t smallint NOT NULL&amp;lt;/code&amp;gt; — код типу документа (&amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt;);&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_r uuid NOT NULL&amp;lt;/code&amp;gt; — посилання.&lt;br /&gt;
&lt;br /&gt;
FK неможливий (поліморфізм) → цілісність забезпечується платформою + сервісом перевірки (ФТ-41).&lt;br /&gt;
&lt;br /&gt;
=== 8.2.4. Маркери періодів ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа !! Значення !! Використання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MINPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0001-01-01 00:00:00&amp;lt;/code&amp;gt; || Нижня межа&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5999-11-01 00:00:00&amp;lt;/code&amp;gt; || Рядок «підсумок за всі періоди» в таблицях залишків&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8.3. Таблиці метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ============ РЕПОЗИТОРІЙ МЕТАДАНИХ ============&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_type (                       -- реєстр усіх типів конфігурації&lt;br /&gt;
    id            smallint     PRIMARY KEY,&lt;br /&gt;
    kind          varchar(20)  NOT NULL,     -- Catalog|Document|Enum|ChartOfAccounts|ChartOfCalcTypes|Register|...&lt;br /&gt;
    name          varchar(80)  NOT NULL,&lt;br /&gt;
    table_name    varchar(63),&lt;br /&gt;
    UNIQUE (kind, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register (&lt;br /&gt;
    id                   smallint     PRIMARY KEY,          -- = md_type.id&lt;br /&gt;
    name                 varchar(80)  NOT NULL UNIQUE,&lt;br /&gt;
    synonym              varchar(255),&lt;br /&gt;
    comment              text,&lt;br /&gt;
    kind                 varchar(12)  NOT NULL&lt;br /&gt;
        CHECK (kind IN (&#039;Information&#039;,&#039;Accumulation&#039;,&#039;Accounting&#039;,&#039;Calculation&#039;)),&lt;br /&gt;
    -- загальні&lt;br /&gt;
    write_mode           varchar(24)  NOT NULL DEFAULT &#039;SubordinateToRecorder&#039;&lt;br /&gt;
        CHECK (write_mode IN (&#039;Independent&#039;,&#039;SubordinateToRecorder&#039;)),&lt;br /&gt;
    periodicity          varchar(24)  NOT NULL DEFAULT &#039;Nonperiodical&#039;&lt;br /&gt;
        CHECK (periodicity IN (&#039;Nonperiodical&#039;,&#039;WithinSecond&#039;,&#039;WithinDay&#039;,&#039;WithinMonth&#039;,&lt;br /&gt;
                               &#039;WithinQuarter&#039;,&#039;WithinYear&#039;,&#039;ByRecorderPosition&#039;)),&lt;br /&gt;
    lock_mode            varchar(12)  NOT NULL DEFAULT &#039;Managed&#039;,&lt;br /&gt;
    use_rls              boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    partition_mode       varchar(20)  NOT NULL DEFAULT &#039;None&#039;,&lt;br /&gt;
    partition_step       varchar(10),&lt;br /&gt;
    -- РН&lt;br /&gt;
    accumulation_kind    varchar(10)  CHECK (accumulation_kind IN (&#039;Balance&#039;,&#039;Turnover&#039;)),&lt;br /&gt;
    enable_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    enable_tno_totals    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    tno_totals_period    varchar(6)   CHECK (tno_totals_period IN (&#039;Day&#039;,&#039;Month&#039;)),&lt;br /&gt;
    split_totals         boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    split_count          smallint     NOT NULL DEFAULT 1,&lt;br /&gt;
    aggregates_mode      varchar(10),&lt;br /&gt;
    -- РБ&lt;br /&gt;
    chart_of_accounts_id smallint     REFERENCES md_type(id),&lt;br /&gt;
    correspondence       boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    max_extdim_count     smallint     NOT NULL DEFAULT 3,&lt;br /&gt;
    -- РР&lt;br /&gt;
    calc_types_plan_id   smallint     REFERENCES md_type(id),&lt;br /&gt;
    use_action_period    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    base_period_mode     varchar(24)&lt;br /&gt;
        CHECK (base_period_mode IN (&#039;None&#039;,&#039;ByActionPeriod&#039;,&#039;ByRegistrationPeriod&#039;)),&lt;br /&gt;
    schedule_register_id smallint     REFERENCES md_register(id),&lt;br /&gt;
    schedule_value_field smallint,&lt;br /&gt;
    schedule_date_field  smallint,&lt;br /&gt;
    -- службове&lt;br /&gt;
    physical_table       varchar(63)  NOT NULL,&lt;br /&gt;
    struct_version       int          NOT NULL DEFAULT 1,&lt;br /&gt;
    CONSTRAINT chk_kind_props CHECK (&lt;br /&gt;
        (kind = &#039;Accumulation&#039; AND accumulation_kind IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Accounting&#039;   AND chart_of_accounts_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Calculation&#039;  AND calc_types_plan_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Information&#039;)&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_field (&lt;br /&gt;
    id                smallint    NOT NULL,        -- порядковий номер поля (стабільний)&lt;br /&gt;
    register_id       smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name              varchar(80) NOT NULL,&lt;br /&gt;
    synonym           varchar(255),&lt;br /&gt;
    role              varchar(12) NOT NULL CHECK (role IN (&#039;Dimension&#039;,&#039;Resource&#039;,&#039;Attribute&#039;)),&lt;br /&gt;
    data_type_expr    text        NOT NULL,        -- серіалізований опис типу (може бути складеним)&lt;br /&gt;
    is_composite      boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    precision_        smallint,&lt;br /&gt;
    scale_            smallint,&lt;br /&gt;
    length_           int,&lt;br /&gt;
    index_mode        varchar(28) NOT NULL DEFAULT &#039;None&#039;&lt;br /&gt;
        CHECK (index_mode IN (&#039;None&#039;,&#039;Index&#039;,&#039;IndexWithAddDimensions&#039;)),&lt;br /&gt;
    is_master         boolean     NOT NULL DEFAULT false,   -- «Ведуче»&lt;br /&gt;
    in_default_filter boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    deny_empty        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    use_in_totals     boolean     NOT NULL DEFAULT true,&lt;br /&gt;
    -- РБ&lt;br /&gt;
    is_balance        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    accounting_flag   varchar(80),&lt;br /&gt;
    extdim_flag       varchar(80),&lt;br /&gt;
    -- РР&lt;br /&gt;
    is_base_dimension boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    -- фізика&lt;br /&gt;
    column_prefix     varchar(8)  NOT NULL,        -- &#039;d3&#039;,&#039;r1&#039;,&#039;a2&#039;&lt;br /&gt;
    PRIMARY KEY (register_id, id),&lt;br /&gt;
    UNIQUE (register_id, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recorder (&lt;br /&gt;
    register_id  smallint NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    doc_type_id  smallint NOT NULL REFERENCES md_type(id),&lt;br /&gt;
    PRIMARY KEY (register_id, doc_type_id)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_aggregate (&lt;br /&gt;
    id           smallint    NOT NULL,&lt;br /&gt;
    register_id  smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    periodicity  varchar(8)  NOT NULL CHECK (periodicity IN (&#039;Day&#039;,&#039;Month&#039;,&#039;Quarter&#039;,&#039;Year&#039;)),&lt;br /&gt;
    use_mode     varchar(12) NOT NULL DEFAULT &#039;Auto&#039;,&lt;br /&gt;
    is_realtime  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    actual_upto  timestamp(0),&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_aggregate_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    aggregate_id smallint NOT NULL,&lt;br /&gt;
    field_id     smallint NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, aggregate_id, field_id),&lt;br /&gt;
    FOREIGN KEY (register_id, aggregate_id) REFERENCES md_register_aggregate(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recalc (&lt;br /&gt;
    id             smallint    NOT NULL,&lt;br /&gt;
    register_id    smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name           varchar(80) NOT NULL,&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_recalc_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    recalc_id    smallint NOT NULL,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    reg_field_id smallint NOT NULL,          -- вимірювання основного регістру&lt;br /&gt;
    column_prefix varchar(8) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, recalc_id, name),&lt;br /&gt;
    FOREIGN KEY (register_id, recalc_id) REFERENCES md_register_recalc(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.4. Регістр відомостей ==&lt;br /&gt;
&lt;br /&gt;
=== 8.4.1. Незалежний періодичний (приклад: КурсиВалют) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0007 (&lt;br /&gt;
    period   timestamp(0) NOT NULL,                  -- Період (усічений до дня: WithinDay)&lt;br /&gt;
    d1_r     uuid         NOT NULL,                  -- Вимірювання «Валюта»&lt;br /&gt;
    r1       numeric(15,4) NOT NULL,                 -- Ресурс «Курс»&lt;br /&gt;
    r2       numeric(10,0) NOT NULL DEFAULT 1,       -- Ресурс «Кратність»&lt;br /&gt;
    CONSTRAINT pk_rg_i_0007 PRIMARY KEY (period, d1_r)&lt;br /&gt;
);&lt;br /&gt;
-- Індекс для зрізу останніх у розрізі вимірювання&lt;br /&gt;
CREATE INDEX ix_rg_i_0007_d1 ON rg_i_0007 (d1_r, period DESC) INCLUDE (r1, r2);&lt;br /&gt;
ALTER TABLE rg_i_0007 ADD CONSTRAINT fk_rg_i_0007_d1&lt;br /&gt;
    FOREIGN KEY (d1_r) REFERENCES cat_0003(ref);      -- Довідник.Валюти&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.2. Підпорядкований реєстратору ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0008 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    r1       numeric(15,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0008 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_period ON rg_i_0008 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_d1     ON rg_i_0008 (d1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.3. Незалежний неперіодичний ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0009 (&lt;br /&gt;
    d1_r  uuid          NOT NULL,&lt;br /&gt;
    d2_r  uuid          NOT NULL,&lt;br /&gt;
    r1    varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_i_0009 PRIMARY KEY (d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.5. Регістр накопичення ==&lt;br /&gt;
&lt;br /&gt;
=== 8.5.1. Таблиця рухів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ТовариНаСкладах: dims = Номенклатура(d1), Склад(d2), Партія(d3, складений), Характеристика(d4)&lt;br /&gt;
--                  res  = Кількість(r1), Сума(r2);  attr = Коментар(a1)&lt;br /&gt;
CREATE TABLE rg_a_0012 (&lt;br /&gt;
    rec_t    smallint      NOT NULL,&lt;br /&gt;
    rec_r    uuid          NOT NULL,&lt;br /&gt;
    line_no  int           NOT NULL,&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    active   boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    mvt      smallint      NOT NULL CHECK (mvt IN (0,1)),   -- 0=Прихід, 1=Витрата&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,                        -- складене вимірювання «Партія»&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(15,3) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2       numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    a1       varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE rg_a_0012_p2026m07 PARTITION OF rg_a_0012&lt;br /&gt;
    FOR VALUES FROM (&#039;2026-07-01&#039;) TO (&#039;2026-08-01&#039;);&lt;br /&gt;
-- ... інші секції створюються регламентним завданням&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_period ON rg_a_0012 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d1     ON rg_a_0012 (d1_r, period, d2_r) WHERE active;   -- Номенклатура (Індексувати з дод. вимірюваннями)&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d2     ON rg_a_0012 (d2_r, period, d1_r) WHERE active;   -- Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.2. Таблиця підсумків залишків ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tb (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок місяця; MAXPERIOD = підсумок за всі періоди&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,     -- Кількість, знаковий залишок&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,     -- Сума&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tb PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- покривний індекс для типового відбору «залишки по складу»&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_tb_d2 ON rg_a_0012_tb (d2_r, period, d1_r) INCLUDE (r1, r2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Семантика:&#039;&#039;&#039; рядок з &amp;lt;code&amp;gt;period = P&amp;lt;/code&amp;gt; містить залишок &#039;&#039;&#039;на початок&#039;&#039;&#039; періоду P. Рядок з &amp;lt;code&amp;gt;period = MAXPERIOD&amp;lt;/code&amp;gt; — поточний залишок за всі періоди (використовується для запитів «залишки на зараз», найчастіший кейс).&lt;br /&gt;
&lt;br /&gt;
=== 8.5.3. Таблиця підсумків оборотів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tt (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок періоду агрегації (день/місяць)&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1_in    numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Прихід&lt;br /&gt;
    r1_out   numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Витрата&lt;br /&gt;
    r2_in    numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2_out   numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tt PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.4. Службова таблиця налаштувань ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_opt (&lt;br /&gt;
    id                smallint     PRIMARY KEY DEFAULT 1 CHECK (id = 1),&lt;br /&gt;
    totals_actual_to  timestamp(0) NOT NULL,   -- ТА: підсумки розраховані до&lt;br /&gt;
    use_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    use_tno_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    min_period        timestamp(0),            -- період першого руху&lt;br /&gt;
    last_recalc_at    timestamp(0),&lt;br /&gt;
    split_merge_at    timestamp(0)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.5. Агрегат (для РН виду «Обороти») ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Агрегат «Продажі за місяцями по номенклатурі та складу» (без Партії, без Характеристики)&lt;br /&gt;
CREATE TABLE rg_a_0031_ag1 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag1 PRIMARY KEY (period, d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.6. Регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
=== 8.6.1. План рахунків (супутні таблиці) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE coa_0005 (                            -- ПланРахунків.Госпрозрахунковий&lt;br /&gt;
    ref          uuid        PRIMARY KEY,&lt;br /&gt;
    parent_ref   uuid        REFERENCES coa_0005(ref),&lt;br /&gt;
    code         varchar(20) NOT NULL,&lt;br /&gt;
    order_code   varchar(40) NOT NULL,             -- впорядкований код для ієрархічних запитів&lt;br /&gt;
    name         varchar(150) NOT NULL,&lt;br /&gt;
    acc_type     smallint    NOT NULL,             -- 0=Активний,1=Пасивний,2=Активно-пасивний&lt;br /&gt;
    off_balance  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    ed_count     smallint    NOT NULL DEFAULT 0,   -- фактична кількість субконто&lt;br /&gt;
    fl_qty       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Кількісний»&lt;br /&gt;
    fl_cur       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Валютний»&lt;br /&gt;
    marked_del   boolean     NOT NULL DEFAULT false&lt;br /&gt;
);&lt;br /&gt;
CREATE UNIQUE INDEX ux_coa_0005_code ON coa_0005 (code);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE coa_0005_ed (                         -- ТЧ «ВидиСубконто»&lt;br /&gt;
    ref        uuid     NOT NULL REFERENCES coa_0005(ref) ON DELETE CASCADE,&lt;br /&gt;
    line_no    int      NOT NULL,&lt;br /&gt;
    ed_type_r  uuid     NOT NULL,                  -- ПланВидівХарактеристик.ВидиСубконто&lt;br /&gt;
    only_tno   boolean  NOT NULL DEFAULT false,    -- «Тільки обороти»&lt;br /&gt;
    sum_flag   boolean  NOT NULL DEFAULT true,     -- «Підсумкова сума»&lt;br /&gt;
    fl_qty     boolean  NOT NULL DEFAULT false,    -- ознака обліку субконто «Кількісний»&lt;br /&gt;
    PRIMARY KEY (ref, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.2. Таблиця проводок (з кореспонденцією) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Госпрозрахунковий: dims = Організація(d1, балансове), Підрозділ(d2, небалансове)&lt;br /&gt;
--   res = Сума(r1, балансовий), Кількість(r2, небалансовий), ВалютнаСума(r3, небалансовий)&lt;br /&gt;
--   attr = Зміст(a1), Валюта(a2);  max_extdim_count = 3&lt;br /&gt;
CREATE TABLE rg_b_0020 (&lt;br /&gt;
    rec_t     smallint      NOT NULL,&lt;br /&gt;
    rec_r     uuid          NOT NULL,&lt;br /&gt;
    line_no   int           NOT NULL,&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    active    boolean       NOT NULL DEFAULT true,&lt;br /&gt;
&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
&lt;br /&gt;
    -- балансове вимірювання: одне значення на проводку&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    -- небалансове вимірювання: окремо для Дт і Кт&lt;br /&gt;
    d2_dt_r   uuid          NOT NULL,&lt;br /&gt;
    d2_kt_r   uuid          NOT NULL,&lt;br /&gt;
&lt;br /&gt;
    -- субконто Дт (3 слоти, складений тип: ПВХ-значення)&lt;br /&gt;
    ed_dt1_t  smallint, ed_dt1_r uuid,&lt;br /&gt;
    ed_dt2_t  smallint, ed_dt2_r uuid,&lt;br /&gt;
    ed_dt3_t  smallint, ed_dt3_r uuid,&lt;br /&gt;
    ed_dt_h   bigint        NOT NULL DEFAULT 0,     -- хеш набору субконто Дт (для JOIN з підсумками)&lt;br /&gt;
    -- субконто Кт&lt;br /&gt;
    ed_kt1_t  smallint, ed_kt1_r uuid,&lt;br /&gt;
    ed_kt2_t  smallint, ed_kt2_r uuid,&lt;br /&gt;
    ed_kt3_t  smallint, ed_kt3_r uuid,&lt;br /&gt;
    ed_kt_h   bigint        NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    -- балансовий ресурс: одне значення&lt;br /&gt;
    r1        numeric(20,2) NOT NULL DEFAULT 0,     -- Сума&lt;br /&gt;
    -- небалансові ресурси: пара Дт/Кт&lt;br /&gt;
    r2_dt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Дт&lt;br /&gt;
    r2_kt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Кт&lt;br /&gt;
    r3_dt     numeric(20,2) NOT NULL DEFAULT 0,     -- ВалютнаСума Дт&lt;br /&gt;
    r3_kt     numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    a1        varchar(255),&lt;br /&gt;
    a2_r      uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_period  ON rg_b_0020 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_dt  ON rg_b_0020 (acc_dt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_kt  ON rg_b_0020 (acc_kt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_dt   ON rg_b_0020 (ed_dt1_t, ed_dt1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №2.&#039;&#039;&#039; Субконто зберігаються &#039;&#039;&#039;слотами в основній таблиці&#039;&#039;&#039;, а не в дочірній таблиці «ключ-значення». Обґрунтування: (а) віртуальні таблиці &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; з відбором за субконто перетворюються на предикат по колонці замість &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; самоз&#039;єднань; (б) кількість субконто жорстко обмежена (≤5) — «широка» таблиця прийнятна; (в) 1С використовує гібрид (&amp;lt;code&amp;gt;_AccRgED&amp;lt;/code&amp;gt;), що дає складніші плани. &#039;&#039;&#039;Ціна:&#039;&#039;&#039; зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; = реструктуризація таблиці. Альтернатива (дочірня таблиця &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;) описана в Додатку Б і зберігається як план «Б» за результатами навантажувального тесту НТ-04.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.6.3. Таблиця проводок (без кореспонденції) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_b_0021 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    acc_mvt  smallint     NOT NULL CHECK (acc_mvt IN (0,1)),  -- 0=Дебет, 1=Кредит&lt;br /&gt;
    acc_r    uuid         NOT NULL REFERENCES coa_0006(ref),&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    ed1_t smallint, ed1_r uuid,&lt;br /&gt;
    ed2_t smallint, ed2_r uuid,&lt;br /&gt;
    ed3_t smallint, ed3_r uuid,&lt;br /&gt;
    ed_h     bigint       NOT NULL DEFAULT 0,&lt;br /&gt;
    r1       numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0021 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.4. Підсумки РБ ===&lt;br /&gt;
Підсумки будуються на кількох «рівнях субконто» — щоб запит без відбору за субконто не сканував найдетальнішу таблицю.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Рівень 0: залишки по рахунку + балансові вимірювання (без субконто)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,               -- Організація (балансове)&lt;br /&gt;
    r1       numeric(24,2) NOT NULL,               -- Сума: &amp;gt;0 = дебетовий, &amp;lt;0 = кредитовий залишок&lt;br /&gt;
    r2       numeric(24,3) NOT NULL,               -- Кількість&lt;br /&gt;
    r3       numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Рівень 1..3: залишки з розшифровкою по субконто (тільки для рахунків з ed_count &amp;gt;= k)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb1 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t   smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb1 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE rg_b_0020_tb2 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    ed2_t smallint NOT NULL, ed2_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb2 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, ed2_t, ed2_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- rg_b_0020_tb3 — аналогічно, 3 субконто&lt;br /&gt;
&lt;br /&gt;
-- Обороти (аналогічні рівні): tt0..tt3&lt;br /&gt;
CREATE TABLE rg_b_0020_tt0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    r1_dt numeric(24,2) NOT NULL, r1_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    r2_dt numeric(24,3) NOT NULL, r2_kt numeric(24,3) NOT NULL,&lt;br /&gt;
    r3_dt numeric(24,2) NOT NULL, r3_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tt0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Обороти між рахунками (кореспонденції)&lt;br /&gt;
CREATE TABLE rg_b_0020_tc (&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter  smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL,&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL,&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    r1        numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tc PRIMARY KEY (period, acc_dt_r, acc_kt_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Правило запису рівнів:&#039;&#039;&#039; для проводки з рахунком, що має &amp;lt;code&amp;gt;ed_count = k&amp;lt;/code&amp;gt;, оновлюються таблиці &amp;lt;code&amp;gt;tb0 … tbK&amp;lt;/code&amp;gt; (k+1 таблиць). Рахунки без субконто оновлюють лише &amp;lt;code&amp;gt;tb0&amp;lt;/code&amp;gt;. Субконто з ознакою «Тільки обороти» не потрапляють у &amp;lt;code&amp;gt;tb*&amp;lt;/code&amp;gt;, лише в &amp;lt;code&amp;gt;tt*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.7. Регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Нарахування: dims = Співробітник(d1, базове), Підрозділ(d2)&lt;br /&gt;
--              res  = Результат(r1), ВідпрацьованоДнів(r2), НормаДнів(r3)&lt;br /&gt;
--              attr = Графік(a1)&lt;br /&gt;
CREATE TABLE rg_c_0040 (&lt;br /&gt;
    rec_t        smallint      NOT NULL,&lt;br /&gt;
    rec_r        uuid          NOT NULL,&lt;br /&gt;
    line_no      int           NOT NULL,&lt;br /&gt;
    period       timestamp(0)  NOT NULL,      -- період реєстрації (початок місяця)&lt;br /&gt;
    active       boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    reversal     boolean       NOT NULL DEFAULT false,   -- Сторно&lt;br /&gt;
    calc_type_r  uuid          NOT NULL,                 -- ВидРозрахунку → pct_0011(ref)&lt;br /&gt;
    act_begin    timestamp(0)  NOT NULL,      -- ПеріодДіїПочаток&lt;br /&gt;
    act_end      timestamp(0)  NOT NULL,      -- ПеріодДіїКінець&lt;br /&gt;
    base_begin   timestamp(0),                -- БазовийПеріодПочаток&lt;br /&gt;
    base_end     timestamp(0),                -- БазовийПеріодКінець&lt;br /&gt;
    d1_r         uuid          NOT NULL,&lt;br /&gt;
    d2_r         uuid          NOT NULL,&lt;br /&gt;
    r1           numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    r3           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    a1_r         uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040 PRIMARY KEY (rec_t, rec_r, line_no),&lt;br /&gt;
    CONSTRAINT chk_rg_c_0040_act CHECK (act_end &amp;gt;= act_begin)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_period ON rg_c_0040 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_d1     ON rg_c_0040 (d1_r, period, calc_type_r) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_act    ON rg_c_0040 (d1_r, act_begin, act_end) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_base   ON rg_c_0040 (d1_r, calc_type_r, base_begin, base_end) WHERE active;&lt;br /&gt;
&lt;br /&gt;
-- Фактичні періоди дії (після витіснення). Один запис → 0..N інтервалів.&lt;br /&gt;
CREATE TABLE rg_c_0040_ap (&lt;br /&gt;
    rec_t       smallint     NOT NULL,&lt;br /&gt;
    rec_r       uuid         NOT NULL,&lt;br /&gt;
    line_no     int          NOT NULL,&lt;br /&gt;
    interval_no smallint     NOT NULL,&lt;br /&gt;
    calc_type_r uuid         NOT NULL,&lt;br /&gt;
    d1_r        uuid         NOT NULL,        -- денормалізація базового вимірювання для швидкого JOIN&lt;br /&gt;
    fact_begin  timestamp(0) NOT NULL,&lt;br /&gt;
    fact_end    timestamp(0) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_ap PRIMARY KEY (rec_t, rec_r, line_no, interval_no),&lt;br /&gt;
    CONSTRAINT fk_rg_c_0040_ap FOREIGN KEY (rec_t, rec_r, line_no)&lt;br /&gt;
        REFERENCES rg_c_0040 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_ap_d1 ON rg_c_0040_ap (d1_r, fact_begin, fact_end);&lt;br /&gt;
&lt;br /&gt;
-- Перерахунок «ПерерахунокЗаБазою»&lt;br /&gt;
CREATE TABLE rg_c_0040_rc1 (&lt;br /&gt;
    rec_t        smallint NOT NULL,     -- реєстратор запису, який треба перерахувати&lt;br /&gt;
    rec_r        uuid     NOT NULL,&lt;br /&gt;
    calc_type_r  uuid     NOT NULL,     -- вид розрахунку, що потребує перерахунку&lt;br /&gt;
    d1_r         uuid     NOT NULL,     -- вимірювання перерахунку «Співробітник»&lt;br /&gt;
    src_rec_t    smallint NOT NULL,     -- реєстратор, що спричинив перерахунок&lt;br /&gt;
    src_rec_r    uuid     NOT NULL,&lt;br /&gt;
    created_at   timestamp(0) NOT NULL DEFAULT now(),&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_rc1 PRIMARY KEY (rec_t, rec_r, calc_type_r, d1_r)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_rc1_src ON rg_c_0040_rc1 (src_rec_t, src_rec_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.8. Зведення: які таблиці породжує кожен тип регістру ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Tables {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;; ranksep=0.6; nodesep=0.08;&lt;br /&gt;
  node [shape=box, style=&amp;quot;filled,rounded&amp;quot;, fontname=&amp;quot;DejaVu Sans&amp;quot;, fontsize=9, height=0.26];&lt;br /&gt;
  edge [color=&amp;quot;#9e9e9e&amp;quot;, arrowhead=vee];&lt;br /&gt;
&lt;br /&gt;
  RI  [label=&amp;quot;РВ\n(незалежний або\nпідпорядкований)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RAB [label=&amp;quot;РН «Залишки»&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RAT [label=&amp;quot;РН «Обороти»&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RB  [label=&amp;quot;РБ&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RC  [label=&amp;quot;РР&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  node [shape=cylinder, style=filled, fontname=&amp;quot;Courier&amp;quot;, fontsize=8, height=0.22];&lt;br /&gt;
&lt;br /&gt;
  i1 [label=&amp;quot;rg_i_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#c8e6c9&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; i1;&lt;br /&gt;
&lt;br /&gt;
  a1 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#ffecb3&amp;quot;];&lt;br /&gt;
  a2 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_tb&amp;quot;, fillcolor=&amp;quot;#ffe082&amp;quot;];&lt;br /&gt;
  a3 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_tt&amp;quot;, fillcolor=&amp;quot;#ffe082&amp;quot;];&lt;br /&gt;
  a4 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_opt&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  RAB -&amp;gt; a1; RAB -&amp;gt; a2 [label=&amp;quot; якщо підсумки залишків&amp;quot;, fontsize=7];&lt;br /&gt;
  RAB -&amp;gt; a3 [label=&amp;quot; якщо підсумки оборотів&amp;quot;, fontsize=7]; RAB -&amp;gt; a4;&lt;br /&gt;
&lt;br /&gt;
  t1 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#ffecb3&amp;quot;];&lt;br /&gt;
  t2 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_tt&amp;quot;, fillcolor=&amp;quot;#ffe082&amp;quot;];&lt;br /&gt;
  t3 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_ag1..agN&amp;quot;, fillcolor=&amp;quot;#ffd54f&amp;quot;];&lt;br /&gt;
  t4 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_opt&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  RAT -&amp;gt; t1; RAT -&amp;gt; t2; RAT -&amp;gt; t3 [label=&amp;quot; агрегати&amp;quot;, fontsize=7]; RAT -&amp;gt; t4;&lt;br /&gt;
&lt;br /&gt;
  b1 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;];&lt;br /&gt;
  b2 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;_tb0 .. _tbK&amp;quot;, fillcolor=&amp;quot;#f48fb1&amp;quot;];&lt;br /&gt;
  b3 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;_tt0 .. _ttK&amp;quot;, fillcolor=&amp;quot;#f48fb1&amp;quot;];&lt;br /&gt;
  b4 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;_tc&amp;quot;, fillcolor=&amp;quot;#f48fb1&amp;quot;];&lt;br /&gt;
  b5 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;_opt&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RB -&amp;gt; b1; RB -&amp;gt; b2 [label=&amp;quot; K = МаксКількістьСубконто&amp;quot;, fontsize=7]; RB -&amp;gt; b3; RB -&amp;gt; b4; RB -&amp;gt; b5;&lt;br /&gt;
&lt;br /&gt;
  c1 [label=&amp;quot;rg_c_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
  c2 [label=&amp;quot;rg_c_&amp;lt;id&amp;gt;_ap&amp;quot;, fillcolor=&amp;quot;#b39ddb&amp;quot;];&lt;br /&gt;
  c3 [label=&amp;quot;rg_c_&amp;lt;id&amp;gt;_rc1..rcM&amp;quot;, fillcolor=&amp;quot;#b39ddb&amp;quot;];&lt;br /&gt;
  RC -&amp;gt; c1; RC -&amp;gt; c2 [label=&amp;quot; фактичні періоди&amp;quot;, fontsize=7]; RC -&amp;gt; c3 [label=&amp;quot; перерахунки&amp;quot;, fontsize=7];&lt;br /&gt;
&lt;br /&gt;
  { rank=same; RI; RAB; RAT; RB; RC; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оцінка: для РБ з &amp;lt;code&amp;gt;МаксКількістьСубконто = 3&amp;lt;/code&amp;gt; генерується &#039;&#039;&#039;10 фізичних таблиць&#039;&#039;&#039; на один регістр.&lt;br /&gt;
&lt;br /&gt;
= 9. ER-моделі =&lt;br /&gt;
&lt;br /&gt;
== 9.1. ER-модель метаданих (репозиторій) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
skinparam defaultFontName &amp;quot;DejaVu Sans&amp;quot;&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_type&amp;quot; as T {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * kind : varchar(20)&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  table_name : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register&amp;quot; as R {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK,FK→md_type&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * kind : varchar(12)&lt;br /&gt;
  * write_mode : varchar(24)&lt;br /&gt;
  * periodicity : varchar(24)&lt;br /&gt;
  accumulation_kind : varchar(10)&lt;br /&gt;
  enable_bal_totals : boolean&lt;br /&gt;
  enable_tno_totals : boolean&lt;br /&gt;
  tno_totals_period : varchar(6)&lt;br /&gt;
  split_totals : boolean&lt;br /&gt;
  chart_of_accounts_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  correspondence : boolean&lt;br /&gt;
  max_extdim_count : smallint&lt;br /&gt;
  calc_types_plan_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_period_mode : varchar(24)&lt;br /&gt;
  schedule_register_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
  * struct_version : int&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_field&amp;quot; as F {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * role : Dimension|Resource|Attribute&lt;br /&gt;
  * data_type_expr : text&lt;br /&gt;
  is_composite : boolean&lt;br /&gt;
  index_mode : varchar(28)&lt;br /&gt;
  is_master : boolean&lt;br /&gt;
  is_balance : boolean&lt;br /&gt;
  is_base_dimension : boolean&lt;br /&gt;
  accounting_flag : varchar(80)&lt;br /&gt;
  * column_prefix : varchar(8)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recorder&amp;quot; as RR {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * doc_type_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate&amp;quot; as AG {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * periodicity : Day|Month|Quarter|Year&lt;br /&gt;
  is_realtime : boolean&lt;br /&gt;
  actual_upto : timestamp&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate_dim&amp;quot; as AGD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * aggregate_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * field_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc&amp;quot; as RC {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc_dim&amp;quot; as RCD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * recalc_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * reg_field_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
T ||--o| R          : &amp;quot;є регістром&amp;quot;&lt;br /&gt;
T ||--o{ RR         : &amp;quot;тип документа&amp;quot;&lt;br /&gt;
R ||--|{ F          : &amp;quot;має поля&amp;quot;&lt;br /&gt;
R ||--o{ RR         : &amp;quot;реєстратори&amp;quot;&lt;br /&gt;
R ||--o{ AG         : &amp;quot;агрегати&amp;quot;&lt;br /&gt;
AG ||--|{ AGD       : &amp;quot;склад вимірювань&amp;quot;&lt;br /&gt;
F  ||--o{ AGD       : &amp;quot;вимірювання&amp;quot;&lt;br /&gt;
R ||--o{ RC         : &amp;quot;перерахунки&amp;quot;&lt;br /&gt;
RC ||--|{ RCD       : &amp;quot;вимірювання перерахунку&amp;quot;&lt;br /&gt;
F  ||--o{ RCD       : &amp;quot;відповідає&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план рахунків&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план видів розрахунку&amp;quot;&lt;br /&gt;
R }o--o| R          : &amp;quot;графік часу&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.2. ER-модель: регістр накопичення (вид «Залишки») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
skinparam defaultFontName &amp;quot;DejaVu Sans&amp;quot;&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0002\n«ПрихіднаНакладна»&amp;quot; as D1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;doc_0003\n«ВидатковаНакладна»&amp;quot; as D2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0001\n«Номенклатура»&amp;quot; as C1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0004\n«Склади»&amp;quot; as C2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012\n«ТовариНаСкладах» (рухи)&amp;quot; as M {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * mvt : smallint  «0=Прихід,1=Витрата»&lt;br /&gt;
  * d1_r : uuid  «Номенклатура» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid  «Склад» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint «Партія:тип»&lt;br /&gt;
  * d3_r : uuid  «Партія:посилання»&lt;br /&gt;
  * d4_r : uuid  «Характеристика» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * r1 : numeric(15,3) «Кількість»&lt;br /&gt;
  * r2 : numeric(15,2) «Сума»&lt;br /&gt;
  a1 : varchar(200) «Коментар»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tb\nпідсумки залишків&amp;quot; as TB {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * r1 : numeric(20,3) «Кількість (±)»&lt;br /&gt;
  * r2 : numeric(20,2) «Сума (±)»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tt\nпідсумки оборотів&amp;quot; as TT {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_in, r1_out : numeric(20,3)&lt;br /&gt;
  r2_in, r2_out : numeric(20,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_opt&amp;quot; as OPT {&lt;br /&gt;
  * id : smallint = 1 &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * totals_actual_to : timestamp(0)&lt;br /&gt;
  use_bal_totals : boolean&lt;br /&gt;
  use_tno_totals : boolean&lt;br /&gt;
  min_period : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
D1 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
D2 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
C1 ||--o{ M : &amp;quot;d1_r&amp;quot;&lt;br /&gt;
C2 ||--o{ M : &amp;quot;d2_r&amp;quot;&lt;br /&gt;
M }o..|| TB : &amp;quot;агрегується в\n(підтримується платформою)&amp;quot;&lt;br /&gt;
M }o..|| TT : &amp;quot;агрегується в&amp;quot;&lt;br /&gt;
OPT ||..|| TB : &amp;quot;ТА підсумків&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note bottom of M&lt;br /&gt;
  PK = (rec_t, rec_r, line_no)&lt;br /&gt;
  → усі рухи одного документа&lt;br /&gt;
    фізично суміжні&lt;br /&gt;
  Партиціонування: RANGE(period)&lt;br /&gt;
end note&lt;br /&gt;
&lt;br /&gt;
note bottom of TB&lt;br /&gt;
  period = MAXPERIOD (&#039;5999-11-01&#039;)&lt;br /&gt;
  → рядок «залишок за всі періоди»&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.3. ER-модель: регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
skinparam defaultFontName &amp;quot;DejaVu Sans&amp;quot;&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;coa_0005\n«План рахунків»&amp;quot; as A {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  parent_ref : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * code : varchar(20) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  order_code : varchar(40)&lt;br /&gt;
  * name : varchar(150)&lt;br /&gt;
  * acc_type : smallint «Акт/Пас/АП»&lt;br /&gt;
  off_balance : boolean&lt;br /&gt;
  ed_count : smallint&lt;br /&gt;
  fl_qty, fl_cur : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;coa_0005_ed\n«Види субконто рахунку»&amp;quot; as AE {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * ed_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  only_tno : boolean&lt;br /&gt;
  sum_flag : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cvt_0009\n«ПВХ.ВидиСубконто»&amp;quot; as VT {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  value_type : text&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020\n«Госпрозрахунковий» (проводки)&amp;quot; as J {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * acc_dt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid «Організація (балансове)»&lt;br /&gt;
  * d2_dt_r : uuid «Підрозділ Дт»&lt;br /&gt;
  * d2_kt_r : uuid «Підрозділ Кт»&lt;br /&gt;
  ed_dt1_t/_r .. ed_dt3_t/_r : «субконто Дт»&lt;br /&gt;
  ed_dt_h : bigint&lt;br /&gt;
  ed_kt1_t/_r .. ed_kt3_t/_r : «субконто Кт»&lt;br /&gt;
  ed_kt_h : bigint&lt;br /&gt;
  * r1 : numeric(20,2) «Сума (балансовий)»&lt;br /&gt;
  r2_dt, r2_kt : numeric(20,3) «Кількість»&lt;br /&gt;
  r3_dt, r3_kt : numeric(20,2) «ВалютнаСума»&lt;br /&gt;
  a1 : varchar(255) «Зміст»&lt;br /&gt;
  a2_r : uuid «Валюта»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb0\nзалишки, рівень 0&amp;quot; as B0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric «знакові»&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb1..tb3\nзалишки, рівні 1..3&amp;quot; as B1 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * ed1_t, ed1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed2_t, ed2_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed3_t, ed3_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tt0..tt3\nобороти за рівнями&amp;quot; as T0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed…) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_dt, r1_kt&lt;br /&gt;
  r2_dt, r2_kt&lt;br /&gt;
  r3_dt, r3_kt&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tc\nобороти Дт↔Кт&amp;quot; as TC {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_dt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric(24,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
A ||--o{ AE : &amp;quot;види субконто&amp;quot;&lt;br /&gt;
VT ||--o{ AE : &amp;quot;тип субконто&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_dt_r&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_kt_r&amp;quot;&lt;br /&gt;
A ||--o{ B0 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
A ||--o{ B1 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
J }o..|| B0 : &amp;quot;агрегується (Дт: +, Кт: −)&amp;quot;&lt;br /&gt;
J }o..|| B1 : &amp;quot;агрегується, якщо ed_count ≥ k&amp;quot;&lt;br /&gt;
J }o..|| T0 : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
J }o..|| TC : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note right of J&lt;br /&gt;
  Балансовий ресурс r1 — одне значення,&lt;br /&gt;
  контроль Σ(Дт) = Σ(Кт) у межах реєстратора.&lt;br /&gt;
  Небалансові ресурси — пара Дт/Кт.&lt;br /&gt;
  Субконто — слоти (див. Рішення №2).&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.4. ER-модель: регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
skinparam defaultFontName &amp;quot;DejaVu Sans&amp;quot;&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;pct_0011\n«ПВР.ОсновніНарахування»&amp;quot; as P {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_dependency : varchar(24)&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_base\n«Базові види розрахунку»&amp;quot; as PB {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * base_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_displace\n«Витісняючі види розрахунку»&amp;quot; as PD {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * displacing_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_lead\n«Ведучі види розрахунку»&amp;quot; as PL {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * leading_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040\n«Нарахування» (рухи)&amp;quot; as CR {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0) «період реєстрації»&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * reversal : boolean «Сторно»&lt;br /&gt;
  * calc_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * act_begin : timestamp(0)&lt;br /&gt;
  * act_end : timestamp(0)&lt;br /&gt;
  base_begin : timestamp(0)&lt;br /&gt;
  base_end : timestamp(0)&lt;br /&gt;
  * d1_r : uuid «Співробітник (базове)»&lt;br /&gt;
  * d2_r : uuid «Підрозділ»&lt;br /&gt;
  r1 : numeric «Результат»&lt;br /&gt;
  r2 : numeric «ВідпрацьованоДнів»&lt;br /&gt;
  r3 : numeric «НормаДнів»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_ap\nфактичні періоди дії&amp;quot; as AP {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * interval_no : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * calc_type_r : uuid&lt;br /&gt;
  * d1_r : uuid&lt;br /&gt;
  * fact_begin : timestamp(0)&lt;br /&gt;
  * fact_end : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_rc1\n«ПерерахунокЗаБазою»&amp;quot; as RC {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * calc_type_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  src_rec_t, src_rec_r&lt;br /&gt;
  created_at&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_i_0015\n«ГрафікРоботи» (РВ)&amp;quot; as SCH {&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ВидГрафіка»&lt;br /&gt;
  * d2_d : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ДатаГрафіка»&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric «Значення»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0007\n«НарахуванняЗарплати»&amp;quot; as DOC {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number, date, posted&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
P ||--o{ CR  : &amp;quot;calc_type_r&amp;quot;&lt;br /&gt;
P ||--o{ PB  : &amp;quot;базові&amp;quot;&lt;br /&gt;
P ||--o{ PD  : &amp;quot;витісняючі&amp;quot;&lt;br /&gt;
P ||--o{ PL  : &amp;quot;ведучі&amp;quot;&lt;br /&gt;
DOC ||..o{ CR : &amp;quot;реєстратор&amp;quot;&lt;br /&gt;
CR ||--|{ AP : &amp;quot;1 запис → 0..N\nфактичних інтервалів&amp;quot;&lt;br /&gt;
CR }o..o{ RC : &amp;quot;потребує перерахунку&amp;quot;&lt;br /&gt;
SCH }o..o{ CR : &amp;quot;ДаніГрафіка\n(віртуальна таблиця)&amp;quot;&lt;br /&gt;
CR }o..o{ CR : &amp;quot;БазаРозрахунку\n(self-join через PB\nта базові вимірювання)&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.5. Зведена концептуальна ER (усі типи) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph ER {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=record, fontname=&amp;quot;DejaVu Sans&amp;quot;, fontsize=9, style=filled];&lt;br /&gt;
  edge [fontname=&amp;quot;DejaVu Sans&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  MD  [label=&amp;quot;{md_register|id (PK)\lname\lkind\lperiodicity\lwrite_mode\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDF [label=&amp;quot;{md_register_field|register_id (PK,FK)\lid (PK)\lname\lrole\ldata_type\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDR [label=&amp;quot;{md_register_recorder|register_id (PK,FK)\ldoc_type_id (PK,FK)\l}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  DOC [label=&amp;quot;{doc_XXXX (Документ)|ref (PK)\lnumber\ldate\lposted\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  CAT [label=&amp;quot;{cat_XXXX (Довідник)|ref (PK)\lcode\lname\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  COA [label=&amp;quot;{coa_XXXX (План рахунків)|ref (PK)\lcode\lacc_type\led_count\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  PCT [label=&amp;quot;{pct_XXXX (ПВР)|ref (PK)\lcode\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI  [label=&amp;quot;{rg_i_XXXX (РВ)|period (PK*)\ld1..dN (PK*)\l| rec_t,rec_r,line_no (PK**)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA  [label=&amp;quot;{rg_a_XXXX (РН)|rec_t, rec_r, line_no (PK)\lperiod\lactive\lmvt\ld1..dN\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  RAT [label=&amp;quot;{rg_a_XXXX_tb / _tt|period (PK)\ld1..dN (PK)\lsplitter (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  RB  [label=&amp;quot;{rg_b_XXXX (РБ)|rec_t, rec_r, line_no (PK)\lperiod, active\lacc_dt_r, acc_kt_r\led_dt1..3, ed_kt1..3\ld1..dN\lr1, r2_dt/r2_kt\l}&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RBT [label=&amp;quot;{rg_b_XXXX_tb0..tbK\lrg_b_XXXX_tt0..ttK\lrg_b_XXXX_tc|period, acc_r, d1..dN\led1..edK (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;];&lt;br /&gt;
  RC  [label=&amp;quot;{rg_c_XXXX (РР)|rec_t, rec_r, line_no (PK)\lperiod, active, reversal\lcalc_type_r\lact_begin, act_end\lbase_begin, base_end\ld1..dN, r1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
  RCA [label=&amp;quot;{rg_c_XXXX_ap|rec_t,rec_r,line_no (PK,FK)\linterval_no (PK)\lfact_begin, fact_end\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
  RCR [label=&amp;quot;{rg_c_XXXX_rc1..rcM|rec_t, rec_r (PK)\lcalc_type_r (PK)\ld1..dN (PK)\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  MD  -&amp;gt; MDF [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; MDR [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MDR -&amp;gt; DOC [label=&amp;quot;тип&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; COA [label=&amp;quot;0:1 план рахунків&amp;quot;, style=dashed];&lt;br /&gt;
  MD  -&amp;gt; PCT [label=&amp;quot;0:1 ПВР&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  MD -&amp;gt; RI [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RA [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RB [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RC [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
&lt;br /&gt;
  DOC -&amp;gt; RI [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RA [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RB [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RC [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  CAT -&amp;gt; RI [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  CAT -&amp;gt; RA [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  COA -&amp;gt; RB [label=&amp;quot;FK рахунок&amp;quot;];&lt;br /&gt;
  PCT -&amp;gt; RC [label=&amp;quot;FK вид розрах.&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RA -&amp;gt; RAT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RB -&amp;gt; RBT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RC -&amp;gt; RCA [label=&amp;quot;витіснення → 1:N&amp;quot;, color=purple];&lt;br /&gt;
  RC -&amp;gt; RCR [label=&amp;quot;реєстрація перерахунків&amp;quot;, color=purple, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  { rank=same; MD; MDF; MDR; }&lt;br /&gt;
  { rank=same; RI; RA; RB; RC; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Легенда:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;(PK*)&amp;lt;/code&amp;gt; — ключ для незалежного РВ; &amp;lt;code&amp;gt;(PK**)&amp;lt;/code&amp;gt; — для підпорядкованого.&lt;br /&gt;
* Пунктир «реєстратор» — логічний зв&#039;язок без FK (поліморфне посилання, підтримується платформою).&lt;br /&gt;
* Пунктир «генерує DDL» — метадані → фізична схема (не зв&#039;язок даних).&lt;br /&gt;
&lt;br /&gt;
= 10. Ключові алгоритми =&lt;br /&gt;
&lt;br /&gt;
== 10.1. Запис набору записів (режим «Заміщати») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def write_record_set(reg: Register, rs: RecordSet, replace: bool = True) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Розділ 7.1, ФТ-01…ФТ-04. Уся операція — в одній транзакції.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    check_rights(reg, Right.INSERT | Right.UPDATE)              # ФТ-37&lt;br /&gt;
    validate(reg, rs)                                           # реєстратор ∈ md_register_recorder;&lt;br /&gt;
                                                                # deny_empty; для РБ — Σ Дт = Σ Кт&lt;br /&gt;
    with conn.begin():                                          # ФТ-03: одна транзакція&lt;br /&gt;
        old = read_for_update(reg, rs.filter)                   # SELECT ... FOR UPDATE&lt;br /&gt;
&lt;br /&gt;
        # АП-2: дельта рахується набором, один раз; тільки active-записи&lt;br /&gt;
        delta = aggregate(rs.active_records, sign=+1) + aggregate(old, sign=-1)&lt;br /&gt;
&lt;br /&gt;
        if replace:                                             # ФТ-04&lt;br /&gt;
            conn.execute(delete(tbl).where(*rs.filter.clauses))  # 1 запит&lt;br /&gt;
        conn.execute(insert(tbl), rs.as_dicts())                 # 1 executemany (АП-1)&lt;br /&gt;
&lt;br /&gt;
        update_totals(reg, delta)                               # -&amp;gt; merge_totals(), розділи 10.2, Е.3&lt;br /&gt;
&lt;br /&gt;
        if reg.kind is RegisterKind.CALCULATION:&lt;br /&gt;
            keys = rs.affected_keys | affected_keys(old)&lt;br /&gt;
            recompute_actual_periods(reg, keys)                 # розділ 10.4&lt;br /&gt;
            register_recalculations(reg, [*rs.records, *old])   # розділ 10.5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.2. Інкрементальне оновлення підсумків залишків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Δ (delta) — тимчасова таблиця: (period_month, d1_r, d2_r, d3_t, d3_r, d4_r, dr1, dr2)&lt;br /&gt;
-- де dr = Σ (CASE WHEN mvt = 0 THEN +значення ELSE -значення END)&lt;br /&gt;
&lt;br /&gt;
-- Крок 1. Кумулятивні залишки: рух у місяці M впливає на підсумки всіх періодів &amp;gt; M&lt;br /&gt;
--         та на рядок MAXPERIOD.&lt;br /&gt;
INSERT INTO rg_a_0012_tb AS t (period, splitter, d1_r, d2_r, d3_t, d3_r, d4_r, r1, r2)&lt;br /&gt;
SELECT p.period, :splitter, d.d1_r, d.d2_r, d.d3_t, d.d3_r, d.d4_r, d.dr1, d.dr2&lt;br /&gt;
FROM   delta d&lt;br /&gt;
CROSS  JOIN LATERAL (&lt;br /&gt;
         SELECT period FROM totals_periods&lt;br /&gt;
         WHERE period &amp;gt;  d.period_month&lt;br /&gt;
           AND period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
         UNION ALL SELECT TIMESTAMP &#039;5999-11-01&#039;      -- MAXPERIOD&lt;br /&gt;
       ) p&lt;br /&gt;
ORDER BY 1,3,4,5,6,7                                   -- детермінований порядок → без дедлоків&lt;br /&gt;
ON CONFLICT (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
DO UPDATE SET r1 = t.r1 + EXCLUDED.r1,&lt;br /&gt;
              r2 = t.r2 + EXCLUDED.r2;&lt;br /&gt;
&lt;br /&gt;
-- Крок 2. Прибирання нульових рядків (регламентно, не в транзакції проведення)&lt;br /&gt;
DELETE FROM rg_a_0012_tb WHERE r1 = 0 AND r2 = 0 AND period &amp;lt;&amp;gt; TIMESTAMP &#039;5999-11-01&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Оптимізація.&#039;&#039;&#039; Крок 1 у наведеному вигляді має складність O(кількість_періодів_після_руху). Для рухів «заднім числом» на роки це дорого. &#039;&#039;&#039;Проєктне рішення №3:&#039;&#039;&#039; підсумки оновлюються тільки для рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; і для найближчої межі періоду; повні кумулятивні зрізи перебудовуються регламентним завданням «Перерахунок підсумків» за зміненими місяцями (список змінених місяців накопичується в &amp;lt;code&amp;gt;rg_a_0012_opt.dirty_months&amp;lt;/code&amp;gt;). Запити на дату в «брудному» місяці автоматично перемикаються на розрахунок від найближчого чистого зрізу. Остаточний вибір — за результатами НТ-02.}}&lt;br /&gt;
&lt;br /&gt;
== 10.3. Трансляція віртуальної таблиці «Залишки» ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрНакопичення.ТовариНаСкладах.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад)&lt;br /&gt;
WITH boundary AS (&lt;br /&gt;
    SELECT COALESCE(MAX(period), TIMESTAMP &#039;0001-01-01&#039;) AS p&lt;br /&gt;
    FROM   totals_periods&lt;br /&gt;
    WHERE  period &amp;lt;= :Період&lt;br /&gt;
      AND  period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
),&lt;br /&gt;
base AS (                                    -- залишок на межу періоду з підсумків&lt;br /&gt;
    SELECT t.d1_r, t.d2_r, t.d3_t, t.d3_r, t.d4_r,&lt;br /&gt;
           SUM(t.r1) AS r1, SUM(t.r2) AS r2&lt;br /&gt;
    FROM   rg_a_0012_tb t, boundary b&lt;br /&gt;
    WHERE  t.period = b.p&lt;br /&gt;
      AND  t.d2_r  = :Склад                  -- push-down параметра ВТ&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
),&lt;br /&gt;
tail AS (                                    -- «живі» рухи після межі й до &amp;amp;Період&lt;br /&gt;
    SELECT m.d1_r, m.d2_r, m.d3_t, m.d3_r, m.d4_r,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r1 ELSE -m.r1 END) AS r1,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r2 ELSE -m.r2 END) AS r2&lt;br /&gt;
    FROM   rg_a_0012 m, boundary b&lt;br /&gt;
    WHERE  m.active&lt;br /&gt;
      AND  m.period &amp;gt;  b.p&lt;br /&gt;
      AND  m.period &amp;lt;= :Період&lt;br /&gt;
      AND  m.d2_r   =  :Склад&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
)&lt;br /&gt;
SELECT d1_r AS &amp;quot;Номенклатура&amp;quot;, d2_r AS &amp;quot;Склад&amp;quot;,&lt;br /&gt;
       d3_t, d3_r AS &amp;quot;Партія&amp;quot;, d4_r AS &amp;quot;Характеристика&amp;quot;,&lt;br /&gt;
       SUM(r1) AS &amp;quot;КількістьЗалишок&amp;quot;,&lt;br /&gt;
       SUM(r2) AS &amp;quot;СумаЗалишок&amp;quot;&lt;br /&gt;
FROM  (SELECT * FROM base UNION ALL SELECT * FROM tail) u&lt;br /&gt;
GROUP BY 1,2,3,4,5&lt;br /&gt;
HAVING SUM(r1) &amp;lt;&amp;gt; 0 OR SUM(r2) &amp;lt;&amp;gt; 0;         -- нульові залишки не повертаються&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Оптимізація для найчастішого випадку:&#039;&#039;&#039; якщо &amp;lt;code&amp;gt;:Період ≥ ТА&amp;lt;/code&amp;gt; і в регістрі немає рухів у майбутньому — &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; читається з рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; одним index seek, &amp;lt;code&amp;gt;tail&amp;lt;/code&amp;gt; = ∅.&lt;br /&gt;
&lt;br /&gt;
== 10.4. Розрахунок фактичних періодів дії (витіснення) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def recompute_actual_periods(reg: Register, keys: set[DimKey]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Розділ 7.5.1, ФТ-22…ФТ-24. Тут — оркестрація; сам алгоритм — Додаток Е.5.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tbl = schema.movements(reg)&lt;br /&gt;
    ap = schema.actual_periods(reg)                     # rg_c_&amp;lt;id&amp;gt;_ap&lt;br /&gt;
&lt;br /&gt;
    # 1. Читання всіх записів зачеплених ключів — ОДИН запит (АП-1)&lt;br /&gt;
    records = conn.execute(&lt;br /&gt;
        select(tbl).where(tbl.c.active, dim_key_in(tbl, keys))&lt;br /&gt;
    ).all()&lt;br /&gt;
&lt;br /&gt;
    # 2. Перерахунок інтервалів. Гарячий шлях: бюджет ≤ 3 c (АП-4),&lt;br /&gt;
    #    реалізація за Protocol-інтерфейсом (АП-3) — див. Е.5.&lt;br /&gt;
    #    Пріоритет: A витісняється B, якщо B ∈ ПВР[A].ВитісняючіВидиРозрахунку&lt;br /&gt;
    intervals = displacement_engine.compute(records, displaces=plan.displaces)&lt;br /&gt;
&lt;br /&gt;
    # 3. Заміщення фактичних періодів — два запити на весь набір, не на запис&lt;br /&gt;
    conn.execute(delete(ap).where(record_key_in(ap, intervals.keys())))&lt;br /&gt;
    conn.execute(insert(ap), [&lt;br /&gt;
        {&amp;quot;rec_t&amp;quot;: k.rec_t, &amp;quot;rec_r&amp;quot;: k.rec_r, &amp;quot;line_no&amp;quot;: k.line_no,&lt;br /&gt;
         &amp;quot;interval_no&amp;quot;: n, &amp;quot;calc_type_r&amp;quot;: k.calc_type, &amp;quot;d1_r&amp;quot;: k.base_dim,&lt;br /&gt;
         &amp;quot;fact_begin&amp;quot;: begin, &amp;quot;fact_end&amp;quot;: end}&lt;br /&gt;
        for k, ivs in intervals.items()&lt;br /&gt;
        for n, (begin, end) in enumerate(ivs)            # 1 запис -&amp;gt; 0..N інтервалів&lt;br /&gt;
    ])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Складність:&#039;&#039;&#039; O(|Z|² ) на ключ. Обмеження: якщо &amp;lt;code&amp;gt;|Z| &amp;gt; 500&amp;lt;/code&amp;gt; для одного ключа — попередження в журналі та перехід на алгоритм замітання (sweep line) O(|Z| log |Z|).&lt;br /&gt;
&lt;br /&gt;
== 10.5. Реєстрація перерахунків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def register_recalculations(reg: Register, changed: Sequence[CalcRecord]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Розділ 7.5.3, ФТ-26. АП-2: пошук залежних виконує СКБД, а не цикл у Python.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    q = schema.movements(reg).alias(&amp;quot;q&amp;quot;)&lt;br /&gt;
    b = schema.calc_plan_base(reg).alias(&amp;quot;b&amp;quot;)           # ТЧ «БазовіВидиРозрахунку» ПВР&lt;br /&gt;
&lt;br /&gt;
    for recalc in reg.recalculations:&lt;br /&gt;
        rc = schema.recalc_table(reg, recalc)           # rg_c_&amp;lt;id&amp;gt;_rc&amp;lt;n&amp;gt;&lt;br /&gt;
        src = values_of(changed).alias(&amp;quot;src&amp;quot;)           # змінені записи як VALUES-таблиця&lt;br /&gt;
&lt;br /&gt;
        # інтервальний предикат залежно від режиму базового періоду&lt;br /&gt;
        if reg.base_period == &amp;quot;ByActionPeriod&amp;quot;:&lt;br /&gt;
            in_base = and_(src.c.act_begin &amp;lt;= q.c.base_end,&lt;br /&gt;
                           src.c.act_end &amp;gt;= q.c.base_begin)     # перетин періодів&lt;br /&gt;
        else:                                                    # ByRegistrationPeriod&lt;br /&gt;
            in_base = src.c.period.between(q.c.base_begin, q.c.base_end)&lt;br /&gt;
&lt;br /&gt;
        dependent = (&lt;br /&gt;
            select(q.c.rec_t, q.c.rec_r, q.c.calc_type_r,&lt;br /&gt;
                   *[q.c[c] for c in recalc.dim_columns],&lt;br /&gt;
                   src.c.rec_t.label(&amp;quot;src_rec_t&amp;quot;), src.c.rec_r.label(&amp;quot;src_rec_r&amp;quot;))&lt;br /&gt;
            .select_from(&lt;br /&gt;
                src.join(b, b.c.base_type_r == src.c.calc_type_r)   # z — базовий для q&lt;br /&gt;
                   .join(q, q.c.calc_type_r == b.c.ref))&lt;br /&gt;
            .where(q.c.active, in_base,&lt;br /&gt;
                   *[q.c[c] == src.c[c] for c in recalc.dim_columns],&lt;br /&gt;
                   tuple_(q.c.rec_t, q.c.rec_r) != tuple_(src.c.rec_t, src.c.rec_r))&lt;br /&gt;
            .distinct()&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        stmt = pg_insert(rc).from_select(list(rc.columns.keys()), dependent)&lt;br /&gt;
        conn.execute(stmt.on_conflict_do_nothing())     # 1 запит на перерахунок (АП-1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.6. Зріз останніх ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрВідомостей.КурсиВалют.ЗрізОстанніх(&amp;amp;Дата, Валюта В (&amp;amp;Список))&lt;br /&gt;
SELECT DISTINCT ON (r.d1_r)&lt;br /&gt;
       r.d1_r AS &amp;quot;Валюта&amp;quot;, r.period AS &amp;quot;Період&amp;quot;, r.r1 AS &amp;quot;Курс&amp;quot;, r.r2 AS &amp;quot;Кратність&amp;quot;&lt;br /&gt;
FROM   rg_i_0007 r&lt;br /&gt;
WHERE  r.period &amp;lt;= :Дата&lt;br /&gt;
  AND  r.d1_r = ANY (:Список)&lt;br /&gt;
ORDER  BY r.d1_r, r.period DESC;       -- використовує ix_rg_i_0007_d1 (d1_r, period DESC)&lt;br /&gt;
-- Для MS SQL: ROW_NUMBER() OVER (PARTITION BY d1_r ORDER BY period DESC) = 1&lt;br /&gt;
--             або OUTER APPLY (SELECT TOP 1 ...) для великих списків.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 11. Нефункціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 11.1. Продуктивність ==&lt;br /&gt;
Еталонний стенд: 16 vCPU, 128 ГБ RAM, NVMe, PostgreSQL 15, БД 1,5 ТБ.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Операція !! Обсяг !! Ціль (P95)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01 || Залишки на поточну дату, відбір за 1 вимірюванням || 1 млрд рухів, 20 млн рядків підсумків || ≤ 200 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-02 || Залишки на довільну дату в межах ТА || те саме || ≤ 400 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-03 || Обороти за 12 місяців із групуванням || 1 млрд рухів || ≤ 2 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-04 || Проведення документа зі 100 рядками рухів (3 регістри) || — || ≤ 300 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-05 || Оборотно-сальдова відомість по всіх рахунках за місяць || 200 млн проводок || ≤ 5 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-06 || Розрахунок ЗП: 10 000 співробітників × 8 видів розрахунку || — || ≤ 10 хв&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-07 || Зріз останніх по 5 000 елементів вимірювання || 50 млн записів РВ || ≤ 500 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-08 || Пропускна здатність проведення || — || ≥ 50 док/с (10 паралельних сеансів)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-09 || Перерахунок підсумків РН || 1 млрд рухів || ≤ 4 год (у вікні обслуговування)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Вплив мови ядра.&#039;&#039;&#039; Цілі НФВ-01…НФВ-09 сформульовані для архітектури, де обчислює СКБД, а Python-ядро лише формує SQL (принципи АП-1, АП-2). Аналіз частки Python у кожній цілі — розділ 4.4.2: максимум 5 % (НФВ-04), запас на НФВ-06 — ×40. &#039;&#039;&#039;Цілі не переглядаються у зв&#039;язку з вибором Python.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
== 11.2. Масштабованість і обсяги ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Макс. записів в одному регістрі || 10&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Макс. кількість регістрів у конфігурації || 2 000&lt;br /&gt;
|-&lt;br /&gt;
| Макс. одночасних сеансів проведення || 200&lt;br /&gt;
|-&lt;br /&gt;
| Секціонування || Обов&#039;язкове для таблиць &amp;gt; 100 млн записів&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 11.3. Надійність і цілісність ==&lt;br /&gt;
* НФВ-10. Рухи та реєстратор змінюються в одній транзакції БД; часткове проведення неможливе.&lt;br /&gt;
* НФВ-11. Аварійне завершення сервера не залишає підсумки неузгодженими (гарантується транзакцією).&lt;br /&gt;
* НФВ-12. Сервіс перевірки цілісності (ФТ-41) виконується регламентно; розбіжність підсумків = інцидент P1.&lt;br /&gt;
&lt;br /&gt;
== 11.4. Супроводжуваність ==&lt;br /&gt;
* НФВ-13. Реструктуризація регістру (додавання ресурсу/реквізиту) для таблиці ≤ 100 млн записів — ≤ 30 хв.&lt;br /&gt;
* НФВ-14. Додавання вимірювання вимагає перебудови підсумків; система повинна попереджати про оцінку часу до початку операції.&lt;br /&gt;
* НФВ-15. Усі DDL-операції — ідемпотентні та скриптовані (можливість застосувати вручну).&lt;br /&gt;
&lt;br /&gt;
== 11.5. Сумісність ==&lt;br /&gt;
* НФВ-16. PostgreSQL 14+ та MS SQL Server 2019+ — обидві платформи з однаковою функціональністю.&lt;br /&gt;
* НФВ-17. Генератор DDL ізольований у шар «діалект СКБД».&lt;br /&gt;
&lt;br /&gt;
= 12. Міграція існуючих структур K2 ERP =&lt;br /&gt;
&lt;br /&gt;
== 12.1. Етапи ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Етап !! Результат&lt;br /&gt;
|-&lt;br /&gt;
| М1 || Інвентаризація || Реєстр наявних «регістроподібних» таблиць K2 з класифікацією за типом-мішенню (РВ/РН/РБ/РР).&lt;br /&gt;
|-&lt;br /&gt;
| М2 || Мапінг || Для кожної таблиці — метаопис цільового регістру + правила перетворення колонок.&lt;br /&gt;
|-&lt;br /&gt;
| М3 || Створення регістрів || Генерація метаданих і DDL у тестовому контурі.&lt;br /&gt;
|-&lt;br /&gt;
| М4 || Перенесення даних || ETL: історичні дані → рухи, з призначенням реєстратора (реальний документ або службовий «ВведенняЗалишків»).&lt;br /&gt;
|-&lt;br /&gt;
| М5 || Побудова підсумків || Повний перерахунок.&lt;br /&gt;
|-&lt;br /&gt;
| М6 || Звірка || Порівняння залишків/оборотів «стара система vs нова» на контрольних датах; допуск розбіжності = 0.&lt;br /&gt;
|-&lt;br /&gt;
| М7 || Перемикання коду || Заміна прямих SQL-звернень на віртуальні таблиці; період паралельної роботи ≥ 1 звітний період.&lt;br /&gt;
|-&lt;br /&gt;
| М8 || Виведення з експлуатації || Видалення старих таблиць після 2 закритих періодів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 12.2. Проблемні випадки ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Випадок !! Рішення&lt;br /&gt;
|-&lt;br /&gt;
| Історичні записи без документа-джерела || Службовий документ &amp;lt;code&amp;gt;ВведенняЗалишків&amp;lt;/code&amp;gt; (один на період/розділ).&lt;br /&gt;
|-&lt;br /&gt;
| Записи з дублями за ключем (для незалежного РВ) || Дедуплікація з протоколом; конфлікти — на ручний розбір.&lt;br /&gt;
|-&lt;br /&gt;
| Дробові періоди / некоректні дати (NULL, 1900-01-01) || Нормалізація до MINPERIOD; протокол.&lt;br /&gt;
|-&lt;br /&gt;
| Прикладний код, що пише в таблиці напряму || Заборона на рівні прав БД після М7; аудит звернень на етапі М3–М6.&lt;br /&gt;
|-&lt;br /&gt;
| Аналітика, відсутня в цільовій моделі || Перенесення в реквізити (не у вимірювання) або відмова від міграції з обґрунтуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 13. Приймальні випробування =&lt;br /&gt;
&lt;br /&gt;
== 13.1. Функціональні тести (витяг) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Сценарій !! Очікуваний результат&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-01 || Створити РВ періодичний незалежний, записати 2 записи з однаковим ключем || Другий запис заміщує перший; у таблиці 1 рядок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-02 || Провести документ → 5 рухів РН || 5 записів у &amp;lt;code&amp;gt;rg_a_*&amp;lt;/code&amp;gt;; підсумки MAXPERIOD змінилися на суму дельти&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-03 || Скасувати проведення || 0 записів; підсумки повернулися до вихідних значень&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-04 || Видалити документ-реєстратор || Рухи видалені каскадно; перевірка цілісності — 0 помилок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-05 || Записати рух заднім числом (−6 міс.) || Залишки на всі дати після руху коректні (звірка з повним перерахунком)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-06 || Установити &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; || Запис не впливає на віртуальні таблиці; підсумки скориговані&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-07 || РБ: провести незбалансовану проводку (Дт ≠ Кт за балансовим ресурсом) || Помилка проведення, транзакція відкочена&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-08 || РБ: ОСВ по рахунку з 3 субконто || Підсумки за рівнями 0–3 узгоджені між собою (згортка tb3 → tb0)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-09 || РР: сценарій «Оклад + Відпустка + Лікарняний» (розд. 7.5.1) || Фактичні періоди дії відповідають еталону; «Оклад» дає 2 інтервали&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-10 || РР: зміна базового запису || У таблиці перерахунку з&#039;явився запис для залежного документа&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-11 || Паралельне проведення 2 документів за різними складами || Обидва проходять без очікування (розділення підсумків увімкнено)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-12 || Паралельне проведення 2 документів за одним складом і одним товаром з контролем залишків || Один чекає, другий проходить; від&#039;ємного залишку немає&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-13 || Перерахунок підсумків після хаотичних 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; операцій || Підсумки збігаються з повним перерахунком «з нуля» до копійки&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-14 || Реструктуризація: додати ресурс до РН із 10 млн записів || Дані збережені, підсумки перебудовані, час ≤ НФВ-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-15 || RLS: користувач з обмеженням по організації || Віртуальні таблиці повертають лише дозволені дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 13.2. Навантажувальні тести ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Тест !! Критерій&lt;br /&gt;
|-&lt;br /&gt;
| НТ-01 || Генерація 1 млрд рухів РН, заміри НФВ-01…НФВ-03 || Досягнення цілей&lt;br /&gt;
|-&lt;br /&gt;
| НТ-02 || Профіль «90 % рухів поточним періодом, 10 % заднім числом» — порівняння двох стратегій підсумків (розд. 10.2) || Обґрунтований вибір Рішення №3&lt;br /&gt;
|-&lt;br /&gt;
| НТ-03 || Пікове проведення 50 док/с протягом 1 год || Відсутність дедлоків; P95 ≤ НФВ-04&lt;br /&gt;
|-&lt;br /&gt;
| НТ-04 || РБ: субконто-слоти vs дочірня таблиця, 200 млн проводок || Обґрунтований вибір Рішення №2&lt;br /&gt;
|-&lt;br /&gt;
| НТ-05 || Розрахунок ЗП на 10 000 співробітників || НФВ-06&lt;br /&gt;
|-&lt;br /&gt;
| НТ-06 || Деградація за 24 год безперервної роботи || Приріст часу відгуку ≤ 15 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 14. Етапи робіт та оцінка =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Етап !! Зміст !! Результат !! Оцінка, чол.-міс. !! Залежності&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е0&#039;&#039;&#039; || Обстеження платформи, верифікація припущень П1–П6, ескізний проєкт || Затверджений архітектурний ескіз, уточнене ТЗ || 1,5 || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е1&#039;&#039;&#039; || Метамодель + репозиторій + генератор DDL + конструктор (базовий) || Створення регістру будь-якого типу з генерацією схеми || 3 || Е0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е2&#039;&#039;&#039; || Регістр відомостей: рантайм, набори записів, зрізи, форми || РВ у продуктиві || 2,5 || Е1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е3&#039;&#039;&#039; || Регістр накопичення: рухи, підсумки, ТА, віртуальні таблиці || РН у продуктиві || 5 || Е2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е4&#039;&#039;&#039; || Механізм проведення документів, блокування, оперативне/неоперативне проведення || Транзакційне проведення || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е5&#039;&#039;&#039; || Розширення мови запитів (віртуальні таблиці, транслятор, push-down) || Запити до ВТ || 3,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е6&#039;&#039;&#039; || Регістр бухгалтерії + план рахунків + субконто + підсумки за рівнями || РБ у продуктиві || 6 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е7&#039;&#039;&#039; || Регістр розрахунку + ПВР + витіснення + база + графіки + перерахунки || РР у продуктиві || 6,5 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е8&#039;&#039;&#039; || Агрегати, розділення підсумків, порадник агрегатів || Оптимізація || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е9&#039;&#039;&#039; || Права доступу, RLS, аудит, сервіси цілісності || Безпека та адміністрування || 2 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е10&#039;&#039;&#039; || Реструктуризація, міграція, інструменти звірки || Інструменти міграції || 2 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е11&#039;&#039;&#039; || Навантажувальне тестування, оптимізація, документація, &#039;&#039;&#039;профілювання Python + бенчмарки гарячих шляхів&#039;&#039;&#039; || Приймальні випробування || 4,5 || усі&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РАЗОМ&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|Оцінка орієнтовна (±40 %) і підлягає уточненню за результатами Е0. Критичний шлях: Е0 → Е1 → Е3 → Е5 → Е6/Е7 → Е11. За командою 6–8 інженерів — орієнтовно 9–11 календарних місяців.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Мінімальний життєздатний обсяг (MVP)&#039;&#039;&#039;: Е0–Е5 (РВ + РН + проведення + запити) ≈ &#039;&#039;&#039;18 чол.-міс.&#039;&#039;&#039; — покриває ~70 % прикладних сценаріїв K2 ERP.&lt;br /&gt;
&lt;br /&gt;
=== 14.1. Вплив вибору Python на оцінку ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Етап !! Було (мова не визначена) !! Стало (Python) !! Δ !! Причина&lt;br /&gt;
|-&lt;br /&gt;
| Е1 (метамодель, DDL, конструктор) || 4 || &#039;&#039;&#039;3&#039;&#039;&#039; || &#039;&#039;&#039;−1&#039;&#039;&#039; || SQLAlchemy Core закриває генерацію DDL і діалекти СКБД; Pydantic v2 — валідацію DSL. Разом ~30 % етапу — готове.&lt;br /&gt;
|-&lt;br /&gt;
| Е5 (мова запитів, транслятор) || 4 || &#039;&#039;&#039;3,5&#039;&#039;&#039; || &#039;&#039;&#039;−0,5&#039;&#039;&#039; || lark (граматика) + SQLAlchemy Core expression language замість власного AST→SQL.&lt;br /&gt;
|-&lt;br /&gt;
| Е7 (регістр розрахунку) || 6 || &#039;&#039;&#039;6,5&#039;&#039;&#039; || &#039;&#039;&#039;+0,5&#039;&#039;&#039; || Ізоляція витіснення за інтерфейсом (АП-3) + резерв на нативну реалізацію.&lt;br /&gt;
|-&lt;br /&gt;
| Е10 (реструктуризація, міграція) || 2,5 || &#039;&#039;&#039;2&#039;&#039;&#039; || &#039;&#039;&#039;−0,5&#039;&#039;&#039; || Alembic покриває автогенерацію &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Е11 (навантаження, оптимізація) || 3 || &#039;&#039;&#039;4,5&#039;&#039;&#039; || &#039;&#039;&#039;+1,5&#039;&#039;&#039; || Профілювання Python, бенчмарки бюджету АП-4, ймовірні Cython/Rust-модулі, wheels у CI.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РАЗОМ&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; || &#039;&#039;&#039;0&#039;&#039;&#039; || Економія на інфраструктурному коді компенсує витрати на оптимізацію.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Висновок:&#039;&#039;&#039; Python — &#039;&#039;&#039;нейтральний за трудомісткістю&#039;&#039;&#039; для цього проєкту. Він здешевлює те, чого тут багато (метадані, генерація схеми, абстракція діалектів, міграції), і дорожчає те, чого тут мало (гарячі CPU-цикли). Ризик зміщується з «&#039;&#039;не встигнемо написати&#039;&#039;» на «&#039;&#039;не вкладемося в бюджет часу виконання&#039;&#039;» — тому бенчмарки гарячих шляхів (АП-4) вводяться в CI &#039;&#039;&#039;з етапу Е3&#039;&#039;&#039;, а не наприкінці.&lt;br /&gt;
&lt;br /&gt;
= 15. Ризики =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Ризик !! Ймов. !! Вплив !! Пом&#039;якшення&lt;br /&gt;
|-&lt;br /&gt;
| Р1 || У K2 ERP немає власної мови запитів → віртуальні таблиці нікуди вбудовувати || Сер. || &#039;&#039;&#039;Крит.&#039;&#039;&#039; || Верифікувати на Е0. План «Б»: віртуальні таблиці як параметризовані view/TVF + шар ORM.&lt;br /&gt;
|-&lt;br /&gt;
| Р2 || Конкуренція за таблицю підсумків на піках проведення || Вис. || Вис. || Розділення підсумків (сплітери), НТ-03, детермінований порядок MERGE.&lt;br /&gt;
|-&lt;br /&gt;
| Р3 || Рухи «заднім числом» роблять оновлення підсумків O(N періодів) || Вис. || Сер. || Рішення №3 (dirty months + регламентний перерахунок), НТ-02.&lt;br /&gt;
|-&lt;br /&gt;
| Р4 || «Широка» схема субконто → реструктуризація при зміні ліміту || Сер. || Сер. || Зафіксувати ліміт 5 із запасом; НТ-04; план «Б» — дочірня таблиця.&lt;br /&gt;
|-&lt;br /&gt;
| Р5 || Механізм витіснення РР — найскладніший і найпомилковіший вузол || Вис. || Вис. || Виділити в окремий модуль з еталонним набором з 50+ тест-кейсів; property-based тестування.&lt;br /&gt;
|-&lt;br /&gt;
| Р6 || Обсяг Е6+Е7 недооцінено (досвід 1С: це роки розробки) || Вис. || Вис. || MVP-підхід: спершу Е0–Е5, рішення про Е6/Е7 — після ретроспективи.&lt;br /&gt;
|-&lt;br /&gt;
| Р7 || Різна поведінка PostgreSQL і MS SQL (плани, MERGE, ізоляція) || Сер. || Сер. || Єдиний набір тестів на обох СКБД у CI від Е1.&lt;br /&gt;
|-&lt;br /&gt;
| Р8 || Міграція історичних даних без реєстраторів || Вис. || Сер. || Службовий документ «ВведенняЗалишків»; етап звірки М6 з нульовим допуском.&lt;br /&gt;
|-&lt;br /&gt;
| Р9 || Патентні / ліцензійні претензії щодо копіювання механізмів || Низ. || Вис. || Юридична експертиза до Е1: реалізація &#039;&#039;концепцій&#039;&#039; обліку (загальновідомих), а не коду/API; уникати дослівного копіювання найменувань API та документації.&lt;br /&gt;
|-&lt;br /&gt;
| Р10 || &#039;&#039;&#039;Гарячі шляхи&#039;&#039;&#039; (витіснення, розрахунок ЗП) на чистому Python не вкладаються в бюджет АП-4 || Сер. || Сер. || Ізоляція за &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt;-інтерфейсом (АП-3) + бенчмарк у CI від Е7; готовність до Cython/Rust; альтернатива для витіснення — &amp;lt;code&amp;gt;daterange&amp;lt;/code&amp;gt;+GiST у PostgreSQL.&lt;br /&gt;
|-&lt;br /&gt;
| Р11 || &#039;&#039;&#039;Динамічна типізація в ядрі метаданих&#039;&#039;&#039; → помилки типів спливають у рантаймі на продуктиві || Вис. || Сер. || &amp;lt;code&amp;gt;mypy --strict&amp;lt;/code&amp;gt; як обов&#039;язковий gate у CI; Pydantic v2 на всіх межах; генерація &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів для прикладного коду (ФТ-К-07).&lt;br /&gt;
|-&lt;br /&gt;
| Р12 || &#039;&#039;&#039;GIL&#039;&#039;&#039; обмежує вертикальне масштабування сервера застосунків || Сер. || Низ. || АП-5: asyncio для IO + мультипроцесний пул. Розрахунок у 4.4.2 показує запас: 50 док/с ≈ 50 % одного ядра.&lt;br /&gt;
|-&lt;br /&gt;
| Р13 || &#039;&#039;&#039;Нативні розширення&#039;&#039;&#039; (Cython/Rust) ускладнюють збірку, кросплатформність і пошук інженерів || Низ. || Низ. || Вводяться тільки за результатами бенчмарку; wheels під усі цільові платформи в CI; питання В13.&lt;br /&gt;
|-&lt;br /&gt;
| Р14 || &#039;&#039;&#039;Виконання прикладного Python-коду&#039;&#039;&#039; в процесі сервера = виконання довільного коду з правами сервера (П8) || Вис. || &#039;&#039;&#039;Крит.&#039;&#039;&#039; || &#039;&#039;&#039;Питання В12 до Е0.&#039;&#039;&#039; Варіанти: (а) довірена модель — конфігурацію пише лише вендор/партнер; (б) ізоляція процесами + seccomp/AppArmor; (в) обмежений DSL замість повного Python. У 1С вбудована мова існує в т.ч. з цієї причини.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Ризик Р9 — обов&#039;язково до опрацювання перед стартом.&#039;&#039;&#039; ТЗ описує &#039;&#039;функціональні концепції&#039;&#039; (накопичувальний облік, подвійний запис, витіснення періодів дії), що є загальновідомими практиками обліку. Проте пряме відтворення пропрієтарних інтерфейсів, найменувань і структур конкретного вендора потребує окремої правової оцінки. Рекомендується узгодити з юридичною службою власну термінологію та API до початку Е1.}}&lt;br /&gt;
&lt;br /&gt;
= 16. Додатки =&lt;br /&gt;
&lt;br /&gt;
== Додаток А. Матриця відповідності «1С ↔ K2 ERP» ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Об&#039;єкт / поняття 1С !! Пропонований аналог K2 ERP !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| РегистрСведений || &amp;lt;code&amp;gt;Регістри.Відомостей.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрНакопления || &amp;lt;code&amp;gt;Регістри.Накопичення.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрБухгалтерии || &amp;lt;code&amp;gt;Регістри.Бухгалтерії.*&amp;lt;/code&amp;gt; || Субконто зберігаються інакше (слоти)&lt;br /&gt;
|-&lt;br /&gt;
| РегистрРасчета || &amp;lt;code&amp;gt;Регістри.Розрахунку.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| Регистратор || &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ВидДвижения || &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Итоги || &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Точка актуальности итогов || &amp;lt;code&amp;gt;ТА підсумків&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Разделение итогов || &amp;lt;code&amp;gt;Розділення підсумків&amp;lt;/code&amp;gt; (splitter) || —&lt;br /&gt;
|-&lt;br /&gt;
| Агрегаты || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Субконто / ПланВидовХарактеристик || &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПланВидівХарактеристик&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПланВидовРасчета || &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерасчет || &amp;lt;code&amp;gt;Перерахунок&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПериодДействия / Вытеснение || &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Витіснення&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Границя послідовності || &#039;&#039;&#039;Не реалізується&#039;&#039;&#039; || Механізм визнано застарілим; замість нього — перепроведення за списком «брудних» документів&lt;br /&gt;
|-&lt;br /&gt;
| РегистрыСведений з режимом «ПоПозицииРегистратора» || &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt; || Реалізується як (period, rec_t, rec_r, line_no) у ключі&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Б. Альтернатива зберігання субконто (план «Б» до Рішення №2) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Дочірня таблиця «ключ-значення» замість слотів&lt;br /&gt;
CREATE TABLE rg_b_0020_ed (&lt;br /&gt;
    rec_t     smallint NOT NULL,&lt;br /&gt;
    rec_r     uuid     NOT NULL,&lt;br /&gt;
    line_no   int      NOT NULL,&lt;br /&gt;
    side      smallint NOT NULL CHECK (side IN (0,1)),   -- 0=Дт, 1=Кт&lt;br /&gt;
    ed_no     smallint NOT NULL,                          -- порядковий номер субконто рахунка&lt;br /&gt;
    ed_type_r uuid     NOT NULL,                          -- вид субконто&lt;br /&gt;
    val_t     smallint NOT NULL,&lt;br /&gt;
    val_r     uuid,&lt;br /&gt;
    val_n     numeric(38,10),&lt;br /&gt;
    val_s     varchar(150),&lt;br /&gt;
    val_d     timestamp(0),&lt;br /&gt;
    PRIMARY KEY (rec_t, rec_r, line_no, side, ed_no),&lt;br /&gt;
    FOREIGN KEY (rec_t, rec_r, line_no) REFERENCES rg_b_0020 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_val ON rg_b_0020_ed (ed_type_r, val_t, val_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Критерій !! Слоти (Рішення №2) !! Дочірня таблиця (план «Б»)&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 1 субконто || Index seek по колонці || JOIN + семі-з&#039;єднання&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 3 субконто || 3 предикати в одному скані || 3 JOIN&lt;br /&gt;
|-&lt;br /&gt;
| Зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || ALTER TABLE (реструктуризація) || Без змін схеми&lt;br /&gt;
|-&lt;br /&gt;
| Розмір рядка проводки || +48 байт × 2 (Дт/Кт) || Базовий&lt;br /&gt;
|-&lt;br /&gt;
| Складність генератора DDL || Вища || Нижча&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рекомендація&#039;&#039;&#039; || &#039;&#039;&#039;Обрано за замовчуванням&#039;&#039;&#039; || Резерв за результатами НТ-04&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток В. Перелік вимог (реєстр трасування) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! ID !! Розділ !! Коротко !! Пріоритет !! Тест&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-01…ФТ-07 || 7.1 || Набори записів, проведення || Must || ФТ-Т-02…04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-08…ФТ-10 || 7.2 || Активність || Must || ФТ-Т-06&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-11…ФТ-13 || 7.3 || Віртуальні таблиці || Must || ФТ-Т-08, НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-14…ФТ-18 || 7.4 || Підсумки, ТА || Must || ФТ-Т-05, ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-19…ФТ-21 || 7.4.4 || Агрегати || Should || НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-22…ФТ-30 || 7.5 || Механіка РР || Must (для Е7) || ФТ-Т-09, ФТ-Т-10&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31…ФТ-36 || 7.7 || Блокування || Must || ФТ-Т-11, ФТ-Т-12, НТ-03&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-37…ФТ-39 || 7.8 || Права, RLS || Must || ФТ-Т-15&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-40…ФТ-42 || 7.9 || Аудит, цілісність || Should || ФТ-Т-04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-К-01…06 || 6.8.4 || Конструктор || Should || —&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01…НФВ-09 || 11.1 || Продуктивність || Must || НТ-01…НТ-06&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-10…НФВ-12 || 11.3 || Цілісність || Must || ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-13…НФВ-17 || 11.4–11.5 || Супровід, сумісність || Should || ФТ-Т-14&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Г. Відкриті питання ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Питання !! Кому !! Термін&lt;br /&gt;
|-&lt;br /&gt;
| В1 || Чи існує в K2 ERP мова запитів / транслятор у SQL? (визначає Р1 та обсяг Е5) || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В2 || Формат ідентифікації об&#039;єктів: UUID чи сурогатний int? || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В3 || Чи потрібна мілісекундна дискретність періоду? || Замовник || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В4 || Максимальна кількість субконто: 3 чи 5? || Головний бухгалтер / методолог || До Е6&lt;br /&gt;
|-&lt;br /&gt;
| В5 || Чи потрібен механізм «Границя послідовності»? (пропонується відмова) || Методолог || До Е3&lt;br /&gt;
|-&lt;br /&gt;
| В6 || Пріоритет типів регістрів: чи достатньо MVP (РВ + РН) для першого релізу? || Замовник || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В7 || Правова оцінка ризику Р9 || Юридична служба || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В8 || Цільова СКБД для першої черги: тільки PostgreSQL чи одразу обидві? || Архітектор / ІТ-експлуатація || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В9 || &#039;&#039;&#039;Міжпланова база розрахунку:&#039;&#039;&#039; чи потрібна можливість брати базу з &#039;&#039;іншого&#039;&#039; регістру розрахунку (Утримання ← ОсновніНарахування)? Якщо так — ФТ-25 і &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt; потребують розширення полем &amp;lt;code&amp;gt;base_register_id&amp;lt;/code&amp;gt; (див. Д.7.2) || Методолог ЗП / архітектор || До Е7&lt;br /&gt;
|-&lt;br /&gt;
| В10 || Чи прийнятна поведінка підпорядкованого РВ без контролю унікальності за (Період + Вимірювання)? (сумісність із 1С vs. захист від дублів — див. Д.3.2, антипатерн А-6) || Методолог || До Е2&lt;br /&gt;
|-&lt;br /&gt;
| В11 || &#039;&#039;&#039;Конфігуратор:&#039;&#039;&#039; web (FastAPI + React) чи desktop (PySide6/Qt)? Макети розділу 6.8 намальовані як desktop || Замовник / UX || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В12 || &#039;&#039;&#039;Ключове.&#039;&#039;&#039; Прикладний код — повноцінний Python чи обмежений DSL? Повний Python у процесі сервера = виконання довільного коду з правами сервера (ризик Р14) + неможливість статично перевірити конфігурацію партнера || Архітектор + служба безпеки || &#039;&#039;&#039;До Е0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| В13 || Чи допустимі нативні розширення (Cython/Rust) у складі постачання? Якщо ні — потрібен план «Б» для витіснення (SQL на &amp;lt;code&amp;gt;daterange&amp;lt;/code&amp;gt;) || ІТ-експлуатація || До Е7&lt;br /&gt;
|-&lt;br /&gt;
| В14 || Цільова версія: 3.12 чи 3.13? Чи розглядається free-threaded build (PEP 703) як шлях зняття Р12? || Архітектор || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В15 || Мова ідентифікаторів прикладного API: кирилиця (&amp;lt;code&amp;gt;rs.new(Номенклатура=…)&amp;lt;/code&amp;gt;) чи транслітерація/англійська? Впливає на ФТ-К-07 і читабельність || Замовник / методолог || До Е2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Д. Каталог прикладів регістрів ==&lt;br /&gt;
&lt;br /&gt;
Додаток містить прикладні приклади регістрів усіх типів і підвидів. Для кожного наведено: декларацію (DSL), пояснення проєктних рішень, приклад даних у фізичних таблицях і типовий запит. Приклади призначені для: (а) перевірки повноти метамоделі на етапі Е0; (б) формування набору приймальних тестів; (в) навчання прикладних розробників.&lt;br /&gt;
&lt;br /&gt;
=== Д.1. Як обрати тип регістру (дерево рішень) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Choose {&lt;br /&gt;
  rankdir=TB; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fontname=&amp;quot;DejaVu Sans&amp;quot;, fontsize=9];&lt;br /&gt;
  edge [fontname=&amp;quot;DejaVu Sans&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  q1 [label=&amp;quot;Що зберігаємо?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q2 [label=&amp;quot;Потрібні залишки\n(скільки Є зараз)?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q3 [label=&amp;quot;Подвійний запис,\nплан рахунків,\nсубконто?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q4 [label=&amp;quot;Періоди дії,\nвитіснення,\nбаза розрахунку?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q5 [label=&amp;quot;Значення прив&#039;язане\nдо документа?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  ri_i [label=&amp;quot;РВ незалежний\n(КурсиВалют,\nШтрихкоди)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  ri_s [label=&amp;quot;РВ підпорядкований\n(ЦіниНоменклатури,\nКадровіДані)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  ra_b [label=&amp;quot;РН «Залишки»\n(ТовариНаСкладах,\nВзаєморозрахунки)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  ra_t [label=&amp;quot;РН «Обороти»\n(Продажі,\nВитрати)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  rb   [label=&amp;quot;РБ\n(Госпрозрахунковий)&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  rc   [label=&amp;quot;РР\n(Нарахування,\nУтримання)&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q3 [label=&amp;quot;облікові проводки&amp;quot;];&lt;br /&gt;
  q3 -&amp;gt; rb [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q3 -&amp;gt; q4 [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
  q4 -&amp;gt; rc [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q4 -&amp;gt; q2 [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q2 [label=&amp;quot;кількісні/сумові\nрухи&amp;quot;];&lt;br /&gt;
  q2 -&amp;gt; ra_b [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q2 -&amp;gt; ra_t [label=&amp;quot;ні,\nлише обороти\nза період&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q5 [label=&amp;quot;значення\nатрибута\nв часі&amp;quot;];&lt;br /&gt;
  q5 -&amp;gt; ri_s [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q5 -&amp;gt; ri_i [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Контрольні питання при проєктуванні будь-якого регістру:&#039;&#039;&#039;&lt;br /&gt;
# Чи можна відповісти на всі прикладні питання &#039;&#039;лише&#039;&#039; полями цього регістру, без з&#039;єднання з документами? Якщо ні — бракує реквізиту (не вимірювання!).&lt;br /&gt;
# Яка &#039;&#039;кардинальність&#039;&#039; таблиці підсумків = ∏(кількість значень вимірювань) × кількість періодів? Якщо &amp;gt; 10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; — переглянути склад вимірювань.&lt;br /&gt;
# Чи потрібно фільтрувати/групувати за цим полем у звітах? Так → вимірювання. Ні, лише показувати → реквізит.&lt;br /&gt;
# Чи підсумовується поле? Так → ресурс. Ні → реквізит або вимірювання.&lt;br /&gt;
&lt;br /&gt;
=== Д.2. Зведений каталог ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! № !! Регістр !! Тип !! Підвид / режим !! Вимірювання !! Ресурси !! Розділ&lt;br /&gt;
|-&lt;br /&gt;
| 1 || КурсиВалют || РВ || Періодичний (день), незалежний || Валюта || Курс, Кратність || Д.3.1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ЦіниНоменклатури || РВ || Періодичний (день), підпорядкований || Номенклатура, Характеристика, ТипЦін || Ціна || Д.3.2&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ШтрихкодиНоменклатури || РВ || Неперіодичний, незалежний || Штрихкод || Номенклатура, Характеристика, Упаковка || Д.3.3&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ГрафікРоботи || РВ || Неперіодичний, незалежний || ВидГрафіка, ДатаГрафіка || Значення, Годин || Д.3.4&lt;br /&gt;
|-&lt;br /&gt;
| 5 || КадровіДані || РВ || По позиції реєстратора, підпорядкований || Співробітник || Підрозділ, Посада, Ставка, ВидЗайнятості || Д.3.5&lt;br /&gt;
|-&lt;br /&gt;
| 6 || НалаштуванняКористувачів || РВ || Неперіодичний, незалежний || Користувач, Налаштування || Значення (складений) || Д.3.6&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ТовариНаСкладах || РН || Залишки || Номенклатура, Склад, Партія, Характеристика || Кількість, Сума || Д.4.1&lt;br /&gt;
|-&lt;br /&gt;
| 8 || ВзаєморозрахункиЗКонтрагентами || РН || Залишки || Організація, Контрагент, Договір, Замовлення || Сума, СумаВал || Д.4.2&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ТовариВРезерві || РН || Залишки || Номенклатура, Склад, Замовлення, Характеристика || Кількість || Д.4.3&lt;br /&gt;
|-&lt;br /&gt;
| 10 || ГрошовіКоштиБезготівкові || РН || Залишки || Організація, БанківськийРахунок || Сума, СумаВал || Д.4.4&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Продажі || РН || Обороти (місяць) + агрегати || Номенклатура, Контрагент, Договір, Менеджер, Склад || Кількість, Сума, СумаБезПДВ, Собівартість || Д.5.1&lt;br /&gt;
|-&lt;br /&gt;
| 12 || ВитратиЗаСтаттями || РН || Обороти (місяць) || Організація, Підрозділ, СтаттяВитрат, Проєкт || Сума || Д.5.2&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Госпрозрахунковий || РБ || З кореспонденцією || Організація (бал.), Підрозділ (небал.) || Сума (бал.), Кількість, ВалютнаСума || Д.6.1&lt;br /&gt;
|-&lt;br /&gt;
| 14 || ПодатковийОблік || РБ || Без кореспонденції || Організація, ВидРізниці || Сума || Д.6.2&lt;br /&gt;
|-&lt;br /&gt;
| 15 || Бюджетування || РБ || З кореспонденцією || Сценарій, ЦФВ, Проєкт || Сума || Д.6.3&lt;br /&gt;
|-&lt;br /&gt;
| 16 || ОсновніНарахування || РР || Період дії + база за періодом дії || Співробітник (баз.), Підрозділ || Результат, ВідпрацьованоДнів, НормаДнів || Д.7.1&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Утримання || РР || Без періоду дії, база за періодом реєстрації || Співробітник (баз.), Підрозділ || Результат, БазаОподаткування || Д.7.2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.3. Регістри відомостей ===&lt;br /&gt;
&lt;br /&gt;
==== Д.3.1. КурсиВалют — періодичний, незалежний ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати історію курсів валют; отримувати курс на будь-яку дату.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: КурсиВалют&lt;br /&gt;
  kind: Information&lt;br /&gt;
  synonym: &amp;quot;Курси валют&amp;quot;&lt;br /&gt;
  periodicity: WithinDay            # один курс на валюту на день&lt;br /&gt;
  writeMode: Independent            # курси вводяться вручну/завантажуються з НБУ&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Курс,      type: &amp;quot;Число(15,4)&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Кратність, type: &amp;quot;Число(10,0)&amp;quot;, default: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;Independent&amp;lt;/code&amp;gt; — курс не породжується документом, він є зовнішнім фактом.&lt;br /&gt;
* &amp;lt;code&amp;gt;master: true&amp;lt;/code&amp;gt; для Валюти — при видаленні валюти курси видаляються; регістр видно у формі елемента довідника.&lt;br /&gt;
* Періодичність &amp;lt;code&amp;gt;WithinDay&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;WithinSecond&amp;lt;/code&amp;gt; — повторний запис курсу за той самий день &#039;&#039;замістить&#039;&#039; попередній, а не створить дубль.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0007&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! d1_r (Валюта) !! r1 (Курс) !! r2 (Кратність)&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-15 00:00:00 || USD || 41.8200 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-15 00:00:00 || EUR || 45.6100 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-16 00:00:00 || USD || 41.8500 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-17 00:00:00 || USD || 41.9000 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-17 00:00:00 || EUR || 45.7300 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (курс на дату документа):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ Курси.Курс, Курси.Кратність&lt;br /&gt;
З РегістрВідомостей.КурсиВалют.ЗрізОстанніх(&amp;amp;ДатаДокумента, Валюта = &amp;amp;Валюта) ЯК Курси&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# або через менеджер&lt;br /&gt;
курс = Registers.information(&amp;quot;КурсиВалют&amp;quot;).get_last(doc.Дата, {&amp;quot;Валюта&amp;quot;: doc.Валюта})&lt;br /&gt;
сума_грн: Decimal = doc.СумаВалюти * курс.Курс / курс.Кратність&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.3.2. ЦіниНоменклатури — періодичний, підпорядкований реєстратору ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати історію цін; ціна встановлюється наказом (документом), який можна скасувати.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ЦіниНоменклатури&lt;br /&gt;
  kind: Information&lt;br /&gt;
  synonym: &amp;quot;Ціни номенклатури&amp;quot;&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  writeMode: SubordinateToRecorder   # ← ключова відмінність від КурсиВалют&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: ТипЦін,         type: &amp;quot;Довідник.ТипиЦін&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Ціна, type: &amp;quot;Число(15,2)&amp;quot;, denyEmpty: true }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Валюта,   type: &amp;quot;Довідник.Валюти&amp;quot; }&lt;br /&gt;
    - { name: Одиниця,  type: &amp;quot;Довідник.ОдиниціВиміру&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ВстановленняЦінНоменклатури&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;SubordinateToRecorder&amp;lt;/code&amp;gt; — потрібна юридична прив&#039;язка ціни до наказу, можливість скасувати наказ і «відкотити» ціни одним рухом.&lt;br /&gt;
* &amp;lt;code&amp;gt;Валюта&amp;lt;/code&amp;gt; і &amp;lt;code&amp;gt;Одиниця&amp;lt;/code&amp;gt; — &#039;&#039;&#039;реквізити&#039;&#039;&#039;, а не вимірювання: за ними не фільтрують і не будують зрізи, вони визначаються типом цін. &#039;&#039;Помилка новачка&#039;&#039; — зробити Валюту вимірюванням, що подвоїть кількість записів і зламає зріз останніх.&lt;br /&gt;
* &amp;lt;code&amp;gt;Характеристика&amp;lt;/code&amp;gt; дозволяє порожнє значення — для номенклатури без характеристик.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0010&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec_t !! rec_r !! line_no !! period !! active !! d1_r (Номенкл.) !! d2_r (Характ.) !! d3_r (ТипЦін) !! r1 (Ціна) !! a1_r (Валюта)&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 1 || 2026-07-01 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 480.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 2 || 2026-07-01 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Оптова || 410.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 3 || 2026-07-01 || true || Чай Ahmad 100г || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 95.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || b7c…04 || 1 || 2026-07-15 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 495.00 || UAH&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|Зверніть увагу: у підпорядкованому РВ &#039;&#039;&#039;немає&#039;&#039;&#039; унікальності за (Період + Вимірювання). Два різні документи можуть встановити ціну на ту саму дату — платформа це дозволить, зріз останніх поверне запис із більшим &amp;lt;code&amp;gt;line_no&amp;lt;/code&amp;gt; у межах реєстратора з пізнішою позицією. Це &#039;&#039;&#039;свідома&#039;&#039;&#039; поведінка (сумісність із 1С), але прикладний розробник має контролювати дублі самостійно — див. антипатерн А-6 (Д.10).}}&lt;br /&gt;
&lt;br /&gt;
==== Д.3.3. ШтрихкодиНоменклатури — неперіодичний, незалежний ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; за штрихкодом знайти номенклатуру. Класичний приклад «вимірювання = те, &#039;&#039;за чим&#039;&#039; шукаємо; ресурс = те, що &#039;&#039;знаходимо&#039;&#039;».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ШтрихкодиНоменклатури&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Штрихкод, type: &amp;quot;Рядок(30)&amp;quot;, denyEmpty: true }     # ← ключ пошуку&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Упаковка,       type: &amp;quot;Довідник.УпаковкиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0011 (&lt;br /&gt;
    d1_s  varchar(30) NOT NULL,      -- Штрихкод&lt;br /&gt;
    r1_r  uuid        NOT NULL,      -- Номенклатура&lt;br /&gt;
    r2_r  uuid        NOT NULL,      -- Характеристика&lt;br /&gt;
    r3_r  uuid        NOT NULL,      -- Упаковка&lt;br /&gt;
    CONSTRAINT pk_rg_i_0011 PRIMARY KEY (d1_s)     -- ← унікальність штрихкоду «безкоштовно»&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0011_r1 ON rg_i_0011 (r1_r);  -- зворотний пошук: штрихкоди товару&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; PK за вимірюванням автоматично гарантує, що один штрихкод не може вказувати на два товари. Якби Номенклатуру зробили вимірюванням, а Штрихкод — ресурсом, ця гарантія зникла б, і довелося б писати перевірку в прикладному коді.&lt;br /&gt;
&lt;br /&gt;
==== Д.3.4. ГрафікРоботи — неперіодичний, незалежний (використовується як графік для РР) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ГрафікРоботи&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: ВидГрафіка,  type: &amp;quot;Довідник.ГрафікиРоботи&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
    - { name: ДатаГрафіка, type: &amp;quot;Дата&amp;quot;, denyEmpty: true }        # ← вимірювання типу Дата, не Період!&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Значення, type: &amp;quot;Число(1,0)&amp;quot; }      # 1 = робочий день, 0 = вихідний&lt;br /&gt;
    - { name: Годин,    type: &amp;quot;Число(4,2)&amp;quot; }      # тривалість зміни&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення (важливе):&#039;&#039;&#039; &amp;lt;code&amp;gt;ДатаГрафіка&amp;lt;/code&amp;gt; — це &#039;&#039;&#039;вимірювання&#039;&#039;&#039; типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt;, а не стандартний реквізит &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;. Регістр &#039;&#039;&#039;неперіодичний&#039;&#039;&#039;. Причина: графік описує &#039;&#039;календар&#039;&#039; (кожна дата — окремий факт), а не &#039;&#039;історію зміни значення&#039;&#039;. Якби використали періодичність, зріз останніх повертав би «останній робочий день», що безглуздо. Механізм РР (&amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt;) очікує саме таку структуру.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0015&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! d1_r (ВидГрафіка) !! d2_d (ДатаГрафіка) !! r1 (Значення) !! r2 (Годин)&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-01 || 1 || 8.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-04 || 0 || 0.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-05 || 0 || 0.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-06 || 1 || 8.00&lt;br /&gt;
|-&lt;br /&gt;
| Змінний 2/2 || 2026-07-01 || 1 || 12.00&lt;br /&gt;
|-&lt;br /&gt;
| Змінний 2/2 || 2026-07-03 || 0 || 0.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Д.3.5. КадровіДані — по позиції реєстратора ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати актуальні кадрові дані співробітника з історією; підтримати кілька наказів однією датою в правильному порядку.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: КадровіДані&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: ByRecorderPosition   # ← упорядкування за позицією документа, не лише за датою&lt;br /&gt;
  writeMode: SubordinateToRecorder&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
    - { name: Посада,       type: &amp;quot;Довідник.Посади&amp;quot; }&lt;br /&gt;
    - { name: Ставка,       type: &amp;quot;Число(5,2)&amp;quot; }&lt;br /&gt;
    - { name: ВидЗайнятості, type: &amp;quot;Перерахування.ВидиЗайнятості&amp;quot; }&lt;br /&gt;
    - { name: ГрафікРоботи, type: &amp;quot;Довідник.ГрафікиРоботи&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ПрийомНаРоботу&lt;br /&gt;
    - Документ.КадровеПереміщення&lt;br /&gt;
    - Документ.Звільнення&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; &amp;lt;code&amp;gt;ByRecorderPosition&amp;lt;/code&amp;gt; — коли два накази оформлені однією датою (переміщення + зміна ставки), звичайна періодичність «у межах дня» дала б недетермінований результат зрізу. Позиція реєстратора додає до ключа &amp;lt;code&amp;gt;(rec_t, rec_r, line_no)&amp;lt;/code&amp;gt; і впорядковує за моментом часу документа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фізична схема:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0016 (&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    d1_r     uuid         NOT NULL,        -- Співробітник&lt;br /&gt;
    r1_r     uuid NOT NULL, r2_r uuid NOT NULL,&lt;br /&gt;
    r3       numeric(5,2) NOT NULL,&lt;br /&gt;
    r4       smallint     NOT NULL,        -- Перерахування зберігається як порядковий номер&lt;br /&gt;
    r5_r     uuid NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0016 PRIMARY KEY (period, rec_t, rec_r, line_no)  -- ← Період у ключі ПЕРШИЙ&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0016_d1 ON rg_i_0016 (d1_r, period DESC, rec_t, rec_r, line_no DESC)&lt;br /&gt;
    WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.3.6. НалаштуванняКористувачів — складений тип ресурсу ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: НалаштуванняКористувачів&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Користувач,   type: &amp;quot;Довідник.Користувачі&amp;quot;, master: true }&lt;br /&gt;
    - { name: Налаштування, type: &amp;quot;ПланВидівХарактеристик.НалаштуванняКористувачів&amp;quot;, master: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - name: Значення&lt;br /&gt;
      type: [&amp;quot;Рядок(500)&amp;quot;, &amp;quot;Число(15,2)&amp;quot;, &amp;quot;Дата&amp;quot;, &amp;quot;Булево&amp;quot;,&lt;br /&gt;
             &amp;quot;Довідник.Організації&amp;quot;, &amp;quot;Довідник.Склади&amp;quot;]     # ← складений тип&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0018 (&lt;br /&gt;
    d1_r  uuid           NOT NULL,&lt;br /&gt;
    d2_r  uuid           NOT NULL,&lt;br /&gt;
    r1_t  smallint       NOT NULL,      -- код типу значення&lt;br /&gt;
    r1_b  boolean,&lt;br /&gt;
    r1_n  numeric(15,2),&lt;br /&gt;
    r1_s  varchar(500),&lt;br /&gt;
    r1_d  timestamp(0),&lt;br /&gt;
    r1_r  uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0018 PRIMARY KEY (d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! d1_r !! d2_r !! r1_t !! r1_b !! r1_n !! r1_s !! r1_d !! r1_r&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ОсновнаОрганізація || 101 || || || || || ТОВ «Альфа»&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ОсновнийСклад || 104 || || || || || Центральний&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ПоказуватиПідказки || 2 || true || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Петренко || КількістьРядківСписку || 3 || || 50 || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.4. Регістри накопичення, вид «Залишки» ===&lt;br /&gt;
&lt;br /&gt;
==== Д.4.1. ТовариНаСкладах ====&lt;br /&gt;
&lt;br /&gt;
Декларація — розділ 6.7, фізична схема — розділ 8.5, ER — розділ 9.2. Тут — дані.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Рухи (&amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt;) після проведення трьох документів:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec_t !! rec_r !! line_no !! period !! mvt !! d1_r (Номенкл.) !! d2_r (Склад) !! r1 (К-сть) !! r2 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 2 (ПрихНакл) || p1 || 1 || 2026-06-10 || 0 &#039;&#039;Прихід&#039;&#039; || Кава Lavazza || Центральний || 100.000 || 35 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 (ПрихНакл) || p1 || 2 || 2026-06-10 || 0 &#039;&#039;Прихід&#039;&#039; || Чай Ahmad || Центральний || 200.000 || 12 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 (ВидНакл) || v1 || 1 || 2026-07-05 || 1 &#039;&#039;Витрата&#039;&#039; || Кава Lavazza || Центральний || 30.000 || 10 500.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 (Переміщ) || m1 || 1 || 2026-07-12 || 1 &#039;&#039;Витрата&#039;&#039; || Кава Lavazza || Центральний || 20.000 || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 (Переміщ) || m1 || 2 || 2026-07-12 || 0 &#039;&#039;Прихід&#039;&#039; || Кава Lavazza || Роздрібний || 20.000 || 7 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки залишків (&amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt;), ТА = 2026-07-31:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! d1_r !! d2_r !! r1 (К-сть ±) !! r2 (Сума ±) !! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Кава Lavazza || Центральний || 100.000 || 35 000.00 || залишок &#039;&#039;на початок&#039;&#039; липня&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Чай Ahmad || Центральний || 200.000 || 12 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Кава Lavazza || Центральний || 50.000 || 17 500.00 || 100 − 30 − 20&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Кава Lavazza || Роздрібний || 20.000 || 7 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Чай Ahmad || Центральний || 200.000 || 12 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Кава Lavazza || Центральний || 50.000 || 17 500.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039; — поточний залишок&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Кава Lavazza || Роздрібний || 20.000 || 7 000.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Чай Ahmad || Центральний || 200.000 || 12 000.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Вимірювання Партія і Характеристика для стислості опущені.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Д.4.2. ВзаєморозрахункиЗКонтрагентами ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; облік дебіторської/кредиторської заборгованості в розрізі договорів і замовлень.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ВзаєморозрахункиЗКонтрагентами&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  enableBalanceTotals: true&lt;br /&gt;
  enableTurnoverTotals: true&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true, index: true }&lt;br /&gt;
    - { name: Контрагент,  type: &amp;quot;Довідник.Контрагенти&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Договір,     type: &amp;quot;Довідник.ДоговориКонтрагентів&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Замовлення,  type: [&amp;quot;Документ.ЗамовленняПокупця&amp;quot;, &amp;quot;Документ.ЗамовленняПостачальнику&amp;quot;],&lt;br /&gt;
        nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,    type: &amp;quot;Число(15,2)&amp;quot; }     # у валюті регламентованого обліку&lt;br /&gt;
    - { name: СумаВал, type: &amp;quot;Число(15,2)&amp;quot; }     # у валюті договору&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Коментар, type: &amp;quot;Рядок(200)&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ПрихіднаНакладна&lt;br /&gt;
    - Документ.ПлатіжнеДоручення&lt;br /&gt;
    - Документ.КасовийОрдер&lt;br /&gt;
    - Документ.КоригуванняБоргу&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Угода про знак (обов&#039;язково фіксується в методології!):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид руху !! Сенс !! Приклад документа&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Прихід&#039;&#039;&#039; || Борг контрагента перед нами &#039;&#039;&#039;зростає&#039;&#039;&#039; (дебіторка +) || Видаткова накладна&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витрата&#039;&#039;&#039; || Борг контрагента перед нами &#039;&#039;&#039;зменшується&#039;&#039;&#039; (оплата) || Платіжне доручення вхідне&lt;br /&gt;
|}&lt;br /&gt;
Кредиторська заборгованість = від&#039;ємний залишок. &#039;&#039;Альтернатива&#039;&#039; — два окремих ресурси (СумаДт/СумаКт) або два регістри; обраний варіант — один знаковий ресурс (простіше, менший обсяг підсумків).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Документ !! period !! mvt !! Контрагент !! Договір !! r1 (Сума) !! Залишок після&lt;br /&gt;
|-&lt;br /&gt;
| ВидатковаНакладна №12 || 2026-07-05 || Прихід || ТОВ «Бета» || Основний || 12 000.00 || +12 000 &#039;&#039;(винні нам)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ПлатіжнеДоручення №88 || 2026-07-09 || Витрата || ТОВ «Бета» || Основний || 8 000.00 || +4 000&lt;br /&gt;
|-&lt;br /&gt;
| ПлатіжнеДоручення №91 || 2026-07-16 || Витрата || ТОВ «Бета» || Основний || 6 000.00 || −2 000 &#039;&#039;(передоплата)&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (акт звірки):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Контрагент, Дані.Договір,&lt;br /&gt;
    Дані.СумаПочатковийЗалишок, Дані.СумаПрихід,&lt;br /&gt;
    Дані.СумаВитрата,           Дані.СумаКінцевийЗалишок&lt;br /&gt;
З РегістрНакопичення.ВзаєморозрахункиЗКонтрагентами.ЗалишкиІОбороти(&lt;br /&gt;
       &amp;amp;Початок, &amp;amp;Кінець, Авто, Рух,&lt;br /&gt;
       Організація = &amp;amp;Організація І Контрагент = &amp;amp;Контрагент&lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.4.3. ТовариВРезерві — регістр «супутник» ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ТовариВРезерві&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Склад,          type: &amp;quot;Довідник.Склади&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Замовлення,     type: &amp;quot;Документ.ЗамовленняПокупця&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість, type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ЗамовленняПокупця&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ЗакриттяЗамовлень&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Патерн «доступний залишок»&#039;&#039;&#039; — з&#039;єднання двох регістрів:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    ЄСТЬNULL(Зал.Номенклатура, Рез.Номенклатура) ЯК Номенклатура,&lt;br /&gt;
    ЄСТЬNULL(Зал.Склад, Рез.Склад) ЯК Склад,&lt;br /&gt;
    ЄСТЬNULL(Зал.КількістьЗалишок, 0) ЯК ВСкладі,&lt;br /&gt;
    ЄСТЬNULL(Рез.КількістьЗалишок, 0) ЯК ВРезерві,&lt;br /&gt;
    ЄСТЬNULL(Зал.КількістьЗалишок, 0) - ЄСТЬNULL(Рез.КількістьЗалишок, 0) ЯК Доступно&lt;br /&gt;
З РегістрНакопичення.ТовариНаСкладах.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад) ЯК Зал&lt;br /&gt;
ПОВНЕ З&#039;ЄДНАННЯ РегістрНакопичення.ТовариВРезерві.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад) ЯК Рез&lt;br /&gt;
    ЗА Зал.Номенклатура = Рез.Номенклатура І Зал.Склад = Рез.Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Чому окремий регістр, а не ресурс «Резерв» у &amp;lt;code&amp;gt;ТовариНаСкладах&amp;lt;/code&amp;gt;? Тому що резерв ведеться в розрізі &#039;&#039;&#039;Замовлення&#039;&#039;&#039;, а залишок — у розрізі &#039;&#039;&#039;Партії&#039;&#039;&#039;. Додавання Замовлення як вимірювання до &amp;lt;code&amp;gt;ТовариНаСкладах&amp;lt;/code&amp;gt; помножило б таблицю підсумків на кардинальність замовлень (сотні тисяч рядків на товар). Це ілюстрація контрольного питання №2 з Д.1.}}&lt;br /&gt;
&lt;br /&gt;
==== Д.4.4. ГрошовіКоштиБезготівкові ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ГрошовіКоштиБезготівкові&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinDay              # достатньо дня: банківська виписка — денна&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація,       type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: БанківськийРахунок, type: &amp;quot;Довідник.БанківськіРахунки&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,    type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: СумаВал, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.ПлатіжнеДоручення, Документ.БанківськаВиписка, Документ.ПереміщенняКоштів]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; Валюта — &#039;&#039;&#039;не&#039;&#039;&#039; вимірювання, тому що вона однозначно визначається банківським рахунком (функціональна залежність). Її додавання як вимірювання створило б надлишковість і ризик неузгоджених даних. Валюта отримується з&#039;єднанням із довідником.&lt;br /&gt;
&lt;br /&gt;
=== Д.5. Регістри накопичення, вид «Обороти» ===&lt;br /&gt;
&lt;br /&gt;
==== Д.5.1. Продажі — з агрегатами ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Продажі&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Turnover          # ← залишків не буває: «залишок продажів» безглуздий&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  turnoverTotalsPeriod: Month&lt;br /&gt;
  aggregatesMode: Aggregates&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Контрагент,     type: &amp;quot;Довідник.Контрагенти&amp;quot;, index: true }&lt;br /&gt;
    - { name: Договір,        type: &amp;quot;Довідник.ДоговориКонтрагентів&amp;quot; }&lt;br /&gt;
    - { name: Менеджер,       type: &amp;quot;Довідник.Користувачі&amp;quot;, index: true }&lt;br /&gt;
    - { name: Склад,          type: &amp;quot;Довідник.Склади&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість,   type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
    - { name: Сума,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: СумаБезПДВ,  type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: Собівартість, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.ВидатковаНакладна, Документ.ПовернненняВідПокупця, Документ.ЗвітПроРоздрібніПродажі]&lt;br /&gt;
&lt;br /&gt;
  aggregates:&lt;br /&gt;
    - name: ПродажіПоМісяцяхІТоварах&lt;br /&gt;
      periodicity: Month&lt;br /&gt;
      dimensions: [Номенклатура, Склад]&lt;br /&gt;
      realtime: true&lt;br /&gt;
    - name: ПродажіПоМенеджерах&lt;br /&gt;
      periodicity: Day&lt;br /&gt;
      dimensions: [Менеджер]&lt;br /&gt;
      realtime: false                 # оновлюється регламентно&lt;br /&gt;
    - name: ПродажіПоКонтрагентах&lt;br /&gt;
      periodicity: Quarter&lt;br /&gt;
      dimensions: [Контрагент, Договір]&lt;br /&gt;
      realtime: false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;Turnover&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt;: немає &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt;, немає таблиці залишків → удвічі менше підсумків і немає кумулятивних оновлень. Повернення відображається &#039;&#039;&#039;від&#039;ємною&#039;&#039;&#039; сумою, а не «витратою».&lt;br /&gt;
* 6 вимірювань → таблиця підсумків надто широка для швидких звітів → компенсуємо агрегатами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ефект агрегатів:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Звіт !! Без агрегатів (&amp;lt;code&amp;gt;rg_a_0031_tt&amp;lt;/code&amp;gt;) !! З агрегатом !! Виграш&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по товарах за рік || скан 8 млн рядків підсумків || &amp;lt;code&amp;gt;ag1&amp;lt;/code&amp;gt;: 40 тис. рядків || ×200&lt;br /&gt;
|-&lt;br /&gt;
| Рейтинг менеджерів за квартал || скан 8 млн рядків || &amp;lt;code&amp;gt;ag2&amp;lt;/code&amp;gt;: 1,8 тис. рядків || ×4000&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по контрагенту за 3 роки || скан 8 млн рядків || &amp;lt;code&amp;gt;ag3&amp;lt;/code&amp;gt;: 60 тис. рядків || ×130&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по товару + контрагенту || &#039;&#039;&#039;агрегат не покриває&#039;&#039;&#039; → підсумки || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0031_ag1 (          -- Місяць × (Номенклатура, Склад)&lt;br /&gt;
    period timestamp(0) NOT NULL, d1_r uuid NOT NULL, d6_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(20,3) NOT NULL, r2 numeric(20,2) NOT NULL,&lt;br /&gt;
    r3 numeric(20,2) NOT NULL, r4 numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag1 PRIMARY KEY (period, d1_r, d6_r)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE rg_a_0031_ag2 (          -- День × (Менеджер)&lt;br /&gt;
    period timestamp(0) NOT NULL, d5_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(20,3) NOT NULL, r2 numeric(20,2) NOT NULL,&lt;br /&gt;
    r3 numeric(20,2) NOT NULL, r4 numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag2 PRIMARY KEY (period, d5_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.5.2. ВитратиЗаСтаттями ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ВитратиЗаСтаттями&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Turnover&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  turnoverTotalsPeriod: Month&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація,    type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Підрозділ,      type: &amp;quot;Довідник.Підрозділи&amp;quot;, index: true }&lt;br /&gt;
    - { name: СтаттяВитрат,   type: &amp;quot;Довідник.СтаттіВитрат&amp;quot;, master: true, denyEmpty: true, index: true }&lt;br /&gt;
    - { name: Проєкт,         type: &amp;quot;Довідник.Проєкти&amp;quot;, nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.АвансовийЗвіт, Документ.НадходженняПослуг, Документ.НарахуванняЗарплати, Документ.Амортизація]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних (&amp;lt;code&amp;gt;rg_a_0032_tt&amp;lt;/code&amp;gt;, підсумки оборотів за місяць):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! Підрозділ !! СтаттяВитрат !! Проєкт !! r1 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || Оренда || &#039;&#039;(порожній)&#039;&#039; || 45 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || ЗП і нарахування || &#039;&#039;(порожній)&#039;&#039; || 320 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || Реклама || Запуск «Альфа» || 78 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || ІТ-відділ || ЗП і нарахування || &#039;&#039;(порожній)&#039;&#039; || 410 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || ІТ-відділ || Ліцензії ПЗ || &#039;&#039;(порожній)&#039;&#039; || 62 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.6. Регістри бухгалтерії ===&lt;br /&gt;
&lt;br /&gt;
==== Д.6.1. Госпрозрахунковий — з кореспонденцією ====&lt;br /&gt;
&lt;br /&gt;
Декларація — розділ 6.7, схема — 8.6, ER — 9.3. Тут — приклад проводок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Господарська операція:&#039;&#039;&#039; реалізація товару на 12 000 грн (у т.ч. ПДВ 2 000), собівартість 7 000 грн.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проводки (&amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt;, реєстратор = ВидатковаНакладна №12):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! acc_dt !! ed_dt1 !! ed_dt2 !! acc_kt !! ed_kt1 !! ed_kt2 !! r1 (Сума) !! r2_dt !! r2_kt&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 361 &#039;&#039;Розрах. з покупцями&#039;&#039; || ТОВ «Бета» || Договір №5 || 702 &#039;&#039;Дохід від реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 12 000.00 || || 30.000&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 702 &#039;&#039;Дохід від реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 641 &#039;&#039;Розрах. за податками&#039;&#039; || ПДВ || &#039;&#039;—&#039;&#039; || 2 000.00 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 902 &#039;&#039;Собівартість реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 281 &#039;&#039;Товари на складі&#039;&#039; || Кава Lavazza || Центральний || 7 000.00 || 30.000 || 30.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Контроль:&#039;&#039;&#039; Σ(Сума) по Дт = Σ(Сума) по Кт у межах реєстратора → 12 000 + 2 000 + 7 000 = 21 000 з обох боків. ✔&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки, рівень 0 (&amp;lt;code&amp;gt;rg_b_0020_tb0&amp;lt;/code&amp;gt;), на 5999-11-01:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! acc_r !! d1_r (Організація) !! r1 (Сума ±) !! Інтерпретація&lt;br /&gt;
|-&lt;br /&gt;
| 281 || ТОВ «Альфа» || +28 000.00 || дебетовий залишок (товари є)&lt;br /&gt;
|-&lt;br /&gt;
| 361 || ТОВ «Альфа» || +12 000.00 || дебетовий (дебіторка)&lt;br /&gt;
|-&lt;br /&gt;
| 641 || ТОВ «Альфа» || −2 000.00 || кредитовий (винні бюджету)&lt;br /&gt;
|-&lt;br /&gt;
| 702 || ТОВ «Альфа» || −10 000.00 || кредитовий (дохід)&lt;br /&gt;
|-&lt;br /&gt;
| 902 || ТОВ «Альфа» || +7 000.00 || дебетовий (собівартість)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки, рівень 2 (&amp;lt;code&amp;gt;rg_b_0020_tb2&amp;lt;/code&amp;gt;) — для рахунку 281 (2 субконто: Номенклатура, Склад):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! acc_r !! ed1_r (Номенклатура) !! ed2_r (Склад) !! r1 (Сума) !! r2 (Кількість)&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Кава Lavazza || Центральний || 17 500.00 || 50.000&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Кава Lavazza || Роздрібний || 7 000.00 || 20.000&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Чай Ahmad || Центральний || 12 000.00 || 200.000&lt;br /&gt;
|}&lt;br /&gt;
Згортка &amp;lt;code&amp;gt;tb2&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;tb0&amp;lt;/code&amp;gt;: 17 500 + 7 000 + 12 000 = &#039;&#039;&#039;36 500&#039;&#039;&#039;… &#039;&#039;(різниця з таблицею вище — інші операції; у тесті ФТ-Т-08 перевіряється точна рівність)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (ОСВ по рахунку):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Субконто1 ЯК Номенклатура, Дані.Субконто2 ЯК Склад,&lt;br /&gt;
    Дані.СумаПочатковийЗалишокДт, Дані.КількістьПочатковийЗалишокДт,&lt;br /&gt;
    Дані.СумаОборотДт, Дані.СумаОборотКт,&lt;br /&gt;
    Дані.СумаКінцевийЗалишокДт, Дані.КількістьКінцевийЗалишокДт&lt;br /&gt;
З РегістрБухгалтерії.Госпрозрахунковий.ЗалишкиІОбороти(&lt;br /&gt;
       &amp;amp;Початок, &amp;amp;Кінець, Місяць,&lt;br /&gt;
       Рахунок = &amp;amp;Рахунок281,&lt;br /&gt;
       , Організація = &amp;amp;Організація,&lt;br /&gt;
       , &lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.6.2. ПодатковийОблік — без кореспонденції ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; податковий облік із розділенням на постійні/тимчасові різниці, де подвійний запис не потрібен (кожен факт реєструється окремо по Дт або по Кт).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ПодатковийОблік&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Податковий&lt;br /&gt;
  correspondence: false               # ← уніграфічний облік&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, balance: true, denyEmpty: true }&lt;br /&gt;
    - { name: ВидРізниці,  type: &amp;quot;Перерахування.ВидиРізниць&amp;quot;, balance: true }   # БУ|ПУ|ПР|ТР&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Зміст, type: &amp;quot;Рядок(255)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.БухгалтерськаОперація, Документ.ВидатковаНакладна, Документ.НадходженняПослуг]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проводки (&amp;lt;code&amp;gt;rg_b_0021&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! acc_mvt !! acc_r !! ed1 (Номенкл.) !! d1 (Організація) !! d2 (ВидРізниці) !! r1 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 &#039;&#039;Дебет&#039;&#039; || 902.НУ || Кава Lavazza || ТОВ «Альфа» || ПУ &#039;&#039;податковий&#039;&#039; || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 &#039;&#039;Кредит&#039;&#039; || 281.НУ || Кава Lavazza || ТОВ «Альфа» || ПУ || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0 &#039;&#039;Дебет&#039;&#039; || 902.НУ || Кава Lavazza || ТОВ «Альфа» || ПР &#039;&#039;постійна різниця&#039;&#039; || 350.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 &#039;&#039;Кредит&#039;&#039; || 281.НУ || Кава Lavazza || ТОВ «Альфа» || ПР || 350.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Відмінності від Д.6.1:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! З кореспонденцією !! Без кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| Один факт = || 1 запис (Дт+Кт) || 2 записи (окремо Дт, окремо Кт)&lt;br /&gt;
|-&lt;br /&gt;
| Поля рахунків || &amp;lt;code&amp;gt;acc_dt_r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;acc_kt_r&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;acc_r&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;acc_mvt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Субконто || 2 набори (Дт, Кт) || 1 набір&lt;br /&gt;
|-&lt;br /&gt;
| Кількість записів || N || 2N&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця &amp;lt;code&amp;gt;_tc&amp;lt;/code&amp;gt; (кореспонденції) || Є || &#039;&#039;&#039;Немає&#039;&#039;&#039; — «шахова відомість» неможлива&lt;br /&gt;
|-&lt;br /&gt;
| Контроль Дт=Кт || У межах реєстратора || Опційно (може бути незбалансовано за задумом)&lt;br /&gt;
|-&lt;br /&gt;
| Коли обирати || Класичний облік, потрібен аналіз кореспонденцій || Облік без потреби в кореспонденціях, забалансовий, статистичний&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Д.6.3. Бюджетування ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Бюджетування&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Бюджетування&lt;br /&gt;
  correspondence: true&lt;br /&gt;
  periodicity: WithinMonth            # бюджет — помісячний, до секунди не потрібно&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Сценарій, type: &amp;quot;Довідник.СценаріїБюджетування&amp;quot;, balance: true, denyEmpty: true }&lt;br /&gt;
    - { name: ЦФВ,      type: &amp;quot;Довідник.ЦентриФінансовоїВідповідальності&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Проєкт,   type: &amp;quot;Довідник.Проєкти&amp;quot;, balance: true, nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
  recorders: [Документ.БюджетнаОперація, Документ.ВведенняБюджету]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; &amp;lt;code&amp;gt;Сценарій&amp;lt;/code&amp;gt; — вимірювання, а не окремий регістр на кожен сценарій (План/Факт/Прогноз). Це дозволяє план-фактний аналіз одним запитом. Усі три вимірювання &#039;&#039;&#039;балансові&#039;&#039;&#039; — бюджетна проводка не змінює сценарій/ЦФВ між дебетом і кредитом.&lt;br /&gt;
&lt;br /&gt;
=== Д.7. Регістри розрахунку ===&lt;br /&gt;
&lt;br /&gt;
==== Д.7.1. ОсновніНарахування — період дії + витіснення ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид розрахунку !! Період дії !! Витісняючі !! Базові !! Залежність від бази&lt;br /&gt;
|-&lt;br /&gt;
| Оклад || Так || Відпустка, Лікарняний || — || Не залежить&lt;br /&gt;
|-&lt;br /&gt;
| Відпустка || Так || Лікарняний || Оклад, Премія || За періодом дії&lt;br /&gt;
|-&lt;br /&gt;
| Лікарняний || Так || — || Оклад || За періодом дії&lt;br /&gt;
|-&lt;br /&gt;
| Премія || Ні || — || Оклад || За періодом реєстрації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Декларація регістру — розділ 6.7.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Записи (&amp;lt;code&amp;gt;rg_c_0040&amp;lt;/code&amp;gt;), період реєстрації = липень 2026:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! calc_type !! period !! act_begin !! act_end !! base_begin !! base_end !! d1 (Співробітник) !! r1 (Результат)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Оклад || 2026-07-01 || 2026-07-01 || 2026-07-31 || || || Іваненко || 18 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Відпустка || 2026-07-01 || 2026-07-10 || 2026-07-17 || 2026-01-01 || 2026-06-30 || Іваненко || 6 420.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Лікарняний || 2026-07-01 || 2026-07-14 || 2026-07-22 || 2026-01-01 || 2026-06-30 || Іваненко || 5 180.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Оклад || 2026-07-01 || 2026-07-01 || 2026-07-31 || || || Петренко || 22 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фактичні періоди дії (&amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt;) — результат витіснення:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec/line !! interval_no !! calc_type !! d1 !! fact_begin !! fact_end !! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 1 || 0 || Оклад || Іваненко || 2026-07-01 || 2026-07-09 || до відпустки&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 1 || 1 || Оклад || Іваненко || 2026-07-23 || 2026-07-31 || після лікарняного&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 2 || 0 || Відпустка || Іваненко || 2026-07-10 || 2026-07-13 || витіснена лікарняним з 14-го&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 3 || 0 || Лікарняний || Іваненко || 2026-07-14 || 2026-07-22 || не витісняється нічим&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 4 || 0 || Оклад || Петренко || 2026-07-01 || 2026-07-31 || витіснення відсутнє&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Один запис «Оклад» Іваненка → два інтервали&#039;&#039;&#039; — ілюстрація зв&#039;язку 1:N у розділі 9.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (дані графіка для розрахунку окладу):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Співробітник, Дані.НомерРядка,&lt;br /&gt;
    Дані.ЗначенняФактичногоПеріодуДії ЯК ВідпрацьованоДнів,&lt;br /&gt;
    Дані.ЗначенняПеріодуДії           ЯК НормаДнів&lt;br /&gt;
З РегістрРозрахунку.ОсновніНарахування.ДаніГрафіка(&lt;br /&gt;
       ВидРозрахунку = ЗНАЧЕННЯ(ПланВидівРозрахунку.ОсновніНарахування.Оклад)&lt;br /&gt;
       І Реєстратор = &amp;amp;Реєстратор&lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Результат:&#039;&#039;&#039; Іваненко — &amp;lt;code&amp;gt;ВідпрацьованоДнів = 13&amp;lt;/code&amp;gt; (робочі дні у 01–09 та 23–31), &amp;lt;code&amp;gt;НормаДнів = 23&amp;lt;/code&amp;gt; → Оклад = 18 000 × 13 / 23 = &#039;&#039;&#039;10 173,91&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (база для відпустки):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ База.Співробітник, База.НомерРядка, База.РезультатБаза ЯК Заробіток&lt;br /&gt;
З РегістрРозрахунку.ОсновніНарахування.БазаРозрахунку(&lt;br /&gt;
       , /* вимірювання бази */&lt;br /&gt;
       , /* вимірювання основного регістру */&lt;br /&gt;
       Співробітник,                          /* розрізи */&lt;br /&gt;
       ВидРозрахунку = ЗНАЧЕННЯ(ПланВидівРозрахунку.ОсновніНарахування.Відпустка)&lt;br /&gt;
   ) ЯК База&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.7.2. Утримання — без періоду дії, база за періодом реєстрації ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид розрахунку !! Період дії !! Базові види розрахунку !! Залежність&lt;br /&gt;
|-&lt;br /&gt;
| ПДФО || Ні || &#039;&#039;(усі з ПВР ОсновніНарахування)&#039;&#039; || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Військовий збір || Ні || &#039;&#039;(усі з ПВР ОсновніНарахування)&#039;&#039; || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Аліменти || Ні || Оклад, Премія, Відпустка || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Профспілковий внесок || Ні || Оклад || За періодом реєстрації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Утримання&lt;br /&gt;
  kind: Calculation&lt;br /&gt;
  calculationTypesPlan: ПланВидівРозрахунку.Утримання&lt;br /&gt;
  periodicity: Month&lt;br /&gt;
  actionPeriod: false                 # ← утримання не має періоду дії&lt;br /&gt;
  basePeriod: ByRegistrationPeriod    # ← база береться за періодом реєстрації&lt;br /&gt;
  # schedule: не задається — графік не потрібен&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, baseDimension: true, master: true, denyEmpty: true }&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Результат,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: БазаОподаткування, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recalculations:&lt;br /&gt;
    - name: ПерерахунокУтримань&lt;br /&gt;
      dimensions:&lt;br /&gt;
        - { name: Співробітник, registerDimension: Співробітник }&lt;br /&gt;
  recorders: [Документ.НарахуванняЗарплати]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фізична схема (спрощена — немає полів періоду дії):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_c_0041 (&lt;br /&gt;
    rec_t       smallint     NOT NULL,&lt;br /&gt;
    rec_r       uuid         NOT NULL,&lt;br /&gt;
    line_no     int          NOT NULL,&lt;br /&gt;
    period      timestamp(0) NOT NULL,     -- період реєстрації&lt;br /&gt;
    active      boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    reversal    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    calc_type_r uuid         NOT NULL,&lt;br /&gt;
    base_begin  timestamp(0) NOT NULL,     -- ← є, бо basePeriod ≠ None&lt;br /&gt;
    base_end    timestamp(0) NOT NULL,&lt;br /&gt;
    -- act_begin / act_end ВІДСУТНІ (actionPeriod: false)&lt;br /&gt;
    d1_r        uuid         NOT NULL,&lt;br /&gt;
    d2_r        uuid         NOT NULL,&lt;br /&gt;
    r1          numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2          numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0041 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
-- Таблиця rg_c_0041_ap НЕ створюється (немає періоду дії → немає витіснення)&lt;br /&gt;
CREATE TABLE rg_c_0041_rc1 (            -- ПерерахунокУтримань&lt;br /&gt;
    rec_t smallint NOT NULL, rec_r uuid NOT NULL,&lt;br /&gt;
    calc_type_r uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    src_rec_t smallint NOT NULL, src_rec_r uuid NOT NULL,&lt;br /&gt;
    created_at timestamp(0) NOT NULL DEFAULT now(),&lt;br /&gt;
    CONSTRAINT pk_rg_c_0041_rc1 PRIMARY KEY (rec_t, rec_r, calc_type_r, d1_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Міжпланова база.&#039;&#039;&#039; Базові види розрахунку для ПВР &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt; належать до &#039;&#039;іншого&#039;&#039; ПВР — &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;. Це означає, що віртуальна таблиця &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; регістру &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt; має читати записи регістру &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Вимога ФТ-25 має бути розширена:&#039;&#039;&#039; метамодель повинна дозволяти вказати &#039;&#039;регістр-джерело бази&#039;&#039;. Це &#039;&#039;&#039;відкрите питання В9&#039;&#039;&#039; (див. оновлений Додаток Г) — у 1С механізм працює через відповідність ПВР, а не регістрів, що обмежує сценарії. Пропозиція: додати до &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt; поле &amp;lt;code&amp;gt;base_register_id&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! calc_type !! period !! base_begin !! base_end !! Співробітник !! r2 (База) !! r1 (Результат)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ПДФО || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 21 773.91 || 3 919.30&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Військовий збір || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 21 773.91 || 326.61&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Аліменти || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 17 528.00 || 4 382.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.8. Наскрізний приклад: проведення видаткової накладної ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Документ:&#039;&#039;&#039; Видаткова накладна №12 від 05.07.2026, ТОВ «Бета», 30 кг кави за 400 грн (12 000 грн з ПДВ), собівартість 7 000 грн.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Posting {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fontname=&amp;quot;DejaVu Sans&amp;quot;, fontsize=9];&lt;br /&gt;
&lt;br /&gt;
  D [label=&amp;quot;Документ\nВидаткова накладна №12\n05.07.2026&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;, shape=note];&lt;br /&gt;
&lt;br /&gt;
  R1 [label=&amp;quot;РН ТовариНаСкладах\n(Залишки)\nВитрата: 30 кг / 7 000 грн&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R2 [label=&amp;quot;РН Взаєморозрахунки\n(Залишки)\nПрихід: 12 000 грн&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R3 [label=&amp;quot;РН Продажі\n(Обороти)\n30 кг / 12 000 / 10 000 / 7 000&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R4 [label=&amp;quot;РН ТовариВРезерві\n(Залишки)\nВитрата: 30 кг&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R5 [label=&amp;quot;РБ Госпрозрахунковий\n3 проводки на 21 000&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  T1 [label=&amp;quot;rg_a_0012_tb\nMAXPERIOD: 80 → 50 кг&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T2 [label=&amp;quot;rg_a_0013_tb\nMAXPERIOD: 0 → +12 000&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T3 [label=&amp;quot;rg_a_0031_tt\n2026-07: +30 / +12 000&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T5 [label=&amp;quot;rg_b_0020_tb0/tb2/tt0/tc&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;, shape=cylinder];&lt;br /&gt;
&lt;br /&gt;
  D -&amp;gt; R1; D -&amp;gt; R2; D -&amp;gt; R3; D -&amp;gt; R4; D -&amp;gt; R5;&lt;br /&gt;
  R1 -&amp;gt; T1; R2 -&amp;gt; T2; R3 -&amp;gt; T3; R5 -&amp;gt; T5;&lt;br /&gt;
&lt;br /&gt;
  label=&amp;quot;ОДНА транзакція БД: усі 5 регістрів + підсумки + прапорець Проведений&amp;quot;;&lt;br /&gt;
  labelloc=b; fontname=&amp;quot;DejaVu Sans&amp;quot;; fontsize=10;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class ВидатковаНакладна(Document):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Проведення по 5 регістрах в одній транзакції. Бюджет Python: &amp;lt;= 15 мс (АП-4).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def on_posting(self, ctx: PostingContext) -&amp;gt; None:&lt;br /&gt;
        # --- 0. Блокування перед контролем залишків ---&lt;br /&gt;
        with DataLock() as dl:&lt;br /&gt;
            li = dl.add(&amp;quot;РегістрНакопичення.ТовариНаСкладах.Залишки&amp;quot;)&lt;br /&gt;
            li.mode = DataLockMode.EXCLUSIVE&lt;br /&gt;
            li.data_source = self.Товари.unload(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Характеристика&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Номенклатура&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Характеристика&amp;quot;, &amp;quot;Характеристика&amp;quot;)&lt;br /&gt;
            li.set_value(&amp;quot;Склад&amp;quot;, self.Склад)&lt;br /&gt;
&lt;br /&gt;
            self._movements_goods()       # 1. ТовариНаСкладах&lt;br /&gt;
            self._movements_ar()          # 2. Взаєморозрахунки&lt;br /&gt;
            self._movements_sales()       # 3. Продажі&lt;br /&gt;
            self._movements_reserve()     # 4. ТовариВРезерві&lt;br /&gt;
            self._movements_accounting()  # 5. Госпрозрахунковий&lt;br /&gt;
&lt;br /&gt;
            self.movements.ТовариНаСкладах.write_now()&lt;br /&gt;
            self._control_negative_balances(ctx)&lt;br /&gt;
&lt;br /&gt;
    # --- 1. РН ТовариНаСкладах: списання ---&lt;br /&gt;
    def _movements_goods(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.ТовариНаСкладах&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(Період=self.Дата,&lt;br /&gt;
                   ВидРуху=AccumulationMovementType.EXPENSE,&lt;br /&gt;
                   Номенклатура=r.Номенклатура, Характеристика=r.Характеристика,&lt;br /&gt;
                   Склад=self.Склад, Партія=r.Партія,&lt;br /&gt;
                   Кількість=r.Кількість, Сума=r.Собівартість)&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    # --- 2. РН Взаєморозрахунки: дебіторка зростає ---&lt;br /&gt;
    def _movements_ar(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.ВзаєморозрахункиЗКонтрагентами&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.append(rs.new(&lt;br /&gt;
            Період=self.Дата,&lt;br /&gt;
            ВидРуху=AccumulationMovementType.RECEIPT,     # Прихід = борг зростає&lt;br /&gt;
            Організація=self.Організація, Контрагент=self.Контрагент,&lt;br /&gt;
            Договір=self.Договір, Замовлення=self.ЗамовленняПокупця,&lt;br /&gt;
            Сума=self.СумаДокумента, СумаВал=self.СумаДокументаВал,&lt;br /&gt;
        ))&lt;br /&gt;
&lt;br /&gt;
    # --- 3. РН Продажі: оборот (ВидРуху відсутній!) ---&lt;br /&gt;
    def _movements_sales(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Продажі&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(Період=self.Дата,&lt;br /&gt;
                   Номенклатура=r.Номенклатура, Контрагент=self.Контрагент,&lt;br /&gt;
                   Договір=self.Договір, Менеджер=self.Менеджер, Склад=self.Склад,&lt;br /&gt;
                   Кількість=r.Кількість, Сума=r.Сума,&lt;br /&gt;
                   СумаБезПДВ=r.СумаБезПДВ, Собівартість=r.Собівартість)&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    # --- 4. РН ТовариВРезерві: зняття резерву ---&lt;br /&gt;
    def _movements_reserve(self) -&amp;gt; None:&lt;br /&gt;
        if self.ЗамовленняПокупця.is_empty():&lt;br /&gt;
            return&lt;br /&gt;
        rs = self.movements.ТовариВРезерві&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(Період=self.Дата, ВидРуху=AccumulationMovementType.EXPENSE,&lt;br /&gt;
                   Номенклатура=r.Номенклатура, Характеристика=r.Характеристика,&lt;br /&gt;
                   Склад=self.Склад, Замовлення=self.ЗамовленняПокупця,&lt;br /&gt;
                   Кількість=r.Кількість)&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    # --- 5. РБ Госпрозрахунковий: 3 проводки на рядок ---&lt;br /&gt;
    def _movements_accounting(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Госпрозрахунковий&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        for r in self.Товари:&lt;br /&gt;
            e1 = rs.add_accounting_entry(               # Дт 361 / Кт 702&lt;br /&gt;
                Період=self.Дата, Організація=self.Організація,&lt;br /&gt;
                РахунокДт=Accounts[&amp;quot;361&amp;quot;], РахунокКт=Accounts[&amp;quot;702&amp;quot;],&lt;br /&gt;
                Сума=r.Сума, КількістьКт=r.Кількість)&lt;br /&gt;
            e1.subconto_dt[ВидиСубконто.Контрагенти] = self.Контрагент&lt;br /&gt;
            e1.subconto_dt[ВидиСубконто.Договори] = self.Договір&lt;br /&gt;
            e1.subconto_kt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
&lt;br /&gt;
            e2 = rs.add_accounting_entry(               # Дт 702 / Кт 641 (ПДВ)&lt;br /&gt;
                Період=self.Дата, Організація=self.Організація,&lt;br /&gt;
                РахунокДт=Accounts[&amp;quot;702&amp;quot;], РахунокКт=Accounts[&amp;quot;641&amp;quot;],&lt;br /&gt;
                Сума=r.СумаПДВ)&lt;br /&gt;
            e2.subconto_dt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e2.subconto_kt[ВидиСубконто.ПодаткиІЗбори] = Taxes.ПДВ&lt;br /&gt;
&lt;br /&gt;
            e3 = rs.add_accounting_entry(               # Дт 902 / Кт 281&lt;br /&gt;
                Період=self.Дата, Організація=self.Організація,&lt;br /&gt;
                РахунокДт=Accounts[&amp;quot;902&amp;quot;], РахунокКт=Accounts[&amp;quot;281&amp;quot;],&lt;br /&gt;
                Сума=r.Собівартість,&lt;br /&gt;
                КількістьДт=r.Кількість, КількістьКт=r.Кількість)&lt;br /&gt;
            e3.subconto_dt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e3.subconto_kt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e3.subconto_kt[ВидиСубконто.Склади] = self.Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що відбувається у БД (одна транзакція):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Крок !! Таблиця !! Операція !! Рядків&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;lt;code&amp;gt;doc_0003&amp;lt;/code&amp;gt; || UPDATE posted = true || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt; (ТовариНаСкладах) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt; || MERGE (MAXPERIOD + періоди &amp;gt; 07.2026) || 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &amp;lt;code&amp;gt;rg_a_0013&amp;lt;/code&amp;gt; (Взаєморозрахунки) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &amp;lt;code&amp;gt;rg_a_0013_tb&amp;lt;/code&amp;gt; || MERGE || 2&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &amp;lt;code&amp;gt;rg_a_0031&amp;lt;/code&amp;gt; (Продажі) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 7 || &amp;lt;code&amp;gt;rg_a_0031_tt&amp;lt;/code&amp;gt; || MERGE (тільки період 2026-07) || 1&lt;br /&gt;
|-&lt;br /&gt;
| 8 || &amp;lt;code&amp;gt;rg_a_0031_ag1&amp;lt;/code&amp;gt; || MERGE (realtime-агрегат) || 1&lt;br /&gt;
|-&lt;br /&gt;
| 9 || &amp;lt;code&amp;gt;rg_a_0014&amp;lt;/code&amp;gt; (Резерв) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 10 || &amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt; (проводки) || DELETE + INSERT || 3&lt;br /&gt;
|-&lt;br /&gt;
| 11 || &amp;lt;code&amp;gt;rg_b_0020_tb0&amp;lt;/code&amp;gt; || MERGE || 10&lt;br /&gt;
|-&lt;br /&gt;
| 12 || &amp;lt;code&amp;gt;rg_b_0020_tb1/tb2&amp;lt;/code&amp;gt; || MERGE || 8&lt;br /&gt;
|-&lt;br /&gt;
| 13 || &amp;lt;code&amp;gt;rg_b_0020_tt0..tt2&amp;lt;/code&amp;gt; || MERGE || 12&lt;br /&gt;
|-&lt;br /&gt;
| 14 || &amp;lt;code&amp;gt;rg_b_0020_tc&amp;lt;/code&amp;gt; || MERGE || 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Разом&#039;&#039;&#039; || &#039;&#039;&#039;≈ 47 рядків, 1 COMMIT&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Спостереження для НФВ-04.&#039;&#039;&#039; Один рядок товару в накладній породжує ~47 модифікацій рядків у 14 таблицях. Для накладної зі 100 рядків це ~2 000–4 000 модифікацій. Саме тут — основне навантаження проведення, і саме тому РБ (кроки 10–14) дає ~70 % вартості транзакції. Це аргумент на користь MVP без РБ (розділ 14) і предмет вимірювання в НТ-03.}}&lt;br /&gt;
&lt;br /&gt;
=== Д.9. Наскрізний приклад: розрахунок зарплати ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
КРОК 1. Документ «Нарахування зарплати» за липень 2026, Іваненко.&lt;br /&gt;
        Записуємо рухи в РР ОсновніНарахування (Результат = 0).&lt;br /&gt;
&lt;br /&gt;
КРОК 2. Платформа автоматично будує фактичні періоди дії (rg_c_0040_ap):&lt;br /&gt;
        Оклад      → [01.07–09.07], [23.07–31.07]&lt;br /&gt;
        Відпустка  → [10.07–13.07]&lt;br /&gt;
        Лікарняний → [14.07–22.07]&lt;br /&gt;
&lt;br /&gt;
КРОК 3. Розрахунок «первинних» видів (без бази) — Оклад.&lt;br /&gt;
        Запит до ДаніГрафіка:&lt;br /&gt;
          НормаДнів            = 23 (робочих днів у липні за П&#039;ятиденкою)&lt;br /&gt;
          ВідпрацьованоДнів    = 13 (робочі дні у фактичних періодах дії)&lt;br /&gt;
        Результат = 18 000 × 13 / 23 = 10 173,91&lt;br /&gt;
        → UPDATE rg_c_0040 SET r1 = 10173.91, r2 = 13, r3 = 23 WHERE line_no = 1&lt;br /&gt;
&lt;br /&gt;
КРОК 4. Розрахунок видів із базою — Відпустка, Лікарняний.&lt;br /&gt;
        Запит до БазаРозрахунку (базовий період 01.01–30.06, база = Оклад+Премія):&lt;br /&gt;
          Заробіток за 6 міс. = 115 560,00&lt;br /&gt;
          Календарних днів    = 181&lt;br /&gt;
          Середньоденний      = 638,45&lt;br /&gt;
        Відпустка: 638,45 × 4 дні (10–13.07) = 2 553,80&lt;br /&gt;
        Лікарняний: 638,45 × 9 днів × 100 % = 5 746,05&lt;br /&gt;
        → UPDATE rg_c_0040 SET r1 = ... WHERE line_no IN (2, 3)&lt;br /&gt;
&lt;br /&gt;
КРОК 5. Записуємо рухи в РР Утримання (базовий період = період реєстрації, липень).&lt;br /&gt;
        База ПДФО = 10 173,91 + 2 553,80 + 5 746,05 = 18 473,76&lt;br /&gt;
        ПДФО = 18 473,76 × 18 % = 3 325,28&lt;br /&gt;
        ВЗ   = 18 473,76 × 1,5 % =   277,11&lt;br /&gt;
&lt;br /&gt;
КРОК 6. Проведення документа → рухи в:&lt;br /&gt;
        РН ВитратиЗаСтаттями (Обороти):  Стаття «ЗП і нарахування» = 18 473,76&lt;br /&gt;
        РБ Госпрозрахунковий:            Дт 92 / Кт 661 = 18 473,76&lt;br /&gt;
                                         Дт 661 / Кт 641.ПДФО = 3 325,28&lt;br /&gt;
                                         Дт 661 / Кт 642.ВЗ =     277,11&lt;br /&gt;
&lt;br /&gt;
КРОК 7. Через тиждень бухгалтер змінює Оклад Іваненка за червень (заднім числом).&lt;br /&gt;
        → Платформа реєструє в rg_c_0040_rc1 (ПерерахунокЗаБазою):&lt;br /&gt;
             (Реєстратор = НарахуванняЗП липня, ВидРозрахунку = Відпустка,  Співробітник = Іваненко)&lt;br /&gt;
             (Реєстратор = НарахуванняЗП липня, ВидРозрахунку = Лікарняний, Співробітник = Іваненко)&lt;br /&gt;
        → Звіт «Документи до перерахунку» показує липневий документ.&lt;br /&gt;
        → Бухгалтер перепроводить → база перераховується → записи перерахунку очищаються.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Д.10. Антипатерни проєктування регістрів ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Антипатерн !! Чому погано !! Як правильно&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-1&#039;&#039;&#039; || Дата як &#039;&#039;&#039;вимірювання&#039;&#039;&#039; у РН (замість стандартного &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;) || Таблиця підсумків множиться на кількість дат і зростає нескінченно; віртуальні таблиці &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; ігнорують це вимірювання і дають безглузді результати || Використовувати стандартний реквізит &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;. Виняток — календарі (Д.3.4), де це РВ, а не РН&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-2&#039;&#039;&#039; || РН «Залишки» там, де потрібна лише історія значення || Надлишкові таблиці підсумків, кумулятивні оновлення, вид руху без сенсу || РВ періодичний&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-3&#039;&#039;&#039; || РН «Залишки» там, де залишок безглуздий (Продажі, Витрати) || Удвічі більший обсяг підсумків, кумулятивні MERGE на всі майбутні періоди || РН «Обороти» + агрегати (Д.5.1)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-4&#039;&#039;&#039; || Реквізит документа продубльовано у вимірювання «щоб фільтрувати у звіті» || Кардинальність підсумків × N; типовий випадок — Менеджер/Валюта/Коментар || Реквізит регістру + з&#039;єднання з документом у звіті; або окремий регістр «Обороти»&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-5&#039;&#039;&#039; || &amp;gt; 8 вимірювань в одному РН || Таблиця підсумків стає &#039;&#039;&#039;більшою&#039;&#039;&#039; за таблицю рухів; проведення сповільнюється в рази || Розділити на регістри за призначенням; частину аналітики — в «Обороти» з агрегатами&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-6&#039;&#039;&#039; || Незалежний РВ «у межах секунди» як журнал подій || Два записи в ту саму секунду → другий &#039;&#039;&#039;мовчки замістить&#039;&#039;&#039; перший; втрата даних || Підпорядкований РВ (реєстратор у ключі) або додати вимірювання-дискримінатор&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-7&#039;&#039;&#039; || Ресурс типу &amp;lt;code&amp;gt;Рядок&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Посилання&amp;lt;/code&amp;gt; у РН || Підсумовування неможливе; підсумки не побудуються || Реквізит (не агрегується) або вимірювання (якщо це розріз)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-8&#039;&#039;&#039; || Прямий &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt; таблиці підсумків із прикладного коду || Розсинхронізація підсумків і рухів; діагностика — тижні || Тільки через набори записів. Заборона на рівні прав БД (розділ 12.2)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-9&#039;&#039;&#039; || Один «універсальний» регістр із вимірюванням &amp;lt;code&amp;gt;ВидОбліку&amp;lt;/code&amp;gt; (БУ/ПУ/УО) замість трьох || Втричі більша таблиця; конкуренція за блокування між незалежними обліками; неможливо окремо перерахувати підсумки || Окремі регістри. Виняток — РБ &amp;lt;code&amp;gt;ПодатковийОблік&amp;lt;/code&amp;gt; (Д.6.2), де ВидРізниці — це справді розріз одного обліку&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-10&#039;&#039;&#039; || Функціонально залежне поле як вимірювання (Валюта при БанківськомуРахунку) || Надлишковість; ризик неузгоджених даних; зайвий розмір ключа підсумків || З&#039;єднання з довідником у запиті (Д.4.4)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-11&#039;&#039;&#039; || РБ там, де достатньо РН || Замість 1 таблиці — 10; ~70 % вартості проведення (Д.8); складність субконто без потреби || РН. РБ — лише коли потрібні план рахунків, подвійний запис і кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-12&#039;&#039;&#039; || Вимірювання з &amp;lt;code&amp;gt;nullable&amp;lt;/code&amp;gt; без потреби || Порожнє посилання — окреме значення ключа; підсумки «розмазуються» на два рядки замість одного || &amp;lt;code&amp;gt;denyEmpty: true&amp;lt;/code&amp;gt; скрізь, де порожнє значення не має сенсу&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-13&#039;&#039;&#039; || Контроль залишків &#039;&#039;&#039;до&#039;&#039;&#039; запису рухів || Класична гонитва: два сеанси проходять контроль і обидва списують у мінус || Спершу &amp;lt;code&amp;gt;DataLock&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;WriteNow()&amp;lt;/code&amp;gt; → потім контроль (Д.8, ФТ-Т-12)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-14&#039;&#039;&#039; || &amp;lt;code&amp;gt;periodicity: WithinSecond&amp;lt;/code&amp;gt; «про всяк випадок» скрізь || Для РВ — неможливість замістити запис за день; для РН — марна точність, більші індекси || Обирати мінімально достатню: день для цін/курсів/виписок, секунда — для складських рухів&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-15&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;(Python)&#039;&#039; || Запис рухів у циклі: &amp;lt;code&amp;gt;for r in Товари: rs.add(...).write()&amp;lt;/code&amp;gt; || Порушення АП-1: 100 round-trip&#039;ів замість 1; проведення 300 мс → ~10 с. Невидиме на тестових даних, катастрофічне на продуктиві. Найчастіша помилка при ORM-мисленні || Наповнити набір повністю (&amp;lt;code&amp;gt;rs.extend(генератор)&amp;lt;/code&amp;gt;), записати один раз. Детектор — Додаток Е.7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-16&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;(Python)&#039;&#039; || Агрегація дельт підсумків у Python (&amp;lt;code&amp;gt;defaultdict&amp;lt;/code&amp;gt; + цикл) замість &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt; || Порушення АП-2: дані ганяються в застосунок і назад; на 10&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; рядків — десятки секунд || &amp;lt;code&amp;gt;INSERT … ON CONFLICT DO UPDATE&amp;lt;/code&amp;gt; одним запитом (Е.3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.11. Чек-лист рев&#039;ю нового регістру ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
□ Тип регістру обґрунтований за деревом Д.1&lt;br /&gt;
□ Кожне вимірювання використовується у фільтрі АБО групуванні звітів&lt;br /&gt;
□ Кожен ресурс має сенс при підсумовуванні&lt;br /&gt;
□ Немає полів з антипатернів А-1, А-4, А-7, А-10, А-12&lt;br /&gt;
□ Оцінка кардинальності підсумків ≤ 10^8 (калькулятор конструктора, ФТ-К-03)&lt;br /&gt;
□ Для вимірювань, де порожнє значення безглузде, стоїть denyEmpty&lt;br /&gt;
□ Ведучі (master) вимірювання визначені — інакше «висячі» записи при видаленні об&#039;єктів&lt;br /&gt;
□ Склад реєстраторів повний; зайвих типів документів немає&lt;br /&gt;
□ Угода про знак / вид руху зафіксована в методологічній документації&lt;br /&gt;
□ Періодичність мінімально достатня (А-14)&lt;br /&gt;
□ Для РН «Обороти» з &amp;gt;4 вимірюваннями визначено ≥1 агрегат&lt;br /&gt;
□ Для РБ: балансові/небалансові вимірювання та ресурси розставлені свідомо&lt;br /&gt;
□ Для РР: витісняючі та базові види розрахунку в ПВР заповнені; перерахунки визначені&lt;br /&gt;
□ Партиціонування ввімкнене, якщо очікується &amp;gt;100 млн записів&lt;br /&gt;
□ Написано тест на проведення + скасування + перерахунок підсумків&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Додаток Е. Ескізи реалізації ядра на Python ==&lt;br /&gt;
&lt;br /&gt;
Додаток демонструє, що метамодель розділу 6 і фізична модель розділу 8 реалізовні обраним стеком (розділ 4.3), і фіксує ключові технічні рішення для етапів Е1, Е3, Е5, Е7, Е11. Код — ілюстративний ескіз, а не остаточний API.&lt;br /&gt;
&lt;br /&gt;
=== Е.1. Маніфест регістру як Pydantic-модель (етап Е1) ===&lt;br /&gt;
&lt;br /&gt;
YAML-декларації розділу 6.7 і Додатка Д валідуються цією моделлю. Це &#039;&#039;&#039;безпосередньо реалізує ФТ-К-01&#039;&#039;&#039; (валідація в реальному часі) і частину контролю антипатернів Д.10.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
import warnings&lt;br /&gt;
from enum import StrEnum&lt;br /&gt;
from typing import Annotated, Literal, Self&lt;br /&gt;
&lt;br /&gt;
from pydantic import BaseModel, ConfigDict, Field, model_validator&lt;br /&gt;
&lt;br /&gt;
IDENT = r&amp;quot;^[^\W\d]\w{0,79}$&amp;quot;          # Unicode-ідентифікатор (кирилиця дозволена), &amp;lt;= 80 симв.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RegisterKind(StrEnum):&lt;br /&gt;
    INFORMATION = &amp;quot;Information&amp;quot;&lt;br /&gt;
    ACCUMULATION = &amp;quot;Accumulation&amp;quot;&lt;br /&gt;
    ACCOUNTING = &amp;quot;Accounting&amp;quot;&lt;br /&gt;
    CALCULATION = &amp;quot;Calculation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Periodicity(StrEnum):&lt;br /&gt;
    NONPERIODICAL = &amp;quot;Nonperiodical&amp;quot;&lt;br /&gt;
    WITHIN_SECOND = &amp;quot;WithinSecond&amp;quot;&lt;br /&gt;
    WITHIN_DAY = &amp;quot;WithinDay&amp;quot;&lt;br /&gt;
    WITHIN_MONTH = &amp;quot;WithinMonth&amp;quot;&lt;br /&gt;
    WITHIN_QUARTER = &amp;quot;WithinQuarter&amp;quot;&lt;br /&gt;
    WITHIN_YEAR = &amp;quot;WithinYear&amp;quot;&lt;br /&gt;
    BY_RECORDER_POSITION = &amp;quot;ByRecorderPosition&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class WriteMode(StrEnum):&lt;br /&gt;
    INDEPENDENT = &amp;quot;Independent&amp;quot;&lt;br /&gt;
    SUBORDINATE = &amp;quot;SubordinateToRecorder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class FieldRole(StrEnum):&lt;br /&gt;
    DIMENSION = &amp;quot;Dimension&amp;quot;&lt;br /&gt;
    RESOURCE = &amp;quot;Resource&amp;quot;&lt;br /&gt;
    ATTRIBUTE = &amp;quot;Attribute&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RegisterField(BaseModel):&lt;br /&gt;
    model_config = ConfigDict(extra=&amp;quot;forbid&amp;quot;, frozen=True)&lt;br /&gt;
&lt;br /&gt;
    name: Annotated[str, Field(pattern=IDENT)]&lt;br /&gt;
    role: FieldRole&lt;br /&gt;
    type: str | list[str]                 # &amp;quot;Довідник.Номенклатура&amp;quot; | [&amp;quot;Документ.А&amp;quot;, &amp;quot;Документ.Б&amp;quot;]&lt;br /&gt;
    synonym: str | None = None&lt;br /&gt;
    index: bool = False&lt;br /&gt;
    master: bool = False                  # «Ведуче»&lt;br /&gt;
    deny_empty: bool = False&lt;br /&gt;
    nullable: bool = False&lt;br /&gt;
    use_in_totals: bool = True&lt;br /&gt;
    # РБ&lt;br /&gt;
    balance: bool = False&lt;br /&gt;
    accounting_flag: str | None = None&lt;br /&gt;
    # РР&lt;br /&gt;
    base_dimension: bool = False&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def is_composite(self) -&amp;gt; bool:&lt;br /&gt;
        return isinstance(self.type, list) and len(self.type) &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Register(BaseModel):&lt;br /&gt;
    model_config = ConfigDict(extra=&amp;quot;forbid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    name: Annotated[str, Field(pattern=IDENT)]&lt;br /&gt;
    kind: RegisterKind&lt;br /&gt;
    synonym: str | None = None&lt;br /&gt;
    periodicity: Periodicity = Periodicity.NONPERIODICAL&lt;br /&gt;
    write_mode: WriteMode = WriteMode.SUBORDINATE&lt;br /&gt;
    dimensions: list[RegisterField] = []&lt;br /&gt;
    resources: list[RegisterField] = []&lt;br /&gt;
    attributes: list[RegisterField] = []&lt;br /&gt;
    recorders: list[str] = []&lt;br /&gt;
    # РН&lt;br /&gt;
    accumulation_kind: Literal[&amp;quot;Balance&amp;quot;, &amp;quot;Turnover&amp;quot;] | None = None&lt;br /&gt;
    enable_balance_totals: bool = True&lt;br /&gt;
    enable_turnover_totals: bool = False&lt;br /&gt;
    turnover_totals_period: Literal[&amp;quot;Day&amp;quot;, &amp;quot;Month&amp;quot;] | None = None&lt;br /&gt;
    # РБ&lt;br /&gt;
    chart_of_accounts: str | None = None&lt;br /&gt;
    correspondence: bool = True&lt;br /&gt;
    max_extdim_count: Annotated[int, Field(ge=0, le=5)] = 3&lt;br /&gt;
    # РР&lt;br /&gt;
    calculation_types_plan: str | None = None&lt;br /&gt;
    action_period: bool = False&lt;br /&gt;
    base_period: Literal[&amp;quot;None&amp;quot;, &amp;quot;ByActionPeriod&amp;quot;, &amp;quot;ByRegistrationPeriod&amp;quot;] = &amp;quot;None&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # ---------- крос-полева валідація (розділи 6.2–6.6) ----------&lt;br /&gt;
    @model_validator(mode=&amp;quot;after&amp;quot;)&lt;br /&gt;
    def _validate(self) -&amp;gt; Self:&lt;br /&gt;
        if self.write_mode is WriteMode.INDEPENDENT and self.kind is not RegisterKind.INFORMATION:&lt;br /&gt;
            raise ValueError(&amp;quot;Незалежний режим запису дозволено лише для регістру відомостей&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if self.kind is RegisterKind.ACCUMULATION:&lt;br /&gt;
            if self.accumulation_kind is None:&lt;br /&gt;
                raise ValueError(&amp;quot;Для регістру накопичення обов&#039;язковий accumulation_kind&amp;quot;)&lt;br /&gt;
            if self.periodicity is Periodicity.NONPERIODICAL:&lt;br /&gt;
                raise ValueError(&amp;quot;Регістр накопичення не може бути неперіодичним&amp;quot;)&lt;br /&gt;
            if self.accumulation_kind == &amp;quot;Turnover&amp;quot; and self.enable_balance_totals:&lt;br /&gt;
                raise ValueError(&amp;quot;Підсумки залишків несумісні з видом «Обороти»&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if self.kind is RegisterKind.ACCOUNTING and not self.chart_of_accounts:&lt;br /&gt;
            raise ValueError(&amp;quot;Для регістру бухгалтерії обов&#039;язковий chart_of_accounts&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if self.kind is RegisterKind.CALCULATION:&lt;br /&gt;
            if not self.calculation_types_plan:&lt;br /&gt;
                raise ValueError(&amp;quot;Для регістру розрахунку обов&#039;язковий calculation_types_plan&amp;quot;)&lt;br /&gt;
            if not any(f.base_dimension for f in self.dimensions) and self.base_period != &amp;quot;None&amp;quot;:&lt;br /&gt;
                raise ValueError(&amp;quot;Задано base_period, але жодне вимірювання не позначене base_dimension&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # ресурс має бути підсумовуваним (антипатерн А-7)&lt;br /&gt;
        if self.kind is not RegisterKind.INFORMATION:&lt;br /&gt;
            for r in self.resources:&lt;br /&gt;
                if not _is_numeric(r.type):&lt;br /&gt;
                    raise ValueError(f&amp;quot;Ресурс «{r.name}»: тип {r.type} не підсумовується (А-7). &amp;quot;&lt;br /&gt;
                                     f&amp;quot;Використайте роль Attribute або Dimension&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # обмеження розділу 6.6&lt;br /&gt;
        if len(self.dimensions) &amp;gt; 20:&lt;br /&gt;
            raise ValueError(f&amp;quot;Вимірювань {len(self.dimensions)} &amp;gt; 20 (розділ 6.6)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # попередження (ФТ-К-01: warnings, а не помилки)&lt;br /&gt;
        if len(self.dimensions) &amp;gt; 8:&lt;br /&gt;
            warnings.warn(f&amp;quot;«{self.name}»: {len(self.dimensions)} вимірювань — &amp;quot;&lt;br /&gt;
                          f&amp;quot;ризик розростання таблиці підсумків (антипатерн А-5)&amp;quot;)&lt;br /&gt;
        for d in self.dimensions:&lt;br /&gt;
            if d.type == &amp;quot;Дата&amp;quot; and self.kind is RegisterKind.ACCUMULATION:&lt;br /&gt;
                warnings.warn(f&amp;quot;«{self.name}.{d.name}»: Дата як вимірювання РН — антипатерн А-1&amp;quot;)&lt;br /&gt;
        return self&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що це дає безкоштовно:&#039;&#039;&#039; валідацію YAML, JSON Schema для web-конструктора (&amp;lt;code&amp;gt;Register.model_json_schema()&amp;lt;/code&amp;gt;), типізовані об&#039;єкти для генератора DDL, детальні повідомлення про помилки з шляхом до поля.&lt;br /&gt;
&lt;br /&gt;
=== Е.2. Генератор DDL на SQLAlchemy Core (етап Е1) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections.abc import Callable, Sequence&lt;br /&gt;
&lt;br /&gt;
from sqlalchemy import (Boolean, Column, DateTime, Index, Integer, MetaData, Numeric,&lt;br /&gt;
                        PrimaryKeyConstraint, SmallInteger, String, Table, Uuid, text)&lt;br /&gt;
from sqlalchemy.types import TypeEngine&lt;br /&gt;
&lt;br /&gt;
PRIMITIVE: dict[str, Callable[[RegisterField], TypeEngine]] = {&lt;br /&gt;
    &amp;quot;Число&amp;quot;: lambda f: Numeric(f.precision, f.scale),&lt;br /&gt;
    &amp;quot;Рядок&amp;quot;: lambda f: String(f.length),&lt;br /&gt;
    &amp;quot;Дата&amp;quot;: lambda f: DateTime(timezone=False),&lt;br /&gt;
    &amp;quot;Булево&amp;quot;: lambda f: Boolean(),&lt;br /&gt;
    &amp;quot;УНІ&amp;quot;: lambda f: Uuid(),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def columns_for_field(f: RegisterField, prefix: str) -&amp;gt; list[Column]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Одне поле метаданих -&amp;gt; 1..6 фізичних колонок (розділ 8.2).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if f.is_composite:                                   # складений тип: розділ 8.2.2&lt;br /&gt;
        return [&lt;br /&gt;
            Column(f&amp;quot;{prefix}_t&amp;quot;, SmallInteger, nullable=False),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_b&amp;quot;, Boolean),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_n&amp;quot;, Numeric(38, 10)),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_s&amp;quot;, String(f.max_string_len)),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_d&amp;quot;, DateTime),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_r&amp;quot;, Uuid),&lt;br /&gt;
        ]&lt;br /&gt;
    if f.is_reference:                                   # просте посилання&lt;br /&gt;
        return [Column(f&amp;quot;{prefix}_r&amp;quot;, Uuid, nullable=f.nullable)]&lt;br /&gt;
    base = f.base_type&lt;br /&gt;
    return [Column(prefix, PRIMITIVE[base](f), nullable=f.nullable)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def build_movement_table(reg: Register, md: MetaData) -&amp;gt; Table:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Метаопис -&amp;gt; Table. Розділи 8.4–8.7.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    cols: list[Column] = []&lt;br /&gt;
&lt;br /&gt;
    if reg.write_mode is WriteMode.SUBORDINATE:&lt;br /&gt;
        cols += [&lt;br /&gt;
            Column(&amp;quot;rec_t&amp;quot;, SmallInteger, nullable=False),&lt;br /&gt;
            Column(&amp;quot;rec_r&amp;quot;, Uuid, nullable=False),&lt;br /&gt;
            Column(&amp;quot;line_no&amp;quot;, Integer, nullable=False),&lt;br /&gt;
            Column(&amp;quot;active&amp;quot;, Boolean, nullable=False, server_default=text(&amp;quot;true&amp;quot;)),&lt;br /&gt;
        ]&lt;br /&gt;
    if reg.periodicity is not Periodicity.NONPERIODICAL:&lt;br /&gt;
        cols.append(Column(&amp;quot;period&amp;quot;, DateTime, nullable=False))&lt;br /&gt;
    if reg.kind is RegisterKind.ACCUMULATION and reg.accumulation_kind == &amp;quot;Balance&amp;quot;:&lt;br /&gt;
        cols.append(Column(&amp;quot;mvt&amp;quot;, SmallInteger, nullable=False))   # ВидРуху&lt;br /&gt;
    if reg.kind is RegisterKind.CALCULATION:&lt;br /&gt;
        cols += [Column(&amp;quot;calc_type_r&amp;quot;, Uuid, nullable=False),&lt;br /&gt;
                 Column(&amp;quot;reversal&amp;quot;, Boolean, nullable=False, server_default=text(&amp;quot;false&amp;quot;))]&lt;br /&gt;
        if reg.action_period:&lt;br /&gt;
            cols += [Column(&amp;quot;act_begin&amp;quot;, DateTime, nullable=False),&lt;br /&gt;
                     Column(&amp;quot;act_end&amp;quot;, DateTime, nullable=False)]&lt;br /&gt;
        if reg.base_period != &amp;quot;None&amp;quot;:&lt;br /&gt;
            cols += [Column(&amp;quot;base_begin&amp;quot;, DateTime), Column(&amp;quot;base_end&amp;quot;, DateTime)]&lt;br /&gt;
&lt;br /&gt;
    for f in reg.all_fields:                              # dimensions + resources + attributes&lt;br /&gt;
        cols += columns_for_field(f, reg.column_prefix(f))   # &#039;d3&#039;, &#039;r1&#039;, &#039;a2&#039;&lt;br /&gt;
&lt;br /&gt;
    t = Table(reg.physical_table, md, *cols,&lt;br /&gt;
              PrimaryKeyConstraint(*primary_key_columns(reg),&lt;br /&gt;
                                   name=f&amp;quot;pk_{reg.physical_table}&amp;quot;),&lt;br /&gt;
              postgresql_partition_by=partition_clause(reg))&lt;br /&gt;
&lt;br /&gt;
    for f in reg.dimensions:&lt;br /&gt;
        if f.index:&lt;br /&gt;
            Index(f&amp;quot;ix_{reg.physical_table}_{reg.column_prefix(f)}&amp;quot;,&lt;br /&gt;
                  *index_columns(reg, f),&lt;br /&gt;
                  postgresql_where=t.c.active if &amp;quot;active&amp;quot; in t.c else None)&lt;br /&gt;
    return t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;НФВ-16 / НФВ-17 (дві СКБД, ізольований шар діалекту) — у три рядки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from sqlalchemy.dialects import mssql, postgresql&lt;br /&gt;
from sqlalchemy.schema import CreateTable&lt;br /&gt;
&lt;br /&gt;
md = MetaData()&lt;br /&gt;
t = build_movement_table(reg_goods, md)&lt;br /&gt;
&lt;br /&gt;
print(CreateTable(t).compile(dialect=postgresql.dialect()))   # -&amp;gt; CREATE TABLE rg_a_0012 (...)&lt;br /&gt;
print(CreateTable(t).compile(dialect=mssql.dialect()))        # -&amp;gt; той самий об&#039;єкт у T-SQL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Це і є головний аргумент на користь Python у цьому проєкті.&#039;&#039;&#039; SQLAlchemy Core — фактично готовий «шар діалекту СКБД» (НФВ-17) і модель схеми, які в C#/Delphi довелося б писати самостійно. Разом із Alembic (Е10) і Pydantic (Е.1) це знімає ~1,5 чол.-міс. з етапів Е1 і Е10 (розділ 14.1).}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реалізація ФТ-К-02&#039;&#039;&#039; («Показати SQL» у конструкторі) — той самий виклик &amp;lt;code&amp;gt;CreateTable(t).compile(...)&amp;lt;/code&amp;gt;, виведений у UI.&lt;br /&gt;
&lt;br /&gt;
=== Е.3. Інкрементальне оновлення підсумків (етап Е3) ===&lt;br /&gt;
&lt;br /&gt;
Реалізація алгоритму 10.2 з дотриманням АП-1 (один запит на весь набір) і ФТ-34 (детермінований порядок проти дедлоків).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from operator import itemgetter&lt;br /&gt;
from collections.abc import Sequence&lt;br /&gt;
&lt;br /&gt;
from sqlalchemy import Connection, Table&lt;br /&gt;
from sqlalchemy.dialects.postgresql import insert as pg_insert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge_totals(conn: Connection, totals: Table, rows: list[dict],&lt;br /&gt;
                 key: Sequence[str], res: Sequence[str]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;АП-1 + АП-2: одна операція на весь набір дельт; складання виконує СКБД.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not rows:&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    rows.sort(key=itemgetter(*key))          # ФТ-34: детермінований порядок -&amp;gt; без дедлоків&lt;br /&gt;
&lt;br /&gt;
    stmt = pg_insert(totals).values(rows)&lt;br /&gt;
    stmt = stmt.on_conflict_do_update(&lt;br /&gt;
        index_elements=list(key),&lt;br /&gt;
        set_={r: totals.c[r] + stmt.excluded[r] for r in res},   # r1 = t.r1 + EXCLUDED.r1&lt;br /&gt;
    )&lt;br /&gt;
    conn.execute(stmt)                       # 1 round-trip незалежно від len(rows)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для MS SQL&#039;&#039;&#039; — той самий інтерфейс, інша реалізація (&amp;lt;code&amp;gt;MERGE ... WHEN MATCHED THEN UPDATE&amp;lt;/code&amp;gt;) за діалектним диспетчером. Ізоляція — на рівні функції, прикладний код не знає про діалект.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Чому НЕ ORM:&#039;&#039;&#039; ORM-варіант (&amp;lt;code&amp;gt;session.merge(obj)&amp;lt;/code&amp;gt; у циклі) дав би &amp;lt;code&amp;gt;len(rows)&amp;lt;/code&amp;gt; round-trip&#039;ів — пряме порушення АП-1 і зростання НФВ-04 на два порядки. Саме тому ORM заборонений у розділі 4.3.&lt;br /&gt;
&lt;br /&gt;
=== Е.4. Транслятор віртуальних таблиць (етап Е5) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from functools import lru_cache&lt;br /&gt;
&lt;br /&gt;
from lark import Lark, Transformer&lt;br /&gt;
from sqlalchemy import Select, func, literal, select, union_all&lt;br /&gt;
&lt;br /&gt;
GRAMMAR = r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    ?query        : &amp;quot;ВИБРАТИ&amp;quot;i select_list &amp;quot;З&amp;quot;i source [where] [group_by] [order_by]&lt;br /&gt;
    source        : virtual_table | plain_table&lt;br /&gt;
    virtual_table : REGISTER_PATH &amp;quot;.&amp;quot; VT_NAME &amp;quot;(&amp;quot; [vt_args] &amp;quot;)&amp;quot; [&amp;quot;ЯК&amp;quot;i alias]&lt;br /&gt;
    VT_NAME       : &amp;quot;Залишки&amp;quot;i | &amp;quot;Обороти&amp;quot;i | &amp;quot;ЗалишкиІОбороти&amp;quot;i&lt;br /&gt;
                  | &amp;quot;ЗрізОстанніх&amp;quot;i | &amp;quot;ЗрізПерших&amp;quot;i | &amp;quot;ОборотиДтКт&amp;quot;i&lt;br /&gt;
                  | &amp;quot;ДаніГрафіка&amp;quot;i | &amp;quot;ФактичнийПеріодДії&amp;quot;i | &amp;quot;БазаРозрахунку&amp;quot;i&lt;br /&gt;
    vt_args       : (expr | )  (&amp;quot;,&amp;quot; (expr | ))*        // позиційні, можуть бути порожні&lt;br /&gt;
    ...&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class QueryCompiler:&lt;br /&gt;
    def __init__(self, schema: SchemaRegistry) -&amp;gt; None:&lt;br /&gt;
        self._parser = Lark(GRAMMAR, parser=&amp;quot;lalr&amp;quot;, start=&amp;quot;query&amp;quot;)&lt;br /&gt;
        self._schema = schema&lt;br /&gt;
&lt;br /&gt;
    @lru_cache(maxsize=2048)                     # АП-4: кеш скомпільованих запитів&lt;br /&gt;
    def compile(self, text: str, param_signature: tuple[str, ...]) -&amp;gt; Select:&lt;br /&gt;
        tree = self._parser.parse(text)&lt;br /&gt;
        return _ToSQLAlchemy(self._schema).transform(tree)&lt;br /&gt;
&lt;br /&gt;
    def balances(self, reg: Register, period, conditions: list) -&amp;gt; Select:&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Реалізація алгоритму 10.3 в термінах SQLAlchemy Core.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        tb = self._schema.totals_balance(reg)&lt;br /&gt;
        mv = self._schema.movements(reg)&lt;br /&gt;
        dims = [tb.c[c] for c in self._schema.dimension_columns(reg)]&lt;br /&gt;
&lt;br /&gt;
        boundary = (select(func.coalesce(func.max(tb.c.period), MIN_PERIOD))&lt;br /&gt;
                    .where(tb.c.period &amp;lt;= period)&lt;br /&gt;
                    .scalar_subquery())&lt;br /&gt;
&lt;br /&gt;
        base = (select(*dims, *[func.sum(tb.c[r]).label(r) for r in reg.resource_columns])&lt;br /&gt;
                .where(tb.c.period == boundary, *conditions)      # ФТ-13: push-down&lt;br /&gt;
                .group_by(*dims))&lt;br /&gt;
&lt;br /&gt;
        signed = lambda c: case((mv.c.mvt == 0, mv.c[c]), else_=-mv.c[c])&lt;br /&gt;
        tail = (select(*[mv.c[d.name] for d in dims],&lt;br /&gt;
                       *[func.sum(signed(r)).label(r) for r in reg.resource_columns])&lt;br /&gt;
                .where(mv.c.active, mv.c.period &amp;gt; boundary, mv.c.period &amp;lt;= period, *conditions)&lt;br /&gt;
                .group_by(*[mv.c[d.name] for d in dims]))&lt;br /&gt;
&lt;br /&gt;
        u = union_all(base, tail).subquery()&lt;br /&gt;
        return (select(*[u.c[d.name] for d in dims],&lt;br /&gt;
                       *[func.sum(u.c[r]).label(f&amp;quot;{r}Залишок&amp;quot;) for r in reg.resource_columns])&lt;br /&gt;
                .group_by(*[u.c[d.name] for d in dims])&lt;br /&gt;
                .having(or_(*[func.sum(u.c[r]) != 0 for r in reg.resource_columns])))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ризик Р1 (немає мови запитів) на Python пом&#039;якшується:&#039;&#039;&#039; навіть якщо повноцінна мова запитів не буде реалізована в Е5, &amp;lt;code&amp;gt;QueryCompiler.balances()&amp;lt;/code&amp;gt; залишається придатним як програмний API — прикладний код викликає його напряму й отримує &amp;lt;code&amp;gt;Select&amp;lt;/code&amp;gt;, який можна далі з&#039;єднувати засобами SQLAlchemy Core. Це &#039;&#039;&#039;план «Б»&#039;&#039;&#039; для Р1, недоступний у мовах без подібної бібліотеки.&lt;br /&gt;
&lt;br /&gt;
=== Е.5. Витіснення: гарячий шлях за інтерфейсом (етапи Е7, Е11) ===&lt;br /&gt;
&lt;br /&gt;
Реалізація принципу АП-3 на найризикованішому вузлі (Р5 + Р10).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
from collections.abc import Callable, Sequence&lt;br /&gt;
from datetime import date, timedelta&lt;br /&gt;
from typing import Protocol&lt;br /&gt;
from uuid import UUID&lt;br /&gt;
&lt;br /&gt;
Interval = tuple[date, date]&lt;br /&gt;
ONE_DAY = timedelta(days=1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class DisplacementEngine(Protocol):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;АП-3. Бюджет (АП-4): &amp;lt;= 3 c на 10 тис. ключів × ~10 записів.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def compute(self,&lt;br /&gt;
                records: Sequence[CalcRecord],&lt;br /&gt;
                displaces: Callable[[UUID, UUID], bool]) -&amp;gt; dict[RecordKey, list[Interval]]:&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Повертає фактичні періоди дії для кожного запису (розділ 10.4).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def subtract(intervals: list[Interval], cut: Interval) -&amp;gt; list[Interval]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Різниця множин інтервалів. Найгарячіша функція платформи.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    out: list[Interval] = []&lt;br /&gt;
    cb, ce = cut&lt;br /&gt;
    for b, e in intervals:&lt;br /&gt;
        if ce &amp;lt; b or cb &amp;gt; e:                 # не перетинаються&lt;br /&gt;
            out.append((b, e))&lt;br /&gt;
            continue&lt;br /&gt;
        if b &amp;lt; cb:&lt;br /&gt;
            out.append((b, cb - ONE_DAY))    # «хвіст» зліва&lt;br /&gt;
        if e &amp;gt; ce:&lt;br /&gt;
            out.append((ce + ONE_DAY, e))    # «хвіст» справа&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class PyDisplacementEngine:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Еталонна реалізація. Заміна на Cython/Rust не змінює виклик (АП-3).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def compute(self, records, displaces):&lt;br /&gt;
        by_key: dict[DimKey, list[CalcRecord]] = defaultdict(list)&lt;br /&gt;
        for r in records:&lt;br /&gt;
            if r.active:&lt;br /&gt;
                by_key[r.dim_key].append(r)&lt;br /&gt;
&lt;br /&gt;
        result: dict[RecordKey, list[Interval]] = {}&lt;br /&gt;
        for Z in by_key.values():&lt;br /&gt;
            if len(Z) &amp;gt; 500:                 # розділ 10.4: перехід на sweep-line&lt;br /&gt;
                result |= SweepLineEngine().compute(Z, displaces)&lt;br /&gt;
                continue&lt;br /&gt;
            Z.sort(key=lambda r: (r.priority, r.period, r.line_no))&lt;br /&gt;
            for z in Z:&lt;br /&gt;
                intervals = [(z.act_begin, z.act_end)]&lt;br /&gt;
                for w in Z:&lt;br /&gt;
                    if w is z or not displaces(w.calc_type, z.calc_type):&lt;br /&gt;
                        continue&lt;br /&gt;
                    if not _registration_periods_intersect(w, z):&lt;br /&gt;
                        continue&lt;br /&gt;
                    intervals = subtract(intervals, (w.act_begin, w.act_end))&lt;br /&gt;
                    if not intervals:&lt;br /&gt;
                        break                # повністю витіснений&lt;br /&gt;
                result[z.key] = intervals&lt;br /&gt;
        return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Property-based тести (мітигація Р5 — найпомилковішого вузла):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from hypothesis import given&lt;br /&gt;
from hypothesis import strategies as st&lt;br /&gt;
&lt;br /&gt;
dates = st.dates(min_value=date(2020, 1, 1), max_value=date(2030, 12, 31))&lt;br /&gt;
intervals = st.lists(st.tuples(dates, dates).map(lambda t: tuple(sorted(t))), max_size=20)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@given(ivs=intervals, cut=st.tuples(dates, dates).map(lambda t: tuple(sorted(t))))&lt;br /&gt;
def test_subtract_invariants(ivs: list[Interval], cut: Interval) -&amp;gt; None:&lt;br /&gt;
    out = subtract(ivs, cut)&lt;br /&gt;
    assert all(b &amp;lt;= e for b, e in out), &amp;quot;некоректні межі&amp;quot;&lt;br /&gt;
    assert not any(_overlaps(i, cut) for i in out), &amp;quot;витіснений інтервал залишився&amp;quot;&lt;br /&gt;
    # збереження міри: те, що прибрали, дорівнює перетину з cut&lt;br /&gt;
    assert _measure(out) + _measure(_intersect_all(ivs, cut)) == _measure(ivs)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Бенчмарк як блокер приймання (АП-4):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
@pytest.mark.benchmark(group=&amp;quot;displacement&amp;quot;)&lt;br /&gt;
def test_displacement_budget(benchmark, records_10k_keys) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вводиться в CI з етапу Е7. Перевищення бюджету -&amp;gt; червоний білд.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    benchmark(PyDisplacementEngine().compute, records_10k_keys, displaces)&lt;br /&gt;
    assert benchmark.stats.stats.mean &amp;lt; 3.0, (&lt;br /&gt;
        f&amp;quot;Порушено бюджет АП-4: {benchmark.stats.stats.mean:.2f} c &amp;gt; 3.0 c. &amp;quot;&lt;br /&gt;
        f&amp;quot;Розгляньте sweep-line, Cython або перенесення у SQL (daterange + GiST).&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Е.6. Генерація &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів (ФТ-К-07, етап Е1) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проблема:&#039;&#039;&#039; поля регістру доступні динамічно (&amp;lt;code&amp;gt;rs.new(Номенклатура=…)&amp;lt;/code&amp;gt;), тому &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt; не бачить одруків і помилок типів — це і є ризик Р11.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Рішення:&#039;&#039;&#039; конструктор генерує стаби з метаопису при кожній зміні конфігурації.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# k2/generated/registers/ТовариНаСкладах.pyi   -- АВТОЗГЕНЕРОВАНО. Не редагувати.&lt;br /&gt;
from datetime import datetime&lt;br /&gt;
from decimal import Decimal&lt;br /&gt;
&lt;br /&gt;
from k2.catalogs import Номенклатура, Склади, ХарактеристикиНоменклатури&lt;br /&gt;
from k2.documents import ПрихіднаНакладна, ВведенняЗалишків&lt;br /&gt;
from k2.registers import AccumulationMovementType, Record, RecordSet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ТовариНаСкладахRecord(Record):&lt;br /&gt;
    Період: datetime&lt;br /&gt;
    ВидРуху: AccumulationMovementType&lt;br /&gt;
    Номенклатура: Номенклатура&lt;br /&gt;
    Склад: Склади&lt;br /&gt;
    Характеристика: ХарактеристикиНоменклатури | None&lt;br /&gt;
    Партія: ПрихіднаНакладна | ВведенняЗалишків | None      # складений тип&lt;br /&gt;
    Кількість: Decimal&lt;br /&gt;
    Сума: Decimal&lt;br /&gt;
    Коментар: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ТовариНаСкладахRecordSet(RecordSet[ТовариНаСкладахRecord]):&lt;br /&gt;
    def new(self, *, Період: datetime, ВидРуху: AccumulationMovementType,&lt;br /&gt;
            Номенклатура: Номенклатура, Склад: Склади,&lt;br /&gt;
            Характеристика: ХарактеристикиНоменклатури | None = None,&lt;br /&gt;
            Партія: ПрихіднаНакладна | ВведенняЗалишків | None = None,&lt;br /&gt;
            Кількість: Decimal = ..., Сума: Decimal = ...,&lt;br /&gt;
            Коментар: str = ...) -&amp;gt; ТовариНаСкладахRecord: ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що це ловить у CI ще до запуску:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Помилка прикладного коду !! Без стабів !! Зі стабами&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rs.new(Номенклатур=x)&amp;lt;/code&amp;gt; — одрук у назві поля || Виняток у рантаймі при проведенні на продуктиві || &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;: unexpected keyword argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;m.Кількість = &amp;quot;багато&amp;quot;&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;InvalidOperation&amp;lt;/code&amp;gt; при записі в БД || &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;: incompatible type &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt;, expected &amp;lt;code&amp;gt;Decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;m.Склад = номенклатура&amp;lt;/code&amp;gt; — переплутані посилання || FK-помилка або, гірше, тихо неправильні дані || &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;: incompatible type&lt;br /&gt;
|-&lt;br /&gt;
| Видалили вимірювання з метаданих, код лишився || Виняток при проведенні || Червоний білд одразу після зміни конфігурації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Автодоповнення в IDE&#039;&#039;&#039; — приємний побічний ефект, який частково компенсує відсутність повноцінного конфігуратора рівня 1С на ранніх етапах.&lt;br /&gt;
&lt;br /&gt;
=== Е.7. Автоматичний детектор порушень АП-1 (етап Е3, CI) ===&lt;br /&gt;
&lt;br /&gt;
Принцип АП-1 марний без механічної перевірки — розробник порушить його ненавмисно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# tests/architecture/test_ap1_no_row_by_row.py&lt;br /&gt;
&lt;br /&gt;
@pytest.mark.parametrize(&amp;quot;scenario&amp;quot;, POSTING_SCENARIOS)&lt;br /&gt;
def test_roundtrips_do_not_scale_with_rows(db_counter, scenario) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;АП-1: кількість звернень до СКБД НЕ залежить від кількості рядків документа.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with db_counter() as c10:&lt;br /&gt;
        scenario.build(rows=10).post()&lt;br /&gt;
    with db_counter() as c100:&lt;br /&gt;
        scenario.build(rows=100).post()&lt;br /&gt;
&lt;br /&gt;
    assert c100.roundtrips &amp;lt;= c10.roundtrips + 2, (&lt;br /&gt;
        f&amp;quot;{scenario.name}: звернень до БД зросло {c10.roundtrips} -&amp;gt; {c100.roundtrips} &amp;quot;&lt;br /&gt;
        f&amp;quot;при зростанні рядків у 10 разів. Порушення АП-1 — див. розділ 4.4.&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RowByRowGuard:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Runtime-запобіжник для dev/staging: виняток при &amp;gt;N однакових запитів у транзакції.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, threshold: int = 20) -&amp;gt; None:&lt;br /&gt;
        self._counts: Counter[str] = Counter()&lt;br /&gt;
        self._threshold = threshold&lt;br /&gt;
&lt;br /&gt;
    def before_execute(self, conn, clauseelement, *args) -&amp;gt; None:&lt;br /&gt;
        fingerprint = _statement_fingerprint(clauseelement)   # SQL без літералів&lt;br /&gt;
        self._counts[fingerprint] += 1&lt;br /&gt;
        if self._counts[fingerprint] == self._threshold:&lt;br /&gt;
            raise ArchitectureViolation(&lt;br /&gt;
                f&amp;quot;Один і той самий запит виконано {self._threshold} разів у межах транзакції.\n&amp;quot;&lt;br /&gt;
                f&amp;quot;Ймовірне порушення АП-1 («жодного рядка за раз»).\n{fingerprint}&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це — найдешевша страховка проєкту.&#039;&#039;&#039; Порушення АП-1 не видно на тестових даних (10 рядків — усе швидко) і катастрофічне на продуктиві (100 рядків × 5 регістрів). Детектор вводиться &#039;&#039;&#039;з етапу Е3&#039;&#039;&#039;, а не за результатами НТ-03.&lt;br /&gt;
&lt;br /&gt;
=== Е.8. Структура репозиторію ядра ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
k2-registers/&lt;br /&gt;
├── src/k2/&lt;br /&gt;
│   ├── metadata/          # Е.1: Pydantic-моделі, репозиторій, валідація&lt;br /&gt;
│   │   ├── models.py      #   Register, RegisterField, ...&lt;br /&gt;
│   │   ├── repository.py  #   md_* таблиці&lt;br /&gt;
│   │   └── validators.py  #   ФТ-К-01, антипатерни Д.10&lt;br /&gt;
│   ├── schema/            # Е.2: генерація DDL&lt;br /&gt;
│   │   ├── builder.py     #   метаопис -&amp;gt; SQLAlchemy Table&lt;br /&gt;
│   │   ├── dialects/      #   НФВ-17: postgres.py, mssql.py&lt;br /&gt;
│   │   └── restructure.py #   Е10: Alembic-інтеграція&lt;br /&gt;
│   ├── runtime/           # набори записів, проведення, блокування&lt;br /&gt;
│   │   ├── recordset.py&lt;br /&gt;
│   │   ├── posting.py     #   розділ 7.1&lt;br /&gt;
│   │   ├── totals.py      #   Е.3: merge_totals&lt;br /&gt;
│   │   └── locks.py       #   ФТ-32&lt;br /&gt;
│   ├── query/             # Е.4: lark-граматика + компілятор&lt;br /&gt;
│   │   ├── grammar.lark&lt;br /&gt;
│   │   ├── compiler.py&lt;br /&gt;
│   │   └── virtual/       #   balances.py, turnovers.py, slices.py, calc_base.py&lt;br /&gt;
│   ├── calculation/       # Е.5: витіснення (гарячий шлях)&lt;br /&gt;
│   │   ├── protocols.py   #   DisplacementEngine&lt;br /&gt;
│   │   ├── engine_py.py   #   еталонна реалізація&lt;br /&gt;
│   │   └── engine_native/ #   [резерв] Cython/Rust — тільки за результатом бенчмарку&lt;br /&gt;
│   ├── codegen/           # Е.6: генерація .pyi-стабів&lt;br /&gt;
│   └── diagnostics/       # Е.7: RowByRowGuard, перевірка цілісності (ФТ-41)&lt;br /&gt;
├── tests/&lt;br /&gt;
│   ├── unit/&lt;br /&gt;
│   ├── property/          # hypothesis: інтервальна арифметика (Р5)&lt;br /&gt;
│   ├── architecture/      # Е.7: детектор АП-1&lt;br /&gt;
│   ├── benchmarks/        # АП-4: бюджети гарячих шляхів (gate у CI)&lt;br /&gt;
│   └── integration/       # testcontainers: PostgreSQL + MS SQL (Р7)&lt;br /&gt;
└── pyproject.toml         # uv, ruff, mypy --strict&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;Кінець документа. Версія 1.2. Підлягає узгодженню з архітектором платформи K2 ERP до затвердження.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2761</id>
		<title>Регістри в K2 ERP</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2761"/>
		<updated>2026-07-17T19:33:15Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ТЗ. Підсистема регістрів K2 ERP}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= 1. Паспорт документа =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Атрибут !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Назва || Технічне завдання на розробку підсистеми «Регістри» платформи K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| Шифр || K2-ERP-TZ-REG-001&lt;br /&gt;
|-&lt;br /&gt;
| Версія || 1.2 (чернетка на узгодження; мова ядра — Python; +Додатки Д, Е)&lt;br /&gt;
|-&lt;br /&gt;
| Статус || На розгляді&lt;br /&gt;
|-&lt;br /&gt;
| Замовник || &#039;&#039;[підрозділ-замовник]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Виконавець || &#039;&#039;[команда платформи K2 ERP]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Тип документа || Технічне завдання (ГОСТ 34.602 адаптовано)&lt;br /&gt;
|-&lt;br /&gt;
| Аналог / прототип || Механізм регістрів платформи «1С:Підприємство 8.3»&lt;br /&gt;
|-&lt;br /&gt;
| Мова розробки || &#039;&#039;&#039;Python 3.12+&#039;&#039;&#039; (див. розділ 4.3)&lt;br /&gt;
|-&lt;br /&gt;
| Технологічний стек || SQLAlchemy Core 2.x, Pydantic v2, Alembic, lark, psycopg 3 / pyodbc&lt;br /&gt;
|-&lt;br /&gt;
| СКБД || PostgreSQL 14+ (основна), MS SQL Server 2019+ (додаткова)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 1.1. Необхідні розширення MediaWiki ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Розширення !! Теги / шаблони !! Використано в документі !! Постачання&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Extension:Diagrams&#039;&#039;&#039; || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graphviz&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;uml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || 4 діаграми GraphViz + 5 діаграм PlantUML || Composer: &amp;lt;code&amp;gt;samwilson/diagrams&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Extension:SyntaxHighlight || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || 64 блоки коду (Python, SQL, YAML, lark) || &#039;&#039;&#039;Входить до складу MediaWiki&#039;&#039;&#039; — окремо встановлювати не потрібно&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Template:Note&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Note|текст}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || Примітки та проєктні рішення || Створюється вручну (код нижче)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Налаштування ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// LocalSettings.php — конфігурація ВІКІ, у якій публікується це ТЗ.&lt;br /&gt;
// MediaWiki написана на PHP; до мови розробки K2 ERP (Python, розділ 4.3) це не стосується.&lt;br /&gt;
wfLoadExtension( &#039;Diagrams&#039; );&lt;br /&gt;
&lt;br /&gt;
// ОБОВ&#039;ЯЗКОВО. За замовчуванням Diagrams рендерить у PNG; ER-діаграми розділу 9&lt;br /&gt;
// містять десятки колонок і в растрі нечитабельні.&lt;br /&gt;
$wgDiagramsDefaultFormat = &#039;svg&#039;;&lt;br /&gt;
&lt;br /&gt;
// Варіант А — локальний рендеринг (потрібні бінарники на веб-сервері):&lt;br /&gt;
//   apt install graphviz plantuml&lt;br /&gt;
// Варіант Б — зовнішній сервіс рендерингу (з версії 0.4.0 — опційний):&lt;br /&gt;
// $wgDiagramsServiceUrl = &#039;https://diagrams.example.com/subdir&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаблон &amp;lt;code&amp;gt;Template:Note&amp;lt;/code&amp;gt;, якщо його немає у вікі:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #36c; background:#eaf3ff; padding:8px 12px; margin:8px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ⓘ&#039;&#039;&#039; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Вимоги до версії та смоук-тест ===&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Мінімальна версія — 1.0.0&#039;&#039;&#039; (реліз від 15.03.2026). Саме в ній додано &amp;lt;code&amp;gt;$wgDiagramsDefaultFormat&amp;lt;/code&amp;gt;, без якого документ рендериться в PNG і ER-діаграми розділу 9 стають нечитабельними. Автор супроводжує підняття мажорної версії до 1 формулюванням, що проєкт вийшов на стабільність.}}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Інфобокс на mediawiki.org станом на дату складання ТЗ застарілий&#039;&#039;&#039; — показує версію 0.10.0 (2022) і сумісність «MediaWiki ≤ 1.39», тоді як у репозиторії 27 релізів і остання — 1.0.0 від 15.03.2026. &#039;&#039;&#039;Джерело істини — GitHub&#039;&#039;&#039; (&amp;lt;nowiki&amp;gt;https://github.com/samwilson/diagrams-extension/releases&amp;lt;/nowiki&amp;gt;), а не інфобокс вікі-сторінки. Обмеження «≤ 1.39» перевіряти не за сторінкою, а за &amp;lt;code&amp;gt;extension.json&amp;lt;/code&amp;gt; актуального релізу.}}&lt;br /&gt;
&lt;br /&gt;
Перед публікацією документа прогнати смоук-тест на цільовій вікі — по одному представнику кожного типу:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! # !! Що перевіряємо !! Де в документі !! Ознака успіху&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graphviz&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;rankdir&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;shape=record&amp;lt;/code&amp;gt;, кластери || 5.1, 8.8, 9.5, Д.1, Д.8 || Діаграма рендериться, підписи не обрізані&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;uml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;@startuml&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;entity&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;skinparam linetype ortho&amp;lt;/code&amp;gt; || 9.1–9.4 || ER-модель із колонками та позначками PK/FK&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &#039;&#039;&#039;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;uml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;@startgantt&amp;lt;/code&amp;gt;&#039;&#039;&#039; || &#039;&#039;&#039;7.5.1&#039;&#039;&#039; || Діаграма Ганта. &#039;&#039;&#039;Головний ризик:&#039;&#039;&#039; якщо розширення обгортає вміст у &amp;lt;code&amp;gt;@startuml&amp;lt;/code&amp;gt; автоматично, &amp;lt;code&amp;gt;@startgantt&amp;lt;/code&amp;gt; не спрацює&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &amp;lt;code&amp;gt;$wgDiagramsDefaultFormat = &#039;svg&#039;&amp;lt;/code&amp;gt; || будь-яка || У HTML-коді сторінки &amp;lt;code&amp;gt;&amp;amp;lt;img src=&amp;quot;…&amp;lt;b&amp;gt;.svg&amp;lt;/b&amp;gt;&amp;quot;&amp;amp;gt;&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;.png&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Кирилиця в підписах вузлів || 5.1, 6.1 || Немає «квадратиків» — на сервері є потрібні шрифти&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Щодо п. 3.&#039;&#039;&#039; Документ використовує явні роздільники &amp;lt;code&amp;gt;@startuml…@enduml&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;@startgantt…@endgantt&amp;lt;/code&amp;gt; всередині тегів. Це відповідає нормалізованій поведінці PlantUML: розробники вимагають &amp;lt;code&amp;gt;@startXYZ&amp;lt;/code&amp;gt; усюди, зокрема з прапорцем &amp;lt;code&amp;gt;-pipe&amp;lt;/code&amp;gt;, а можливість опускати роздільник збережена лише як застаріла опція для сумісності зі старими скриптами. &#039;&#039;&#039;Перевірити на смоук-тесті&#039;&#039;&#039; я не мав змоги — це єдине непідтверджене припущення в розділі. Якщо &amp;lt;code&amp;gt;@startgantt&amp;lt;/code&amp;gt; не відрендериться, замінити діаграму 7.5.1 на &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graphviz&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; або повернути ASCII-схему з історії правок.}}&lt;br /&gt;
&lt;br /&gt;
=== Альтернативи та запасний варіант ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Варіант !! Оцінка&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Extension:Diagrams ≥ 1.0.0&#039;&#039;&#039; &#039;&#039;(обрано)&#039;&#039; || Одне розширення на всі формати документа; не зберігає рендери як файли вікі; є дві реалізації сервісу рендерингу — PHP (Symfony) та &#039;&#039;&#039;Python&#039;&#039;&#039; (остання узгоджується зі стеком проєкту, розділ 4.3).&lt;br /&gt;
|-&lt;br /&gt;
| Extension:GraphViz + Extension:PlantUML окремо || &#039;&#039;&#039;Не рекомендується.&#039;&#039;&#039; Extension:GraphViz за даними трекера Wikimedia не супроводжується й потребує правок для роботи з актуальними версіями MediaWiki. Два розширення замість одного.&lt;br /&gt;
|-&lt;br /&gt;
| Mermaid (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;mermaid&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; у складі Diagrams або Extension:Mermaid) || Рендериться на клієнті, не потребує бінарників на сервері. Але &amp;lt;code&amp;gt;erDiagram&amp;lt;/code&amp;gt; Mermaid суттєво менш виразний за &amp;lt;code&amp;gt;entity&amp;lt;/code&amp;gt; PlantUML: ER-моделі розділу 9 містять типи, ознаки PK/FK та коментарі до полів — це не переноситься без втрат. Придатний для простих схем (5.1, Д.1).&lt;br /&gt;
|-&lt;br /&gt;
| Без розширень || Блоки діаграм відображатимуться як вихідний текст. &#039;&#039;&#039;Документ втрачає 9 із 12 схем&#039;&#039;&#039; — на відміну від версій ≤ 1.2, ASCII-дублів більше немає (див. нижче).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Що навмисно залишено ASCII-схемами ===&lt;br /&gt;
&lt;br /&gt;
Після переходу на Diagrams дублювання «діаграма + ASCII» прибрано: воно розходилося при правках. Але 8 блоків &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; залишено свідомо — для них Diagrams не дає виграшу:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Розділ !! Блок !! Чому не діаграма&lt;br /&gt;
|-&lt;br /&gt;
| 6.8.1–6.8.3 || Макети конструктора || PlantUML має &amp;lt;code&amp;gt;@startsalt&amp;lt;/code&amp;gt; для wireframe&#039;ів, але ASCII тут &#039;&#039;&#039;комунікує краще&#039;&#039;&#039;: він явно читається як ескіз і не створює хибного враження затвердженого дизайну. Salt додає рендер-ризик без користі.&lt;br /&gt;
|-&lt;br /&gt;
| 7.4.1 || Timeline підсумків і ТА || Схема несе формулу («Залишок = Підсумок(P) + Σ рухів») поряд із віссю часу. Gantt це не передає, а &amp;lt;code&amp;gt;@startuml&amp;lt;/code&amp;gt; timing — надмірність.&lt;br /&gt;
|-&lt;br /&gt;
| Д.9 || Наскрізний розрахунок ЗП || Це покроковий наратив із числами, а не структура. Діаграма не додасть змісту.&lt;br /&gt;
|-&lt;br /&gt;
| Д.11, Е.8 || Чек-лист і дерево репозиторію || Список і файлове дерево. &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;pre&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; — рівно те, що треба.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 2. Терміни, визначення та скорочення =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Термін !! Визначення&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Регістр&#039;&#039;&#039; || Об&#039;єкт метаданих, призначений для зберігання та накопичення структурованої облікової інформації у вигляді записів фіксованої структури, з механізмами агрегації, зрізів і транзакційного зв&#039;язку з документами-реєстраторами.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РВ&#039;&#039;&#039; || Регістр відомостей (аналог «Регистр сведений»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН&#039;&#039;&#039; || Регістр накопичення (аналог «Регистр накопления»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РБ&#039;&#039;&#039; || Регістр бухгалтерії (аналог «Регистр бухгалтерии»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РР&#039;&#039;&#039; || Регістр розрахунку (аналог «Регистр расчёта»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Вимірювання&#039;&#039;&#039; (Dimension) || Поле регістру, що визначає розріз аналітики; входить у ключ запису/підсумку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ресурс&#039;&#039;&#039; (Resource) || Поле регістру, значення якого підсумовується (для РН/РБ/РР) або зберігається як значення (для РВ).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реквізит&#039;&#039;&#039; (Attribute) || Довідкове поле запису, що не бере участі в ключі та не агрегується.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реєстратор&#039;&#039;&#039; (Recorder) || Документ, який породив набір записів регістру та володіє ним.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рухи&#039;&#039;&#039; (Movements) || Записи регістру, підпорядковані конкретному реєстратору.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Набір записів&#039;&#039;&#039; (RecordSet) || Прикладний об&#039;єкт для читання/запису групи записів регістру за заданим відбором.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Підсумки&#039;&#039;&#039; (Totals) || Попередньо розраховані агрегати (залишки/обороти), що зберігаються в окремих таблицях.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ТА&#039;&#039;&#039; || Точка актуальності підсумків — момент часу, до якого підсумки розраховані.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Зріз останніх&#039;&#039;&#039; (SliceLast) || Вибірка останніх за періодом записів РВ у розрізі кожної комбінації вимірювань.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Субконто&#039;&#039;&#039; (ExtDimension, ED) || Додатковий розріз аналітики бухгалтерського рахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ПВР&#039;&#039;&#039; || План видів розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витіснення&#039;&#039;&#039; || Механізм РР: запис із вищим пріоритетом скорочує фактичний період дії запису з нижчим.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (Recalculation) || Підпорядкований РР об&#039;єкт, що реєструє записи, які потребують повторного розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Віртуальна таблиця&#039;&#039;&#039; || Обчислювана таблиця в мові запитів, що не має фізичного відповідника (Залишки, Обороти, ЗрізОстанніх тощо).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 3. Призначення, цілі та підстава розробки =&lt;br /&gt;
&lt;br /&gt;
== 3.1. Підстава ==&lt;br /&gt;
Поточна модель K2 ERP не має уніфікованого декларативного механізму накопичувального обліку. Регістроподібні структури реалізуються &#039;&#039;ad hoc&#039;&#039; — окремими таблицями та процедурами під кожну прикладну задачу, що спричиняє:&lt;br /&gt;
* дублювання коду розрахунку залишків та оборотів;&lt;br /&gt;
* відсутність гарантованої узгодженості «документ ↔ рухи»;&lt;br /&gt;
* деградацію продуктивності на великих обсягах (повний перерахунок з початку обліку);&lt;br /&gt;
* високу вартість введення нової аналітики (зміна схеми БД + правка десятків процедур).&lt;br /&gt;
&lt;br /&gt;
== 3.2. Мета ==&lt;br /&gt;
Створити в K2 ERP підсистему &#039;&#039;&#039;декларативно описуваних регістрів&#039;&#039;&#039; чотирьох типів, функціонально еквівалентну механізму регістрів «1С:Підприємство 8.3», з автоматичною генерацією схеми БД, підтримкою підсумків, віртуальних таблиць у мові запитів і транзакційного проведення документів.&lt;br /&gt;
&lt;br /&gt;
== 3.3. Цілі проєкту (вимірювані) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Ціль !! Критерій досягнення&lt;br /&gt;
|-&lt;br /&gt;
| Ц1 || Декларативне визначення регістру || Новий регістр з 5 вимірюваннями та 3 ресурсами створюється в конструкторі без написання коду; DDL генерується автоматично.&lt;br /&gt;
|-&lt;br /&gt;
| Ц2 || Автоматична агрегація || Залишки/обороти доступні запитом без ручних процедур перерахунку.&lt;br /&gt;
|-&lt;br /&gt;
| Ц3 || Продуктивність || Отримання залишків на дату за таблицею 1 млрд рухів — ≤ 200 мс (P95) на еталонному стенді.&lt;br /&gt;
|-&lt;br /&gt;
| Ц4 || Цілісність || Неможливість існування рухів без активного реєстратора (100 % сценаріїв у тесті цілісності).&lt;br /&gt;
|-&lt;br /&gt;
| Ц5 || Міграція || Перенесення ≥ 90 % наявних «регістроподібних» структур K2 на новий механізм без втрати даних.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3.4. Що НЕ входить до обсягу (Out of scope) ==&lt;br /&gt;
* Механізм розподілених інформаційних баз / реплікації рухів (окреме ТЗ).&lt;br /&gt;
* Візуальний конструктор звітів поверх регістрів (окреме ТЗ, залежність).&lt;br /&gt;
* OLAP-куби та зовнішні аналітичні вітрини.&lt;br /&gt;
* Автоматичне перенесення прикладного коду замовника (тільки дані + мапінг).&lt;br /&gt;
&lt;br /&gt;
= 4. Припущення та обмеження щодо платформи K2 ERP =&lt;br /&gt;
&lt;br /&gt;
{{Note|Розділ фіксує припущення, які &#039;&#039;&#039;обов&#039;язково&#039;&#039;&#039; підлягають верифікації з архітектором платформи до затвердження ТЗ. Місця, що потребують уточнення, позначені як &#039;&#039;[уточнити]&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
== 4.1. Припущення щодо платформи ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Припущення !! Наслідок для ТЗ&lt;br /&gt;
|-&lt;br /&gt;
| П1 || K2 ERP має підсистему метаданих із власним репозиторієм об&#039;єктів (документи, довідники, перерахування) і механізмом версіонування конфігурації. || Регістр вбудовується як новий &#039;&#039;&#039;рід&#039;&#039;&#039; об&#039;єкта метаданих у наявний репозиторій (розділ 6).&lt;br /&gt;
|-&lt;br /&gt;
| П2 || Об&#039;єкти-документи мають унікальний ідентифікатор посилання (GUID/UUID) та проведення як окрему операцію. || Реєстратор адресується парою «код типу + UUID» (розділ 8.2).&lt;br /&gt;
|-&lt;br /&gt;
| П3 || Платформа має власну мову запитів або транслятор у SQL. || Віртуальні таблиці реалізуються на рівні транслятора (розділ 7.6). Якщо мови запитів немає — потрібен окремий етап Е0 (розділ 14).&lt;br /&gt;
|-&lt;br /&gt;
| П4 || Цільова СКБД підтримує &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;INSERT ... ON CONFLICT&amp;lt;/code&amp;gt;, віконні функції, часткові та покривні індекси. || Алгоритми підсумків (розділ 10) використовують ці можливості.&lt;br /&gt;
|-&lt;br /&gt;
| П5 || Прикладний код виконується на сервері застосунків із керованими транзакціями. || Проведення документа — одна транзакція БД (розділ 7.1).&lt;br /&gt;
|-&lt;br /&gt;
| П6 || Максимальна довжина ідентифікатора об&#039;єкта БД — 63 символи (PostgreSQL). || Фізичні імена таблиць будуються за сурогатним числовим кодом, а не за іменем регістру (розділ 8.1).&lt;br /&gt;
|-&lt;br /&gt;
| П7 || Ядро платформи розробляється на &#039;&#039;&#039;Python 3.12+&#039;&#039;&#039;; допускаються C-розширення (binary-драйвери) та, за потреби, власні нативні модулі. || Визначає стек (4.3) і архітектурні принципи АП-1…АП-6 (4.4). &#039;&#039;[верифікувати: greenfield чи є наявний Python-код K2]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| П8 || Прикладний (конфігураційний) код пишеться &#039;&#039;&#039;також на Python&#039;&#039;&#039; і виконується в тому самому процесі. || Породжує питання ізоляції та безпеки виконання довільного коду — &#039;&#039;&#039;відкрите питання В12&#039;&#039;&#039;. Якщо припущення хибне (потрібна вбудована мова) — обсяг Е1 зростає на ~2 чол.-міс.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4.2. Обмеження ==&lt;br /&gt;
&lt;br /&gt;
* О1. Зміна складу вимірювань/ресурсів існуючого регістру — операція реструктуризації з простоєм; онлайн-міграція не гарантується для таблиць &amp;gt; 100 млн записів.&lt;br /&gt;
* О2. Підсистема не гарантує коректність прикладної логіки проведення — лише цілісність механізму.&lt;br /&gt;
* О3. Мінімальна дискретність періоду — 1 секунда (тип &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt;) &#039;&#039;[уточнити: чи потрібна мілісекундна]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 4.3. Технологічний стек ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шар !! Технологія !! Обґрунтування вибору&lt;br /&gt;
|-&lt;br /&gt;
| Мова ядра || &#039;&#039;&#039;Python 3.12+&#039;&#039;&#039; (цільова 3.12; щодо 3.13 — див. В14) || Рішення замовника. Наслідки — розділ 4.4.&lt;br /&gt;
|-&lt;br /&gt;
| Статична типізація || &amp;lt;code&amp;gt;mypy --strict&amp;lt;/code&amp;gt; як gate у CI || Ядро метаданих у динамічній мові без статичної перевірки — неприйнятний ризик (Р11).&lt;br /&gt;
|-&lt;br /&gt;
| Опис і валідація метаданих || &#039;&#039;&#039;Pydantic v2&#039;&#039;&#039; || Маніфест регістру (розділ 6.7) стає типізованою моделлю: валідація, крос-полеві правила та JSON Schema для конструктора — «безкоштовно». Покриває ФТ-К-01. Приклад — Е.1.&lt;br /&gt;
|-&lt;br /&gt;
| Генерація DDL, абстракція діалектів СКБД || &#039;&#039;&#039;SQLAlchemy Core 2.x&#039;&#039;&#039; (&#039;&#039;без ORM&#039;&#039;) || Ключовий вибір. &amp;lt;code&amp;gt;MetaData&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Column&amp;lt;/code&amp;gt; — готова модель схеми; діалекти PostgreSQL і MS SQL із коробки. Прямо закриває НФВ-16, НФВ-17 і знижує ризик Р7. Приклад — Е.2.&lt;br /&gt;
|-&lt;br /&gt;
| Міграції / реструктуризація || &#039;&#039;&#039;Alembic&#039;&#039;&#039; || Автогенерація &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt; при зміні складу полів (Е10, НФВ-13, НФВ-15).&lt;br /&gt;
|-&lt;br /&gt;
| Драйвери || &#039;&#039;&#039;psycopg 3&#039;&#039;&#039; (binary, pipeline mode) або &amp;lt;code&amp;gt;asyncpg&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;pyodbc&amp;lt;/code&amp;gt; для MS SQL || Pipeline mode критичний для АП-1: пакетна вставка без round-trip на рядок.&lt;br /&gt;
|-&lt;br /&gt;
| Парсер мови запитів || &#039;&#039;&#039;lark&#039;&#039;&#039; (LALR) → AST → SQLAlchemy Core || Етап Е5. Дешевше за власний парсер; граматика декларативна. Ескіз — Е.4.&lt;br /&gt;
|-&lt;br /&gt;
| Гарячі шляхи || &#039;&#039;&#039;Cython&#039;&#039;&#039; / &amp;lt;code&amp;gt;mypyc&amp;lt;/code&amp;gt;; за потреби &#039;&#039;&#039;Rust&#039;&#039;&#039; (PyO3 + maturin) || Тільки за результатами бенчмарку (АП-3, Р10, В13).&lt;br /&gt;
|-&lt;br /&gt;
| Сервер застосунків || FastAPI + uvicorn; окремий пул процесів для проведення || —&lt;br /&gt;
|-&lt;br /&gt;
| Паралелізм || &#039;&#039;&#039;Процеси&#039;&#039;&#039; + &amp;lt;code&amp;gt;asyncio&amp;lt;/code&amp;gt; для IO. &#039;&#039;&#039;Потоки — ні&#039;&#039;&#039; (GIL) || Принцип АП-5.&lt;br /&gt;
|-&lt;br /&gt;
| Тестування || pytest, pytest-benchmark, &#039;&#039;&#039;hypothesis&#039;&#039;&#039; (property-based), testcontainers || Hypothesis обов&#039;язковий для витіснення (Р5): інтервальна арифметика — ідеальний кандидат на property-based тести.&lt;br /&gt;
|-&lt;br /&gt;
| Профілювання || py-spy, scalene, &amp;lt;code&amp;gt;EXPLAIN (ANALYZE, BUFFERS)&amp;lt;/code&amp;gt; || Етап Е11.&lt;br /&gt;
|-&lt;br /&gt;
| Збірка || uv, ruff, wheels із нативними розширеннями під усі цільові платформи || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Явні заборони:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;ORM SQLAlchemy не використовується.&#039;&#039;&#039; Регістри працюють наборами записів, а не об&#039;єктами; identity map і lazy loading тут шкідливі й провокують порушення АП-1. Використовується &#039;&#039;&#039;лише Core&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;PyPy не розглядається&#039;&#039;&#039; — несумісність із binary-драйверами та нативними розширеннями.&lt;br /&gt;
* &#039;&#039;&#039;Free-threaded build (PEP 703)&#039;&#039;&#039; — моніторити, але не закладати в архітектуру (В14).&lt;br /&gt;
&lt;br /&gt;
== 4.4. Наслідки вибору Python: архітектурні принципи ==&lt;br /&gt;
&lt;br /&gt;
Python на CPU-навантаженні повільніший за компільовані мови приблизно в 30–80 разів. Проєктована архітектура цьому &#039;&#039;&#039;не суперечить&#039;&#039;&#039;: основну роботу виконує СКБД, а ядро лише формує SQL. Але це вірно &#039;&#039;&#039;тільки за умови&#039;&#039;&#039; дотримання наведених принципів — їх порушення робить цілі НФВ недосяжними.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Принцип !! Формулювання&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-1&#039;&#039;&#039; || &#039;&#039;&#039;«Жодного рядка за раз»&#039;&#039;&#039; || &#039;&#039;&#039;Заборонено:&#039;&#039;&#039; цикл Python із запитом до БД усередині; вставка рухів по одному; читання підсумків по одному ключу. &#039;&#039;&#039;Обов&#039;язково:&#039;&#039;&#039; &amp;lt;code&amp;gt;executemany&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; / pipeline, set-based &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;, один запит на набір записів. Детектор порушень — Е.7.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-2&#039;&#039;&#039; || &#039;&#039;&#039;Ядро — оркестратор, СКБД — обчислювач&#039;&#039;&#039; || Python формує SQL і передає керування. Агрегація, з&#039;єднання, сортування — в СКБД. Виняток — гарячі шляхи АП-4, де це неможливо.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-3&#039;&#039;&#039; || &#039;&#039;&#039;Гарячі шляхи ізольовані за інтерфейсом&#039;&#039;&#039; || Кожен кандидат на нативне переписування реалізується за &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt;-інтерфейсом з еталонною Python-реалізацією та бенчмарком у CI. Заміна на Cython/Rust не змінює виклик. Приклад — Е.5.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-4&#039;&#039;&#039; || &#039;&#039;&#039;Бюджет Python-часу зафіксовано&#039;&#039;&#039; || Див. 4.4.1. Перевищення бюджету — блокер приймання етапу.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-5&#039;&#039;&#039; || &#039;&#039;&#039;Паралелізм — процесами&#039;&#039;&#039; || GIL робить потоки марними для CPU-роботи. Проведення IO-bound → &amp;lt;code&amp;gt;asyncio&amp;lt;/code&amp;gt;; масштабування — пулом процесів за кількістю ядер.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-6&#039;&#039;&#039; || &#039;&#039;&#039;Типізація на межах&#039;&#039;&#039; || &amp;lt;code&amp;gt;mypy --strict&amp;lt;/code&amp;gt; на ядрі; Pydantic v2 на всіх межах. Динамічний доступ до полів регістру компенсується генерацією &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів (ФТ-К-07, Е.6).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4.1. Бюджет Python-часу на гарячих шляхах (АП-4) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шлях !! Розділ !! Обсяг операцій !! Оцінка Python !! Ризик !! Мітигація&lt;br /&gt;
|-&lt;br /&gt;
| Формування рухів документа (100 рядків × 5 регістрів) || 7.1, Д.8 || ~500 конструювань об&#039;єктів || 2–5 мс || Низький || —&lt;br /&gt;
|-&lt;br /&gt;
| Серіалізація рухів у пакетну вставку || 7.1 || ~500 кортежів || 1–3 мс || Низький || psycopg 3 pipeline / &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Оновлення підсумків || 10.2 || 1 SQL &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt; на регістр || ≈ 0 мс || Низький || set-based (Е.3)&lt;br /&gt;
|-&lt;br /&gt;
| Трансляція віртуальної таблиці || 7.3, 10.3 || парсинг + побудова AST || 1–10 мс || Середній || LRU-кеш скомпільованих запитів за хешем (текст + сигнатура параметрів)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витіснення періодів дії&#039;&#039;&#039; || 10.4 || O(\|Z\|²) на ключ; 10 тис. ключів × ~10 записів ≈ 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; інтервальних операцій || &#039;&#039;&#039;1–3 с&#039;&#039;&#039; || &#039;&#039;&#039;Високий&#039;&#039;&#039; || Sweep-line O(n log n); ізоляція за АП-3; кандидат №1 на Cython/Rust; альтернатива — перенести в SQL на &amp;lt;code&amp;gt;daterange&amp;lt;/code&amp;gt; + GiST (PostgreSQL)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Розрахунок ЗП&#039;&#039;&#039; || Д.9 || 80 тис. записів × формула || &#039;&#039;&#039;4–15 с&#039;&#039;&#039; || &#039;&#039;&#039;Високий&#039;&#039;&#039; || Заборона per-record запитів (АП-1); векторизація; кандидат №2 на нативний код&lt;br /&gt;
|-&lt;br /&gt;
| Реєстрація перерахунків || 10.5 || 1 SQL &amp;lt;code&amp;gt;INSERT … SELECT&amp;lt;/code&amp;gt; || ≈ 0 мс || Низький || set-based&lt;br /&gt;
|-&lt;br /&gt;
| Генерація DDL, реструктуризація || 8, Е.2 || холодний шлях, разова операція || — || Низький || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4.2. Висновок щодо НФВ ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! НФВ !! Ціль !! Частка Python !! Вердикт&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01…03 (залишки, обороти) || 200 мс – 2 с || &amp;lt; 1 % (робота в СКБД) || &#039;&#039;&#039;Не залежить від мови ядра&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-04 (проведення 100 рядків) || 300 мс || 5–15 мс ≈ &#039;&#039;&#039;5 %&#039;&#039;&#039; || Досяжно за дотримання АП-1&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-05 (ОСВ) || 5 с || &amp;lt; 1 % || Не залежить від мови ядра&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-06 (ЗП на 10 тис. осіб) || 10 хв || 4–15 с ≈ &#039;&#039;&#039;2,5 %&#039;&#039;&#039; || Досяжно; &#039;&#039;&#039;запас ×40&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-07 (зріз останніх) || 500 мс || &amp;lt; 1 % || Не залежить від мови ядра&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-08 (50 док/с) || — || 50 × 10 мс = 0,5 с CPU/с ≈ &#039;&#039;&#039;50 % одного ядра&#039;&#039;&#039; || Досяжно; пул процесів (АП-5)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-09 (перерахунок підсумків) || 4 год || &amp;lt; 1 % || Не залежить від мови ядра&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумок:&#039;&#039;&#039; цілі НФВ &#039;&#039;&#039;не переглядаються&#039;&#039;&#039; у зв&#039;язку з вибором Python. Натомість вводиться жорстка вимога АП-1 — її порушення робить цілі недосяжними на &#039;&#039;будь-якій&#039;&#039; мові, просто на Python розплата настає на порядок раніше й помітніше.&lt;br /&gt;
&lt;br /&gt;
= 5. Класифікація регістрів =&lt;br /&gt;
&lt;br /&gt;
== 5.1. Дерево типів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Registers {&lt;br /&gt;
  rankdir=TB;&lt;br /&gt;
  bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fillcolor=&amp;quot;#f5f5f5&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=10];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  R [label=&amp;quot;РЕГІСТР\n(абстрактний об&#039;єкт метаданих)&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI [label=&amp;quot;Регістр відомостей\n(РВ / Information)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA [label=&amp;quot;Регістр накопичення\n(РН / Accumulation)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RB [label=&amp;quot;Регістр бухгалтерії\n(РБ / Accounting)&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RC [label=&amp;quot;Регістр розрахунку\n(РР / Calculation)&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  R -&amp;gt; RI; R -&amp;gt; RA; R -&amp;gt; RB; R -&amp;gt; RC;&lt;br /&gt;
&lt;br /&gt;
  RI_np [label=&amp;quot;Неперіодичний&amp;quot;];&lt;br /&gt;
  RI_p  [label=&amp;quot;Періодичний&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_np; RI -&amp;gt; RI_p;&lt;br /&gt;
&lt;br /&gt;
  RI_i [label=&amp;quot;Незалежний\n(режим запису)&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI_s [label=&amp;quot;Підпорядкований\nреєстратору&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_i [style=dashed]; RI -&amp;gt; RI_s [style=dashed];&lt;br /&gt;
&lt;br /&gt;
  RA_b [label=&amp;quot;Вид: Залишки\n(Balance)&amp;quot;];&lt;br /&gt;
  RA_t [label=&amp;quot;Вид: Обороти\n(Turnover)&amp;quot;];&lt;br /&gt;
  RA -&amp;gt; RA_b; RA -&amp;gt; RA_t;&lt;br /&gt;
&lt;br /&gt;
  RB_c [label=&amp;quot;З кореспонденцією\n(подвійний запис)&amp;quot;];&lt;br /&gt;
  RB_n [label=&amp;quot;Без кореспонденції\n(уніграфічний)&amp;quot;];&lt;br /&gt;
  RB -&amp;gt; RB_c; RB -&amp;gt; RB_n;&lt;br /&gt;
&lt;br /&gt;
  RC_a [label=&amp;quot;З періодом дії\n(+ витіснення)&amp;quot;];&lt;br /&gt;
  RC_b [label=&amp;quot;З базовим періодом\n(+ база розрахунку)&amp;quot;];&lt;br /&gt;
  RC_g [label=&amp;quot;З графіком часу&amp;quot;];&lt;br /&gt;
  RC -&amp;gt; RC_a; RC -&amp;gt; RC_b; RC -&amp;gt; RC_g;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5.2. Порівняльна матриця типів ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Характеристика !! РВ !! РН (Залишки) !! РН (Обороти) !! РБ !! РР&lt;br /&gt;
|-&lt;br /&gt;
| Ключ запису || Вимірювання (+Період) або Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№&lt;br /&gt;
|-&lt;br /&gt;
| Незалежний запис || &#039;&#039;&#039;Так&#039;&#039;&#039; || Ні || Ні || Ні || Ні&lt;br /&gt;
|-&lt;br /&gt;
| Періодичність || Опційна || Обов&#039;язкова (Період) || Обов&#039;язкова || Обов&#039;язкова || Обов&#039;язкова&lt;br /&gt;
|-&lt;br /&gt;
| Ресурси підсумовуються || Ні || Так (±) || Так (+) || Так (Дт/Кт) || Так&lt;br /&gt;
|-&lt;br /&gt;
| Вид руху (Прихід/Витрата) || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || Дт/Кт || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця залишків || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця оборотів || — || Так (опц.) || &#039;&#039;&#039;Так&#039;&#039;&#039; || Так || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із планом рахунків || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із ПВР || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Період дії / витіснення || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Базовий період || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Графік часу || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Субконто || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерахунки || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Типові приклади || Курси валют, ціни, кадрова історія, графік роботи || Товари на складах, взаєморозрахунки || Продажі, витрати за статтями || Госпрозрахунковий, управлінський, податковий облік || Нарахування ЗП, утримання&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 6. Метамодель: як регістр задається =&lt;br /&gt;
&lt;br /&gt;
== 6.1. Місце в репозиторії метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph ConfigTree {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;; ranksep=0.35; nodesep=0.12;&lt;br /&gt;
  node [shape=box, style=&amp;quot;filled,rounded&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9, height=0.28];&lt;br /&gt;
  edge [arrowhead=none, color=&amp;quot;#9e9e9e&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  CFG [label=&amp;quot;Конфігурація K2 ERP&amp;quot;, fillcolor=&amp;quot;#cfd8dc&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  C1 [label=&amp;quot;Довідники&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  C2 [label=&amp;quot;Документи&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  C3 [label=&amp;quot;Плани рахунків&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  C4 [label=&amp;quot;Плани видів характеристик&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  C5 [label=&amp;quot;Плани видів розрахунку&amp;quot;, fillcolor=&amp;quot;#eceff1&amp;quot;];&lt;br /&gt;
  REG [label=&amp;quot;РЕГІСТРИ&amp;quot;, fillcolor=&amp;quot;#1976d2&amp;quot;, fontcolor=&amp;quot;white&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  CFG -&amp;gt; C1; CFG -&amp;gt; C2; CFG -&amp;gt; C3; CFG -&amp;gt; C4; CFG -&amp;gt; C5; CFG -&amp;gt; REG [penwidth=2, color=&amp;quot;#1976d2&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI [label=&amp;quot;Регістри відомостей&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA [label=&amp;quot;Регістри накопичення&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RB [label=&amp;quot;Регістри бухгалтерії&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RC [label=&amp;quot;Регістри розрахунку&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
  REG -&amp;gt; RI; REG -&amp;gt; RA; REG -&amp;gt; RB; REG -&amp;gt; RC;&lt;br /&gt;
&lt;br /&gt;
  RI1 [label=&amp;quot;КурсиВалют&amp;quot;, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI1;&lt;br /&gt;
  RI1d [label=&amp;quot;Вимірювання: Валюта&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RI1r [label=&amp;quot;Ресурси: Курс, Кратність&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RI1 -&amp;gt; RI1d; RI1 -&amp;gt; RI1r;&lt;br /&gt;
&lt;br /&gt;
  RA1 [label=&amp;quot;ТовариНаСкладах&amp;quot;, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RA -&amp;gt; RA1;&lt;br /&gt;
  RA1d [label=&amp;quot;Вимірювання:\lНоменклатура\lСклад\lПартія\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RA1r [label=&amp;quot;Ресурси: Кількість, Сума&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RA1a [label=&amp;quot;Реквізити: Коментар&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RA1x [label=&amp;quot;Реєстратори:\lПрихіднаНакладна\lВидатковаНакладна\l…\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RA1 -&amp;gt; RA1d; RA1 -&amp;gt; RA1r; RA1 -&amp;gt; RA1a; RA1 -&amp;gt; RA1x;&lt;br /&gt;
&lt;br /&gt;
  RB1 [label=&amp;quot;Госпрозрахунковий&amp;quot;, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RB -&amp;gt; RB1;&lt;br /&gt;
  RB1d [label=&amp;quot;Вимірювання:\lОрганізація (баланс.)\lПідрозділ (небаланс.)\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RB1r [label=&amp;quot;Ресурси:\lСума (баланс.)\lКількість\lВалютнаСума\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RB1 -&amp;gt; RB1d; RB1 -&amp;gt; RB1r;&lt;br /&gt;
  RB1 -&amp;gt; C3 [style=dotted, color=&amp;quot;#c2185b&amp;quot;, arrowhead=vee, label=&amp;quot;ПланРахунків&amp;quot;, fontsize=7];&lt;br /&gt;
&lt;br /&gt;
  RC1 [label=&amp;quot;Нарахування&amp;quot;, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RC -&amp;gt; RC1;&lt;br /&gt;
  RC1d [label=&amp;quot;Вимірювання:\lСпівробітник (базове)\lПідрозділ\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RC1r [label=&amp;quot;Ресурси:\lРезультат\lВідпрацьованоДнів\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RC1p [label=&amp;quot;Перерахунки:\lПерерахунокЗаБазою\l&amp;quot;, shape=note, fillcolor=&amp;quot;#fafafa&amp;quot;, fontsize=8];&lt;br /&gt;
  RC1 -&amp;gt; RC1d; RC1 -&amp;gt; RC1r; RC1 -&amp;gt; RC1p;&lt;br /&gt;
  RC1 -&amp;gt; C5 [style=dotted, color=&amp;quot;#5e35b1&amp;quot;, arrowhead=vee, label=&amp;quot;ПВР&amp;quot;, fontsize=7];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6.2. Загальні властивості будь-якого регістру ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Тип !! Обов&#039;язк. !! Опис / допустимі значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt; || Ідентифікатор || Так || Унікальне в межах роду. Латиниця/кирилиця, ≤ 80 симв., без пробілів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Рядок || Ні || Подання для користувача.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Коментар&amp;lt;/code&amp;gt; || Текст || Ні || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Відомостей&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Накопичення&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Бухгалтерії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Розрахунку&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Незмінна після створення.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Незалежний&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;. Для РН/РБ/РР — примусово &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Неперіодичний&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахСекунди&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахДня&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахМісяця&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахКварталу&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахРоку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратори&amp;lt;/code&amp;gt; || Список посилань на типи документів || Умовно || Обов&#039;язково для РН/РБ/РР та підпорядкованого РВ. Порожній список = регістр непридатний до запису.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БлокуванняДаних&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Автоматичне&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt; (за замовчуванням &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВключатиДоЗвітів&amp;lt;/code&amp;gt; || Булево || Ні || Показувати в універсальному конструкторі звітів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПравоДоступуЗаЗамовчуванням&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Заборонено&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиРLS&amp;lt;/code&amp;gt; || Булево || Ні || Row-level security (розділ 7.9).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Партиціонування&amp;lt;/code&amp;gt; || Структура || Ні || &amp;lt;code&amp;gt;Немає&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодом(RANGE, крок)&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаВимірюванням(HASH, n)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.3. Поля регістру ==&lt;br /&gt;
&lt;br /&gt;
Кожне поле має:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Ідентифікація.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Роль&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Ресурс&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Реквізит&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Тип&amp;lt;/code&amp;gt; || Примітивний (&amp;lt;code&amp;gt;Число(p,s)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Рядок(n)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Булево&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;УНІ&amp;lt;/code&amp;gt;), посилальний (&amp;lt;code&amp;gt;Довідник.X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Документ.Y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перерахування.Z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланРахунків.A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланВидівХарактеристик.B&amp;lt;/code&amp;gt;) або &#039;&#039;&#039;складений&#039;&#039;&#039; (список типів).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Не індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ІндексуватиЗДодаткомВимірювань&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ведуче&amp;lt;/code&amp;gt; (Master) || Тільки для вимірювань. Якщо &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; — записи регістру видаляються разом з об&#039;єктом, на який посилається вимірювання; регістр показується у формі цього об&#039;єкта.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || Брати участь у стандартному відборі форми списку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗаборонитиНезаповненіЗначення&amp;lt;/code&amp;gt; || Валідація на запис.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Специфічні прапорці полів по типах регістрів:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Прапорець !! Застосовний до !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Балансовий&amp;lt;/code&amp;gt; || Ресурс/Вимірювання РБ || Ресурс бере участь у контролі рівності Дт=Кт; має єдине значення на запис (а не пару Дт/Кт). Вимірювання балансове — однакове для Дт і Кт.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Облік&amp;lt;/code&amp;gt; (AccountingFlag) || Ресурс РБ || Посилання на ознаку обліку рахунка з ПР; ресурс заповнюється, лише якщо ознака встановлена.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОблікСубконто&amp;lt;/code&amp;gt; || Ресурс РБ || Посилання на ознаку обліку субконто (напр. кількісний облік у розрізі субконто).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Базове&amp;lt;/code&amp;gt; (BaseDimension) || Вимірювання РР || Використовується для зіставлення записів під час отримання бази розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиПоточніЗначення&amp;lt;/code&amp;gt; || Ресурс/Реквізит РР || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.4. Специфічні властивості за типами ==&lt;br /&gt;
&lt;br /&gt;
=== 6.4.1. Регістр відомостей ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Неперіодичний … ПоПозиціїРеєстратора || Визначає наявність поля &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; і його гранулярність.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Незалежний / ПідпорядкованийРеєстратору || У незалежному ключ = (Період) + Вимірювання.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумки&amp;lt;/code&amp;gt; || — || У РВ підсумків немає; замість них — зрізи.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ключ унікальності:&#039;&#039;&#039;&lt;br /&gt;
* Незалежний неперіодичний: &amp;lt;code&amp;gt;UNIQUE(Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Незалежний періодичний: &amp;lt;code&amp;gt;UNIQUE(Період, Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Підпорядкований: &amp;lt;code&amp;gt;PK(Реєстратор, НомерРядка)&amp;lt;/code&amp;gt;, унікальність за вимірюваннями &#039;&#039;&#039;не&#039;&#039;&#039; контролюється.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.2. Регістр накопичення ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиЗалишків&amp;lt;/code&amp;gt; || Булево (тільки для виду «Залишки»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиОборотів&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодичністьПідсумківОборотів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt; (тільки для виду «Обороти»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || Список визначень агрегатів (тільки для виду «Обороти»), див. 7.4.4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимАгрегатів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 6.4.3. Регістр бухгалтерії ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланРахунків&amp;lt;/code&amp;gt; || Посилання на об&#039;єкт «План рахунків» || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039; Незмінне після створення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Кореспонденція&amp;lt;/code&amp;gt; || Булево || &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; → подвійний запис (поля &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt;); &amp;lt;code&amp;gt;Хиба&amp;lt;/code&amp;gt; → уніграфічний (&amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || Число (успадковується з ПР) || Ліміт платформи: 5 &#039;&#039;[узгодити; 1С — 3 за замовчуванням, до 5]&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пов&#039;язаний об&#039;єкт &#039;&#039;&#039;План рахунків&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* ієрархію рахунків, &amp;lt;code&amp;gt;Код&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Найменування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вид&amp;lt;/code&amp;gt; (Активний/Пасивний/Активно-пасивний);&lt;br /&gt;
* &amp;lt;code&amp;gt;Забалансовий&amp;lt;/code&amp;gt; (булево);&lt;br /&gt;
* &amp;lt;code&amp;gt;Ознаки обліку&amp;lt;/code&amp;gt; (набір булевих реквізитів, напр. «Кількісний», «Валютний»);&lt;br /&gt;
* табличну частину &amp;lt;code&amp;gt;ВидиСубконто&amp;lt;/code&amp;gt; (ВидСубконто → ПВХ, &#039;&#039;Тільки обороти&#039;&#039;, &#039;&#039;Підсумкова сума&#039;&#039;, ознаки обліку субконто);&lt;br /&gt;
* &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.4. Регістр розрахунку ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || Посилання || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Квартал&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Рік&amp;lt;/code&amp;gt; || Період реєстрації.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; || Булево || Вмикає поля &amp;lt;code&amp;gt;ПеріодДіїПочаток/Кінець&amp;lt;/code&amp;gt;, фактичні періоди дії та витіснення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріод&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;БезБазовогоПеріоду&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; || Режим отримання бази.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Графік&amp;lt;/code&amp;gt; || Посилання на РВ || Регістр-графік часу.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗначенняГрафіка&amp;lt;/code&amp;gt; || Ресурс регістру-графіка || Напр. «Значення» (1/0 — робочий день) або «Годин».&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДатаГрафіка&amp;lt;/code&amp;gt; || Вимірювання регістру-графіка типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Перерахунки&amp;lt;/code&amp;gt; || Список підпорядкованих об&#039;єктів «Перерахунок» || Див. 7.5.3.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Об&#039;єкт &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (підпорядкований РР):&lt;br /&gt;
* &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; — список, кожне зіставляється з вимірюванням основного РР (&amp;lt;code&amp;gt;ВимірюванняРегістру&amp;lt;/code&amp;gt;);&lt;br /&gt;
* правило: перерахунок реєструє «об&#039;єкт перерахунку» = (Реєстратор, ВидРозрахунку, Вимірювання…).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* &amp;lt;code&amp;gt;ВикористовуєПеріодДії&amp;lt;/code&amp;gt;;&lt;br /&gt;
* табличні частини &amp;lt;code&amp;gt;БазовіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВитісняючіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВедучіВидиРозрахунку&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;НеЗалежить&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 6.5. Стандартні реквізити (генеруються автоматично) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Реквізит !! РВ !! РН !! РБ !! РР !! Тип&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; || якщо періодичний || + || + || + (період реєстрації) || Дата/час&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Складене посилання (ДокументПосилання)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;НомерРядка&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Число(9,0)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Активність&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || — || тільки «Залишки» || — || — || Перелік {Прихід, Витрата}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt; || — || — || + (з кореспонденцією) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРухуРахунку&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || Перелік {Дебет, Кредит}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; (колекція) || — || — || + || — || Відповідність(ВидСубконто→Значення)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРозрахунку&amp;lt;/code&amp;gt; || — || — || — || + || ПВРПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДіїПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПеріодДіїКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо ПеріодДії) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріодПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;БазовийПеріодКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо БазовийПеріод) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Сторно&amp;lt;/code&amp;gt; || — || — || — || + || Булево&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.6. Кількісні обмеження метамоделі ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Ліміт !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| Кількість вимірювань || 20 || Понад 8 — попередження конструктора (деградація підсумків)&lt;br /&gt;
|-&lt;br /&gt;
| Кількість ресурсів || 20 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реквізитів || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість типів у складеному типі поля || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реєстраторів || Не обмежено ||&lt;br /&gt;
|-&lt;br /&gt;
| Максимум субконто на рахунок || 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| Довжина ключа підсумків || ≤ 900 байт (обмеження індексу MS SQL) || Валідація в конструкторі&lt;br /&gt;
|-&lt;br /&gt;
| Глибина періодичності підсумків || День / Місяць || Тиждень/Квартал — не підтримуються (обчислюються згортанням)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.7. Декларативний опис (DSL) ==&lt;br /&gt;
&lt;br /&gt;
Регістр зберігається в репозиторії у вигляді XML/YAML-маніфесту. Приклад:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр накопичення (вид: Залишки) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: ТовариНаСкладах&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  synonym: &amp;quot;Товари на складах&amp;quot;&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  writeMode: SubordinateToRecorder&lt;br /&gt;
  enableBalanceTotals: true&lt;br /&gt;
  enableTurnoverTotals: true&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура, type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true,  index: true }&lt;br /&gt;
    - { name: Склад,        type: &amp;quot;Довідник.Склади&amp;quot;,       master: true,  index: true }&lt;br /&gt;
    - { name: Партія,       type: [&amp;quot;Документ.ПрихіднаНакладна&amp;quot;, &amp;quot;Документ.ВведенняЗалишків&amp;quot;], index: false }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;ПланВидівХарактеристик.Характеристики&amp;quot;, nullable: true }&lt;br /&gt;
&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість, type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
    - { name: Сума,      type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Коментар, type: &amp;quot;Рядок(200)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ПрихіднаНакладна&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ПереміщенняТоварів&lt;br /&gt;
    - Документ.Інвентаризація&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр відомостей (періодичний, незалежний) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: КурсиВалют&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot;, master: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Курс,     type: &amp;quot;Число(15,4)&amp;quot; }&lt;br /&gt;
    - { name: Кратність, type: &amp;quot;Число(10,0)&amp;quot;, default: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр бухгалтерії ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Госпрозрахунковий&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Госпрозрахунковий&lt;br /&gt;
  correspondence: true&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Підрозділ,   type: &amp;quot;Довідник.Підрозділи&amp;quot;,  balance: false }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,       type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Кількість,  type: &amp;quot;Число(15,3)&amp;quot;, balance: false, accountingFlag: Кількісний }&lt;br /&gt;
    - { name: ВалютнаСума, type: &amp;quot;Число(15,2)&amp;quot;, balance: false, accountingFlag: Валютний }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Зміст, type: &amp;quot;Рядок(255)&amp;quot; }&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot; }&lt;br /&gt;
  recorders: [Документ.БухгалтерськаОперація, Документ.ПрихіднаНакладна]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр розрахунку ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Нарахування&lt;br /&gt;
  kind: Calculation&lt;br /&gt;
  calculationTypesPlan: ПланВидівРозрахунку.ОсновніНарахування&lt;br /&gt;
  periodicity: Month&lt;br /&gt;
  actionPeriod: true&lt;br /&gt;
  basePeriod: ByActionPeriod&lt;br /&gt;
  schedule:&lt;br /&gt;
    register: РегістрВідомостей.ГрафікРоботи&lt;br /&gt;
    valueResource: Значення&lt;br /&gt;
    dateDimension: ДатаГрафіка&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, baseDimension: true, master: true }&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Результат,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: ВідпрацьованоДнів, type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
    - { name: НормаДнів,        type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
  recalculations:&lt;br /&gt;
    - name: ПерерахунокЗаБазою&lt;br /&gt;
      dimensions:&lt;br /&gt;
        - { name: Співробітник, registerDimension: Співробітник }&lt;br /&gt;
  recorders: [Документ.НарахуванняЗарплати]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Розширений каталог із 17 прикладів регістрів усіх типів і підвидів — з деклараціями, даними у фізичних таблицях, запитами, наскрізними сценаріями та антипатернами — див. &#039;&#039;&#039;Додаток Д&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
== 6.8. UI конструктора метаданих ==&lt;br /&gt;
&lt;br /&gt;
=== 6.8.1. Загальний макет ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Конфігуратор K2 ERP ─────────────────────────────────────────────────────────┐&lt;br /&gt;
│ Файл  Правка  Конфігурація  Адміністрування  Сервіс  Довідка                  │&lt;br /&gt;
├──────────────────────┬────────────────────────────────────────────────────────┤&lt;br /&gt;
│ Дерево конфігурації  │  Регістр накопичення: ТовариНаСкладах                  │&lt;br /&gt;
│                      │  ┌──────┬─────────┬──────────┬──────────┬───────────┐  │&lt;br /&gt;
│ ▾ Регістри           │  │Основ.│Дані     │Реєстратор│Форми     │Права      │  │&lt;br /&gt;
│   ▸ відомостей       │  └──────┴─────────┴──────────┴──────────┴───────────┘  │&lt;br /&gt;
│   ▾ накопичення      │                                                        │&lt;br /&gt;
│     ▾ ТовариНаСклад. │  Ім&#039;я           [ТовариНаСкладах.............]         │&lt;br /&gt;
│       ▾ Вимірювання  │  Синонім        [Товари на складах...........]         │&lt;br /&gt;
│           Номенклат. │  Коментар       [.............................]        │&lt;br /&gt;
│           Склад      │                                                        │&lt;br /&gt;
│           Партія     │  Вид регістру   ( ) Обороти   (•) Залишки              │&lt;br /&gt;
│       ▾ Ресурси      │  Періодичність  [ У межах секунди        ▾]            │&lt;br /&gt;
│           Кількість  │  Режим запису   [ Підпорядкований реєстратору ▾]       │&lt;br /&gt;
│           Сума       │                                                        │&lt;br /&gt;
│       ▸ Реквізити    │  ☑ Дозволити підсумки залишків                        │&lt;br /&gt;
│       ▸ Форми        │  ☑ Дозволити підсумки оборотів                        │&lt;br /&gt;
│     ▸ Взаєморозрах.  │      Періодичність підсумків оборотів [Місяць  ▾]      │&lt;br /&gt;
│   ▸ бухгалтерії      │  ☐ Дозволити розділення підсумків                     │&lt;br /&gt;
│   ▸ розрахунку       │                                                        │&lt;br /&gt;
│                      │  Блокування даних  [Кероване ▾]                        │&lt;br /&gt;
│                      │  Партиціонування   [За періодом, крок: місяць ▾]       │&lt;br /&gt;
│                      │                                                        │&lt;br /&gt;
│                      │  [ Конструктор рухів... ]  [ Перевірити ]  [ Закрити ] │&lt;br /&gt;
├──────────────────────┴────────────────────────────────────────────────────────┤&lt;br /&gt;
│ ⚠ Попередження: 4 вимірювання + місячні підсумки → оцінка таблиці підсумків    │&lt;br /&gt;
│   ~ 12 млн записів/рік. Розгляньте виключення вимірювання «Партія» з підсумків.│&lt;br /&gt;
└───────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.2. Палітра властивостей поля ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Властивості: Вимірювання «Партія» ────────────────┐&lt;br /&gt;
│ Ім&#039;я                  [Партія...................]  │&lt;br /&gt;
│ Синонім               [Партія...................]  │&lt;br /&gt;
│ Тип                   [Складений тип........ [...]]│&lt;br /&gt;
│    ├ Документ.ПрихіднаНакладна                     │&lt;br /&gt;
│    └ Документ.ВведенняЗалишків                     │&lt;br /&gt;
│ Індексувати           [Не індексувати         ▾]   │&lt;br /&gt;
│ ☐ Ведуче                                           │&lt;br /&gt;
│ ☐ Основний відбір                                  │&lt;br /&gt;
│ ☐ Заборонити незаповнені значення                  │&lt;br /&gt;
│ ☑ Використовувати в підсумках                      │&lt;br /&gt;
│ Подання                                            │&lt;br /&gt;
│    Підказка           [Партія товару...........]   │&lt;br /&gt;
└────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.3. Вкладка «Реєстратори» ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ ТовариНаСкладах → Реєстратори ────────────────────────────┐&lt;br /&gt;
│ ☑ Документ.ПрихіднаНакладна                                │&lt;br /&gt;
│ ☑ Документ.ВидатковаНакладна                               │&lt;br /&gt;
│ ☑ Документ.ПереміщенняТоварів                              │&lt;br /&gt;
│ ☑ Документ.Інвентаризація                                  │&lt;br /&gt;
│ ☐ Документ.Замовлення                                      │&lt;br /&gt;
│ ☐ Документ.РахунокНаОплату                                 │&lt;br /&gt;
│                                     [Позначити всі] [Зняти]│&lt;br /&gt;
│ ─────────────────────────────────────────────────────────  │&lt;br /&gt;
│ ⓘ Знімання прапорця для документа, що має рухи, вимагає    │&lt;br /&gt;
│   очищення рухів. Знайдено рухів: 0                        │&lt;br /&gt;
└────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.4. Вимоги до конструктора ===&lt;br /&gt;
* ФТ-К-01. Валідація метаопису в реальному часі з переліком помилок/попереджень.&lt;br /&gt;
* ФТ-К-02. Попередній перегляд згенерованого DDL (кнопка «Показати SQL»).&lt;br /&gt;
* ФТ-К-03. Калькулятор оцінки обсягу таблиць підсумків (добуток кардинальностей вимірювань × кількість періодів).&lt;br /&gt;
* ФТ-К-04. Заборона неприпустимих комбінацій (напр. «Незалежний» + «Регістр накопичення»).&lt;br /&gt;
* ФТ-К-05. «Конструктор рухів» — генерація коду формування рухів за табличною частиною документа.&lt;br /&gt;
* ФТ-К-06. Порівняння/об&#039;єднання конфігурацій має коректно обробляти об&#039;єкти-регістри.&lt;br /&gt;
* ФТ-К-07. &#039;&#039;&#039;Генерація &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів&#039;&#039;&#039; для кожного регістру за метаописом. Прикладний код звертається до полів динамічно (&amp;lt;code&amp;gt;__getattr__&amp;lt;/code&amp;gt;), що недоступне для &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;; згенеровані стаби повертають статичну перевірку. Перегенеровуються при кожній зміні метаданих, перевіряються в CI (див. Е.6). &#039;&#039;Вимога специфічна для Python, аналога в 1С не має.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= 7. Функціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 7.1. Набір записів і проведення документа ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-01.&#039;&#039;&#039; Платформа надає прикладний об&#039;єкт &amp;lt;code&amp;gt;НабірЗаписів&amp;lt;/code&amp;gt; для кожного регістру з властивостями: &amp;lt;code&amp;gt;Відбір&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записувати&amp;lt;/code&amp;gt;, і методами &amp;lt;code&amp;gt;Прочитати()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записати(Заміщати)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Очистити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗаблокуватиДляЗміни()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вивантажити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Завантажити()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-02.&#039;&#039;&#039; Для документа доступна колекція &amp;lt;code&amp;gt;Рухи&amp;lt;/code&amp;gt; з наборами записів усіх регістрів, де документ вказано реєстратором.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-03. Сценарій проведення:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
skinparam monochrome false&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
actor Користувач&lt;br /&gt;
participant &amp;quot;Форма\nдокумента&amp;quot; as UI&lt;br /&gt;
participant &amp;quot;Об&#039;єкт\nДокумент&amp;quot; as Doc&lt;br /&gt;
participant &amp;quot;Менеджер\nпроведення&amp;quot; as PM&lt;br /&gt;
participant &amp;quot;Набори\nзаписів&amp;quot; as RS&lt;br /&gt;
database &amp;quot;СКБД&amp;quot; as DB&lt;br /&gt;
&lt;br /&gt;
Користувач -&amp;gt; UI: Провести&lt;br /&gt;
UI -&amp;gt; Doc: Записати(РежимЗапису.Проведення)&lt;br /&gt;
activate Doc&lt;br /&gt;
Doc -&amp;gt; PM: НачатьТранзакцию()&lt;br /&gt;
PM -&amp;gt; DB: BEGIN&lt;br /&gt;
Doc -&amp;gt; Doc: ПередЗаписью()&lt;br /&gt;
Doc -&amp;gt; DB: UPDATE doc SET Проведений=1&lt;br /&gt;
Doc -&amp;gt; Doc: ОбработкаПроведения(Отказ, Режим)&lt;br /&gt;
note right of Doc&lt;br /&gt;
  Прикладний код:&lt;br /&gt;
  Рухи.ТовариНаСкладах.Записувати = Істина;&lt;br /&gt;
  Рух = Рухи.ТовариНаСкладах.Добавить();&lt;br /&gt;
  Рух.ВидРуху = ВидРухуНакопичення.Витрата;&lt;br /&gt;
  ...&lt;br /&gt;
  // контроль залишків (оперативне проведення)&lt;br /&gt;
end note&lt;br /&gt;
Doc -&amp;gt; RS: (формування рухів у пам&#039;яті)&lt;br /&gt;
Doc -&amp;gt; PM: ЗаписатьДвижения()&lt;br /&gt;
PM -&amp;gt; RS: для кожного НЗ з Записувати=Істина&lt;br /&gt;
RS -&amp;gt; DB: DELETE FROM rg_a_0012 WHERE rec_ref = :doc&lt;br /&gt;
RS -&amp;gt; DB: INSERT INTO rg_a_0012 (...) VALUES (...)&lt;br /&gt;
RS -&amp;gt; PM: ОновитиПідсумки(delta)&lt;br /&gt;
PM -&amp;gt; DB: MERGE rg_a_0012_tb (див. розд. 10.2)&lt;br /&gt;
Doc -&amp;gt; Doc: ПриЗаписи() / ПослеЗаписи()&lt;br /&gt;
alt Відмова = Хиба&lt;br /&gt;
  PM -&amp;gt; DB: COMMIT&lt;br /&gt;
  PM --&amp;gt; UI: Успіх&lt;br /&gt;
else Відмова = Істина або виключення&lt;br /&gt;
  PM -&amp;gt; DB: ROLLBACK&lt;br /&gt;
  PM --&amp;gt; UI: Помилка &amp;quot;Документ не проведено: ...&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
deactivate Doc&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-04.&#039;&#039;&#039; Запис набору записів у режимі &amp;lt;code&amp;gt;Заміщати = Істина&amp;lt;/code&amp;gt; (за замовчуванням для рухів) виконує &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt; усіх записів за відбором + &amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt; нових — атомарно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-05.&#039;&#039;&#039; Скасування проведення документа: усі набори записів за реєстратором очищуються, підсумки коригуються, документ отримує &amp;lt;code&amp;gt;Проведений = Хиба&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-06.&#039;&#039;&#039; Видалення документа-реєстратора (у т.ч. позначеного на видалення) &#039;&#039;&#039;зобов&#039;язане&#039;&#039;&#039; каскадно видалити всі його рухи в межах однієї транзакції. Реалізація — на рівні платформи (не FK, оскільки посилання поліморфне) + фонова перевірка цілісності (розділ 7.10).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-07.&#039;&#039;&#039; Режими проведення:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Режим !! Умова !! Поведінка&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Оперативне&#039;&#039;&#039; || Дата документа = поточна дата, документ у межах «оперативної точки» || Дозволено контроль залишків «на зараз»; дата може перепризначатися на поточну.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Неоперативне&#039;&#039;&#039; || Дата в минулому/майбутньому або документ перепроводиться || Контроль залишків виконується на дату документа; можливий негативний залишок за налаштуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.2. Активність записів ==&lt;br /&gt;
&#039;&#039;&#039;ФТ-08.&#039;&#039;&#039; Реквізит &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; означає, що запис фізично існує, але &#039;&#039;&#039;не&#039;&#039;&#039; впливає на підсумки та не потрапляє до віртуальних таблиць.&lt;br /&gt;
&#039;&#039;&#039;ФТ-09.&#039;&#039;&#039; Зміна активності будь-якого запису тягне коригування підсумків.&lt;br /&gt;
&#039;&#039;&#039;ФТ-10.&#039;&#039;&#039; Скасування проведення документа переводить усі його записи в &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; &#039;&#039;&#039;або&#039;&#039;&#039; видаляє їх — залежно від налаштування регістру &amp;lt;code&amp;gt;ПоведінкаПриСкасуванні&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Видаляти&amp;lt;/code&amp;gt; — за замовчуванням / &amp;lt;code&amp;gt;Деактивувати&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.3. Віртуальні таблиці ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-11.&#039;&#039;&#039; Мова запитів надає для кожного регістру набір віртуальних таблиць. Транслятор перетворює звернення до них на SQL із використанням таблиць підсумків та «живих» рухів після ТА.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Регістр !! Віртуальна таблиця !! Параметри !! Повертає&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РВ&#039;&#039;&#039; || &amp;lt;code&amp;gt;ЗрізОстанніх&amp;lt;/code&amp;gt; || (Період, Умова) || Останній запис на кожну комбінацію вимірювань з періодом ≤ Період&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗрізПерших&amp;lt;/code&amp;gt; || (Період, Умова) || Перший запис з періодом ≥ Період&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Усі записи&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РН.Залишки&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, Умова) || Вимірювання + &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, МетодДоповнення, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ПочатковийЗалишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;КінцевийЗалишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН.Обороти&#039;&#039;&#039; || &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | &#039;&#039;&#039;РБ&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, УмоваРахунку, Субконто, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахунку, Субконто, Умова, УмоваКорРахунку, КорСубконто) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (…) || Повний набір&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОборотиДтКт&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахункуДт, СубконтоДт, УмоваРахункуКт, СубконтоКт) || Кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДвиженияССубконто&amp;lt;/code&amp;gt; || (Початок, Кінець, УмоваРахунку, Субконто, Умова) || Рухи з розшифровкою субконто&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; || (Умова, Порядок…) || Значення субконто записів&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РР&#039;&#039;&#039; || &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; || (Умова) || &amp;lt;code&amp;gt;ЗначенняПеріодуДії&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняПеріодуРеєстрації&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняБазовогоПеріоду&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняФактичногоПеріодуДії&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ФактичнийПеріодДії&amp;lt;/code&amp;gt; || (Умова) || Записи з фактичними (після витіснення) межами&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; || (ВимірюванняБази, ВимірюванняОсновногоРегістру, Розрізи, ВидиРозрахунку, Умова) || Агреговані значення ресурсів базових видів розрахунку&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-12.&#039;&#039;&#039; Приклад запиту:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Залишки.Номенклатура,&lt;br /&gt;
    Залишки.Склад,&lt;br /&gt;
    Залишки.КількістьЗалишок,&lt;br /&gt;
    Обороти.КількістьПрихід,&lt;br /&gt;
    Обороти.КількістьВитрата&lt;br /&gt;
З&lt;br /&gt;
    РегістрНакопичення.ТовариНаСкладах.ЗалишкиІОбороти(&lt;br /&gt;
        &amp;amp;ПочатокПеріоду,&lt;br /&gt;
        &amp;amp;КінецьПеріоду,&lt;br /&gt;
        Місяць,&lt;br /&gt;
        Рух,&lt;br /&gt;
        Склад = &amp;amp;Склад&lt;br /&gt;
            І Номенклатура В ІЄРАРХІЇ (&amp;amp;ГрупаНоменклатури)&lt;br /&gt;
    ) ЯК Залишки&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-13.&#039;&#039;&#039; Параметри віртуальних таблиць &#039;&#039;&#039;зобов&#039;язані&#039;&#039;&#039; транслюватися у &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; підзапиту до звернення до підсумків (push-down), а не фільтруватися після агрегації.&lt;br /&gt;
&lt;br /&gt;
== 7.4. Підсумки ==&lt;br /&gt;
&lt;br /&gt;
=== 7.4.1. Модель підсумків залишків ===&lt;br /&gt;
Таблиця залишків зберігає &#039;&#039;&#039;кумулятивний залишок на початок кожного періоду&#039;&#039;&#039; + спеціальний рядок «підсумок за всі періоди» з &amp;lt;code&amp;gt;period = &#039;5999-11-01&#039;&amp;lt;/code&amp;gt; (маркер MAXPERIOD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                     Таблиця підсумків (місячна)                  ТА&lt;br /&gt;
                     ┌────┬────┬────┬────┬────┐                    ▼&lt;br /&gt;
  ─────┬────┬────┬───┴────┴────┴────┴────┴────┴────────────────────┬──────────►&lt;br /&gt;
       │    │    │  01.10  01.11  01.12  01.01  01.02             15.02      t&lt;br /&gt;
       │    │    │   ●      ●      ●      ●      ●&lt;br /&gt;
       │    │    │  бал.   бал.   бал.   бал.   бал.&lt;br /&gt;
                                                    └─ «живі» рухи ─┘&lt;br /&gt;
                                                      (сканування)&lt;br /&gt;
  Залишок на 10.02 = Підсумок(01.02) + Σ рухів (01.02 … 10.02]&lt;br /&gt;
  Залишок на 20.02 = Підсумок(01.02) + Σ рухів (01.02 … 20.02]   // після ТА — теж&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-14.&#039;&#039;&#039; Регламентна операція «Перерахунок підсумків» перебудовує таблиці підсумків з нуля.&lt;br /&gt;
&#039;&#039;&#039;ФТ-15.&#039;&#039;&#039; Регламентна операція «Встановлення періоду розрахунку підсумків» переносить ТА вперед/назад.&lt;br /&gt;
&#039;&#039;&#039;ФТ-16.&#039;&#039;&#039; При записі рухів раніше ТА підсумки коригуються &#039;&#039;інкрементально&#039;&#039; (див. 10.2), без повного перерахунку.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.2. Розділення підсумків ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-17.&#039;&#039;&#039; За увімкненого &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; у таблиці підсумків додається колонка &amp;lt;code&amp;gt;splitter smallint&amp;lt;/code&amp;gt;. Одночасні транзакції пишуть у різні «сплітери», що усуває конкуренцію за рядок. Читання агрегує по всіх сплітерах. Регламентне завдання зливає сплітери.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.3. Обороти ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-18.&#039;&#039;&#039; Таблиця оборотів зберігає агрегати за календарний період (день або місяць — за налаштуванням), без кумуляції.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.4. Агрегати (тільки РН виду «Обороти») ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-19.&#039;&#039;&#039; Агрегат — додаткова матеріалізована таблиця з підмножиною вимірювань і власною періодичністю (День/Місяць/Квартал/Рік). Оптимізатор запитів обирає найдешевший агрегат, що покриває запит.&lt;br /&gt;
&#039;&#039;&#039;ФТ-20.&#039;&#039;&#039; Режими: &amp;lt;code&amp;gt;Реальний час&amp;lt;/code&amp;gt; (оновлюється при записі рухів) / &amp;lt;code&amp;gt;Регламентний&amp;lt;/code&amp;gt; (оновлюється завданням; запит враховує рухи після дати актуальності агрегату).&lt;br /&gt;
&#039;&#039;&#039;ФТ-21.&#039;&#039;&#039; «Порадник агрегатів» аналізує статистику запитів і пропонує склад агрегатів (&amp;lt;code&amp;gt;ВизначитиОптимальніАгрегати()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.5. Механіка регістру розрахунку ==&lt;br /&gt;
&lt;br /&gt;
=== 7.5.1. Витіснення за періодом дії ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-22.&#039;&#039;&#039; Якщо у ПВР для виду розрахунку A вказано B у складі «Витісняючі види розрахунку», то запис виду B скорочує фактичний період дії запису виду A на інтервал перетину.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startgantt&lt;br /&gt;
title Витіснення за періодом дії. Період реєстрації: січень 2026&lt;br /&gt;
caption Пріоритет витіснення: Лікарняний &amp;gt; Відпустка &amp;gt; Оклад&lt;br /&gt;
printscale daily&lt;br /&gt;
Project starts 2026-01-01&lt;br /&gt;
&lt;br /&gt;
-- Заявлені періоди дії (rg_c_0040.act_begin / act_end) --&lt;br /&gt;
[Оклад] as [O1] starts 2026-01-01 and ends 2026-01-31&lt;br /&gt;
[Відпустка] as [V1] starts 2026-01-10 and ends 2026-01-17&lt;br /&gt;
[Лікарняний] as [L1] starts 2026-01-14 and ends 2026-01-22&lt;br /&gt;
[O1] is colored in #BBDEFB&lt;br /&gt;
[V1] is colored in #FFE0B2&lt;br /&gt;
[L1] is colored in #F8BBD0&lt;br /&gt;
&lt;br /&gt;
-- Фактичні періоди дії після витіснення (rg_c_0040_ap) --&lt;br /&gt;
[Оклад, інтервал 0] as [O2] starts 2026-01-01 and ends 2026-01-09&lt;br /&gt;
[Оклад, інтервал 1] as [O3] starts 2026-01-23 and ends 2026-01-31&lt;br /&gt;
[Відпустка, інтервал 0] as [V2] starts 2026-01-10 and ends 2026-01-13&lt;br /&gt;
[Лікарняний, інтервал 0] as [L2] starts 2026-01-14 and ends 2026-01-22&lt;br /&gt;
[O2] is colored in #1976D2&lt;br /&gt;
[O3] is colored in #1976D2&lt;br /&gt;
[V2] is colored in #F57C00&lt;br /&gt;
[L2] is colored in #C2185B&lt;br /&gt;
@endgantt&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Ключове спостереження.&#039;&#039;&#039; Один запис «Оклад» породжує &#039;&#039;&#039;два&#039;&#039;&#039; фактичні інтервали — саме тому &amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt; має власний ключ &amp;lt;code&amp;gt;interval_no&amp;lt;/code&amp;gt; і зв&#039;язок 1:N із таблицею рухів (розділ 9.4). «Відпустка» скорочена з 17.01 до 13.01, бо лікарняний має вищий пріоритет.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-23.&#039;&#039;&#039; Фактичні періоди дії матеріалізуються у службовій таблиці &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;код&amp;amp;gt;_ap&amp;lt;/code&amp;gt; під час запису набору записів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-24.&#039;&#039;&#039; Витіснення обчислюється в межах збігу &#039;&#039;&#039;усіх&#039;&#039;&#039; вимірювань регістру та перетину періодів реєстрації, визначених ПВР.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.2. Базовий період і база розрахунку ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-25.&#039;&#039;&#039; Віртуальна таблиця &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; повертає суму ресурсів записів базових видів розрахунку, зіставлених за базовими вимірюваннями, з урахуванням режиму &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період дії&#039;&#039;&#039; перетинається з базовим періодом поточного запису; результат пропорційно розподіляється за часткою перетину (за графіком, якщо заданий);&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період реєстрації&#039;&#039;&#039; потрапляє в базовий період.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.3. Перерахунки ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-26.&#039;&#039;&#039; При записі/зміні/видаленні запису базового виду розрахунку платформа &#039;&#039;&#039;автоматично&#039;&#039;&#039; формує записи у таблиці перерахунку для всіх залежних записів (за збігом вимірювань перерахунку та потраплянням у базовий період).&lt;br /&gt;
&#039;&#039;&#039;ФТ-27.&#039;&#039;&#039; Прикладний код читає перерахунок як набір записів, перепроводить відповідні документи та очищує оброблені записи.&lt;br /&gt;
&#039;&#039;&#039;ФТ-28.&#039;&#039;&#039; Перерахунок доступний як об&#039;єкт для звіту «Документи до перерахунку».&lt;br /&gt;
&lt;br /&gt;
=== 7.5.4. Графік часу ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-29.&#039;&#039;&#039; Графік — це РВ з обов&#039;язковим вимірюванням типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; та числовим ресурсом. Віртуальна таблиця &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; повертає суму значень графіка за відповідний період (дії / реєстрації / базовий / фактичний період дії).&lt;br /&gt;
&#039;&#039;&#039;ФТ-30.&#039;&#039;&#039; Якщо у графіку є додаткові вимірювання (напр. &amp;lt;code&amp;gt;ВидГрафіка&amp;lt;/code&amp;gt;), вони зіставляються з однойменними реквізитами/вимірюваннями РР.&lt;br /&gt;
&lt;br /&gt;
== 7.6. Прикладний API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from datetime import date&lt;br /&gt;
from decimal import Decimal&lt;br /&gt;
&lt;br /&gt;
from k2.registers import AccumulationMovementType, DataLock, DataLockMode, Registers&lt;br /&gt;
from k2.documents import Document, PostingContext&lt;br /&gt;
&lt;br /&gt;
# ============ Регістр відомостей: незалежний запис ============&lt;br /&gt;
mgr = Registers.information(&amp;quot;КурсиВалют&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
rm = mgr.create_record_manager()&lt;br /&gt;
rm.Період = date(2026, 7, 17)&lt;br /&gt;
rm.Валюта = usd&lt;br /&gt;
rm.Курс = Decimal(&amp;quot;41.85&amp;quot;)&lt;br /&gt;
rm.Кратність = 1&lt;br /&gt;
rm.write(replace=True)                    # INSERT ... ON CONFLICT DO UPDATE&lt;br /&gt;
&lt;br /&gt;
# зріз останніх&lt;br /&gt;
row = mgr.get_last(date.today(), {&amp;quot;Валюта&amp;quot;: usd})&lt;br /&gt;
курс: Decimal = row.Курс&lt;br /&gt;
&lt;br /&gt;
# АП-1: масове завантаження — ОДИН запит, а не цикл із write() усередині&lt;br /&gt;
rs = mgr.create_record_set()&lt;br /&gt;
rs.load([{&amp;quot;Період&amp;quot;: d, &amp;quot;Валюта&amp;quot;: v, &amp;quot;Курс&amp;quot;: k, &amp;quot;Кратність&amp;quot;: 1}&lt;br /&gt;
         for d, v, k in nbu_rates])       # 3 000 курсів&lt;br /&gt;
rs.write(replace=True)                    # 1 × executemany, ~40 мс&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============ Регістр накопичення: рухи документа ============&lt;br /&gt;
class ВидатковаНакладна(Document):&lt;br /&gt;
&lt;br /&gt;
    def on_posting(self, ctx: PostingContext) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.ТовариНаСкладах&lt;br /&gt;
        rs.write = True                   # набір буде записано наприкінці транзакції&lt;br /&gt;
        rs.clear()&lt;br /&gt;
&lt;br /&gt;
        # АП-1: набір наповнюється генератором, запис — одним batch&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(&lt;br /&gt;
                Період=self.Дата,&lt;br /&gt;
                ВидРуху=AccumulationMovementType.EXPENSE,&lt;br /&gt;
                Номенклатура=r.Номенклатура,&lt;br /&gt;
                Склад=self.Склад,&lt;br /&gt;
                Партія=r.Партія,&lt;br /&gt;
                Кількість=r.Кількість,&lt;br /&gt;
                Сума=r.Сума,&lt;br /&gt;
            )&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        # керовані блокування перед контролем залишків&lt;br /&gt;
        with DataLock() as dl:            # __enter__ виконує lock()&lt;br /&gt;
            li = dl.add(&amp;quot;РегістрНакопичення.ТовариНаСкладах.Залишки&amp;quot;)&lt;br /&gt;
            li.mode = DataLockMode.EXCLUSIVE&lt;br /&gt;
            li.data_source = rs.unload(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Склад&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Номенклатура&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Склад&amp;quot;, &amp;quot;Склад&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            rs.write_now()                # примусовий запис до контролю&lt;br /&gt;
            self._control_balances(ctx)   # прикладна перевірка від&#039;ємних залишків&lt;br /&gt;
&lt;br /&gt;
    # ============ Регістр бухгалтерії ============&lt;br /&gt;
    def _accounting(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Госпрозрахунковий&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        for r in self.Товари:&lt;br /&gt;
            e = rs.add_accounting_entry(&lt;br /&gt;
                Період=self.Дата,&lt;br /&gt;
                Організація=self.Організація,&lt;br /&gt;
                РахунокДт=accounts[&amp;quot;281&amp;quot;],&lt;br /&gt;
                РахунокКт=accounts[&amp;quot;631&amp;quot;],&lt;br /&gt;
                Сума=r.Сума,&lt;br /&gt;
                КількістьДт=r.Кількість,&lt;br /&gt;
            )&lt;br /&gt;
            e.subconto_dt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e.subconto_dt[ВидиСубконто.Склади] = self.Склад&lt;br /&gt;
            e.subconto_kt[ВидиСубконто.Контрагенти] = self.Контрагент&lt;br /&gt;
&lt;br /&gt;
    # ============ Регістр розрахунку ============&lt;br /&gt;
    def _calculation(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Нарахування&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.append(rs.new(&lt;br /&gt;
            ВидРозрахунку=calc_types[&amp;quot;Оклад&amp;quot;],&lt;br /&gt;
            Період=self.Дата,                      # період реєстрації&lt;br /&gt;
            ПеріодДіїПочаток=date(2026, 7, 1),&lt;br /&gt;
            ПеріодДіїКінець=date(2026, 7, 31),&lt;br /&gt;
            БазовийПеріодПочаток=date(2026, 6, 1),&lt;br /&gt;
            БазовийПеріодКінець=date(2026, 6, 30),&lt;br /&gt;
            Співробітник=self.Співробітник,&lt;br /&gt;
            Результат=Decimal(0),                  # заповниться після розрахунку&lt;br /&gt;
        ))&lt;br /&gt;
        rs.write_now()&lt;br /&gt;
&lt;br /&gt;
# Отримання даних графіка та бази розрахунку — запитом (розділ 7.3), не циклом.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Про кириличні ідентифікатори.&#039;&#039;&#039; Python 3 підтримує Unicode в іменах (PEP 3131), тому &amp;lt;code&amp;gt;rm.Валюта&amp;lt;/code&amp;gt; і &amp;lt;code&amp;gt;rs.new(Номенклатура=…)&amp;lt;/code&amp;gt; — валідний код; прикладна термінологія зберігається без транслітерації. &#039;&#039;&#039;Але&#039;&#039;&#039; доступ до полів регістру динамічний, тому &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt; його не перевіряє — компенсується генерацією &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів (ФТ-К-07, Додаток Е.6). Ключові слова API (&amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) залишаються англійськими; змішування — свідомий компроміс, підлягає узгодженню (В15).}}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Антипатерн, специфічний для Python (А-15).&#039;&#039;&#039; Спокуса написати &amp;lt;code&amp;gt;for r in self.Товари: rs.add(...).write()&amp;lt;/code&amp;gt; дає 100 round-trip&#039;ів до СКБД замість одного і збільшує час проведення з 300 мс до ~10 с. Це порушення АП-1 і найчастіша помилка при переході з ORM-мислення. Детектор — Е.7.}}&lt;br /&gt;
&lt;br /&gt;
== 7.7. Блокування та конкурентність ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Вимога&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31 || Режим керованих блокувань — за замовчуванням. Рівень ізоляції транзакцій: &amp;lt;code&amp;gt;READ COMMITTED&amp;lt;/code&amp;gt; (PostgreSQL) / &amp;lt;code&amp;gt;READ COMMITTED SNAPSHOT&amp;lt;/code&amp;gt; (MS SQL).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-32 || Об&#039;єкт &amp;lt;code&amp;gt;DataLock&amp;lt;/code&amp;gt; дозволяє встановити розділювальне/виняткове блокування на «простір» регістру за значеннями вимірювань (реалізація — &amp;lt;code&amp;gt;pg_advisory_xact_lock&amp;lt;/code&amp;gt; за хешем ключа або &amp;lt;code&amp;gt;SELECT ... FOR UPDATE&amp;lt;/code&amp;gt; по таблиці підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-33 || Запис рухів документа блокує тільки записи цього реєстратора (PK містить реєстратор першим).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-34 || Оновлення підсумків не повинно призводити до дедлоків: усі &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;-операції в межах транзакції виконуються у детермінованому порядку сортування ключа.&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-35 || Гарантія: паралельне проведення двох документів з різними наборами вимірювань не конкурує (за увімкненого розділення підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-36 || Таймаут очікування блокування — 20 с (налаштовується); при перевищенні — керована помилка з текстом конфліктного ключа.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.8. Права доступу ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-37.&#039;&#039;&#039; Для регістру визначаються права: &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Додавання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Зміна&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Видалення&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перегляд&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Редагування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПереглядПідсумків&amp;lt;/code&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;ФТ-38.&#039;&#039;&#039; Обмеження на рівні записів (RLS) задаються шаблоном умови по вимірюваннях; транслюються в &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; усіх звернень, включно з віртуальними таблицями.&lt;br /&gt;
&#039;&#039;&#039;ФТ-39.&#039;&#039;&#039; &#039;&#039;Ризик:&#039;&#039; RLS на віртуальних таблицях залишків потребує узгодженості з підсумками. Рішення — RLS дозволено тільки по вимірюваннях, що входять до ключа підсумків; конструктор валідує це правило.&lt;br /&gt;
&lt;br /&gt;
== 7.9. Журналювання, аудит, службові сервіси ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-40.&#039;&#039;&#039; Реєстрація в журналі: перерахунок підсумків, зміна ТА, реструктуризація регістру, злиття сплітерів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-41.&#039;&#039;&#039; Службовий сервіс «Перевірка цілісності регістрів»:&lt;br /&gt;
* «висячі» рухи (реєстратор не існує або не проведений);&lt;br /&gt;
* розбіжність підсумків і сум рухів (контрольний перерахунок у тіньову таблицю з порівнянням);&lt;br /&gt;
* некоректні фактичні періоди дії РР;&lt;br /&gt;
* для РБ — порушення рівності Дт = Кт за балансовим ресурсом у межах реєстратора.&lt;br /&gt;
&#039;&#039;&#039;ФТ-42.&#039;&#039;&#039; Звіт «Аналіз розміру регістрів»: кількість записів, розмір таблиць та індексів, дата останнього перерахунку підсумків.&lt;br /&gt;
&lt;br /&gt;
= 8. Модель даних (як це виглядає в базі даних) =&lt;br /&gt;
&lt;br /&gt;
== 8.1. Конвенції іменування ==&lt;br /&gt;
&lt;br /&gt;
Фізичні імена &#039;&#039;&#039;не&#039;&#039;&#039; успадковують прикладні імена (обмеження довжини ідентифікатора, кирилиця, перейменування об&#039;єктів). Ім&#039;я будується за сурогатним кодом об&#039;єкта метаданих &amp;lt;code&amp;gt;&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; (4-значний hex/dec).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаблон !! Призначення !! Приклад&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_i_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр відомостей — основна таблиця || &amp;lt;code&amp;gt;rg_i_0007&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр накопичення — рухи || &amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tb&amp;lt;/code&amp;gt; || РН — підсумки залишків (Totals Balance) || &amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tt&amp;lt;/code&amp;gt; || РН — підсумки оборотів (Totals Turnover) || &amp;lt;code&amp;gt;rg_a_0012_tt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_ag&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; || РН — агрегат № n || &amp;lt;code&amp;gt;rg_a_0031_ag1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр бухгалтерії — проводки || &amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_ed&amp;lt;/code&amp;gt; || РБ — субконто (якщо винесено в дочірню таблицю) || &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tb&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки залишків за рівнем субконто k (0…N) || &amp;lt;code&amp;gt;rg_b_0020_tb2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tt&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки оборотів за рівнем субконто k || &amp;lt;code&amp;gt;rg_b_0020_tt1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tc&amp;lt;/code&amp;gt; || РБ — обороти між рахунками (кореспонденції) || &amp;lt;code&amp;gt;rg_b_0020_tc&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр розрахунку — рухи || &amp;lt;code&amp;gt;rg_c_0040&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_ap&amp;lt;/code&amp;gt; || РР — фактичні періоди дії || &amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_rc&amp;amp;lt;m&amp;amp;gt;&amp;lt;/code&amp;gt; || РР — перерахунок № m || &amp;lt;code&amp;gt;rg_c_0040_rc1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_&amp;amp;lt;*&amp;amp;gt;_&amp;amp;lt;id&amp;amp;gt;_opt&amp;lt;/code&amp;gt; || Службова: ТА підсумків, налаштування || &amp;lt;code&amp;gt;rg_a_0012_opt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;md_*&amp;lt;/code&amp;gt; || Таблиці метаданих || &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Колонки полів: &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — вимірювання, &amp;lt;code&amp;gt;r&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — ресурс, &amp;lt;code&amp;gt;a&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — реквізит, де &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; — порядковий номер поля в метаописі (стабільний, не перевикористовується після видалення поля). Мапінг «прикладне ім&#039;я ↔ фізична колонка» зберігається в &amp;lt;code&amp;gt;md_register_field&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.2. Типізація та зберігання значень ==&lt;br /&gt;
&lt;br /&gt;
=== 8.2.1. Примітивні типи ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Тип платформи !! PostgreSQL !! MS SQL&lt;br /&gt;
|-&lt;br /&gt;
| Число(p,s) || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(n) || &amp;lt;code&amp;gt;varchar(n)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(необмежена) || &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(max)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Дата / ДатаЧас || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;datetime2(0)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Булево || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| УНІ || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uniqueidentifier&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.2. Посилальні типи ===&lt;br /&gt;
* &#039;&#039;&#039;Простий&#039;&#039;&#039; (один тип): одна колонка &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r uuid NOT NULL&amp;lt;/code&amp;gt;, зовнішній ключ до таблиці об&#039;єкта. Порожнє посилання = &amp;lt;code&amp;gt;&#039;00000000-0000-0000-0000-000000000000&#039;&amp;lt;/code&amp;gt; (а не NULL — щоб зберегти семантику «пустого значення» у ключах підсумків).&lt;br /&gt;
* &#039;&#039;&#039;Складений&#039;&#039;&#039; (кілька типів / примітив + посилання): група колонок:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Колонка !! Тип !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_t&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;smallint&amp;lt;/code&amp;gt; || Код типу: 1=Невизначено, 2=Булево, 3=Число, 4=Рядок, 5=Дата, ≥100 = &amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt; посилального типу&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || Значення, якщо _t=2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_n&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(38,10)&amp;lt;/code&amp;gt; || Значення, якщо _t=3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_s&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;varchar(N)&amp;lt;/code&amp;gt; || Значення, якщо _t=4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_d&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || Значення, якщо _t=5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || Значення, якщо _t≥100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №1.&#039;&#039;&#039; Для складених типів обрано «широку» денормалізацію (кілька колонок), а не JSONB/варіант, тому що: (а) колонки індексуються та беруть участь у ключах підсумків; (б) B-tree по &amp;lt;code&amp;gt;(d1_t, d1_r)&amp;lt;/code&amp;gt; дає range-scan, JSONB — ні; (в) сумісно з обома цільовими СКБД. Ціна — до 6 колонок на одне складене поле.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.3. Реєстратор ===&lt;br /&gt;
Завжди складений (будь-який з дозволених документів):&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_t smallint NOT NULL&amp;lt;/code&amp;gt; — код типу документа (&amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt;);&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_r uuid NOT NULL&amp;lt;/code&amp;gt; — посилання.&lt;br /&gt;
&lt;br /&gt;
FK неможливий (поліморфізм) → цілісність забезпечується платформою + сервісом перевірки (ФТ-41).&lt;br /&gt;
&lt;br /&gt;
=== 8.2.4. Маркери періодів ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа !! Значення !! Використання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MINPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0001-01-01 00:00:00&amp;lt;/code&amp;gt; || Нижня межа&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5999-11-01 00:00:00&amp;lt;/code&amp;gt; || Рядок «підсумок за всі періоди» в таблицях залишків&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8.3. Таблиці метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ============ РЕПОЗИТОРІЙ МЕТАДАНИХ ============&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_type (                       -- реєстр усіх типів конфігурації&lt;br /&gt;
    id            smallint     PRIMARY KEY,&lt;br /&gt;
    kind          varchar(20)  NOT NULL,     -- Catalog|Document|Enum|ChartOfAccounts|ChartOfCalcTypes|Register|...&lt;br /&gt;
    name          varchar(80)  NOT NULL,&lt;br /&gt;
    table_name    varchar(63),&lt;br /&gt;
    UNIQUE (kind, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register (&lt;br /&gt;
    id                   smallint     PRIMARY KEY,          -- = md_type.id&lt;br /&gt;
    name                 varchar(80)  NOT NULL UNIQUE,&lt;br /&gt;
    synonym              varchar(255),&lt;br /&gt;
    comment              text,&lt;br /&gt;
    kind                 varchar(12)  NOT NULL&lt;br /&gt;
        CHECK (kind IN (&#039;Information&#039;,&#039;Accumulation&#039;,&#039;Accounting&#039;,&#039;Calculation&#039;)),&lt;br /&gt;
    -- загальні&lt;br /&gt;
    write_mode           varchar(24)  NOT NULL DEFAULT &#039;SubordinateToRecorder&#039;&lt;br /&gt;
        CHECK (write_mode IN (&#039;Independent&#039;,&#039;SubordinateToRecorder&#039;)),&lt;br /&gt;
    periodicity          varchar(24)  NOT NULL DEFAULT &#039;Nonperiodical&#039;&lt;br /&gt;
        CHECK (periodicity IN (&#039;Nonperiodical&#039;,&#039;WithinSecond&#039;,&#039;WithinDay&#039;,&#039;WithinMonth&#039;,&lt;br /&gt;
                               &#039;WithinQuarter&#039;,&#039;WithinYear&#039;,&#039;ByRecorderPosition&#039;)),&lt;br /&gt;
    lock_mode            varchar(12)  NOT NULL DEFAULT &#039;Managed&#039;,&lt;br /&gt;
    use_rls              boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    partition_mode       varchar(20)  NOT NULL DEFAULT &#039;None&#039;,&lt;br /&gt;
    partition_step       varchar(10),&lt;br /&gt;
    -- РН&lt;br /&gt;
    accumulation_kind    varchar(10)  CHECK (accumulation_kind IN (&#039;Balance&#039;,&#039;Turnover&#039;)),&lt;br /&gt;
    enable_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    enable_tno_totals    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    tno_totals_period    varchar(6)   CHECK (tno_totals_period IN (&#039;Day&#039;,&#039;Month&#039;)),&lt;br /&gt;
    split_totals         boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    split_count          smallint     NOT NULL DEFAULT 1,&lt;br /&gt;
    aggregates_mode      varchar(10),&lt;br /&gt;
    -- РБ&lt;br /&gt;
    chart_of_accounts_id smallint     REFERENCES md_type(id),&lt;br /&gt;
    correspondence       boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    max_extdim_count     smallint     NOT NULL DEFAULT 3,&lt;br /&gt;
    -- РР&lt;br /&gt;
    calc_types_plan_id   smallint     REFERENCES md_type(id),&lt;br /&gt;
    use_action_period    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    base_period_mode     varchar(24)&lt;br /&gt;
        CHECK (base_period_mode IN (&#039;None&#039;,&#039;ByActionPeriod&#039;,&#039;ByRegistrationPeriod&#039;)),&lt;br /&gt;
    schedule_register_id smallint     REFERENCES md_register(id),&lt;br /&gt;
    schedule_value_field smallint,&lt;br /&gt;
    schedule_date_field  smallint,&lt;br /&gt;
    -- службове&lt;br /&gt;
    physical_table       varchar(63)  NOT NULL,&lt;br /&gt;
    struct_version       int          NOT NULL DEFAULT 1,&lt;br /&gt;
    CONSTRAINT chk_kind_props CHECK (&lt;br /&gt;
        (kind = &#039;Accumulation&#039; AND accumulation_kind IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Accounting&#039;   AND chart_of_accounts_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Calculation&#039;  AND calc_types_plan_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Information&#039;)&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_field (&lt;br /&gt;
    id                smallint    NOT NULL,        -- порядковий номер поля (стабільний)&lt;br /&gt;
    register_id       smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name              varchar(80) NOT NULL,&lt;br /&gt;
    synonym           varchar(255),&lt;br /&gt;
    role              varchar(12) NOT NULL CHECK (role IN (&#039;Dimension&#039;,&#039;Resource&#039;,&#039;Attribute&#039;)),&lt;br /&gt;
    data_type_expr    text        NOT NULL,        -- серіалізований опис типу (може бути складеним)&lt;br /&gt;
    is_composite      boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    precision_        smallint,&lt;br /&gt;
    scale_            smallint,&lt;br /&gt;
    length_           int,&lt;br /&gt;
    index_mode        varchar(28) NOT NULL DEFAULT &#039;None&#039;&lt;br /&gt;
        CHECK (index_mode IN (&#039;None&#039;,&#039;Index&#039;,&#039;IndexWithAddDimensions&#039;)),&lt;br /&gt;
    is_master         boolean     NOT NULL DEFAULT false,   -- «Ведуче»&lt;br /&gt;
    in_default_filter boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    deny_empty        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    use_in_totals     boolean     NOT NULL DEFAULT true,&lt;br /&gt;
    -- РБ&lt;br /&gt;
    is_balance        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    accounting_flag   varchar(80),&lt;br /&gt;
    extdim_flag       varchar(80),&lt;br /&gt;
    -- РР&lt;br /&gt;
    is_base_dimension boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    -- фізика&lt;br /&gt;
    column_prefix     varchar(8)  NOT NULL,        -- &#039;d3&#039;,&#039;r1&#039;,&#039;a2&#039;&lt;br /&gt;
    PRIMARY KEY (register_id, id),&lt;br /&gt;
    UNIQUE (register_id, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recorder (&lt;br /&gt;
    register_id  smallint NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    doc_type_id  smallint NOT NULL REFERENCES md_type(id),&lt;br /&gt;
    PRIMARY KEY (register_id, doc_type_id)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_aggregate (&lt;br /&gt;
    id           smallint    NOT NULL,&lt;br /&gt;
    register_id  smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    periodicity  varchar(8)  NOT NULL CHECK (periodicity IN (&#039;Day&#039;,&#039;Month&#039;,&#039;Quarter&#039;,&#039;Year&#039;)),&lt;br /&gt;
    use_mode     varchar(12) NOT NULL DEFAULT &#039;Auto&#039;,&lt;br /&gt;
    is_realtime  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    actual_upto  timestamp(0),&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_aggregate_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    aggregate_id smallint NOT NULL,&lt;br /&gt;
    field_id     smallint NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, aggregate_id, field_id),&lt;br /&gt;
    FOREIGN KEY (register_id, aggregate_id) REFERENCES md_register_aggregate(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recalc (&lt;br /&gt;
    id             smallint    NOT NULL,&lt;br /&gt;
    register_id    smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name           varchar(80) NOT NULL,&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_recalc_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    recalc_id    smallint NOT NULL,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    reg_field_id smallint NOT NULL,          -- вимірювання основного регістру&lt;br /&gt;
    column_prefix varchar(8) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, recalc_id, name),&lt;br /&gt;
    FOREIGN KEY (register_id, recalc_id) REFERENCES md_register_recalc(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.4. Регістр відомостей ==&lt;br /&gt;
&lt;br /&gt;
=== 8.4.1. Незалежний періодичний (приклад: КурсиВалют) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0007 (&lt;br /&gt;
    period   timestamp(0) NOT NULL,                  -- Період (усічений до дня: WithinDay)&lt;br /&gt;
    d1_r     uuid         NOT NULL,                  -- Вимірювання «Валюта»&lt;br /&gt;
    r1       numeric(15,4) NOT NULL,                 -- Ресурс «Курс»&lt;br /&gt;
    r2       numeric(10,0) NOT NULL DEFAULT 1,       -- Ресурс «Кратність»&lt;br /&gt;
    CONSTRAINT pk_rg_i_0007 PRIMARY KEY (period, d1_r)&lt;br /&gt;
);&lt;br /&gt;
-- Індекс для зрізу останніх у розрізі вимірювання&lt;br /&gt;
CREATE INDEX ix_rg_i_0007_d1 ON rg_i_0007 (d1_r, period DESC) INCLUDE (r1, r2);&lt;br /&gt;
ALTER TABLE rg_i_0007 ADD CONSTRAINT fk_rg_i_0007_d1&lt;br /&gt;
    FOREIGN KEY (d1_r) REFERENCES cat_0003(ref);      -- Довідник.Валюти&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.2. Підпорядкований реєстратору ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0008 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    r1       numeric(15,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0008 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_period ON rg_i_0008 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_d1     ON rg_i_0008 (d1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.3. Незалежний неперіодичний ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0009 (&lt;br /&gt;
    d1_r  uuid          NOT NULL,&lt;br /&gt;
    d2_r  uuid          NOT NULL,&lt;br /&gt;
    r1    varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_i_0009 PRIMARY KEY (d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.5. Регістр накопичення ==&lt;br /&gt;
&lt;br /&gt;
=== 8.5.1. Таблиця рухів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ТовариНаСкладах: dims = Номенклатура(d1), Склад(d2), Партія(d3, складений), Характеристика(d4)&lt;br /&gt;
--                  res  = Кількість(r1), Сума(r2);  attr = Коментар(a1)&lt;br /&gt;
CREATE TABLE rg_a_0012 (&lt;br /&gt;
    rec_t    smallint      NOT NULL,&lt;br /&gt;
    rec_r    uuid          NOT NULL,&lt;br /&gt;
    line_no  int           NOT NULL,&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    active   boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    mvt      smallint      NOT NULL CHECK (mvt IN (0,1)),   -- 0=Прихід, 1=Витрата&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,                        -- складене вимірювання «Партія»&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(15,3) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2       numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    a1       varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE rg_a_0012_p2026m07 PARTITION OF rg_a_0012&lt;br /&gt;
    FOR VALUES FROM (&#039;2026-07-01&#039;) TO (&#039;2026-08-01&#039;);&lt;br /&gt;
-- ... інші секції створюються регламентним завданням&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_period ON rg_a_0012 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d1     ON rg_a_0012 (d1_r, period, d2_r) WHERE active;   -- Номенклатура (Індексувати з дод. вимірюваннями)&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d2     ON rg_a_0012 (d2_r, period, d1_r) WHERE active;   -- Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.2. Таблиця підсумків залишків ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tb (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок місяця; MAXPERIOD = підсумок за всі періоди&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,     -- Кількість, знаковий залишок&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,     -- Сума&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tb PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- покривний індекс для типового відбору «залишки по складу»&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_tb_d2 ON rg_a_0012_tb (d2_r, period, d1_r) INCLUDE (r1, r2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Семантика:&#039;&#039;&#039; рядок з &amp;lt;code&amp;gt;period = P&amp;lt;/code&amp;gt; містить залишок &#039;&#039;&#039;на початок&#039;&#039;&#039; періоду P. Рядок з &amp;lt;code&amp;gt;period = MAXPERIOD&amp;lt;/code&amp;gt; — поточний залишок за всі періоди (використовується для запитів «залишки на зараз», найчастіший кейс).&lt;br /&gt;
&lt;br /&gt;
=== 8.5.3. Таблиця підсумків оборотів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tt (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок періоду агрегації (день/місяць)&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1_in    numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Прихід&lt;br /&gt;
    r1_out   numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Витрата&lt;br /&gt;
    r2_in    numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2_out   numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tt PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.4. Службова таблиця налаштувань ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_opt (&lt;br /&gt;
    id                smallint     PRIMARY KEY DEFAULT 1 CHECK (id = 1),&lt;br /&gt;
    totals_actual_to  timestamp(0) NOT NULL,   -- ТА: підсумки розраховані до&lt;br /&gt;
    use_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    use_tno_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    min_period        timestamp(0),            -- період першого руху&lt;br /&gt;
    last_recalc_at    timestamp(0),&lt;br /&gt;
    split_merge_at    timestamp(0)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.5. Агрегат (для РН виду «Обороти») ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Агрегат «Продажі за місяцями по номенклатурі та складу» (без Партії, без Характеристики)&lt;br /&gt;
CREATE TABLE rg_a_0031_ag1 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag1 PRIMARY KEY (period, d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.6. Регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
=== 8.6.1. План рахунків (супутні таблиці) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE coa_0005 (                            -- ПланРахунків.Госпрозрахунковий&lt;br /&gt;
    ref          uuid        PRIMARY KEY,&lt;br /&gt;
    parent_ref   uuid        REFERENCES coa_0005(ref),&lt;br /&gt;
    code         varchar(20) NOT NULL,&lt;br /&gt;
    order_code   varchar(40) NOT NULL,             -- впорядкований код для ієрархічних запитів&lt;br /&gt;
    name         varchar(150) NOT NULL,&lt;br /&gt;
    acc_type     smallint    NOT NULL,             -- 0=Активний,1=Пасивний,2=Активно-пасивний&lt;br /&gt;
    off_balance  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    ed_count     smallint    NOT NULL DEFAULT 0,   -- фактична кількість субконто&lt;br /&gt;
    fl_qty       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Кількісний»&lt;br /&gt;
    fl_cur       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Валютний»&lt;br /&gt;
    marked_del   boolean     NOT NULL DEFAULT false&lt;br /&gt;
);&lt;br /&gt;
CREATE UNIQUE INDEX ux_coa_0005_code ON coa_0005 (code);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE coa_0005_ed (                         -- ТЧ «ВидиСубконто»&lt;br /&gt;
    ref        uuid     NOT NULL REFERENCES coa_0005(ref) ON DELETE CASCADE,&lt;br /&gt;
    line_no    int      NOT NULL,&lt;br /&gt;
    ed_type_r  uuid     NOT NULL,                  -- ПланВидівХарактеристик.ВидиСубконто&lt;br /&gt;
    only_tno   boolean  NOT NULL DEFAULT false,    -- «Тільки обороти»&lt;br /&gt;
    sum_flag   boolean  NOT NULL DEFAULT true,     -- «Підсумкова сума»&lt;br /&gt;
    fl_qty     boolean  NOT NULL DEFAULT false,    -- ознака обліку субконто «Кількісний»&lt;br /&gt;
    PRIMARY KEY (ref, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.2. Таблиця проводок (з кореспонденцією) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Госпрозрахунковий: dims = Організація(d1, балансове), Підрозділ(d2, небалансове)&lt;br /&gt;
--   res = Сума(r1, балансовий), Кількість(r2, небалансовий), ВалютнаСума(r3, небалансовий)&lt;br /&gt;
--   attr = Зміст(a1), Валюта(a2);  max_extdim_count = 3&lt;br /&gt;
CREATE TABLE rg_b_0020 (&lt;br /&gt;
    rec_t     smallint      NOT NULL,&lt;br /&gt;
    rec_r     uuid          NOT NULL,&lt;br /&gt;
    line_no   int           NOT NULL,&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    active    boolean       NOT NULL DEFAULT true,&lt;br /&gt;
&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
&lt;br /&gt;
    -- балансове вимірювання: одне значення на проводку&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    -- небалансове вимірювання: окремо для Дт і Кт&lt;br /&gt;
    d2_dt_r   uuid          NOT NULL,&lt;br /&gt;
    d2_kt_r   uuid          NOT NULL,&lt;br /&gt;
&lt;br /&gt;
    -- субконто Дт (3 слоти, складений тип: ПВХ-значення)&lt;br /&gt;
    ed_dt1_t  smallint, ed_dt1_r uuid,&lt;br /&gt;
    ed_dt2_t  smallint, ed_dt2_r uuid,&lt;br /&gt;
    ed_dt3_t  smallint, ed_dt3_r uuid,&lt;br /&gt;
    ed_dt_h   bigint        NOT NULL DEFAULT 0,     -- хеш набору субконто Дт (для JOIN з підсумками)&lt;br /&gt;
    -- субконто Кт&lt;br /&gt;
    ed_kt1_t  smallint, ed_kt1_r uuid,&lt;br /&gt;
    ed_kt2_t  smallint, ed_kt2_r uuid,&lt;br /&gt;
    ed_kt3_t  smallint, ed_kt3_r uuid,&lt;br /&gt;
    ed_kt_h   bigint        NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    -- балансовий ресурс: одне значення&lt;br /&gt;
    r1        numeric(20,2) NOT NULL DEFAULT 0,     -- Сума&lt;br /&gt;
    -- небалансові ресурси: пара Дт/Кт&lt;br /&gt;
    r2_dt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Дт&lt;br /&gt;
    r2_kt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Кт&lt;br /&gt;
    r3_dt     numeric(20,2) NOT NULL DEFAULT 0,     -- ВалютнаСума Дт&lt;br /&gt;
    r3_kt     numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    a1        varchar(255),&lt;br /&gt;
    a2_r      uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_period  ON rg_b_0020 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_dt  ON rg_b_0020 (acc_dt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_kt  ON rg_b_0020 (acc_kt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_dt   ON rg_b_0020 (ed_dt1_t, ed_dt1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №2.&#039;&#039;&#039; Субконто зберігаються &#039;&#039;&#039;слотами в основній таблиці&#039;&#039;&#039;, а не в дочірній таблиці «ключ-значення». Обґрунтування: (а) віртуальні таблиці &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; з відбором за субконто перетворюються на предикат по колонці замість &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; самоз&#039;єднань; (б) кількість субконто жорстко обмежена (≤5) — «широка» таблиця прийнятна; (в) 1С використовує гібрид (&amp;lt;code&amp;gt;_AccRgED&amp;lt;/code&amp;gt;), що дає складніші плани. &#039;&#039;&#039;Ціна:&#039;&#039;&#039; зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; = реструктуризація таблиці. Альтернатива (дочірня таблиця &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;) описана в Додатку Б і зберігається як план «Б» за результатами навантажувального тесту НТ-04.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.6.3. Таблиця проводок (без кореспонденції) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_b_0021 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    acc_mvt  smallint     NOT NULL CHECK (acc_mvt IN (0,1)),  -- 0=Дебет, 1=Кредит&lt;br /&gt;
    acc_r    uuid         NOT NULL REFERENCES coa_0006(ref),&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    ed1_t smallint, ed1_r uuid,&lt;br /&gt;
    ed2_t smallint, ed2_r uuid,&lt;br /&gt;
    ed3_t smallint, ed3_r uuid,&lt;br /&gt;
    ed_h     bigint       NOT NULL DEFAULT 0,&lt;br /&gt;
    r1       numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0021 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.4. Підсумки РБ ===&lt;br /&gt;
Підсумки будуються на кількох «рівнях субконто» — щоб запит без відбору за субконто не сканував найдетальнішу таблицю.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Рівень 0: залишки по рахунку + балансові вимірювання (без субконто)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,               -- Організація (балансове)&lt;br /&gt;
    r1       numeric(24,2) NOT NULL,               -- Сума: &amp;gt;0 = дебетовий, &amp;lt;0 = кредитовий залишок&lt;br /&gt;
    r2       numeric(24,3) NOT NULL,               -- Кількість&lt;br /&gt;
    r3       numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Рівень 1..3: залишки з розшифровкою по субконто (тільки для рахунків з ed_count &amp;gt;= k)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb1 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t   smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb1 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE rg_b_0020_tb2 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    ed2_t smallint NOT NULL, ed2_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb2 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, ed2_t, ed2_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- rg_b_0020_tb3 — аналогічно, 3 субконто&lt;br /&gt;
&lt;br /&gt;
-- Обороти (аналогічні рівні): tt0..tt3&lt;br /&gt;
CREATE TABLE rg_b_0020_tt0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    r1_dt numeric(24,2) NOT NULL, r1_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    r2_dt numeric(24,3) NOT NULL, r2_kt numeric(24,3) NOT NULL,&lt;br /&gt;
    r3_dt numeric(24,2) NOT NULL, r3_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tt0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Обороти між рахунками (кореспонденції)&lt;br /&gt;
CREATE TABLE rg_b_0020_tc (&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter  smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL,&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL,&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    r1        numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tc PRIMARY KEY (period, acc_dt_r, acc_kt_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Правило запису рівнів:&#039;&#039;&#039; для проводки з рахунком, що має &amp;lt;code&amp;gt;ed_count = k&amp;lt;/code&amp;gt;, оновлюються таблиці &amp;lt;code&amp;gt;tb0 … tbK&amp;lt;/code&amp;gt; (k+1 таблиць). Рахунки без субконто оновлюють лише &amp;lt;code&amp;gt;tb0&amp;lt;/code&amp;gt;. Субконто з ознакою «Тільки обороти» не потрапляють у &amp;lt;code&amp;gt;tb*&amp;lt;/code&amp;gt;, лише в &amp;lt;code&amp;gt;tt*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.7. Регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Нарахування: dims = Співробітник(d1, базове), Підрозділ(d2)&lt;br /&gt;
--              res  = Результат(r1), ВідпрацьованоДнів(r2), НормаДнів(r3)&lt;br /&gt;
--              attr = Графік(a1)&lt;br /&gt;
CREATE TABLE rg_c_0040 (&lt;br /&gt;
    rec_t        smallint      NOT NULL,&lt;br /&gt;
    rec_r        uuid          NOT NULL,&lt;br /&gt;
    line_no      int           NOT NULL,&lt;br /&gt;
    period       timestamp(0)  NOT NULL,      -- період реєстрації (початок місяця)&lt;br /&gt;
    active       boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    reversal     boolean       NOT NULL DEFAULT false,   -- Сторно&lt;br /&gt;
    calc_type_r  uuid          NOT NULL,                 -- ВидРозрахунку → pct_0011(ref)&lt;br /&gt;
    act_begin    timestamp(0)  NOT NULL,      -- ПеріодДіїПочаток&lt;br /&gt;
    act_end      timestamp(0)  NOT NULL,      -- ПеріодДіїКінець&lt;br /&gt;
    base_begin   timestamp(0),                -- БазовийПеріодПочаток&lt;br /&gt;
    base_end     timestamp(0),                -- БазовийПеріодКінець&lt;br /&gt;
    d1_r         uuid          NOT NULL,&lt;br /&gt;
    d2_r         uuid          NOT NULL,&lt;br /&gt;
    r1           numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    r3           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    a1_r         uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040 PRIMARY KEY (rec_t, rec_r, line_no),&lt;br /&gt;
    CONSTRAINT chk_rg_c_0040_act CHECK (act_end &amp;gt;= act_begin)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_period ON rg_c_0040 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_d1     ON rg_c_0040 (d1_r, period, calc_type_r) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_act    ON rg_c_0040 (d1_r, act_begin, act_end) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_base   ON rg_c_0040 (d1_r, calc_type_r, base_begin, base_end) WHERE active;&lt;br /&gt;
&lt;br /&gt;
-- Фактичні періоди дії (після витіснення). Один запис → 0..N інтервалів.&lt;br /&gt;
CREATE TABLE rg_c_0040_ap (&lt;br /&gt;
    rec_t       smallint     NOT NULL,&lt;br /&gt;
    rec_r       uuid         NOT NULL,&lt;br /&gt;
    line_no     int          NOT NULL,&lt;br /&gt;
    interval_no smallint     NOT NULL,&lt;br /&gt;
    calc_type_r uuid         NOT NULL,&lt;br /&gt;
    d1_r        uuid         NOT NULL,        -- денормалізація базового вимірювання для швидкого JOIN&lt;br /&gt;
    fact_begin  timestamp(0) NOT NULL,&lt;br /&gt;
    fact_end    timestamp(0) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_ap PRIMARY KEY (rec_t, rec_r, line_no, interval_no),&lt;br /&gt;
    CONSTRAINT fk_rg_c_0040_ap FOREIGN KEY (rec_t, rec_r, line_no)&lt;br /&gt;
        REFERENCES rg_c_0040 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_ap_d1 ON rg_c_0040_ap (d1_r, fact_begin, fact_end);&lt;br /&gt;
&lt;br /&gt;
-- Перерахунок «ПерерахунокЗаБазою»&lt;br /&gt;
CREATE TABLE rg_c_0040_rc1 (&lt;br /&gt;
    rec_t        smallint NOT NULL,     -- реєстратор запису, який треба перерахувати&lt;br /&gt;
    rec_r        uuid     NOT NULL,&lt;br /&gt;
    calc_type_r  uuid     NOT NULL,     -- вид розрахунку, що потребує перерахунку&lt;br /&gt;
    d1_r         uuid     NOT NULL,     -- вимірювання перерахунку «Співробітник»&lt;br /&gt;
    src_rec_t    smallint NOT NULL,     -- реєстратор, що спричинив перерахунок&lt;br /&gt;
    src_rec_r    uuid     NOT NULL,&lt;br /&gt;
    created_at   timestamp(0) NOT NULL DEFAULT now(),&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_rc1 PRIMARY KEY (rec_t, rec_r, calc_type_r, d1_r)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_rc1_src ON rg_c_0040_rc1 (src_rec_t, src_rec_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.8. Зведення: які таблиці породжує кожен тип регістру ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Tables {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;; ranksep=0.6; nodesep=0.08;&lt;br /&gt;
  node [shape=box, style=&amp;quot;filled,rounded&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9, height=0.26];&lt;br /&gt;
  edge [color=&amp;quot;#9e9e9e&amp;quot;, arrowhead=vee];&lt;br /&gt;
&lt;br /&gt;
  RI  [label=&amp;quot;РВ\n(незалежний або\nпідпорядкований)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RAB [label=&amp;quot;РН «Залишки»&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RAT [label=&amp;quot;РН «Обороти»&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RB  [label=&amp;quot;РБ&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RC  [label=&amp;quot;РР&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  node [shape=cylinder, style=filled, fontname=&amp;quot;Courier&amp;quot;, fontsize=8, height=0.22];&lt;br /&gt;
&lt;br /&gt;
  i1 [label=&amp;quot;rg_i_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#c8e6c9&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; i1;&lt;br /&gt;
&lt;br /&gt;
  a1 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#ffecb3&amp;quot;];&lt;br /&gt;
  a2 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_tb&amp;quot;, fillcolor=&amp;quot;#ffe082&amp;quot;];&lt;br /&gt;
  a3 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_tt&amp;quot;, fillcolor=&amp;quot;#ffe082&amp;quot;];&lt;br /&gt;
  a4 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_opt&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  RAB -&amp;gt; a1; RAB -&amp;gt; a2 [label=&amp;quot; якщо підсумки залишків&amp;quot;, fontsize=7];&lt;br /&gt;
  RAB -&amp;gt; a3 [label=&amp;quot; якщо підсумки оборотів&amp;quot;, fontsize=7]; RAB -&amp;gt; a4;&lt;br /&gt;
&lt;br /&gt;
  t1 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#ffecb3&amp;quot;];&lt;br /&gt;
  t2 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_tt&amp;quot;, fillcolor=&amp;quot;#ffe082&amp;quot;];&lt;br /&gt;
  t3 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_ag1..agN&amp;quot;, fillcolor=&amp;quot;#ffd54f&amp;quot;];&lt;br /&gt;
  t4 [label=&amp;quot;rg_a_&amp;lt;id&amp;gt;_opt&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  RAT -&amp;gt; t1; RAT -&amp;gt; t2; RAT -&amp;gt; t3 [label=&amp;quot; агрегати&amp;quot;, fontsize=7]; RAT -&amp;gt; t4;&lt;br /&gt;
&lt;br /&gt;
  b1 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;];&lt;br /&gt;
  b2 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;_tb0 .. _tbK&amp;quot;, fillcolor=&amp;quot;#f48fb1&amp;quot;];&lt;br /&gt;
  b3 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;_tt0 .. _ttK&amp;quot;, fillcolor=&amp;quot;#f48fb1&amp;quot;];&lt;br /&gt;
  b4 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;_tc&amp;quot;, fillcolor=&amp;quot;#f48fb1&amp;quot;];&lt;br /&gt;
  b5 [label=&amp;quot;rg_b_&amp;lt;id&amp;gt;_opt&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RB -&amp;gt; b1; RB -&amp;gt; b2 [label=&amp;quot; K = МаксКількістьСубконто&amp;quot;, fontsize=7]; RB -&amp;gt; b3; RB -&amp;gt; b4; RB -&amp;gt; b5;&lt;br /&gt;
&lt;br /&gt;
  c1 [label=&amp;quot;rg_c_&amp;lt;id&amp;gt;&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
  c2 [label=&amp;quot;rg_c_&amp;lt;id&amp;gt;_ap&amp;quot;, fillcolor=&amp;quot;#b39ddb&amp;quot;];&lt;br /&gt;
  c3 [label=&amp;quot;rg_c_&amp;lt;id&amp;gt;_rc1..rcM&amp;quot;, fillcolor=&amp;quot;#b39ddb&amp;quot;];&lt;br /&gt;
  RC -&amp;gt; c1; RC -&amp;gt; c2 [label=&amp;quot; фактичні періоди&amp;quot;, fontsize=7]; RC -&amp;gt; c3 [label=&amp;quot; перерахунки&amp;quot;, fontsize=7];&lt;br /&gt;
&lt;br /&gt;
  { rank=same; RI; RAB; RAT; RB; RC; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оцінка: для РБ з &amp;lt;code&amp;gt;МаксКількістьСубконто = 3&amp;lt;/code&amp;gt; генерується &#039;&#039;&#039;10 фізичних таблиць&#039;&#039;&#039; на один регістр.&lt;br /&gt;
&lt;br /&gt;
= 9. ER-моделі =&lt;br /&gt;
&lt;br /&gt;
== 9.1. ER-модель метаданих (репозиторій) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_type&amp;quot; as T {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * kind : varchar(20)&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  table_name : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register&amp;quot; as R {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK,FK→md_type&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * kind : varchar(12)&lt;br /&gt;
  * write_mode : varchar(24)&lt;br /&gt;
  * periodicity : varchar(24)&lt;br /&gt;
  accumulation_kind : varchar(10)&lt;br /&gt;
  enable_bal_totals : boolean&lt;br /&gt;
  enable_tno_totals : boolean&lt;br /&gt;
  tno_totals_period : varchar(6)&lt;br /&gt;
  split_totals : boolean&lt;br /&gt;
  chart_of_accounts_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  correspondence : boolean&lt;br /&gt;
  max_extdim_count : smallint&lt;br /&gt;
  calc_types_plan_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_period_mode : varchar(24)&lt;br /&gt;
  schedule_register_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
  * struct_version : int&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_field&amp;quot; as F {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * role : Dimension|Resource|Attribute&lt;br /&gt;
  * data_type_expr : text&lt;br /&gt;
  is_composite : boolean&lt;br /&gt;
  index_mode : varchar(28)&lt;br /&gt;
  is_master : boolean&lt;br /&gt;
  is_balance : boolean&lt;br /&gt;
  is_base_dimension : boolean&lt;br /&gt;
  accounting_flag : varchar(80)&lt;br /&gt;
  * column_prefix : varchar(8)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recorder&amp;quot; as RR {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * doc_type_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate&amp;quot; as AG {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * periodicity : Day|Month|Quarter|Year&lt;br /&gt;
  is_realtime : boolean&lt;br /&gt;
  actual_upto : timestamp&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate_dim&amp;quot; as AGD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * aggregate_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * field_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc&amp;quot; as RC {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc_dim&amp;quot; as RCD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * recalc_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * reg_field_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
T ||--o| R          : &amp;quot;є регістром&amp;quot;&lt;br /&gt;
T ||--o{ RR         : &amp;quot;тип документа&amp;quot;&lt;br /&gt;
R ||--|{ F          : &amp;quot;має поля&amp;quot;&lt;br /&gt;
R ||--o{ RR         : &amp;quot;реєстратори&amp;quot;&lt;br /&gt;
R ||--o{ AG         : &amp;quot;агрегати&amp;quot;&lt;br /&gt;
AG ||--|{ AGD       : &amp;quot;склад вимірювань&amp;quot;&lt;br /&gt;
F  ||--o{ AGD       : &amp;quot;вимірювання&amp;quot;&lt;br /&gt;
R ||--o{ RC         : &amp;quot;перерахунки&amp;quot;&lt;br /&gt;
RC ||--|{ RCD       : &amp;quot;вимірювання перерахунку&amp;quot;&lt;br /&gt;
F  ||--o{ RCD       : &amp;quot;відповідає&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план рахунків&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план видів розрахунку&amp;quot;&lt;br /&gt;
R }o--o| R          : &amp;quot;графік часу&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.2. ER-модель: регістр накопичення (вид «Залишки») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0002\n«ПрихіднаНакладна»&amp;quot; as D1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;doc_0003\n«ВидатковаНакладна»&amp;quot; as D2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0001\n«Номенклатура»&amp;quot; as C1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0004\n«Склади»&amp;quot; as C2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012\n«ТовариНаСкладах» (рухи)&amp;quot; as M {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * mvt : smallint  «0=Прихід,1=Витрата»&lt;br /&gt;
  * d1_r : uuid  «Номенклатура» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid  «Склад» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint «Партія:тип»&lt;br /&gt;
  * d3_r : uuid  «Партія:посилання»&lt;br /&gt;
  * d4_r : uuid  «Характеристика» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * r1 : numeric(15,3) «Кількість»&lt;br /&gt;
  * r2 : numeric(15,2) «Сума»&lt;br /&gt;
  a1 : varchar(200) «Коментар»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tb\nпідсумки залишків&amp;quot; as TB {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * r1 : numeric(20,3) «Кількість (±)»&lt;br /&gt;
  * r2 : numeric(20,2) «Сума (±)»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tt\nпідсумки оборотів&amp;quot; as TT {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_in, r1_out : numeric(20,3)&lt;br /&gt;
  r2_in, r2_out : numeric(20,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_opt&amp;quot; as OPT {&lt;br /&gt;
  * id : smallint = 1 &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * totals_actual_to : timestamp(0)&lt;br /&gt;
  use_bal_totals : boolean&lt;br /&gt;
  use_tno_totals : boolean&lt;br /&gt;
  min_period : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
D1 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
D2 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
C1 ||--o{ M : &amp;quot;d1_r&amp;quot;&lt;br /&gt;
C2 ||--o{ M : &amp;quot;d2_r&amp;quot;&lt;br /&gt;
M }o..|| TB : &amp;quot;агрегується в\n(підтримується платформою)&amp;quot;&lt;br /&gt;
M }o..|| TT : &amp;quot;агрегується в&amp;quot;&lt;br /&gt;
OPT ||..|| TB : &amp;quot;ТА підсумків&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note bottom of M&lt;br /&gt;
  PK = (rec_t, rec_r, line_no)&lt;br /&gt;
  → усі рухи одного документа&lt;br /&gt;
    фізично суміжні&lt;br /&gt;
  Партиціонування: RANGE(period)&lt;br /&gt;
end note&lt;br /&gt;
&lt;br /&gt;
note bottom of TB&lt;br /&gt;
  period = MAXPERIOD (&#039;5999-11-01&#039;)&lt;br /&gt;
  → рядок «залишок за всі періоди»&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.3. ER-модель: регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;coa_0005\n«План рахунків»&amp;quot; as A {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  parent_ref : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * code : varchar(20) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  order_code : varchar(40)&lt;br /&gt;
  * name : varchar(150)&lt;br /&gt;
  * acc_type : smallint «Акт/Пас/АП»&lt;br /&gt;
  off_balance : boolean&lt;br /&gt;
  ed_count : smallint&lt;br /&gt;
  fl_qty, fl_cur : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;coa_0005_ed\n«Види субконто рахунку»&amp;quot; as AE {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * ed_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  only_tno : boolean&lt;br /&gt;
  sum_flag : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cvt_0009\n«ПВХ.ВидиСубконто»&amp;quot; as VT {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  value_type : text&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020\n«Госпрозрахунковий» (проводки)&amp;quot; as J {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * acc_dt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid «Організація (балансове)»&lt;br /&gt;
  * d2_dt_r : uuid «Підрозділ Дт»&lt;br /&gt;
  * d2_kt_r : uuid «Підрозділ Кт»&lt;br /&gt;
  ed_dt1_t/_r .. ed_dt3_t/_r : «субконто Дт»&lt;br /&gt;
  ed_dt_h : bigint&lt;br /&gt;
  ed_kt1_t/_r .. ed_kt3_t/_r : «субконто Кт»&lt;br /&gt;
  ed_kt_h : bigint&lt;br /&gt;
  * r1 : numeric(20,2) «Сума (балансовий)»&lt;br /&gt;
  r2_dt, r2_kt : numeric(20,3) «Кількість»&lt;br /&gt;
  r3_dt, r3_kt : numeric(20,2) «ВалютнаСума»&lt;br /&gt;
  a1 : varchar(255) «Зміст»&lt;br /&gt;
  a2_r : uuid «Валюта»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb0\nзалишки, рівень 0&amp;quot; as B0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric «знакові»&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb1..tb3\nзалишки, рівні 1..3&amp;quot; as B1 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * ed1_t, ed1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed2_t, ed2_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed3_t, ed3_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tt0..tt3\nобороти за рівнями&amp;quot; as T0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed…) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_dt, r1_kt&lt;br /&gt;
  r2_dt, r2_kt&lt;br /&gt;
  r3_dt, r3_kt&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tc\nобороти Дт↔Кт&amp;quot; as TC {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_dt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric(24,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
A ||--o{ AE : &amp;quot;види субконто&amp;quot;&lt;br /&gt;
VT ||--o{ AE : &amp;quot;тип субконто&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_dt_r&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_kt_r&amp;quot;&lt;br /&gt;
A ||--o{ B0 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
A ||--o{ B1 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
J }o..|| B0 : &amp;quot;агрегується (Дт: +, Кт: −)&amp;quot;&lt;br /&gt;
J }o..|| B1 : &amp;quot;агрегується, якщо ed_count ≥ k&amp;quot;&lt;br /&gt;
J }o..|| T0 : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
J }o..|| TC : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note right of J&lt;br /&gt;
  Балансовий ресурс r1 — одне значення,&lt;br /&gt;
  контроль Σ(Дт) = Σ(Кт) у межах реєстратора.&lt;br /&gt;
  Небалансові ресурси — пара Дт/Кт.&lt;br /&gt;
  Субконто — слоти (див. Рішення №2).&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.4. ER-модель: регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;pct_0011\n«ПВР.ОсновніНарахування»&amp;quot; as P {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_dependency : varchar(24)&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_base\n«Базові види розрахунку»&amp;quot; as PB {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * base_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_displace\n«Витісняючі види розрахунку»&amp;quot; as PD {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * displacing_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_lead\n«Ведучі види розрахунку»&amp;quot; as PL {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * leading_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040\n«Нарахування» (рухи)&amp;quot; as CR {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0) «період реєстрації»&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * reversal : boolean «Сторно»&lt;br /&gt;
  * calc_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * act_begin : timestamp(0)&lt;br /&gt;
  * act_end : timestamp(0)&lt;br /&gt;
  base_begin : timestamp(0)&lt;br /&gt;
  base_end : timestamp(0)&lt;br /&gt;
  * d1_r : uuid «Співробітник (базове)»&lt;br /&gt;
  * d2_r : uuid «Підрозділ»&lt;br /&gt;
  r1 : numeric «Результат»&lt;br /&gt;
  r2 : numeric «ВідпрацьованоДнів»&lt;br /&gt;
  r3 : numeric «НормаДнів»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_ap\nфактичні періоди дії&amp;quot; as AP {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * interval_no : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * calc_type_r : uuid&lt;br /&gt;
  * d1_r : uuid&lt;br /&gt;
  * fact_begin : timestamp(0)&lt;br /&gt;
  * fact_end : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_rc1\n«ПерерахунокЗаБазою»&amp;quot; as RC {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * calc_type_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  src_rec_t, src_rec_r&lt;br /&gt;
  created_at&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_i_0015\n«ГрафікРоботи» (РВ)&amp;quot; as SCH {&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ВидГрафіка»&lt;br /&gt;
  * d2_d : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ДатаГрафіка»&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric «Значення»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0007\n«НарахуванняЗарплати»&amp;quot; as DOC {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number, date, posted&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
P ||--o{ CR  : &amp;quot;calc_type_r&amp;quot;&lt;br /&gt;
P ||--o{ PB  : &amp;quot;базові&amp;quot;&lt;br /&gt;
P ||--o{ PD  : &amp;quot;витісняючі&amp;quot;&lt;br /&gt;
P ||--o{ PL  : &amp;quot;ведучі&amp;quot;&lt;br /&gt;
DOC ||..o{ CR : &amp;quot;реєстратор&amp;quot;&lt;br /&gt;
CR ||--|{ AP : &amp;quot;1 запис → 0..N\nфактичних інтервалів&amp;quot;&lt;br /&gt;
CR }o..o{ RC : &amp;quot;потребує перерахунку&amp;quot;&lt;br /&gt;
SCH }o..o{ CR : &amp;quot;ДаніГрафіка\n(віртуальна таблиця)&amp;quot;&lt;br /&gt;
CR }o..o{ CR : &amp;quot;БазаРозрахунку\n(self-join через PB\nта базові вимірювання)&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.5. Зведена концептуальна ER (усі типи) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph ER {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=record, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9, style=filled];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  MD  [label=&amp;quot;{md_register|id (PK)\lname\lkind\lperiodicity\lwrite_mode\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDF [label=&amp;quot;{md_register_field|register_id (PK,FK)\lid (PK)\lname\lrole\ldata_type\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDR [label=&amp;quot;{md_register_recorder|register_id (PK,FK)\ldoc_type_id (PK,FK)\l}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  DOC [label=&amp;quot;{doc_XXXX (Документ)|ref (PK)\lnumber\ldate\lposted\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  CAT [label=&amp;quot;{cat_XXXX (Довідник)|ref (PK)\lcode\lname\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  COA [label=&amp;quot;{coa_XXXX (План рахунків)|ref (PK)\lcode\lacc_type\led_count\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  PCT [label=&amp;quot;{pct_XXXX (ПВР)|ref (PK)\lcode\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI  [label=&amp;quot;{rg_i_XXXX (РВ)|period (PK*)\ld1..dN (PK*)\l| rec_t,rec_r,line_no (PK**)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA  [label=&amp;quot;{rg_a_XXXX (РН)|rec_t, rec_r, line_no (PK)\lperiod\lactive\lmvt\ld1..dN\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  RAT [label=&amp;quot;{rg_a_XXXX_tb / _tt|period (PK)\ld1..dN (PK)\lsplitter (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  RB  [label=&amp;quot;{rg_b_XXXX (РБ)|rec_t, rec_r, line_no (PK)\lperiod, active\lacc_dt_r, acc_kt_r\led_dt1..3, ed_kt1..3\ld1..dN\lr1, r2_dt/r2_kt\l}&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RBT [label=&amp;quot;{rg_b_XXXX_tb0..tbK\lrg_b_XXXX_tt0..ttK\lrg_b_XXXX_tc|period, acc_r, d1..dN\led1..edK (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;];&lt;br /&gt;
  RC  [label=&amp;quot;{rg_c_XXXX (РР)|rec_t, rec_r, line_no (PK)\lperiod, active, reversal\lcalc_type_r\lact_begin, act_end\lbase_begin, base_end\ld1..dN, r1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
  RCA [label=&amp;quot;{rg_c_XXXX_ap|rec_t,rec_r,line_no (PK,FK)\linterval_no (PK)\lfact_begin, fact_end\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
  RCR [label=&amp;quot;{rg_c_XXXX_rc1..rcM|rec_t, rec_r (PK)\lcalc_type_r (PK)\ld1..dN (PK)\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  MD  -&amp;gt; MDF [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; MDR [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MDR -&amp;gt; DOC [label=&amp;quot;тип&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; COA [label=&amp;quot;0:1 план рахунків&amp;quot;, style=dashed];&lt;br /&gt;
  MD  -&amp;gt; PCT [label=&amp;quot;0:1 ПВР&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  MD -&amp;gt; RI [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RA [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RB [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RC [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
&lt;br /&gt;
  DOC -&amp;gt; RI [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RA [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RB [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RC [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  CAT -&amp;gt; RI [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  CAT -&amp;gt; RA [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  COA -&amp;gt; RB [label=&amp;quot;FK рахунок&amp;quot;];&lt;br /&gt;
  PCT -&amp;gt; RC [label=&amp;quot;FK вид розрах.&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RA -&amp;gt; RAT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RB -&amp;gt; RBT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RC -&amp;gt; RCA [label=&amp;quot;витіснення → 1:N&amp;quot;, color=purple];&lt;br /&gt;
  RC -&amp;gt; RCR [label=&amp;quot;реєстрація перерахунків&amp;quot;, color=purple, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  { rank=same; MD; MDF; MDR; }&lt;br /&gt;
  { rank=same; RI; RA; RB; RC; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Легенда:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;(PK*)&amp;lt;/code&amp;gt; — ключ для незалежного РВ; &amp;lt;code&amp;gt;(PK**)&amp;lt;/code&amp;gt; — для підпорядкованого.&lt;br /&gt;
* Пунктир «реєстратор» — логічний зв&#039;язок без FK (поліморфне посилання, підтримується платформою).&lt;br /&gt;
* Пунктир «генерує DDL» — метадані → фізична схема (не зв&#039;язок даних).&lt;br /&gt;
&lt;br /&gt;
= 10. Ключові алгоритми =&lt;br /&gt;
&lt;br /&gt;
== 10.1. Запис набору записів (режим «Заміщати») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def write_record_set(reg: Register, rs: RecordSet, replace: bool = True) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Розділ 7.1, ФТ-01…ФТ-04. Уся операція — в одній транзакції.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    check_rights(reg, Right.INSERT | Right.UPDATE)              # ФТ-37&lt;br /&gt;
    validate(reg, rs)                                           # реєстратор ∈ md_register_recorder;&lt;br /&gt;
                                                                # deny_empty; для РБ — Σ Дт = Σ Кт&lt;br /&gt;
    with conn.begin():                                          # ФТ-03: одна транзакція&lt;br /&gt;
        old = read_for_update(reg, rs.filter)                   # SELECT ... FOR UPDATE&lt;br /&gt;
&lt;br /&gt;
        # АП-2: дельта рахується набором, один раз; тільки active-записи&lt;br /&gt;
        delta = aggregate(rs.active_records, sign=+1) + aggregate(old, sign=-1)&lt;br /&gt;
&lt;br /&gt;
        if replace:                                             # ФТ-04&lt;br /&gt;
            conn.execute(delete(tbl).where(*rs.filter.clauses))  # 1 запит&lt;br /&gt;
        conn.execute(insert(tbl), rs.as_dicts())                 # 1 executemany (АП-1)&lt;br /&gt;
&lt;br /&gt;
        update_totals(reg, delta)                               # -&amp;gt; merge_totals(), розділи 10.2, Е.3&lt;br /&gt;
&lt;br /&gt;
        if reg.kind is RegisterKind.CALCULATION:&lt;br /&gt;
            keys = rs.affected_keys | affected_keys(old)&lt;br /&gt;
            recompute_actual_periods(reg, keys)                 # розділ 10.4&lt;br /&gt;
            register_recalculations(reg, [*rs.records, *old])   # розділ 10.5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.2. Інкрементальне оновлення підсумків залишків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Δ (delta) — тимчасова таблиця: (period_month, d1_r, d2_r, d3_t, d3_r, d4_r, dr1, dr2)&lt;br /&gt;
-- де dr = Σ (CASE WHEN mvt = 0 THEN +значення ELSE -значення END)&lt;br /&gt;
&lt;br /&gt;
-- Крок 1. Кумулятивні залишки: рух у місяці M впливає на підсумки всіх періодів &amp;gt; M&lt;br /&gt;
--         та на рядок MAXPERIOD.&lt;br /&gt;
INSERT INTO rg_a_0012_tb AS t (period, splitter, d1_r, d2_r, d3_t, d3_r, d4_r, r1, r2)&lt;br /&gt;
SELECT p.period, :splitter, d.d1_r, d.d2_r, d.d3_t, d.d3_r, d.d4_r, d.dr1, d.dr2&lt;br /&gt;
FROM   delta d&lt;br /&gt;
CROSS  JOIN LATERAL (&lt;br /&gt;
         SELECT period FROM totals_periods&lt;br /&gt;
         WHERE period &amp;gt;  d.period_month&lt;br /&gt;
           AND period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
         UNION ALL SELECT TIMESTAMP &#039;5999-11-01&#039;      -- MAXPERIOD&lt;br /&gt;
       ) p&lt;br /&gt;
ORDER BY 1,3,4,5,6,7                                   -- детермінований порядок → без дедлоків&lt;br /&gt;
ON CONFLICT (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
DO UPDATE SET r1 = t.r1 + EXCLUDED.r1,&lt;br /&gt;
              r2 = t.r2 + EXCLUDED.r2;&lt;br /&gt;
&lt;br /&gt;
-- Крок 2. Прибирання нульових рядків (регламентно, не в транзакції проведення)&lt;br /&gt;
DELETE FROM rg_a_0012_tb WHERE r1 = 0 AND r2 = 0 AND period &amp;lt;&amp;gt; TIMESTAMP &#039;5999-11-01&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Оптимізація.&#039;&#039;&#039; Крок 1 у наведеному вигляді має складність O(кількість_періодів_після_руху). Для рухів «заднім числом» на роки це дорого. &#039;&#039;&#039;Проєктне рішення №3:&#039;&#039;&#039; підсумки оновлюються тільки для рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; і для найближчої межі періоду; повні кумулятивні зрізи перебудовуються регламентним завданням «Перерахунок підсумків» за зміненими місяцями (список змінених місяців накопичується в &amp;lt;code&amp;gt;rg_a_0012_opt.dirty_months&amp;lt;/code&amp;gt;). Запити на дату в «брудному» місяці автоматично перемикаються на розрахунок від найближчого чистого зрізу. Остаточний вибір — за результатами НТ-02.}}&lt;br /&gt;
&lt;br /&gt;
== 10.3. Трансляція віртуальної таблиці «Залишки» ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрНакопичення.ТовариНаСкладах.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад)&lt;br /&gt;
WITH boundary AS (&lt;br /&gt;
    SELECT COALESCE(MAX(period), TIMESTAMP &#039;0001-01-01&#039;) AS p&lt;br /&gt;
    FROM   totals_periods&lt;br /&gt;
    WHERE  period &amp;lt;= :Період&lt;br /&gt;
      AND  period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
),&lt;br /&gt;
base AS (                                    -- залишок на межу періоду з підсумків&lt;br /&gt;
    SELECT t.d1_r, t.d2_r, t.d3_t, t.d3_r, t.d4_r,&lt;br /&gt;
           SUM(t.r1) AS r1, SUM(t.r2) AS r2&lt;br /&gt;
    FROM   rg_a_0012_tb t, boundary b&lt;br /&gt;
    WHERE  t.period = b.p&lt;br /&gt;
      AND  t.d2_r  = :Склад                  -- push-down параметра ВТ&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
),&lt;br /&gt;
tail AS (                                    -- «живі» рухи після межі й до &amp;amp;Період&lt;br /&gt;
    SELECT m.d1_r, m.d2_r, m.d3_t, m.d3_r, m.d4_r,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r1 ELSE -m.r1 END) AS r1,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r2 ELSE -m.r2 END) AS r2&lt;br /&gt;
    FROM   rg_a_0012 m, boundary b&lt;br /&gt;
    WHERE  m.active&lt;br /&gt;
      AND  m.period &amp;gt;  b.p&lt;br /&gt;
      AND  m.period &amp;lt;= :Період&lt;br /&gt;
      AND  m.d2_r   =  :Склад&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
)&lt;br /&gt;
SELECT d1_r AS &amp;quot;Номенклатура&amp;quot;, d2_r AS &amp;quot;Склад&amp;quot;,&lt;br /&gt;
       d3_t, d3_r AS &amp;quot;Партія&amp;quot;, d4_r AS &amp;quot;Характеристика&amp;quot;,&lt;br /&gt;
       SUM(r1) AS &amp;quot;КількістьЗалишок&amp;quot;,&lt;br /&gt;
       SUM(r2) AS &amp;quot;СумаЗалишок&amp;quot;&lt;br /&gt;
FROM  (SELECT * FROM base UNION ALL SELECT * FROM tail) u&lt;br /&gt;
GROUP BY 1,2,3,4,5&lt;br /&gt;
HAVING SUM(r1) &amp;lt;&amp;gt; 0 OR SUM(r2) &amp;lt;&amp;gt; 0;         -- нульові залишки не повертаються&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Оптимізація для найчастішого випадку:&#039;&#039;&#039; якщо &amp;lt;code&amp;gt;:Період ≥ ТА&amp;lt;/code&amp;gt; і в регістрі немає рухів у майбутньому — &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; читається з рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; одним index seek, &amp;lt;code&amp;gt;tail&amp;lt;/code&amp;gt; = ∅.&lt;br /&gt;
&lt;br /&gt;
== 10.4. Розрахунок фактичних періодів дії (витіснення) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def recompute_actual_periods(reg: Register, keys: set[DimKey]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Розділ 7.5.1, ФТ-22…ФТ-24. Тут — оркестрація; сам алгоритм — Додаток Е.5.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tbl = schema.movements(reg)&lt;br /&gt;
    ap = schema.actual_periods(reg)                     # rg_c_&amp;lt;id&amp;gt;_ap&lt;br /&gt;
&lt;br /&gt;
    # 1. Читання всіх записів зачеплених ключів — ОДИН запит (АП-1)&lt;br /&gt;
    records = conn.execute(&lt;br /&gt;
        select(tbl).where(tbl.c.active, dim_key_in(tbl, keys))&lt;br /&gt;
    ).all()&lt;br /&gt;
&lt;br /&gt;
    # 2. Перерахунок інтервалів. Гарячий шлях: бюджет ≤ 3 c (АП-4),&lt;br /&gt;
    #    реалізація за Protocol-інтерфейсом (АП-3) — див. Е.5.&lt;br /&gt;
    #    Пріоритет: A витісняється B, якщо B ∈ ПВР[A].ВитісняючіВидиРозрахунку&lt;br /&gt;
    intervals = displacement_engine.compute(records, displaces=plan.displaces)&lt;br /&gt;
&lt;br /&gt;
    # 3. Заміщення фактичних періодів — два запити на весь набір, не на запис&lt;br /&gt;
    conn.execute(delete(ap).where(record_key_in(ap, intervals.keys())))&lt;br /&gt;
    conn.execute(insert(ap), [&lt;br /&gt;
        {&amp;quot;rec_t&amp;quot;: k.rec_t, &amp;quot;rec_r&amp;quot;: k.rec_r, &amp;quot;line_no&amp;quot;: k.line_no,&lt;br /&gt;
         &amp;quot;interval_no&amp;quot;: n, &amp;quot;calc_type_r&amp;quot;: k.calc_type, &amp;quot;d1_r&amp;quot;: k.base_dim,&lt;br /&gt;
         &amp;quot;fact_begin&amp;quot;: begin, &amp;quot;fact_end&amp;quot;: end}&lt;br /&gt;
        for k, ivs in intervals.items()&lt;br /&gt;
        for n, (begin, end) in enumerate(ivs)            # 1 запис -&amp;gt; 0..N інтервалів&lt;br /&gt;
    ])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Складність:&#039;&#039;&#039; O(|Z|² ) на ключ. Обмеження: якщо &amp;lt;code&amp;gt;|Z| &amp;gt; 500&amp;lt;/code&amp;gt; для одного ключа — попередження в журналі та перехід на алгоритм замітання (sweep line) O(|Z| log |Z|).&lt;br /&gt;
&lt;br /&gt;
== 10.5. Реєстрація перерахунків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def register_recalculations(reg: Register, changed: Sequence[CalcRecord]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Розділ 7.5.3, ФТ-26. АП-2: пошук залежних виконує СКБД, а не цикл у Python.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    q = schema.movements(reg).alias(&amp;quot;q&amp;quot;)&lt;br /&gt;
    b = schema.calc_plan_base(reg).alias(&amp;quot;b&amp;quot;)           # ТЧ «БазовіВидиРозрахунку» ПВР&lt;br /&gt;
&lt;br /&gt;
    for recalc in reg.recalculations:&lt;br /&gt;
        rc = schema.recalc_table(reg, recalc)           # rg_c_&amp;lt;id&amp;gt;_rc&amp;lt;n&amp;gt;&lt;br /&gt;
        src = values_of(changed).alias(&amp;quot;src&amp;quot;)           # змінені записи як VALUES-таблиця&lt;br /&gt;
&lt;br /&gt;
        # інтервальний предикат залежно від режиму базового періоду&lt;br /&gt;
        if reg.base_period == &amp;quot;ByActionPeriod&amp;quot;:&lt;br /&gt;
            in_base = and_(src.c.act_begin &amp;lt;= q.c.base_end,&lt;br /&gt;
                           src.c.act_end &amp;gt;= q.c.base_begin)     # перетин періодів&lt;br /&gt;
        else:                                                    # ByRegistrationPeriod&lt;br /&gt;
            in_base = src.c.period.between(q.c.base_begin, q.c.base_end)&lt;br /&gt;
&lt;br /&gt;
        dependent = (&lt;br /&gt;
            select(q.c.rec_t, q.c.rec_r, q.c.calc_type_r,&lt;br /&gt;
                   *[q.c[c] for c in recalc.dim_columns],&lt;br /&gt;
                   src.c.rec_t.label(&amp;quot;src_rec_t&amp;quot;), src.c.rec_r.label(&amp;quot;src_rec_r&amp;quot;))&lt;br /&gt;
            .select_from(&lt;br /&gt;
                src.join(b, b.c.base_type_r == src.c.calc_type_r)   # z — базовий для q&lt;br /&gt;
                   .join(q, q.c.calc_type_r == b.c.ref))&lt;br /&gt;
            .where(q.c.active, in_base,&lt;br /&gt;
                   *[q.c[c] == src.c[c] for c in recalc.dim_columns],&lt;br /&gt;
                   tuple_(q.c.rec_t, q.c.rec_r) != tuple_(src.c.rec_t, src.c.rec_r))&lt;br /&gt;
            .distinct()&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        stmt = pg_insert(rc).from_select(list(rc.columns.keys()), dependent)&lt;br /&gt;
        conn.execute(stmt.on_conflict_do_nothing())     # 1 запит на перерахунок (АП-1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.6. Зріз останніх ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрВідомостей.КурсиВалют.ЗрізОстанніх(&amp;amp;Дата, Валюта В (&amp;amp;Список))&lt;br /&gt;
SELECT DISTINCT ON (r.d1_r)&lt;br /&gt;
       r.d1_r AS &amp;quot;Валюта&amp;quot;, r.period AS &amp;quot;Період&amp;quot;, r.r1 AS &amp;quot;Курс&amp;quot;, r.r2 AS &amp;quot;Кратність&amp;quot;&lt;br /&gt;
FROM   rg_i_0007 r&lt;br /&gt;
WHERE  r.period &amp;lt;= :Дата&lt;br /&gt;
  AND  r.d1_r = ANY (:Список)&lt;br /&gt;
ORDER  BY r.d1_r, r.period DESC;       -- використовує ix_rg_i_0007_d1 (d1_r, period DESC)&lt;br /&gt;
-- Для MS SQL: ROW_NUMBER() OVER (PARTITION BY d1_r ORDER BY period DESC) = 1&lt;br /&gt;
--             або OUTER APPLY (SELECT TOP 1 ...) для великих списків.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 11. Нефункціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 11.1. Продуктивність ==&lt;br /&gt;
Еталонний стенд: 16 vCPU, 128 ГБ RAM, NVMe, PostgreSQL 15, БД 1,5 ТБ.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Операція !! Обсяг !! Ціль (P95)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01 || Залишки на поточну дату, відбір за 1 вимірюванням || 1 млрд рухів, 20 млн рядків підсумків || ≤ 200 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-02 || Залишки на довільну дату в межах ТА || те саме || ≤ 400 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-03 || Обороти за 12 місяців із групуванням || 1 млрд рухів || ≤ 2 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-04 || Проведення документа зі 100 рядками рухів (3 регістри) || — || ≤ 300 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-05 || Оборотно-сальдова відомість по всіх рахунках за місяць || 200 млн проводок || ≤ 5 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-06 || Розрахунок ЗП: 10 000 співробітників × 8 видів розрахунку || — || ≤ 10 хв&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-07 || Зріз останніх по 5 000 елементів вимірювання || 50 млн записів РВ || ≤ 500 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-08 || Пропускна здатність проведення || — || ≥ 50 док/с (10 паралельних сеансів)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-09 || Перерахунок підсумків РН || 1 млрд рухів || ≤ 4 год (у вікні обслуговування)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Вплив мови ядра.&#039;&#039;&#039; Цілі НФВ-01…НФВ-09 сформульовані для архітектури, де обчислює СКБД, а Python-ядро лише формує SQL (принципи АП-1, АП-2). Аналіз частки Python у кожній цілі — розділ 4.4.2: максимум 5 % (НФВ-04), запас на НФВ-06 — ×40. &#039;&#039;&#039;Цілі не переглядаються у зв&#039;язку з вибором Python.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
== 11.2. Масштабованість і обсяги ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Макс. записів в одному регістрі || 10&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Макс. кількість регістрів у конфігурації || 2 000&lt;br /&gt;
|-&lt;br /&gt;
| Макс. одночасних сеансів проведення || 200&lt;br /&gt;
|-&lt;br /&gt;
| Секціонування || Обов&#039;язкове для таблиць &amp;gt; 100 млн записів&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 11.3. Надійність і цілісність ==&lt;br /&gt;
* НФВ-10. Рухи та реєстратор змінюються в одній транзакції БД; часткове проведення неможливе.&lt;br /&gt;
* НФВ-11. Аварійне завершення сервера не залишає підсумки неузгодженими (гарантується транзакцією).&lt;br /&gt;
* НФВ-12. Сервіс перевірки цілісності (ФТ-41) виконується регламентно; розбіжність підсумків = інцидент P1.&lt;br /&gt;
&lt;br /&gt;
== 11.4. Супроводжуваність ==&lt;br /&gt;
* НФВ-13. Реструктуризація регістру (додавання ресурсу/реквізиту) для таблиці ≤ 100 млн записів — ≤ 30 хв.&lt;br /&gt;
* НФВ-14. Додавання вимірювання вимагає перебудови підсумків; система повинна попереджати про оцінку часу до початку операції.&lt;br /&gt;
* НФВ-15. Усі DDL-операції — ідемпотентні та скриптовані (можливість застосувати вручну).&lt;br /&gt;
&lt;br /&gt;
== 11.5. Сумісність ==&lt;br /&gt;
* НФВ-16. PostgreSQL 14+ та MS SQL Server 2019+ — обидві платформи з однаковою функціональністю.&lt;br /&gt;
* НФВ-17. Генератор DDL ізольований у шар «діалект СКБД».&lt;br /&gt;
&lt;br /&gt;
= 12. Міграція існуючих структур K2 ERP =&lt;br /&gt;
&lt;br /&gt;
== 12.1. Етапи ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Етап !! Результат&lt;br /&gt;
|-&lt;br /&gt;
| М1 || Інвентаризація || Реєстр наявних «регістроподібних» таблиць K2 з класифікацією за типом-мішенню (РВ/РН/РБ/РР).&lt;br /&gt;
|-&lt;br /&gt;
| М2 || Мапінг || Для кожної таблиці — метаопис цільового регістру + правила перетворення колонок.&lt;br /&gt;
|-&lt;br /&gt;
| М3 || Створення регістрів || Генерація метаданих і DDL у тестовому контурі.&lt;br /&gt;
|-&lt;br /&gt;
| М4 || Перенесення даних || ETL: історичні дані → рухи, з призначенням реєстратора (реальний документ або службовий «ВведенняЗалишків»).&lt;br /&gt;
|-&lt;br /&gt;
| М5 || Побудова підсумків || Повний перерахунок.&lt;br /&gt;
|-&lt;br /&gt;
| М6 || Звірка || Порівняння залишків/оборотів «стара система vs нова» на контрольних датах; допуск розбіжності = 0.&lt;br /&gt;
|-&lt;br /&gt;
| М7 || Перемикання коду || Заміна прямих SQL-звернень на віртуальні таблиці; період паралельної роботи ≥ 1 звітний період.&lt;br /&gt;
|-&lt;br /&gt;
| М8 || Виведення з експлуатації || Видалення старих таблиць після 2 закритих періодів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 12.2. Проблемні випадки ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Випадок !! Рішення&lt;br /&gt;
|-&lt;br /&gt;
| Історичні записи без документа-джерела || Службовий документ &amp;lt;code&amp;gt;ВведенняЗалишків&amp;lt;/code&amp;gt; (один на період/розділ).&lt;br /&gt;
|-&lt;br /&gt;
| Записи з дублями за ключем (для незалежного РВ) || Дедуплікація з протоколом; конфлікти — на ручний розбір.&lt;br /&gt;
|-&lt;br /&gt;
| Дробові періоди / некоректні дати (NULL, 1900-01-01) || Нормалізація до MINPERIOD; протокол.&lt;br /&gt;
|-&lt;br /&gt;
| Прикладний код, що пише в таблиці напряму || Заборона на рівні прав БД після М7; аудит звернень на етапі М3–М6.&lt;br /&gt;
|-&lt;br /&gt;
| Аналітика, відсутня в цільовій моделі || Перенесення в реквізити (не у вимірювання) або відмова від міграції з обґрунтуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 13. Приймальні випробування =&lt;br /&gt;
&lt;br /&gt;
== 13.1. Функціональні тести (витяг) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Сценарій !! Очікуваний результат&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-01 || Створити РВ періодичний незалежний, записати 2 записи з однаковим ключем || Другий запис заміщує перший; у таблиці 1 рядок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-02 || Провести документ → 5 рухів РН || 5 записів у &amp;lt;code&amp;gt;rg_a_*&amp;lt;/code&amp;gt;; підсумки MAXPERIOD змінилися на суму дельти&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-03 || Скасувати проведення || 0 записів; підсумки повернулися до вихідних значень&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-04 || Видалити документ-реєстратор || Рухи видалені каскадно; перевірка цілісності — 0 помилок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-05 || Записати рух заднім числом (−6 міс.) || Залишки на всі дати після руху коректні (звірка з повним перерахунком)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-06 || Установити &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; || Запис не впливає на віртуальні таблиці; підсумки скориговані&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-07 || РБ: провести незбалансовану проводку (Дт ≠ Кт за балансовим ресурсом) || Помилка проведення, транзакція відкочена&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-08 || РБ: ОСВ по рахунку з 3 субконто || Підсумки за рівнями 0–3 узгоджені між собою (згортка tb3 → tb0)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-09 || РР: сценарій «Оклад + Відпустка + Лікарняний» (розд. 7.5.1) || Фактичні періоди дії відповідають еталону; «Оклад» дає 2 інтервали&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-10 || РР: зміна базового запису || У таблиці перерахунку з&#039;явився запис для залежного документа&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-11 || Паралельне проведення 2 документів за різними складами || Обидва проходять без очікування (розділення підсумків увімкнено)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-12 || Паралельне проведення 2 документів за одним складом і одним товаром з контролем залишків || Один чекає, другий проходить; від&#039;ємного залишку немає&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-13 || Перерахунок підсумків після хаотичних 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; операцій || Підсумки збігаються з повним перерахунком «з нуля» до копійки&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-14 || Реструктуризація: додати ресурс до РН із 10 млн записів || Дані збережені, підсумки перебудовані, час ≤ НФВ-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-15 || RLS: користувач з обмеженням по організації || Віртуальні таблиці повертають лише дозволені дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 13.2. Навантажувальні тести ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Тест !! Критерій&lt;br /&gt;
|-&lt;br /&gt;
| НТ-01 || Генерація 1 млрд рухів РН, заміри НФВ-01…НФВ-03 || Досягнення цілей&lt;br /&gt;
|-&lt;br /&gt;
| НТ-02 || Профіль «90 % рухів поточним періодом, 10 % заднім числом» — порівняння двох стратегій підсумків (розд. 10.2) || Обґрунтований вибір Рішення №3&lt;br /&gt;
|-&lt;br /&gt;
| НТ-03 || Пікове проведення 50 док/с протягом 1 год || Відсутність дедлоків; P95 ≤ НФВ-04&lt;br /&gt;
|-&lt;br /&gt;
| НТ-04 || РБ: субконто-слоти vs дочірня таблиця, 200 млн проводок || Обґрунтований вибір Рішення №2&lt;br /&gt;
|-&lt;br /&gt;
| НТ-05 || Розрахунок ЗП на 10 000 співробітників || НФВ-06&lt;br /&gt;
|-&lt;br /&gt;
| НТ-06 || Деградація за 24 год безперервної роботи || Приріст часу відгуку ≤ 15 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 14. Етапи робіт та оцінка =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Етап !! Зміст !! Результат !! Оцінка, чол.-міс. !! Залежності&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е0&#039;&#039;&#039; || Обстеження платформи, верифікація припущень П1–П6, ескізний проєкт || Затверджений архітектурний ескіз, уточнене ТЗ || 1,5 || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е1&#039;&#039;&#039; || Метамодель + репозиторій + генератор DDL + конструктор (базовий) || Створення регістру будь-якого типу з генерацією схеми || 3 || Е0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е2&#039;&#039;&#039; || Регістр відомостей: рантайм, набори записів, зрізи, форми || РВ у продуктиві || 2,5 || Е1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е3&#039;&#039;&#039; || Регістр накопичення: рухи, підсумки, ТА, віртуальні таблиці || РН у продуктиві || 5 || Е2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е4&#039;&#039;&#039; || Механізм проведення документів, блокування, оперативне/неоперативне проведення || Транзакційне проведення || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е5&#039;&#039;&#039; || Розширення мови запитів (віртуальні таблиці, транслятор, push-down) || Запити до ВТ || 3,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е6&#039;&#039;&#039; || Регістр бухгалтерії + план рахунків + субконто + підсумки за рівнями || РБ у продуктиві || 6 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е7&#039;&#039;&#039; || Регістр розрахунку + ПВР + витіснення + база + графіки + перерахунки || РР у продуктиві || 6,5 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е8&#039;&#039;&#039; || Агрегати, розділення підсумків, порадник агрегатів || Оптимізація || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е9&#039;&#039;&#039; || Права доступу, RLS, аудит, сервіси цілісності || Безпека та адміністрування || 2 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е10&#039;&#039;&#039; || Реструктуризація, міграція, інструменти звірки || Інструменти міграції || 2 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е11&#039;&#039;&#039; || Навантажувальне тестування, оптимізація, документація, &#039;&#039;&#039;профілювання Python + бенчмарки гарячих шляхів&#039;&#039;&#039; || Приймальні випробування || 4,5 || усі&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РАЗОМ&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|Оцінка орієнтовна (±40 %) і підлягає уточненню за результатами Е0. Критичний шлях: Е0 → Е1 → Е3 → Е5 → Е6/Е7 → Е11. За командою 6–8 інженерів — орієнтовно 9–11 календарних місяців.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Мінімальний життєздатний обсяг (MVP)&#039;&#039;&#039;: Е0–Е5 (РВ + РН + проведення + запити) ≈ &#039;&#039;&#039;18 чол.-міс.&#039;&#039;&#039; — покриває ~70 % прикладних сценаріїв K2 ERP.&lt;br /&gt;
&lt;br /&gt;
=== 14.1. Вплив вибору Python на оцінку ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Етап !! Було (мова не визначена) !! Стало (Python) !! Δ !! Причина&lt;br /&gt;
|-&lt;br /&gt;
| Е1 (метамодель, DDL, конструктор) || 4 || &#039;&#039;&#039;3&#039;&#039;&#039; || &#039;&#039;&#039;−1&#039;&#039;&#039; || SQLAlchemy Core закриває генерацію DDL і діалекти СКБД; Pydantic v2 — валідацію DSL. Разом ~30 % етапу — готове.&lt;br /&gt;
|-&lt;br /&gt;
| Е5 (мова запитів, транслятор) || 4 || &#039;&#039;&#039;3,5&#039;&#039;&#039; || &#039;&#039;&#039;−0,5&#039;&#039;&#039; || lark (граматика) + SQLAlchemy Core expression language замість власного AST→SQL.&lt;br /&gt;
|-&lt;br /&gt;
| Е7 (регістр розрахунку) || 6 || &#039;&#039;&#039;6,5&#039;&#039;&#039; || &#039;&#039;&#039;+0,5&#039;&#039;&#039; || Ізоляція витіснення за інтерфейсом (АП-3) + резерв на нативну реалізацію.&lt;br /&gt;
|-&lt;br /&gt;
| Е10 (реструктуризація, міграція) || 2,5 || &#039;&#039;&#039;2&#039;&#039;&#039; || &#039;&#039;&#039;−0,5&#039;&#039;&#039; || Alembic покриває автогенерацію &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Е11 (навантаження, оптимізація) || 3 || &#039;&#039;&#039;4,5&#039;&#039;&#039; || &#039;&#039;&#039;+1,5&#039;&#039;&#039; || Профілювання Python, бенчмарки бюджету АП-4, ймовірні Cython/Rust-модулі, wheels у CI.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РАЗОМ&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; || &#039;&#039;&#039;0&#039;&#039;&#039; || Економія на інфраструктурному коді компенсує витрати на оптимізацію.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Висновок:&#039;&#039;&#039; Python — &#039;&#039;&#039;нейтральний за трудомісткістю&#039;&#039;&#039; для цього проєкту. Він здешевлює те, чого тут багато (метадані, генерація схеми, абстракція діалектів, міграції), і дорожчає те, чого тут мало (гарячі CPU-цикли). Ризик зміщується з «&#039;&#039;не встигнемо написати&#039;&#039;» на «&#039;&#039;не вкладемося в бюджет часу виконання&#039;&#039;» — тому бенчмарки гарячих шляхів (АП-4) вводяться в CI &#039;&#039;&#039;з етапу Е3&#039;&#039;&#039;, а не наприкінці.&lt;br /&gt;
&lt;br /&gt;
= 15. Ризики =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Ризик !! Ймов. !! Вплив !! Пом&#039;якшення&lt;br /&gt;
|-&lt;br /&gt;
| Р1 || У K2 ERP немає власної мови запитів → віртуальні таблиці нікуди вбудовувати || Сер. || &#039;&#039;&#039;Крит.&#039;&#039;&#039; || Верифікувати на Е0. План «Б»: віртуальні таблиці як параметризовані view/TVF + шар ORM.&lt;br /&gt;
|-&lt;br /&gt;
| Р2 || Конкуренція за таблицю підсумків на піках проведення || Вис. || Вис. || Розділення підсумків (сплітери), НТ-03, детермінований порядок MERGE.&lt;br /&gt;
|-&lt;br /&gt;
| Р3 || Рухи «заднім числом» роблять оновлення підсумків O(N періодів) || Вис. || Сер. || Рішення №3 (dirty months + регламентний перерахунок), НТ-02.&lt;br /&gt;
|-&lt;br /&gt;
| Р4 || «Широка» схема субконто → реструктуризація при зміні ліміту || Сер. || Сер. || Зафіксувати ліміт 5 із запасом; НТ-04; план «Б» — дочірня таблиця.&lt;br /&gt;
|-&lt;br /&gt;
| Р5 || Механізм витіснення РР — найскладніший і найпомилковіший вузол || Вис. || Вис. || Виділити в окремий модуль з еталонним набором з 50+ тест-кейсів; property-based тестування.&lt;br /&gt;
|-&lt;br /&gt;
| Р6 || Обсяг Е6+Е7 недооцінено (досвід 1С: це роки розробки) || Вис. || Вис. || MVP-підхід: спершу Е0–Е5, рішення про Е6/Е7 — після ретроспективи.&lt;br /&gt;
|-&lt;br /&gt;
| Р7 || Різна поведінка PostgreSQL і MS SQL (плани, MERGE, ізоляція) || Сер. || Сер. || Єдиний набір тестів на обох СКБД у CI від Е1.&lt;br /&gt;
|-&lt;br /&gt;
| Р8 || Міграція історичних даних без реєстраторів || Вис. || Сер. || Службовий документ «ВведенняЗалишків»; етап звірки М6 з нульовим допуском.&lt;br /&gt;
|-&lt;br /&gt;
| Р9 || Патентні / ліцензійні претензії щодо копіювання механізмів || Низ. || Вис. || Юридична експертиза до Е1: реалізація &#039;&#039;концепцій&#039;&#039; обліку (загальновідомих), а не коду/API; уникати дослівного копіювання найменувань API та документації.&lt;br /&gt;
|-&lt;br /&gt;
| Р10 || &#039;&#039;&#039;Гарячі шляхи&#039;&#039;&#039; (витіснення, розрахунок ЗП) на чистому Python не вкладаються в бюджет АП-4 || Сер. || Сер. || Ізоляція за &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt;-інтерфейсом (АП-3) + бенчмарк у CI від Е7; готовність до Cython/Rust; альтернатива для витіснення — &amp;lt;code&amp;gt;daterange&amp;lt;/code&amp;gt;+GiST у PostgreSQL.&lt;br /&gt;
|-&lt;br /&gt;
| Р11 || &#039;&#039;&#039;Динамічна типізація в ядрі метаданих&#039;&#039;&#039; → помилки типів спливають у рантаймі на продуктиві || Вис. || Сер. || &amp;lt;code&amp;gt;mypy --strict&amp;lt;/code&amp;gt; як обов&#039;язковий gate у CI; Pydantic v2 на всіх межах; генерація &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів для прикладного коду (ФТ-К-07).&lt;br /&gt;
|-&lt;br /&gt;
| Р12 || &#039;&#039;&#039;GIL&#039;&#039;&#039; обмежує вертикальне масштабування сервера застосунків || Сер. || Низ. || АП-5: asyncio для IO + мультипроцесний пул. Розрахунок у 4.4.2 показує запас: 50 док/с ≈ 50 % одного ядра.&lt;br /&gt;
|-&lt;br /&gt;
| Р13 || &#039;&#039;&#039;Нативні розширення&#039;&#039;&#039; (Cython/Rust) ускладнюють збірку, кросплатформність і пошук інженерів || Низ. || Низ. || Вводяться тільки за результатами бенчмарку; wheels під усі цільові платформи в CI; питання В13.&lt;br /&gt;
|-&lt;br /&gt;
| Р14 || &#039;&#039;&#039;Виконання прикладного Python-коду&#039;&#039;&#039; в процесі сервера = виконання довільного коду з правами сервера (П8) || Вис. || &#039;&#039;&#039;Крит.&#039;&#039;&#039; || &#039;&#039;&#039;Питання В12 до Е0.&#039;&#039;&#039; Варіанти: (а) довірена модель — конфігурацію пише лише вендор/партнер; (б) ізоляція процесами + seccomp/AppArmor; (в) обмежений DSL замість повного Python. У 1С вбудована мова існує в т.ч. з цієї причини.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Ризик Р9 — обов&#039;язково до опрацювання перед стартом.&#039;&#039;&#039; ТЗ описує &#039;&#039;функціональні концепції&#039;&#039; (накопичувальний облік, подвійний запис, витіснення періодів дії), що є загальновідомими практиками обліку. Проте пряме відтворення пропрієтарних інтерфейсів, найменувань і структур конкретного вендора потребує окремої правової оцінки. Рекомендується узгодити з юридичною службою власну термінологію та API до початку Е1.}}&lt;br /&gt;
&lt;br /&gt;
= 16. Додатки =&lt;br /&gt;
&lt;br /&gt;
== Додаток А. Матриця відповідності «1С ↔ K2 ERP» ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Об&#039;єкт / поняття 1С !! Пропонований аналог K2 ERP !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| РегистрСведений || &amp;lt;code&amp;gt;Регістри.Відомостей.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрНакопления || &amp;lt;code&amp;gt;Регістри.Накопичення.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрБухгалтерии || &amp;lt;code&amp;gt;Регістри.Бухгалтерії.*&amp;lt;/code&amp;gt; || Субконто зберігаються інакше (слоти)&lt;br /&gt;
|-&lt;br /&gt;
| РегистрРасчета || &amp;lt;code&amp;gt;Регістри.Розрахунку.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| Регистратор || &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ВидДвижения || &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Итоги || &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Точка актуальности итогов || &amp;lt;code&amp;gt;ТА підсумків&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Разделение итогов || &amp;lt;code&amp;gt;Розділення підсумків&amp;lt;/code&amp;gt; (splitter) || —&lt;br /&gt;
|-&lt;br /&gt;
| Агрегаты || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Субконто / ПланВидовХарактеристик || &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПланВидівХарактеристик&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПланВидовРасчета || &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерасчет || &amp;lt;code&amp;gt;Перерахунок&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПериодДействия / Вытеснение || &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Витіснення&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Границя послідовності || &#039;&#039;&#039;Не реалізується&#039;&#039;&#039; || Механізм визнано застарілим; замість нього — перепроведення за списком «брудних» документів&lt;br /&gt;
|-&lt;br /&gt;
| РегистрыСведений з режимом «ПоПозицииРегистратора» || &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt; || Реалізується як (period, rec_t, rec_r, line_no) у ключі&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Б. Альтернатива зберігання субконто (план «Б» до Рішення №2) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Дочірня таблиця «ключ-значення» замість слотів&lt;br /&gt;
CREATE TABLE rg_b_0020_ed (&lt;br /&gt;
    rec_t     smallint NOT NULL,&lt;br /&gt;
    rec_r     uuid     NOT NULL,&lt;br /&gt;
    line_no   int      NOT NULL,&lt;br /&gt;
    side      smallint NOT NULL CHECK (side IN (0,1)),   -- 0=Дт, 1=Кт&lt;br /&gt;
    ed_no     smallint NOT NULL,                          -- порядковий номер субконто рахунка&lt;br /&gt;
    ed_type_r uuid     NOT NULL,                          -- вид субконто&lt;br /&gt;
    val_t     smallint NOT NULL,&lt;br /&gt;
    val_r     uuid,&lt;br /&gt;
    val_n     numeric(38,10),&lt;br /&gt;
    val_s     varchar(150),&lt;br /&gt;
    val_d     timestamp(0),&lt;br /&gt;
    PRIMARY KEY (rec_t, rec_r, line_no, side, ed_no),&lt;br /&gt;
    FOREIGN KEY (rec_t, rec_r, line_no) REFERENCES rg_b_0020 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_val ON rg_b_0020_ed (ed_type_r, val_t, val_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Критерій !! Слоти (Рішення №2) !! Дочірня таблиця (план «Б»)&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 1 субконто || Index seek по колонці || JOIN + семі-з&#039;єднання&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 3 субконто || 3 предикати в одному скані || 3 JOIN&lt;br /&gt;
|-&lt;br /&gt;
| Зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || ALTER TABLE (реструктуризація) || Без змін схеми&lt;br /&gt;
|-&lt;br /&gt;
| Розмір рядка проводки || +48 байт × 2 (Дт/Кт) || Базовий&lt;br /&gt;
|-&lt;br /&gt;
| Складність генератора DDL || Вища || Нижча&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рекомендація&#039;&#039;&#039; || &#039;&#039;&#039;Обрано за замовчуванням&#039;&#039;&#039; || Резерв за результатами НТ-04&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток В. Перелік вимог (реєстр трасування) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! ID !! Розділ !! Коротко !! Пріоритет !! Тест&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-01…ФТ-07 || 7.1 || Набори записів, проведення || Must || ФТ-Т-02…04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-08…ФТ-10 || 7.2 || Активність || Must || ФТ-Т-06&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-11…ФТ-13 || 7.3 || Віртуальні таблиці || Must || ФТ-Т-08, НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-14…ФТ-18 || 7.4 || Підсумки, ТА || Must || ФТ-Т-05, ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-19…ФТ-21 || 7.4.4 || Агрегати || Should || НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-22…ФТ-30 || 7.5 || Механіка РР || Must (для Е7) || ФТ-Т-09, ФТ-Т-10&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31…ФТ-36 || 7.7 || Блокування || Must || ФТ-Т-11, ФТ-Т-12, НТ-03&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-37…ФТ-39 || 7.8 || Права, RLS || Must || ФТ-Т-15&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-40…ФТ-42 || 7.9 || Аудит, цілісність || Should || ФТ-Т-04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-К-01…06 || 6.8.4 || Конструктор || Should || —&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01…НФВ-09 || 11.1 || Продуктивність || Must || НТ-01…НТ-06&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-10…НФВ-12 || 11.3 || Цілісність || Must || ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-13…НФВ-17 || 11.4–11.5 || Супровід, сумісність || Should || ФТ-Т-14&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Г. Відкриті питання ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Питання !! Кому !! Термін&lt;br /&gt;
|-&lt;br /&gt;
| В1 || Чи існує в K2 ERP мова запитів / транслятор у SQL? (визначає Р1 та обсяг Е5) || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В2 || Формат ідентифікації об&#039;єктів: UUID чи сурогатний int? || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В3 || Чи потрібна мілісекундна дискретність періоду? || Замовник || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В4 || Максимальна кількість субконто: 3 чи 5? || Головний бухгалтер / методолог || До Е6&lt;br /&gt;
|-&lt;br /&gt;
| В5 || Чи потрібен механізм «Границя послідовності»? (пропонується відмова) || Методолог || До Е3&lt;br /&gt;
|-&lt;br /&gt;
| В6 || Пріоритет типів регістрів: чи достатньо MVP (РВ + РН) для першого релізу? || Замовник || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В7 || Правова оцінка ризику Р9 || Юридична служба || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В8 || Цільова СКБД для першої черги: тільки PostgreSQL чи одразу обидві? || Архітектор / ІТ-експлуатація || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В9 || &#039;&#039;&#039;Міжпланова база розрахунку:&#039;&#039;&#039; чи потрібна можливість брати базу з &#039;&#039;іншого&#039;&#039; регістру розрахунку (Утримання ← ОсновніНарахування)? Якщо так — ФТ-25 і &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt; потребують розширення полем &amp;lt;code&amp;gt;base_register_id&amp;lt;/code&amp;gt; (див. Д.7.2) || Методолог ЗП / архітектор || До Е7&lt;br /&gt;
|-&lt;br /&gt;
| В10 || Чи прийнятна поведінка підпорядкованого РВ без контролю унікальності за (Період + Вимірювання)? (сумісність із 1С vs. захист від дублів — див. Д.3.2, антипатерн А-6) || Методолог || До Е2&lt;br /&gt;
|-&lt;br /&gt;
| В11 || &#039;&#039;&#039;Конфігуратор:&#039;&#039;&#039; web (FastAPI + React) чи desktop (PySide6/Qt)? Макети розділу 6.8 намальовані як desktop || Замовник / UX || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В12 || &#039;&#039;&#039;Ключове.&#039;&#039;&#039; Прикладний код — повноцінний Python чи обмежений DSL? Повний Python у процесі сервера = виконання довільного коду з правами сервера (ризик Р14) + неможливість статично перевірити конфігурацію партнера || Архітектор + служба безпеки || &#039;&#039;&#039;До Е0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| В13 || Чи допустимі нативні розширення (Cython/Rust) у складі постачання? Якщо ні — потрібен план «Б» для витіснення (SQL на &amp;lt;code&amp;gt;daterange&amp;lt;/code&amp;gt;) || ІТ-експлуатація || До Е7&lt;br /&gt;
|-&lt;br /&gt;
| В14 || Цільова версія: 3.12 чи 3.13? Чи розглядається free-threaded build (PEP 703) як шлях зняття Р12? || Архітектор || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В15 || Мова ідентифікаторів прикладного API: кирилиця (&amp;lt;code&amp;gt;rs.new(Номенклатура=…)&amp;lt;/code&amp;gt;) чи транслітерація/англійська? Впливає на ФТ-К-07 і читабельність || Замовник / методолог || До Е2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Д. Каталог прикладів регістрів ==&lt;br /&gt;
&lt;br /&gt;
Додаток містить прикладні приклади регістрів усіх типів і підвидів. Для кожного наведено: декларацію (DSL), пояснення проєктних рішень, приклад даних у фізичних таблицях і типовий запит. Приклади призначені для: (а) перевірки повноти метамоделі на етапі Е0; (б) формування набору приймальних тестів; (в) навчання прикладних розробників.&lt;br /&gt;
&lt;br /&gt;
=== Д.1. Як обрати тип регістру (дерево рішень) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Choose {&lt;br /&gt;
  rankdir=TB; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  q1 [label=&amp;quot;Що зберігаємо?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q2 [label=&amp;quot;Потрібні залишки\n(скільки Є зараз)?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q3 [label=&amp;quot;Подвійний запис,\nплан рахунків,\nсубконто?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q4 [label=&amp;quot;Періоди дії,\nвитіснення,\nбаза розрахунку?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q5 [label=&amp;quot;Значення прив&#039;язане\nдо документа?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  ri_i [label=&amp;quot;РВ незалежний\n(КурсиВалют,\nШтрихкоди)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  ri_s [label=&amp;quot;РВ підпорядкований\n(ЦіниНоменклатури,\nКадровіДані)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  ra_b [label=&amp;quot;РН «Залишки»\n(ТовариНаСкладах,\nВзаєморозрахунки)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  ra_t [label=&amp;quot;РН «Обороти»\n(Продажі,\nВитрати)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  rb   [label=&amp;quot;РБ\n(Госпрозрахунковий)&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  rc   [label=&amp;quot;РР\n(Нарахування,\nУтримання)&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q3 [label=&amp;quot;облікові проводки&amp;quot;];&lt;br /&gt;
  q3 -&amp;gt; rb [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q3 -&amp;gt; q4 [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
  q4 -&amp;gt; rc [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q4 -&amp;gt; q2 [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q2 [label=&amp;quot;кількісні/сумові\nрухи&amp;quot;];&lt;br /&gt;
  q2 -&amp;gt; ra_b [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q2 -&amp;gt; ra_t [label=&amp;quot;ні,\nлише обороти\nза період&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q5 [label=&amp;quot;значення\nатрибута\nв часі&amp;quot;];&lt;br /&gt;
  q5 -&amp;gt; ri_s [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q5 -&amp;gt; ri_i [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Контрольні питання при проєктуванні будь-якого регістру:&#039;&#039;&#039;&lt;br /&gt;
# Чи можна відповісти на всі прикладні питання &#039;&#039;лише&#039;&#039; полями цього регістру, без з&#039;єднання з документами? Якщо ні — бракує реквізиту (не вимірювання!).&lt;br /&gt;
# Яка &#039;&#039;кардинальність&#039;&#039; таблиці підсумків = ∏(кількість значень вимірювань) × кількість періодів? Якщо &amp;gt; 10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; — переглянути склад вимірювань.&lt;br /&gt;
# Чи потрібно фільтрувати/групувати за цим полем у звітах? Так → вимірювання. Ні, лише показувати → реквізит.&lt;br /&gt;
# Чи підсумовується поле? Так → ресурс. Ні → реквізит або вимірювання.&lt;br /&gt;
&lt;br /&gt;
=== Д.2. Зведений каталог ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! № !! Регістр !! Тип !! Підвид / режим !! Вимірювання !! Ресурси !! Розділ&lt;br /&gt;
|-&lt;br /&gt;
| 1 || КурсиВалют || РВ || Періодичний (день), незалежний || Валюта || Курс, Кратність || Д.3.1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ЦіниНоменклатури || РВ || Періодичний (день), підпорядкований || Номенклатура, Характеристика, ТипЦін || Ціна || Д.3.2&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ШтрихкодиНоменклатури || РВ || Неперіодичний, незалежний || Штрихкод || Номенклатура, Характеристика, Упаковка || Д.3.3&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ГрафікРоботи || РВ || Неперіодичний, незалежний || ВидГрафіка, ДатаГрафіка || Значення, Годин || Д.3.4&lt;br /&gt;
|-&lt;br /&gt;
| 5 || КадровіДані || РВ || По позиції реєстратора, підпорядкований || Співробітник || Підрозділ, Посада, Ставка, ВидЗайнятості || Д.3.5&lt;br /&gt;
|-&lt;br /&gt;
| 6 || НалаштуванняКористувачів || РВ || Неперіодичний, незалежний || Користувач, Налаштування || Значення (складений) || Д.3.6&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ТовариНаСкладах || РН || Залишки || Номенклатура, Склад, Партія, Характеристика || Кількість, Сума || Д.4.1&lt;br /&gt;
|-&lt;br /&gt;
| 8 || ВзаєморозрахункиЗКонтрагентами || РН || Залишки || Організація, Контрагент, Договір, Замовлення || Сума, СумаВал || Д.4.2&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ТовариВРезерві || РН || Залишки || Номенклатура, Склад, Замовлення, Характеристика || Кількість || Д.4.3&lt;br /&gt;
|-&lt;br /&gt;
| 10 || ГрошовіКоштиБезготівкові || РН || Залишки || Організація, БанківськийРахунок || Сума, СумаВал || Д.4.4&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Продажі || РН || Обороти (місяць) + агрегати || Номенклатура, Контрагент, Договір, Менеджер, Склад || Кількість, Сума, СумаБезПДВ, Собівартість || Д.5.1&lt;br /&gt;
|-&lt;br /&gt;
| 12 || ВитратиЗаСтаттями || РН || Обороти (місяць) || Організація, Підрозділ, СтаттяВитрат, Проєкт || Сума || Д.5.2&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Госпрозрахунковий || РБ || З кореспонденцією || Організація (бал.), Підрозділ (небал.) || Сума (бал.), Кількість, ВалютнаСума || Д.6.1&lt;br /&gt;
|-&lt;br /&gt;
| 14 || ПодатковийОблік || РБ || Без кореспонденції || Організація, ВидРізниці || Сума || Д.6.2&lt;br /&gt;
|-&lt;br /&gt;
| 15 || Бюджетування || РБ || З кореспонденцією || Сценарій, ЦФВ, Проєкт || Сума || Д.6.3&lt;br /&gt;
|-&lt;br /&gt;
| 16 || ОсновніНарахування || РР || Період дії + база за періодом дії || Співробітник (баз.), Підрозділ || Результат, ВідпрацьованоДнів, НормаДнів || Д.7.1&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Утримання || РР || Без періоду дії, база за періодом реєстрації || Співробітник (баз.), Підрозділ || Результат, БазаОподаткування || Д.7.2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.3. Регістри відомостей ===&lt;br /&gt;
&lt;br /&gt;
==== Д.3.1. КурсиВалют — періодичний, незалежний ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати історію курсів валют; отримувати курс на будь-яку дату.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: КурсиВалют&lt;br /&gt;
  kind: Information&lt;br /&gt;
  synonym: &amp;quot;Курси валют&amp;quot;&lt;br /&gt;
  periodicity: WithinDay            # один курс на валюту на день&lt;br /&gt;
  writeMode: Independent            # курси вводяться вручну/завантажуються з НБУ&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Курс,      type: &amp;quot;Число(15,4)&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Кратність, type: &amp;quot;Число(10,0)&amp;quot;, default: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;Independent&amp;lt;/code&amp;gt; — курс не породжується документом, він є зовнішнім фактом.&lt;br /&gt;
* &amp;lt;code&amp;gt;master: true&amp;lt;/code&amp;gt; для Валюти — при видаленні валюти курси видаляються; регістр видно у формі елемента довідника.&lt;br /&gt;
* Періодичність &amp;lt;code&amp;gt;WithinDay&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;WithinSecond&amp;lt;/code&amp;gt; — повторний запис курсу за той самий день &#039;&#039;замістить&#039;&#039; попередній, а не створить дубль.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0007&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! d1_r (Валюта) !! r1 (Курс) !! r2 (Кратність)&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-15 00:00:00 || USD || 41.8200 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-15 00:00:00 || EUR || 45.6100 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-16 00:00:00 || USD || 41.8500 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-17 00:00:00 || USD || 41.9000 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-17 00:00:00 || EUR || 45.7300 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (курс на дату документа):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ Курси.Курс, Курси.Кратність&lt;br /&gt;
З РегістрВідомостей.КурсиВалют.ЗрізОстанніх(&amp;amp;ДатаДокумента, Валюта = &amp;amp;Валюта) ЯК Курси&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# або через менеджер&lt;br /&gt;
курс = Registers.information(&amp;quot;КурсиВалют&amp;quot;).get_last(doc.Дата, {&amp;quot;Валюта&amp;quot;: doc.Валюта})&lt;br /&gt;
сума_грн: Decimal = doc.СумаВалюти * курс.Курс / курс.Кратність&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.3.2. ЦіниНоменклатури — періодичний, підпорядкований реєстратору ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати історію цін; ціна встановлюється наказом (документом), який можна скасувати.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ЦіниНоменклатури&lt;br /&gt;
  kind: Information&lt;br /&gt;
  synonym: &amp;quot;Ціни номенклатури&amp;quot;&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  writeMode: SubordinateToRecorder   # ← ключова відмінність від КурсиВалют&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: ТипЦін,         type: &amp;quot;Довідник.ТипиЦін&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Ціна, type: &amp;quot;Число(15,2)&amp;quot;, denyEmpty: true }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Валюта,   type: &amp;quot;Довідник.Валюти&amp;quot; }&lt;br /&gt;
    - { name: Одиниця,  type: &amp;quot;Довідник.ОдиниціВиміру&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ВстановленняЦінНоменклатури&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;SubordinateToRecorder&amp;lt;/code&amp;gt; — потрібна юридична прив&#039;язка ціни до наказу, можливість скасувати наказ і «відкотити» ціни одним рухом.&lt;br /&gt;
* &amp;lt;code&amp;gt;Валюта&amp;lt;/code&amp;gt; і &amp;lt;code&amp;gt;Одиниця&amp;lt;/code&amp;gt; — &#039;&#039;&#039;реквізити&#039;&#039;&#039;, а не вимірювання: за ними не фільтрують і не будують зрізи, вони визначаються типом цін. &#039;&#039;Помилка новачка&#039;&#039; — зробити Валюту вимірюванням, що подвоїть кількість записів і зламає зріз останніх.&lt;br /&gt;
* &amp;lt;code&amp;gt;Характеристика&amp;lt;/code&amp;gt; дозволяє порожнє значення — для номенклатури без характеристик.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0010&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec_t !! rec_r !! line_no !! period !! active !! d1_r (Номенкл.) !! d2_r (Характ.) !! d3_r (ТипЦін) !! r1 (Ціна) !! a1_r (Валюта)&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 1 || 2026-07-01 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 480.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 2 || 2026-07-01 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Оптова || 410.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 3 || 2026-07-01 || true || Чай Ahmad 100г || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 95.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || b7c…04 || 1 || 2026-07-15 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 495.00 || UAH&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|Зверніть увагу: у підпорядкованому РВ &#039;&#039;&#039;немає&#039;&#039;&#039; унікальності за (Період + Вимірювання). Два різні документи можуть встановити ціну на ту саму дату — платформа це дозволить, зріз останніх поверне запис із більшим &amp;lt;code&amp;gt;line_no&amp;lt;/code&amp;gt; у межах реєстратора з пізнішою позицією. Це &#039;&#039;&#039;свідома&#039;&#039;&#039; поведінка (сумісність із 1С), але прикладний розробник має контролювати дублі самостійно — див. антипатерн А-6 (Д.10).}}&lt;br /&gt;
&lt;br /&gt;
==== Д.3.3. ШтрихкодиНоменклатури — неперіодичний, незалежний ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; за штрихкодом знайти номенклатуру. Класичний приклад «вимірювання = те, &#039;&#039;за чим&#039;&#039; шукаємо; ресурс = те, що &#039;&#039;знаходимо&#039;&#039;».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ШтрихкодиНоменклатури&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Штрихкод, type: &amp;quot;Рядок(30)&amp;quot;, denyEmpty: true }     # ← ключ пошуку&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Упаковка,       type: &amp;quot;Довідник.УпаковкиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0011 (&lt;br /&gt;
    d1_s  varchar(30) NOT NULL,      -- Штрихкод&lt;br /&gt;
    r1_r  uuid        NOT NULL,      -- Номенклатура&lt;br /&gt;
    r2_r  uuid        NOT NULL,      -- Характеристика&lt;br /&gt;
    r3_r  uuid        NOT NULL,      -- Упаковка&lt;br /&gt;
    CONSTRAINT pk_rg_i_0011 PRIMARY KEY (d1_s)     -- ← унікальність штрихкоду «безкоштовно»&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0011_r1 ON rg_i_0011 (r1_r);  -- зворотний пошук: штрихкоди товару&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; PK за вимірюванням автоматично гарантує, що один штрихкод не може вказувати на два товари. Якби Номенклатуру зробили вимірюванням, а Штрихкод — ресурсом, ця гарантія зникла б, і довелося б писати перевірку в прикладному коді.&lt;br /&gt;
&lt;br /&gt;
==== Д.3.4. ГрафікРоботи — неперіодичний, незалежний (використовується як графік для РР) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ГрафікРоботи&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: ВидГрафіка,  type: &amp;quot;Довідник.ГрафікиРоботи&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
    - { name: ДатаГрафіка, type: &amp;quot;Дата&amp;quot;, denyEmpty: true }        # ← вимірювання типу Дата, не Період!&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Значення, type: &amp;quot;Число(1,0)&amp;quot; }      # 1 = робочий день, 0 = вихідний&lt;br /&gt;
    - { name: Годин,    type: &amp;quot;Число(4,2)&amp;quot; }      # тривалість зміни&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення (важливе):&#039;&#039;&#039; &amp;lt;code&amp;gt;ДатаГрафіка&amp;lt;/code&amp;gt; — це &#039;&#039;&#039;вимірювання&#039;&#039;&#039; типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt;, а не стандартний реквізит &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;. Регістр &#039;&#039;&#039;неперіодичний&#039;&#039;&#039;. Причина: графік описує &#039;&#039;календар&#039;&#039; (кожна дата — окремий факт), а не &#039;&#039;історію зміни значення&#039;&#039;. Якби використали періодичність, зріз останніх повертав би «останній робочий день», що безглуздо. Механізм РР (&amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt;) очікує саме таку структуру.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0015&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! d1_r (ВидГрафіка) !! d2_d (ДатаГрафіка) !! r1 (Значення) !! r2 (Годин)&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-01 || 1 || 8.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-04 || 0 || 0.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-05 || 0 || 0.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-06 || 1 || 8.00&lt;br /&gt;
|-&lt;br /&gt;
| Змінний 2/2 || 2026-07-01 || 1 || 12.00&lt;br /&gt;
|-&lt;br /&gt;
| Змінний 2/2 || 2026-07-03 || 0 || 0.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Д.3.5. КадровіДані — по позиції реєстратора ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати актуальні кадрові дані співробітника з історією; підтримати кілька наказів однією датою в правильному порядку.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: КадровіДані&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: ByRecorderPosition   # ← упорядкування за позицією документа, не лише за датою&lt;br /&gt;
  writeMode: SubordinateToRecorder&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
    - { name: Посада,       type: &amp;quot;Довідник.Посади&amp;quot; }&lt;br /&gt;
    - { name: Ставка,       type: &amp;quot;Число(5,2)&amp;quot; }&lt;br /&gt;
    - { name: ВидЗайнятості, type: &amp;quot;Перерахування.ВидиЗайнятості&amp;quot; }&lt;br /&gt;
    - { name: ГрафікРоботи, type: &amp;quot;Довідник.ГрафікиРоботи&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ПрийомНаРоботу&lt;br /&gt;
    - Документ.КадровеПереміщення&lt;br /&gt;
    - Документ.Звільнення&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; &amp;lt;code&amp;gt;ByRecorderPosition&amp;lt;/code&amp;gt; — коли два накази оформлені однією датою (переміщення + зміна ставки), звичайна періодичність «у межах дня» дала б недетермінований результат зрізу. Позиція реєстратора додає до ключа &amp;lt;code&amp;gt;(rec_t, rec_r, line_no)&amp;lt;/code&amp;gt; і впорядковує за моментом часу документа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фізична схема:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0016 (&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    d1_r     uuid         NOT NULL,        -- Співробітник&lt;br /&gt;
    r1_r     uuid NOT NULL, r2_r uuid NOT NULL,&lt;br /&gt;
    r3       numeric(5,2) NOT NULL,&lt;br /&gt;
    r4       smallint     NOT NULL,        -- Перерахування зберігається як порядковий номер&lt;br /&gt;
    r5_r     uuid NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0016 PRIMARY KEY (period, rec_t, rec_r, line_no)  -- ← Період у ключі ПЕРШИЙ&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0016_d1 ON rg_i_0016 (d1_r, period DESC, rec_t, rec_r, line_no DESC)&lt;br /&gt;
    WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.3.6. НалаштуванняКористувачів — складений тип ресурсу ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: НалаштуванняКористувачів&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Користувач,   type: &amp;quot;Довідник.Користувачі&amp;quot;, master: true }&lt;br /&gt;
    - { name: Налаштування, type: &amp;quot;ПланВидівХарактеристик.НалаштуванняКористувачів&amp;quot;, master: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - name: Значення&lt;br /&gt;
      type: [&amp;quot;Рядок(500)&amp;quot;, &amp;quot;Число(15,2)&amp;quot;, &amp;quot;Дата&amp;quot;, &amp;quot;Булево&amp;quot;,&lt;br /&gt;
             &amp;quot;Довідник.Організації&amp;quot;, &amp;quot;Довідник.Склади&amp;quot;]     # ← складений тип&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0018 (&lt;br /&gt;
    d1_r  uuid           NOT NULL,&lt;br /&gt;
    d2_r  uuid           NOT NULL,&lt;br /&gt;
    r1_t  smallint       NOT NULL,      -- код типу значення&lt;br /&gt;
    r1_b  boolean,&lt;br /&gt;
    r1_n  numeric(15,2),&lt;br /&gt;
    r1_s  varchar(500),&lt;br /&gt;
    r1_d  timestamp(0),&lt;br /&gt;
    r1_r  uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0018 PRIMARY KEY (d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! d1_r !! d2_r !! r1_t !! r1_b !! r1_n !! r1_s !! r1_d !! r1_r&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ОсновнаОрганізація || 101 || || || || || ТОВ «Альфа»&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ОсновнийСклад || 104 || || || || || Центральний&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ПоказуватиПідказки || 2 || true || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Петренко || КількістьРядківСписку || 3 || || 50 || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.4. Регістри накопичення, вид «Залишки» ===&lt;br /&gt;
&lt;br /&gt;
==== Д.4.1. ТовариНаСкладах ====&lt;br /&gt;
&lt;br /&gt;
Декларація — розділ 6.7, фізична схема — розділ 8.5, ER — розділ 9.2. Тут — дані.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Рухи (&amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt;) після проведення трьох документів:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec_t !! rec_r !! line_no !! period !! mvt !! d1_r (Номенкл.) !! d2_r (Склад) !! r1 (К-сть) !! r2 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 2 (ПрихНакл) || p1 || 1 || 2026-06-10 || 0 &#039;&#039;Прихід&#039;&#039; || Кава Lavazza || Центральний || 100.000 || 35 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 (ПрихНакл) || p1 || 2 || 2026-06-10 || 0 &#039;&#039;Прихід&#039;&#039; || Чай Ahmad || Центральний || 200.000 || 12 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 (ВидНакл) || v1 || 1 || 2026-07-05 || 1 &#039;&#039;Витрата&#039;&#039; || Кава Lavazza || Центральний || 30.000 || 10 500.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 (Переміщ) || m1 || 1 || 2026-07-12 || 1 &#039;&#039;Витрата&#039;&#039; || Кава Lavazza || Центральний || 20.000 || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 (Переміщ) || m1 || 2 || 2026-07-12 || 0 &#039;&#039;Прихід&#039;&#039; || Кава Lavazza || Роздрібний || 20.000 || 7 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки залишків (&amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt;), ТА = 2026-07-31:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! d1_r !! d2_r !! r1 (К-сть ±) !! r2 (Сума ±) !! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Кава Lavazza || Центральний || 100.000 || 35 000.00 || залишок &#039;&#039;на початок&#039;&#039; липня&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Чай Ahmad || Центральний || 200.000 || 12 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Кава Lavazza || Центральний || 50.000 || 17 500.00 || 100 − 30 − 20&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Кава Lavazza || Роздрібний || 20.000 || 7 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Чай Ahmad || Центральний || 200.000 || 12 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Кава Lavazza || Центральний || 50.000 || 17 500.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039; — поточний залишок&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Кава Lavazza || Роздрібний || 20.000 || 7 000.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Чай Ahmad || Центральний || 200.000 || 12 000.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Вимірювання Партія і Характеристика для стислості опущені.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Д.4.2. ВзаєморозрахункиЗКонтрагентами ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; облік дебіторської/кредиторської заборгованості в розрізі договорів і замовлень.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ВзаєморозрахункиЗКонтрагентами&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  enableBalanceTotals: true&lt;br /&gt;
  enableTurnoverTotals: true&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true, index: true }&lt;br /&gt;
    - { name: Контрагент,  type: &amp;quot;Довідник.Контрагенти&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Договір,     type: &amp;quot;Довідник.ДоговориКонтрагентів&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Замовлення,  type: [&amp;quot;Документ.ЗамовленняПокупця&amp;quot;, &amp;quot;Документ.ЗамовленняПостачальнику&amp;quot;],&lt;br /&gt;
        nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,    type: &amp;quot;Число(15,2)&amp;quot; }     # у валюті регламентованого обліку&lt;br /&gt;
    - { name: СумаВал, type: &amp;quot;Число(15,2)&amp;quot; }     # у валюті договору&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Коментар, type: &amp;quot;Рядок(200)&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ПрихіднаНакладна&lt;br /&gt;
    - Документ.ПлатіжнеДоручення&lt;br /&gt;
    - Документ.КасовийОрдер&lt;br /&gt;
    - Документ.КоригуванняБоргу&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Угода про знак (обов&#039;язково фіксується в методології!):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид руху !! Сенс !! Приклад документа&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Прихід&#039;&#039;&#039; || Борг контрагента перед нами &#039;&#039;&#039;зростає&#039;&#039;&#039; (дебіторка +) || Видаткова накладна&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витрата&#039;&#039;&#039; || Борг контрагента перед нами &#039;&#039;&#039;зменшується&#039;&#039;&#039; (оплата) || Платіжне доручення вхідне&lt;br /&gt;
|}&lt;br /&gt;
Кредиторська заборгованість = від&#039;ємний залишок. &#039;&#039;Альтернатива&#039;&#039; — два окремих ресурси (СумаДт/СумаКт) або два регістри; обраний варіант — один знаковий ресурс (простіше, менший обсяг підсумків).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Документ !! period !! mvt !! Контрагент !! Договір !! r1 (Сума) !! Залишок після&lt;br /&gt;
|-&lt;br /&gt;
| ВидатковаНакладна №12 || 2026-07-05 || Прихід || ТОВ «Бета» || Основний || 12 000.00 || +12 000 &#039;&#039;(винні нам)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ПлатіжнеДоручення №88 || 2026-07-09 || Витрата || ТОВ «Бета» || Основний || 8 000.00 || +4 000&lt;br /&gt;
|-&lt;br /&gt;
| ПлатіжнеДоручення №91 || 2026-07-16 || Витрата || ТОВ «Бета» || Основний || 6 000.00 || −2 000 &#039;&#039;(передоплата)&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (акт звірки):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Контрагент, Дані.Договір,&lt;br /&gt;
    Дані.СумаПочатковийЗалишок, Дані.СумаПрихід,&lt;br /&gt;
    Дані.СумаВитрата,           Дані.СумаКінцевийЗалишок&lt;br /&gt;
З РегістрНакопичення.ВзаєморозрахункиЗКонтрагентами.ЗалишкиІОбороти(&lt;br /&gt;
       &amp;amp;Початок, &amp;amp;Кінець, Авто, Рух,&lt;br /&gt;
       Організація = &amp;amp;Організація І Контрагент = &amp;amp;Контрагент&lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.4.3. ТовариВРезерві — регістр «супутник» ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ТовариВРезерві&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Склад,          type: &amp;quot;Довідник.Склади&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Замовлення,     type: &amp;quot;Документ.ЗамовленняПокупця&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість, type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ЗамовленняПокупця&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ЗакриттяЗамовлень&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Патерн «доступний залишок»&#039;&#039;&#039; — з&#039;єднання двох регістрів:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    ЄСТЬNULL(Зал.Номенклатура, Рез.Номенклатура) ЯК Номенклатура,&lt;br /&gt;
    ЄСТЬNULL(Зал.Склад, Рез.Склад) ЯК Склад,&lt;br /&gt;
    ЄСТЬNULL(Зал.КількістьЗалишок, 0) ЯК ВСкладі,&lt;br /&gt;
    ЄСТЬNULL(Рез.КількістьЗалишок, 0) ЯК ВРезерві,&lt;br /&gt;
    ЄСТЬNULL(Зал.КількістьЗалишок, 0) - ЄСТЬNULL(Рез.КількістьЗалишок, 0) ЯК Доступно&lt;br /&gt;
З РегістрНакопичення.ТовариНаСкладах.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад) ЯК Зал&lt;br /&gt;
ПОВНЕ З&#039;ЄДНАННЯ РегістрНакопичення.ТовариВРезерві.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад) ЯК Рез&lt;br /&gt;
    ЗА Зал.Номенклатура = Рез.Номенклатура І Зал.Склад = Рез.Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Чому окремий регістр, а не ресурс «Резерв» у &amp;lt;code&amp;gt;ТовариНаСкладах&amp;lt;/code&amp;gt;? Тому що резерв ведеться в розрізі &#039;&#039;&#039;Замовлення&#039;&#039;&#039;, а залишок — у розрізі &#039;&#039;&#039;Партії&#039;&#039;&#039;. Додавання Замовлення як вимірювання до &amp;lt;code&amp;gt;ТовариНаСкладах&amp;lt;/code&amp;gt; помножило б таблицю підсумків на кардинальність замовлень (сотні тисяч рядків на товар). Це ілюстрація контрольного питання №2 з Д.1.}}&lt;br /&gt;
&lt;br /&gt;
==== Д.4.4. ГрошовіКоштиБезготівкові ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ГрошовіКоштиБезготівкові&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinDay              # достатньо дня: банківська виписка — денна&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація,       type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: БанківськийРахунок, type: &amp;quot;Довідник.БанківськіРахунки&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,    type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: СумаВал, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.ПлатіжнеДоручення, Документ.БанківськаВиписка, Документ.ПереміщенняКоштів]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; Валюта — &#039;&#039;&#039;не&#039;&#039;&#039; вимірювання, тому що вона однозначно визначається банківським рахунком (функціональна залежність). Її додавання як вимірювання створило б надлишковість і ризик неузгоджених даних. Валюта отримується з&#039;єднанням із довідником.&lt;br /&gt;
&lt;br /&gt;
=== Д.5. Регістри накопичення, вид «Обороти» ===&lt;br /&gt;
&lt;br /&gt;
==== Д.5.1. Продажі — з агрегатами ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Продажі&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Turnover          # ← залишків не буває: «залишок продажів» безглуздий&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  turnoverTotalsPeriod: Month&lt;br /&gt;
  aggregatesMode: Aggregates&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Контрагент,     type: &amp;quot;Довідник.Контрагенти&amp;quot;, index: true }&lt;br /&gt;
    - { name: Договір,        type: &amp;quot;Довідник.ДоговориКонтрагентів&amp;quot; }&lt;br /&gt;
    - { name: Менеджер,       type: &amp;quot;Довідник.Користувачі&amp;quot;, index: true }&lt;br /&gt;
    - { name: Склад,          type: &amp;quot;Довідник.Склади&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість,   type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
    - { name: Сума,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: СумаБезПДВ,  type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: Собівартість, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.ВидатковаНакладна, Документ.ПовернненняВідПокупця, Документ.ЗвітПроРоздрібніПродажі]&lt;br /&gt;
&lt;br /&gt;
  aggregates:&lt;br /&gt;
    - name: ПродажіПоМісяцяхІТоварах&lt;br /&gt;
      periodicity: Month&lt;br /&gt;
      dimensions: [Номенклатура, Склад]&lt;br /&gt;
      realtime: true&lt;br /&gt;
    - name: ПродажіПоМенеджерах&lt;br /&gt;
      periodicity: Day&lt;br /&gt;
      dimensions: [Менеджер]&lt;br /&gt;
      realtime: false                 # оновлюється регламентно&lt;br /&gt;
    - name: ПродажіПоКонтрагентах&lt;br /&gt;
      periodicity: Quarter&lt;br /&gt;
      dimensions: [Контрагент, Договір]&lt;br /&gt;
      realtime: false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;Turnover&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt;: немає &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt;, немає таблиці залишків → удвічі менше підсумків і немає кумулятивних оновлень. Повернення відображається &#039;&#039;&#039;від&#039;ємною&#039;&#039;&#039; сумою, а не «витратою».&lt;br /&gt;
* 6 вимірювань → таблиця підсумків надто широка для швидких звітів → компенсуємо агрегатами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ефект агрегатів:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Звіт !! Без агрегатів (&amp;lt;code&amp;gt;rg_a_0031_tt&amp;lt;/code&amp;gt;) !! З агрегатом !! Виграш&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по товарах за рік || скан 8 млн рядків підсумків || &amp;lt;code&amp;gt;ag1&amp;lt;/code&amp;gt;: 40 тис. рядків || ×200&lt;br /&gt;
|-&lt;br /&gt;
| Рейтинг менеджерів за квартал || скан 8 млн рядків || &amp;lt;code&amp;gt;ag2&amp;lt;/code&amp;gt;: 1,8 тис. рядків || ×4000&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по контрагенту за 3 роки || скан 8 млн рядків || &amp;lt;code&amp;gt;ag3&amp;lt;/code&amp;gt;: 60 тис. рядків || ×130&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по товару + контрагенту || &#039;&#039;&#039;агрегат не покриває&#039;&#039;&#039; → підсумки || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0031_ag1 (          -- Місяць × (Номенклатура, Склад)&lt;br /&gt;
    period timestamp(0) NOT NULL, d1_r uuid NOT NULL, d6_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(20,3) NOT NULL, r2 numeric(20,2) NOT NULL,&lt;br /&gt;
    r3 numeric(20,2) NOT NULL, r4 numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag1 PRIMARY KEY (period, d1_r, d6_r)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE rg_a_0031_ag2 (          -- День × (Менеджер)&lt;br /&gt;
    period timestamp(0) NOT NULL, d5_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(20,3) NOT NULL, r2 numeric(20,2) NOT NULL,&lt;br /&gt;
    r3 numeric(20,2) NOT NULL, r4 numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag2 PRIMARY KEY (period, d5_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.5.2. ВитратиЗаСтаттями ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ВитратиЗаСтаттями&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Turnover&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  turnoverTotalsPeriod: Month&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація,    type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Підрозділ,      type: &amp;quot;Довідник.Підрозділи&amp;quot;, index: true }&lt;br /&gt;
    - { name: СтаттяВитрат,   type: &amp;quot;Довідник.СтаттіВитрат&amp;quot;, master: true, denyEmpty: true, index: true }&lt;br /&gt;
    - { name: Проєкт,         type: &amp;quot;Довідник.Проєкти&amp;quot;, nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.АвансовийЗвіт, Документ.НадходженняПослуг, Документ.НарахуванняЗарплати, Документ.Амортизація]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних (&amp;lt;code&amp;gt;rg_a_0032_tt&amp;lt;/code&amp;gt;, підсумки оборотів за місяць):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! Підрозділ !! СтаттяВитрат !! Проєкт !! r1 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || Оренда || &#039;&#039;(порожній)&#039;&#039; || 45 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || ЗП і нарахування || &#039;&#039;(порожній)&#039;&#039; || 320 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || Реклама || Запуск «Альфа» || 78 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || ІТ-відділ || ЗП і нарахування || &#039;&#039;(порожній)&#039;&#039; || 410 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || ІТ-відділ || Ліцензії ПЗ || &#039;&#039;(порожній)&#039;&#039; || 62 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.6. Регістри бухгалтерії ===&lt;br /&gt;
&lt;br /&gt;
==== Д.6.1. Госпрозрахунковий — з кореспонденцією ====&lt;br /&gt;
&lt;br /&gt;
Декларація — розділ 6.7, схема — 8.6, ER — 9.3. Тут — приклад проводок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Господарська операція:&#039;&#039;&#039; реалізація товару на 12 000 грн (у т.ч. ПДВ 2 000), собівартість 7 000 грн.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проводки (&amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt;, реєстратор = ВидатковаНакладна №12):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! acc_dt !! ed_dt1 !! ed_dt2 !! acc_kt !! ed_kt1 !! ed_kt2 !! r1 (Сума) !! r2_dt !! r2_kt&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 361 &#039;&#039;Розрах. з покупцями&#039;&#039; || ТОВ «Бета» || Договір №5 || 702 &#039;&#039;Дохід від реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 12 000.00 || || 30.000&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 702 &#039;&#039;Дохід від реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 641 &#039;&#039;Розрах. за податками&#039;&#039; || ПДВ || &#039;&#039;—&#039;&#039; || 2 000.00 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 902 &#039;&#039;Собівартість реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 281 &#039;&#039;Товари на складі&#039;&#039; || Кава Lavazza || Центральний || 7 000.00 || 30.000 || 30.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Контроль:&#039;&#039;&#039; Σ(Сума) по Дт = Σ(Сума) по Кт у межах реєстратора → 12 000 + 2 000 + 7 000 = 21 000 з обох боків. ✔&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки, рівень 0 (&amp;lt;code&amp;gt;rg_b_0020_tb0&amp;lt;/code&amp;gt;), на 5999-11-01:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! acc_r !! d1_r (Організація) !! r1 (Сума ±) !! Інтерпретація&lt;br /&gt;
|-&lt;br /&gt;
| 281 || ТОВ «Альфа» || +28 000.00 || дебетовий залишок (товари є)&lt;br /&gt;
|-&lt;br /&gt;
| 361 || ТОВ «Альфа» || +12 000.00 || дебетовий (дебіторка)&lt;br /&gt;
|-&lt;br /&gt;
| 641 || ТОВ «Альфа» || −2 000.00 || кредитовий (винні бюджету)&lt;br /&gt;
|-&lt;br /&gt;
| 702 || ТОВ «Альфа» || −10 000.00 || кредитовий (дохід)&lt;br /&gt;
|-&lt;br /&gt;
| 902 || ТОВ «Альфа» || +7 000.00 || дебетовий (собівартість)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки, рівень 2 (&amp;lt;code&amp;gt;rg_b_0020_tb2&amp;lt;/code&amp;gt;) — для рахунку 281 (2 субконто: Номенклатура, Склад):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! acc_r !! ed1_r (Номенклатура) !! ed2_r (Склад) !! r1 (Сума) !! r2 (Кількість)&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Кава Lavazza || Центральний || 17 500.00 || 50.000&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Кава Lavazza || Роздрібний || 7 000.00 || 20.000&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Чай Ahmad || Центральний || 12 000.00 || 200.000&lt;br /&gt;
|}&lt;br /&gt;
Згортка &amp;lt;code&amp;gt;tb2&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;tb0&amp;lt;/code&amp;gt;: 17 500 + 7 000 + 12 000 = &#039;&#039;&#039;36 500&#039;&#039;&#039;… &#039;&#039;(різниця з таблицею вище — інші операції; у тесті ФТ-Т-08 перевіряється точна рівність)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (ОСВ по рахунку):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Субконто1 ЯК Номенклатура, Дані.Субконто2 ЯК Склад,&lt;br /&gt;
    Дані.СумаПочатковийЗалишокДт, Дані.КількістьПочатковийЗалишокДт,&lt;br /&gt;
    Дані.СумаОборотДт, Дані.СумаОборотКт,&lt;br /&gt;
    Дані.СумаКінцевийЗалишокДт, Дані.КількістьКінцевийЗалишокДт&lt;br /&gt;
З РегістрБухгалтерії.Госпрозрахунковий.ЗалишкиІОбороти(&lt;br /&gt;
       &amp;amp;Початок, &amp;amp;Кінець, Місяць,&lt;br /&gt;
       Рахунок = &amp;amp;Рахунок281,&lt;br /&gt;
       , Організація = &amp;amp;Організація,&lt;br /&gt;
       , &lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.6.2. ПодатковийОблік — без кореспонденції ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; податковий облік із розділенням на постійні/тимчасові різниці, де подвійний запис не потрібен (кожен факт реєструється окремо по Дт або по Кт).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ПодатковийОблік&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Податковий&lt;br /&gt;
  correspondence: false               # ← уніграфічний облік&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, balance: true, denyEmpty: true }&lt;br /&gt;
    - { name: ВидРізниці,  type: &amp;quot;Перерахування.ВидиРізниць&amp;quot;, balance: true }   # БУ|ПУ|ПР|ТР&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Зміст, type: &amp;quot;Рядок(255)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.БухгалтерськаОперація, Документ.ВидатковаНакладна, Документ.НадходженняПослуг]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проводки (&amp;lt;code&amp;gt;rg_b_0021&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! acc_mvt !! acc_r !! ed1 (Номенкл.) !! d1 (Організація) !! d2 (ВидРізниці) !! r1 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 &#039;&#039;Дебет&#039;&#039; || 902.НУ || Кава Lavazza || ТОВ «Альфа» || ПУ &#039;&#039;податковий&#039;&#039; || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 &#039;&#039;Кредит&#039;&#039; || 281.НУ || Кава Lavazza || ТОВ «Альфа» || ПУ || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0 &#039;&#039;Дебет&#039;&#039; || 902.НУ || Кава Lavazza || ТОВ «Альфа» || ПР &#039;&#039;постійна різниця&#039;&#039; || 350.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 &#039;&#039;Кредит&#039;&#039; || 281.НУ || Кава Lavazza || ТОВ «Альфа» || ПР || 350.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Відмінності від Д.6.1:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! З кореспонденцією !! Без кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| Один факт = || 1 запис (Дт+Кт) || 2 записи (окремо Дт, окремо Кт)&lt;br /&gt;
|-&lt;br /&gt;
| Поля рахунків || &amp;lt;code&amp;gt;acc_dt_r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;acc_kt_r&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;acc_r&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;acc_mvt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Субконто || 2 набори (Дт, Кт) || 1 набір&lt;br /&gt;
|-&lt;br /&gt;
| Кількість записів || N || 2N&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця &amp;lt;code&amp;gt;_tc&amp;lt;/code&amp;gt; (кореспонденції) || Є || &#039;&#039;&#039;Немає&#039;&#039;&#039; — «шахова відомість» неможлива&lt;br /&gt;
|-&lt;br /&gt;
| Контроль Дт=Кт || У межах реєстратора || Опційно (може бути незбалансовано за задумом)&lt;br /&gt;
|-&lt;br /&gt;
| Коли обирати || Класичний облік, потрібен аналіз кореспонденцій || Облік без потреби в кореспонденціях, забалансовий, статистичний&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Д.6.3. Бюджетування ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Бюджетування&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Бюджетування&lt;br /&gt;
  correspondence: true&lt;br /&gt;
  periodicity: WithinMonth            # бюджет — помісячний, до секунди не потрібно&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Сценарій, type: &amp;quot;Довідник.СценаріїБюджетування&amp;quot;, balance: true, denyEmpty: true }&lt;br /&gt;
    - { name: ЦФВ,      type: &amp;quot;Довідник.ЦентриФінансовоїВідповідальності&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Проєкт,   type: &amp;quot;Довідник.Проєкти&amp;quot;, balance: true, nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
  recorders: [Документ.БюджетнаОперація, Документ.ВведенняБюджету]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; &amp;lt;code&amp;gt;Сценарій&amp;lt;/code&amp;gt; — вимірювання, а не окремий регістр на кожен сценарій (План/Факт/Прогноз). Це дозволяє план-фактний аналіз одним запитом. Усі три вимірювання &#039;&#039;&#039;балансові&#039;&#039;&#039; — бюджетна проводка не змінює сценарій/ЦФВ між дебетом і кредитом.&lt;br /&gt;
&lt;br /&gt;
=== Д.7. Регістри розрахунку ===&lt;br /&gt;
&lt;br /&gt;
==== Д.7.1. ОсновніНарахування — період дії + витіснення ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид розрахунку !! Період дії !! Витісняючі !! Базові !! Залежність від бази&lt;br /&gt;
|-&lt;br /&gt;
| Оклад || Так || Відпустка, Лікарняний || — || Не залежить&lt;br /&gt;
|-&lt;br /&gt;
| Відпустка || Так || Лікарняний || Оклад, Премія || За періодом дії&lt;br /&gt;
|-&lt;br /&gt;
| Лікарняний || Так || — || Оклад || За періодом дії&lt;br /&gt;
|-&lt;br /&gt;
| Премія || Ні || — || Оклад || За періодом реєстрації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Декларація регістру — розділ 6.7.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Записи (&amp;lt;code&amp;gt;rg_c_0040&amp;lt;/code&amp;gt;), період реєстрації = липень 2026:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! calc_type !! period !! act_begin !! act_end !! base_begin !! base_end !! d1 (Співробітник) !! r1 (Результат)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Оклад || 2026-07-01 || 2026-07-01 || 2026-07-31 || || || Іваненко || 18 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Відпустка || 2026-07-01 || 2026-07-10 || 2026-07-17 || 2026-01-01 || 2026-06-30 || Іваненко || 6 420.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Лікарняний || 2026-07-01 || 2026-07-14 || 2026-07-22 || 2026-01-01 || 2026-06-30 || Іваненко || 5 180.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Оклад || 2026-07-01 || 2026-07-01 || 2026-07-31 || || || Петренко || 22 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фактичні періоди дії (&amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt;) — результат витіснення:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec/line !! interval_no !! calc_type !! d1 !! fact_begin !! fact_end !! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 1 || 0 || Оклад || Іваненко || 2026-07-01 || 2026-07-09 || до відпустки&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 1 || 1 || Оклад || Іваненко || 2026-07-23 || 2026-07-31 || після лікарняного&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 2 || 0 || Відпустка || Іваненко || 2026-07-10 || 2026-07-13 || витіснена лікарняним з 14-го&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 3 || 0 || Лікарняний || Іваненко || 2026-07-14 || 2026-07-22 || не витісняється нічим&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 4 || 0 || Оклад || Петренко || 2026-07-01 || 2026-07-31 || витіснення відсутнє&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Один запис «Оклад» Іваненка → два інтервали&#039;&#039;&#039; — ілюстрація зв&#039;язку 1:N у розділі 9.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (дані графіка для розрахунку окладу):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Співробітник, Дані.НомерРядка,&lt;br /&gt;
    Дані.ЗначенняФактичногоПеріодуДії ЯК ВідпрацьованоДнів,&lt;br /&gt;
    Дані.ЗначенняПеріодуДії           ЯК НормаДнів&lt;br /&gt;
З РегістрРозрахунку.ОсновніНарахування.ДаніГрафіка(&lt;br /&gt;
       ВидРозрахунку = ЗНАЧЕННЯ(ПланВидівРозрахунку.ОсновніНарахування.Оклад)&lt;br /&gt;
       І Реєстратор = &amp;amp;Реєстратор&lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Результат:&#039;&#039;&#039; Іваненко — &amp;lt;code&amp;gt;ВідпрацьованоДнів = 13&amp;lt;/code&amp;gt; (робочі дні у 01–09 та 23–31), &amp;lt;code&amp;gt;НормаДнів = 23&amp;lt;/code&amp;gt; → Оклад = 18 000 × 13 / 23 = &#039;&#039;&#039;10 173,91&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (база для відпустки):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ База.Співробітник, База.НомерРядка, База.РезультатБаза ЯК Заробіток&lt;br /&gt;
З РегістрРозрахунку.ОсновніНарахування.БазаРозрахунку(&lt;br /&gt;
       , /* вимірювання бази */&lt;br /&gt;
       , /* вимірювання основного регістру */&lt;br /&gt;
       Співробітник,                          /* розрізи */&lt;br /&gt;
       ВидРозрахунку = ЗНАЧЕННЯ(ПланВидівРозрахунку.ОсновніНарахування.Відпустка)&lt;br /&gt;
   ) ЯК База&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.7.2. Утримання — без періоду дії, база за періодом реєстрації ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид розрахунку !! Період дії !! Базові види розрахунку !! Залежність&lt;br /&gt;
|-&lt;br /&gt;
| ПДФО || Ні || &#039;&#039;(усі з ПВР ОсновніНарахування)&#039;&#039; || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Військовий збір || Ні || &#039;&#039;(усі з ПВР ОсновніНарахування)&#039;&#039; || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Аліменти || Ні || Оклад, Премія, Відпустка || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Профспілковий внесок || Ні || Оклад || За періодом реєстрації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Утримання&lt;br /&gt;
  kind: Calculation&lt;br /&gt;
  calculationTypesPlan: ПланВидівРозрахунку.Утримання&lt;br /&gt;
  periodicity: Month&lt;br /&gt;
  actionPeriod: false                 # ← утримання не має періоду дії&lt;br /&gt;
  basePeriod: ByRegistrationPeriod    # ← база береться за періодом реєстрації&lt;br /&gt;
  # schedule: не задається — графік не потрібен&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, baseDimension: true, master: true, denyEmpty: true }&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Результат,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: БазаОподаткування, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recalculations:&lt;br /&gt;
    - name: ПерерахунокУтримань&lt;br /&gt;
      dimensions:&lt;br /&gt;
        - { name: Співробітник, registerDimension: Співробітник }&lt;br /&gt;
  recorders: [Документ.НарахуванняЗарплати]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фізична схема (спрощена — немає полів періоду дії):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_c_0041 (&lt;br /&gt;
    rec_t       smallint     NOT NULL,&lt;br /&gt;
    rec_r       uuid         NOT NULL,&lt;br /&gt;
    line_no     int          NOT NULL,&lt;br /&gt;
    period      timestamp(0) NOT NULL,     -- період реєстрації&lt;br /&gt;
    active      boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    reversal    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    calc_type_r uuid         NOT NULL,&lt;br /&gt;
    base_begin  timestamp(0) NOT NULL,     -- ← є, бо basePeriod ≠ None&lt;br /&gt;
    base_end    timestamp(0) NOT NULL,&lt;br /&gt;
    -- act_begin / act_end ВІДСУТНІ (actionPeriod: false)&lt;br /&gt;
    d1_r        uuid         NOT NULL,&lt;br /&gt;
    d2_r        uuid         NOT NULL,&lt;br /&gt;
    r1          numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2          numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0041 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
-- Таблиця rg_c_0041_ap НЕ створюється (немає періоду дії → немає витіснення)&lt;br /&gt;
CREATE TABLE rg_c_0041_rc1 (            -- ПерерахунокУтримань&lt;br /&gt;
    rec_t smallint NOT NULL, rec_r uuid NOT NULL,&lt;br /&gt;
    calc_type_r uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    src_rec_t smallint NOT NULL, src_rec_r uuid NOT NULL,&lt;br /&gt;
    created_at timestamp(0) NOT NULL DEFAULT now(),&lt;br /&gt;
    CONSTRAINT pk_rg_c_0041_rc1 PRIMARY KEY (rec_t, rec_r, calc_type_r, d1_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Міжпланова база.&#039;&#039;&#039; Базові види розрахунку для ПВР &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt; належать до &#039;&#039;іншого&#039;&#039; ПВР — &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;. Це означає, що віртуальна таблиця &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; регістру &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt; має читати записи регістру &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Вимога ФТ-25 має бути розширена:&#039;&#039;&#039; метамодель повинна дозволяти вказати &#039;&#039;регістр-джерело бази&#039;&#039;. Це &#039;&#039;&#039;відкрите питання В9&#039;&#039;&#039; (див. оновлений Додаток Г) — у 1С механізм працює через відповідність ПВР, а не регістрів, що обмежує сценарії. Пропозиція: додати до &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt; поле &amp;lt;code&amp;gt;base_register_id&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! calc_type !! period !! base_begin !! base_end !! Співробітник !! r2 (База) !! r1 (Результат)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ПДФО || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 21 773.91 || 3 919.30&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Військовий збір || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 21 773.91 || 326.61&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Аліменти || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 17 528.00 || 4 382.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.8. Наскрізний приклад: проведення видаткової накладної ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Документ:&#039;&#039;&#039; Видаткова накладна №12 від 05.07.2026, ТОВ «Бета», 30 кг кави за 400 грн (12 000 грн з ПДВ), собівартість 7 000 грн.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Posting {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9];&lt;br /&gt;
&lt;br /&gt;
  D [label=&amp;quot;Документ\nВидаткова накладна №12\n05.07.2026&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;, shape=note];&lt;br /&gt;
&lt;br /&gt;
  R1 [label=&amp;quot;РН ТовариНаСкладах\n(Залишки)\nВитрата: 30 кг / 7 000 грн&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R2 [label=&amp;quot;РН Взаєморозрахунки\n(Залишки)\nПрихід: 12 000 грн&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R3 [label=&amp;quot;РН Продажі\n(Обороти)\n30 кг / 12 000 / 10 000 / 7 000&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R4 [label=&amp;quot;РН ТовариВРезерві\n(Залишки)\nВитрата: 30 кг&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R5 [label=&amp;quot;РБ Госпрозрахунковий\n3 проводки на 21 000&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  T1 [label=&amp;quot;rg_a_0012_tb\nMAXPERIOD: 80 → 50 кг&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T2 [label=&amp;quot;rg_a_0013_tb\nMAXPERIOD: 0 → +12 000&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T3 [label=&amp;quot;rg_a_0031_tt\n2026-07: +30 / +12 000&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T5 [label=&amp;quot;rg_b_0020_tb0/tb2/tt0/tc&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;, shape=cylinder];&lt;br /&gt;
&lt;br /&gt;
  D -&amp;gt; R1; D -&amp;gt; R2; D -&amp;gt; R3; D -&amp;gt; R4; D -&amp;gt; R5;&lt;br /&gt;
  R1 -&amp;gt; T1; R2 -&amp;gt; T2; R3 -&amp;gt; T3; R5 -&amp;gt; T5;&lt;br /&gt;
&lt;br /&gt;
  label=&amp;quot;ОДНА транзакція БД: усі 5 регістрів + підсумки + прапорець Проведений&amp;quot;;&lt;br /&gt;
  labelloc=b; fontname=&amp;quot;Helvetica&amp;quot;; fontsize=10;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class ВидатковаНакладна(Document):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Проведення по 5 регістрах в одній транзакції. Бюджет Python: &amp;lt;= 15 мс (АП-4).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def on_posting(self, ctx: PostingContext) -&amp;gt; None:&lt;br /&gt;
        # --- 0. Блокування перед контролем залишків ---&lt;br /&gt;
        with DataLock() as dl:&lt;br /&gt;
            li = dl.add(&amp;quot;РегістрНакопичення.ТовариНаСкладах.Залишки&amp;quot;)&lt;br /&gt;
            li.mode = DataLockMode.EXCLUSIVE&lt;br /&gt;
            li.data_source = self.Товари.unload(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Характеристика&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Номенклатура&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Характеристика&amp;quot;, &amp;quot;Характеристика&amp;quot;)&lt;br /&gt;
            li.set_value(&amp;quot;Склад&amp;quot;, self.Склад)&lt;br /&gt;
&lt;br /&gt;
            self._movements_goods()       # 1. ТовариНаСкладах&lt;br /&gt;
            self._movements_ar()          # 2. Взаєморозрахунки&lt;br /&gt;
            self._movements_sales()       # 3. Продажі&lt;br /&gt;
            self._movements_reserve()     # 4. ТовариВРезерві&lt;br /&gt;
            self._movements_accounting()  # 5. Госпрозрахунковий&lt;br /&gt;
&lt;br /&gt;
            self.movements.ТовариНаСкладах.write_now()&lt;br /&gt;
            self._control_negative_balances(ctx)&lt;br /&gt;
&lt;br /&gt;
    # --- 1. РН ТовариНаСкладах: списання ---&lt;br /&gt;
    def _movements_goods(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.ТовариНаСкладах&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(Період=self.Дата,&lt;br /&gt;
                   ВидРуху=AccumulationMovementType.EXPENSE,&lt;br /&gt;
                   Номенклатура=r.Номенклатура, Характеристика=r.Характеристика,&lt;br /&gt;
                   Склад=self.Склад, Партія=r.Партія,&lt;br /&gt;
                   Кількість=r.Кількість, Сума=r.Собівартість)&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    # --- 2. РН Взаєморозрахунки: дебіторка зростає ---&lt;br /&gt;
    def _movements_ar(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.ВзаєморозрахункиЗКонтрагентами&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.append(rs.new(&lt;br /&gt;
            Період=self.Дата,&lt;br /&gt;
            ВидРуху=AccumulationMovementType.RECEIPT,     # Прихід = борг зростає&lt;br /&gt;
            Організація=self.Організація, Контрагент=self.Контрагент,&lt;br /&gt;
            Договір=self.Договір, Замовлення=self.ЗамовленняПокупця,&lt;br /&gt;
            Сума=self.СумаДокумента, СумаВал=self.СумаДокументаВал,&lt;br /&gt;
        ))&lt;br /&gt;
&lt;br /&gt;
    # --- 3. РН Продажі: оборот (ВидРуху відсутній!) ---&lt;br /&gt;
    def _movements_sales(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Продажі&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(Період=self.Дата,&lt;br /&gt;
                   Номенклатура=r.Номенклатура, Контрагент=self.Контрагент,&lt;br /&gt;
                   Договір=self.Договір, Менеджер=self.Менеджер, Склад=self.Склад,&lt;br /&gt;
                   Кількість=r.Кількість, Сума=r.Сума,&lt;br /&gt;
                   СумаБезПДВ=r.СумаБезПДВ, Собівартість=r.Собівартість)&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    # --- 4. РН ТовариВРезерві: зняття резерву ---&lt;br /&gt;
    def _movements_reserve(self) -&amp;gt; None:&lt;br /&gt;
        if self.ЗамовленняПокупця.is_empty():&lt;br /&gt;
            return&lt;br /&gt;
        rs = self.movements.ТовариВРезерві&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(Період=self.Дата, ВидРуху=AccumulationMovementType.EXPENSE,&lt;br /&gt;
                   Номенклатура=r.Номенклатура, Характеристика=r.Характеристика,&lt;br /&gt;
                   Склад=self.Склад, Замовлення=self.ЗамовленняПокупця,&lt;br /&gt;
                   Кількість=r.Кількість)&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    # --- 5. РБ Госпрозрахунковий: 3 проводки на рядок ---&lt;br /&gt;
    def _movements_accounting(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Госпрозрахунковий&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        for r in self.Товари:&lt;br /&gt;
            e1 = rs.add_accounting_entry(               # Дт 361 / Кт 702&lt;br /&gt;
                Період=self.Дата, Організація=self.Організація,&lt;br /&gt;
                РахунокДт=Accounts[&amp;quot;361&amp;quot;], РахунокКт=Accounts[&amp;quot;702&amp;quot;],&lt;br /&gt;
                Сума=r.Сума, КількістьКт=r.Кількість)&lt;br /&gt;
            e1.subconto_dt[ВидиСубконто.Контрагенти] = self.Контрагент&lt;br /&gt;
            e1.subconto_dt[ВидиСубконто.Договори] = self.Договір&lt;br /&gt;
            e1.subconto_kt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
&lt;br /&gt;
            e2 = rs.add_accounting_entry(               # Дт 702 / Кт 641 (ПДВ)&lt;br /&gt;
                Період=self.Дата, Організація=self.Організація,&lt;br /&gt;
                РахунокДт=Accounts[&amp;quot;702&amp;quot;], РахунокКт=Accounts[&amp;quot;641&amp;quot;],&lt;br /&gt;
                Сума=r.СумаПДВ)&lt;br /&gt;
            e2.subconto_dt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e2.subconto_kt[ВидиСубконто.ПодаткиІЗбори] = Taxes.ПДВ&lt;br /&gt;
&lt;br /&gt;
            e3 = rs.add_accounting_entry(               # Дт 902 / Кт 281&lt;br /&gt;
                Період=self.Дата, Організація=self.Організація,&lt;br /&gt;
                РахунокДт=Accounts[&amp;quot;902&amp;quot;], РахунокКт=Accounts[&amp;quot;281&amp;quot;],&lt;br /&gt;
                Сума=r.Собівартість,&lt;br /&gt;
                КількістьДт=r.Кількість, КількістьКт=r.Кількість)&lt;br /&gt;
            e3.subconto_dt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e3.subconto_kt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e3.subconto_kt[ВидиСубконто.Склади] = self.Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що відбувається у БД (одна транзакція):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Крок !! Таблиця !! Операція !! Рядків&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;lt;code&amp;gt;doc_0003&amp;lt;/code&amp;gt; || UPDATE posted = true || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt; (ТовариНаСкладах) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt; || MERGE (MAXPERIOD + періоди &amp;gt; 07.2026) || 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &amp;lt;code&amp;gt;rg_a_0013&amp;lt;/code&amp;gt; (Взаєморозрахунки) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &amp;lt;code&amp;gt;rg_a_0013_tb&amp;lt;/code&amp;gt; || MERGE || 2&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &amp;lt;code&amp;gt;rg_a_0031&amp;lt;/code&amp;gt; (Продажі) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 7 || &amp;lt;code&amp;gt;rg_a_0031_tt&amp;lt;/code&amp;gt; || MERGE (тільки період 2026-07) || 1&lt;br /&gt;
|-&lt;br /&gt;
| 8 || &amp;lt;code&amp;gt;rg_a_0031_ag1&amp;lt;/code&amp;gt; || MERGE (realtime-агрегат) || 1&lt;br /&gt;
|-&lt;br /&gt;
| 9 || &amp;lt;code&amp;gt;rg_a_0014&amp;lt;/code&amp;gt; (Резерв) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 10 || &amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt; (проводки) || DELETE + INSERT || 3&lt;br /&gt;
|-&lt;br /&gt;
| 11 || &amp;lt;code&amp;gt;rg_b_0020_tb0&amp;lt;/code&amp;gt; || MERGE || 10&lt;br /&gt;
|-&lt;br /&gt;
| 12 || &amp;lt;code&amp;gt;rg_b_0020_tb1/tb2&amp;lt;/code&amp;gt; || MERGE || 8&lt;br /&gt;
|-&lt;br /&gt;
| 13 || &amp;lt;code&amp;gt;rg_b_0020_tt0..tt2&amp;lt;/code&amp;gt; || MERGE || 12&lt;br /&gt;
|-&lt;br /&gt;
| 14 || &amp;lt;code&amp;gt;rg_b_0020_tc&amp;lt;/code&amp;gt; || MERGE || 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Разом&#039;&#039;&#039; || &#039;&#039;&#039;≈ 47 рядків, 1 COMMIT&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Спостереження для НФВ-04.&#039;&#039;&#039; Один рядок товару в накладній породжує ~47 модифікацій рядків у 14 таблицях. Для накладної зі 100 рядків це ~2 000–4 000 модифікацій. Саме тут — основне навантаження проведення, і саме тому РБ (кроки 10–14) дає ~70 % вартості транзакції. Це аргумент на користь MVP без РБ (розділ 14) і предмет вимірювання в НТ-03.}}&lt;br /&gt;
&lt;br /&gt;
=== Д.9. Наскрізний приклад: розрахунок зарплати ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
КРОК 1. Документ «Нарахування зарплати» за липень 2026, Іваненко.&lt;br /&gt;
        Записуємо рухи в РР ОсновніНарахування (Результат = 0).&lt;br /&gt;
&lt;br /&gt;
КРОК 2. Платформа автоматично будує фактичні періоди дії (rg_c_0040_ap):&lt;br /&gt;
        Оклад      → [01.07–09.07], [23.07–31.07]&lt;br /&gt;
        Відпустка  → [10.07–13.07]&lt;br /&gt;
        Лікарняний → [14.07–22.07]&lt;br /&gt;
&lt;br /&gt;
КРОК 3. Розрахунок «первинних» видів (без бази) — Оклад.&lt;br /&gt;
        Запит до ДаніГрафіка:&lt;br /&gt;
          НормаДнів            = 23 (робочих днів у липні за П&#039;ятиденкою)&lt;br /&gt;
          ВідпрацьованоДнів    = 13 (робочі дні у фактичних періодах дії)&lt;br /&gt;
        Результат = 18 000 × 13 / 23 = 10 173,91&lt;br /&gt;
        → UPDATE rg_c_0040 SET r1 = 10173.91, r2 = 13, r3 = 23 WHERE line_no = 1&lt;br /&gt;
&lt;br /&gt;
КРОК 4. Розрахунок видів із базою — Відпустка, Лікарняний.&lt;br /&gt;
        Запит до БазаРозрахунку (базовий період 01.01–30.06, база = Оклад+Премія):&lt;br /&gt;
          Заробіток за 6 міс. = 115 560,00&lt;br /&gt;
          Календарних днів    = 181&lt;br /&gt;
          Середньоденний      = 638,45&lt;br /&gt;
        Відпустка: 638,45 × 4 дні (10–13.07) = 2 553,80&lt;br /&gt;
        Лікарняний: 638,45 × 9 днів × 100 % = 5 746,05&lt;br /&gt;
        → UPDATE rg_c_0040 SET r1 = ... WHERE line_no IN (2, 3)&lt;br /&gt;
&lt;br /&gt;
КРОК 5. Записуємо рухи в РР Утримання (базовий період = період реєстрації, липень).&lt;br /&gt;
        База ПДФО = 10 173,91 + 2 553,80 + 5 746,05 = 18 473,76&lt;br /&gt;
        ПДФО = 18 473,76 × 18 % = 3 325,28&lt;br /&gt;
        ВЗ   = 18 473,76 × 1,5 % =   277,11&lt;br /&gt;
&lt;br /&gt;
КРОК 6. Проведення документа → рухи в:&lt;br /&gt;
        РН ВитратиЗаСтаттями (Обороти):  Стаття «ЗП і нарахування» = 18 473,76&lt;br /&gt;
        РБ Госпрозрахунковий:            Дт 92 / Кт 661 = 18 473,76&lt;br /&gt;
                                         Дт 661 / Кт 641.ПДФО = 3 325,28&lt;br /&gt;
                                         Дт 661 / Кт 642.ВЗ =     277,11&lt;br /&gt;
&lt;br /&gt;
КРОК 7. Через тиждень бухгалтер змінює Оклад Іваненка за червень (заднім числом).&lt;br /&gt;
        → Платформа реєструє в rg_c_0040_rc1 (ПерерахунокЗаБазою):&lt;br /&gt;
             (Реєстратор = НарахуванняЗП липня, ВидРозрахунку = Відпустка,  Співробітник = Іваненко)&lt;br /&gt;
             (Реєстратор = НарахуванняЗП липня, ВидРозрахунку = Лікарняний, Співробітник = Іваненко)&lt;br /&gt;
        → Звіт «Документи до перерахунку» показує липневий документ.&lt;br /&gt;
        → Бухгалтер перепроводить → база перераховується → записи перерахунку очищаються.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Д.10. Антипатерни проєктування регістрів ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Антипатерн !! Чому погано !! Як правильно&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-1&#039;&#039;&#039; || Дата як &#039;&#039;&#039;вимірювання&#039;&#039;&#039; у РН (замість стандартного &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;) || Таблиця підсумків множиться на кількість дат і зростає нескінченно; віртуальні таблиці &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; ігнорують це вимірювання і дають безглузді результати || Використовувати стандартний реквізит &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;. Виняток — календарі (Д.3.4), де це РВ, а не РН&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-2&#039;&#039;&#039; || РН «Залишки» там, де потрібна лише історія значення || Надлишкові таблиці підсумків, кумулятивні оновлення, вид руху без сенсу || РВ періодичний&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-3&#039;&#039;&#039; || РН «Залишки» там, де залишок безглуздий (Продажі, Витрати) || Удвічі більший обсяг підсумків, кумулятивні MERGE на всі майбутні періоди || РН «Обороти» + агрегати (Д.5.1)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-4&#039;&#039;&#039; || Реквізит документа продубльовано у вимірювання «щоб фільтрувати у звіті» || Кардинальність підсумків × N; типовий випадок — Менеджер/Валюта/Коментар || Реквізит регістру + з&#039;єднання з документом у звіті; або окремий регістр «Обороти»&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-5&#039;&#039;&#039; || &amp;gt; 8 вимірювань в одному РН || Таблиця підсумків стає &#039;&#039;&#039;більшою&#039;&#039;&#039; за таблицю рухів; проведення сповільнюється в рази || Розділити на регістри за призначенням; частину аналітики — в «Обороти» з агрегатами&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-6&#039;&#039;&#039; || Незалежний РВ «у межах секунди» як журнал подій || Два записи в ту саму секунду → другий &#039;&#039;&#039;мовчки замістить&#039;&#039;&#039; перший; втрата даних || Підпорядкований РВ (реєстратор у ключі) або додати вимірювання-дискримінатор&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-7&#039;&#039;&#039; || Ресурс типу &amp;lt;code&amp;gt;Рядок&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Посилання&amp;lt;/code&amp;gt; у РН || Підсумовування неможливе; підсумки не побудуються || Реквізит (не агрегується) або вимірювання (якщо це розріз)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-8&#039;&#039;&#039; || Прямий &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt; таблиці підсумків із прикладного коду || Розсинхронізація підсумків і рухів; діагностика — тижні || Тільки через набори записів. Заборона на рівні прав БД (розділ 12.2)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-9&#039;&#039;&#039; || Один «універсальний» регістр із вимірюванням &amp;lt;code&amp;gt;ВидОбліку&amp;lt;/code&amp;gt; (БУ/ПУ/УО) замість трьох || Втричі більша таблиця; конкуренція за блокування між незалежними обліками; неможливо окремо перерахувати підсумки || Окремі регістри. Виняток — РБ &amp;lt;code&amp;gt;ПодатковийОблік&amp;lt;/code&amp;gt; (Д.6.2), де ВидРізниці — це справді розріз одного обліку&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-10&#039;&#039;&#039; || Функціонально залежне поле як вимірювання (Валюта при БанківськомуРахунку) || Надлишковість; ризик неузгоджених даних; зайвий розмір ключа підсумків || З&#039;єднання з довідником у запиті (Д.4.4)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-11&#039;&#039;&#039; || РБ там, де достатньо РН || Замість 1 таблиці — 10; ~70 % вартості проведення (Д.8); складність субконто без потреби || РН. РБ — лише коли потрібні план рахунків, подвійний запис і кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-12&#039;&#039;&#039; || Вимірювання з &amp;lt;code&amp;gt;nullable&amp;lt;/code&amp;gt; без потреби || Порожнє посилання — окреме значення ключа; підсумки «розмазуються» на два рядки замість одного || &amp;lt;code&amp;gt;denyEmpty: true&amp;lt;/code&amp;gt; скрізь, де порожнє значення не має сенсу&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-13&#039;&#039;&#039; || Контроль залишків &#039;&#039;&#039;до&#039;&#039;&#039; запису рухів || Класична гонитва: два сеанси проходять контроль і обидва списують у мінус || Спершу &amp;lt;code&amp;gt;DataLock&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;WriteNow()&amp;lt;/code&amp;gt; → потім контроль (Д.8, ФТ-Т-12)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-14&#039;&#039;&#039; || &amp;lt;code&amp;gt;periodicity: WithinSecond&amp;lt;/code&amp;gt; «про всяк випадок» скрізь || Для РВ — неможливість замістити запис за день; для РН — марна точність, більші індекси || Обирати мінімально достатню: день для цін/курсів/виписок, секунда — для складських рухів&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-15&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;(Python)&#039;&#039; || Запис рухів у циклі: &amp;lt;code&amp;gt;for r in Товари: rs.add(...).write()&amp;lt;/code&amp;gt; || Порушення АП-1: 100 round-trip&#039;ів замість 1; проведення 300 мс → ~10 с. Невидиме на тестових даних, катастрофічне на продуктиві. Найчастіша помилка при ORM-мисленні || Наповнити набір повністю (&amp;lt;code&amp;gt;rs.extend(генератор)&amp;lt;/code&amp;gt;), записати один раз. Детектор — Додаток Е.7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-16&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;(Python)&#039;&#039; || Агрегація дельт підсумків у Python (&amp;lt;code&amp;gt;defaultdict&amp;lt;/code&amp;gt; + цикл) замість &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt; || Порушення АП-2: дані ганяються в застосунок і назад; на 10&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; рядків — десятки секунд || &amp;lt;code&amp;gt;INSERT … ON CONFLICT DO UPDATE&amp;lt;/code&amp;gt; одним запитом (Е.3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.11. Чек-лист рев&#039;ю нового регістру ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
□ Тип регістру обґрунтований за деревом Д.1&lt;br /&gt;
□ Кожне вимірювання використовується у фільтрі АБО групуванні звітів&lt;br /&gt;
□ Кожен ресурс має сенс при підсумовуванні&lt;br /&gt;
□ Немає полів з антипатернів А-1, А-4, А-7, А-10, А-12&lt;br /&gt;
□ Оцінка кардинальності підсумків ≤ 10^8 (калькулятор конструктора, ФТ-К-03)&lt;br /&gt;
□ Для вимірювань, де порожнє значення безглузде, стоїть denyEmpty&lt;br /&gt;
□ Ведучі (master) вимірювання визначені — інакше «висячі» записи при видаленні об&#039;єктів&lt;br /&gt;
□ Склад реєстраторів повний; зайвих типів документів немає&lt;br /&gt;
□ Угода про знак / вид руху зафіксована в методологічній документації&lt;br /&gt;
□ Періодичність мінімально достатня (А-14)&lt;br /&gt;
□ Для РН «Обороти» з &amp;gt;4 вимірюваннями визначено ≥1 агрегат&lt;br /&gt;
□ Для РБ: балансові/небалансові вимірювання та ресурси розставлені свідомо&lt;br /&gt;
□ Для РР: витісняючі та базові види розрахунку в ПВР заповнені; перерахунки визначені&lt;br /&gt;
□ Партиціонування ввімкнене, якщо очікується &amp;gt;100 млн записів&lt;br /&gt;
□ Написано тест на проведення + скасування + перерахунок підсумків&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Додаток Е. Ескізи реалізації ядра на Python ==&lt;br /&gt;
&lt;br /&gt;
Додаток демонструє, що метамодель розділу 6 і фізична модель розділу 8 реалізовні обраним стеком (розділ 4.3), і фіксує ключові технічні рішення для етапів Е1, Е3, Е5, Е7, Е11. Код — ілюстративний ескіз, а не остаточний API.&lt;br /&gt;
&lt;br /&gt;
=== Е.1. Маніфест регістру як Pydantic-модель (етап Е1) ===&lt;br /&gt;
&lt;br /&gt;
YAML-декларації розділу 6.7 і Додатка Д валідуються цією моделлю. Це &#039;&#039;&#039;безпосередньо реалізує ФТ-К-01&#039;&#039;&#039; (валідація в реальному часі) і частину контролю антипатернів Д.10.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
import warnings&lt;br /&gt;
from enum import StrEnum&lt;br /&gt;
from typing import Annotated, Literal, Self&lt;br /&gt;
&lt;br /&gt;
from pydantic import BaseModel, ConfigDict, Field, model_validator&lt;br /&gt;
&lt;br /&gt;
IDENT = r&amp;quot;^[^\W\d]\w{0,79}$&amp;quot;          # Unicode-ідентифікатор (кирилиця дозволена), &amp;lt;= 80 симв.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RegisterKind(StrEnum):&lt;br /&gt;
    INFORMATION = &amp;quot;Information&amp;quot;&lt;br /&gt;
    ACCUMULATION = &amp;quot;Accumulation&amp;quot;&lt;br /&gt;
    ACCOUNTING = &amp;quot;Accounting&amp;quot;&lt;br /&gt;
    CALCULATION = &amp;quot;Calculation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Periodicity(StrEnum):&lt;br /&gt;
    NONPERIODICAL = &amp;quot;Nonperiodical&amp;quot;&lt;br /&gt;
    WITHIN_SECOND = &amp;quot;WithinSecond&amp;quot;&lt;br /&gt;
    WITHIN_DAY = &amp;quot;WithinDay&amp;quot;&lt;br /&gt;
    WITHIN_MONTH = &amp;quot;WithinMonth&amp;quot;&lt;br /&gt;
    WITHIN_QUARTER = &amp;quot;WithinQuarter&amp;quot;&lt;br /&gt;
    WITHIN_YEAR = &amp;quot;WithinYear&amp;quot;&lt;br /&gt;
    BY_RECORDER_POSITION = &amp;quot;ByRecorderPosition&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class WriteMode(StrEnum):&lt;br /&gt;
    INDEPENDENT = &amp;quot;Independent&amp;quot;&lt;br /&gt;
    SUBORDINATE = &amp;quot;SubordinateToRecorder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class FieldRole(StrEnum):&lt;br /&gt;
    DIMENSION = &amp;quot;Dimension&amp;quot;&lt;br /&gt;
    RESOURCE = &amp;quot;Resource&amp;quot;&lt;br /&gt;
    ATTRIBUTE = &amp;quot;Attribute&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RegisterField(BaseModel):&lt;br /&gt;
    model_config = ConfigDict(extra=&amp;quot;forbid&amp;quot;, frozen=True)&lt;br /&gt;
&lt;br /&gt;
    name: Annotated[str, Field(pattern=IDENT)]&lt;br /&gt;
    role: FieldRole&lt;br /&gt;
    type: str | list[str]                 # &amp;quot;Довідник.Номенклатура&amp;quot; | [&amp;quot;Документ.А&amp;quot;, &amp;quot;Документ.Б&amp;quot;]&lt;br /&gt;
    synonym: str | None = None&lt;br /&gt;
    index: bool = False&lt;br /&gt;
    master: bool = False                  # «Ведуче»&lt;br /&gt;
    deny_empty: bool = False&lt;br /&gt;
    nullable: bool = False&lt;br /&gt;
    use_in_totals: bool = True&lt;br /&gt;
    # РБ&lt;br /&gt;
    balance: bool = False&lt;br /&gt;
    accounting_flag: str | None = None&lt;br /&gt;
    # РР&lt;br /&gt;
    base_dimension: bool = False&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def is_composite(self) -&amp;gt; bool:&lt;br /&gt;
        return isinstance(self.type, list) and len(self.type) &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Register(BaseModel):&lt;br /&gt;
    model_config = ConfigDict(extra=&amp;quot;forbid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    name: Annotated[str, Field(pattern=IDENT)]&lt;br /&gt;
    kind: RegisterKind&lt;br /&gt;
    synonym: str | None = None&lt;br /&gt;
    periodicity: Periodicity = Periodicity.NONPERIODICAL&lt;br /&gt;
    write_mode: WriteMode = WriteMode.SUBORDINATE&lt;br /&gt;
    dimensions: list[RegisterField] = []&lt;br /&gt;
    resources: list[RegisterField] = []&lt;br /&gt;
    attributes: list[RegisterField] = []&lt;br /&gt;
    recorders: list[str] = []&lt;br /&gt;
    # РН&lt;br /&gt;
    accumulation_kind: Literal[&amp;quot;Balance&amp;quot;, &amp;quot;Turnover&amp;quot;] | None = None&lt;br /&gt;
    enable_balance_totals: bool = True&lt;br /&gt;
    enable_turnover_totals: bool = False&lt;br /&gt;
    turnover_totals_period: Literal[&amp;quot;Day&amp;quot;, &amp;quot;Month&amp;quot;] | None = None&lt;br /&gt;
    # РБ&lt;br /&gt;
    chart_of_accounts: str | None = None&lt;br /&gt;
    correspondence: bool = True&lt;br /&gt;
    max_extdim_count: Annotated[int, Field(ge=0, le=5)] = 3&lt;br /&gt;
    # РР&lt;br /&gt;
    calculation_types_plan: str | None = None&lt;br /&gt;
    action_period: bool = False&lt;br /&gt;
    base_period: Literal[&amp;quot;None&amp;quot;, &amp;quot;ByActionPeriod&amp;quot;, &amp;quot;ByRegistrationPeriod&amp;quot;] = &amp;quot;None&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # ---------- крос-полева валідація (розділи 6.2–6.6) ----------&lt;br /&gt;
    @model_validator(mode=&amp;quot;after&amp;quot;)&lt;br /&gt;
    def _validate(self) -&amp;gt; Self:&lt;br /&gt;
        if self.write_mode is WriteMode.INDEPENDENT and self.kind is not RegisterKind.INFORMATION:&lt;br /&gt;
            raise ValueError(&amp;quot;Незалежний режим запису дозволено лише для регістру відомостей&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if self.kind is RegisterKind.ACCUMULATION:&lt;br /&gt;
            if self.accumulation_kind is None:&lt;br /&gt;
                raise ValueError(&amp;quot;Для регістру накопичення обов&#039;язковий accumulation_kind&amp;quot;)&lt;br /&gt;
            if self.periodicity is Periodicity.NONPERIODICAL:&lt;br /&gt;
                raise ValueError(&amp;quot;Регістр накопичення не може бути неперіодичним&amp;quot;)&lt;br /&gt;
            if self.accumulation_kind == &amp;quot;Turnover&amp;quot; and self.enable_balance_totals:&lt;br /&gt;
                raise ValueError(&amp;quot;Підсумки залишків несумісні з видом «Обороти»&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if self.kind is RegisterKind.ACCOUNTING and not self.chart_of_accounts:&lt;br /&gt;
            raise ValueError(&amp;quot;Для регістру бухгалтерії обов&#039;язковий chart_of_accounts&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if self.kind is RegisterKind.CALCULATION:&lt;br /&gt;
            if not self.calculation_types_plan:&lt;br /&gt;
                raise ValueError(&amp;quot;Для регістру розрахунку обов&#039;язковий calculation_types_plan&amp;quot;)&lt;br /&gt;
            if not any(f.base_dimension for f in self.dimensions) and self.base_period != &amp;quot;None&amp;quot;:&lt;br /&gt;
                raise ValueError(&amp;quot;Задано base_period, але жодне вимірювання не позначене base_dimension&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # ресурс має бути підсумовуваним (антипатерн А-7)&lt;br /&gt;
        if self.kind is not RegisterKind.INFORMATION:&lt;br /&gt;
            for r in self.resources:&lt;br /&gt;
                if not _is_numeric(r.type):&lt;br /&gt;
                    raise ValueError(f&amp;quot;Ресурс «{r.name}»: тип {r.type} не підсумовується (А-7). &amp;quot;&lt;br /&gt;
                                     f&amp;quot;Використайте роль Attribute або Dimension&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # обмеження розділу 6.6&lt;br /&gt;
        if len(self.dimensions) &amp;gt; 20:&lt;br /&gt;
            raise ValueError(f&amp;quot;Вимірювань {len(self.dimensions)} &amp;gt; 20 (розділ 6.6)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # попередження (ФТ-К-01: warnings, а не помилки)&lt;br /&gt;
        if len(self.dimensions) &amp;gt; 8:&lt;br /&gt;
            warnings.warn(f&amp;quot;«{self.name}»: {len(self.dimensions)} вимірювань — &amp;quot;&lt;br /&gt;
                          f&amp;quot;ризик розростання таблиці підсумків (антипатерн А-5)&amp;quot;)&lt;br /&gt;
        for d in self.dimensions:&lt;br /&gt;
            if d.type == &amp;quot;Дата&amp;quot; and self.kind is RegisterKind.ACCUMULATION:&lt;br /&gt;
                warnings.warn(f&amp;quot;«{self.name}.{d.name}»: Дата як вимірювання РН — антипатерн А-1&amp;quot;)&lt;br /&gt;
        return self&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що це дає безкоштовно:&#039;&#039;&#039; валідацію YAML, JSON Schema для web-конструктора (&amp;lt;code&amp;gt;Register.model_json_schema()&amp;lt;/code&amp;gt;), типізовані об&#039;єкти для генератора DDL, детальні повідомлення про помилки з шляхом до поля.&lt;br /&gt;
&lt;br /&gt;
=== Е.2. Генератор DDL на SQLAlchemy Core (етап Е1) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections.abc import Callable, Sequence&lt;br /&gt;
&lt;br /&gt;
from sqlalchemy import (Boolean, Column, DateTime, Index, Integer, MetaData, Numeric,&lt;br /&gt;
                        PrimaryKeyConstraint, SmallInteger, String, Table, Uuid, text)&lt;br /&gt;
from sqlalchemy.types import TypeEngine&lt;br /&gt;
&lt;br /&gt;
PRIMITIVE: dict[str, Callable[[RegisterField], TypeEngine]] = {&lt;br /&gt;
    &amp;quot;Число&amp;quot;: lambda f: Numeric(f.precision, f.scale),&lt;br /&gt;
    &amp;quot;Рядок&amp;quot;: lambda f: String(f.length),&lt;br /&gt;
    &amp;quot;Дата&amp;quot;: lambda f: DateTime(timezone=False),&lt;br /&gt;
    &amp;quot;Булево&amp;quot;: lambda f: Boolean(),&lt;br /&gt;
    &amp;quot;УНІ&amp;quot;: lambda f: Uuid(),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def columns_for_field(f: RegisterField, prefix: str) -&amp;gt; list[Column]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Одне поле метаданих -&amp;gt; 1..6 фізичних колонок (розділ 8.2).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if f.is_composite:                                   # складений тип: розділ 8.2.2&lt;br /&gt;
        return [&lt;br /&gt;
            Column(f&amp;quot;{prefix}_t&amp;quot;, SmallInteger, nullable=False),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_b&amp;quot;, Boolean),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_n&amp;quot;, Numeric(38, 10)),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_s&amp;quot;, String(f.max_string_len)),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_d&amp;quot;, DateTime),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_r&amp;quot;, Uuid),&lt;br /&gt;
        ]&lt;br /&gt;
    if f.is_reference:                                   # просте посилання&lt;br /&gt;
        return [Column(f&amp;quot;{prefix}_r&amp;quot;, Uuid, nullable=f.nullable)]&lt;br /&gt;
    base = f.base_type&lt;br /&gt;
    return [Column(prefix, PRIMITIVE[base](f), nullable=f.nullable)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def build_movement_table(reg: Register, md: MetaData) -&amp;gt; Table:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Метаопис -&amp;gt; Table. Розділи 8.4–8.7.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    cols: list[Column] = []&lt;br /&gt;
&lt;br /&gt;
    if reg.write_mode is WriteMode.SUBORDINATE:&lt;br /&gt;
        cols += [&lt;br /&gt;
            Column(&amp;quot;rec_t&amp;quot;, SmallInteger, nullable=False),&lt;br /&gt;
            Column(&amp;quot;rec_r&amp;quot;, Uuid, nullable=False),&lt;br /&gt;
            Column(&amp;quot;line_no&amp;quot;, Integer, nullable=False),&lt;br /&gt;
            Column(&amp;quot;active&amp;quot;, Boolean, nullable=False, server_default=text(&amp;quot;true&amp;quot;)),&lt;br /&gt;
        ]&lt;br /&gt;
    if reg.periodicity is not Periodicity.NONPERIODICAL:&lt;br /&gt;
        cols.append(Column(&amp;quot;period&amp;quot;, DateTime, nullable=False))&lt;br /&gt;
    if reg.kind is RegisterKind.ACCUMULATION and reg.accumulation_kind == &amp;quot;Balance&amp;quot;:&lt;br /&gt;
        cols.append(Column(&amp;quot;mvt&amp;quot;, SmallInteger, nullable=False))   # ВидРуху&lt;br /&gt;
    if reg.kind is RegisterKind.CALCULATION:&lt;br /&gt;
        cols += [Column(&amp;quot;calc_type_r&amp;quot;, Uuid, nullable=False),&lt;br /&gt;
                 Column(&amp;quot;reversal&amp;quot;, Boolean, nullable=False, server_default=text(&amp;quot;false&amp;quot;))]&lt;br /&gt;
        if reg.action_period:&lt;br /&gt;
            cols += [Column(&amp;quot;act_begin&amp;quot;, DateTime, nullable=False),&lt;br /&gt;
                     Column(&amp;quot;act_end&amp;quot;, DateTime, nullable=False)]&lt;br /&gt;
        if reg.base_period != &amp;quot;None&amp;quot;:&lt;br /&gt;
            cols += [Column(&amp;quot;base_begin&amp;quot;, DateTime), Column(&amp;quot;base_end&amp;quot;, DateTime)]&lt;br /&gt;
&lt;br /&gt;
    for f in reg.all_fields:                              # dimensions + resources + attributes&lt;br /&gt;
        cols += columns_for_field(f, reg.column_prefix(f))   # &#039;d3&#039;, &#039;r1&#039;, &#039;a2&#039;&lt;br /&gt;
&lt;br /&gt;
    t = Table(reg.physical_table, md, *cols,&lt;br /&gt;
              PrimaryKeyConstraint(*primary_key_columns(reg),&lt;br /&gt;
                                   name=f&amp;quot;pk_{reg.physical_table}&amp;quot;),&lt;br /&gt;
              postgresql_partition_by=partition_clause(reg))&lt;br /&gt;
&lt;br /&gt;
    for f in reg.dimensions:&lt;br /&gt;
        if f.index:&lt;br /&gt;
            Index(f&amp;quot;ix_{reg.physical_table}_{reg.column_prefix(f)}&amp;quot;,&lt;br /&gt;
                  *index_columns(reg, f),&lt;br /&gt;
                  postgresql_where=t.c.active if &amp;quot;active&amp;quot; in t.c else None)&lt;br /&gt;
    return t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;НФВ-16 / НФВ-17 (дві СКБД, ізольований шар діалекту) — у три рядки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from sqlalchemy.dialects import mssql, postgresql&lt;br /&gt;
from sqlalchemy.schema import CreateTable&lt;br /&gt;
&lt;br /&gt;
md = MetaData()&lt;br /&gt;
t = build_movement_table(reg_goods, md)&lt;br /&gt;
&lt;br /&gt;
print(CreateTable(t).compile(dialect=postgresql.dialect()))   # -&amp;gt; CREATE TABLE rg_a_0012 (...)&lt;br /&gt;
print(CreateTable(t).compile(dialect=mssql.dialect()))        # -&amp;gt; той самий об&#039;єкт у T-SQL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Це і є головний аргумент на користь Python у цьому проєкті.&#039;&#039;&#039; SQLAlchemy Core — фактично готовий «шар діалекту СКБД» (НФВ-17) і модель схеми, які в C#/Delphi довелося б писати самостійно. Разом із Alembic (Е10) і Pydantic (Е.1) це знімає ~1,5 чол.-міс. з етапів Е1 і Е10 (розділ 14.1).}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реалізація ФТ-К-02&#039;&#039;&#039; («Показати SQL» у конструкторі) — той самий виклик &amp;lt;code&amp;gt;CreateTable(t).compile(...)&amp;lt;/code&amp;gt;, виведений у UI.&lt;br /&gt;
&lt;br /&gt;
=== Е.3. Інкрементальне оновлення підсумків (етап Е3) ===&lt;br /&gt;
&lt;br /&gt;
Реалізація алгоритму 10.2 з дотриманням АП-1 (один запит на весь набір) і ФТ-34 (детермінований порядок проти дедлоків).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from operator import itemgetter&lt;br /&gt;
from collections.abc import Sequence&lt;br /&gt;
&lt;br /&gt;
from sqlalchemy import Connection, Table&lt;br /&gt;
from sqlalchemy.dialects.postgresql import insert as pg_insert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge_totals(conn: Connection, totals: Table, rows: list[dict],&lt;br /&gt;
                 key: Sequence[str], res: Sequence[str]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;АП-1 + АП-2: одна операція на весь набір дельт; складання виконує СКБД.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not rows:&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    rows.sort(key=itemgetter(*key))          # ФТ-34: детермінований порядок -&amp;gt; без дедлоків&lt;br /&gt;
&lt;br /&gt;
    stmt = pg_insert(totals).values(rows)&lt;br /&gt;
    stmt = stmt.on_conflict_do_update(&lt;br /&gt;
        index_elements=list(key),&lt;br /&gt;
        set_={r: totals.c[r] + stmt.excluded[r] for r in res},   # r1 = t.r1 + EXCLUDED.r1&lt;br /&gt;
    )&lt;br /&gt;
    conn.execute(stmt)                       # 1 round-trip незалежно від len(rows)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для MS SQL&#039;&#039;&#039; — той самий інтерфейс, інша реалізація (&amp;lt;code&amp;gt;MERGE ... WHEN MATCHED THEN UPDATE&amp;lt;/code&amp;gt;) за діалектним диспетчером. Ізоляція — на рівні функції, прикладний код не знає про діалект.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Чому НЕ ORM:&#039;&#039;&#039; ORM-варіант (&amp;lt;code&amp;gt;session.merge(obj)&amp;lt;/code&amp;gt; у циклі) дав би &amp;lt;code&amp;gt;len(rows)&amp;lt;/code&amp;gt; round-trip&#039;ів — пряме порушення АП-1 і зростання НФВ-04 на два порядки. Саме тому ORM заборонений у розділі 4.3.&lt;br /&gt;
&lt;br /&gt;
=== Е.4. Транслятор віртуальних таблиць (етап Е5) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from functools import lru_cache&lt;br /&gt;
&lt;br /&gt;
from lark import Lark, Transformer&lt;br /&gt;
from sqlalchemy import Select, func, literal, select, union_all&lt;br /&gt;
&lt;br /&gt;
GRAMMAR = r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    ?query        : &amp;quot;ВИБРАТИ&amp;quot;i select_list &amp;quot;З&amp;quot;i source [where] [group_by] [order_by]&lt;br /&gt;
    source        : virtual_table | plain_table&lt;br /&gt;
    virtual_table : REGISTER_PATH &amp;quot;.&amp;quot; VT_NAME &amp;quot;(&amp;quot; [vt_args] &amp;quot;)&amp;quot; [&amp;quot;ЯК&amp;quot;i alias]&lt;br /&gt;
    VT_NAME       : &amp;quot;Залишки&amp;quot;i | &amp;quot;Обороти&amp;quot;i | &amp;quot;ЗалишкиІОбороти&amp;quot;i&lt;br /&gt;
                  | &amp;quot;ЗрізОстанніх&amp;quot;i | &amp;quot;ЗрізПерших&amp;quot;i | &amp;quot;ОборотиДтКт&amp;quot;i&lt;br /&gt;
                  | &amp;quot;ДаніГрафіка&amp;quot;i | &amp;quot;ФактичнийПеріодДії&amp;quot;i | &amp;quot;БазаРозрахунку&amp;quot;i&lt;br /&gt;
    vt_args       : (expr | )  (&amp;quot;,&amp;quot; (expr | ))*        // позиційні, можуть бути порожні&lt;br /&gt;
    ...&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class QueryCompiler:&lt;br /&gt;
    def __init__(self, schema: SchemaRegistry) -&amp;gt; None:&lt;br /&gt;
        self._parser = Lark(GRAMMAR, parser=&amp;quot;lalr&amp;quot;, start=&amp;quot;query&amp;quot;)&lt;br /&gt;
        self._schema = schema&lt;br /&gt;
&lt;br /&gt;
    @lru_cache(maxsize=2048)                     # АП-4: кеш скомпільованих запитів&lt;br /&gt;
    def compile(self, text: str, param_signature: tuple[str, ...]) -&amp;gt; Select:&lt;br /&gt;
        tree = self._parser.parse(text)&lt;br /&gt;
        return _ToSQLAlchemy(self._schema).transform(tree)&lt;br /&gt;
&lt;br /&gt;
    def balances(self, reg: Register, period, conditions: list) -&amp;gt; Select:&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Реалізація алгоритму 10.3 в термінах SQLAlchemy Core.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        tb = self._schema.totals_balance(reg)&lt;br /&gt;
        mv = self._schema.movements(reg)&lt;br /&gt;
        dims = [tb.c[c] for c in self._schema.dimension_columns(reg)]&lt;br /&gt;
&lt;br /&gt;
        boundary = (select(func.coalesce(func.max(tb.c.period), MIN_PERIOD))&lt;br /&gt;
                    .where(tb.c.period &amp;lt;= period)&lt;br /&gt;
                    .scalar_subquery())&lt;br /&gt;
&lt;br /&gt;
        base = (select(*dims, *[func.sum(tb.c[r]).label(r) for r in reg.resource_columns])&lt;br /&gt;
                .where(tb.c.period == boundary, *conditions)      # ФТ-13: push-down&lt;br /&gt;
                .group_by(*dims))&lt;br /&gt;
&lt;br /&gt;
        signed = lambda c: case((mv.c.mvt == 0, mv.c[c]), else_=-mv.c[c])&lt;br /&gt;
        tail = (select(*[mv.c[d.name] for d in dims],&lt;br /&gt;
                       *[func.sum(signed(r)).label(r) for r in reg.resource_columns])&lt;br /&gt;
                .where(mv.c.active, mv.c.period &amp;gt; boundary, mv.c.period &amp;lt;= period, *conditions)&lt;br /&gt;
                .group_by(*[mv.c[d.name] for d in dims]))&lt;br /&gt;
&lt;br /&gt;
        u = union_all(base, tail).subquery()&lt;br /&gt;
        return (select(*[u.c[d.name] for d in dims],&lt;br /&gt;
                       *[func.sum(u.c[r]).label(f&amp;quot;{r}Залишок&amp;quot;) for r in reg.resource_columns])&lt;br /&gt;
                .group_by(*[u.c[d.name] for d in dims])&lt;br /&gt;
                .having(or_(*[func.sum(u.c[r]) != 0 for r in reg.resource_columns])))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ризик Р1 (немає мови запитів) на Python пом&#039;якшується:&#039;&#039;&#039; навіть якщо повноцінна мова запитів не буде реалізована в Е5, &amp;lt;code&amp;gt;QueryCompiler.balances()&amp;lt;/code&amp;gt; залишається придатним як програмний API — прикладний код викликає його напряму й отримує &amp;lt;code&amp;gt;Select&amp;lt;/code&amp;gt;, який можна далі з&#039;єднувати засобами SQLAlchemy Core. Це &#039;&#039;&#039;план «Б»&#039;&#039;&#039; для Р1, недоступний у мовах без подібної бібліотеки.&lt;br /&gt;
&lt;br /&gt;
=== Е.5. Витіснення: гарячий шлях за інтерфейсом (етапи Е7, Е11) ===&lt;br /&gt;
&lt;br /&gt;
Реалізація принципу АП-3 на найризикованішому вузлі (Р5 + Р10).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
from collections.abc import Callable, Sequence&lt;br /&gt;
from datetime import date, timedelta&lt;br /&gt;
from typing import Protocol&lt;br /&gt;
from uuid import UUID&lt;br /&gt;
&lt;br /&gt;
Interval = tuple[date, date]&lt;br /&gt;
ONE_DAY = timedelta(days=1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class DisplacementEngine(Protocol):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;АП-3. Бюджет (АП-4): &amp;lt;= 3 c на 10 тис. ключів × ~10 записів.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def compute(self,&lt;br /&gt;
                records: Sequence[CalcRecord],&lt;br /&gt;
                displaces: Callable[[UUID, UUID], bool]) -&amp;gt; dict[RecordKey, list[Interval]]:&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Повертає фактичні періоди дії для кожного запису (розділ 10.4).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def subtract(intervals: list[Interval], cut: Interval) -&amp;gt; list[Interval]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Різниця множин інтервалів. Найгарячіша функція платформи.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    out: list[Interval] = []&lt;br /&gt;
    cb, ce = cut&lt;br /&gt;
    for b, e in intervals:&lt;br /&gt;
        if ce &amp;lt; b or cb &amp;gt; e:                 # не перетинаються&lt;br /&gt;
            out.append((b, e))&lt;br /&gt;
            continue&lt;br /&gt;
        if b &amp;lt; cb:&lt;br /&gt;
            out.append((b, cb - ONE_DAY))    # «хвіст» зліва&lt;br /&gt;
        if e &amp;gt; ce:&lt;br /&gt;
            out.append((ce + ONE_DAY, e))    # «хвіст» справа&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class PyDisplacementEngine:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Еталонна реалізація. Заміна на Cython/Rust не змінює виклик (АП-3).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def compute(self, records, displaces):&lt;br /&gt;
        by_key: dict[DimKey, list[CalcRecord]] = defaultdict(list)&lt;br /&gt;
        for r in records:&lt;br /&gt;
            if r.active:&lt;br /&gt;
                by_key[r.dim_key].append(r)&lt;br /&gt;
&lt;br /&gt;
        result: dict[RecordKey, list[Interval]] = {}&lt;br /&gt;
        for Z in by_key.values():&lt;br /&gt;
            if len(Z) &amp;gt; 500:                 # розділ 10.4: перехід на sweep-line&lt;br /&gt;
                result |= SweepLineEngine().compute(Z, displaces)&lt;br /&gt;
                continue&lt;br /&gt;
            Z.sort(key=lambda r: (r.priority, r.period, r.line_no))&lt;br /&gt;
            for z in Z:&lt;br /&gt;
                intervals = [(z.act_begin, z.act_end)]&lt;br /&gt;
                for w in Z:&lt;br /&gt;
                    if w is z or not displaces(w.calc_type, z.calc_type):&lt;br /&gt;
                        continue&lt;br /&gt;
                    if not _registration_periods_intersect(w, z):&lt;br /&gt;
                        continue&lt;br /&gt;
                    intervals = subtract(intervals, (w.act_begin, w.act_end))&lt;br /&gt;
                    if not intervals:&lt;br /&gt;
                        break                # повністю витіснений&lt;br /&gt;
                result[z.key] = intervals&lt;br /&gt;
        return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Property-based тести (мітигація Р5 — найпомилковішого вузла):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from hypothesis import given&lt;br /&gt;
from hypothesis import strategies as st&lt;br /&gt;
&lt;br /&gt;
dates = st.dates(min_value=date(2020, 1, 1), max_value=date(2030, 12, 31))&lt;br /&gt;
intervals = st.lists(st.tuples(dates, dates).map(lambda t: tuple(sorted(t))), max_size=20)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@given(ivs=intervals, cut=st.tuples(dates, dates).map(lambda t: tuple(sorted(t))))&lt;br /&gt;
def test_subtract_invariants(ivs: list[Interval], cut: Interval) -&amp;gt; None:&lt;br /&gt;
    out = subtract(ivs, cut)&lt;br /&gt;
    assert all(b &amp;lt;= e for b, e in out), &amp;quot;некоректні межі&amp;quot;&lt;br /&gt;
    assert not any(_overlaps(i, cut) for i in out), &amp;quot;витіснений інтервал залишився&amp;quot;&lt;br /&gt;
    # збереження міри: те, що прибрали, дорівнює перетину з cut&lt;br /&gt;
    assert _measure(out) + _measure(_intersect_all(ivs, cut)) == _measure(ivs)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Бенчмарк як блокер приймання (АП-4):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
@pytest.mark.benchmark(group=&amp;quot;displacement&amp;quot;)&lt;br /&gt;
def test_displacement_budget(benchmark, records_10k_keys) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вводиться в CI з етапу Е7. Перевищення бюджету -&amp;gt; червоний білд.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    benchmark(PyDisplacementEngine().compute, records_10k_keys, displaces)&lt;br /&gt;
    assert benchmark.stats.stats.mean &amp;lt; 3.0, (&lt;br /&gt;
        f&amp;quot;Порушено бюджет АП-4: {benchmark.stats.stats.mean:.2f} c &amp;gt; 3.0 c. &amp;quot;&lt;br /&gt;
        f&amp;quot;Розгляньте sweep-line, Cython або перенесення у SQL (daterange + GiST).&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Е.6. Генерація &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів (ФТ-К-07, етап Е1) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проблема:&#039;&#039;&#039; поля регістру доступні динамічно (&amp;lt;code&amp;gt;rs.new(Номенклатура=…)&amp;lt;/code&amp;gt;), тому &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt; не бачить одруків і помилок типів — це і є ризик Р11.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Рішення:&#039;&#039;&#039; конструктор генерує стаби з метаопису при кожній зміні конфігурації.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# k2/generated/registers/ТовариНаСкладах.pyi   -- АВТОЗГЕНЕРОВАНО. Не редагувати.&lt;br /&gt;
from datetime import datetime&lt;br /&gt;
from decimal import Decimal&lt;br /&gt;
&lt;br /&gt;
from k2.catalogs import Номенклатура, Склади, ХарактеристикиНоменклатури&lt;br /&gt;
from k2.documents import ПрихіднаНакладна, ВведенняЗалишків&lt;br /&gt;
from k2.registers import AccumulationMovementType, Record, RecordSet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ТовариНаСкладахRecord(Record):&lt;br /&gt;
    Період: datetime&lt;br /&gt;
    ВидРуху: AccumulationMovementType&lt;br /&gt;
    Номенклатура: Номенклатура&lt;br /&gt;
    Склад: Склади&lt;br /&gt;
    Характеристика: ХарактеристикиНоменклатури | None&lt;br /&gt;
    Партія: ПрихіднаНакладна | ВведенняЗалишків | None      # складений тип&lt;br /&gt;
    Кількість: Decimal&lt;br /&gt;
    Сума: Decimal&lt;br /&gt;
    Коментар: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ТовариНаСкладахRecordSet(RecordSet[ТовариНаСкладахRecord]):&lt;br /&gt;
    def new(self, *, Період: datetime, ВидРуху: AccumulationMovementType,&lt;br /&gt;
            Номенклатура: Номенклатура, Склад: Склади,&lt;br /&gt;
            Характеристика: ХарактеристикиНоменклатури | None = None,&lt;br /&gt;
            Партія: ПрихіднаНакладна | ВведенняЗалишків | None = None,&lt;br /&gt;
            Кількість: Decimal = ..., Сума: Decimal = ...,&lt;br /&gt;
            Коментар: str = ...) -&amp;gt; ТовариНаСкладахRecord: ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що це ловить у CI ще до запуску:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Помилка прикладного коду !! Без стабів !! Зі стабами&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rs.new(Номенклатур=x)&amp;lt;/code&amp;gt; — одрук у назві поля || Виняток у рантаймі при проведенні на продуктиві || &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;: unexpected keyword argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;m.Кількість = &amp;quot;багато&amp;quot;&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;InvalidOperation&amp;lt;/code&amp;gt; при записі в БД || &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;: incompatible type &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt;, expected &amp;lt;code&amp;gt;Decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;m.Склад = номенклатура&amp;lt;/code&amp;gt; — переплутані посилання || FK-помилка або, гірше, тихо неправильні дані || &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;: incompatible type&lt;br /&gt;
|-&lt;br /&gt;
| Видалили вимірювання з метаданих, код лишився || Виняток при проведенні || Червоний білд одразу після зміни конфігурації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Автодоповнення в IDE&#039;&#039;&#039; — приємний побічний ефект, який частково компенсує відсутність повноцінного конфігуратора рівня 1С на ранніх етапах.&lt;br /&gt;
&lt;br /&gt;
=== Е.7. Автоматичний детектор порушень АП-1 (етап Е3, CI) ===&lt;br /&gt;
&lt;br /&gt;
Принцип АП-1 марний без механічної перевірки — розробник порушить його ненавмисно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# tests/architecture/test_ap1_no_row_by_row.py&lt;br /&gt;
&lt;br /&gt;
@pytest.mark.parametrize(&amp;quot;scenario&amp;quot;, POSTING_SCENARIOS)&lt;br /&gt;
def test_roundtrips_do_not_scale_with_rows(db_counter, scenario) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;АП-1: кількість звернень до СКБД НЕ залежить від кількості рядків документа.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with db_counter() as c10:&lt;br /&gt;
        scenario.build(rows=10).post()&lt;br /&gt;
    with db_counter() as c100:&lt;br /&gt;
        scenario.build(rows=100).post()&lt;br /&gt;
&lt;br /&gt;
    assert c100.roundtrips &amp;lt;= c10.roundtrips + 2, (&lt;br /&gt;
        f&amp;quot;{scenario.name}: звернень до БД зросло {c10.roundtrips} -&amp;gt; {c100.roundtrips} &amp;quot;&lt;br /&gt;
        f&amp;quot;при зростанні рядків у 10 разів. Порушення АП-1 — див. розділ 4.4.&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RowByRowGuard:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Runtime-запобіжник для dev/staging: виняток при &amp;gt;N однакових запитів у транзакції.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, threshold: int = 20) -&amp;gt; None:&lt;br /&gt;
        self._counts: Counter[str] = Counter()&lt;br /&gt;
        self._threshold = threshold&lt;br /&gt;
&lt;br /&gt;
    def before_execute(self, conn, clauseelement, *args) -&amp;gt; None:&lt;br /&gt;
        fingerprint = _statement_fingerprint(clauseelement)   # SQL без літералів&lt;br /&gt;
        self._counts[fingerprint] += 1&lt;br /&gt;
        if self._counts[fingerprint] == self._threshold:&lt;br /&gt;
            raise ArchitectureViolation(&lt;br /&gt;
                f&amp;quot;Один і той самий запит виконано {self._threshold} разів у межах транзакції.\n&amp;quot;&lt;br /&gt;
                f&amp;quot;Ймовірне порушення АП-1 («жодного рядка за раз»).\n{fingerprint}&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це — найдешевша страховка проєкту.&#039;&#039;&#039; Порушення АП-1 не видно на тестових даних (10 рядків — усе швидко) і катастрофічне на продуктиві (100 рядків × 5 регістрів). Детектор вводиться &#039;&#039;&#039;з етапу Е3&#039;&#039;&#039;, а не за результатами НТ-03.&lt;br /&gt;
&lt;br /&gt;
=== Е.8. Структура репозиторію ядра ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
k2-registers/&lt;br /&gt;
├── src/k2/&lt;br /&gt;
│   ├── metadata/          # Е.1: Pydantic-моделі, репозиторій, валідація&lt;br /&gt;
│   │   ├── models.py      #   Register, RegisterField, ...&lt;br /&gt;
│   │   ├── repository.py  #   md_* таблиці&lt;br /&gt;
│   │   └── validators.py  #   ФТ-К-01, антипатерни Д.10&lt;br /&gt;
│   ├── schema/            # Е.2: генерація DDL&lt;br /&gt;
│   │   ├── builder.py     #   метаопис -&amp;gt; SQLAlchemy Table&lt;br /&gt;
│   │   ├── dialects/      #   НФВ-17: postgres.py, mssql.py&lt;br /&gt;
│   │   └── restructure.py #   Е10: Alembic-інтеграція&lt;br /&gt;
│   ├── runtime/           # набори записів, проведення, блокування&lt;br /&gt;
│   │   ├── recordset.py&lt;br /&gt;
│   │   ├── posting.py     #   розділ 7.1&lt;br /&gt;
│   │   ├── totals.py      #   Е.3: merge_totals&lt;br /&gt;
│   │   └── locks.py       #   ФТ-32&lt;br /&gt;
│   ├── query/             # Е.4: lark-граматика + компілятор&lt;br /&gt;
│   │   ├── grammar.lark&lt;br /&gt;
│   │   ├── compiler.py&lt;br /&gt;
│   │   └── virtual/       #   balances.py, turnovers.py, slices.py, calc_base.py&lt;br /&gt;
│   ├── calculation/       # Е.5: витіснення (гарячий шлях)&lt;br /&gt;
│   │   ├── protocols.py   #   DisplacementEngine&lt;br /&gt;
│   │   ├── engine_py.py   #   еталонна реалізація&lt;br /&gt;
│   │   └── engine_native/ #   [резерв] Cython/Rust — тільки за результатом бенчмарку&lt;br /&gt;
│   ├── codegen/           # Е.6: генерація .pyi-стабів&lt;br /&gt;
│   └── diagnostics/       # Е.7: RowByRowGuard, перевірка цілісності (ФТ-41)&lt;br /&gt;
├── tests/&lt;br /&gt;
│   ├── unit/&lt;br /&gt;
│   ├── property/          # hypothesis: інтервальна арифметика (Р5)&lt;br /&gt;
│   ├── architecture/      # Е.7: детектор АП-1&lt;br /&gt;
│   ├── benchmarks/        # АП-4: бюджети гарячих шляхів (gate у CI)&lt;br /&gt;
│   └── integration/       # testcontainers: PostgreSQL + MS SQL (Р7)&lt;br /&gt;
└── pyproject.toml         # uv, ruff, mypy --strict&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;Кінець документа. Версія 1.2. Підлягає узгодженню з архітектором платформи K2 ERP до затвердження.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2760</id>
		<title>Регістри в K2 ERP</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2760"/>
		<updated>2026-07-17T19:27:49Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ТЗ. Підсистема регістрів K2 ERP}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= 1. Паспорт документа =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Атрибут !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Назва || Технічне завдання на розробку підсистеми «Регістри» платформи K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| Шифр || K2-ERP-TZ-REG-001&lt;br /&gt;
|-&lt;br /&gt;
| Версія || 1.2 (чернетка на узгодження; мова ядра — Python; +Додатки Д, Е)&lt;br /&gt;
|-&lt;br /&gt;
| Статус || На розгляді&lt;br /&gt;
|-&lt;br /&gt;
| Замовник || &#039;&#039;[підрозділ-замовник]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Виконавець || &#039;&#039;[команда платформи K2 ERP]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Тип документа || Технічне завдання (ГОСТ 34.602 адаптовано)&lt;br /&gt;
|-&lt;br /&gt;
| Аналог / прототип || Механізм регістрів платформи «1С:Підприємство 8.3»&lt;br /&gt;
|-&lt;br /&gt;
| Мова розробки || &#039;&#039;&#039;Python 3.12+&#039;&#039;&#039; (див. розділ 4.3)&lt;br /&gt;
|-&lt;br /&gt;
| Технологічний стек || SQLAlchemy Core 2.x, Pydantic v2, Alembic, lark, psycopg 3 / pyodbc&lt;br /&gt;
|-&lt;br /&gt;
| СКБД || PostgreSQL 14+ (основна), MS SQL Server 2019+ (додаткова)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 1.1. Необхідні розширення MediaWiki ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Розширення !! Теги / шаблони !! Використано в документі !! Постачання&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Extension:Diagrams&#039;&#039;&#039; || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graphviz&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;uml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || 4 діаграми GraphViz + 5 діаграм PlantUML || Composer: &amp;lt;code&amp;gt;samwilson/diagrams&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Extension:SyntaxHighlight || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || 64 блоки коду (Python, SQL, YAML, lark) || &#039;&#039;&#039;Входить до складу MediaWiki&#039;&#039;&#039; — окремо встановлювати не потрібно&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Template:Note&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Note|текст}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; || Примітки та проєктні рішення || Створюється вручну (код нижче)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Налаштування ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
// LocalSettings.php — конфігурація ВІКІ, у якій публікується це ТЗ.&lt;br /&gt;
// MediaWiki написана на PHP; до мови розробки K2 ERP (Python, розділ 4.3) це не стосується.&lt;br /&gt;
wfLoadExtension( &#039;Diagrams&#039; );&lt;br /&gt;
&lt;br /&gt;
// ОБОВ&#039;ЯЗКОВО. За замовчуванням Diagrams рендерить у PNG; ER-діаграми розділу 9&lt;br /&gt;
// містять десятки колонок і в растрі нечитабельні.&lt;br /&gt;
$wgDiagramsDefaultFormat = &#039;svg&#039;;&lt;br /&gt;
&lt;br /&gt;
// Варіант А — локальний рендеринг (потрібні бінарники на веб-сервері):&lt;br /&gt;
//   apt install graphviz plantuml&lt;br /&gt;
// Варіант Б — зовнішній сервіс рендерингу (з версії 0.4.0 — опційний):&lt;br /&gt;
// $wgDiagramsServiceUrl = &#039;https://diagrams.example.com/subdir&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Шаблон &amp;lt;code&amp;gt;Template:Note&amp;lt;/code&amp;gt;, якщо його немає у вікі:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #36c; background:#eaf3ff; padding:8px 12px; margin:8px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ⓘ&#039;&#039;&#039; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Застереження щодо Extension:Diagrams ===&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Перевірити до затвердження документа.&#039;&#039;&#039; Станом на дату складання ТЗ офіційна сторінка розширення вказує: статус — &#039;&#039;&#039;beta&#039;&#039;&#039;, остання версія &#039;&#039;&#039;0.10.0 від 12.06.2022&#039;&#039;&#039;, задекларована сумісність &#039;&#039;&#039;MediaWiki 1.34–1.39&#039;&#039;&#039;. Політика розширення — «master зберігає зворотну сумісність», тож на новіших версіях (1.43 LTS і далі) воно, найімовірніше, працює, але це &#039;&#039;&#039;не підтверджено&#039;&#039;&#039; і підлягає перевірці на цільовій корпоративній вікі. Актуальний стан — &amp;lt;nowiki&amp;gt;https://www.mediawiki.org/wiki/Extension:Diagrams&amp;lt;/nowiki&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Тег PlantUML називається &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;uml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&#039;&#039;&#039;, а не &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;plantuml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; (як в окремому Extension:PlantUML). Розмітка документа використовує саме &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;uml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
=== Альтернативи та запасний варіант ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Варіант !! Оцінка&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Extension:Diagrams&#039;&#039;&#039; &#039;&#039;(обрано)&#039;&#039; || Одне розширення на обидва формати; не зберігає рендери як файли вікі; є дві реалізації сервісу рендерингу — PHP (Symfony) та &#039;&#039;&#039;Python&#039;&#039;&#039; (остання узгоджується зі стеком проєкту, розділ 4.3). Мінус — beta-статус і питання сумісності вище.&lt;br /&gt;
|-&lt;br /&gt;
| Extension:GraphViz + Extension:PlantUML окремо || &#039;&#039;&#039;Не рекомендується.&#039;&#039;&#039; Extension:GraphViz за даними трекера Wikimedia не підтримується й потребує правок для роботи з актуальними версіями MediaWiki. Два розширення замість одного.&lt;br /&gt;
|-&lt;br /&gt;
| Mermaid (&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;mermaid&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; у Diagrams або Extension:Mermaid) || Рендериться на клієнті, не потребує бінарників. Але &amp;lt;code&amp;gt;erDiagram&amp;lt;/code&amp;gt; Mermaid суттєво менш виразний за &amp;lt;code&amp;gt;entity&amp;lt;/code&amp;gt; PlantUML: ER-моделі розділу 9 містять типи, ознаки PK/FK та коментарі до полів — це не переноситься без втрат. Придатний як запасний варіант для простих схем (5.1, Д.1).&lt;br /&gt;
|-&lt;br /&gt;
| Без розширень || Блоки діаграм відображатимуться як вихідний текст. Документ залишається читабельним: ключові механізми продубльовані ASCII-схемами (розділи 6.1, 7.4.1, 7.5.1, 8.8, Д.9, Е.8).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 2. Терміни, визначення та скорочення =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Термін !! Визначення&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Регістр&#039;&#039;&#039; || Об&#039;єкт метаданих, призначений для зберігання та накопичення структурованої облікової інформації у вигляді записів фіксованої структури, з механізмами агрегації, зрізів і транзакційного зв&#039;язку з документами-реєстраторами.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РВ&#039;&#039;&#039; || Регістр відомостей (аналог «Регистр сведений»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН&#039;&#039;&#039; || Регістр накопичення (аналог «Регистр накопления»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РБ&#039;&#039;&#039; || Регістр бухгалтерії (аналог «Регистр бухгалтерии»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РР&#039;&#039;&#039; || Регістр розрахунку (аналог «Регистр расчёта»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Вимірювання&#039;&#039;&#039; (Dimension) || Поле регістру, що визначає розріз аналітики; входить у ключ запису/підсумку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ресурс&#039;&#039;&#039; (Resource) || Поле регістру, значення якого підсумовується (для РН/РБ/РР) або зберігається як значення (для РВ).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реквізит&#039;&#039;&#039; (Attribute) || Довідкове поле запису, що не бере участі в ключі та не агрегується.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реєстратор&#039;&#039;&#039; (Recorder) || Документ, який породив набір записів регістру та володіє ним.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рухи&#039;&#039;&#039; (Movements) || Записи регістру, підпорядковані конкретному реєстратору.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Набір записів&#039;&#039;&#039; (RecordSet) || Прикладний об&#039;єкт для читання/запису групи записів регістру за заданим відбором.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Підсумки&#039;&#039;&#039; (Totals) || Попередньо розраховані агрегати (залишки/обороти), що зберігаються в окремих таблицях.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ТА&#039;&#039;&#039; || Точка актуальності підсумків — момент часу, до якого підсумки розраховані.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Зріз останніх&#039;&#039;&#039; (SliceLast) || Вибірка останніх за періодом записів РВ у розрізі кожної комбінації вимірювань.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Субконто&#039;&#039;&#039; (ExtDimension, ED) || Додатковий розріз аналітики бухгалтерського рахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ПВР&#039;&#039;&#039; || План видів розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витіснення&#039;&#039;&#039; || Механізм РР: запис із вищим пріоритетом скорочує фактичний період дії запису з нижчим.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (Recalculation) || Підпорядкований РР об&#039;єкт, що реєструє записи, які потребують повторного розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Віртуальна таблиця&#039;&#039;&#039; || Обчислювана таблиця в мові запитів, що не має фізичного відповідника (Залишки, Обороти, ЗрізОстанніх тощо).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 3. Призначення, цілі та підстава розробки =&lt;br /&gt;
&lt;br /&gt;
== 3.1. Підстава ==&lt;br /&gt;
Поточна модель K2 ERP не має уніфікованого декларативного механізму накопичувального обліку. Регістроподібні структури реалізуються &#039;&#039;ad hoc&#039;&#039; — окремими таблицями та процедурами під кожну прикладну задачу, що спричиняє:&lt;br /&gt;
* дублювання коду розрахунку залишків та оборотів;&lt;br /&gt;
* відсутність гарантованої узгодженості «документ ↔ рухи»;&lt;br /&gt;
* деградацію продуктивності на великих обсягах (повний перерахунок з початку обліку);&lt;br /&gt;
* високу вартість введення нової аналітики (зміна схеми БД + правка десятків процедур).&lt;br /&gt;
&lt;br /&gt;
== 3.2. Мета ==&lt;br /&gt;
Створити в K2 ERP підсистему &#039;&#039;&#039;декларативно описуваних регістрів&#039;&#039;&#039; чотирьох типів, функціонально еквівалентну механізму регістрів «1С:Підприємство 8.3», з автоматичною генерацією схеми БД, підтримкою підсумків, віртуальних таблиць у мові запитів і транзакційного проведення документів.&lt;br /&gt;
&lt;br /&gt;
== 3.3. Цілі проєкту (вимірювані) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Ціль !! Критерій досягнення&lt;br /&gt;
|-&lt;br /&gt;
| Ц1 || Декларативне визначення регістру || Новий регістр з 5 вимірюваннями та 3 ресурсами створюється в конструкторі без написання коду; DDL генерується автоматично.&lt;br /&gt;
|-&lt;br /&gt;
| Ц2 || Автоматична агрегація || Залишки/обороти доступні запитом без ручних процедур перерахунку.&lt;br /&gt;
|-&lt;br /&gt;
| Ц3 || Продуктивність || Отримання залишків на дату за таблицею 1 млрд рухів — ≤ 200 мс (P95) на еталонному стенді.&lt;br /&gt;
|-&lt;br /&gt;
| Ц4 || Цілісність || Неможливість існування рухів без активного реєстратора (100 % сценаріїв у тесті цілісності).&lt;br /&gt;
|-&lt;br /&gt;
| Ц5 || Міграція || Перенесення ≥ 90 % наявних «регістроподібних» структур K2 на новий механізм без втрати даних.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3.4. Що НЕ входить до обсягу (Out of scope) ==&lt;br /&gt;
* Механізм розподілених інформаційних баз / реплікації рухів (окреме ТЗ).&lt;br /&gt;
* Візуальний конструктор звітів поверх регістрів (окреме ТЗ, залежність).&lt;br /&gt;
* OLAP-куби та зовнішні аналітичні вітрини.&lt;br /&gt;
* Автоматичне перенесення прикладного коду замовника (тільки дані + мапінг).&lt;br /&gt;
&lt;br /&gt;
= 4. Припущення та обмеження щодо платформи K2 ERP =&lt;br /&gt;
&lt;br /&gt;
{{Note|Розділ фіксує припущення, які &#039;&#039;&#039;обов&#039;язково&#039;&#039;&#039; підлягають верифікації з архітектором платформи до затвердження ТЗ. Місця, що потребують уточнення, позначені як &#039;&#039;[уточнити]&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
== 4.1. Припущення щодо платформи ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Припущення !! Наслідок для ТЗ&lt;br /&gt;
|-&lt;br /&gt;
| П1 || K2 ERP має підсистему метаданих із власним репозиторієм об&#039;єктів (документи, довідники, перерахування) і механізмом версіонування конфігурації. || Регістр вбудовується як новий &#039;&#039;&#039;рід&#039;&#039;&#039; об&#039;єкта метаданих у наявний репозиторій (розділ 6).&lt;br /&gt;
|-&lt;br /&gt;
| П2 || Об&#039;єкти-документи мають унікальний ідентифікатор посилання (GUID/UUID) та проведення як окрему операцію. || Реєстратор адресується парою «код типу + UUID» (розділ 8.2).&lt;br /&gt;
|-&lt;br /&gt;
| П3 || Платформа має власну мову запитів або транслятор у SQL. || Віртуальні таблиці реалізуються на рівні транслятора (розділ 7.6). Якщо мови запитів немає — потрібен окремий етап Е0 (розділ 14).&lt;br /&gt;
|-&lt;br /&gt;
| П4 || Цільова СКБД підтримує &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;INSERT ... ON CONFLICT&amp;lt;/code&amp;gt;, віконні функції, часткові та покривні індекси. || Алгоритми підсумків (розділ 10) використовують ці можливості.&lt;br /&gt;
|-&lt;br /&gt;
| П5 || Прикладний код виконується на сервері застосунків із керованими транзакціями. || Проведення документа — одна транзакція БД (розділ 7.1).&lt;br /&gt;
|-&lt;br /&gt;
| П6 || Максимальна довжина ідентифікатора об&#039;єкта БД — 63 символи (PostgreSQL). || Фізичні імена таблиць будуються за сурогатним числовим кодом, а не за іменем регістру (розділ 8.1).&lt;br /&gt;
|-&lt;br /&gt;
| П7 || Ядро платформи розробляється на &#039;&#039;&#039;Python 3.12+&#039;&#039;&#039;; допускаються C-розширення (binary-драйвери) та, за потреби, власні нативні модулі. || Визначає стек (4.3) і архітектурні принципи АП-1…АП-6 (4.4). &#039;&#039;[верифікувати: greenfield чи є наявний Python-код K2]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| П8 || Прикладний (конфігураційний) код пишеться &#039;&#039;&#039;також на Python&#039;&#039;&#039; і виконується в тому самому процесі. || Породжує питання ізоляції та безпеки виконання довільного коду — &#039;&#039;&#039;відкрите питання В12&#039;&#039;&#039;. Якщо припущення хибне (потрібна вбудована мова) — обсяг Е1 зростає на ~2 чол.-міс.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 4.2. Обмеження ==&lt;br /&gt;
&lt;br /&gt;
* О1. Зміна складу вимірювань/ресурсів існуючого регістру — операція реструктуризації з простоєм; онлайн-міграція не гарантується для таблиць &amp;gt; 100 млн записів.&lt;br /&gt;
* О2. Підсистема не гарантує коректність прикладної логіки проведення — лише цілісність механізму.&lt;br /&gt;
* О3. Мінімальна дискретність періоду — 1 секунда (тип &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt;) &#039;&#039;[уточнити: чи потрібна мілісекундна]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== 4.3. Технологічний стек ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шар !! Технологія !! Обґрунтування вибору&lt;br /&gt;
|-&lt;br /&gt;
| Мова ядра || &#039;&#039;&#039;Python 3.12+&#039;&#039;&#039; (цільова 3.12; щодо 3.13 — див. В14) || Рішення замовника. Наслідки — розділ 4.4.&lt;br /&gt;
|-&lt;br /&gt;
| Статична типізація || &amp;lt;code&amp;gt;mypy --strict&amp;lt;/code&amp;gt; як gate у CI || Ядро метаданих у динамічній мові без статичної перевірки — неприйнятний ризик (Р11).&lt;br /&gt;
|-&lt;br /&gt;
| Опис і валідація метаданих || &#039;&#039;&#039;Pydantic v2&#039;&#039;&#039; || Маніфест регістру (розділ 6.7) стає типізованою моделлю: валідація, крос-полеві правила та JSON Schema для конструктора — «безкоштовно». Покриває ФТ-К-01. Приклад — Е.1.&lt;br /&gt;
|-&lt;br /&gt;
| Генерація DDL, абстракція діалектів СКБД || &#039;&#039;&#039;SQLAlchemy Core 2.x&#039;&#039;&#039; (&#039;&#039;без ORM&#039;&#039;) || Ключовий вибір. &amp;lt;code&amp;gt;MetaData&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Table&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Column&amp;lt;/code&amp;gt; — готова модель схеми; діалекти PostgreSQL і MS SQL із коробки. Прямо закриває НФВ-16, НФВ-17 і знижує ризик Р7. Приклад — Е.2.&lt;br /&gt;
|-&lt;br /&gt;
| Міграції / реструктуризація || &#039;&#039;&#039;Alembic&#039;&#039;&#039; || Автогенерація &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt; при зміні складу полів (Е10, НФВ-13, НФВ-15).&lt;br /&gt;
|-&lt;br /&gt;
| Драйвери || &#039;&#039;&#039;psycopg 3&#039;&#039;&#039; (binary, pipeline mode) або &amp;lt;code&amp;gt;asyncpg&amp;lt;/code&amp;gt;; &amp;lt;code&amp;gt;pyodbc&amp;lt;/code&amp;gt; для MS SQL || Pipeline mode критичний для АП-1: пакетна вставка без round-trip на рядок.&lt;br /&gt;
|-&lt;br /&gt;
| Парсер мови запитів || &#039;&#039;&#039;lark&#039;&#039;&#039; (LALR) → AST → SQLAlchemy Core || Етап Е5. Дешевше за власний парсер; граматика декларативна. Ескіз — Е.4.&lt;br /&gt;
|-&lt;br /&gt;
| Гарячі шляхи || &#039;&#039;&#039;Cython&#039;&#039;&#039; / &amp;lt;code&amp;gt;mypyc&amp;lt;/code&amp;gt;; за потреби &#039;&#039;&#039;Rust&#039;&#039;&#039; (PyO3 + maturin) || Тільки за результатами бенчмарку (АП-3, Р10, В13).&lt;br /&gt;
|-&lt;br /&gt;
| Сервер застосунків || FastAPI + uvicorn; окремий пул процесів для проведення || —&lt;br /&gt;
|-&lt;br /&gt;
| Паралелізм || &#039;&#039;&#039;Процеси&#039;&#039;&#039; + &amp;lt;code&amp;gt;asyncio&amp;lt;/code&amp;gt; для IO. &#039;&#039;&#039;Потоки — ні&#039;&#039;&#039; (GIL) || Принцип АП-5.&lt;br /&gt;
|-&lt;br /&gt;
| Тестування || pytest, pytest-benchmark, &#039;&#039;&#039;hypothesis&#039;&#039;&#039; (property-based), testcontainers || Hypothesis обов&#039;язковий для витіснення (Р5): інтервальна арифметика — ідеальний кандидат на property-based тести.&lt;br /&gt;
|-&lt;br /&gt;
| Профілювання || py-spy, scalene, &amp;lt;code&amp;gt;EXPLAIN (ANALYZE, BUFFERS)&amp;lt;/code&amp;gt; || Етап Е11.&lt;br /&gt;
|-&lt;br /&gt;
| Збірка || uv, ruff, wheels із нативними розширеннями під усі цільові платформи || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Явні заборони:&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;ORM SQLAlchemy не використовується.&#039;&#039;&#039; Регістри працюють наборами записів, а не об&#039;єктами; identity map і lazy loading тут шкідливі й провокують порушення АП-1. Використовується &#039;&#039;&#039;лише Core&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;PyPy не розглядається&#039;&#039;&#039; — несумісність із binary-драйверами та нативними розширеннями.&lt;br /&gt;
* &#039;&#039;&#039;Free-threaded build (PEP 703)&#039;&#039;&#039; — моніторити, але не закладати в архітектуру (В14).&lt;br /&gt;
&lt;br /&gt;
== 4.4. Наслідки вибору Python: архітектурні принципи ==&lt;br /&gt;
&lt;br /&gt;
Python на CPU-навантаженні повільніший за компільовані мови приблизно в 30–80 разів. Проєктована архітектура цьому &#039;&#039;&#039;не суперечить&#039;&#039;&#039;: основну роботу виконує СКБД, а ядро лише формує SQL. Але це вірно &#039;&#039;&#039;тільки за умови&#039;&#039;&#039; дотримання наведених принципів — їх порушення робить цілі НФВ недосяжними.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Принцип !! Формулювання&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-1&#039;&#039;&#039; || &#039;&#039;&#039;«Жодного рядка за раз»&#039;&#039;&#039; || &#039;&#039;&#039;Заборонено:&#039;&#039;&#039; цикл Python із запитом до БД усередині; вставка рухів по одному; читання підсумків по одному ключу. &#039;&#039;&#039;Обов&#039;язково:&#039;&#039;&#039; &amp;lt;code&amp;gt;executemany&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt; / pipeline, set-based &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;, один запит на набір записів. Детектор порушень — Е.7.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-2&#039;&#039;&#039; || &#039;&#039;&#039;Ядро — оркестратор, СКБД — обчислювач&#039;&#039;&#039; || Python формує SQL і передає керування. Агрегація, з&#039;єднання, сортування — в СКБД. Виняток — гарячі шляхи АП-4, де це неможливо.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-3&#039;&#039;&#039; || &#039;&#039;&#039;Гарячі шляхи ізольовані за інтерфейсом&#039;&#039;&#039; || Кожен кандидат на нативне переписування реалізується за &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt;-інтерфейсом з еталонною Python-реалізацією та бенчмарком у CI. Заміна на Cython/Rust не змінює виклик. Приклад — Е.5.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-4&#039;&#039;&#039; || &#039;&#039;&#039;Бюджет Python-часу зафіксовано&#039;&#039;&#039; || Див. 4.4.1. Перевищення бюджету — блокер приймання етапу.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-5&#039;&#039;&#039; || &#039;&#039;&#039;Паралелізм — процесами&#039;&#039;&#039; || GIL робить потоки марними для CPU-роботи. Проведення IO-bound → &amp;lt;code&amp;gt;asyncio&amp;lt;/code&amp;gt;; масштабування — пулом процесів за кількістю ядер.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;АП-6&#039;&#039;&#039; || &#039;&#039;&#039;Типізація на межах&#039;&#039;&#039; || &amp;lt;code&amp;gt;mypy --strict&amp;lt;/code&amp;gt; на ядрі; Pydantic v2 на всіх межах. Динамічний доступ до полів регістру компенсується генерацією &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів (ФТ-К-07, Е.6).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4.1. Бюджет Python-часу на гарячих шляхах (АП-4) ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шлях !! Розділ !! Обсяг операцій !! Оцінка Python !! Ризик !! Мітигація&lt;br /&gt;
|-&lt;br /&gt;
| Формування рухів документа (100 рядків × 5 регістрів) || 7.1, Д.8 || ~500 конструювань об&#039;єктів || 2–5 мс || Низький || —&lt;br /&gt;
|-&lt;br /&gt;
| Серіалізація рухів у пакетну вставку || 7.1 || ~500 кортежів || 1–3 мс || Низький || psycopg 3 pipeline / &amp;lt;code&amp;gt;COPY&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Оновлення підсумків || 10.2 || 1 SQL &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt; на регістр || ≈ 0 мс || Низький || set-based (Е.3)&lt;br /&gt;
|-&lt;br /&gt;
| Трансляція віртуальної таблиці || 7.3, 10.3 || парсинг + побудова AST || 1–10 мс || Середній || LRU-кеш скомпільованих запитів за хешем (текст + сигнатура параметрів)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витіснення періодів дії&#039;&#039;&#039; || 10.4 || O(\|Z\|²) на ключ; 10 тис. ключів × ~10 записів ≈ 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; інтервальних операцій || &#039;&#039;&#039;1–3 с&#039;&#039;&#039; || &#039;&#039;&#039;Високий&#039;&#039;&#039; || Sweep-line O(n log n); ізоляція за АП-3; кандидат №1 на Cython/Rust; альтернатива — перенести в SQL на &amp;lt;code&amp;gt;daterange&amp;lt;/code&amp;gt; + GiST (PostgreSQL)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Розрахунок ЗП&#039;&#039;&#039; || Д.9 || 80 тис. записів × формула || &#039;&#039;&#039;4–15 с&#039;&#039;&#039; || &#039;&#039;&#039;Високий&#039;&#039;&#039; || Заборона per-record запитів (АП-1); векторизація; кандидат №2 на нативний код&lt;br /&gt;
|-&lt;br /&gt;
| Реєстрація перерахунків || 10.5 || 1 SQL &amp;lt;code&amp;gt;INSERT … SELECT&amp;lt;/code&amp;gt; || ≈ 0 мс || Низький || set-based&lt;br /&gt;
|-&lt;br /&gt;
| Генерація DDL, реструктуризація || 8, Е.2 || холодний шлях, разова операція || — || Низький || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 4.4.2. Висновок щодо НФВ ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! НФВ !! Ціль !! Частка Python !! Вердикт&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01…03 (залишки, обороти) || 200 мс – 2 с || &amp;lt; 1 % (робота в СКБД) || &#039;&#039;&#039;Не залежить від мови ядра&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-04 (проведення 100 рядків) || 300 мс || 5–15 мс ≈ &#039;&#039;&#039;5 %&#039;&#039;&#039; || Досяжно за дотримання АП-1&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-05 (ОСВ) || 5 с || &amp;lt; 1 % || Не залежить від мови ядра&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-06 (ЗП на 10 тис. осіб) || 10 хв || 4–15 с ≈ &#039;&#039;&#039;2,5 %&#039;&#039;&#039; || Досяжно; &#039;&#039;&#039;запас ×40&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-07 (зріз останніх) || 500 мс || &amp;lt; 1 % || Не залежить від мови ядра&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-08 (50 док/с) || — || 50 × 10 мс = 0,5 с CPU/с ≈ &#039;&#039;&#039;50 % одного ядра&#039;&#039;&#039; || Досяжно; пул процесів (АП-5)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-09 (перерахунок підсумків) || 4 год || &amp;lt; 1 % || Не залежить від мови ядра&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумок:&#039;&#039;&#039; цілі НФВ &#039;&#039;&#039;не переглядаються&#039;&#039;&#039; у зв&#039;язку з вибором Python. Натомість вводиться жорстка вимога АП-1 — її порушення робить цілі недосяжними на &#039;&#039;будь-якій&#039;&#039; мові, просто на Python розплата настає на порядок раніше й помітніше.&lt;br /&gt;
&lt;br /&gt;
= 5. Класифікація регістрів =&lt;br /&gt;
&lt;br /&gt;
== 5.1. Дерево типів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Registers {&lt;br /&gt;
  rankdir=TB;&lt;br /&gt;
  bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fillcolor=&amp;quot;#f5f5f5&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=10];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  R [label=&amp;quot;РЕГІСТР\n(абстрактний об&#039;єкт метаданих)&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI [label=&amp;quot;Регістр відомостей\n(РВ / Information)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA [label=&amp;quot;Регістр накопичення\n(РН / Accumulation)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RB [label=&amp;quot;Регістр бухгалтерії\n(РБ / Accounting)&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RC [label=&amp;quot;Регістр розрахунку\n(РР / Calculation)&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  R -&amp;gt; RI; R -&amp;gt; RA; R -&amp;gt; RB; R -&amp;gt; RC;&lt;br /&gt;
&lt;br /&gt;
  RI_np [label=&amp;quot;Неперіодичний&amp;quot;];&lt;br /&gt;
  RI_p  [label=&amp;quot;Періодичний&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_np; RI -&amp;gt; RI_p;&lt;br /&gt;
&lt;br /&gt;
  RI_i [label=&amp;quot;Незалежний\n(режим запису)&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI_s [label=&amp;quot;Підпорядкований\nреєстратору&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_i [style=dashed]; RI -&amp;gt; RI_s [style=dashed];&lt;br /&gt;
&lt;br /&gt;
  RA_b [label=&amp;quot;Вид: Залишки\n(Balance)&amp;quot;];&lt;br /&gt;
  RA_t [label=&amp;quot;Вид: Обороти\n(Turnover)&amp;quot;];&lt;br /&gt;
  RA -&amp;gt; RA_b; RA -&amp;gt; RA_t;&lt;br /&gt;
&lt;br /&gt;
  RB_c [label=&amp;quot;З кореспонденцією\n(подвійний запис)&amp;quot;];&lt;br /&gt;
  RB_n [label=&amp;quot;Без кореспонденції\n(уніграфічний)&amp;quot;];&lt;br /&gt;
  RB -&amp;gt; RB_c; RB -&amp;gt; RB_n;&lt;br /&gt;
&lt;br /&gt;
  RC_a [label=&amp;quot;З періодом дії\n(+ витіснення)&amp;quot;];&lt;br /&gt;
  RC_b [label=&amp;quot;З базовим періодом\n(+ база розрахунку)&amp;quot;];&lt;br /&gt;
  RC_g [label=&amp;quot;З графіком часу&amp;quot;];&lt;br /&gt;
  RC -&amp;gt; RC_a; RC -&amp;gt; RC_b; RC -&amp;gt; RC_g;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5.2. Порівняльна матриця типів ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Характеристика !! РВ !! РН (Залишки) !! РН (Обороти) !! РБ !! РР&lt;br /&gt;
|-&lt;br /&gt;
| Ключ запису || Вимірювання (+Період) або Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№&lt;br /&gt;
|-&lt;br /&gt;
| Незалежний запис || &#039;&#039;&#039;Так&#039;&#039;&#039; || Ні || Ні || Ні || Ні&lt;br /&gt;
|-&lt;br /&gt;
| Періодичність || Опційна || Обов&#039;язкова (Період) || Обов&#039;язкова || Обов&#039;язкова || Обов&#039;язкова&lt;br /&gt;
|-&lt;br /&gt;
| Ресурси підсумовуються || Ні || Так (±) || Так (+) || Так (Дт/Кт) || Так&lt;br /&gt;
|-&lt;br /&gt;
| Вид руху (Прихід/Витрата) || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || Дт/Кт || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця залишків || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця оборотів || — || Так (опц.) || &#039;&#039;&#039;Так&#039;&#039;&#039; || Так || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із планом рахунків || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із ПВР || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Період дії / витіснення || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Базовий період || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Графік часу || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Субконто || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерахунки || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Типові приклади || Курси валют, ціни, кадрова історія, графік роботи || Товари на складах, взаєморозрахунки || Продажі, витрати за статтями || Госпрозрахунковий, управлінський, податковий облік || Нарахування ЗП, утримання&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 6. Метамодель: як регістр задається =&lt;br /&gt;
&lt;br /&gt;
== 6.1. Місце в репозиторії метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Конфігурація K2 ERP&lt;br /&gt;
├── Довідники&lt;br /&gt;
├── Документи&lt;br /&gt;
├── Плани рахунків              ← використовується РБ&lt;br /&gt;
├── Плани видів характеристик   ← використовується як тип субконто / вимірювання&lt;br /&gt;
├── Плани видів розрахунку      ← використовується РР&lt;br /&gt;
└── Регістри                    ◄── НОВИЙ РОЗДІЛ&lt;br /&gt;
    ├── Регістри відомостей&lt;br /&gt;
    │   └── КурсиВалют&lt;br /&gt;
    │       ├── Вимірювання      → Валюта&lt;br /&gt;
    │       ├── Ресурси          → Курс, Кратність&lt;br /&gt;
    │       ├── Реквізити        →&lt;br /&gt;
    │       └── Форми            → ФормаСписку, ФормаЗапису&lt;br /&gt;
    ├── Регістри накопичення&lt;br /&gt;
    │   └── ТовариНаСкладах&lt;br /&gt;
    │       ├── Вимірювання      → Номенклатура, Склад, Партія&lt;br /&gt;
    │       ├── Ресурси          → Кількість, Сума&lt;br /&gt;
    │       ├── Реквізити        → Коментар&lt;br /&gt;
    │       └── Реєстратори      → [ПрихіднаНакладна, ВидатковаНакладна, ...]&lt;br /&gt;
    ├── Регістри бухгалтерії&lt;br /&gt;
    │   └── Госпрозрахунковий&lt;br /&gt;
    │       ├── Вимірювання      → Організація, Підрозділ(небаланс.)&lt;br /&gt;
    │       ├── Ресурси          → Сума(баланс.), Кількість(небаланс.), ВалютнаСума&lt;br /&gt;
    │       ├── Реквізити        → Зміст, № журналу&lt;br /&gt;
    │       └── Реєстратори      → [...]&lt;br /&gt;
    └── Регістри розрахунку&lt;br /&gt;
        └── Нарахування&lt;br /&gt;
            ├── Вимірювання      → Співробітник(баз.), Підрозділ&lt;br /&gt;
            ├── Ресурси          → Результат, ВідпрацьованоДнів&lt;br /&gt;
            ├── Реквізити        → Графік&lt;br /&gt;
            ├── Перерахунки      → ПерерахунокЗаБазою&lt;br /&gt;
            └── Реєстратори      → [НарахуванняЗП]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6.2. Загальні властивості будь-якого регістру ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Тип !! Обов&#039;язк. !! Опис / допустимі значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt; || Ідентифікатор || Так || Унікальне в межах роду. Латиниця/кирилиця, ≤ 80 симв., без пробілів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Рядок || Ні || Подання для користувача.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Коментар&amp;lt;/code&amp;gt; || Текст || Ні || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Відомостей&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Накопичення&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Бухгалтерії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Розрахунку&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Незмінна після створення.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Незалежний&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;. Для РН/РБ/РР — примусово &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Неперіодичний&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахСекунди&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахДня&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахМісяця&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахКварталу&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахРоку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратори&amp;lt;/code&amp;gt; || Список посилань на типи документів || Умовно || Обов&#039;язково для РН/РБ/РР та підпорядкованого РВ. Порожній список = регістр непридатний до запису.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БлокуванняДаних&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Автоматичне&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt; (за замовчуванням &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВключатиДоЗвітів&amp;lt;/code&amp;gt; || Булево || Ні || Показувати в універсальному конструкторі звітів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПравоДоступуЗаЗамовчуванням&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Заборонено&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиРLS&amp;lt;/code&amp;gt; || Булево || Ні || Row-level security (розділ 7.9).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Партиціонування&amp;lt;/code&amp;gt; || Структура || Ні || &amp;lt;code&amp;gt;Немає&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодом(RANGE, крок)&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаВимірюванням(HASH, n)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.3. Поля регістру ==&lt;br /&gt;
&lt;br /&gt;
Кожне поле має:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Ідентифікація.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Роль&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Ресурс&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Реквізит&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Тип&amp;lt;/code&amp;gt; || Примітивний (&amp;lt;code&amp;gt;Число(p,s)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Рядок(n)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Булево&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;УНІ&amp;lt;/code&amp;gt;), посилальний (&amp;lt;code&amp;gt;Довідник.X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Документ.Y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перерахування.Z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланРахунків.A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланВидівХарактеристик.B&amp;lt;/code&amp;gt;) або &#039;&#039;&#039;складений&#039;&#039;&#039; (список типів).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Не індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ІндексуватиЗДодаткомВимірювань&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ведуче&amp;lt;/code&amp;gt; (Master) || Тільки для вимірювань. Якщо &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; — записи регістру видаляються разом з об&#039;єктом, на який посилається вимірювання; регістр показується у формі цього об&#039;єкта.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || Брати участь у стандартному відборі форми списку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗаборонитиНезаповненіЗначення&amp;lt;/code&amp;gt; || Валідація на запис.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Специфічні прапорці полів по типах регістрів:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Прапорець !! Застосовний до !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Балансовий&amp;lt;/code&amp;gt; || Ресурс/Вимірювання РБ || Ресурс бере участь у контролі рівності Дт=Кт; має єдине значення на запис (а не пару Дт/Кт). Вимірювання балансове — однакове для Дт і Кт.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Облік&amp;lt;/code&amp;gt; (AccountingFlag) || Ресурс РБ || Посилання на ознаку обліку рахунка з ПР; ресурс заповнюється, лише якщо ознака встановлена.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОблікСубконто&amp;lt;/code&amp;gt; || Ресурс РБ || Посилання на ознаку обліку субконто (напр. кількісний облік у розрізі субконто).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Базове&amp;lt;/code&amp;gt; (BaseDimension) || Вимірювання РР || Використовується для зіставлення записів під час отримання бази розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиПоточніЗначення&amp;lt;/code&amp;gt; || Ресурс/Реквізит РР || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.4. Специфічні властивості за типами ==&lt;br /&gt;
&lt;br /&gt;
=== 6.4.1. Регістр відомостей ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Неперіодичний … ПоПозиціїРеєстратора || Визначає наявність поля &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; і його гранулярність.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Незалежний / ПідпорядкованийРеєстратору || У незалежному ключ = (Період) + Вимірювання.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумки&amp;lt;/code&amp;gt; || — || У РВ підсумків немає; замість них — зрізи.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ключ унікальності:&#039;&#039;&#039;&lt;br /&gt;
* Незалежний неперіодичний: &amp;lt;code&amp;gt;UNIQUE(Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Незалежний періодичний: &amp;lt;code&amp;gt;UNIQUE(Період, Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Підпорядкований: &amp;lt;code&amp;gt;PK(Реєстратор, НомерРядка)&amp;lt;/code&amp;gt;, унікальність за вимірюваннями &#039;&#039;&#039;не&#039;&#039;&#039; контролюється.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.2. Регістр накопичення ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиЗалишків&amp;lt;/code&amp;gt; || Булево (тільки для виду «Залишки»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиОборотів&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодичністьПідсумківОборотів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt; (тільки для виду «Обороти»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || Список визначень агрегатів (тільки для виду «Обороти»), див. 7.4.4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимАгрегатів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 6.4.3. Регістр бухгалтерії ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланРахунків&amp;lt;/code&amp;gt; || Посилання на об&#039;єкт «План рахунків» || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039; Незмінне після створення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Кореспонденція&amp;lt;/code&amp;gt; || Булево || &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; → подвійний запис (поля &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt;); &amp;lt;code&amp;gt;Хиба&amp;lt;/code&amp;gt; → уніграфічний (&amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || Число (успадковується з ПР) || Ліміт платформи: 5 &#039;&#039;[узгодити; 1С — 3 за замовчуванням, до 5]&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пов&#039;язаний об&#039;єкт &#039;&#039;&#039;План рахунків&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* ієрархію рахунків, &amp;lt;code&amp;gt;Код&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Найменування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вид&amp;lt;/code&amp;gt; (Активний/Пасивний/Активно-пасивний);&lt;br /&gt;
* &amp;lt;code&amp;gt;Забалансовий&amp;lt;/code&amp;gt; (булево);&lt;br /&gt;
* &amp;lt;code&amp;gt;Ознаки обліку&amp;lt;/code&amp;gt; (набір булевих реквізитів, напр. «Кількісний», «Валютний»);&lt;br /&gt;
* табличну частину &amp;lt;code&amp;gt;ВидиСубконто&amp;lt;/code&amp;gt; (ВидСубконто → ПВХ, &#039;&#039;Тільки обороти&#039;&#039;, &#039;&#039;Підсумкова сума&#039;&#039;, ознаки обліку субконто);&lt;br /&gt;
* &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.4. Регістр розрахунку ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || Посилання || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Квартал&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Рік&amp;lt;/code&amp;gt; || Період реєстрації.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; || Булево || Вмикає поля &amp;lt;code&amp;gt;ПеріодДіїПочаток/Кінець&amp;lt;/code&amp;gt;, фактичні періоди дії та витіснення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріод&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;БезБазовогоПеріоду&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; || Режим отримання бази.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Графік&amp;lt;/code&amp;gt; || Посилання на РВ || Регістр-графік часу.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗначенняГрафіка&amp;lt;/code&amp;gt; || Ресурс регістру-графіка || Напр. «Значення» (1/0 — робочий день) або «Годин».&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДатаГрафіка&amp;lt;/code&amp;gt; || Вимірювання регістру-графіка типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Перерахунки&amp;lt;/code&amp;gt; || Список підпорядкованих об&#039;єктів «Перерахунок» || Див. 7.5.3.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Об&#039;єкт &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (підпорядкований РР):&lt;br /&gt;
* &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; — список, кожне зіставляється з вимірюванням основного РР (&amp;lt;code&amp;gt;ВимірюванняРегістру&amp;lt;/code&amp;gt;);&lt;br /&gt;
* правило: перерахунок реєструє «об&#039;єкт перерахунку» = (Реєстратор, ВидРозрахунку, Вимірювання…).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* &amp;lt;code&amp;gt;ВикористовуєПеріодДії&amp;lt;/code&amp;gt;;&lt;br /&gt;
* табличні частини &amp;lt;code&amp;gt;БазовіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВитісняючіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВедучіВидиРозрахунку&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;НеЗалежить&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 6.5. Стандартні реквізити (генеруються автоматично) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Реквізит !! РВ !! РН !! РБ !! РР !! Тип&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; || якщо періодичний || + || + || + (період реєстрації) || Дата/час&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Складене посилання (ДокументПосилання)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;НомерРядка&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Число(9,0)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Активність&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || — || тільки «Залишки» || — || — || Перелік {Прихід, Витрата}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt; || — || — || + (з кореспонденцією) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРухуРахунку&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || Перелік {Дебет, Кредит}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; (колекція) || — || — || + || — || Відповідність(ВидСубконто→Значення)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРозрахунку&amp;lt;/code&amp;gt; || — || — || — || + || ПВРПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДіїПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПеріодДіїКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо ПеріодДії) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріодПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;БазовийПеріодКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо БазовийПеріод) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Сторно&amp;lt;/code&amp;gt; || — || — || — || + || Булево&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.6. Кількісні обмеження метамоделі ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Ліміт !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| Кількість вимірювань || 20 || Понад 8 — попередження конструктора (деградація підсумків)&lt;br /&gt;
|-&lt;br /&gt;
| Кількість ресурсів || 20 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реквізитів || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість типів у складеному типі поля || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реєстраторів || Не обмежено ||&lt;br /&gt;
|-&lt;br /&gt;
| Максимум субконто на рахунок || 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| Довжина ключа підсумків || ≤ 900 байт (обмеження індексу MS SQL) || Валідація в конструкторі&lt;br /&gt;
|-&lt;br /&gt;
| Глибина періодичності підсумків || День / Місяць || Тиждень/Квартал — не підтримуються (обчислюються згортанням)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.7. Декларативний опис (DSL) ==&lt;br /&gt;
&lt;br /&gt;
Регістр зберігається в репозиторії у вигляді XML/YAML-маніфесту. Приклад:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр накопичення (вид: Залишки) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: ТовариНаСкладах&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  synonym: &amp;quot;Товари на складах&amp;quot;&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  writeMode: SubordinateToRecorder&lt;br /&gt;
  enableBalanceTotals: true&lt;br /&gt;
  enableTurnoverTotals: true&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура, type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true,  index: true }&lt;br /&gt;
    - { name: Склад,        type: &amp;quot;Довідник.Склади&amp;quot;,       master: true,  index: true }&lt;br /&gt;
    - { name: Партія,       type: [&amp;quot;Документ.ПрихіднаНакладна&amp;quot;, &amp;quot;Документ.ВведенняЗалишків&amp;quot;], index: false }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;ПланВидівХарактеристик.Характеристики&amp;quot;, nullable: true }&lt;br /&gt;
&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість, type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
    - { name: Сума,      type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Коментар, type: &amp;quot;Рядок(200)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ПрихіднаНакладна&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ПереміщенняТоварів&lt;br /&gt;
    - Документ.Інвентаризація&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр відомостей (періодичний, незалежний) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: КурсиВалют&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot;, master: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Курс,     type: &amp;quot;Число(15,4)&amp;quot; }&lt;br /&gt;
    - { name: Кратність, type: &amp;quot;Число(10,0)&amp;quot;, default: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр бухгалтерії ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Госпрозрахунковий&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Госпрозрахунковий&lt;br /&gt;
  correspondence: true&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Підрозділ,   type: &amp;quot;Довідник.Підрозділи&amp;quot;,  balance: false }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,       type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Кількість,  type: &amp;quot;Число(15,3)&amp;quot;, balance: false, accountingFlag: Кількісний }&lt;br /&gt;
    - { name: ВалютнаСума, type: &amp;quot;Число(15,2)&amp;quot;, balance: false, accountingFlag: Валютний }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Зміст, type: &amp;quot;Рядок(255)&amp;quot; }&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot; }&lt;br /&gt;
  recorders: [Документ.БухгалтерськаОперація, Документ.ПрихіднаНакладна]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр розрахунку ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Нарахування&lt;br /&gt;
  kind: Calculation&lt;br /&gt;
  calculationTypesPlan: ПланВидівРозрахунку.ОсновніНарахування&lt;br /&gt;
  periodicity: Month&lt;br /&gt;
  actionPeriod: true&lt;br /&gt;
  basePeriod: ByActionPeriod&lt;br /&gt;
  schedule:&lt;br /&gt;
    register: РегістрВідомостей.ГрафікРоботи&lt;br /&gt;
    valueResource: Значення&lt;br /&gt;
    dateDimension: ДатаГрафіка&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, baseDimension: true, master: true }&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Результат,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: ВідпрацьованоДнів, type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
    - { name: НормаДнів,        type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
  recalculations:&lt;br /&gt;
    - name: ПерерахунокЗаБазою&lt;br /&gt;
      dimensions:&lt;br /&gt;
        - { name: Співробітник, registerDimension: Співробітник }&lt;br /&gt;
  recorders: [Документ.НарахуванняЗарплати]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Розширений каталог із 17 прикладів регістрів усіх типів і підвидів — з деклараціями, даними у фізичних таблицях, запитами, наскрізними сценаріями та антипатернами — див. &#039;&#039;&#039;Додаток Д&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
== 6.8. UI конструктора метаданих ==&lt;br /&gt;
&lt;br /&gt;
=== 6.8.1. Загальний макет ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Конфігуратор K2 ERP ─────────────────────────────────────────────────────────┐&lt;br /&gt;
│ Файл  Правка  Конфігурація  Адміністрування  Сервіс  Довідка                  │&lt;br /&gt;
├──────────────────────┬────────────────────────────────────────────────────────┤&lt;br /&gt;
│ Дерево конфігурації  │  Регістр накопичення: ТовариНаСкладах                  │&lt;br /&gt;
│                      │  ┌──────┬─────────┬──────────┬──────────┬───────────┐  │&lt;br /&gt;
│ ▾ Регістри           │  │Основ.│Дані     │Реєстратор│Форми     │Права      │  │&lt;br /&gt;
│   ▸ відомостей       │  └──────┴─────────┴──────────┴──────────┴───────────┘  │&lt;br /&gt;
│   ▾ накопичення      │                                                        │&lt;br /&gt;
│     ▾ ТовариНаСклад. │  Ім&#039;я           [ТовариНаСкладах.............]         │&lt;br /&gt;
│       ▾ Вимірювання  │  Синонім        [Товари на складах...........]         │&lt;br /&gt;
│           Номенклат. │  Коментар       [.............................]        │&lt;br /&gt;
│           Склад      │                                                        │&lt;br /&gt;
│           Партія     │  Вид регістру   ( ) Обороти   (•) Залишки              │&lt;br /&gt;
│       ▾ Ресурси      │  Періодичність  [ У межах секунди        ▾]            │&lt;br /&gt;
│           Кількість  │  Режим запису   [ Підпорядкований реєстратору ▾]       │&lt;br /&gt;
│           Сума       │                                                        │&lt;br /&gt;
│       ▸ Реквізити    │  ☑ Дозволити підсумки залишків                        │&lt;br /&gt;
│       ▸ Форми        │  ☑ Дозволити підсумки оборотів                        │&lt;br /&gt;
│     ▸ Взаєморозрах.  │      Періодичність підсумків оборотів [Місяць  ▾]      │&lt;br /&gt;
│   ▸ бухгалтерії      │  ☐ Дозволити розділення підсумків                     │&lt;br /&gt;
│   ▸ розрахунку       │                                                        │&lt;br /&gt;
│                      │  Блокування даних  [Кероване ▾]                        │&lt;br /&gt;
│                      │  Партиціонування   [За періодом, крок: місяць ▾]       │&lt;br /&gt;
│                      │                                                        │&lt;br /&gt;
│                      │  [ Конструктор рухів... ]  [ Перевірити ]  [ Закрити ] │&lt;br /&gt;
├──────────────────────┴────────────────────────────────────────────────────────┤&lt;br /&gt;
│ ⚠ Попередження: 4 вимірювання + місячні підсумки → оцінка таблиці підсумків    │&lt;br /&gt;
│   ~ 12 млн записів/рік. Розгляньте виключення вимірювання «Партія» з підсумків.│&lt;br /&gt;
└───────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.2. Палітра властивостей поля ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Властивості: Вимірювання «Партія» ────────────────┐&lt;br /&gt;
│ Ім&#039;я                  [Партія...................]  │&lt;br /&gt;
│ Синонім               [Партія...................]  │&lt;br /&gt;
│ Тип                   [Складений тип........ [...]]│&lt;br /&gt;
│    ├ Документ.ПрихіднаНакладна                     │&lt;br /&gt;
│    └ Документ.ВведенняЗалишків                     │&lt;br /&gt;
│ Індексувати           [Не індексувати         ▾]   │&lt;br /&gt;
│ ☐ Ведуче                                           │&lt;br /&gt;
│ ☐ Основний відбір                                  │&lt;br /&gt;
│ ☐ Заборонити незаповнені значення                  │&lt;br /&gt;
│ ☑ Використовувати в підсумках                      │&lt;br /&gt;
│ Подання                                            │&lt;br /&gt;
│    Підказка           [Партія товару...........]   │&lt;br /&gt;
└────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.3. Вкладка «Реєстратори» ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ ТовариНаСкладах → Реєстратори ────────────────────────────┐&lt;br /&gt;
│ ☑ Документ.ПрихіднаНакладна                                │&lt;br /&gt;
│ ☑ Документ.ВидатковаНакладна                               │&lt;br /&gt;
│ ☑ Документ.ПереміщенняТоварів                              │&lt;br /&gt;
│ ☑ Документ.Інвентаризація                                  │&lt;br /&gt;
│ ☐ Документ.Замовлення                                      │&lt;br /&gt;
│ ☐ Документ.РахунокНаОплату                                 │&lt;br /&gt;
│                                     [Позначити всі] [Зняти]│&lt;br /&gt;
│ ─────────────────────────────────────────────────────────  │&lt;br /&gt;
│ ⓘ Знімання прапорця для документа, що має рухи, вимагає    │&lt;br /&gt;
│   очищення рухів. Знайдено рухів: 0                        │&lt;br /&gt;
└────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.4. Вимоги до конструктора ===&lt;br /&gt;
* ФТ-К-01. Валідація метаопису в реальному часі з переліком помилок/попереджень.&lt;br /&gt;
* ФТ-К-02. Попередній перегляд згенерованого DDL (кнопка «Показати SQL»).&lt;br /&gt;
* ФТ-К-03. Калькулятор оцінки обсягу таблиць підсумків (добуток кардинальностей вимірювань × кількість періодів).&lt;br /&gt;
* ФТ-К-04. Заборона неприпустимих комбінацій (напр. «Незалежний» + «Регістр накопичення»).&lt;br /&gt;
* ФТ-К-05. «Конструктор рухів» — генерація коду формування рухів за табличною частиною документа.&lt;br /&gt;
* ФТ-К-06. Порівняння/об&#039;єднання конфігурацій має коректно обробляти об&#039;єкти-регістри.&lt;br /&gt;
* ФТ-К-07. &#039;&#039;&#039;Генерація &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів&#039;&#039;&#039; для кожного регістру за метаописом. Прикладний код звертається до полів динамічно (&amp;lt;code&amp;gt;__getattr__&amp;lt;/code&amp;gt;), що недоступне для &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;; згенеровані стаби повертають статичну перевірку. Перегенеровуються при кожній зміні метаданих, перевіряються в CI (див. Е.6). &#039;&#039;Вимога специфічна для Python, аналога в 1С не має.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
= 7. Функціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 7.1. Набір записів і проведення документа ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-01.&#039;&#039;&#039; Платформа надає прикладний об&#039;єкт &amp;lt;code&amp;gt;НабірЗаписів&amp;lt;/code&amp;gt; для кожного регістру з властивостями: &amp;lt;code&amp;gt;Відбір&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записувати&amp;lt;/code&amp;gt;, і методами &amp;lt;code&amp;gt;Прочитати()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записати(Заміщати)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Очистити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗаблокуватиДляЗміни()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вивантажити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Завантажити()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-02.&#039;&#039;&#039; Для документа доступна колекція &amp;lt;code&amp;gt;Рухи&amp;lt;/code&amp;gt; з наборами записів усіх регістрів, де документ вказано реєстратором.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-03. Сценарій проведення:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
skinparam monochrome false&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
actor Користувач&lt;br /&gt;
participant &amp;quot;Форма\nдокумента&amp;quot; as UI&lt;br /&gt;
participant &amp;quot;Об&#039;єкт\nДокумент&amp;quot; as Doc&lt;br /&gt;
participant &amp;quot;Менеджер\nпроведення&amp;quot; as PM&lt;br /&gt;
participant &amp;quot;Набори\nзаписів&amp;quot; as RS&lt;br /&gt;
database &amp;quot;СКБД&amp;quot; as DB&lt;br /&gt;
&lt;br /&gt;
Користувач -&amp;gt; UI: Провести&lt;br /&gt;
UI -&amp;gt; Doc: Записати(РежимЗапису.Проведення)&lt;br /&gt;
activate Doc&lt;br /&gt;
Doc -&amp;gt; PM: НачатьТранзакцию()&lt;br /&gt;
PM -&amp;gt; DB: BEGIN&lt;br /&gt;
Doc -&amp;gt; Doc: ПередЗаписью()&lt;br /&gt;
Doc -&amp;gt; DB: UPDATE doc SET Проведений=1&lt;br /&gt;
Doc -&amp;gt; Doc: ОбработкаПроведения(Отказ, Режим)&lt;br /&gt;
note right of Doc&lt;br /&gt;
  Прикладний код:&lt;br /&gt;
  Рухи.ТовариНаСкладах.Записувати = Істина;&lt;br /&gt;
  Рух = Рухи.ТовариНаСкладах.Добавить();&lt;br /&gt;
  Рух.ВидРуху = ВидРухуНакопичення.Витрата;&lt;br /&gt;
  ...&lt;br /&gt;
  // контроль залишків (оперативне проведення)&lt;br /&gt;
end note&lt;br /&gt;
Doc -&amp;gt; RS: (формування рухів у пам&#039;яті)&lt;br /&gt;
Doc -&amp;gt; PM: ЗаписатьДвижения()&lt;br /&gt;
PM -&amp;gt; RS: для кожного НЗ з Записувати=Істина&lt;br /&gt;
RS -&amp;gt; DB: DELETE FROM rg_a_0012 WHERE rec_ref = :doc&lt;br /&gt;
RS -&amp;gt; DB: INSERT INTO rg_a_0012 (...) VALUES (...)&lt;br /&gt;
RS -&amp;gt; PM: ОновитиПідсумки(delta)&lt;br /&gt;
PM -&amp;gt; DB: MERGE rg_a_0012_tb (див. розд. 10.2)&lt;br /&gt;
Doc -&amp;gt; Doc: ПриЗаписи() / ПослеЗаписи()&lt;br /&gt;
alt Відмова = Хиба&lt;br /&gt;
  PM -&amp;gt; DB: COMMIT&lt;br /&gt;
  PM --&amp;gt; UI: Успіх&lt;br /&gt;
else Відмова = Істина або виключення&lt;br /&gt;
  PM -&amp;gt; DB: ROLLBACK&lt;br /&gt;
  PM --&amp;gt; UI: Помилка &amp;quot;Документ не проведено: ...&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
deactivate Doc&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-04.&#039;&#039;&#039; Запис набору записів у режимі &amp;lt;code&amp;gt;Заміщати = Істина&amp;lt;/code&amp;gt; (за замовчуванням для рухів) виконує &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt; усіх записів за відбором + &amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt; нових — атомарно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-05.&#039;&#039;&#039; Скасування проведення документа: усі набори записів за реєстратором очищуються, підсумки коригуються, документ отримує &amp;lt;code&amp;gt;Проведений = Хиба&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-06.&#039;&#039;&#039; Видалення документа-реєстратора (у т.ч. позначеного на видалення) &#039;&#039;&#039;зобов&#039;язане&#039;&#039;&#039; каскадно видалити всі його рухи в межах однієї транзакції. Реалізація — на рівні платформи (не FK, оскільки посилання поліморфне) + фонова перевірка цілісності (розділ 7.10).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-07.&#039;&#039;&#039; Режими проведення:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Режим !! Умова !! Поведінка&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Оперативне&#039;&#039;&#039; || Дата документа = поточна дата, документ у межах «оперативної точки» || Дозволено контроль залишків «на зараз»; дата може перепризначатися на поточну.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Неоперативне&#039;&#039;&#039; || Дата в минулому/майбутньому або документ перепроводиться || Контроль залишків виконується на дату документа; можливий негативний залишок за налаштуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.2. Активність записів ==&lt;br /&gt;
&#039;&#039;&#039;ФТ-08.&#039;&#039;&#039; Реквізит &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; означає, що запис фізично існує, але &#039;&#039;&#039;не&#039;&#039;&#039; впливає на підсумки та не потрапляє до віртуальних таблиць.&lt;br /&gt;
&#039;&#039;&#039;ФТ-09.&#039;&#039;&#039; Зміна активності будь-якого запису тягне коригування підсумків.&lt;br /&gt;
&#039;&#039;&#039;ФТ-10.&#039;&#039;&#039; Скасування проведення документа переводить усі його записи в &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; &#039;&#039;&#039;або&#039;&#039;&#039; видаляє їх — залежно від налаштування регістру &amp;lt;code&amp;gt;ПоведінкаПриСкасуванні&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Видаляти&amp;lt;/code&amp;gt; — за замовчуванням / &amp;lt;code&amp;gt;Деактивувати&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.3. Віртуальні таблиці ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-11.&#039;&#039;&#039; Мова запитів надає для кожного регістру набір віртуальних таблиць. Транслятор перетворює звернення до них на SQL із використанням таблиць підсумків та «живих» рухів після ТА.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Регістр !! Віртуальна таблиця !! Параметри !! Повертає&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РВ&#039;&#039;&#039; || &amp;lt;code&amp;gt;ЗрізОстанніх&amp;lt;/code&amp;gt; || (Період, Умова) || Останній запис на кожну комбінацію вимірювань з періодом ≤ Період&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗрізПерших&amp;lt;/code&amp;gt; || (Період, Умова) || Перший запис з періодом ≥ Період&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Усі записи&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РН.Залишки&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, Умова) || Вимірювання + &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, МетодДоповнення, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ПочатковийЗалишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;КінцевийЗалишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН.Обороти&#039;&#039;&#039; || &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | &#039;&#039;&#039;РБ&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, УмоваРахунку, Субконто, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахунку, Субконто, Умова, УмоваКорРахунку, КорСубконто) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (…) || Повний набір&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОборотиДтКт&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахункуДт, СубконтоДт, УмоваРахункуКт, СубконтоКт) || Кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДвиженияССубконто&amp;lt;/code&amp;gt; || (Початок, Кінець, УмоваРахунку, Субконто, Умова) || Рухи з розшифровкою субконто&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; || (Умова, Порядок…) || Значення субконто записів&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РР&#039;&#039;&#039; || &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; || (Умова) || &amp;lt;code&amp;gt;ЗначенняПеріодуДії&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняПеріодуРеєстрації&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняБазовогоПеріоду&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняФактичногоПеріодуДії&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ФактичнийПеріодДії&amp;lt;/code&amp;gt; || (Умова) || Записи з фактичними (після витіснення) межами&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; || (ВимірюванняБази, ВимірюванняОсновногоРегістру, Розрізи, ВидиРозрахунку, Умова) || Агреговані значення ресурсів базових видів розрахунку&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-12.&#039;&#039;&#039; Приклад запиту:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Залишки.Номенклатура,&lt;br /&gt;
    Залишки.Склад,&lt;br /&gt;
    Залишки.КількістьЗалишок,&lt;br /&gt;
    Обороти.КількістьПрихід,&lt;br /&gt;
    Обороти.КількістьВитрата&lt;br /&gt;
З&lt;br /&gt;
    РегістрНакопичення.ТовариНаСкладах.ЗалишкиІОбороти(&lt;br /&gt;
        &amp;amp;ПочатокПеріоду,&lt;br /&gt;
        &amp;amp;КінецьПеріоду,&lt;br /&gt;
        Місяць,&lt;br /&gt;
        Рух,&lt;br /&gt;
        Склад = &amp;amp;Склад&lt;br /&gt;
            І Номенклатура В ІЄРАРХІЇ (&amp;amp;ГрупаНоменклатури)&lt;br /&gt;
    ) ЯК Залишки&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-13.&#039;&#039;&#039; Параметри віртуальних таблиць &#039;&#039;&#039;зобов&#039;язані&#039;&#039;&#039; транслюватися у &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; підзапиту до звернення до підсумків (push-down), а не фільтруватися після агрегації.&lt;br /&gt;
&lt;br /&gt;
== 7.4. Підсумки ==&lt;br /&gt;
&lt;br /&gt;
=== 7.4.1. Модель підсумків залишків ===&lt;br /&gt;
Таблиця залишків зберігає &#039;&#039;&#039;кумулятивний залишок на початок кожного періоду&#039;&#039;&#039; + спеціальний рядок «підсумок за всі періоди» з &amp;lt;code&amp;gt;period = &#039;5999-11-01&#039;&amp;lt;/code&amp;gt; (маркер MAXPERIOD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                     Таблиця підсумків (місячна)                  ТА&lt;br /&gt;
                     ┌────┬────┬────┬────┬────┐                    ▼&lt;br /&gt;
  ─────┬────┬────┬───┴────┴────┴────┴────┴────┴────────────────────┬──────────►&lt;br /&gt;
       │    │    │  01.10  01.11  01.12  01.01  01.02             15.02      t&lt;br /&gt;
       │    │    │   ●      ●      ●      ●      ●&lt;br /&gt;
       │    │    │  бал.   бал.   бал.   бал.   бал.&lt;br /&gt;
                                                    └─ «живі» рухи ─┘&lt;br /&gt;
                                                      (сканування)&lt;br /&gt;
  Залишок на 10.02 = Підсумок(01.02) + Σ рухів (01.02 … 10.02]&lt;br /&gt;
  Залишок на 20.02 = Підсумок(01.02) + Σ рухів (01.02 … 20.02]   // після ТА — теж&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-14.&#039;&#039;&#039; Регламентна операція «Перерахунок підсумків» перебудовує таблиці підсумків з нуля.&lt;br /&gt;
&#039;&#039;&#039;ФТ-15.&#039;&#039;&#039; Регламентна операція «Встановлення періоду розрахунку підсумків» переносить ТА вперед/назад.&lt;br /&gt;
&#039;&#039;&#039;ФТ-16.&#039;&#039;&#039; При записі рухів раніше ТА підсумки коригуються &#039;&#039;інкрементально&#039;&#039; (див. 10.2), без повного перерахунку.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.2. Розділення підсумків ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-17.&#039;&#039;&#039; За увімкненого &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; у таблиці підсумків додається колонка &amp;lt;code&amp;gt;splitter smallint&amp;lt;/code&amp;gt;. Одночасні транзакції пишуть у різні «сплітери», що усуває конкуренцію за рядок. Читання агрегує по всіх сплітерах. Регламентне завдання зливає сплітери.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.3. Обороти ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-18.&#039;&#039;&#039; Таблиця оборотів зберігає агрегати за календарний період (день або місяць — за налаштуванням), без кумуляції.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.4. Агрегати (тільки РН виду «Обороти») ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-19.&#039;&#039;&#039; Агрегат — додаткова матеріалізована таблиця з підмножиною вимірювань і власною періодичністю (День/Місяць/Квартал/Рік). Оптимізатор запитів обирає найдешевший агрегат, що покриває запит.&lt;br /&gt;
&#039;&#039;&#039;ФТ-20.&#039;&#039;&#039; Режими: &amp;lt;code&amp;gt;Реальний час&amp;lt;/code&amp;gt; (оновлюється при записі рухів) / &amp;lt;code&amp;gt;Регламентний&amp;lt;/code&amp;gt; (оновлюється завданням; запит враховує рухи після дати актуальності агрегату).&lt;br /&gt;
&#039;&#039;&#039;ФТ-21.&#039;&#039;&#039; «Порадник агрегатів» аналізує статистику запитів і пропонує склад агрегатів (&amp;lt;code&amp;gt;ВизначитиОптимальніАгрегати()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.5. Механіка регістру розрахунку ==&lt;br /&gt;
&lt;br /&gt;
=== 7.5.1. Витіснення за періодом дії ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-22.&#039;&#039;&#039; Якщо у ПВР для виду розрахунку A вказано B у складі «Витісняючі види розрахунку», то запис виду B скорочує фактичний період дії запису виду A на інтервал перетину.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Період реєстрації: Січень 2026.   Пріоритет витіснення: Лікарняний &amp;gt; Відпустка &amp;gt; Оклад&lt;br /&gt;
&lt;br /&gt;
Заявлені періоди дії:&lt;br /&gt;
Оклад        01.01 ├══════════════════════════════════════════════┤ 31.01&lt;br /&gt;
Відпустка              10.01 ├════════════┤ 17.01&lt;br /&gt;
Лікарняний                     14.01 ├════════════┤ 22.01&lt;br /&gt;
&lt;br /&gt;
Фактичні періоди дії (rg_c_XXXX_ap):&lt;br /&gt;
Оклад        01.01 ├═══════┤ 09.01            23.01 ├════════════┤ 31.01&lt;br /&gt;
Відпустка              10.01 ├═══┤ 13.01&lt;br /&gt;
Лікарняний                     14.01 ├════════════┤ 22.01&lt;br /&gt;
&lt;br /&gt;
⇒ у таблиці фактичних періодів «Оклад» породжує ДВА інтервали (запис — один).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-23.&#039;&#039;&#039; Фактичні періоди дії матеріалізуються у службовій таблиці &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;код&amp;amp;gt;_ap&amp;lt;/code&amp;gt; під час запису набору записів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-24.&#039;&#039;&#039; Витіснення обчислюється в межах збігу &#039;&#039;&#039;усіх&#039;&#039;&#039; вимірювань регістру та перетину періодів реєстрації, визначених ПВР.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.2. Базовий період і база розрахунку ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-25.&#039;&#039;&#039; Віртуальна таблиця &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; повертає суму ресурсів записів базових видів розрахунку, зіставлених за базовими вимірюваннями, з урахуванням режиму &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період дії&#039;&#039;&#039; перетинається з базовим періодом поточного запису; результат пропорційно розподіляється за часткою перетину (за графіком, якщо заданий);&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період реєстрації&#039;&#039;&#039; потрапляє в базовий період.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.3. Перерахунки ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-26.&#039;&#039;&#039; При записі/зміні/видаленні запису базового виду розрахунку платформа &#039;&#039;&#039;автоматично&#039;&#039;&#039; формує записи у таблиці перерахунку для всіх залежних записів (за збігом вимірювань перерахунку та потраплянням у базовий період).&lt;br /&gt;
&#039;&#039;&#039;ФТ-27.&#039;&#039;&#039; Прикладний код читає перерахунок як набір записів, перепроводить відповідні документи та очищує оброблені записи.&lt;br /&gt;
&#039;&#039;&#039;ФТ-28.&#039;&#039;&#039; Перерахунок доступний як об&#039;єкт для звіту «Документи до перерахунку».&lt;br /&gt;
&lt;br /&gt;
=== 7.5.4. Графік часу ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-29.&#039;&#039;&#039; Графік — це РВ з обов&#039;язковим вимірюванням типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; та числовим ресурсом. Віртуальна таблиця &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; повертає суму значень графіка за відповідний період (дії / реєстрації / базовий / фактичний період дії).&lt;br /&gt;
&#039;&#039;&#039;ФТ-30.&#039;&#039;&#039; Якщо у графіку є додаткові вимірювання (напр. &amp;lt;code&amp;gt;ВидГрафіка&amp;lt;/code&amp;gt;), вони зіставляються з однойменними реквізитами/вимірюваннями РР.&lt;br /&gt;
&lt;br /&gt;
== 7.6. Прикладний API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from datetime import date&lt;br /&gt;
from decimal import Decimal&lt;br /&gt;
&lt;br /&gt;
from k2.registers import AccumulationMovementType, DataLock, DataLockMode, Registers&lt;br /&gt;
from k2.documents import Document, PostingContext&lt;br /&gt;
&lt;br /&gt;
# ============ Регістр відомостей: незалежний запис ============&lt;br /&gt;
mgr = Registers.information(&amp;quot;КурсиВалют&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
rm = mgr.create_record_manager()&lt;br /&gt;
rm.Період = date(2026, 7, 17)&lt;br /&gt;
rm.Валюта = usd&lt;br /&gt;
rm.Курс = Decimal(&amp;quot;41.85&amp;quot;)&lt;br /&gt;
rm.Кратність = 1&lt;br /&gt;
rm.write(replace=True)                    # INSERT ... ON CONFLICT DO UPDATE&lt;br /&gt;
&lt;br /&gt;
# зріз останніх&lt;br /&gt;
row = mgr.get_last(date.today(), {&amp;quot;Валюта&amp;quot;: usd})&lt;br /&gt;
курс: Decimal = row.Курс&lt;br /&gt;
&lt;br /&gt;
# АП-1: масове завантаження — ОДИН запит, а не цикл із write() усередині&lt;br /&gt;
rs = mgr.create_record_set()&lt;br /&gt;
rs.load([{&amp;quot;Період&amp;quot;: d, &amp;quot;Валюта&amp;quot;: v, &amp;quot;Курс&amp;quot;: k, &amp;quot;Кратність&amp;quot;: 1}&lt;br /&gt;
         for d, v, k in nbu_rates])       # 3 000 курсів&lt;br /&gt;
rs.write(replace=True)                    # 1 × executemany, ~40 мс&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# ============ Регістр накопичення: рухи документа ============&lt;br /&gt;
class ВидатковаНакладна(Document):&lt;br /&gt;
&lt;br /&gt;
    def on_posting(self, ctx: PostingContext) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.ТовариНаСкладах&lt;br /&gt;
        rs.write = True                   # набір буде записано наприкінці транзакції&lt;br /&gt;
        rs.clear()&lt;br /&gt;
&lt;br /&gt;
        # АП-1: набір наповнюється генератором, запис — одним batch&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(&lt;br /&gt;
                Період=self.Дата,&lt;br /&gt;
                ВидРуху=AccumulationMovementType.EXPENSE,&lt;br /&gt;
                Номенклатура=r.Номенклатура,&lt;br /&gt;
                Склад=self.Склад,&lt;br /&gt;
                Партія=r.Партія,&lt;br /&gt;
                Кількість=r.Кількість,&lt;br /&gt;
                Сума=r.Сума,&lt;br /&gt;
            )&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        # керовані блокування перед контролем залишків&lt;br /&gt;
        with DataLock() as dl:            # __enter__ виконує lock()&lt;br /&gt;
            li = dl.add(&amp;quot;РегістрНакопичення.ТовариНаСкладах.Залишки&amp;quot;)&lt;br /&gt;
            li.mode = DataLockMode.EXCLUSIVE&lt;br /&gt;
            li.data_source = rs.unload(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Склад&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Номенклатура&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Склад&amp;quot;, &amp;quot;Склад&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
            rs.write_now()                # примусовий запис до контролю&lt;br /&gt;
            self._control_balances(ctx)   # прикладна перевірка від&#039;ємних залишків&lt;br /&gt;
&lt;br /&gt;
    # ============ Регістр бухгалтерії ============&lt;br /&gt;
    def _accounting(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Госпрозрахунковий&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        for r in self.Товари:&lt;br /&gt;
            e = rs.add_accounting_entry(&lt;br /&gt;
                Період=self.Дата,&lt;br /&gt;
                Організація=self.Організація,&lt;br /&gt;
                РахунокДт=accounts[&amp;quot;281&amp;quot;],&lt;br /&gt;
                РахунокКт=accounts[&amp;quot;631&amp;quot;],&lt;br /&gt;
                Сума=r.Сума,&lt;br /&gt;
                КількістьДт=r.Кількість,&lt;br /&gt;
            )&lt;br /&gt;
            e.subconto_dt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e.subconto_dt[ВидиСубконто.Склади] = self.Склад&lt;br /&gt;
            e.subconto_kt[ВидиСубконто.Контрагенти] = self.Контрагент&lt;br /&gt;
&lt;br /&gt;
    # ============ Регістр розрахунку ============&lt;br /&gt;
    def _calculation(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Нарахування&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.append(rs.new(&lt;br /&gt;
            ВидРозрахунку=calc_types[&amp;quot;Оклад&amp;quot;],&lt;br /&gt;
            Період=self.Дата,                      # період реєстрації&lt;br /&gt;
            ПеріодДіїПочаток=date(2026, 7, 1),&lt;br /&gt;
            ПеріодДіїКінець=date(2026, 7, 31),&lt;br /&gt;
            БазовийПеріодПочаток=date(2026, 6, 1),&lt;br /&gt;
            БазовийПеріодКінець=date(2026, 6, 30),&lt;br /&gt;
            Співробітник=self.Співробітник,&lt;br /&gt;
            Результат=Decimal(0),                  # заповниться після розрахунку&lt;br /&gt;
        ))&lt;br /&gt;
        rs.write_now()&lt;br /&gt;
&lt;br /&gt;
# Отримання даних графіка та бази розрахунку — запитом (розділ 7.3), не циклом.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Про кириличні ідентифікатори.&#039;&#039;&#039; Python 3 підтримує Unicode в іменах (PEP 3131), тому &amp;lt;code&amp;gt;rm.Валюта&amp;lt;/code&amp;gt; і &amp;lt;code&amp;gt;rs.new(Номенклатура=…)&amp;lt;/code&amp;gt; — валідний код; прикладна термінологія зберігається без транслітерації. &#039;&#039;&#039;Але&#039;&#039;&#039; доступ до полів регістру динамічний, тому &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt; його не перевіряє — компенсується генерацією &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів (ФТ-К-07, Додаток Е.6). Ключові слова API (&amp;lt;code&amp;gt;write&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;clear&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;new&amp;lt;/code&amp;gt;) залишаються англійськими; змішування — свідомий компроміс, підлягає узгодженню (В15).}}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Антипатерн, специфічний для Python (А-15).&#039;&#039;&#039; Спокуса написати &amp;lt;code&amp;gt;for r in self.Товари: rs.add(...).write()&amp;lt;/code&amp;gt; дає 100 round-trip&#039;ів до СКБД замість одного і збільшує час проведення з 300 мс до ~10 с. Це порушення АП-1 і найчастіша помилка при переході з ORM-мислення. Детектор — Е.7.}}&lt;br /&gt;
&lt;br /&gt;
== 7.7. Блокування та конкурентність ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Вимога&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31 || Режим керованих блокувань — за замовчуванням. Рівень ізоляції транзакцій: &amp;lt;code&amp;gt;READ COMMITTED&amp;lt;/code&amp;gt; (PostgreSQL) / &amp;lt;code&amp;gt;READ COMMITTED SNAPSHOT&amp;lt;/code&amp;gt; (MS SQL).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-32 || Об&#039;єкт &amp;lt;code&amp;gt;DataLock&amp;lt;/code&amp;gt; дозволяє встановити розділювальне/виняткове блокування на «простір» регістру за значеннями вимірювань (реалізація — &amp;lt;code&amp;gt;pg_advisory_xact_lock&amp;lt;/code&amp;gt; за хешем ключа або &amp;lt;code&amp;gt;SELECT ... FOR UPDATE&amp;lt;/code&amp;gt; по таблиці підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-33 || Запис рухів документа блокує тільки записи цього реєстратора (PK містить реєстратор першим).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-34 || Оновлення підсумків не повинно призводити до дедлоків: усі &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;-операції в межах транзакції виконуються у детермінованому порядку сортування ключа.&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-35 || Гарантія: паралельне проведення двох документів з різними наборами вимірювань не конкурує (за увімкненого розділення підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-36 || Таймаут очікування блокування — 20 с (налаштовується); при перевищенні — керована помилка з текстом конфліктного ключа.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.8. Права доступу ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-37.&#039;&#039;&#039; Для регістру визначаються права: &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Додавання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Зміна&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Видалення&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перегляд&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Редагування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПереглядПідсумків&amp;lt;/code&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;ФТ-38.&#039;&#039;&#039; Обмеження на рівні записів (RLS) задаються шаблоном умови по вимірюваннях; транслюються в &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; усіх звернень, включно з віртуальними таблицями.&lt;br /&gt;
&#039;&#039;&#039;ФТ-39.&#039;&#039;&#039; &#039;&#039;Ризик:&#039;&#039; RLS на віртуальних таблицях залишків потребує узгодженості з підсумками. Рішення — RLS дозволено тільки по вимірюваннях, що входять до ключа підсумків; конструктор валідує це правило.&lt;br /&gt;
&lt;br /&gt;
== 7.9. Журналювання, аудит, службові сервіси ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-40.&#039;&#039;&#039; Реєстрація в журналі: перерахунок підсумків, зміна ТА, реструктуризація регістру, злиття сплітерів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-41.&#039;&#039;&#039; Службовий сервіс «Перевірка цілісності регістрів»:&lt;br /&gt;
* «висячі» рухи (реєстратор не існує або не проведений);&lt;br /&gt;
* розбіжність підсумків і сум рухів (контрольний перерахунок у тіньову таблицю з порівнянням);&lt;br /&gt;
* некоректні фактичні періоди дії РР;&lt;br /&gt;
* для РБ — порушення рівності Дт = Кт за балансовим ресурсом у межах реєстратора.&lt;br /&gt;
&#039;&#039;&#039;ФТ-42.&#039;&#039;&#039; Звіт «Аналіз розміру регістрів»: кількість записів, розмір таблиць та індексів, дата останнього перерахунку підсумків.&lt;br /&gt;
&lt;br /&gt;
= 8. Модель даних (як це виглядає в базі даних) =&lt;br /&gt;
&lt;br /&gt;
== 8.1. Конвенції іменування ==&lt;br /&gt;
&lt;br /&gt;
Фізичні імена &#039;&#039;&#039;не&#039;&#039;&#039; успадковують прикладні імена (обмеження довжини ідентифікатора, кирилиця, перейменування об&#039;єктів). Ім&#039;я будується за сурогатним кодом об&#039;єкта метаданих &amp;lt;code&amp;gt;&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; (4-значний hex/dec).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаблон !! Призначення !! Приклад&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_i_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр відомостей — основна таблиця || &amp;lt;code&amp;gt;rg_i_0007&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр накопичення — рухи || &amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tb&amp;lt;/code&amp;gt; || РН — підсумки залишків (Totals Balance) || &amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tt&amp;lt;/code&amp;gt; || РН — підсумки оборотів (Totals Turnover) || &amp;lt;code&amp;gt;rg_a_0012_tt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_ag&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; || РН — агрегат № n || &amp;lt;code&amp;gt;rg_a_0031_ag1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр бухгалтерії — проводки || &amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_ed&amp;lt;/code&amp;gt; || РБ — субконто (якщо винесено в дочірню таблицю) || &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tb&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки залишків за рівнем субконто k (0…N) || &amp;lt;code&amp;gt;rg_b_0020_tb2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tt&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки оборотів за рівнем субконто k || &amp;lt;code&amp;gt;rg_b_0020_tt1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tc&amp;lt;/code&amp;gt; || РБ — обороти між рахунками (кореспонденції) || &amp;lt;code&amp;gt;rg_b_0020_tc&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр розрахунку — рухи || &amp;lt;code&amp;gt;rg_c_0040&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_ap&amp;lt;/code&amp;gt; || РР — фактичні періоди дії || &amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_rc&amp;amp;lt;m&amp;amp;gt;&amp;lt;/code&amp;gt; || РР — перерахунок № m || &amp;lt;code&amp;gt;rg_c_0040_rc1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_&amp;amp;lt;*&amp;amp;gt;_&amp;amp;lt;id&amp;amp;gt;_opt&amp;lt;/code&amp;gt; || Службова: ТА підсумків, налаштування || &amp;lt;code&amp;gt;rg_a_0012_opt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;md_*&amp;lt;/code&amp;gt; || Таблиці метаданих || &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Колонки полів: &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — вимірювання, &amp;lt;code&amp;gt;r&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — ресурс, &amp;lt;code&amp;gt;a&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — реквізит, де &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; — порядковий номер поля в метаописі (стабільний, не перевикористовується після видалення поля). Мапінг «прикладне ім&#039;я ↔ фізична колонка» зберігається в &amp;lt;code&amp;gt;md_register_field&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.2. Типізація та зберігання значень ==&lt;br /&gt;
&lt;br /&gt;
=== 8.2.1. Примітивні типи ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Тип платформи !! PostgreSQL !! MS SQL&lt;br /&gt;
|-&lt;br /&gt;
| Число(p,s) || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(n) || &amp;lt;code&amp;gt;varchar(n)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(необмежена) || &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(max)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Дата / ДатаЧас || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;datetime2(0)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Булево || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| УНІ || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uniqueidentifier&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.2. Посилальні типи ===&lt;br /&gt;
* &#039;&#039;&#039;Простий&#039;&#039;&#039; (один тип): одна колонка &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r uuid NOT NULL&amp;lt;/code&amp;gt;, зовнішній ключ до таблиці об&#039;єкта. Порожнє посилання = &amp;lt;code&amp;gt;&#039;00000000-0000-0000-0000-000000000000&#039;&amp;lt;/code&amp;gt; (а не NULL — щоб зберегти семантику «пустого значення» у ключах підсумків).&lt;br /&gt;
* &#039;&#039;&#039;Складений&#039;&#039;&#039; (кілька типів / примітив + посилання): група колонок:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Колонка !! Тип !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_t&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;smallint&amp;lt;/code&amp;gt; || Код типу: 1=Невизначено, 2=Булево, 3=Число, 4=Рядок, 5=Дата, ≥100 = &amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt; посилального типу&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || Значення, якщо _t=2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_n&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(38,10)&amp;lt;/code&amp;gt; || Значення, якщо _t=3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_s&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;varchar(N)&amp;lt;/code&amp;gt; || Значення, якщо _t=4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_d&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || Значення, якщо _t=5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || Значення, якщо _t≥100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №1.&#039;&#039;&#039; Для складених типів обрано «широку» денормалізацію (кілька колонок), а не JSONB/варіант, тому що: (а) колонки індексуються та беруть участь у ключах підсумків; (б) B-tree по &amp;lt;code&amp;gt;(d1_t, d1_r)&amp;lt;/code&amp;gt; дає range-scan, JSONB — ні; (в) сумісно з обома цільовими СКБД. Ціна — до 6 колонок на одне складене поле.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.3. Реєстратор ===&lt;br /&gt;
Завжди складений (будь-який з дозволених документів):&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_t smallint NOT NULL&amp;lt;/code&amp;gt; — код типу документа (&amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt;);&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_r uuid NOT NULL&amp;lt;/code&amp;gt; — посилання.&lt;br /&gt;
&lt;br /&gt;
FK неможливий (поліморфізм) → цілісність забезпечується платформою + сервісом перевірки (ФТ-41).&lt;br /&gt;
&lt;br /&gt;
=== 8.2.4. Маркери періодів ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа !! Значення !! Використання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MINPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0001-01-01 00:00:00&amp;lt;/code&amp;gt; || Нижня межа&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5999-11-01 00:00:00&amp;lt;/code&amp;gt; || Рядок «підсумок за всі періоди» в таблицях залишків&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8.3. Таблиці метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ============ РЕПОЗИТОРІЙ МЕТАДАНИХ ============&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_type (                       -- реєстр усіх типів конфігурації&lt;br /&gt;
    id            smallint     PRIMARY KEY,&lt;br /&gt;
    kind          varchar(20)  NOT NULL,     -- Catalog|Document|Enum|ChartOfAccounts|ChartOfCalcTypes|Register|...&lt;br /&gt;
    name          varchar(80)  NOT NULL,&lt;br /&gt;
    table_name    varchar(63),&lt;br /&gt;
    UNIQUE (kind, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register (&lt;br /&gt;
    id                   smallint     PRIMARY KEY,          -- = md_type.id&lt;br /&gt;
    name                 varchar(80)  NOT NULL UNIQUE,&lt;br /&gt;
    synonym              varchar(255),&lt;br /&gt;
    comment              text,&lt;br /&gt;
    kind                 varchar(12)  NOT NULL&lt;br /&gt;
        CHECK (kind IN (&#039;Information&#039;,&#039;Accumulation&#039;,&#039;Accounting&#039;,&#039;Calculation&#039;)),&lt;br /&gt;
    -- загальні&lt;br /&gt;
    write_mode           varchar(24)  NOT NULL DEFAULT &#039;SubordinateToRecorder&#039;&lt;br /&gt;
        CHECK (write_mode IN (&#039;Independent&#039;,&#039;SubordinateToRecorder&#039;)),&lt;br /&gt;
    periodicity          varchar(24)  NOT NULL DEFAULT &#039;Nonperiodical&#039;&lt;br /&gt;
        CHECK (periodicity IN (&#039;Nonperiodical&#039;,&#039;WithinSecond&#039;,&#039;WithinDay&#039;,&#039;WithinMonth&#039;,&lt;br /&gt;
                               &#039;WithinQuarter&#039;,&#039;WithinYear&#039;,&#039;ByRecorderPosition&#039;)),&lt;br /&gt;
    lock_mode            varchar(12)  NOT NULL DEFAULT &#039;Managed&#039;,&lt;br /&gt;
    use_rls              boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    partition_mode       varchar(20)  NOT NULL DEFAULT &#039;None&#039;,&lt;br /&gt;
    partition_step       varchar(10),&lt;br /&gt;
    -- РН&lt;br /&gt;
    accumulation_kind    varchar(10)  CHECK (accumulation_kind IN (&#039;Balance&#039;,&#039;Turnover&#039;)),&lt;br /&gt;
    enable_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    enable_tno_totals    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    tno_totals_period    varchar(6)   CHECK (tno_totals_period IN (&#039;Day&#039;,&#039;Month&#039;)),&lt;br /&gt;
    split_totals         boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    split_count          smallint     NOT NULL DEFAULT 1,&lt;br /&gt;
    aggregates_mode      varchar(10),&lt;br /&gt;
    -- РБ&lt;br /&gt;
    chart_of_accounts_id smallint     REFERENCES md_type(id),&lt;br /&gt;
    correspondence       boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    max_extdim_count     smallint     NOT NULL DEFAULT 3,&lt;br /&gt;
    -- РР&lt;br /&gt;
    calc_types_plan_id   smallint     REFERENCES md_type(id),&lt;br /&gt;
    use_action_period    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    base_period_mode     varchar(24)&lt;br /&gt;
        CHECK (base_period_mode IN (&#039;None&#039;,&#039;ByActionPeriod&#039;,&#039;ByRegistrationPeriod&#039;)),&lt;br /&gt;
    schedule_register_id smallint     REFERENCES md_register(id),&lt;br /&gt;
    schedule_value_field smallint,&lt;br /&gt;
    schedule_date_field  smallint,&lt;br /&gt;
    -- службове&lt;br /&gt;
    physical_table       varchar(63)  NOT NULL,&lt;br /&gt;
    struct_version       int          NOT NULL DEFAULT 1,&lt;br /&gt;
    CONSTRAINT chk_kind_props CHECK (&lt;br /&gt;
        (kind = &#039;Accumulation&#039; AND accumulation_kind IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Accounting&#039;   AND chart_of_accounts_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Calculation&#039;  AND calc_types_plan_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Information&#039;)&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_field (&lt;br /&gt;
    id                smallint    NOT NULL,        -- порядковий номер поля (стабільний)&lt;br /&gt;
    register_id       smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name              varchar(80) NOT NULL,&lt;br /&gt;
    synonym           varchar(255),&lt;br /&gt;
    role              varchar(12) NOT NULL CHECK (role IN (&#039;Dimension&#039;,&#039;Resource&#039;,&#039;Attribute&#039;)),&lt;br /&gt;
    data_type_expr    text        NOT NULL,        -- серіалізований опис типу (може бути складеним)&lt;br /&gt;
    is_composite      boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    precision_        smallint,&lt;br /&gt;
    scale_            smallint,&lt;br /&gt;
    length_           int,&lt;br /&gt;
    index_mode        varchar(28) NOT NULL DEFAULT &#039;None&#039;&lt;br /&gt;
        CHECK (index_mode IN (&#039;None&#039;,&#039;Index&#039;,&#039;IndexWithAddDimensions&#039;)),&lt;br /&gt;
    is_master         boolean     NOT NULL DEFAULT false,   -- «Ведуче»&lt;br /&gt;
    in_default_filter boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    deny_empty        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    use_in_totals     boolean     NOT NULL DEFAULT true,&lt;br /&gt;
    -- РБ&lt;br /&gt;
    is_balance        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    accounting_flag   varchar(80),&lt;br /&gt;
    extdim_flag       varchar(80),&lt;br /&gt;
    -- РР&lt;br /&gt;
    is_base_dimension boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    -- фізика&lt;br /&gt;
    column_prefix     varchar(8)  NOT NULL,        -- &#039;d3&#039;,&#039;r1&#039;,&#039;a2&#039;&lt;br /&gt;
    PRIMARY KEY (register_id, id),&lt;br /&gt;
    UNIQUE (register_id, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recorder (&lt;br /&gt;
    register_id  smallint NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    doc_type_id  smallint NOT NULL REFERENCES md_type(id),&lt;br /&gt;
    PRIMARY KEY (register_id, doc_type_id)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_aggregate (&lt;br /&gt;
    id           smallint    NOT NULL,&lt;br /&gt;
    register_id  smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    periodicity  varchar(8)  NOT NULL CHECK (periodicity IN (&#039;Day&#039;,&#039;Month&#039;,&#039;Quarter&#039;,&#039;Year&#039;)),&lt;br /&gt;
    use_mode     varchar(12) NOT NULL DEFAULT &#039;Auto&#039;,&lt;br /&gt;
    is_realtime  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    actual_upto  timestamp(0),&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_aggregate_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    aggregate_id smallint NOT NULL,&lt;br /&gt;
    field_id     smallint NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, aggregate_id, field_id),&lt;br /&gt;
    FOREIGN KEY (register_id, aggregate_id) REFERENCES md_register_aggregate(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recalc (&lt;br /&gt;
    id             smallint    NOT NULL,&lt;br /&gt;
    register_id    smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name           varchar(80) NOT NULL,&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_recalc_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    recalc_id    smallint NOT NULL,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    reg_field_id smallint NOT NULL,          -- вимірювання основного регістру&lt;br /&gt;
    column_prefix varchar(8) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, recalc_id, name),&lt;br /&gt;
    FOREIGN KEY (register_id, recalc_id) REFERENCES md_register_recalc(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.4. Регістр відомостей ==&lt;br /&gt;
&lt;br /&gt;
=== 8.4.1. Незалежний періодичний (приклад: КурсиВалют) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0007 (&lt;br /&gt;
    period   timestamp(0) NOT NULL,                  -- Період (усічений до дня: WithinDay)&lt;br /&gt;
    d1_r     uuid         NOT NULL,                  -- Вимірювання «Валюта»&lt;br /&gt;
    r1       numeric(15,4) NOT NULL,                 -- Ресурс «Курс»&lt;br /&gt;
    r2       numeric(10,0) NOT NULL DEFAULT 1,       -- Ресурс «Кратність»&lt;br /&gt;
    CONSTRAINT pk_rg_i_0007 PRIMARY KEY (period, d1_r)&lt;br /&gt;
);&lt;br /&gt;
-- Індекс для зрізу останніх у розрізі вимірювання&lt;br /&gt;
CREATE INDEX ix_rg_i_0007_d1 ON rg_i_0007 (d1_r, period DESC) INCLUDE (r1, r2);&lt;br /&gt;
ALTER TABLE rg_i_0007 ADD CONSTRAINT fk_rg_i_0007_d1&lt;br /&gt;
    FOREIGN KEY (d1_r) REFERENCES cat_0003(ref);      -- Довідник.Валюти&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.2. Підпорядкований реєстратору ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0008 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    r1       numeric(15,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0008 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_period ON rg_i_0008 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_d1     ON rg_i_0008 (d1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.3. Незалежний неперіодичний ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0009 (&lt;br /&gt;
    d1_r  uuid          NOT NULL,&lt;br /&gt;
    d2_r  uuid          NOT NULL,&lt;br /&gt;
    r1    varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_i_0009 PRIMARY KEY (d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.5. Регістр накопичення ==&lt;br /&gt;
&lt;br /&gt;
=== 8.5.1. Таблиця рухів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ТовариНаСкладах: dims = Номенклатура(d1), Склад(d2), Партія(d3, складений), Характеристика(d4)&lt;br /&gt;
--                  res  = Кількість(r1), Сума(r2);  attr = Коментар(a1)&lt;br /&gt;
CREATE TABLE rg_a_0012 (&lt;br /&gt;
    rec_t    smallint      NOT NULL,&lt;br /&gt;
    rec_r    uuid          NOT NULL,&lt;br /&gt;
    line_no  int           NOT NULL,&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    active   boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    mvt      smallint      NOT NULL CHECK (mvt IN (0,1)),   -- 0=Прихід, 1=Витрата&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,                        -- складене вимірювання «Партія»&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(15,3) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2       numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    a1       varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE rg_a_0012_p2026m07 PARTITION OF rg_a_0012&lt;br /&gt;
    FOR VALUES FROM (&#039;2026-07-01&#039;) TO (&#039;2026-08-01&#039;);&lt;br /&gt;
-- ... інші секції створюються регламентним завданням&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_period ON rg_a_0012 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d1     ON rg_a_0012 (d1_r, period, d2_r) WHERE active;   -- Номенклатура (Індексувати з дод. вимірюваннями)&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d2     ON rg_a_0012 (d2_r, period, d1_r) WHERE active;   -- Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.2. Таблиця підсумків залишків ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tb (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок місяця; MAXPERIOD = підсумок за всі періоди&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,     -- Кількість, знаковий залишок&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,     -- Сума&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tb PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- покривний індекс для типового відбору «залишки по складу»&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_tb_d2 ON rg_a_0012_tb (d2_r, period, d1_r) INCLUDE (r1, r2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Семантика:&#039;&#039;&#039; рядок з &amp;lt;code&amp;gt;period = P&amp;lt;/code&amp;gt; містить залишок &#039;&#039;&#039;на початок&#039;&#039;&#039; періоду P. Рядок з &amp;lt;code&amp;gt;period = MAXPERIOD&amp;lt;/code&amp;gt; — поточний залишок за всі періоди (використовується для запитів «залишки на зараз», найчастіший кейс).&lt;br /&gt;
&lt;br /&gt;
=== 8.5.3. Таблиця підсумків оборотів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tt (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок періоду агрегації (день/місяць)&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1_in    numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Прихід&lt;br /&gt;
    r1_out   numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Витрата&lt;br /&gt;
    r2_in    numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2_out   numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tt PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.4. Службова таблиця налаштувань ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_opt (&lt;br /&gt;
    id                smallint     PRIMARY KEY DEFAULT 1 CHECK (id = 1),&lt;br /&gt;
    totals_actual_to  timestamp(0) NOT NULL,   -- ТА: підсумки розраховані до&lt;br /&gt;
    use_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    use_tno_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    min_period        timestamp(0),            -- період першого руху&lt;br /&gt;
    last_recalc_at    timestamp(0),&lt;br /&gt;
    split_merge_at    timestamp(0)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.5. Агрегат (для РН виду «Обороти») ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Агрегат «Продажі за місяцями по номенклатурі та складу» (без Партії, без Характеристики)&lt;br /&gt;
CREATE TABLE rg_a_0031_ag1 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag1 PRIMARY KEY (period, d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.6. Регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
=== 8.6.1. План рахунків (супутні таблиці) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE coa_0005 (                            -- ПланРахунків.Госпрозрахунковий&lt;br /&gt;
    ref          uuid        PRIMARY KEY,&lt;br /&gt;
    parent_ref   uuid        REFERENCES coa_0005(ref),&lt;br /&gt;
    code         varchar(20) NOT NULL,&lt;br /&gt;
    order_code   varchar(40) NOT NULL,             -- впорядкований код для ієрархічних запитів&lt;br /&gt;
    name         varchar(150) NOT NULL,&lt;br /&gt;
    acc_type     smallint    NOT NULL,             -- 0=Активний,1=Пасивний,2=Активно-пасивний&lt;br /&gt;
    off_balance  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    ed_count     smallint    NOT NULL DEFAULT 0,   -- фактична кількість субконто&lt;br /&gt;
    fl_qty       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Кількісний»&lt;br /&gt;
    fl_cur       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Валютний»&lt;br /&gt;
    marked_del   boolean     NOT NULL DEFAULT false&lt;br /&gt;
);&lt;br /&gt;
CREATE UNIQUE INDEX ux_coa_0005_code ON coa_0005 (code);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE coa_0005_ed (                         -- ТЧ «ВидиСубконто»&lt;br /&gt;
    ref        uuid     NOT NULL REFERENCES coa_0005(ref) ON DELETE CASCADE,&lt;br /&gt;
    line_no    int      NOT NULL,&lt;br /&gt;
    ed_type_r  uuid     NOT NULL,                  -- ПланВидівХарактеристик.ВидиСубконто&lt;br /&gt;
    only_tno   boolean  NOT NULL DEFAULT false,    -- «Тільки обороти»&lt;br /&gt;
    sum_flag   boolean  NOT NULL DEFAULT true,     -- «Підсумкова сума»&lt;br /&gt;
    fl_qty     boolean  NOT NULL DEFAULT false,    -- ознака обліку субконто «Кількісний»&lt;br /&gt;
    PRIMARY KEY (ref, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.2. Таблиця проводок (з кореспонденцією) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Госпрозрахунковий: dims = Організація(d1, балансове), Підрозділ(d2, небалансове)&lt;br /&gt;
--   res = Сума(r1, балансовий), Кількість(r2, небалансовий), ВалютнаСума(r3, небалансовий)&lt;br /&gt;
--   attr = Зміст(a1), Валюта(a2);  max_extdim_count = 3&lt;br /&gt;
CREATE TABLE rg_b_0020 (&lt;br /&gt;
    rec_t     smallint      NOT NULL,&lt;br /&gt;
    rec_r     uuid          NOT NULL,&lt;br /&gt;
    line_no   int           NOT NULL,&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    active    boolean       NOT NULL DEFAULT true,&lt;br /&gt;
&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
&lt;br /&gt;
    -- балансове вимірювання: одне значення на проводку&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    -- небалансове вимірювання: окремо для Дт і Кт&lt;br /&gt;
    d2_dt_r   uuid          NOT NULL,&lt;br /&gt;
    d2_kt_r   uuid          NOT NULL,&lt;br /&gt;
&lt;br /&gt;
    -- субконто Дт (3 слоти, складений тип: ПВХ-значення)&lt;br /&gt;
    ed_dt1_t  smallint, ed_dt1_r uuid,&lt;br /&gt;
    ed_dt2_t  smallint, ed_dt2_r uuid,&lt;br /&gt;
    ed_dt3_t  smallint, ed_dt3_r uuid,&lt;br /&gt;
    ed_dt_h   bigint        NOT NULL DEFAULT 0,     -- хеш набору субконто Дт (для JOIN з підсумками)&lt;br /&gt;
    -- субконто Кт&lt;br /&gt;
    ed_kt1_t  smallint, ed_kt1_r uuid,&lt;br /&gt;
    ed_kt2_t  smallint, ed_kt2_r uuid,&lt;br /&gt;
    ed_kt3_t  smallint, ed_kt3_r uuid,&lt;br /&gt;
    ed_kt_h   bigint        NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    -- балансовий ресурс: одне значення&lt;br /&gt;
    r1        numeric(20,2) NOT NULL DEFAULT 0,     -- Сума&lt;br /&gt;
    -- небалансові ресурси: пара Дт/Кт&lt;br /&gt;
    r2_dt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Дт&lt;br /&gt;
    r2_kt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Кт&lt;br /&gt;
    r3_dt     numeric(20,2) NOT NULL DEFAULT 0,     -- ВалютнаСума Дт&lt;br /&gt;
    r3_kt     numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    a1        varchar(255),&lt;br /&gt;
    a2_r      uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_period  ON rg_b_0020 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_dt  ON rg_b_0020 (acc_dt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_kt  ON rg_b_0020 (acc_kt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_dt   ON rg_b_0020 (ed_dt1_t, ed_dt1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №2.&#039;&#039;&#039; Субконто зберігаються &#039;&#039;&#039;слотами в основній таблиці&#039;&#039;&#039;, а не в дочірній таблиці «ключ-значення». Обґрунтування: (а) віртуальні таблиці &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; з відбором за субконто перетворюються на предикат по колонці замість &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; самоз&#039;єднань; (б) кількість субконто жорстко обмежена (≤5) — «широка» таблиця прийнятна; (в) 1С використовує гібрид (&amp;lt;code&amp;gt;_AccRgED&amp;lt;/code&amp;gt;), що дає складніші плани. &#039;&#039;&#039;Ціна:&#039;&#039;&#039; зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; = реструктуризація таблиці. Альтернатива (дочірня таблиця &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;) описана в Додатку Б і зберігається як план «Б» за результатами навантажувального тесту НТ-04.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.6.3. Таблиця проводок (без кореспонденції) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_b_0021 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    acc_mvt  smallint     NOT NULL CHECK (acc_mvt IN (0,1)),  -- 0=Дебет, 1=Кредит&lt;br /&gt;
    acc_r    uuid         NOT NULL REFERENCES coa_0006(ref),&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    ed1_t smallint, ed1_r uuid,&lt;br /&gt;
    ed2_t smallint, ed2_r uuid,&lt;br /&gt;
    ed3_t smallint, ed3_r uuid,&lt;br /&gt;
    ed_h     bigint       NOT NULL DEFAULT 0,&lt;br /&gt;
    r1       numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0021 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.4. Підсумки РБ ===&lt;br /&gt;
Підсумки будуються на кількох «рівнях субконто» — щоб запит без відбору за субконто не сканував найдетальнішу таблицю.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Рівень 0: залишки по рахунку + балансові вимірювання (без субконто)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,               -- Організація (балансове)&lt;br /&gt;
    r1       numeric(24,2) NOT NULL,               -- Сума: &amp;gt;0 = дебетовий, &amp;lt;0 = кредитовий залишок&lt;br /&gt;
    r2       numeric(24,3) NOT NULL,               -- Кількість&lt;br /&gt;
    r3       numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Рівень 1..3: залишки з розшифровкою по субконто (тільки для рахунків з ed_count &amp;gt;= k)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb1 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t   smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb1 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE rg_b_0020_tb2 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    ed2_t smallint NOT NULL, ed2_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb2 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, ed2_t, ed2_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- rg_b_0020_tb3 — аналогічно, 3 субконто&lt;br /&gt;
&lt;br /&gt;
-- Обороти (аналогічні рівні): tt0..tt3&lt;br /&gt;
CREATE TABLE rg_b_0020_tt0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    r1_dt numeric(24,2) NOT NULL, r1_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    r2_dt numeric(24,3) NOT NULL, r2_kt numeric(24,3) NOT NULL,&lt;br /&gt;
    r3_dt numeric(24,2) NOT NULL, r3_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tt0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Обороти між рахунками (кореспонденції)&lt;br /&gt;
CREATE TABLE rg_b_0020_tc (&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter  smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL,&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL,&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    r1        numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tc PRIMARY KEY (period, acc_dt_r, acc_kt_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Правило запису рівнів:&#039;&#039;&#039; для проводки з рахунком, що має &amp;lt;code&amp;gt;ed_count = k&amp;lt;/code&amp;gt;, оновлюються таблиці &amp;lt;code&amp;gt;tb0 … tbK&amp;lt;/code&amp;gt; (k+1 таблиць). Рахунки без субконто оновлюють лише &amp;lt;code&amp;gt;tb0&amp;lt;/code&amp;gt;. Субконто з ознакою «Тільки обороти» не потрапляють у &amp;lt;code&amp;gt;tb*&amp;lt;/code&amp;gt;, лише в &amp;lt;code&amp;gt;tt*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.7. Регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Нарахування: dims = Співробітник(d1, базове), Підрозділ(d2)&lt;br /&gt;
--              res  = Результат(r1), ВідпрацьованоДнів(r2), НормаДнів(r3)&lt;br /&gt;
--              attr = Графік(a1)&lt;br /&gt;
CREATE TABLE rg_c_0040 (&lt;br /&gt;
    rec_t        smallint      NOT NULL,&lt;br /&gt;
    rec_r        uuid          NOT NULL,&lt;br /&gt;
    line_no      int           NOT NULL,&lt;br /&gt;
    period       timestamp(0)  NOT NULL,      -- період реєстрації (початок місяця)&lt;br /&gt;
    active       boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    reversal     boolean       NOT NULL DEFAULT false,   -- Сторно&lt;br /&gt;
    calc_type_r  uuid          NOT NULL,                 -- ВидРозрахунку → pct_0011(ref)&lt;br /&gt;
    act_begin    timestamp(0)  NOT NULL,      -- ПеріодДіїПочаток&lt;br /&gt;
    act_end      timestamp(0)  NOT NULL,      -- ПеріодДіїКінець&lt;br /&gt;
    base_begin   timestamp(0),                -- БазовийПеріодПочаток&lt;br /&gt;
    base_end     timestamp(0),                -- БазовийПеріодКінець&lt;br /&gt;
    d1_r         uuid          NOT NULL,&lt;br /&gt;
    d2_r         uuid          NOT NULL,&lt;br /&gt;
    r1           numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    r3           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    a1_r         uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040 PRIMARY KEY (rec_t, rec_r, line_no),&lt;br /&gt;
    CONSTRAINT chk_rg_c_0040_act CHECK (act_end &amp;gt;= act_begin)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_period ON rg_c_0040 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_d1     ON rg_c_0040 (d1_r, period, calc_type_r) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_act    ON rg_c_0040 (d1_r, act_begin, act_end) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_base   ON rg_c_0040 (d1_r, calc_type_r, base_begin, base_end) WHERE active;&lt;br /&gt;
&lt;br /&gt;
-- Фактичні періоди дії (після витіснення). Один запис → 0..N інтервалів.&lt;br /&gt;
CREATE TABLE rg_c_0040_ap (&lt;br /&gt;
    rec_t       smallint     NOT NULL,&lt;br /&gt;
    rec_r       uuid         NOT NULL,&lt;br /&gt;
    line_no     int          NOT NULL,&lt;br /&gt;
    interval_no smallint     NOT NULL,&lt;br /&gt;
    calc_type_r uuid         NOT NULL,&lt;br /&gt;
    d1_r        uuid         NOT NULL,        -- денормалізація базового вимірювання для швидкого JOIN&lt;br /&gt;
    fact_begin  timestamp(0) NOT NULL,&lt;br /&gt;
    fact_end    timestamp(0) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_ap PRIMARY KEY (rec_t, rec_r, line_no, interval_no),&lt;br /&gt;
    CONSTRAINT fk_rg_c_0040_ap FOREIGN KEY (rec_t, rec_r, line_no)&lt;br /&gt;
        REFERENCES rg_c_0040 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_ap_d1 ON rg_c_0040_ap (d1_r, fact_begin, fact_end);&lt;br /&gt;
&lt;br /&gt;
-- Перерахунок «ПерерахунокЗаБазою»&lt;br /&gt;
CREATE TABLE rg_c_0040_rc1 (&lt;br /&gt;
    rec_t        smallint NOT NULL,     -- реєстратор запису, який треба перерахувати&lt;br /&gt;
    rec_r        uuid     NOT NULL,&lt;br /&gt;
    calc_type_r  uuid     NOT NULL,     -- вид розрахунку, що потребує перерахунку&lt;br /&gt;
    d1_r         uuid     NOT NULL,     -- вимірювання перерахунку «Співробітник»&lt;br /&gt;
    src_rec_t    smallint NOT NULL,     -- реєстратор, що спричинив перерахунок&lt;br /&gt;
    src_rec_r    uuid     NOT NULL,&lt;br /&gt;
    created_at   timestamp(0) NOT NULL DEFAULT now(),&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_rc1 PRIMARY KEY (rec_t, rec_r, calc_type_r, d1_r)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_rc1_src ON rg_c_0040_rc1 (src_rec_t, src_rec_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.8. Зведення: які таблиці породжує кожен тип регістру ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
РВ (незалежний)          →  rg_i_&amp;lt;id&amp;gt;&lt;br /&gt;
РВ (підпорядкований)     →  rg_i_&amp;lt;id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
РН (Залишки)             →  rg_a_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_tb        (якщо ДозволитиПідсумкиЗалишків)&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_tt        (якщо ДозволитиПідсумкиОборотів)&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_opt&lt;br /&gt;
&lt;br /&gt;
РН (Обороти)             →  rg_a_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_tt&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_ag1..agN  (агрегати)&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_opt&lt;br /&gt;
&lt;br /&gt;
РБ                       →  rg_b_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_tb0 .. _tbK   (K = МаксКількістьСубконто)&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_tt0 .. _ttK&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_tc&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_opt&lt;br /&gt;
&lt;br /&gt;
РР                       →  rg_c_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_c_&amp;lt;id&amp;gt;_ap&lt;br /&gt;
                            rg_c_&amp;lt;id&amp;gt;_rc1 .. _rcM   (перерахунки)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оцінка: для РБ з &amp;lt;code&amp;gt;МаксКількістьСубконто = 3&amp;lt;/code&amp;gt; генерується &#039;&#039;&#039;10 фізичних таблиць&#039;&#039;&#039; на один регістр.&lt;br /&gt;
&lt;br /&gt;
= 9. ER-моделі =&lt;br /&gt;
&lt;br /&gt;
== 9.1. ER-модель метаданих (репозиторій) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_type&amp;quot; as T {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * kind : varchar(20)&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  table_name : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register&amp;quot; as R {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK,FK→md_type&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * kind : varchar(12)&lt;br /&gt;
  * write_mode : varchar(24)&lt;br /&gt;
  * periodicity : varchar(24)&lt;br /&gt;
  accumulation_kind : varchar(10)&lt;br /&gt;
  enable_bal_totals : boolean&lt;br /&gt;
  enable_tno_totals : boolean&lt;br /&gt;
  tno_totals_period : varchar(6)&lt;br /&gt;
  split_totals : boolean&lt;br /&gt;
  chart_of_accounts_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  correspondence : boolean&lt;br /&gt;
  max_extdim_count : smallint&lt;br /&gt;
  calc_types_plan_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_period_mode : varchar(24)&lt;br /&gt;
  schedule_register_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
  * struct_version : int&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_field&amp;quot; as F {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * role : Dimension|Resource|Attribute&lt;br /&gt;
  * data_type_expr : text&lt;br /&gt;
  is_composite : boolean&lt;br /&gt;
  index_mode : varchar(28)&lt;br /&gt;
  is_master : boolean&lt;br /&gt;
  is_balance : boolean&lt;br /&gt;
  is_base_dimension : boolean&lt;br /&gt;
  accounting_flag : varchar(80)&lt;br /&gt;
  * column_prefix : varchar(8)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recorder&amp;quot; as RR {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * doc_type_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate&amp;quot; as AG {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * periodicity : Day|Month|Quarter|Year&lt;br /&gt;
  is_realtime : boolean&lt;br /&gt;
  actual_upto : timestamp&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate_dim&amp;quot; as AGD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * aggregate_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * field_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc&amp;quot; as RC {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc_dim&amp;quot; as RCD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * recalc_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * reg_field_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
T ||--o| R          : &amp;quot;є регістром&amp;quot;&lt;br /&gt;
T ||--o{ RR         : &amp;quot;тип документа&amp;quot;&lt;br /&gt;
R ||--|{ F          : &amp;quot;має поля&amp;quot;&lt;br /&gt;
R ||--o{ RR         : &amp;quot;реєстратори&amp;quot;&lt;br /&gt;
R ||--o{ AG         : &amp;quot;агрегати&amp;quot;&lt;br /&gt;
AG ||--|{ AGD       : &amp;quot;склад вимірювань&amp;quot;&lt;br /&gt;
F  ||--o{ AGD       : &amp;quot;вимірювання&amp;quot;&lt;br /&gt;
R ||--o{ RC         : &amp;quot;перерахунки&amp;quot;&lt;br /&gt;
RC ||--|{ RCD       : &amp;quot;вимірювання перерахунку&amp;quot;&lt;br /&gt;
F  ||--o{ RCD       : &amp;quot;відповідає&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план рахунків&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план видів розрахунку&amp;quot;&lt;br /&gt;
R }o--o| R          : &amp;quot;графік часу&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.2. ER-модель: регістр накопичення (вид «Залишки») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0002\n«ПрихіднаНакладна»&amp;quot; as D1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;doc_0003\n«ВидатковаНакладна»&amp;quot; as D2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0001\n«Номенклатура»&amp;quot; as C1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0004\n«Склади»&amp;quot; as C2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012\n«ТовариНаСкладах» (рухи)&amp;quot; as M {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * mvt : smallint  «0=Прихід,1=Витрата»&lt;br /&gt;
  * d1_r : uuid  «Номенклатура» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid  «Склад» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint «Партія:тип»&lt;br /&gt;
  * d3_r : uuid  «Партія:посилання»&lt;br /&gt;
  * d4_r : uuid  «Характеристика» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * r1 : numeric(15,3) «Кількість»&lt;br /&gt;
  * r2 : numeric(15,2) «Сума»&lt;br /&gt;
  a1 : varchar(200) «Коментар»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tb\nпідсумки залишків&amp;quot; as TB {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * r1 : numeric(20,3) «Кількість (±)»&lt;br /&gt;
  * r2 : numeric(20,2) «Сума (±)»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tt\nпідсумки оборотів&amp;quot; as TT {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_in, r1_out : numeric(20,3)&lt;br /&gt;
  r2_in, r2_out : numeric(20,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_opt&amp;quot; as OPT {&lt;br /&gt;
  * id : smallint = 1 &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * totals_actual_to : timestamp(0)&lt;br /&gt;
  use_bal_totals : boolean&lt;br /&gt;
  use_tno_totals : boolean&lt;br /&gt;
  min_period : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
D1 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
D2 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
C1 ||--o{ M : &amp;quot;d1_r&amp;quot;&lt;br /&gt;
C2 ||--o{ M : &amp;quot;d2_r&amp;quot;&lt;br /&gt;
M }o..|| TB : &amp;quot;агрегується в\n(підтримується платформою)&amp;quot;&lt;br /&gt;
M }o..|| TT : &amp;quot;агрегується в&amp;quot;&lt;br /&gt;
OPT ||..|| TB : &amp;quot;ТА підсумків&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note bottom of M&lt;br /&gt;
  PK = (rec_t, rec_r, line_no)&lt;br /&gt;
  → усі рухи одного документа&lt;br /&gt;
    фізично суміжні&lt;br /&gt;
  Партиціонування: RANGE(period)&lt;br /&gt;
end note&lt;br /&gt;
&lt;br /&gt;
note bottom of TB&lt;br /&gt;
  period = MAXPERIOD (&#039;5999-11-01&#039;)&lt;br /&gt;
  → рядок «залишок за всі періоди»&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.3. ER-модель: регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;coa_0005\n«План рахунків»&amp;quot; as A {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  parent_ref : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * code : varchar(20) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  order_code : varchar(40)&lt;br /&gt;
  * name : varchar(150)&lt;br /&gt;
  * acc_type : smallint «Акт/Пас/АП»&lt;br /&gt;
  off_balance : boolean&lt;br /&gt;
  ed_count : smallint&lt;br /&gt;
  fl_qty, fl_cur : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;coa_0005_ed\n«Види субконто рахунку»&amp;quot; as AE {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * ed_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  only_tno : boolean&lt;br /&gt;
  sum_flag : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cvt_0009\n«ПВХ.ВидиСубконто»&amp;quot; as VT {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  value_type : text&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020\n«Госпрозрахунковий» (проводки)&amp;quot; as J {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * acc_dt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid «Організація (балансове)»&lt;br /&gt;
  * d2_dt_r : uuid «Підрозділ Дт»&lt;br /&gt;
  * d2_kt_r : uuid «Підрозділ Кт»&lt;br /&gt;
  ed_dt1_t/_r .. ed_dt3_t/_r : «субконто Дт»&lt;br /&gt;
  ed_dt_h : bigint&lt;br /&gt;
  ed_kt1_t/_r .. ed_kt3_t/_r : «субконто Кт»&lt;br /&gt;
  ed_kt_h : bigint&lt;br /&gt;
  * r1 : numeric(20,2) «Сума (балансовий)»&lt;br /&gt;
  r2_dt, r2_kt : numeric(20,3) «Кількість»&lt;br /&gt;
  r3_dt, r3_kt : numeric(20,2) «ВалютнаСума»&lt;br /&gt;
  a1 : varchar(255) «Зміст»&lt;br /&gt;
  a2_r : uuid «Валюта»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb0\nзалишки, рівень 0&amp;quot; as B0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric «знакові»&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb1..tb3\nзалишки, рівні 1..3&amp;quot; as B1 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * ed1_t, ed1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed2_t, ed2_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed3_t, ed3_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tt0..tt3\nобороти за рівнями&amp;quot; as T0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed…) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_dt, r1_kt&lt;br /&gt;
  r2_dt, r2_kt&lt;br /&gt;
  r3_dt, r3_kt&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tc\nобороти Дт↔Кт&amp;quot; as TC {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_dt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric(24,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
A ||--o{ AE : &amp;quot;види субконто&amp;quot;&lt;br /&gt;
VT ||--o{ AE : &amp;quot;тип субконто&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_dt_r&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_kt_r&amp;quot;&lt;br /&gt;
A ||--o{ B0 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
A ||--o{ B1 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
J }o..|| B0 : &amp;quot;агрегується (Дт: +, Кт: −)&amp;quot;&lt;br /&gt;
J }o..|| B1 : &amp;quot;агрегується, якщо ed_count ≥ k&amp;quot;&lt;br /&gt;
J }o..|| T0 : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
J }o..|| TC : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note right of J&lt;br /&gt;
  Балансовий ресурс r1 — одне значення,&lt;br /&gt;
  контроль Σ(Дт) = Σ(Кт) у межах реєстратора.&lt;br /&gt;
  Небалансові ресурси — пара Дт/Кт.&lt;br /&gt;
  Субконто — слоти (див. Рішення №2).&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.4. ER-модель: регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;uml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;pct_0011\n«ПВР.ОсновніНарахування»&amp;quot; as P {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_dependency : varchar(24)&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_base\n«Базові види розрахунку»&amp;quot; as PB {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * base_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_displace\n«Витісняючі види розрахунку»&amp;quot; as PD {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * displacing_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_lead\n«Ведучі види розрахунку»&amp;quot; as PL {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * leading_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040\n«Нарахування» (рухи)&amp;quot; as CR {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0) «період реєстрації»&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * reversal : boolean «Сторно»&lt;br /&gt;
  * calc_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * act_begin : timestamp(0)&lt;br /&gt;
  * act_end : timestamp(0)&lt;br /&gt;
  base_begin : timestamp(0)&lt;br /&gt;
  base_end : timestamp(0)&lt;br /&gt;
  * d1_r : uuid «Співробітник (базове)»&lt;br /&gt;
  * d2_r : uuid «Підрозділ»&lt;br /&gt;
  r1 : numeric «Результат»&lt;br /&gt;
  r2 : numeric «ВідпрацьованоДнів»&lt;br /&gt;
  r3 : numeric «НормаДнів»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_ap\nфактичні періоди дії&amp;quot; as AP {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * interval_no : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * calc_type_r : uuid&lt;br /&gt;
  * d1_r : uuid&lt;br /&gt;
  * fact_begin : timestamp(0)&lt;br /&gt;
  * fact_end : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_rc1\n«ПерерахунокЗаБазою»&amp;quot; as RC {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * calc_type_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  src_rec_t, src_rec_r&lt;br /&gt;
  created_at&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_i_0015\n«ГрафікРоботи» (РВ)&amp;quot; as SCH {&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ВидГрафіка»&lt;br /&gt;
  * d2_d : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ДатаГрафіка»&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric «Значення»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0007\n«НарахуванняЗарплати»&amp;quot; as DOC {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number, date, posted&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
P ||--o{ CR  : &amp;quot;calc_type_r&amp;quot;&lt;br /&gt;
P ||--o{ PB  : &amp;quot;базові&amp;quot;&lt;br /&gt;
P ||--o{ PD  : &amp;quot;витісняючі&amp;quot;&lt;br /&gt;
P ||--o{ PL  : &amp;quot;ведучі&amp;quot;&lt;br /&gt;
DOC ||..o{ CR : &amp;quot;реєстратор&amp;quot;&lt;br /&gt;
CR ||--|{ AP : &amp;quot;1 запис → 0..N\nфактичних інтервалів&amp;quot;&lt;br /&gt;
CR }o..o{ RC : &amp;quot;потребує перерахунку&amp;quot;&lt;br /&gt;
SCH }o..o{ CR : &amp;quot;ДаніГрафіка\n(віртуальна таблиця)&amp;quot;&lt;br /&gt;
CR }o..o{ CR : &amp;quot;БазаРозрахунку\n(self-join через PB\nта базові вимірювання)&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/uml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.5. Зведена концептуальна ER (усі типи) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph ER {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=record, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9, style=filled];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  MD  [label=&amp;quot;{md_register|id (PK)\lname\lkind\lperiodicity\lwrite_mode\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDF [label=&amp;quot;{md_register_field|register_id (PK,FK)\lid (PK)\lname\lrole\ldata_type\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDR [label=&amp;quot;{md_register_recorder|register_id (PK,FK)\ldoc_type_id (PK,FK)\l}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  DOC [label=&amp;quot;{doc_XXXX (Документ)|ref (PK)\lnumber\ldate\lposted\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  CAT [label=&amp;quot;{cat_XXXX (Довідник)|ref (PK)\lcode\lname\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  COA [label=&amp;quot;{coa_XXXX (План рахунків)|ref (PK)\lcode\lacc_type\led_count\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  PCT [label=&amp;quot;{pct_XXXX (ПВР)|ref (PK)\lcode\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI  [label=&amp;quot;{rg_i_XXXX (РВ)|period (PK*)\ld1..dN (PK*)\l| rec_t,rec_r,line_no (PK**)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA  [label=&amp;quot;{rg_a_XXXX (РН)|rec_t, rec_r, line_no (PK)\lperiod\lactive\lmvt\ld1..dN\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  RAT [label=&amp;quot;{rg_a_XXXX_tb / _tt|period (PK)\ld1..dN (PK)\lsplitter (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  RB  [label=&amp;quot;{rg_b_XXXX (РБ)|rec_t, rec_r, line_no (PK)\lperiod, active\lacc_dt_r, acc_kt_r\led_dt1..3, ed_kt1..3\ld1..dN\lr1, r2_dt/r2_kt\l}&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RBT [label=&amp;quot;{rg_b_XXXX_tb0..tbK\lrg_b_XXXX_tt0..ttK\lrg_b_XXXX_tc|period, acc_r, d1..dN\led1..edK (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;];&lt;br /&gt;
  RC  [label=&amp;quot;{rg_c_XXXX (РР)|rec_t, rec_r, line_no (PK)\lperiod, active, reversal\lcalc_type_r\lact_begin, act_end\lbase_begin, base_end\ld1..dN, r1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
  RCA [label=&amp;quot;{rg_c_XXXX_ap|rec_t,rec_r,line_no (PK,FK)\linterval_no (PK)\lfact_begin, fact_end\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
  RCR [label=&amp;quot;{rg_c_XXXX_rc1..rcM|rec_t, rec_r (PK)\lcalc_type_r (PK)\ld1..dN (PK)\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  MD  -&amp;gt; MDF [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; MDR [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MDR -&amp;gt; DOC [label=&amp;quot;тип&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; COA [label=&amp;quot;0:1 план рахунків&amp;quot;, style=dashed];&lt;br /&gt;
  MD  -&amp;gt; PCT [label=&amp;quot;0:1 ПВР&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  MD -&amp;gt; RI [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RA [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RB [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RC [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
&lt;br /&gt;
  DOC -&amp;gt; RI [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RA [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RB [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RC [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  CAT -&amp;gt; RI [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  CAT -&amp;gt; RA [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  COA -&amp;gt; RB [label=&amp;quot;FK рахунок&amp;quot;];&lt;br /&gt;
  PCT -&amp;gt; RC [label=&amp;quot;FK вид розрах.&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RA -&amp;gt; RAT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RB -&amp;gt; RBT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RC -&amp;gt; RCA [label=&amp;quot;витіснення → 1:N&amp;quot;, color=purple];&lt;br /&gt;
  RC -&amp;gt; RCR [label=&amp;quot;реєстрація перерахунків&amp;quot;, color=purple, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  { rank=same; MD; MDF; MDR; }&lt;br /&gt;
  { rank=same; RI; RA; RB; RC; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Легенда:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;(PK*)&amp;lt;/code&amp;gt; — ключ для незалежного РВ; &amp;lt;code&amp;gt;(PK**)&amp;lt;/code&amp;gt; — для підпорядкованого.&lt;br /&gt;
* Пунктир «реєстратор» — логічний зв&#039;язок без FK (поліморфне посилання, підтримується платформою).&lt;br /&gt;
* Пунктир «генерує DDL» — метадані → фізична схема (не зв&#039;язок даних).&lt;br /&gt;
&lt;br /&gt;
= 10. Ключові алгоритми =&lt;br /&gt;
&lt;br /&gt;
== 10.1. Запис набору записів (режим «Заміщати») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def write_record_set(reg: Register, rs: RecordSet, replace: bool = True) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Розділ 7.1, ФТ-01…ФТ-04. Уся операція — в одній транзакції.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    check_rights(reg, Right.INSERT | Right.UPDATE)              # ФТ-37&lt;br /&gt;
    validate(reg, rs)                                           # реєстратор ∈ md_register_recorder;&lt;br /&gt;
                                                                # deny_empty; для РБ — Σ Дт = Σ Кт&lt;br /&gt;
    with conn.begin():                                          # ФТ-03: одна транзакція&lt;br /&gt;
        old = read_for_update(reg, rs.filter)                   # SELECT ... FOR UPDATE&lt;br /&gt;
&lt;br /&gt;
        # АП-2: дельта рахується набором, один раз; тільки active-записи&lt;br /&gt;
        delta = aggregate(rs.active_records, sign=+1) + aggregate(old, sign=-1)&lt;br /&gt;
&lt;br /&gt;
        if replace:                                             # ФТ-04&lt;br /&gt;
            conn.execute(delete(tbl).where(*rs.filter.clauses))  # 1 запит&lt;br /&gt;
        conn.execute(insert(tbl), rs.as_dicts())                 # 1 executemany (АП-1)&lt;br /&gt;
&lt;br /&gt;
        update_totals(reg, delta)                               # -&amp;gt; merge_totals(), розділи 10.2, Е.3&lt;br /&gt;
&lt;br /&gt;
        if reg.kind is RegisterKind.CALCULATION:&lt;br /&gt;
            keys = rs.affected_keys | affected_keys(old)&lt;br /&gt;
            recompute_actual_periods(reg, keys)                 # розділ 10.4&lt;br /&gt;
            register_recalculations(reg, [*rs.records, *old])   # розділ 10.5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.2. Інкрементальне оновлення підсумків залишків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Δ (delta) — тимчасова таблиця: (period_month, d1_r, d2_r, d3_t, d3_r, d4_r, dr1, dr2)&lt;br /&gt;
-- де dr = Σ (CASE WHEN mvt = 0 THEN +значення ELSE -значення END)&lt;br /&gt;
&lt;br /&gt;
-- Крок 1. Кумулятивні залишки: рух у місяці M впливає на підсумки всіх періодів &amp;gt; M&lt;br /&gt;
--         та на рядок MAXPERIOD.&lt;br /&gt;
INSERT INTO rg_a_0012_tb AS t (period, splitter, d1_r, d2_r, d3_t, d3_r, d4_r, r1, r2)&lt;br /&gt;
SELECT p.period, :splitter, d.d1_r, d.d2_r, d.d3_t, d.d3_r, d.d4_r, d.dr1, d.dr2&lt;br /&gt;
FROM   delta d&lt;br /&gt;
CROSS  JOIN LATERAL (&lt;br /&gt;
         SELECT period FROM totals_periods&lt;br /&gt;
         WHERE period &amp;gt;  d.period_month&lt;br /&gt;
           AND period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
         UNION ALL SELECT TIMESTAMP &#039;5999-11-01&#039;      -- MAXPERIOD&lt;br /&gt;
       ) p&lt;br /&gt;
ORDER BY 1,3,4,5,6,7                                   -- детермінований порядок → без дедлоків&lt;br /&gt;
ON CONFLICT (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
DO UPDATE SET r1 = t.r1 + EXCLUDED.r1,&lt;br /&gt;
              r2 = t.r2 + EXCLUDED.r2;&lt;br /&gt;
&lt;br /&gt;
-- Крок 2. Прибирання нульових рядків (регламентно, не в транзакції проведення)&lt;br /&gt;
DELETE FROM rg_a_0012_tb WHERE r1 = 0 AND r2 = 0 AND period &amp;lt;&amp;gt; TIMESTAMP &#039;5999-11-01&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Оптимізація.&#039;&#039;&#039; Крок 1 у наведеному вигляді має складність O(кількість_періодів_після_руху). Для рухів «заднім числом» на роки це дорого. &#039;&#039;&#039;Проєктне рішення №3:&#039;&#039;&#039; підсумки оновлюються тільки для рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; і для найближчої межі періоду; повні кумулятивні зрізи перебудовуються регламентним завданням «Перерахунок підсумків» за зміненими місяцями (список змінених місяців накопичується в &amp;lt;code&amp;gt;rg_a_0012_opt.dirty_months&amp;lt;/code&amp;gt;). Запити на дату в «брудному» місяці автоматично перемикаються на розрахунок від найближчого чистого зрізу. Остаточний вибір — за результатами НТ-02.}}&lt;br /&gt;
&lt;br /&gt;
== 10.3. Трансляція віртуальної таблиці «Залишки» ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрНакопичення.ТовариНаСкладах.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад)&lt;br /&gt;
WITH boundary AS (&lt;br /&gt;
    SELECT COALESCE(MAX(period), TIMESTAMP &#039;0001-01-01&#039;) AS p&lt;br /&gt;
    FROM   totals_periods&lt;br /&gt;
    WHERE  period &amp;lt;= :Період&lt;br /&gt;
      AND  period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
),&lt;br /&gt;
base AS (                                    -- залишок на межу періоду з підсумків&lt;br /&gt;
    SELECT t.d1_r, t.d2_r, t.d3_t, t.d3_r, t.d4_r,&lt;br /&gt;
           SUM(t.r1) AS r1, SUM(t.r2) AS r2&lt;br /&gt;
    FROM   rg_a_0012_tb t, boundary b&lt;br /&gt;
    WHERE  t.period = b.p&lt;br /&gt;
      AND  t.d2_r  = :Склад                  -- push-down параметра ВТ&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
),&lt;br /&gt;
tail AS (                                    -- «живі» рухи після межі й до &amp;amp;Період&lt;br /&gt;
    SELECT m.d1_r, m.d2_r, m.d3_t, m.d3_r, m.d4_r,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r1 ELSE -m.r1 END) AS r1,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r2 ELSE -m.r2 END) AS r2&lt;br /&gt;
    FROM   rg_a_0012 m, boundary b&lt;br /&gt;
    WHERE  m.active&lt;br /&gt;
      AND  m.period &amp;gt;  b.p&lt;br /&gt;
      AND  m.period &amp;lt;= :Період&lt;br /&gt;
      AND  m.d2_r   =  :Склад&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
)&lt;br /&gt;
SELECT d1_r AS &amp;quot;Номенклатура&amp;quot;, d2_r AS &amp;quot;Склад&amp;quot;,&lt;br /&gt;
       d3_t, d3_r AS &amp;quot;Партія&amp;quot;, d4_r AS &amp;quot;Характеристика&amp;quot;,&lt;br /&gt;
       SUM(r1) AS &amp;quot;КількістьЗалишок&amp;quot;,&lt;br /&gt;
       SUM(r2) AS &amp;quot;СумаЗалишок&amp;quot;&lt;br /&gt;
FROM  (SELECT * FROM base UNION ALL SELECT * FROM tail) u&lt;br /&gt;
GROUP BY 1,2,3,4,5&lt;br /&gt;
HAVING SUM(r1) &amp;lt;&amp;gt; 0 OR SUM(r2) &amp;lt;&amp;gt; 0;         -- нульові залишки не повертаються&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Оптимізація для найчастішого випадку:&#039;&#039;&#039; якщо &amp;lt;code&amp;gt;:Період ≥ ТА&amp;lt;/code&amp;gt; і в регістрі немає рухів у майбутньому — &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; читається з рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; одним index seek, &amp;lt;code&amp;gt;tail&amp;lt;/code&amp;gt; = ∅.&lt;br /&gt;
&lt;br /&gt;
== 10.4. Розрахунок фактичних періодів дії (витіснення) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def recompute_actual_periods(reg: Register, keys: set[DimKey]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Розділ 7.5.1, ФТ-22…ФТ-24. Тут — оркестрація; сам алгоритм — Додаток Е.5.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    tbl = schema.movements(reg)&lt;br /&gt;
    ap = schema.actual_periods(reg)                     # rg_c_&amp;lt;id&amp;gt;_ap&lt;br /&gt;
&lt;br /&gt;
    # 1. Читання всіх записів зачеплених ключів — ОДИН запит (АП-1)&lt;br /&gt;
    records = conn.execute(&lt;br /&gt;
        select(tbl).where(tbl.c.active, dim_key_in(tbl, keys))&lt;br /&gt;
    ).all()&lt;br /&gt;
&lt;br /&gt;
    # 2. Перерахунок інтервалів. Гарячий шлях: бюджет ≤ 3 c (АП-4),&lt;br /&gt;
    #    реалізація за Protocol-інтерфейсом (АП-3) — див. Е.5.&lt;br /&gt;
    #    Пріоритет: A витісняється B, якщо B ∈ ПВР[A].ВитісняючіВидиРозрахунку&lt;br /&gt;
    intervals = displacement_engine.compute(records, displaces=plan.displaces)&lt;br /&gt;
&lt;br /&gt;
    # 3. Заміщення фактичних періодів — два запити на весь набір, не на запис&lt;br /&gt;
    conn.execute(delete(ap).where(record_key_in(ap, intervals.keys())))&lt;br /&gt;
    conn.execute(insert(ap), [&lt;br /&gt;
        {&amp;quot;rec_t&amp;quot;: k.rec_t, &amp;quot;rec_r&amp;quot;: k.rec_r, &amp;quot;line_no&amp;quot;: k.line_no,&lt;br /&gt;
         &amp;quot;interval_no&amp;quot;: n, &amp;quot;calc_type_r&amp;quot;: k.calc_type, &amp;quot;d1_r&amp;quot;: k.base_dim,&lt;br /&gt;
         &amp;quot;fact_begin&amp;quot;: begin, &amp;quot;fact_end&amp;quot;: end}&lt;br /&gt;
        for k, ivs in intervals.items()&lt;br /&gt;
        for n, (begin, end) in enumerate(ivs)            # 1 запис -&amp;gt; 0..N інтервалів&lt;br /&gt;
    ])&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Складність:&#039;&#039;&#039; O(|Z|² ) на ключ. Обмеження: якщо &amp;lt;code&amp;gt;|Z| &amp;gt; 500&amp;lt;/code&amp;gt; для одного ключа — попередження в журналі та перехід на алгоритм замітання (sweep line) O(|Z| log |Z|).&lt;br /&gt;
&lt;br /&gt;
== 10.5. Реєстрація перерахунків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
def register_recalculations(reg: Register, changed: Sequence[CalcRecord]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Розділ 7.5.3, ФТ-26. АП-2: пошук залежних виконує СКБД, а не цикл у Python.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    q = schema.movements(reg).alias(&amp;quot;q&amp;quot;)&lt;br /&gt;
    b = schema.calc_plan_base(reg).alias(&amp;quot;b&amp;quot;)           # ТЧ «БазовіВидиРозрахунку» ПВР&lt;br /&gt;
&lt;br /&gt;
    for recalc in reg.recalculations:&lt;br /&gt;
        rc = schema.recalc_table(reg, recalc)           # rg_c_&amp;lt;id&amp;gt;_rc&amp;lt;n&amp;gt;&lt;br /&gt;
        src = values_of(changed).alias(&amp;quot;src&amp;quot;)           # змінені записи як VALUES-таблиця&lt;br /&gt;
&lt;br /&gt;
        # інтервальний предикат залежно від режиму базового періоду&lt;br /&gt;
        if reg.base_period == &amp;quot;ByActionPeriod&amp;quot;:&lt;br /&gt;
            in_base = and_(src.c.act_begin &amp;lt;= q.c.base_end,&lt;br /&gt;
                           src.c.act_end &amp;gt;= q.c.base_begin)     # перетин періодів&lt;br /&gt;
        else:                                                    # ByRegistrationPeriod&lt;br /&gt;
            in_base = src.c.period.between(q.c.base_begin, q.c.base_end)&lt;br /&gt;
&lt;br /&gt;
        dependent = (&lt;br /&gt;
            select(q.c.rec_t, q.c.rec_r, q.c.calc_type_r,&lt;br /&gt;
                   *[q.c[c] for c in recalc.dim_columns],&lt;br /&gt;
                   src.c.rec_t.label(&amp;quot;src_rec_t&amp;quot;), src.c.rec_r.label(&amp;quot;src_rec_r&amp;quot;))&lt;br /&gt;
            .select_from(&lt;br /&gt;
                src.join(b, b.c.base_type_r == src.c.calc_type_r)   # z — базовий для q&lt;br /&gt;
                   .join(q, q.c.calc_type_r == b.c.ref))&lt;br /&gt;
            .where(q.c.active, in_base,&lt;br /&gt;
                   *[q.c[c] == src.c[c] for c in recalc.dim_columns],&lt;br /&gt;
                   tuple_(q.c.rec_t, q.c.rec_r) != tuple_(src.c.rec_t, src.c.rec_r))&lt;br /&gt;
            .distinct()&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
        stmt = pg_insert(rc).from_select(list(rc.columns.keys()), dependent)&lt;br /&gt;
        conn.execute(stmt.on_conflict_do_nothing())     # 1 запит на перерахунок (АП-1)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.6. Зріз останніх ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрВідомостей.КурсиВалют.ЗрізОстанніх(&amp;amp;Дата, Валюта В (&amp;amp;Список))&lt;br /&gt;
SELECT DISTINCT ON (r.d1_r)&lt;br /&gt;
       r.d1_r AS &amp;quot;Валюта&amp;quot;, r.period AS &amp;quot;Період&amp;quot;, r.r1 AS &amp;quot;Курс&amp;quot;, r.r2 AS &amp;quot;Кратність&amp;quot;&lt;br /&gt;
FROM   rg_i_0007 r&lt;br /&gt;
WHERE  r.period &amp;lt;= :Дата&lt;br /&gt;
  AND  r.d1_r = ANY (:Список)&lt;br /&gt;
ORDER  BY r.d1_r, r.period DESC;       -- використовує ix_rg_i_0007_d1 (d1_r, period DESC)&lt;br /&gt;
-- Для MS SQL: ROW_NUMBER() OVER (PARTITION BY d1_r ORDER BY period DESC) = 1&lt;br /&gt;
--             або OUTER APPLY (SELECT TOP 1 ...) для великих списків.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 11. Нефункціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 11.1. Продуктивність ==&lt;br /&gt;
Еталонний стенд: 16 vCPU, 128 ГБ RAM, NVMe, PostgreSQL 15, БД 1,5 ТБ.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Операція !! Обсяг !! Ціль (P95)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01 || Залишки на поточну дату, відбір за 1 вимірюванням || 1 млрд рухів, 20 млн рядків підсумків || ≤ 200 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-02 || Залишки на довільну дату в межах ТА || те саме || ≤ 400 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-03 || Обороти за 12 місяців із групуванням || 1 млрд рухів || ≤ 2 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-04 || Проведення документа зі 100 рядками рухів (3 регістри) || — || ≤ 300 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-05 || Оборотно-сальдова відомість по всіх рахунках за місяць || 200 млн проводок || ≤ 5 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-06 || Розрахунок ЗП: 10 000 співробітників × 8 видів розрахунку || — || ≤ 10 хв&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-07 || Зріз останніх по 5 000 елементів вимірювання || 50 млн записів РВ || ≤ 500 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-08 || Пропускна здатність проведення || — || ≥ 50 док/с (10 паралельних сеансів)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-09 || Перерахунок підсумків РН || 1 млрд рухів || ≤ 4 год (у вікні обслуговування)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Вплив мови ядра.&#039;&#039;&#039; Цілі НФВ-01…НФВ-09 сформульовані для архітектури, де обчислює СКБД, а Python-ядро лише формує SQL (принципи АП-1, АП-2). Аналіз частки Python у кожній цілі — розділ 4.4.2: максимум 5 % (НФВ-04), запас на НФВ-06 — ×40. &#039;&#039;&#039;Цілі не переглядаються у зв&#039;язку з вибором Python.&#039;&#039;&#039;}}&lt;br /&gt;
&lt;br /&gt;
== 11.2. Масштабованість і обсяги ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Макс. записів в одному регістрі || 10&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Макс. кількість регістрів у конфігурації || 2 000&lt;br /&gt;
|-&lt;br /&gt;
| Макс. одночасних сеансів проведення || 200&lt;br /&gt;
|-&lt;br /&gt;
| Секціонування || Обов&#039;язкове для таблиць &amp;gt; 100 млн записів&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 11.3. Надійність і цілісність ==&lt;br /&gt;
* НФВ-10. Рухи та реєстратор змінюються в одній транзакції БД; часткове проведення неможливе.&lt;br /&gt;
* НФВ-11. Аварійне завершення сервера не залишає підсумки неузгодженими (гарантується транзакцією).&lt;br /&gt;
* НФВ-12. Сервіс перевірки цілісності (ФТ-41) виконується регламентно; розбіжність підсумків = інцидент P1.&lt;br /&gt;
&lt;br /&gt;
== 11.4. Супроводжуваність ==&lt;br /&gt;
* НФВ-13. Реструктуризація регістру (додавання ресурсу/реквізиту) для таблиці ≤ 100 млн записів — ≤ 30 хв.&lt;br /&gt;
* НФВ-14. Додавання вимірювання вимагає перебудови підсумків; система повинна попереджати про оцінку часу до початку операції.&lt;br /&gt;
* НФВ-15. Усі DDL-операції — ідемпотентні та скриптовані (можливість застосувати вручну).&lt;br /&gt;
&lt;br /&gt;
== 11.5. Сумісність ==&lt;br /&gt;
* НФВ-16. PostgreSQL 14+ та MS SQL Server 2019+ — обидві платформи з однаковою функціональністю.&lt;br /&gt;
* НФВ-17. Генератор DDL ізольований у шар «діалект СКБД».&lt;br /&gt;
&lt;br /&gt;
= 12. Міграція існуючих структур K2 ERP =&lt;br /&gt;
&lt;br /&gt;
== 12.1. Етапи ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Етап !! Результат&lt;br /&gt;
|-&lt;br /&gt;
| М1 || Інвентаризація || Реєстр наявних «регістроподібних» таблиць K2 з класифікацією за типом-мішенню (РВ/РН/РБ/РР).&lt;br /&gt;
|-&lt;br /&gt;
| М2 || Мапінг || Для кожної таблиці — метаопис цільового регістру + правила перетворення колонок.&lt;br /&gt;
|-&lt;br /&gt;
| М3 || Створення регістрів || Генерація метаданих і DDL у тестовому контурі.&lt;br /&gt;
|-&lt;br /&gt;
| М4 || Перенесення даних || ETL: історичні дані → рухи, з призначенням реєстратора (реальний документ або службовий «ВведенняЗалишків»).&lt;br /&gt;
|-&lt;br /&gt;
| М5 || Побудова підсумків || Повний перерахунок.&lt;br /&gt;
|-&lt;br /&gt;
| М6 || Звірка || Порівняння залишків/оборотів «стара система vs нова» на контрольних датах; допуск розбіжності = 0.&lt;br /&gt;
|-&lt;br /&gt;
| М7 || Перемикання коду || Заміна прямих SQL-звернень на віртуальні таблиці; період паралельної роботи ≥ 1 звітний період.&lt;br /&gt;
|-&lt;br /&gt;
| М8 || Виведення з експлуатації || Видалення старих таблиць після 2 закритих періодів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 12.2. Проблемні випадки ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Випадок !! Рішення&lt;br /&gt;
|-&lt;br /&gt;
| Історичні записи без документа-джерела || Службовий документ &amp;lt;code&amp;gt;ВведенняЗалишків&amp;lt;/code&amp;gt; (один на період/розділ).&lt;br /&gt;
|-&lt;br /&gt;
| Записи з дублями за ключем (для незалежного РВ) || Дедуплікація з протоколом; конфлікти — на ручний розбір.&lt;br /&gt;
|-&lt;br /&gt;
| Дробові періоди / некоректні дати (NULL, 1900-01-01) || Нормалізація до MINPERIOD; протокол.&lt;br /&gt;
|-&lt;br /&gt;
| Прикладний код, що пише в таблиці напряму || Заборона на рівні прав БД після М7; аудит звернень на етапі М3–М6.&lt;br /&gt;
|-&lt;br /&gt;
| Аналітика, відсутня в цільовій моделі || Перенесення в реквізити (не у вимірювання) або відмова від міграції з обґрунтуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 13. Приймальні випробування =&lt;br /&gt;
&lt;br /&gt;
== 13.1. Функціональні тести (витяг) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Сценарій !! Очікуваний результат&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-01 || Створити РВ періодичний незалежний, записати 2 записи з однаковим ключем || Другий запис заміщує перший; у таблиці 1 рядок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-02 || Провести документ → 5 рухів РН || 5 записів у &amp;lt;code&amp;gt;rg_a_*&amp;lt;/code&amp;gt;; підсумки MAXPERIOD змінилися на суму дельти&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-03 || Скасувати проведення || 0 записів; підсумки повернулися до вихідних значень&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-04 || Видалити документ-реєстратор || Рухи видалені каскадно; перевірка цілісності — 0 помилок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-05 || Записати рух заднім числом (−6 міс.) || Залишки на всі дати після руху коректні (звірка з повним перерахунком)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-06 || Установити &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; || Запис не впливає на віртуальні таблиці; підсумки скориговані&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-07 || РБ: провести незбалансовану проводку (Дт ≠ Кт за балансовим ресурсом) || Помилка проведення, транзакція відкочена&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-08 || РБ: ОСВ по рахунку з 3 субконто || Підсумки за рівнями 0–3 узгоджені між собою (згортка tb3 → tb0)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-09 || РР: сценарій «Оклад + Відпустка + Лікарняний» (розд. 7.5.1) || Фактичні періоди дії відповідають еталону; «Оклад» дає 2 інтервали&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-10 || РР: зміна базового запису || У таблиці перерахунку з&#039;явився запис для залежного документа&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-11 || Паралельне проведення 2 документів за різними складами || Обидва проходять без очікування (розділення підсумків увімкнено)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-12 || Паралельне проведення 2 документів за одним складом і одним товаром з контролем залишків || Один чекає, другий проходить; від&#039;ємного залишку немає&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-13 || Перерахунок підсумків після хаотичних 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; операцій || Підсумки збігаються з повним перерахунком «з нуля» до копійки&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-14 || Реструктуризація: додати ресурс до РН із 10 млн записів || Дані збережені, підсумки перебудовані, час ≤ НФВ-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-15 || RLS: користувач з обмеженням по організації || Віртуальні таблиці повертають лише дозволені дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 13.2. Навантажувальні тести ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Тест !! Критерій&lt;br /&gt;
|-&lt;br /&gt;
| НТ-01 || Генерація 1 млрд рухів РН, заміри НФВ-01…НФВ-03 || Досягнення цілей&lt;br /&gt;
|-&lt;br /&gt;
| НТ-02 || Профіль «90 % рухів поточним періодом, 10 % заднім числом» — порівняння двох стратегій підсумків (розд. 10.2) || Обґрунтований вибір Рішення №3&lt;br /&gt;
|-&lt;br /&gt;
| НТ-03 || Пікове проведення 50 док/с протягом 1 год || Відсутність дедлоків; P95 ≤ НФВ-04&lt;br /&gt;
|-&lt;br /&gt;
| НТ-04 || РБ: субконто-слоти vs дочірня таблиця, 200 млн проводок || Обґрунтований вибір Рішення №2&lt;br /&gt;
|-&lt;br /&gt;
| НТ-05 || Розрахунок ЗП на 10 000 співробітників || НФВ-06&lt;br /&gt;
|-&lt;br /&gt;
| НТ-06 || Деградація за 24 год безперервної роботи || Приріст часу відгуку ≤ 15 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 14. Етапи робіт та оцінка =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Етап !! Зміст !! Результат !! Оцінка, чол.-міс. !! Залежності&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е0&#039;&#039;&#039; || Обстеження платформи, верифікація припущень П1–П6, ескізний проєкт || Затверджений архітектурний ескіз, уточнене ТЗ || 1,5 || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е1&#039;&#039;&#039; || Метамодель + репозиторій + генератор DDL + конструктор (базовий) || Створення регістру будь-якого типу з генерацією схеми || 3 || Е0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е2&#039;&#039;&#039; || Регістр відомостей: рантайм, набори записів, зрізи, форми || РВ у продуктиві || 2,5 || Е1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е3&#039;&#039;&#039; || Регістр накопичення: рухи, підсумки, ТА, віртуальні таблиці || РН у продуктиві || 5 || Е2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е4&#039;&#039;&#039; || Механізм проведення документів, блокування, оперативне/неоперативне проведення || Транзакційне проведення || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е5&#039;&#039;&#039; || Розширення мови запитів (віртуальні таблиці, транслятор, push-down) || Запити до ВТ || 3,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е6&#039;&#039;&#039; || Регістр бухгалтерії + план рахунків + субконто + підсумки за рівнями || РБ у продуктиві || 6 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е7&#039;&#039;&#039; || Регістр розрахунку + ПВР + витіснення + база + графіки + перерахунки || РР у продуктиві || 6,5 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е8&#039;&#039;&#039; || Агрегати, розділення підсумків, порадник агрегатів || Оптимізація || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е9&#039;&#039;&#039; || Права доступу, RLS, аудит, сервіси цілісності || Безпека та адміністрування || 2 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е10&#039;&#039;&#039; || Реструктуризація, міграція, інструменти звірки || Інструменти міграції || 2 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е11&#039;&#039;&#039; || Навантажувальне тестування, оптимізація, документація, &#039;&#039;&#039;профілювання Python + бенчмарки гарячих шляхів&#039;&#039;&#039; || Приймальні випробування || 4,5 || усі&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РАЗОМ&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|Оцінка орієнтовна (±40 %) і підлягає уточненню за результатами Е0. Критичний шлях: Е0 → Е1 → Е3 → Е5 → Е6/Е7 → Е11. За командою 6–8 інженерів — орієнтовно 9–11 календарних місяців.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Мінімальний життєздатний обсяг (MVP)&#039;&#039;&#039;: Е0–Е5 (РВ + РН + проведення + запити) ≈ &#039;&#039;&#039;18 чол.-міс.&#039;&#039;&#039; — покриває ~70 % прикладних сценаріїв K2 ERP.&lt;br /&gt;
&lt;br /&gt;
=== 14.1. Вплив вибору Python на оцінку ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Етап !! Було (мова не визначена) !! Стало (Python) !! Δ !! Причина&lt;br /&gt;
|-&lt;br /&gt;
| Е1 (метамодель, DDL, конструктор) || 4 || &#039;&#039;&#039;3&#039;&#039;&#039; || &#039;&#039;&#039;−1&#039;&#039;&#039; || SQLAlchemy Core закриває генерацію DDL і діалекти СКБД; Pydantic v2 — валідацію DSL. Разом ~30 % етапу — готове.&lt;br /&gt;
|-&lt;br /&gt;
| Е5 (мова запитів, транслятор) || 4 || &#039;&#039;&#039;3,5&#039;&#039;&#039; || &#039;&#039;&#039;−0,5&#039;&#039;&#039; || lark (граматика) + SQLAlchemy Core expression language замість власного AST→SQL.&lt;br /&gt;
|-&lt;br /&gt;
| Е7 (регістр розрахунку) || 6 || &#039;&#039;&#039;6,5&#039;&#039;&#039; || &#039;&#039;&#039;+0,5&#039;&#039;&#039; || Ізоляція витіснення за інтерфейсом (АП-3) + резерв на нативну реалізацію.&lt;br /&gt;
|-&lt;br /&gt;
| Е10 (реструктуризація, міграція) || 2,5 || &#039;&#039;&#039;2&#039;&#039;&#039; || &#039;&#039;&#039;−0,5&#039;&#039;&#039; || Alembic покриває автогенерацію &amp;lt;code&amp;gt;ALTER&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| Е11 (навантаження, оптимізація) || 3 || &#039;&#039;&#039;4,5&#039;&#039;&#039; || &#039;&#039;&#039;+1,5&#039;&#039;&#039; || Профілювання Python, бенчмарки бюджету АП-4, ймовірні Cython/Rust-модулі, wheels у CI.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РАЗОМ&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; || &#039;&#039;&#039;0&#039;&#039;&#039; || Економія на інфраструктурному коді компенсує витрати на оптимізацію.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Висновок:&#039;&#039;&#039; Python — &#039;&#039;&#039;нейтральний за трудомісткістю&#039;&#039;&#039; для цього проєкту. Він здешевлює те, чого тут багато (метадані, генерація схеми, абстракція діалектів, міграції), і дорожчає те, чого тут мало (гарячі CPU-цикли). Ризик зміщується з «&#039;&#039;не встигнемо написати&#039;&#039;» на «&#039;&#039;не вкладемося в бюджет часу виконання&#039;&#039;» — тому бенчмарки гарячих шляхів (АП-4) вводяться в CI &#039;&#039;&#039;з етапу Е3&#039;&#039;&#039;, а не наприкінці.&lt;br /&gt;
&lt;br /&gt;
= 15. Ризики =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Ризик !! Ймов. !! Вплив !! Пом&#039;якшення&lt;br /&gt;
|-&lt;br /&gt;
| Р1 || У K2 ERP немає власної мови запитів → віртуальні таблиці нікуди вбудовувати || Сер. || &#039;&#039;&#039;Крит.&#039;&#039;&#039; || Верифікувати на Е0. План «Б»: віртуальні таблиці як параметризовані view/TVF + шар ORM.&lt;br /&gt;
|-&lt;br /&gt;
| Р2 || Конкуренція за таблицю підсумків на піках проведення || Вис. || Вис. || Розділення підсумків (сплітери), НТ-03, детермінований порядок MERGE.&lt;br /&gt;
|-&lt;br /&gt;
| Р3 || Рухи «заднім числом» роблять оновлення підсумків O(N періодів) || Вис. || Сер. || Рішення №3 (dirty months + регламентний перерахунок), НТ-02.&lt;br /&gt;
|-&lt;br /&gt;
| Р4 || «Широка» схема субконто → реструктуризація при зміні ліміту || Сер. || Сер. || Зафіксувати ліміт 5 із запасом; НТ-04; план «Б» — дочірня таблиця.&lt;br /&gt;
|-&lt;br /&gt;
| Р5 || Механізм витіснення РР — найскладніший і найпомилковіший вузол || Вис. || Вис. || Виділити в окремий модуль з еталонним набором з 50+ тест-кейсів; property-based тестування.&lt;br /&gt;
|-&lt;br /&gt;
| Р6 || Обсяг Е6+Е7 недооцінено (досвід 1С: це роки розробки) || Вис. || Вис. || MVP-підхід: спершу Е0–Е5, рішення про Е6/Е7 — після ретроспективи.&lt;br /&gt;
|-&lt;br /&gt;
| Р7 || Різна поведінка PostgreSQL і MS SQL (плани, MERGE, ізоляція) || Сер. || Сер. || Єдиний набір тестів на обох СКБД у CI від Е1.&lt;br /&gt;
|-&lt;br /&gt;
| Р8 || Міграція історичних даних без реєстраторів || Вис. || Сер. || Службовий документ «ВведенняЗалишків»; етап звірки М6 з нульовим допуском.&lt;br /&gt;
|-&lt;br /&gt;
| Р9 || Патентні / ліцензійні претензії щодо копіювання механізмів || Низ. || Вис. || Юридична експертиза до Е1: реалізація &#039;&#039;концепцій&#039;&#039; обліку (загальновідомих), а не коду/API; уникати дослівного копіювання найменувань API та документації.&lt;br /&gt;
|-&lt;br /&gt;
| Р10 || &#039;&#039;&#039;Гарячі шляхи&#039;&#039;&#039; (витіснення, розрахунок ЗП) на чистому Python не вкладаються в бюджет АП-4 || Сер. || Сер. || Ізоляція за &amp;lt;code&amp;gt;Protocol&amp;lt;/code&amp;gt;-інтерфейсом (АП-3) + бенчмарк у CI від Е7; готовність до Cython/Rust; альтернатива для витіснення — &amp;lt;code&amp;gt;daterange&amp;lt;/code&amp;gt;+GiST у PostgreSQL.&lt;br /&gt;
|-&lt;br /&gt;
| Р11 || &#039;&#039;&#039;Динамічна типізація в ядрі метаданих&#039;&#039;&#039; → помилки типів спливають у рантаймі на продуктиві || Вис. || Сер. || &amp;lt;code&amp;gt;mypy --strict&amp;lt;/code&amp;gt; як обов&#039;язковий gate у CI; Pydantic v2 на всіх межах; генерація &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів для прикладного коду (ФТ-К-07).&lt;br /&gt;
|-&lt;br /&gt;
| Р12 || &#039;&#039;&#039;GIL&#039;&#039;&#039; обмежує вертикальне масштабування сервера застосунків || Сер. || Низ. || АП-5: asyncio для IO + мультипроцесний пул. Розрахунок у 4.4.2 показує запас: 50 док/с ≈ 50 % одного ядра.&lt;br /&gt;
|-&lt;br /&gt;
| Р13 || &#039;&#039;&#039;Нативні розширення&#039;&#039;&#039; (Cython/Rust) ускладнюють збірку, кросплатформність і пошук інженерів || Низ. || Низ. || Вводяться тільки за результатами бенчмарку; wheels під усі цільові платформи в CI; питання В13.&lt;br /&gt;
|-&lt;br /&gt;
| Р14 || &#039;&#039;&#039;Виконання прикладного Python-коду&#039;&#039;&#039; в процесі сервера = виконання довільного коду з правами сервера (П8) || Вис. || &#039;&#039;&#039;Крит.&#039;&#039;&#039; || &#039;&#039;&#039;Питання В12 до Е0.&#039;&#039;&#039; Варіанти: (а) довірена модель — конфігурацію пише лише вендор/партнер; (б) ізоляція процесами + seccomp/AppArmor; (в) обмежений DSL замість повного Python. У 1С вбудована мова існує в т.ч. з цієї причини.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Ризик Р9 — обов&#039;язково до опрацювання перед стартом.&#039;&#039;&#039; ТЗ описує &#039;&#039;функціональні концепції&#039;&#039; (накопичувальний облік, подвійний запис, витіснення періодів дії), що є загальновідомими практиками обліку. Проте пряме відтворення пропрієтарних інтерфейсів, найменувань і структур конкретного вендора потребує окремої правової оцінки. Рекомендується узгодити з юридичною службою власну термінологію та API до початку Е1.}}&lt;br /&gt;
&lt;br /&gt;
= 16. Додатки =&lt;br /&gt;
&lt;br /&gt;
== Додаток А. Матриця відповідності «1С ↔ K2 ERP» ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Об&#039;єкт / поняття 1С !! Пропонований аналог K2 ERP !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| РегистрСведений || &amp;lt;code&amp;gt;Регістри.Відомостей.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрНакопления || &amp;lt;code&amp;gt;Регістри.Накопичення.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрБухгалтерии || &amp;lt;code&amp;gt;Регістри.Бухгалтерії.*&amp;lt;/code&amp;gt; || Субконто зберігаються інакше (слоти)&lt;br /&gt;
|-&lt;br /&gt;
| РегистрРасчета || &amp;lt;code&amp;gt;Регістри.Розрахунку.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| Регистратор || &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ВидДвижения || &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Итоги || &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Точка актуальности итогов || &amp;lt;code&amp;gt;ТА підсумків&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Разделение итогов || &amp;lt;code&amp;gt;Розділення підсумків&amp;lt;/code&amp;gt; (splitter) || —&lt;br /&gt;
|-&lt;br /&gt;
| Агрегаты || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Субконто / ПланВидовХарактеристик || &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПланВидівХарактеристик&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПланВидовРасчета || &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерасчет || &amp;lt;code&amp;gt;Перерахунок&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПериодДействия / Вытеснение || &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Витіснення&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Границя послідовності || &#039;&#039;&#039;Не реалізується&#039;&#039;&#039; || Механізм визнано застарілим; замість нього — перепроведення за списком «брудних» документів&lt;br /&gt;
|-&lt;br /&gt;
| РегистрыСведений з режимом «ПоПозицииРегистратора» || &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt; || Реалізується як (period, rec_t, rec_r, line_no) у ключі&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Б. Альтернатива зберігання субконто (план «Б» до Рішення №2) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Дочірня таблиця «ключ-значення» замість слотів&lt;br /&gt;
CREATE TABLE rg_b_0020_ed (&lt;br /&gt;
    rec_t     smallint NOT NULL,&lt;br /&gt;
    rec_r     uuid     NOT NULL,&lt;br /&gt;
    line_no   int      NOT NULL,&lt;br /&gt;
    side      smallint NOT NULL CHECK (side IN (0,1)),   -- 0=Дт, 1=Кт&lt;br /&gt;
    ed_no     smallint NOT NULL,                          -- порядковий номер субконто рахунка&lt;br /&gt;
    ed_type_r uuid     NOT NULL,                          -- вид субконто&lt;br /&gt;
    val_t     smallint NOT NULL,&lt;br /&gt;
    val_r     uuid,&lt;br /&gt;
    val_n     numeric(38,10),&lt;br /&gt;
    val_s     varchar(150),&lt;br /&gt;
    val_d     timestamp(0),&lt;br /&gt;
    PRIMARY KEY (rec_t, rec_r, line_no, side, ed_no),&lt;br /&gt;
    FOREIGN KEY (rec_t, rec_r, line_no) REFERENCES rg_b_0020 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_val ON rg_b_0020_ed (ed_type_r, val_t, val_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Критерій !! Слоти (Рішення №2) !! Дочірня таблиця (план «Б»)&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 1 субконто || Index seek по колонці || JOIN + семі-з&#039;єднання&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 3 субконто || 3 предикати в одному скані || 3 JOIN&lt;br /&gt;
|-&lt;br /&gt;
| Зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || ALTER TABLE (реструктуризація) || Без змін схеми&lt;br /&gt;
|-&lt;br /&gt;
| Розмір рядка проводки || +48 байт × 2 (Дт/Кт) || Базовий&lt;br /&gt;
|-&lt;br /&gt;
| Складність генератора DDL || Вища || Нижча&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рекомендація&#039;&#039;&#039; || &#039;&#039;&#039;Обрано за замовчуванням&#039;&#039;&#039; || Резерв за результатами НТ-04&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток В. Перелік вимог (реєстр трасування) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! ID !! Розділ !! Коротко !! Пріоритет !! Тест&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-01…ФТ-07 || 7.1 || Набори записів, проведення || Must || ФТ-Т-02…04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-08…ФТ-10 || 7.2 || Активність || Must || ФТ-Т-06&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-11…ФТ-13 || 7.3 || Віртуальні таблиці || Must || ФТ-Т-08, НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-14…ФТ-18 || 7.4 || Підсумки, ТА || Must || ФТ-Т-05, ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-19…ФТ-21 || 7.4.4 || Агрегати || Should || НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-22…ФТ-30 || 7.5 || Механіка РР || Must (для Е7) || ФТ-Т-09, ФТ-Т-10&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31…ФТ-36 || 7.7 || Блокування || Must || ФТ-Т-11, ФТ-Т-12, НТ-03&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-37…ФТ-39 || 7.8 || Права, RLS || Must || ФТ-Т-15&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-40…ФТ-42 || 7.9 || Аудит, цілісність || Should || ФТ-Т-04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-К-01…06 || 6.8.4 || Конструктор || Should || —&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01…НФВ-09 || 11.1 || Продуктивність || Must || НТ-01…НТ-06&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-10…НФВ-12 || 11.3 || Цілісність || Must || ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-13…НФВ-17 || 11.4–11.5 || Супровід, сумісність || Should || ФТ-Т-14&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Г. Відкриті питання ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Питання !! Кому !! Термін&lt;br /&gt;
|-&lt;br /&gt;
| В1 || Чи існує в K2 ERP мова запитів / транслятор у SQL? (визначає Р1 та обсяг Е5) || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В2 || Формат ідентифікації об&#039;єктів: UUID чи сурогатний int? || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В3 || Чи потрібна мілісекундна дискретність періоду? || Замовник || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В4 || Максимальна кількість субконто: 3 чи 5? || Головний бухгалтер / методолог || До Е6&lt;br /&gt;
|-&lt;br /&gt;
| В5 || Чи потрібен механізм «Границя послідовності»? (пропонується відмова) || Методолог || До Е3&lt;br /&gt;
|-&lt;br /&gt;
| В6 || Пріоритет типів регістрів: чи достатньо MVP (РВ + РН) для першого релізу? || Замовник || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В7 || Правова оцінка ризику Р9 || Юридична служба || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В8 || Цільова СКБД для першої черги: тільки PostgreSQL чи одразу обидві? || Архітектор / ІТ-експлуатація || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В9 || &#039;&#039;&#039;Міжпланова база розрахунку:&#039;&#039;&#039; чи потрібна можливість брати базу з &#039;&#039;іншого&#039;&#039; регістру розрахунку (Утримання ← ОсновніНарахування)? Якщо так — ФТ-25 і &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt; потребують розширення полем &amp;lt;code&amp;gt;base_register_id&amp;lt;/code&amp;gt; (див. Д.7.2) || Методолог ЗП / архітектор || До Е7&lt;br /&gt;
|-&lt;br /&gt;
| В10 || Чи прийнятна поведінка підпорядкованого РВ без контролю унікальності за (Період + Вимірювання)? (сумісність із 1С vs. захист від дублів — див. Д.3.2, антипатерн А-6) || Методолог || До Е2&lt;br /&gt;
|-&lt;br /&gt;
| В11 || &#039;&#039;&#039;Конфігуратор:&#039;&#039;&#039; web (FastAPI + React) чи desktop (PySide6/Qt)? Макети розділу 6.8 намальовані як desktop || Замовник / UX || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В12 || &#039;&#039;&#039;Ключове.&#039;&#039;&#039; Прикладний код — повноцінний Python чи обмежений DSL? Повний Python у процесі сервера = виконання довільного коду з правами сервера (ризик Р14) + неможливість статично перевірити конфігурацію партнера || Архітектор + служба безпеки || &#039;&#039;&#039;До Е0&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| В13 || Чи допустимі нативні розширення (Cython/Rust) у складі постачання? Якщо ні — потрібен план «Б» для витіснення (SQL на &amp;lt;code&amp;gt;daterange&amp;lt;/code&amp;gt;) || ІТ-експлуатація || До Е7&lt;br /&gt;
|-&lt;br /&gt;
| В14 || Цільова версія: 3.12 чи 3.13? Чи розглядається free-threaded build (PEP 703) як шлях зняття Р12? || Архітектор || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В15 || Мова ідентифікаторів прикладного API: кирилиця (&amp;lt;code&amp;gt;rs.new(Номенклатура=…)&amp;lt;/code&amp;gt;) чи транслітерація/англійська? Впливає на ФТ-К-07 і читабельність || Замовник / методолог || До Е2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Д. Каталог прикладів регістрів ==&lt;br /&gt;
&lt;br /&gt;
Додаток містить прикладні приклади регістрів усіх типів і підвидів. Для кожного наведено: декларацію (DSL), пояснення проєктних рішень, приклад даних у фізичних таблицях і типовий запит. Приклади призначені для: (а) перевірки повноти метамоделі на етапі Е0; (б) формування набору приймальних тестів; (в) навчання прикладних розробників.&lt;br /&gt;
&lt;br /&gt;
=== Д.1. Як обрати тип регістру (дерево рішень) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Choose {&lt;br /&gt;
  rankdir=TB; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  q1 [label=&amp;quot;Що зберігаємо?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q2 [label=&amp;quot;Потрібні залишки\n(скільки Є зараз)?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q3 [label=&amp;quot;Подвійний запис,\nплан рахунків,\nсубконто?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q4 [label=&amp;quot;Періоди дії,\nвитіснення,\nбаза розрахунку?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q5 [label=&amp;quot;Значення прив&#039;язане\nдо документа?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  ri_i [label=&amp;quot;РВ незалежний\n(КурсиВалют,\nШтрихкоди)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  ri_s [label=&amp;quot;РВ підпорядкований\n(ЦіниНоменклатури,\nКадровіДані)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  ra_b [label=&amp;quot;РН «Залишки»\n(ТовариНаСкладах,\nВзаєморозрахунки)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  ra_t [label=&amp;quot;РН «Обороти»\n(Продажі,\nВитрати)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  rb   [label=&amp;quot;РБ\n(Госпрозрахунковий)&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  rc   [label=&amp;quot;РР\n(Нарахування,\nУтримання)&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q3 [label=&amp;quot;облікові проводки&amp;quot;];&lt;br /&gt;
  q3 -&amp;gt; rb [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q3 -&amp;gt; q4 [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
  q4 -&amp;gt; rc [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q4 -&amp;gt; q2 [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q2 [label=&amp;quot;кількісні/сумові\nрухи&amp;quot;];&lt;br /&gt;
  q2 -&amp;gt; ra_b [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q2 -&amp;gt; ra_t [label=&amp;quot;ні,\nлише обороти\nза період&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q5 [label=&amp;quot;значення\nатрибута\nв часі&amp;quot;];&lt;br /&gt;
  q5 -&amp;gt; ri_s [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q5 -&amp;gt; ri_i [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Контрольні питання при проєктуванні будь-якого регістру:&#039;&#039;&#039;&lt;br /&gt;
# Чи можна відповісти на всі прикладні питання &#039;&#039;лише&#039;&#039; полями цього регістру, без з&#039;єднання з документами? Якщо ні — бракує реквізиту (не вимірювання!).&lt;br /&gt;
# Яка &#039;&#039;кардинальність&#039;&#039; таблиці підсумків = ∏(кількість значень вимірювань) × кількість періодів? Якщо &amp;gt; 10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; — переглянути склад вимірювань.&lt;br /&gt;
# Чи потрібно фільтрувати/групувати за цим полем у звітах? Так → вимірювання. Ні, лише показувати → реквізит.&lt;br /&gt;
# Чи підсумовується поле? Так → ресурс. Ні → реквізит або вимірювання.&lt;br /&gt;
&lt;br /&gt;
=== Д.2. Зведений каталог ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! № !! Регістр !! Тип !! Підвид / режим !! Вимірювання !! Ресурси !! Розділ&lt;br /&gt;
|-&lt;br /&gt;
| 1 || КурсиВалют || РВ || Періодичний (день), незалежний || Валюта || Курс, Кратність || Д.3.1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ЦіниНоменклатури || РВ || Періодичний (день), підпорядкований || Номенклатура, Характеристика, ТипЦін || Ціна || Д.3.2&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ШтрихкодиНоменклатури || РВ || Неперіодичний, незалежний || Штрихкод || Номенклатура, Характеристика, Упаковка || Д.3.3&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ГрафікРоботи || РВ || Неперіодичний, незалежний || ВидГрафіка, ДатаГрафіка || Значення, Годин || Д.3.4&lt;br /&gt;
|-&lt;br /&gt;
| 5 || КадровіДані || РВ || По позиції реєстратора, підпорядкований || Співробітник || Підрозділ, Посада, Ставка, ВидЗайнятості || Д.3.5&lt;br /&gt;
|-&lt;br /&gt;
| 6 || НалаштуванняКористувачів || РВ || Неперіодичний, незалежний || Користувач, Налаштування || Значення (складений) || Д.3.6&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ТовариНаСкладах || РН || Залишки || Номенклатура, Склад, Партія, Характеристика || Кількість, Сума || Д.4.1&lt;br /&gt;
|-&lt;br /&gt;
| 8 || ВзаєморозрахункиЗКонтрагентами || РН || Залишки || Організація, Контрагент, Договір, Замовлення || Сума, СумаВал || Д.4.2&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ТовариВРезерві || РН || Залишки || Номенклатура, Склад, Замовлення, Характеристика || Кількість || Д.4.3&lt;br /&gt;
|-&lt;br /&gt;
| 10 || ГрошовіКоштиБезготівкові || РН || Залишки || Організація, БанківськийРахунок || Сума, СумаВал || Д.4.4&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Продажі || РН || Обороти (місяць) + агрегати || Номенклатура, Контрагент, Договір, Менеджер, Склад || Кількість, Сума, СумаБезПДВ, Собівартість || Д.5.1&lt;br /&gt;
|-&lt;br /&gt;
| 12 || ВитратиЗаСтаттями || РН || Обороти (місяць) || Організація, Підрозділ, СтаттяВитрат, Проєкт || Сума || Д.5.2&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Госпрозрахунковий || РБ || З кореспонденцією || Організація (бал.), Підрозділ (небал.) || Сума (бал.), Кількість, ВалютнаСума || Д.6.1&lt;br /&gt;
|-&lt;br /&gt;
| 14 || ПодатковийОблік || РБ || Без кореспонденції || Організація, ВидРізниці || Сума || Д.6.2&lt;br /&gt;
|-&lt;br /&gt;
| 15 || Бюджетування || РБ || З кореспонденцією || Сценарій, ЦФВ, Проєкт || Сума || Д.6.3&lt;br /&gt;
|-&lt;br /&gt;
| 16 || ОсновніНарахування || РР || Період дії + база за періодом дії || Співробітник (баз.), Підрозділ || Результат, ВідпрацьованоДнів, НормаДнів || Д.7.1&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Утримання || РР || Без періоду дії, база за періодом реєстрації || Співробітник (баз.), Підрозділ || Результат, БазаОподаткування || Д.7.2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.3. Регістри відомостей ===&lt;br /&gt;
&lt;br /&gt;
==== Д.3.1. КурсиВалют — періодичний, незалежний ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати історію курсів валют; отримувати курс на будь-яку дату.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: КурсиВалют&lt;br /&gt;
  kind: Information&lt;br /&gt;
  synonym: &amp;quot;Курси валют&amp;quot;&lt;br /&gt;
  periodicity: WithinDay            # один курс на валюту на день&lt;br /&gt;
  writeMode: Independent            # курси вводяться вручну/завантажуються з НБУ&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Курс,      type: &amp;quot;Число(15,4)&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Кратність, type: &amp;quot;Число(10,0)&amp;quot;, default: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;Independent&amp;lt;/code&amp;gt; — курс не породжується документом, він є зовнішнім фактом.&lt;br /&gt;
* &amp;lt;code&amp;gt;master: true&amp;lt;/code&amp;gt; для Валюти — при видаленні валюти курси видаляються; регістр видно у формі елемента довідника.&lt;br /&gt;
* Періодичність &amp;lt;code&amp;gt;WithinDay&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;WithinSecond&amp;lt;/code&amp;gt; — повторний запис курсу за той самий день &#039;&#039;замістить&#039;&#039; попередній, а не створить дубль.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0007&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! d1_r (Валюта) !! r1 (Курс) !! r2 (Кратність)&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-15 00:00:00 || USD || 41.8200 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-15 00:00:00 || EUR || 45.6100 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-16 00:00:00 || USD || 41.8500 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-17 00:00:00 || USD || 41.9000 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-17 00:00:00 || EUR || 45.7300 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (курс на дату документа):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ Курси.Курс, Курси.Кратність&lt;br /&gt;
З РегістрВідомостей.КурсиВалют.ЗрізОстанніх(&amp;amp;ДатаДокумента, Валюта = &amp;amp;Валюта) ЯК Курси&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# або через менеджер&lt;br /&gt;
курс = Registers.information(&amp;quot;КурсиВалют&amp;quot;).get_last(doc.Дата, {&amp;quot;Валюта&amp;quot;: doc.Валюта})&lt;br /&gt;
сума_грн: Decimal = doc.СумаВалюти * курс.Курс / курс.Кратність&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.3.2. ЦіниНоменклатури — періодичний, підпорядкований реєстратору ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати історію цін; ціна встановлюється наказом (документом), який можна скасувати.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ЦіниНоменклатури&lt;br /&gt;
  kind: Information&lt;br /&gt;
  synonym: &amp;quot;Ціни номенклатури&amp;quot;&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  writeMode: SubordinateToRecorder   # ← ключова відмінність від КурсиВалют&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: ТипЦін,         type: &amp;quot;Довідник.ТипиЦін&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Ціна, type: &amp;quot;Число(15,2)&amp;quot;, denyEmpty: true }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Валюта,   type: &amp;quot;Довідник.Валюти&amp;quot; }&lt;br /&gt;
    - { name: Одиниця,  type: &amp;quot;Довідник.ОдиниціВиміру&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ВстановленняЦінНоменклатури&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;SubordinateToRecorder&amp;lt;/code&amp;gt; — потрібна юридична прив&#039;язка ціни до наказу, можливість скасувати наказ і «відкотити» ціни одним рухом.&lt;br /&gt;
* &amp;lt;code&amp;gt;Валюта&amp;lt;/code&amp;gt; і &amp;lt;code&amp;gt;Одиниця&amp;lt;/code&amp;gt; — &#039;&#039;&#039;реквізити&#039;&#039;&#039;, а не вимірювання: за ними не фільтрують і не будують зрізи, вони визначаються типом цін. &#039;&#039;Помилка новачка&#039;&#039; — зробити Валюту вимірюванням, що подвоїть кількість записів і зламає зріз останніх.&lt;br /&gt;
* &amp;lt;code&amp;gt;Характеристика&amp;lt;/code&amp;gt; дозволяє порожнє значення — для номенклатури без характеристик.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0010&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec_t !! rec_r !! line_no !! period !! active !! d1_r (Номенкл.) !! d2_r (Характ.) !! d3_r (ТипЦін) !! r1 (Ціна) !! a1_r (Валюта)&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 1 || 2026-07-01 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 480.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 2 || 2026-07-01 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Оптова || 410.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 3 || 2026-07-01 || true || Чай Ahmad 100г || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 95.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || b7c…04 || 1 || 2026-07-15 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 495.00 || UAH&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|Зверніть увагу: у підпорядкованому РВ &#039;&#039;&#039;немає&#039;&#039;&#039; унікальності за (Період + Вимірювання). Два різні документи можуть встановити ціну на ту саму дату — платформа це дозволить, зріз останніх поверне запис із більшим &amp;lt;code&amp;gt;line_no&amp;lt;/code&amp;gt; у межах реєстратора з пізнішою позицією. Це &#039;&#039;&#039;свідома&#039;&#039;&#039; поведінка (сумісність із 1С), але прикладний розробник має контролювати дублі самостійно — див. антипатерн А-6 (Д.10).}}&lt;br /&gt;
&lt;br /&gt;
==== Д.3.3. ШтрихкодиНоменклатури — неперіодичний, незалежний ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; за штрихкодом знайти номенклатуру. Класичний приклад «вимірювання = те, &#039;&#039;за чим&#039;&#039; шукаємо; ресурс = те, що &#039;&#039;знаходимо&#039;&#039;».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ШтрихкодиНоменклатури&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Штрихкод, type: &amp;quot;Рядок(30)&amp;quot;, denyEmpty: true }     # ← ключ пошуку&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Упаковка,       type: &amp;quot;Довідник.УпаковкиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0011 (&lt;br /&gt;
    d1_s  varchar(30) NOT NULL,      -- Штрихкод&lt;br /&gt;
    r1_r  uuid        NOT NULL,      -- Номенклатура&lt;br /&gt;
    r2_r  uuid        NOT NULL,      -- Характеристика&lt;br /&gt;
    r3_r  uuid        NOT NULL,      -- Упаковка&lt;br /&gt;
    CONSTRAINT pk_rg_i_0011 PRIMARY KEY (d1_s)     -- ← унікальність штрихкоду «безкоштовно»&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0011_r1 ON rg_i_0011 (r1_r);  -- зворотний пошук: штрихкоди товару&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; PK за вимірюванням автоматично гарантує, що один штрихкод не може вказувати на два товари. Якби Номенклатуру зробили вимірюванням, а Штрихкод — ресурсом, ця гарантія зникла б, і довелося б писати перевірку в прикладному коді.&lt;br /&gt;
&lt;br /&gt;
==== Д.3.4. ГрафікРоботи — неперіодичний, незалежний (використовується як графік для РР) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ГрафікРоботи&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: ВидГрафіка,  type: &amp;quot;Довідник.ГрафікиРоботи&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
    - { name: ДатаГрафіка, type: &amp;quot;Дата&amp;quot;, denyEmpty: true }        # ← вимірювання типу Дата, не Період!&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Значення, type: &amp;quot;Число(1,0)&amp;quot; }      # 1 = робочий день, 0 = вихідний&lt;br /&gt;
    - { name: Годин,    type: &amp;quot;Число(4,2)&amp;quot; }      # тривалість зміни&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення (важливе):&#039;&#039;&#039; &amp;lt;code&amp;gt;ДатаГрафіка&amp;lt;/code&amp;gt; — це &#039;&#039;&#039;вимірювання&#039;&#039;&#039; типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt;, а не стандартний реквізит &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;. Регістр &#039;&#039;&#039;неперіодичний&#039;&#039;&#039;. Причина: графік описує &#039;&#039;календар&#039;&#039; (кожна дата — окремий факт), а не &#039;&#039;історію зміни значення&#039;&#039;. Якби використали періодичність, зріз останніх повертав би «останній робочий день», що безглуздо. Механізм РР (&amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt;) очікує саме таку структуру.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0015&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! d1_r (ВидГрафіка) !! d2_d (ДатаГрафіка) !! r1 (Значення) !! r2 (Годин)&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-01 || 1 || 8.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-04 || 0 || 0.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-05 || 0 || 0.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-06 || 1 || 8.00&lt;br /&gt;
|-&lt;br /&gt;
| Змінний 2/2 || 2026-07-01 || 1 || 12.00&lt;br /&gt;
|-&lt;br /&gt;
| Змінний 2/2 || 2026-07-03 || 0 || 0.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Д.3.5. КадровіДані — по позиції реєстратора ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати актуальні кадрові дані співробітника з історією; підтримати кілька наказів однією датою в правильному порядку.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: КадровіДані&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: ByRecorderPosition   # ← упорядкування за позицією документа, не лише за датою&lt;br /&gt;
  writeMode: SubordinateToRecorder&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
    - { name: Посада,       type: &amp;quot;Довідник.Посади&amp;quot; }&lt;br /&gt;
    - { name: Ставка,       type: &amp;quot;Число(5,2)&amp;quot; }&lt;br /&gt;
    - { name: ВидЗайнятості, type: &amp;quot;Перерахування.ВидиЗайнятості&amp;quot; }&lt;br /&gt;
    - { name: ГрафікРоботи, type: &amp;quot;Довідник.ГрафікиРоботи&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ПрийомНаРоботу&lt;br /&gt;
    - Документ.КадровеПереміщення&lt;br /&gt;
    - Документ.Звільнення&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; &amp;lt;code&amp;gt;ByRecorderPosition&amp;lt;/code&amp;gt; — коли два накази оформлені однією датою (переміщення + зміна ставки), звичайна періодичність «у межах дня» дала б недетермінований результат зрізу. Позиція реєстратора додає до ключа &amp;lt;code&amp;gt;(rec_t, rec_r, line_no)&amp;lt;/code&amp;gt; і впорядковує за моментом часу документа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фізична схема:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0016 (&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    d1_r     uuid         NOT NULL,        -- Співробітник&lt;br /&gt;
    r1_r     uuid NOT NULL, r2_r uuid NOT NULL,&lt;br /&gt;
    r3       numeric(5,2) NOT NULL,&lt;br /&gt;
    r4       smallint     NOT NULL,        -- Перерахування зберігається як порядковий номер&lt;br /&gt;
    r5_r     uuid NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0016 PRIMARY KEY (period, rec_t, rec_r, line_no)  -- ← Період у ключі ПЕРШИЙ&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0016_d1 ON rg_i_0016 (d1_r, period DESC, rec_t, rec_r, line_no DESC)&lt;br /&gt;
    WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.3.6. НалаштуванняКористувачів — складений тип ресурсу ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: НалаштуванняКористувачів&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Користувач,   type: &amp;quot;Довідник.Користувачі&amp;quot;, master: true }&lt;br /&gt;
    - { name: Налаштування, type: &amp;quot;ПланВидівХарактеристик.НалаштуванняКористувачів&amp;quot;, master: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - name: Значення&lt;br /&gt;
      type: [&amp;quot;Рядок(500)&amp;quot;, &amp;quot;Число(15,2)&amp;quot;, &amp;quot;Дата&amp;quot;, &amp;quot;Булево&amp;quot;,&lt;br /&gt;
             &amp;quot;Довідник.Організації&amp;quot;, &amp;quot;Довідник.Склади&amp;quot;]     # ← складений тип&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0018 (&lt;br /&gt;
    d1_r  uuid           NOT NULL,&lt;br /&gt;
    d2_r  uuid           NOT NULL,&lt;br /&gt;
    r1_t  smallint       NOT NULL,      -- код типу значення&lt;br /&gt;
    r1_b  boolean,&lt;br /&gt;
    r1_n  numeric(15,2),&lt;br /&gt;
    r1_s  varchar(500),&lt;br /&gt;
    r1_d  timestamp(0),&lt;br /&gt;
    r1_r  uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0018 PRIMARY KEY (d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! d1_r !! d2_r !! r1_t !! r1_b !! r1_n !! r1_s !! r1_d !! r1_r&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ОсновнаОрганізація || 101 || || || || || ТОВ «Альфа»&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ОсновнийСклад || 104 || || || || || Центральний&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ПоказуватиПідказки || 2 || true || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Петренко || КількістьРядківСписку || 3 || || 50 || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.4. Регістри накопичення, вид «Залишки» ===&lt;br /&gt;
&lt;br /&gt;
==== Д.4.1. ТовариНаСкладах ====&lt;br /&gt;
&lt;br /&gt;
Декларація — розділ 6.7, фізична схема — розділ 8.5, ER — розділ 9.2. Тут — дані.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Рухи (&amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt;) після проведення трьох документів:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec_t !! rec_r !! line_no !! period !! mvt !! d1_r (Номенкл.) !! d2_r (Склад) !! r1 (К-сть) !! r2 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 2 (ПрихНакл) || p1 || 1 || 2026-06-10 || 0 &#039;&#039;Прихід&#039;&#039; || Кава Lavazza || Центральний || 100.000 || 35 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 (ПрихНакл) || p1 || 2 || 2026-06-10 || 0 &#039;&#039;Прихід&#039;&#039; || Чай Ahmad || Центральний || 200.000 || 12 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 (ВидНакл) || v1 || 1 || 2026-07-05 || 1 &#039;&#039;Витрата&#039;&#039; || Кава Lavazza || Центральний || 30.000 || 10 500.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 (Переміщ) || m1 || 1 || 2026-07-12 || 1 &#039;&#039;Витрата&#039;&#039; || Кава Lavazza || Центральний || 20.000 || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 (Переміщ) || m1 || 2 || 2026-07-12 || 0 &#039;&#039;Прихід&#039;&#039; || Кава Lavazza || Роздрібний || 20.000 || 7 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки залишків (&amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt;), ТА = 2026-07-31:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! d1_r !! d2_r !! r1 (К-сть ±) !! r2 (Сума ±) !! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Кава Lavazza || Центральний || 100.000 || 35 000.00 || залишок &#039;&#039;на початок&#039;&#039; липня&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Чай Ahmad || Центральний || 200.000 || 12 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Кава Lavazza || Центральний || 50.000 || 17 500.00 || 100 − 30 − 20&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Кава Lavazza || Роздрібний || 20.000 || 7 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Чай Ahmad || Центральний || 200.000 || 12 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Кава Lavazza || Центральний || 50.000 || 17 500.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039; — поточний залишок&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Кава Lavazza || Роздрібний || 20.000 || 7 000.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Чай Ahmad || Центральний || 200.000 || 12 000.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Вимірювання Партія і Характеристика для стислості опущені.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Д.4.2. ВзаєморозрахункиЗКонтрагентами ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; облік дебіторської/кредиторської заборгованості в розрізі договорів і замовлень.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ВзаєморозрахункиЗКонтрагентами&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  enableBalanceTotals: true&lt;br /&gt;
  enableTurnoverTotals: true&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true, index: true }&lt;br /&gt;
    - { name: Контрагент,  type: &amp;quot;Довідник.Контрагенти&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Договір,     type: &amp;quot;Довідник.ДоговориКонтрагентів&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Замовлення,  type: [&amp;quot;Документ.ЗамовленняПокупця&amp;quot;, &amp;quot;Документ.ЗамовленняПостачальнику&amp;quot;],&lt;br /&gt;
        nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,    type: &amp;quot;Число(15,2)&amp;quot; }     # у валюті регламентованого обліку&lt;br /&gt;
    - { name: СумаВал, type: &amp;quot;Число(15,2)&amp;quot; }     # у валюті договору&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Коментар, type: &amp;quot;Рядок(200)&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ПрихіднаНакладна&lt;br /&gt;
    - Документ.ПлатіжнеДоручення&lt;br /&gt;
    - Документ.КасовийОрдер&lt;br /&gt;
    - Документ.КоригуванняБоргу&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Угода про знак (обов&#039;язково фіксується в методології!):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид руху !! Сенс !! Приклад документа&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Прихід&#039;&#039;&#039; || Борг контрагента перед нами &#039;&#039;&#039;зростає&#039;&#039;&#039; (дебіторка +) || Видаткова накладна&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витрата&#039;&#039;&#039; || Борг контрагента перед нами &#039;&#039;&#039;зменшується&#039;&#039;&#039; (оплата) || Платіжне доручення вхідне&lt;br /&gt;
|}&lt;br /&gt;
Кредиторська заборгованість = від&#039;ємний залишок. &#039;&#039;Альтернатива&#039;&#039; — два окремих ресурси (СумаДт/СумаКт) або два регістри; обраний варіант — один знаковий ресурс (простіше, менший обсяг підсумків).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Документ !! period !! mvt !! Контрагент !! Договір !! r1 (Сума) !! Залишок після&lt;br /&gt;
|-&lt;br /&gt;
| ВидатковаНакладна №12 || 2026-07-05 || Прихід || ТОВ «Бета» || Основний || 12 000.00 || +12 000 &#039;&#039;(винні нам)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ПлатіжнеДоручення №88 || 2026-07-09 || Витрата || ТОВ «Бета» || Основний || 8 000.00 || +4 000&lt;br /&gt;
|-&lt;br /&gt;
| ПлатіжнеДоручення №91 || 2026-07-16 || Витрата || ТОВ «Бета» || Основний || 6 000.00 || −2 000 &#039;&#039;(передоплата)&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (акт звірки):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Контрагент, Дані.Договір,&lt;br /&gt;
    Дані.СумаПочатковийЗалишок, Дані.СумаПрихід,&lt;br /&gt;
    Дані.СумаВитрата,           Дані.СумаКінцевийЗалишок&lt;br /&gt;
З РегістрНакопичення.ВзаєморозрахункиЗКонтрагентами.ЗалишкиІОбороти(&lt;br /&gt;
       &amp;amp;Початок, &amp;amp;Кінець, Авто, Рух,&lt;br /&gt;
       Організація = &amp;amp;Організація І Контрагент = &amp;amp;Контрагент&lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.4.3. ТовариВРезерві — регістр «супутник» ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ТовариВРезерві&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Склад,          type: &amp;quot;Довідник.Склади&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Замовлення,     type: &amp;quot;Документ.ЗамовленняПокупця&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість, type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ЗамовленняПокупця&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ЗакриттяЗамовлень&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Патерн «доступний залишок»&#039;&#039;&#039; — з&#039;єднання двох регістрів:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    ЄСТЬNULL(Зал.Номенклатура, Рез.Номенклатура) ЯК Номенклатура,&lt;br /&gt;
    ЄСТЬNULL(Зал.Склад, Рез.Склад) ЯК Склад,&lt;br /&gt;
    ЄСТЬNULL(Зал.КількістьЗалишок, 0) ЯК ВСкладі,&lt;br /&gt;
    ЄСТЬNULL(Рез.КількістьЗалишок, 0) ЯК ВРезерві,&lt;br /&gt;
    ЄСТЬNULL(Зал.КількістьЗалишок, 0) - ЄСТЬNULL(Рез.КількістьЗалишок, 0) ЯК Доступно&lt;br /&gt;
З РегістрНакопичення.ТовариНаСкладах.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад) ЯК Зал&lt;br /&gt;
ПОВНЕ З&#039;ЄДНАННЯ РегістрНакопичення.ТовариВРезерві.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад) ЯК Рез&lt;br /&gt;
    ЗА Зал.Номенклатура = Рез.Номенклатура І Зал.Склад = Рез.Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Чому окремий регістр, а не ресурс «Резерв» у &amp;lt;code&amp;gt;ТовариНаСкладах&amp;lt;/code&amp;gt;? Тому що резерв ведеться в розрізі &#039;&#039;&#039;Замовлення&#039;&#039;&#039;, а залишок — у розрізі &#039;&#039;&#039;Партії&#039;&#039;&#039;. Додавання Замовлення як вимірювання до &amp;lt;code&amp;gt;ТовариНаСкладах&amp;lt;/code&amp;gt; помножило б таблицю підсумків на кардинальність замовлень (сотні тисяч рядків на товар). Це ілюстрація контрольного питання №2 з Д.1.}}&lt;br /&gt;
&lt;br /&gt;
==== Д.4.4. ГрошовіКоштиБезготівкові ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ГрошовіКоштиБезготівкові&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinDay              # достатньо дня: банківська виписка — денна&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація,       type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: БанківськийРахунок, type: &amp;quot;Довідник.БанківськіРахунки&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,    type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: СумаВал, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.ПлатіжнеДоручення, Документ.БанківськаВиписка, Документ.ПереміщенняКоштів]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; Валюта — &#039;&#039;&#039;не&#039;&#039;&#039; вимірювання, тому що вона однозначно визначається банківським рахунком (функціональна залежність). Її додавання як вимірювання створило б надлишковість і ризик неузгоджених даних. Валюта отримується з&#039;єднанням із довідником.&lt;br /&gt;
&lt;br /&gt;
=== Д.5. Регістри накопичення, вид «Обороти» ===&lt;br /&gt;
&lt;br /&gt;
==== Д.5.1. Продажі — з агрегатами ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Продажі&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Turnover          # ← залишків не буває: «залишок продажів» безглуздий&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  turnoverTotalsPeriod: Month&lt;br /&gt;
  aggregatesMode: Aggregates&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Контрагент,     type: &amp;quot;Довідник.Контрагенти&amp;quot;, index: true }&lt;br /&gt;
    - { name: Договір,        type: &amp;quot;Довідник.ДоговориКонтрагентів&amp;quot; }&lt;br /&gt;
    - { name: Менеджер,       type: &amp;quot;Довідник.Користувачі&amp;quot;, index: true }&lt;br /&gt;
    - { name: Склад,          type: &amp;quot;Довідник.Склади&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість,   type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
    - { name: Сума,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: СумаБезПДВ,  type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: Собівартість, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.ВидатковаНакладна, Документ.ПовернненняВідПокупця, Документ.ЗвітПроРоздрібніПродажі]&lt;br /&gt;
&lt;br /&gt;
  aggregates:&lt;br /&gt;
    - name: ПродажіПоМісяцяхІТоварах&lt;br /&gt;
      periodicity: Month&lt;br /&gt;
      dimensions: [Номенклатура, Склад]&lt;br /&gt;
      realtime: true&lt;br /&gt;
    - name: ПродажіПоМенеджерах&lt;br /&gt;
      periodicity: Day&lt;br /&gt;
      dimensions: [Менеджер]&lt;br /&gt;
      realtime: false                 # оновлюється регламентно&lt;br /&gt;
    - name: ПродажіПоКонтрагентах&lt;br /&gt;
      periodicity: Quarter&lt;br /&gt;
      dimensions: [Контрагент, Договір]&lt;br /&gt;
      realtime: false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;Turnover&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt;: немає &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt;, немає таблиці залишків → удвічі менше підсумків і немає кумулятивних оновлень. Повернення відображається &#039;&#039;&#039;від&#039;ємною&#039;&#039;&#039; сумою, а не «витратою».&lt;br /&gt;
* 6 вимірювань → таблиця підсумків надто широка для швидких звітів → компенсуємо агрегатами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ефект агрегатів:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Звіт !! Без агрегатів (&amp;lt;code&amp;gt;rg_a_0031_tt&amp;lt;/code&amp;gt;) !! З агрегатом !! Виграш&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по товарах за рік || скан 8 млн рядків підсумків || &amp;lt;code&amp;gt;ag1&amp;lt;/code&amp;gt;: 40 тис. рядків || ×200&lt;br /&gt;
|-&lt;br /&gt;
| Рейтинг менеджерів за квартал || скан 8 млн рядків || &amp;lt;code&amp;gt;ag2&amp;lt;/code&amp;gt;: 1,8 тис. рядків || ×4000&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по контрагенту за 3 роки || скан 8 млн рядків || &amp;lt;code&amp;gt;ag3&amp;lt;/code&amp;gt;: 60 тис. рядків || ×130&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по товару + контрагенту || &#039;&#039;&#039;агрегат не покриває&#039;&#039;&#039; → підсумки || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0031_ag1 (          -- Місяць × (Номенклатура, Склад)&lt;br /&gt;
    period timestamp(0) NOT NULL, d1_r uuid NOT NULL, d6_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(20,3) NOT NULL, r2 numeric(20,2) NOT NULL,&lt;br /&gt;
    r3 numeric(20,2) NOT NULL, r4 numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag1 PRIMARY KEY (period, d1_r, d6_r)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE rg_a_0031_ag2 (          -- День × (Менеджер)&lt;br /&gt;
    period timestamp(0) NOT NULL, d5_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(20,3) NOT NULL, r2 numeric(20,2) NOT NULL,&lt;br /&gt;
    r3 numeric(20,2) NOT NULL, r4 numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag2 PRIMARY KEY (period, d5_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.5.2. ВитратиЗаСтаттями ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ВитратиЗаСтаттями&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Turnover&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  turnoverTotalsPeriod: Month&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація,    type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Підрозділ,      type: &amp;quot;Довідник.Підрозділи&amp;quot;, index: true }&lt;br /&gt;
    - { name: СтаттяВитрат,   type: &amp;quot;Довідник.СтаттіВитрат&amp;quot;, master: true, denyEmpty: true, index: true }&lt;br /&gt;
    - { name: Проєкт,         type: &amp;quot;Довідник.Проєкти&amp;quot;, nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.АвансовийЗвіт, Документ.НадходженняПослуг, Документ.НарахуванняЗарплати, Документ.Амортизація]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних (&amp;lt;code&amp;gt;rg_a_0032_tt&amp;lt;/code&amp;gt;, підсумки оборотів за місяць):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! Підрозділ !! СтаттяВитрат !! Проєкт !! r1 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || Оренда || &#039;&#039;(порожній)&#039;&#039; || 45 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || ЗП і нарахування || &#039;&#039;(порожній)&#039;&#039; || 320 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || Реклама || Запуск «Альфа» || 78 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || ІТ-відділ || ЗП і нарахування || &#039;&#039;(порожній)&#039;&#039; || 410 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || ІТ-відділ || Ліцензії ПЗ || &#039;&#039;(порожній)&#039;&#039; || 62 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.6. Регістри бухгалтерії ===&lt;br /&gt;
&lt;br /&gt;
==== Д.6.1. Госпрозрахунковий — з кореспонденцією ====&lt;br /&gt;
&lt;br /&gt;
Декларація — розділ 6.7, схема — 8.6, ER — 9.3. Тут — приклад проводок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Господарська операція:&#039;&#039;&#039; реалізація товару на 12 000 грн (у т.ч. ПДВ 2 000), собівартість 7 000 грн.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проводки (&amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt;, реєстратор = ВидатковаНакладна №12):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! acc_dt !! ed_dt1 !! ed_dt2 !! acc_kt !! ed_kt1 !! ed_kt2 !! r1 (Сума) !! r2_dt !! r2_kt&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 361 &#039;&#039;Розрах. з покупцями&#039;&#039; || ТОВ «Бета» || Договір №5 || 702 &#039;&#039;Дохід від реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 12 000.00 || || 30.000&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 702 &#039;&#039;Дохід від реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 641 &#039;&#039;Розрах. за податками&#039;&#039; || ПДВ || &#039;&#039;—&#039;&#039; || 2 000.00 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 902 &#039;&#039;Собівартість реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 281 &#039;&#039;Товари на складі&#039;&#039; || Кава Lavazza || Центральний || 7 000.00 || 30.000 || 30.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Контроль:&#039;&#039;&#039; Σ(Сума) по Дт = Σ(Сума) по Кт у межах реєстратора → 12 000 + 2 000 + 7 000 = 21 000 з обох боків. ✔&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки, рівень 0 (&amp;lt;code&amp;gt;rg_b_0020_tb0&amp;lt;/code&amp;gt;), на 5999-11-01:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! acc_r !! d1_r (Організація) !! r1 (Сума ±) !! Інтерпретація&lt;br /&gt;
|-&lt;br /&gt;
| 281 || ТОВ «Альфа» || +28 000.00 || дебетовий залишок (товари є)&lt;br /&gt;
|-&lt;br /&gt;
| 361 || ТОВ «Альфа» || +12 000.00 || дебетовий (дебіторка)&lt;br /&gt;
|-&lt;br /&gt;
| 641 || ТОВ «Альфа» || −2 000.00 || кредитовий (винні бюджету)&lt;br /&gt;
|-&lt;br /&gt;
| 702 || ТОВ «Альфа» || −10 000.00 || кредитовий (дохід)&lt;br /&gt;
|-&lt;br /&gt;
| 902 || ТОВ «Альфа» || +7 000.00 || дебетовий (собівартість)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки, рівень 2 (&amp;lt;code&amp;gt;rg_b_0020_tb2&amp;lt;/code&amp;gt;) — для рахунку 281 (2 субконто: Номенклатура, Склад):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! acc_r !! ed1_r (Номенклатура) !! ed2_r (Склад) !! r1 (Сума) !! r2 (Кількість)&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Кава Lavazza || Центральний || 17 500.00 || 50.000&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Кава Lavazza || Роздрібний || 7 000.00 || 20.000&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Чай Ahmad || Центральний || 12 000.00 || 200.000&lt;br /&gt;
|}&lt;br /&gt;
Згортка &amp;lt;code&amp;gt;tb2&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;tb0&amp;lt;/code&amp;gt;: 17 500 + 7 000 + 12 000 = &#039;&#039;&#039;36 500&#039;&#039;&#039;… &#039;&#039;(різниця з таблицею вище — інші операції; у тесті ФТ-Т-08 перевіряється точна рівність)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (ОСВ по рахунку):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Субконто1 ЯК Номенклатура, Дані.Субконто2 ЯК Склад,&lt;br /&gt;
    Дані.СумаПочатковийЗалишокДт, Дані.КількістьПочатковийЗалишокДт,&lt;br /&gt;
    Дані.СумаОборотДт, Дані.СумаОборотКт,&lt;br /&gt;
    Дані.СумаКінцевийЗалишокДт, Дані.КількістьКінцевийЗалишокДт&lt;br /&gt;
З РегістрБухгалтерії.Госпрозрахунковий.ЗалишкиІОбороти(&lt;br /&gt;
       &amp;amp;Початок, &amp;amp;Кінець, Місяць,&lt;br /&gt;
       Рахунок = &amp;amp;Рахунок281,&lt;br /&gt;
       , Організація = &amp;amp;Організація,&lt;br /&gt;
       , &lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.6.2. ПодатковийОблік — без кореспонденції ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; податковий облік із розділенням на постійні/тимчасові різниці, де подвійний запис не потрібен (кожен факт реєструється окремо по Дт або по Кт).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ПодатковийОблік&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Податковий&lt;br /&gt;
  correspondence: false               # ← уніграфічний облік&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, balance: true, denyEmpty: true }&lt;br /&gt;
    - { name: ВидРізниці,  type: &amp;quot;Перерахування.ВидиРізниць&amp;quot;, balance: true }   # БУ|ПУ|ПР|ТР&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Зміст, type: &amp;quot;Рядок(255)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.БухгалтерськаОперація, Документ.ВидатковаНакладна, Документ.НадходженняПослуг]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проводки (&amp;lt;code&amp;gt;rg_b_0021&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! acc_mvt !! acc_r !! ed1 (Номенкл.) !! d1 (Організація) !! d2 (ВидРізниці) !! r1 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 &#039;&#039;Дебет&#039;&#039; || 902.НУ || Кава Lavazza || ТОВ «Альфа» || ПУ &#039;&#039;податковий&#039;&#039; || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 &#039;&#039;Кредит&#039;&#039; || 281.НУ || Кава Lavazza || ТОВ «Альфа» || ПУ || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0 &#039;&#039;Дебет&#039;&#039; || 902.НУ || Кава Lavazza || ТОВ «Альфа» || ПР &#039;&#039;постійна різниця&#039;&#039; || 350.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 &#039;&#039;Кредит&#039;&#039; || 281.НУ || Кава Lavazza || ТОВ «Альфа» || ПР || 350.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Відмінності від Д.6.1:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! З кореспонденцією !! Без кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| Один факт = || 1 запис (Дт+Кт) || 2 записи (окремо Дт, окремо Кт)&lt;br /&gt;
|-&lt;br /&gt;
| Поля рахунків || &amp;lt;code&amp;gt;acc_dt_r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;acc_kt_r&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;acc_r&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;acc_mvt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Субконто || 2 набори (Дт, Кт) || 1 набір&lt;br /&gt;
|-&lt;br /&gt;
| Кількість записів || N || 2N&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця &amp;lt;code&amp;gt;_tc&amp;lt;/code&amp;gt; (кореспонденції) || Є || &#039;&#039;&#039;Немає&#039;&#039;&#039; — «шахова відомість» неможлива&lt;br /&gt;
|-&lt;br /&gt;
| Контроль Дт=Кт || У межах реєстратора || Опційно (може бути незбалансовано за задумом)&lt;br /&gt;
|-&lt;br /&gt;
| Коли обирати || Класичний облік, потрібен аналіз кореспонденцій || Облік без потреби в кореспонденціях, забалансовий, статистичний&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Д.6.3. Бюджетування ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Бюджетування&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Бюджетування&lt;br /&gt;
  correspondence: true&lt;br /&gt;
  periodicity: WithinMonth            # бюджет — помісячний, до секунди не потрібно&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Сценарій, type: &amp;quot;Довідник.СценаріїБюджетування&amp;quot;, balance: true, denyEmpty: true }&lt;br /&gt;
    - { name: ЦФВ,      type: &amp;quot;Довідник.ЦентриФінансовоїВідповідальності&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Проєкт,   type: &amp;quot;Довідник.Проєкти&amp;quot;, balance: true, nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
  recorders: [Документ.БюджетнаОперація, Документ.ВведенняБюджету]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; &amp;lt;code&amp;gt;Сценарій&amp;lt;/code&amp;gt; — вимірювання, а не окремий регістр на кожен сценарій (План/Факт/Прогноз). Це дозволяє план-фактний аналіз одним запитом. Усі три вимірювання &#039;&#039;&#039;балансові&#039;&#039;&#039; — бюджетна проводка не змінює сценарій/ЦФВ між дебетом і кредитом.&lt;br /&gt;
&lt;br /&gt;
=== Д.7. Регістри розрахунку ===&lt;br /&gt;
&lt;br /&gt;
==== Д.7.1. ОсновніНарахування — період дії + витіснення ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид розрахунку !! Період дії !! Витісняючі !! Базові !! Залежність від бази&lt;br /&gt;
|-&lt;br /&gt;
| Оклад || Так || Відпустка, Лікарняний || — || Не залежить&lt;br /&gt;
|-&lt;br /&gt;
| Відпустка || Так || Лікарняний || Оклад, Премія || За періодом дії&lt;br /&gt;
|-&lt;br /&gt;
| Лікарняний || Так || — || Оклад || За періодом дії&lt;br /&gt;
|-&lt;br /&gt;
| Премія || Ні || — || Оклад || За періодом реєстрації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Декларація регістру — розділ 6.7.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Записи (&amp;lt;code&amp;gt;rg_c_0040&amp;lt;/code&amp;gt;), період реєстрації = липень 2026:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! calc_type !! period !! act_begin !! act_end !! base_begin !! base_end !! d1 (Співробітник) !! r1 (Результат)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Оклад || 2026-07-01 || 2026-07-01 || 2026-07-31 || || || Іваненко || 18 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Відпустка || 2026-07-01 || 2026-07-10 || 2026-07-17 || 2026-01-01 || 2026-06-30 || Іваненко || 6 420.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Лікарняний || 2026-07-01 || 2026-07-14 || 2026-07-22 || 2026-01-01 || 2026-06-30 || Іваненко || 5 180.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Оклад || 2026-07-01 || 2026-07-01 || 2026-07-31 || || || Петренко || 22 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фактичні періоди дії (&amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt;) — результат витіснення:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec/line !! interval_no !! calc_type !! d1 !! fact_begin !! fact_end !! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 1 || 0 || Оклад || Іваненко || 2026-07-01 || 2026-07-09 || до відпустки&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 1 || 1 || Оклад || Іваненко || 2026-07-23 || 2026-07-31 || після лікарняного&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 2 || 0 || Відпустка || Іваненко || 2026-07-10 || 2026-07-13 || витіснена лікарняним з 14-го&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 3 || 0 || Лікарняний || Іваненко || 2026-07-14 || 2026-07-22 || не витісняється нічим&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 4 || 0 || Оклад || Петренко || 2026-07-01 || 2026-07-31 || витіснення відсутнє&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Один запис «Оклад» Іваненка → два інтервали&#039;&#039;&#039; — ілюстрація зв&#039;язку 1:N у розділі 9.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (дані графіка для розрахунку окладу):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Співробітник, Дані.НомерРядка,&lt;br /&gt;
    Дані.ЗначенняФактичногоПеріодуДії ЯК ВідпрацьованоДнів,&lt;br /&gt;
    Дані.ЗначенняПеріодуДії           ЯК НормаДнів&lt;br /&gt;
З РегістрРозрахунку.ОсновніНарахування.ДаніГрафіка(&lt;br /&gt;
       ВидРозрахунку = ЗНАЧЕННЯ(ПланВидівРозрахунку.ОсновніНарахування.Оклад)&lt;br /&gt;
       І Реєстратор = &amp;amp;Реєстратор&lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Результат:&#039;&#039;&#039; Іваненко — &amp;lt;code&amp;gt;ВідпрацьованоДнів = 13&amp;lt;/code&amp;gt; (робочі дні у 01–09 та 23–31), &amp;lt;code&amp;gt;НормаДнів = 23&amp;lt;/code&amp;gt; → Оклад = 18 000 × 13 / 23 = &#039;&#039;&#039;10 173,91&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (база для відпустки):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ База.Співробітник, База.НомерРядка, База.РезультатБаза ЯК Заробіток&lt;br /&gt;
З РегістрРозрахунку.ОсновніНарахування.БазаРозрахунку(&lt;br /&gt;
       , /* вимірювання бази */&lt;br /&gt;
       , /* вимірювання основного регістру */&lt;br /&gt;
       Співробітник,                          /* розрізи */&lt;br /&gt;
       ВидРозрахунку = ЗНАЧЕННЯ(ПланВидівРозрахунку.ОсновніНарахування.Відпустка)&lt;br /&gt;
   ) ЯК База&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.7.2. Утримання — без періоду дії, база за періодом реєстрації ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид розрахунку !! Період дії !! Базові види розрахунку !! Залежність&lt;br /&gt;
|-&lt;br /&gt;
| ПДФО || Ні || &#039;&#039;(усі з ПВР ОсновніНарахування)&#039;&#039; || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Військовий збір || Ні || &#039;&#039;(усі з ПВР ОсновніНарахування)&#039;&#039; || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Аліменти || Ні || Оклад, Премія, Відпустка || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Профспілковий внесок || Ні || Оклад || За періодом реєстрації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Утримання&lt;br /&gt;
  kind: Calculation&lt;br /&gt;
  calculationTypesPlan: ПланВидівРозрахунку.Утримання&lt;br /&gt;
  periodicity: Month&lt;br /&gt;
  actionPeriod: false                 # ← утримання не має періоду дії&lt;br /&gt;
  basePeriod: ByRegistrationPeriod    # ← база береться за періодом реєстрації&lt;br /&gt;
  # schedule: не задається — графік не потрібен&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, baseDimension: true, master: true, denyEmpty: true }&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Результат,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: БазаОподаткування, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recalculations:&lt;br /&gt;
    - name: ПерерахунокУтримань&lt;br /&gt;
      dimensions:&lt;br /&gt;
        - { name: Співробітник, registerDimension: Співробітник }&lt;br /&gt;
  recorders: [Документ.НарахуванняЗарплати]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фізична схема (спрощена — немає полів періоду дії):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_c_0041 (&lt;br /&gt;
    rec_t       smallint     NOT NULL,&lt;br /&gt;
    rec_r       uuid         NOT NULL,&lt;br /&gt;
    line_no     int          NOT NULL,&lt;br /&gt;
    period      timestamp(0) NOT NULL,     -- період реєстрації&lt;br /&gt;
    active      boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    reversal    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    calc_type_r uuid         NOT NULL,&lt;br /&gt;
    base_begin  timestamp(0) NOT NULL,     -- ← є, бо basePeriod ≠ None&lt;br /&gt;
    base_end    timestamp(0) NOT NULL,&lt;br /&gt;
    -- act_begin / act_end ВІДСУТНІ (actionPeriod: false)&lt;br /&gt;
    d1_r        uuid         NOT NULL,&lt;br /&gt;
    d2_r        uuid         NOT NULL,&lt;br /&gt;
    r1          numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2          numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0041 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
-- Таблиця rg_c_0041_ap НЕ створюється (немає періоду дії → немає витіснення)&lt;br /&gt;
CREATE TABLE rg_c_0041_rc1 (            -- ПерерахунокУтримань&lt;br /&gt;
    rec_t smallint NOT NULL, rec_r uuid NOT NULL,&lt;br /&gt;
    calc_type_r uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    src_rec_t smallint NOT NULL, src_rec_r uuid NOT NULL,&lt;br /&gt;
    created_at timestamp(0) NOT NULL DEFAULT now(),&lt;br /&gt;
    CONSTRAINT pk_rg_c_0041_rc1 PRIMARY KEY (rec_t, rec_r, calc_type_r, d1_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Міжпланова база.&#039;&#039;&#039; Базові види розрахунку для ПВР &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt; належать до &#039;&#039;іншого&#039;&#039; ПВР — &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;. Це означає, що віртуальна таблиця &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; регістру &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt; має читати записи регістру &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Вимога ФТ-25 має бути розширена:&#039;&#039;&#039; метамодель повинна дозволяти вказати &#039;&#039;регістр-джерело бази&#039;&#039;. Це &#039;&#039;&#039;відкрите питання В9&#039;&#039;&#039; (див. оновлений Додаток Г) — у 1С механізм працює через відповідність ПВР, а не регістрів, що обмежує сценарії. Пропозиція: додати до &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt; поле &amp;lt;code&amp;gt;base_register_id&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! calc_type !! period !! base_begin !! base_end !! Співробітник !! r2 (База) !! r1 (Результат)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ПДФО || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 21 773.91 || 3 919.30&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Військовий збір || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 21 773.91 || 326.61&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Аліменти || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 17 528.00 || 4 382.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.8. Наскрізний приклад: проведення видаткової накладної ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Документ:&#039;&#039;&#039; Видаткова накладна №12 від 05.07.2026, ТОВ «Бета», 30 кг кави за 400 грн (12 000 грн з ПДВ), собівартість 7 000 грн.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Posting {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9];&lt;br /&gt;
&lt;br /&gt;
  D [label=&amp;quot;Документ\nВидаткова накладна №12\n05.07.2026&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;, shape=note];&lt;br /&gt;
&lt;br /&gt;
  R1 [label=&amp;quot;РН ТовариНаСкладах\n(Залишки)\nВитрата: 30 кг / 7 000 грн&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R2 [label=&amp;quot;РН Взаєморозрахунки\n(Залишки)\nПрихід: 12 000 грн&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R3 [label=&amp;quot;РН Продажі\n(Обороти)\n30 кг / 12 000 / 10 000 / 7 000&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R4 [label=&amp;quot;РН ТовариВРезерві\n(Залишки)\nВитрата: 30 кг&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R5 [label=&amp;quot;РБ Госпрозрахунковий\n3 проводки на 21 000&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  T1 [label=&amp;quot;rg_a_0012_tb\nMAXPERIOD: 80 → 50 кг&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T2 [label=&amp;quot;rg_a_0013_tb\nMAXPERIOD: 0 → +12 000&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T3 [label=&amp;quot;rg_a_0031_tt\n2026-07: +30 / +12 000&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T5 [label=&amp;quot;rg_b_0020_tb0/tb2/tt0/tc&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;, shape=cylinder];&lt;br /&gt;
&lt;br /&gt;
  D -&amp;gt; R1; D -&amp;gt; R2; D -&amp;gt; R3; D -&amp;gt; R4; D -&amp;gt; R5;&lt;br /&gt;
  R1 -&amp;gt; T1; R2 -&amp;gt; T2; R3 -&amp;gt; T3; R5 -&amp;gt; T5;&lt;br /&gt;
&lt;br /&gt;
  label=&amp;quot;ОДНА транзакція БД: усі 5 регістрів + підсумки + прапорець Проведений&amp;quot;;&lt;br /&gt;
  labelloc=b; fontname=&amp;quot;Helvetica&amp;quot;; fontsize=10;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
class ВидатковаНакладна(Document):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Проведення по 5 регістрах в одній транзакції. Бюджет Python: &amp;lt;= 15 мс (АП-4).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def on_posting(self, ctx: PostingContext) -&amp;gt; None:&lt;br /&gt;
        # --- 0. Блокування перед контролем залишків ---&lt;br /&gt;
        with DataLock() as dl:&lt;br /&gt;
            li = dl.add(&amp;quot;РегістрНакопичення.ТовариНаСкладах.Залишки&amp;quot;)&lt;br /&gt;
            li.mode = DataLockMode.EXCLUSIVE&lt;br /&gt;
            li.data_source = self.Товари.unload(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Характеристика&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Номенклатура&amp;quot;)&lt;br /&gt;
            li.use_from_data_source(&amp;quot;Характеристика&amp;quot;, &amp;quot;Характеристика&amp;quot;)&lt;br /&gt;
            li.set_value(&amp;quot;Склад&amp;quot;, self.Склад)&lt;br /&gt;
&lt;br /&gt;
            self._movements_goods()       # 1. ТовариНаСкладах&lt;br /&gt;
            self._movements_ar()          # 2. Взаєморозрахунки&lt;br /&gt;
            self._movements_sales()       # 3. Продажі&lt;br /&gt;
            self._movements_reserve()     # 4. ТовариВРезерві&lt;br /&gt;
            self._movements_accounting()  # 5. Госпрозрахунковий&lt;br /&gt;
&lt;br /&gt;
            self.movements.ТовариНаСкладах.write_now()&lt;br /&gt;
            self._control_negative_balances(ctx)&lt;br /&gt;
&lt;br /&gt;
    # --- 1. РН ТовариНаСкладах: списання ---&lt;br /&gt;
    def _movements_goods(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.ТовариНаСкладах&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(Період=self.Дата,&lt;br /&gt;
                   ВидРуху=AccumulationMovementType.EXPENSE,&lt;br /&gt;
                   Номенклатура=r.Номенклатура, Характеристика=r.Характеристика,&lt;br /&gt;
                   Склад=self.Склад, Партія=r.Партія,&lt;br /&gt;
                   Кількість=r.Кількість, Сума=r.Собівартість)&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    # --- 2. РН Взаєморозрахунки: дебіторка зростає ---&lt;br /&gt;
    def _movements_ar(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.ВзаєморозрахункиЗКонтрагентами&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.append(rs.new(&lt;br /&gt;
            Період=self.Дата,&lt;br /&gt;
            ВидРуху=AccumulationMovementType.RECEIPT,     # Прихід = борг зростає&lt;br /&gt;
            Організація=self.Організація, Контрагент=self.Контрагент,&lt;br /&gt;
            Договір=self.Договір, Замовлення=self.ЗамовленняПокупця,&lt;br /&gt;
            Сума=self.СумаДокумента, СумаВал=self.СумаДокументаВал,&lt;br /&gt;
        ))&lt;br /&gt;
&lt;br /&gt;
    # --- 3. РН Продажі: оборот (ВидРуху відсутній!) ---&lt;br /&gt;
    def _movements_sales(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Продажі&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(Період=self.Дата,&lt;br /&gt;
                   Номенклатура=r.Номенклатура, Контрагент=self.Контрагент,&lt;br /&gt;
                   Договір=self.Договір, Менеджер=self.Менеджер, Склад=self.Склад,&lt;br /&gt;
                   Кількість=r.Кількість, Сума=r.Сума,&lt;br /&gt;
                   СумаБезПДВ=r.СумаБезПДВ, Собівартість=r.Собівартість)&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    # --- 4. РН ТовариВРезерві: зняття резерву ---&lt;br /&gt;
    def _movements_reserve(self) -&amp;gt; None:&lt;br /&gt;
        if self.ЗамовленняПокупця.is_empty():&lt;br /&gt;
            return&lt;br /&gt;
        rs = self.movements.ТовариВРезерві&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        rs.extend(&lt;br /&gt;
            rs.new(Період=self.Дата, ВидРуху=AccumulationMovementType.EXPENSE,&lt;br /&gt;
                   Номенклатура=r.Номенклатура, Характеристика=r.Характеристика,&lt;br /&gt;
                   Склад=self.Склад, Замовлення=self.ЗамовленняПокупця,&lt;br /&gt;
                   Кількість=r.Кількість)&lt;br /&gt;
            for r in self.Товари&lt;br /&gt;
        )&lt;br /&gt;
&lt;br /&gt;
    # --- 5. РБ Госпрозрахунковий: 3 проводки на рядок ---&lt;br /&gt;
    def _movements_accounting(self) -&amp;gt; None:&lt;br /&gt;
        rs = self.movements.Госпрозрахунковий&lt;br /&gt;
        rs.write = True&lt;br /&gt;
        rs.clear()&lt;br /&gt;
        for r in self.Товари:&lt;br /&gt;
            e1 = rs.add_accounting_entry(               # Дт 361 / Кт 702&lt;br /&gt;
                Період=self.Дата, Організація=self.Організація,&lt;br /&gt;
                РахунокДт=Accounts[&amp;quot;361&amp;quot;], РахунокКт=Accounts[&amp;quot;702&amp;quot;],&lt;br /&gt;
                Сума=r.Сума, КількістьКт=r.Кількість)&lt;br /&gt;
            e1.subconto_dt[ВидиСубконто.Контрагенти] = self.Контрагент&lt;br /&gt;
            e1.subconto_dt[ВидиСубконто.Договори] = self.Договір&lt;br /&gt;
            e1.subconto_kt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
&lt;br /&gt;
            e2 = rs.add_accounting_entry(               # Дт 702 / Кт 641 (ПДВ)&lt;br /&gt;
                Період=self.Дата, Організація=self.Організація,&lt;br /&gt;
                РахунокДт=Accounts[&amp;quot;702&amp;quot;], РахунокКт=Accounts[&amp;quot;641&amp;quot;],&lt;br /&gt;
                Сума=r.СумаПДВ)&lt;br /&gt;
            e2.subconto_dt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e2.subconto_kt[ВидиСубконто.ПодаткиІЗбори] = Taxes.ПДВ&lt;br /&gt;
&lt;br /&gt;
            e3 = rs.add_accounting_entry(               # Дт 902 / Кт 281&lt;br /&gt;
                Період=self.Дата, Організація=self.Організація,&lt;br /&gt;
                РахунокДт=Accounts[&amp;quot;902&amp;quot;], РахунокКт=Accounts[&amp;quot;281&amp;quot;],&lt;br /&gt;
                Сума=r.Собівартість,&lt;br /&gt;
                КількістьДт=r.Кількість, КількістьКт=r.Кількість)&lt;br /&gt;
            e3.subconto_dt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e3.subconto_kt[ВидиСубконто.Номенклатура] = r.Номенклатура&lt;br /&gt;
            e3.subconto_kt[ВидиСубконто.Склади] = self.Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що відбувається у БД (одна транзакція):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Крок !! Таблиця !! Операція !! Рядків&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;lt;code&amp;gt;doc_0003&amp;lt;/code&amp;gt; || UPDATE posted = true || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt; (ТовариНаСкладах) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt; || MERGE (MAXPERIOD + періоди &amp;gt; 07.2026) || 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &amp;lt;code&amp;gt;rg_a_0013&amp;lt;/code&amp;gt; (Взаєморозрахунки) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &amp;lt;code&amp;gt;rg_a_0013_tb&amp;lt;/code&amp;gt; || MERGE || 2&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &amp;lt;code&amp;gt;rg_a_0031&amp;lt;/code&amp;gt; (Продажі) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 7 || &amp;lt;code&amp;gt;rg_a_0031_tt&amp;lt;/code&amp;gt; || MERGE (тільки період 2026-07) || 1&lt;br /&gt;
|-&lt;br /&gt;
| 8 || &amp;lt;code&amp;gt;rg_a_0031_ag1&amp;lt;/code&amp;gt; || MERGE (realtime-агрегат) || 1&lt;br /&gt;
|-&lt;br /&gt;
| 9 || &amp;lt;code&amp;gt;rg_a_0014&amp;lt;/code&amp;gt; (Резерв) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 10 || &amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt; (проводки) || DELETE + INSERT || 3&lt;br /&gt;
|-&lt;br /&gt;
| 11 || &amp;lt;code&amp;gt;rg_b_0020_tb0&amp;lt;/code&amp;gt; || MERGE || 10&lt;br /&gt;
|-&lt;br /&gt;
| 12 || &amp;lt;code&amp;gt;rg_b_0020_tb1/tb2&amp;lt;/code&amp;gt; || MERGE || 8&lt;br /&gt;
|-&lt;br /&gt;
| 13 || &amp;lt;code&amp;gt;rg_b_0020_tt0..tt2&amp;lt;/code&amp;gt; || MERGE || 12&lt;br /&gt;
|-&lt;br /&gt;
| 14 || &amp;lt;code&amp;gt;rg_b_0020_tc&amp;lt;/code&amp;gt; || MERGE || 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Разом&#039;&#039;&#039; || &#039;&#039;&#039;≈ 47 рядків, 1 COMMIT&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Спостереження для НФВ-04.&#039;&#039;&#039; Один рядок товару в накладній породжує ~47 модифікацій рядків у 14 таблицях. Для накладної зі 100 рядків це ~2 000–4 000 модифікацій. Саме тут — основне навантаження проведення, і саме тому РБ (кроки 10–14) дає ~70 % вартості транзакції. Це аргумент на користь MVP без РБ (розділ 14) і предмет вимірювання в НТ-03.}}&lt;br /&gt;
&lt;br /&gt;
=== Д.9. Наскрізний приклад: розрахунок зарплати ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
КРОК 1. Документ «Нарахування зарплати» за липень 2026, Іваненко.&lt;br /&gt;
        Записуємо рухи в РР ОсновніНарахування (Результат = 0).&lt;br /&gt;
&lt;br /&gt;
КРОК 2. Платформа автоматично будує фактичні періоди дії (rg_c_0040_ap):&lt;br /&gt;
        Оклад      → [01.07–09.07], [23.07–31.07]&lt;br /&gt;
        Відпустка  → [10.07–13.07]&lt;br /&gt;
        Лікарняний → [14.07–22.07]&lt;br /&gt;
&lt;br /&gt;
КРОК 3. Розрахунок «первинних» видів (без бази) — Оклад.&lt;br /&gt;
        Запит до ДаніГрафіка:&lt;br /&gt;
          НормаДнів            = 23 (робочих днів у липні за П&#039;ятиденкою)&lt;br /&gt;
          ВідпрацьованоДнів    = 13 (робочі дні у фактичних періодах дії)&lt;br /&gt;
        Результат = 18 000 × 13 / 23 = 10 173,91&lt;br /&gt;
        → UPDATE rg_c_0040 SET r1 = 10173.91, r2 = 13, r3 = 23 WHERE line_no = 1&lt;br /&gt;
&lt;br /&gt;
КРОК 4. Розрахунок видів із базою — Відпустка, Лікарняний.&lt;br /&gt;
        Запит до БазаРозрахунку (базовий період 01.01–30.06, база = Оклад+Премія):&lt;br /&gt;
          Заробіток за 6 міс. = 115 560,00&lt;br /&gt;
          Календарних днів    = 181&lt;br /&gt;
          Середньоденний      = 638,45&lt;br /&gt;
        Відпустка: 638,45 × 4 дні (10–13.07) = 2 553,80&lt;br /&gt;
        Лікарняний: 638,45 × 9 днів × 100 % = 5 746,05&lt;br /&gt;
        → UPDATE rg_c_0040 SET r1 = ... WHERE line_no IN (2, 3)&lt;br /&gt;
&lt;br /&gt;
КРОК 5. Записуємо рухи в РР Утримання (базовий період = період реєстрації, липень).&lt;br /&gt;
        База ПДФО = 10 173,91 + 2 553,80 + 5 746,05 = 18 473,76&lt;br /&gt;
        ПДФО = 18 473,76 × 18 % = 3 325,28&lt;br /&gt;
        ВЗ   = 18 473,76 × 1,5 % =   277,11&lt;br /&gt;
&lt;br /&gt;
КРОК 6. Проведення документа → рухи в:&lt;br /&gt;
        РН ВитратиЗаСтаттями (Обороти):  Стаття «ЗП і нарахування» = 18 473,76&lt;br /&gt;
        РБ Госпрозрахунковий:            Дт 92 / Кт 661 = 18 473,76&lt;br /&gt;
                                         Дт 661 / Кт 641.ПДФО = 3 325,28&lt;br /&gt;
                                         Дт 661 / Кт 642.ВЗ =     277,11&lt;br /&gt;
&lt;br /&gt;
КРОК 7. Через тиждень бухгалтер змінює Оклад Іваненка за червень (заднім числом).&lt;br /&gt;
        → Платформа реєструє в rg_c_0040_rc1 (ПерерахунокЗаБазою):&lt;br /&gt;
             (Реєстратор = НарахуванняЗП липня, ВидРозрахунку = Відпустка,  Співробітник = Іваненко)&lt;br /&gt;
             (Реєстратор = НарахуванняЗП липня, ВидРозрахунку = Лікарняний, Співробітник = Іваненко)&lt;br /&gt;
        → Звіт «Документи до перерахунку» показує липневий документ.&lt;br /&gt;
        → Бухгалтер перепроводить → база перераховується → записи перерахунку очищаються.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Д.10. Антипатерни проєктування регістрів ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Антипатерн !! Чому погано !! Як правильно&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-1&#039;&#039;&#039; || Дата як &#039;&#039;&#039;вимірювання&#039;&#039;&#039; у РН (замість стандартного &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;) || Таблиця підсумків множиться на кількість дат і зростає нескінченно; віртуальні таблиці &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; ігнорують це вимірювання і дають безглузді результати || Використовувати стандартний реквізит &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;. Виняток — календарі (Д.3.4), де це РВ, а не РН&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-2&#039;&#039;&#039; || РН «Залишки» там, де потрібна лише історія значення || Надлишкові таблиці підсумків, кумулятивні оновлення, вид руху без сенсу || РВ періодичний&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-3&#039;&#039;&#039; || РН «Залишки» там, де залишок безглуздий (Продажі, Витрати) || Удвічі більший обсяг підсумків, кумулятивні MERGE на всі майбутні періоди || РН «Обороти» + агрегати (Д.5.1)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-4&#039;&#039;&#039; || Реквізит документа продубльовано у вимірювання «щоб фільтрувати у звіті» || Кардинальність підсумків × N; типовий випадок — Менеджер/Валюта/Коментар || Реквізит регістру + з&#039;єднання з документом у звіті; або окремий регістр «Обороти»&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-5&#039;&#039;&#039; || &amp;gt; 8 вимірювань в одному РН || Таблиця підсумків стає &#039;&#039;&#039;більшою&#039;&#039;&#039; за таблицю рухів; проведення сповільнюється в рази || Розділити на регістри за призначенням; частину аналітики — в «Обороти» з агрегатами&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-6&#039;&#039;&#039; || Незалежний РВ «у межах секунди» як журнал подій || Два записи в ту саму секунду → другий &#039;&#039;&#039;мовчки замістить&#039;&#039;&#039; перший; втрата даних || Підпорядкований РВ (реєстратор у ключі) або додати вимірювання-дискримінатор&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-7&#039;&#039;&#039; || Ресурс типу &amp;lt;code&amp;gt;Рядок&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Посилання&amp;lt;/code&amp;gt; у РН || Підсумовування неможливе; підсумки не побудуються || Реквізит (не агрегується) або вимірювання (якщо це розріз)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-8&#039;&#039;&#039; || Прямий &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt; таблиці підсумків із прикладного коду || Розсинхронізація підсумків і рухів; діагностика — тижні || Тільки через набори записів. Заборона на рівні прав БД (розділ 12.2)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-9&#039;&#039;&#039; || Один «універсальний» регістр із вимірюванням &amp;lt;code&amp;gt;ВидОбліку&amp;lt;/code&amp;gt; (БУ/ПУ/УО) замість трьох || Втричі більша таблиця; конкуренція за блокування між незалежними обліками; неможливо окремо перерахувати підсумки || Окремі регістри. Виняток — РБ &amp;lt;code&amp;gt;ПодатковийОблік&amp;lt;/code&amp;gt; (Д.6.2), де ВидРізниці — це справді розріз одного обліку&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-10&#039;&#039;&#039; || Функціонально залежне поле як вимірювання (Валюта при БанківськомуРахунку) || Надлишковість; ризик неузгоджених даних; зайвий розмір ключа підсумків || З&#039;єднання з довідником у запиті (Д.4.4)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-11&#039;&#039;&#039; || РБ там, де достатньо РН || Замість 1 таблиці — 10; ~70 % вартості проведення (Д.8); складність субконто без потреби || РН. РБ — лише коли потрібні план рахунків, подвійний запис і кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-12&#039;&#039;&#039; || Вимірювання з &amp;lt;code&amp;gt;nullable&amp;lt;/code&amp;gt; без потреби || Порожнє посилання — окреме значення ключа; підсумки «розмазуються» на два рядки замість одного || &amp;lt;code&amp;gt;denyEmpty: true&amp;lt;/code&amp;gt; скрізь, де порожнє значення не має сенсу&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-13&#039;&#039;&#039; || Контроль залишків &#039;&#039;&#039;до&#039;&#039;&#039; запису рухів || Класична гонитва: два сеанси проходять контроль і обидва списують у мінус || Спершу &amp;lt;code&amp;gt;DataLock&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;WriteNow()&amp;lt;/code&amp;gt; → потім контроль (Д.8, ФТ-Т-12)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-14&#039;&#039;&#039; || &amp;lt;code&amp;gt;periodicity: WithinSecond&amp;lt;/code&amp;gt; «про всяк випадок» скрізь || Для РВ — неможливість замістити запис за день; для РН — марна точність, більші індекси || Обирати мінімально достатню: день для цін/курсів/виписок, секунда — для складських рухів&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-15&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;(Python)&#039;&#039; || Запис рухів у циклі: &amp;lt;code&amp;gt;for r in Товари: rs.add(...).write()&amp;lt;/code&amp;gt; || Порушення АП-1: 100 round-trip&#039;ів замість 1; проведення 300 мс → ~10 с. Невидиме на тестових даних, катастрофічне на продуктиві. Найчастіша помилка при ORM-мисленні || Наповнити набір повністю (&amp;lt;code&amp;gt;rs.extend(генератор)&amp;lt;/code&amp;gt;), записати один раз. Детектор — Додаток Е.7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-16&#039;&#039;&#039;&amp;lt;br /&amp;gt;&#039;&#039;(Python)&#039;&#039; || Агрегація дельт підсумків у Python (&amp;lt;code&amp;gt;defaultdict&amp;lt;/code&amp;gt; + цикл) замість &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt; || Порушення АП-2: дані ганяються в застосунок і назад; на 10&amp;lt;sup&amp;gt;5&amp;lt;/sup&amp;gt; рядків — десятки секунд || &amp;lt;code&amp;gt;INSERT … ON CONFLICT DO UPDATE&amp;lt;/code&amp;gt; одним запитом (Е.3)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.11. Чек-лист рев&#039;ю нового регістру ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
□ Тип регістру обґрунтований за деревом Д.1&lt;br /&gt;
□ Кожне вимірювання використовується у фільтрі АБО групуванні звітів&lt;br /&gt;
□ Кожен ресурс має сенс при підсумовуванні&lt;br /&gt;
□ Немає полів з антипатернів А-1, А-4, А-7, А-10, А-12&lt;br /&gt;
□ Оцінка кардинальності підсумків ≤ 10^8 (калькулятор конструктора, ФТ-К-03)&lt;br /&gt;
□ Для вимірювань, де порожнє значення безглузде, стоїть denyEmpty&lt;br /&gt;
□ Ведучі (master) вимірювання визначені — інакше «висячі» записи при видаленні об&#039;єктів&lt;br /&gt;
□ Склад реєстраторів повний; зайвих типів документів немає&lt;br /&gt;
□ Угода про знак / вид руху зафіксована в методологічній документації&lt;br /&gt;
□ Періодичність мінімально достатня (А-14)&lt;br /&gt;
□ Для РН «Обороти» з &amp;gt;4 вимірюваннями визначено ≥1 агрегат&lt;br /&gt;
□ Для РБ: балансові/небалансові вимірювання та ресурси розставлені свідомо&lt;br /&gt;
□ Для РР: витісняючі та базові види розрахунку в ПВР заповнені; перерахунки визначені&lt;br /&gt;
□ Партиціонування ввімкнене, якщо очікується &amp;gt;100 млн записів&lt;br /&gt;
□ Написано тест на проведення + скасування + перерахунок підсумків&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Додаток Е. Ескізи реалізації ядра на Python ==&lt;br /&gt;
&lt;br /&gt;
Додаток демонструє, що метамодель розділу 6 і фізична модель розділу 8 реалізовні обраним стеком (розділ 4.3), і фіксує ключові технічні рішення для етапів Е1, Е3, Е5, Е7, Е11. Код — ілюстративний ескіз, а не остаточний API.&lt;br /&gt;
&lt;br /&gt;
=== Е.1. Маніфест регістру як Pydantic-модель (етап Е1) ===&lt;br /&gt;
&lt;br /&gt;
YAML-декларації розділу 6.7 і Додатка Д валідуються цією моделлю. Це &#039;&#039;&#039;безпосередньо реалізує ФТ-К-01&#039;&#039;&#039; (валідація в реальному часі) і частину контролю антипатернів Д.10.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from __future__ import annotations&lt;br /&gt;
&lt;br /&gt;
import warnings&lt;br /&gt;
from enum import StrEnum&lt;br /&gt;
from typing import Annotated, Literal, Self&lt;br /&gt;
&lt;br /&gt;
from pydantic import BaseModel, ConfigDict, Field, model_validator&lt;br /&gt;
&lt;br /&gt;
IDENT = r&amp;quot;^[^\W\d]\w{0,79}$&amp;quot;          # Unicode-ідентифікатор (кирилиця дозволена), &amp;lt;= 80 симв.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RegisterKind(StrEnum):&lt;br /&gt;
    INFORMATION = &amp;quot;Information&amp;quot;&lt;br /&gt;
    ACCUMULATION = &amp;quot;Accumulation&amp;quot;&lt;br /&gt;
    ACCOUNTING = &amp;quot;Accounting&amp;quot;&lt;br /&gt;
    CALCULATION = &amp;quot;Calculation&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Periodicity(StrEnum):&lt;br /&gt;
    NONPERIODICAL = &amp;quot;Nonperiodical&amp;quot;&lt;br /&gt;
    WITHIN_SECOND = &amp;quot;WithinSecond&amp;quot;&lt;br /&gt;
    WITHIN_DAY = &amp;quot;WithinDay&amp;quot;&lt;br /&gt;
    WITHIN_MONTH = &amp;quot;WithinMonth&amp;quot;&lt;br /&gt;
    WITHIN_QUARTER = &amp;quot;WithinQuarter&amp;quot;&lt;br /&gt;
    WITHIN_YEAR = &amp;quot;WithinYear&amp;quot;&lt;br /&gt;
    BY_RECORDER_POSITION = &amp;quot;ByRecorderPosition&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class WriteMode(StrEnum):&lt;br /&gt;
    INDEPENDENT = &amp;quot;Independent&amp;quot;&lt;br /&gt;
    SUBORDINATE = &amp;quot;SubordinateToRecorder&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class FieldRole(StrEnum):&lt;br /&gt;
    DIMENSION = &amp;quot;Dimension&amp;quot;&lt;br /&gt;
    RESOURCE = &amp;quot;Resource&amp;quot;&lt;br /&gt;
    ATTRIBUTE = &amp;quot;Attribute&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RegisterField(BaseModel):&lt;br /&gt;
    model_config = ConfigDict(extra=&amp;quot;forbid&amp;quot;, frozen=True)&lt;br /&gt;
&lt;br /&gt;
    name: Annotated[str, Field(pattern=IDENT)]&lt;br /&gt;
    role: FieldRole&lt;br /&gt;
    type: str | list[str]                 # &amp;quot;Довідник.Номенклатура&amp;quot; | [&amp;quot;Документ.А&amp;quot;, &amp;quot;Документ.Б&amp;quot;]&lt;br /&gt;
    synonym: str | None = None&lt;br /&gt;
    index: bool = False&lt;br /&gt;
    master: bool = False                  # «Ведуче»&lt;br /&gt;
    deny_empty: bool = False&lt;br /&gt;
    nullable: bool = False&lt;br /&gt;
    use_in_totals: bool = True&lt;br /&gt;
    # РБ&lt;br /&gt;
    balance: bool = False&lt;br /&gt;
    accounting_flag: str | None = None&lt;br /&gt;
    # РР&lt;br /&gt;
    base_dimension: bool = False&lt;br /&gt;
&lt;br /&gt;
    @property&lt;br /&gt;
    def is_composite(self) -&amp;gt; bool:&lt;br /&gt;
        return isinstance(self.type, list) and len(self.type) &amp;gt; 1&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class Register(BaseModel):&lt;br /&gt;
    model_config = ConfigDict(extra=&amp;quot;forbid&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    name: Annotated[str, Field(pattern=IDENT)]&lt;br /&gt;
    kind: RegisterKind&lt;br /&gt;
    synonym: str | None = None&lt;br /&gt;
    periodicity: Periodicity = Periodicity.NONPERIODICAL&lt;br /&gt;
    write_mode: WriteMode = WriteMode.SUBORDINATE&lt;br /&gt;
    dimensions: list[RegisterField] = []&lt;br /&gt;
    resources: list[RegisterField] = []&lt;br /&gt;
    attributes: list[RegisterField] = []&lt;br /&gt;
    recorders: list[str] = []&lt;br /&gt;
    # РН&lt;br /&gt;
    accumulation_kind: Literal[&amp;quot;Balance&amp;quot;, &amp;quot;Turnover&amp;quot;] | None = None&lt;br /&gt;
    enable_balance_totals: bool = True&lt;br /&gt;
    enable_turnover_totals: bool = False&lt;br /&gt;
    turnover_totals_period: Literal[&amp;quot;Day&amp;quot;, &amp;quot;Month&amp;quot;] | None = None&lt;br /&gt;
    # РБ&lt;br /&gt;
    chart_of_accounts: str | None = None&lt;br /&gt;
    correspondence: bool = True&lt;br /&gt;
    max_extdim_count: Annotated[int, Field(ge=0, le=5)] = 3&lt;br /&gt;
    # РР&lt;br /&gt;
    calculation_types_plan: str | None = None&lt;br /&gt;
    action_period: bool = False&lt;br /&gt;
    base_period: Literal[&amp;quot;None&amp;quot;, &amp;quot;ByActionPeriod&amp;quot;, &amp;quot;ByRegistrationPeriod&amp;quot;] = &amp;quot;None&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    # ---------- крос-полева валідація (розділи 6.2–6.6) ----------&lt;br /&gt;
    @model_validator(mode=&amp;quot;after&amp;quot;)&lt;br /&gt;
    def _validate(self) -&amp;gt; Self:&lt;br /&gt;
        if self.write_mode is WriteMode.INDEPENDENT and self.kind is not RegisterKind.INFORMATION:&lt;br /&gt;
            raise ValueError(&amp;quot;Незалежний режим запису дозволено лише для регістру відомостей&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if self.kind is RegisterKind.ACCUMULATION:&lt;br /&gt;
            if self.accumulation_kind is None:&lt;br /&gt;
                raise ValueError(&amp;quot;Для регістру накопичення обов&#039;язковий accumulation_kind&amp;quot;)&lt;br /&gt;
            if self.periodicity is Periodicity.NONPERIODICAL:&lt;br /&gt;
                raise ValueError(&amp;quot;Регістр накопичення не може бути неперіодичним&amp;quot;)&lt;br /&gt;
            if self.accumulation_kind == &amp;quot;Turnover&amp;quot; and self.enable_balance_totals:&lt;br /&gt;
                raise ValueError(&amp;quot;Підсумки залишків несумісні з видом «Обороти»&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if self.kind is RegisterKind.ACCOUNTING and not self.chart_of_accounts:&lt;br /&gt;
            raise ValueError(&amp;quot;Для регістру бухгалтерії обов&#039;язковий chart_of_accounts&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        if self.kind is RegisterKind.CALCULATION:&lt;br /&gt;
            if not self.calculation_types_plan:&lt;br /&gt;
                raise ValueError(&amp;quot;Для регістру розрахунку обов&#039;язковий calculation_types_plan&amp;quot;)&lt;br /&gt;
            if not any(f.base_dimension for f in self.dimensions) and self.base_period != &amp;quot;None&amp;quot;:&lt;br /&gt;
                raise ValueError(&amp;quot;Задано base_period, але жодне вимірювання не позначене base_dimension&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # ресурс має бути підсумовуваним (антипатерн А-7)&lt;br /&gt;
        if self.kind is not RegisterKind.INFORMATION:&lt;br /&gt;
            for r in self.resources:&lt;br /&gt;
                if not _is_numeric(r.type):&lt;br /&gt;
                    raise ValueError(f&amp;quot;Ресурс «{r.name}»: тип {r.type} не підсумовується (А-7). &amp;quot;&lt;br /&gt;
                                     f&amp;quot;Використайте роль Attribute або Dimension&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # обмеження розділу 6.6&lt;br /&gt;
        if len(self.dimensions) &amp;gt; 20:&lt;br /&gt;
            raise ValueError(f&amp;quot;Вимірювань {len(self.dimensions)} &amp;gt; 20 (розділ 6.6)&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
        # попередження (ФТ-К-01: warnings, а не помилки)&lt;br /&gt;
        if len(self.dimensions) &amp;gt; 8:&lt;br /&gt;
            warnings.warn(f&amp;quot;«{self.name}»: {len(self.dimensions)} вимірювань — &amp;quot;&lt;br /&gt;
                          f&amp;quot;ризик розростання таблиці підсумків (антипатерн А-5)&amp;quot;)&lt;br /&gt;
        for d in self.dimensions:&lt;br /&gt;
            if d.type == &amp;quot;Дата&amp;quot; and self.kind is RegisterKind.ACCUMULATION:&lt;br /&gt;
                warnings.warn(f&amp;quot;«{self.name}.{d.name}»: Дата як вимірювання РН — антипатерн А-1&amp;quot;)&lt;br /&gt;
        return self&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що це дає безкоштовно:&#039;&#039;&#039; валідацію YAML, JSON Schema для web-конструктора (&amp;lt;code&amp;gt;Register.model_json_schema()&amp;lt;/code&amp;gt;), типізовані об&#039;єкти для генератора DDL, детальні повідомлення про помилки з шляхом до поля.&lt;br /&gt;
&lt;br /&gt;
=== Е.2. Генератор DDL на SQLAlchemy Core (етап Е1) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections.abc import Callable, Sequence&lt;br /&gt;
&lt;br /&gt;
from sqlalchemy import (Boolean, Column, DateTime, Index, Integer, MetaData, Numeric,&lt;br /&gt;
                        PrimaryKeyConstraint, SmallInteger, String, Table, Uuid, text)&lt;br /&gt;
from sqlalchemy.types import TypeEngine&lt;br /&gt;
&lt;br /&gt;
PRIMITIVE: dict[str, Callable[[RegisterField], TypeEngine]] = {&lt;br /&gt;
    &amp;quot;Число&amp;quot;: lambda f: Numeric(f.precision, f.scale),&lt;br /&gt;
    &amp;quot;Рядок&amp;quot;: lambda f: String(f.length),&lt;br /&gt;
    &amp;quot;Дата&amp;quot;: lambda f: DateTime(timezone=False),&lt;br /&gt;
    &amp;quot;Булево&amp;quot;: lambda f: Boolean(),&lt;br /&gt;
    &amp;quot;УНІ&amp;quot;: lambda f: Uuid(),&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def columns_for_field(f: RegisterField, prefix: str) -&amp;gt; list[Column]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Одне поле метаданих -&amp;gt; 1..6 фізичних колонок (розділ 8.2).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if f.is_composite:                                   # складений тип: розділ 8.2.2&lt;br /&gt;
        return [&lt;br /&gt;
            Column(f&amp;quot;{prefix}_t&amp;quot;, SmallInteger, nullable=False),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_b&amp;quot;, Boolean),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_n&amp;quot;, Numeric(38, 10)),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_s&amp;quot;, String(f.max_string_len)),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_d&amp;quot;, DateTime),&lt;br /&gt;
            Column(f&amp;quot;{prefix}_r&amp;quot;, Uuid),&lt;br /&gt;
        ]&lt;br /&gt;
    if f.is_reference:                                   # просте посилання&lt;br /&gt;
        return [Column(f&amp;quot;{prefix}_r&amp;quot;, Uuid, nullable=f.nullable)]&lt;br /&gt;
    base = f.base_type&lt;br /&gt;
    return [Column(prefix, PRIMITIVE[base](f), nullable=f.nullable)]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def build_movement_table(reg: Register, md: MetaData) -&amp;gt; Table:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Метаопис -&amp;gt; Table. Розділи 8.4–8.7.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    cols: list[Column] = []&lt;br /&gt;
&lt;br /&gt;
    if reg.write_mode is WriteMode.SUBORDINATE:&lt;br /&gt;
        cols += [&lt;br /&gt;
            Column(&amp;quot;rec_t&amp;quot;, SmallInteger, nullable=False),&lt;br /&gt;
            Column(&amp;quot;rec_r&amp;quot;, Uuid, nullable=False),&lt;br /&gt;
            Column(&amp;quot;line_no&amp;quot;, Integer, nullable=False),&lt;br /&gt;
            Column(&amp;quot;active&amp;quot;, Boolean, nullable=False, server_default=text(&amp;quot;true&amp;quot;)),&lt;br /&gt;
        ]&lt;br /&gt;
    if reg.periodicity is not Periodicity.NONPERIODICAL:&lt;br /&gt;
        cols.append(Column(&amp;quot;period&amp;quot;, DateTime, nullable=False))&lt;br /&gt;
    if reg.kind is RegisterKind.ACCUMULATION and reg.accumulation_kind == &amp;quot;Balance&amp;quot;:&lt;br /&gt;
        cols.append(Column(&amp;quot;mvt&amp;quot;, SmallInteger, nullable=False))   # ВидРуху&lt;br /&gt;
    if reg.kind is RegisterKind.CALCULATION:&lt;br /&gt;
        cols += [Column(&amp;quot;calc_type_r&amp;quot;, Uuid, nullable=False),&lt;br /&gt;
                 Column(&amp;quot;reversal&amp;quot;, Boolean, nullable=False, server_default=text(&amp;quot;false&amp;quot;))]&lt;br /&gt;
        if reg.action_period:&lt;br /&gt;
            cols += [Column(&amp;quot;act_begin&amp;quot;, DateTime, nullable=False),&lt;br /&gt;
                     Column(&amp;quot;act_end&amp;quot;, DateTime, nullable=False)]&lt;br /&gt;
        if reg.base_period != &amp;quot;None&amp;quot;:&lt;br /&gt;
            cols += [Column(&amp;quot;base_begin&amp;quot;, DateTime), Column(&amp;quot;base_end&amp;quot;, DateTime)]&lt;br /&gt;
&lt;br /&gt;
    for f in reg.all_fields:                              # dimensions + resources + attributes&lt;br /&gt;
        cols += columns_for_field(f, reg.column_prefix(f))   # &#039;d3&#039;, &#039;r1&#039;, &#039;a2&#039;&lt;br /&gt;
&lt;br /&gt;
    t = Table(reg.physical_table, md, *cols,&lt;br /&gt;
              PrimaryKeyConstraint(*primary_key_columns(reg),&lt;br /&gt;
                                   name=f&amp;quot;pk_{reg.physical_table}&amp;quot;),&lt;br /&gt;
              postgresql_partition_by=partition_clause(reg))&lt;br /&gt;
&lt;br /&gt;
    for f in reg.dimensions:&lt;br /&gt;
        if f.index:&lt;br /&gt;
            Index(f&amp;quot;ix_{reg.physical_table}_{reg.column_prefix(f)}&amp;quot;,&lt;br /&gt;
                  *index_columns(reg, f),&lt;br /&gt;
                  postgresql_where=t.c.active if &amp;quot;active&amp;quot; in t.c else None)&lt;br /&gt;
    return t&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;НФВ-16 / НФВ-17 (дві СКБД, ізольований шар діалекту) — у три рядки:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from sqlalchemy.dialects import mssql, postgresql&lt;br /&gt;
from sqlalchemy.schema import CreateTable&lt;br /&gt;
&lt;br /&gt;
md = MetaData()&lt;br /&gt;
t = build_movement_table(reg_goods, md)&lt;br /&gt;
&lt;br /&gt;
print(CreateTable(t).compile(dialect=postgresql.dialect()))   # -&amp;gt; CREATE TABLE rg_a_0012 (...)&lt;br /&gt;
print(CreateTable(t).compile(dialect=mssql.dialect()))        # -&amp;gt; той самий об&#039;єкт у T-SQL&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Це і є головний аргумент на користь Python у цьому проєкті.&#039;&#039;&#039; SQLAlchemy Core — фактично готовий «шар діалекту СКБД» (НФВ-17) і модель схеми, які в C#/Delphi довелося б писати самостійно. Разом із Alembic (Е10) і Pydantic (Е.1) це знімає ~1,5 чол.-міс. з етапів Е1 і Е10 (розділ 14.1).}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Реалізація ФТ-К-02&#039;&#039;&#039; («Показати SQL» у конструкторі) — той самий виклик &amp;lt;code&amp;gt;CreateTable(t).compile(...)&amp;lt;/code&amp;gt;, виведений у UI.&lt;br /&gt;
&lt;br /&gt;
=== Е.3. Інкрементальне оновлення підсумків (етап Е3) ===&lt;br /&gt;
&lt;br /&gt;
Реалізація алгоритму 10.2 з дотриманням АП-1 (один запит на весь набір) і ФТ-34 (детермінований порядок проти дедлоків).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from operator import itemgetter&lt;br /&gt;
from collections.abc import Sequence&lt;br /&gt;
&lt;br /&gt;
from sqlalchemy import Connection, Table&lt;br /&gt;
from sqlalchemy.dialects.postgresql import insert as pg_insert&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def merge_totals(conn: Connection, totals: Table, rows: list[dict],&lt;br /&gt;
                 key: Sequence[str], res: Sequence[str]) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;АП-1 + АП-2: одна операція на весь набір дельт; складання виконує СКБД.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    if not rows:&lt;br /&gt;
        return&lt;br /&gt;
&lt;br /&gt;
    rows.sort(key=itemgetter(*key))          # ФТ-34: детермінований порядок -&amp;gt; без дедлоків&lt;br /&gt;
&lt;br /&gt;
    stmt = pg_insert(totals).values(rows)&lt;br /&gt;
    stmt = stmt.on_conflict_do_update(&lt;br /&gt;
        index_elements=list(key),&lt;br /&gt;
        set_={r: totals.c[r] + stmt.excluded[r] for r in res},   # r1 = t.r1 + EXCLUDED.r1&lt;br /&gt;
    )&lt;br /&gt;
    conn.execute(stmt)                       # 1 round-trip незалежно від len(rows)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Для MS SQL&#039;&#039;&#039; — той самий інтерфейс, інша реалізація (&amp;lt;code&amp;gt;MERGE ... WHEN MATCHED THEN UPDATE&amp;lt;/code&amp;gt;) за діалектним диспетчером. Ізоляція — на рівні функції, прикладний код не знає про діалект.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Чому НЕ ORM:&#039;&#039;&#039; ORM-варіант (&amp;lt;code&amp;gt;session.merge(obj)&amp;lt;/code&amp;gt; у циклі) дав би &amp;lt;code&amp;gt;len(rows)&amp;lt;/code&amp;gt; round-trip&#039;ів — пряме порушення АП-1 і зростання НФВ-04 на два порядки. Саме тому ORM заборонений у розділі 4.3.&lt;br /&gt;
&lt;br /&gt;
=== Е.4. Транслятор віртуальних таблиць (етап Е5) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from functools import lru_cache&lt;br /&gt;
&lt;br /&gt;
from lark import Lark, Transformer&lt;br /&gt;
from sqlalchemy import Select, func, literal, select, union_all&lt;br /&gt;
&lt;br /&gt;
GRAMMAR = r&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    ?query        : &amp;quot;ВИБРАТИ&amp;quot;i select_list &amp;quot;З&amp;quot;i source [where] [group_by] [order_by]&lt;br /&gt;
    source        : virtual_table | plain_table&lt;br /&gt;
    virtual_table : REGISTER_PATH &amp;quot;.&amp;quot; VT_NAME &amp;quot;(&amp;quot; [vt_args] &amp;quot;)&amp;quot; [&amp;quot;ЯК&amp;quot;i alias]&lt;br /&gt;
    VT_NAME       : &amp;quot;Залишки&amp;quot;i | &amp;quot;Обороти&amp;quot;i | &amp;quot;ЗалишкиІОбороти&amp;quot;i&lt;br /&gt;
                  | &amp;quot;ЗрізОстанніх&amp;quot;i | &amp;quot;ЗрізПерших&amp;quot;i | &amp;quot;ОборотиДтКт&amp;quot;i&lt;br /&gt;
                  | &amp;quot;ДаніГрафіка&amp;quot;i | &amp;quot;ФактичнийПеріодДії&amp;quot;i | &amp;quot;БазаРозрахунку&amp;quot;i&lt;br /&gt;
    vt_args       : (expr | )  (&amp;quot;,&amp;quot; (expr | ))*        // позиційні, можуть бути порожні&lt;br /&gt;
    ...&lt;br /&gt;
&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class QueryCompiler:&lt;br /&gt;
    def __init__(self, schema: SchemaRegistry) -&amp;gt; None:&lt;br /&gt;
        self._parser = Lark(GRAMMAR, parser=&amp;quot;lalr&amp;quot;, start=&amp;quot;query&amp;quot;)&lt;br /&gt;
        self._schema = schema&lt;br /&gt;
&lt;br /&gt;
    @lru_cache(maxsize=2048)                     # АП-4: кеш скомпільованих запитів&lt;br /&gt;
    def compile(self, text: str, param_signature: tuple[str, ...]) -&amp;gt; Select:&lt;br /&gt;
        tree = self._parser.parse(text)&lt;br /&gt;
        return _ToSQLAlchemy(self._schema).transform(tree)&lt;br /&gt;
&lt;br /&gt;
    def balances(self, reg: Register, period, conditions: list) -&amp;gt; Select:&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Реалізація алгоритму 10.3 в термінах SQLAlchemy Core.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        tb = self._schema.totals_balance(reg)&lt;br /&gt;
        mv = self._schema.movements(reg)&lt;br /&gt;
        dims = [tb.c[c] for c in self._schema.dimension_columns(reg)]&lt;br /&gt;
&lt;br /&gt;
        boundary = (select(func.coalesce(func.max(tb.c.period), MIN_PERIOD))&lt;br /&gt;
                    .where(tb.c.period &amp;lt;= period)&lt;br /&gt;
                    .scalar_subquery())&lt;br /&gt;
&lt;br /&gt;
        base = (select(*dims, *[func.sum(tb.c[r]).label(r) for r in reg.resource_columns])&lt;br /&gt;
                .where(tb.c.period == boundary, *conditions)      # ФТ-13: push-down&lt;br /&gt;
                .group_by(*dims))&lt;br /&gt;
&lt;br /&gt;
        signed = lambda c: case((mv.c.mvt == 0, mv.c[c]), else_=-mv.c[c])&lt;br /&gt;
        tail = (select(*[mv.c[d.name] for d in dims],&lt;br /&gt;
                       *[func.sum(signed(r)).label(r) for r in reg.resource_columns])&lt;br /&gt;
                .where(mv.c.active, mv.c.period &amp;gt; boundary, mv.c.period &amp;lt;= period, *conditions)&lt;br /&gt;
                .group_by(*[mv.c[d.name] for d in dims]))&lt;br /&gt;
&lt;br /&gt;
        u = union_all(base, tail).subquery()&lt;br /&gt;
        return (select(*[u.c[d.name] for d in dims],&lt;br /&gt;
                       *[func.sum(u.c[r]).label(f&amp;quot;{r}Залишок&amp;quot;) for r in reg.resource_columns])&lt;br /&gt;
                .group_by(*[u.c[d.name] for d in dims])&lt;br /&gt;
                .having(or_(*[func.sum(u.c[r]) != 0 for r in reg.resource_columns])))&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ризик Р1 (немає мови запитів) на Python пом&#039;якшується:&#039;&#039;&#039; навіть якщо повноцінна мова запитів не буде реалізована в Е5, &amp;lt;code&amp;gt;QueryCompiler.balances()&amp;lt;/code&amp;gt; залишається придатним як програмний API — прикладний код викликає його напряму й отримує &amp;lt;code&amp;gt;Select&amp;lt;/code&amp;gt;, який можна далі з&#039;єднувати засобами SQLAlchemy Core. Це &#039;&#039;&#039;план «Б»&#039;&#039;&#039; для Р1, недоступний у мовах без подібної бібліотеки.&lt;br /&gt;
&lt;br /&gt;
=== Е.5. Витіснення: гарячий шлях за інтерфейсом (етапи Е7, Е11) ===&lt;br /&gt;
&lt;br /&gt;
Реалізація принципу АП-3 на найризикованішому вузлі (Р5 + Р10).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from collections import defaultdict&lt;br /&gt;
from collections.abc import Callable, Sequence&lt;br /&gt;
from datetime import date, timedelta&lt;br /&gt;
from typing import Protocol&lt;br /&gt;
from uuid import UUID&lt;br /&gt;
&lt;br /&gt;
Interval = tuple[date, date]&lt;br /&gt;
ONE_DAY = timedelta(days=1)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class DisplacementEngine(Protocol):&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;АП-3. Бюджет (АП-4): &amp;lt;= 3 c на 10 тис. ключів × ~10 записів.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def compute(self,&lt;br /&gt;
                records: Sequence[CalcRecord],&lt;br /&gt;
                displaces: Callable[[UUID, UUID], bool]) -&amp;gt; dict[RecordKey, list[Interval]]:&lt;br /&gt;
        &amp;quot;&amp;quot;&amp;quot;Повертає фактичні періоди дії для кожного запису (розділ 10.4).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
        ...&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
def subtract(intervals: list[Interval], cut: Interval) -&amp;gt; list[Interval]:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Різниця множин інтервалів. Найгарячіша функція платформи.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    out: list[Interval] = []&lt;br /&gt;
    cb, ce = cut&lt;br /&gt;
    for b, e in intervals:&lt;br /&gt;
        if ce &amp;lt; b or cb &amp;gt; e:                 # не перетинаються&lt;br /&gt;
            out.append((b, e))&lt;br /&gt;
            continue&lt;br /&gt;
        if b &amp;lt; cb:&lt;br /&gt;
            out.append((b, cb - ONE_DAY))    # «хвіст» зліва&lt;br /&gt;
        if e &amp;gt; ce:&lt;br /&gt;
            out.append((ce + ONE_DAY, e))    # «хвіст» справа&lt;br /&gt;
    return out&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class PyDisplacementEngine:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Еталонна реалізація. Заміна на Cython/Rust не змінює виклик (АП-3).&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def compute(self, records, displaces):&lt;br /&gt;
        by_key: dict[DimKey, list[CalcRecord]] = defaultdict(list)&lt;br /&gt;
        for r in records:&lt;br /&gt;
            if r.active:&lt;br /&gt;
                by_key[r.dim_key].append(r)&lt;br /&gt;
&lt;br /&gt;
        result: dict[RecordKey, list[Interval]] = {}&lt;br /&gt;
        for Z in by_key.values():&lt;br /&gt;
            if len(Z) &amp;gt; 500:                 # розділ 10.4: перехід на sweep-line&lt;br /&gt;
                result |= SweepLineEngine().compute(Z, displaces)&lt;br /&gt;
                continue&lt;br /&gt;
            Z.sort(key=lambda r: (r.priority, r.period, r.line_no))&lt;br /&gt;
            for z in Z:&lt;br /&gt;
                intervals = [(z.act_begin, z.act_end)]&lt;br /&gt;
                for w in Z:&lt;br /&gt;
                    if w is z or not displaces(w.calc_type, z.calc_type):&lt;br /&gt;
                        continue&lt;br /&gt;
                    if not _registration_periods_intersect(w, z):&lt;br /&gt;
                        continue&lt;br /&gt;
                    intervals = subtract(intervals, (w.act_begin, w.act_end))&lt;br /&gt;
                    if not intervals:&lt;br /&gt;
                        break                # повністю витіснений&lt;br /&gt;
                result[z.key] = intervals&lt;br /&gt;
        return result&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Property-based тести (мітигація Р5 — найпомилковішого вузла):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
from hypothesis import given&lt;br /&gt;
from hypothesis import strategies as st&lt;br /&gt;
&lt;br /&gt;
dates = st.dates(min_value=date(2020, 1, 1), max_value=date(2030, 12, 31))&lt;br /&gt;
intervals = st.lists(st.tuples(dates, dates).map(lambda t: tuple(sorted(t))), max_size=20)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
@given(ivs=intervals, cut=st.tuples(dates, dates).map(lambda t: tuple(sorted(t))))&lt;br /&gt;
def test_subtract_invariants(ivs: list[Interval], cut: Interval) -&amp;gt; None:&lt;br /&gt;
    out = subtract(ivs, cut)&lt;br /&gt;
    assert all(b &amp;lt;= e for b, e in out), &amp;quot;некоректні межі&amp;quot;&lt;br /&gt;
    assert not any(_overlaps(i, cut) for i in out), &amp;quot;витіснений інтервал залишився&amp;quot;&lt;br /&gt;
    # збереження міри: те, що прибрали, дорівнює перетину з cut&lt;br /&gt;
    assert _measure(out) + _measure(_intersect_all(ivs, cut)) == _measure(ivs)&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Бенчмарк як блокер приймання (АП-4):&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
@pytest.mark.benchmark(group=&amp;quot;displacement&amp;quot;)&lt;br /&gt;
def test_displacement_budget(benchmark, records_10k_keys) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Вводиться в CI з етапу Е7. Перевищення бюджету -&amp;gt; червоний білд.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    benchmark(PyDisplacementEngine().compute, records_10k_keys, displaces)&lt;br /&gt;
    assert benchmark.stats.stats.mean &amp;lt; 3.0, (&lt;br /&gt;
        f&amp;quot;Порушено бюджет АП-4: {benchmark.stats.stats.mean:.2f} c &amp;gt; 3.0 c. &amp;quot;&lt;br /&gt;
        f&amp;quot;Розгляньте sweep-line, Cython або перенесення у SQL (daterange + GiST).&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Е.6. Генерація &amp;lt;code&amp;gt;.pyi&amp;lt;/code&amp;gt;-стабів (ФТ-К-07, етап Е1) ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проблема:&#039;&#039;&#039; поля регістру доступні динамічно (&amp;lt;code&amp;gt;rs.new(Номенклатура=…)&amp;lt;/code&amp;gt;), тому &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt; не бачить одруків і помилок типів — це і є ризик Р11.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Рішення:&#039;&#039;&#039; конструктор генерує стаби з метаопису при кожній зміні конфігурації.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# k2/generated/registers/ТовариНаСкладах.pyi   -- АВТОЗГЕНЕРОВАНО. Не редагувати.&lt;br /&gt;
from datetime import datetime&lt;br /&gt;
from decimal import Decimal&lt;br /&gt;
&lt;br /&gt;
from k2.catalogs import Номенклатура, Склади, ХарактеристикиНоменклатури&lt;br /&gt;
from k2.documents import ПрихіднаНакладна, ВведенняЗалишків&lt;br /&gt;
from k2.registers import AccumulationMovementType, Record, RecordSet&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ТовариНаСкладахRecord(Record):&lt;br /&gt;
    Період: datetime&lt;br /&gt;
    ВидРуху: AccumulationMovementType&lt;br /&gt;
    Номенклатура: Номенклатура&lt;br /&gt;
    Склад: Склади&lt;br /&gt;
    Характеристика: ХарактеристикиНоменклатури | None&lt;br /&gt;
    Партія: ПрихіднаНакладна | ВведенняЗалишків | None      # складений тип&lt;br /&gt;
    Кількість: Decimal&lt;br /&gt;
    Сума: Decimal&lt;br /&gt;
    Коментар: str&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class ТовариНаСкладахRecordSet(RecordSet[ТовариНаСкладахRecord]):&lt;br /&gt;
    def new(self, *, Період: datetime, ВидРуху: AccumulationMovementType,&lt;br /&gt;
            Номенклатура: Номенклатура, Склад: Склади,&lt;br /&gt;
            Характеристика: ХарактеристикиНоменклатури | None = None,&lt;br /&gt;
            Партія: ПрихіднаНакладна | ВведенняЗалишків | None = None,&lt;br /&gt;
            Кількість: Decimal = ..., Сума: Decimal = ...,&lt;br /&gt;
            Коментар: str = ...) -&amp;gt; ТовариНаСкладахRecord: ...&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що це ловить у CI ще до запуску:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Помилка прикладного коду !! Без стабів !! Зі стабами&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rs.new(Номенклатур=x)&amp;lt;/code&amp;gt; — одрук у назві поля || Виняток у рантаймі при проведенні на продуктиві || &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;: unexpected keyword argument&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;m.Кількість = &amp;quot;багато&amp;quot;&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;InvalidOperation&amp;lt;/code&amp;gt; при записі в БД || &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;: incompatible type &amp;lt;code&amp;gt;str&amp;lt;/code&amp;gt;, expected &amp;lt;code&amp;gt;Decimal&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;m.Склад = номенклатура&amp;lt;/code&amp;gt; — переплутані посилання || FK-помилка або, гірше, тихо неправильні дані || &amp;lt;code&amp;gt;mypy&amp;lt;/code&amp;gt;: incompatible type&lt;br /&gt;
|-&lt;br /&gt;
| Видалили вимірювання з метаданих, код лишився || Виняток при проведенні || Червоний білд одразу після зміни конфігурації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Автодоповнення в IDE&#039;&#039;&#039; — приємний побічний ефект, який частково компенсує відсутність повноцінного конфігуратора рівня 1С на ранніх етапах.&lt;br /&gt;
&lt;br /&gt;
=== Е.7. Автоматичний детектор порушень АП-1 (етап Е3, CI) ===&lt;br /&gt;
&lt;br /&gt;
Принцип АП-1 марний без механічної перевірки — розробник порушить його ненавмисно.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
# tests/architecture/test_ap1_no_row_by_row.py&lt;br /&gt;
&lt;br /&gt;
@pytest.mark.parametrize(&amp;quot;scenario&amp;quot;, POSTING_SCENARIOS)&lt;br /&gt;
def test_roundtrips_do_not_scale_with_rows(db_counter, scenario) -&amp;gt; None:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;АП-1: кількість звернень до СКБД НЕ залежить від кількості рядків документа.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
    with db_counter() as c10:&lt;br /&gt;
        scenario.build(rows=10).post()&lt;br /&gt;
    with db_counter() as c100:&lt;br /&gt;
        scenario.build(rows=100).post()&lt;br /&gt;
&lt;br /&gt;
    assert c100.roundtrips &amp;lt;= c10.roundtrips + 2, (&lt;br /&gt;
        f&amp;quot;{scenario.name}: звернень до БД зросло {c10.roundtrips} -&amp;gt; {c100.roundtrips} &amp;quot;&lt;br /&gt;
        f&amp;quot;при зростанні рядків у 10 разів. Порушення АП-1 — див. розділ 4.4.&amp;quot;&lt;br /&gt;
    )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
class RowByRowGuard:&lt;br /&gt;
    &amp;quot;&amp;quot;&amp;quot;Runtime-запобіжник для dev/staging: виняток при &amp;gt;N однакових запитів у транзакції.&amp;quot;&amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    def __init__(self, threshold: int = 20) -&amp;gt; None:&lt;br /&gt;
        self._counts: Counter[str] = Counter()&lt;br /&gt;
        self._threshold = threshold&lt;br /&gt;
&lt;br /&gt;
    def before_execute(self, conn, clauseelement, *args) -&amp;gt; None:&lt;br /&gt;
        fingerprint = _statement_fingerprint(clauseelement)   # SQL без літералів&lt;br /&gt;
        self._counts[fingerprint] += 1&lt;br /&gt;
        if self._counts[fingerprint] == self._threshold:&lt;br /&gt;
            raise ArchitectureViolation(&lt;br /&gt;
                f&amp;quot;Один і той самий запит виконано {self._threshold} разів у межах транзакції.\n&amp;quot;&lt;br /&gt;
                f&amp;quot;Ймовірне порушення АП-1 («жодного рядка за раз»).\n{fingerprint}&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це — найдешевша страховка проєкту.&#039;&#039;&#039; Порушення АП-1 не видно на тестових даних (10 рядків — усе швидко) і катастрофічне на продуктиві (100 рядків × 5 регістрів). Детектор вводиться &#039;&#039;&#039;з етапу Е3&#039;&#039;&#039;, а не за результатами НТ-03.&lt;br /&gt;
&lt;br /&gt;
=== Е.8. Структура репозиторію ядра ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
k2-registers/&lt;br /&gt;
├── src/k2/&lt;br /&gt;
│   ├── metadata/          # Е.1: Pydantic-моделі, репозиторій, валідація&lt;br /&gt;
│   │   ├── models.py      #   Register, RegisterField, ...&lt;br /&gt;
│   │   ├── repository.py  #   md_* таблиці&lt;br /&gt;
│   │   └── validators.py  #   ФТ-К-01, антипатерни Д.10&lt;br /&gt;
│   ├── schema/            # Е.2: генерація DDL&lt;br /&gt;
│   │   ├── builder.py     #   метаопис -&amp;gt; SQLAlchemy Table&lt;br /&gt;
│   │   ├── dialects/      #   НФВ-17: postgres.py, mssql.py&lt;br /&gt;
│   │   └── restructure.py #   Е10: Alembic-інтеграція&lt;br /&gt;
│   ├── runtime/           # набори записів, проведення, блокування&lt;br /&gt;
│   │   ├── recordset.py&lt;br /&gt;
│   │   ├── posting.py     #   розділ 7.1&lt;br /&gt;
│   │   ├── totals.py      #   Е.3: merge_totals&lt;br /&gt;
│   │   └── locks.py       #   ФТ-32&lt;br /&gt;
│   ├── query/             # Е.4: lark-граматика + компілятор&lt;br /&gt;
│   │   ├── grammar.lark&lt;br /&gt;
│   │   ├── compiler.py&lt;br /&gt;
│   │   └── virtual/       #   balances.py, turnovers.py, slices.py, calc_base.py&lt;br /&gt;
│   ├── calculation/       # Е.5: витіснення (гарячий шлях)&lt;br /&gt;
│   │   ├── protocols.py   #   DisplacementEngine&lt;br /&gt;
│   │   ├── engine_py.py   #   еталонна реалізація&lt;br /&gt;
│   │   └── engine_native/ #   [резерв] Cython/Rust — тільки за результатом бенчмарку&lt;br /&gt;
│   ├── codegen/           # Е.6: генерація .pyi-стабів&lt;br /&gt;
│   └── diagnostics/       # Е.7: RowByRowGuard, перевірка цілісності (ФТ-41)&lt;br /&gt;
├── tests/&lt;br /&gt;
│   ├── unit/&lt;br /&gt;
│   ├── property/          # hypothesis: інтервальна арифметика (Р5)&lt;br /&gt;
│   ├── architecture/      # Е.7: детектор АП-1&lt;br /&gt;
│   ├── benchmarks/        # АП-4: бюджети гарячих шляхів (gate у CI)&lt;br /&gt;
│   └── integration/       # testcontainers: PostgreSQL + MS SQL (Р7)&lt;br /&gt;
└── pyproject.toml         # uv, ruff, mypy --strict&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;Кінець документа. Версія 1.2. Підлягає узгодженню з архітектором платформи K2 ERP до затвердження.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2759</id>
		<title>Регістри в K2 ERP</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2759"/>
		<updated>2026-07-17T19:04:46Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ТЗ. Підсистема регістрів K2 ERP}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= 1. Паспорт документа =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Атрибут !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Назва || Технічне завдання на розробку підсистеми «Регістри» платформи K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| Шифр || K2-ERP-TZ-REG-001&lt;br /&gt;
|-&lt;br /&gt;
| Версія || 1.1 (чернетка на узгодження; +Додаток Д «Каталог прикладів»)&lt;br /&gt;
|-&lt;br /&gt;
| Статус || На розгляді&lt;br /&gt;
|-&lt;br /&gt;
| Замовник || &#039;&#039;[підрозділ-замовник]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Виконавець || &#039;&#039;[команда платформи K2 ERP]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Тип документа || Технічне завдання (ГОСТ 34.602 адаптовано)&lt;br /&gt;
|-&lt;br /&gt;
| Аналог / прототип || Механізм регістрів платформи «1С:Підприємство 8.3»&lt;br /&gt;
|-&lt;br /&gt;
| Мова розробки || &#039;&#039;[уточнити: C#/.NET | Delphi | Java]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| СКБД || PostgreSQL 14+ (основна), MS SQL Server 2019+ (додаткова)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 1.1. Необхідні розширення MediaWiki для перегляду ==&lt;br /&gt;
&lt;br /&gt;
Документ використовує теги діаграм. Для коректного рендерингу потрібні:&lt;br /&gt;
* &amp;lt;code&amp;gt;Extension:GraphViz&amp;lt;/code&amp;gt; — тег &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graphviz&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Extension:PlantUML&amp;lt;/code&amp;gt; — тег &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;plantuml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Extension:SyntaxHighlight_GeSHi&amp;lt;/code&amp;gt; — тег &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Також використовується шаблон &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Note|текст}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Якщо його немає у вашій вікі — створіть сторінку &amp;lt;code&amp;gt;Template:Note&amp;lt;/code&amp;gt; з вмістом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #36c; background:#eaf3ff; padding:8px 12px; margin:8px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ⓘ&#039;&#039;&#039; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Якщо розширення недоступні — блоки діаграм відображатимуться як текстовий вихідний код; дублюючі ASCII-схеми наведені в тілі документа.&lt;br /&gt;
&lt;br /&gt;
= 2. Терміни, визначення та скорочення =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Термін !! Визначення&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Регістр&#039;&#039;&#039; || Об&#039;єкт метаданих, призначений для зберігання та накопичення структурованої облікової інформації у вигляді записів фіксованої структури, з механізмами агрегації, зрізів і транзакційного зв&#039;язку з документами-реєстраторами.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РВ&#039;&#039;&#039; || Регістр відомостей (аналог «Регистр сведений»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН&#039;&#039;&#039; || Регістр накопичення (аналог «Регистр накопления»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РБ&#039;&#039;&#039; || Регістр бухгалтерії (аналог «Регистр бухгалтерии»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РР&#039;&#039;&#039; || Регістр розрахунку (аналог «Регистр расчёта»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Вимірювання&#039;&#039;&#039; (Dimension) || Поле регістру, що визначає розріз аналітики; входить у ключ запису/підсумку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ресурс&#039;&#039;&#039; (Resource) || Поле регістру, значення якого підсумовується (для РН/РБ/РР) або зберігається як значення (для РВ).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реквізит&#039;&#039;&#039; (Attribute) || Довідкове поле запису, що не бере участі в ключі та не агрегується.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реєстратор&#039;&#039;&#039; (Recorder) || Документ, який породив набір записів регістру та володіє ним.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рухи&#039;&#039;&#039; (Movements) || Записи регістру, підпорядковані конкретному реєстратору.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Набір записів&#039;&#039;&#039; (RecordSet) || Прикладний об&#039;єкт для читання/запису групи записів регістру за заданим відбором.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Підсумки&#039;&#039;&#039; (Totals) || Попередньо розраховані агрегати (залишки/обороти), що зберігаються в окремих таблицях.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ТА&#039;&#039;&#039; || Точка актуальності підсумків — момент часу, до якого підсумки розраховані.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Зріз останніх&#039;&#039;&#039; (SliceLast) || Вибірка останніх за періодом записів РВ у розрізі кожної комбінації вимірювань.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Субконто&#039;&#039;&#039; (ExtDimension, ED) || Додатковий розріз аналітики бухгалтерського рахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ПВР&#039;&#039;&#039; || План видів розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витіснення&#039;&#039;&#039; || Механізм РР: запис із вищим пріоритетом скорочує фактичний період дії запису з нижчим.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (Recalculation) || Підпорядкований РР об&#039;єкт, що реєструє записи, які потребують повторного розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Віртуальна таблиця&#039;&#039;&#039; || Обчислювана таблиця в мові запитів, що не має фізичного відповідника (Залишки, Обороти, ЗрізОстанніх тощо).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 3. Призначення, цілі та підстава розробки =&lt;br /&gt;
&lt;br /&gt;
== 3.1. Підстава ==&lt;br /&gt;
Поточна модель K2 ERP не має уніфікованого декларативного механізму накопичувального обліку. Регістроподібні структури реалізуються &#039;&#039;ad hoc&#039;&#039; — окремими таблицями та процедурами під кожну прикладну задачу, що спричиняє:&lt;br /&gt;
* дублювання коду розрахунку залишків та оборотів;&lt;br /&gt;
* відсутність гарантованої узгодженості «документ ↔ рухи»;&lt;br /&gt;
* деградацію продуктивності на великих обсягах (повний перерахунок з початку обліку);&lt;br /&gt;
* високу вартість введення нової аналітики (зміна схеми БД + правка десятків процедур).&lt;br /&gt;
&lt;br /&gt;
== 3.2. Мета ==&lt;br /&gt;
Створити в K2 ERP підсистему &#039;&#039;&#039;декларативно описуваних регістрів&#039;&#039;&#039; чотирьох типів, функціонально еквівалентну механізму регістрів «1С:Підприємство 8.3», з автоматичною генерацією схеми БД, підтримкою підсумків, віртуальних таблиць у мові запитів і транзакційного проведення документів.&lt;br /&gt;
&lt;br /&gt;
== 3.3. Цілі проєкту (вимірювані) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Ціль !! Критерій досягнення&lt;br /&gt;
|-&lt;br /&gt;
| Ц1 || Декларативне визначення регістру || Новий регістр з 5 вимірюваннями та 3 ресурсами створюється в конструкторі без написання коду; DDL генерується автоматично.&lt;br /&gt;
|-&lt;br /&gt;
| Ц2 || Автоматична агрегація || Залишки/обороти доступні запитом без ручних процедур перерахунку.&lt;br /&gt;
|-&lt;br /&gt;
| Ц3 || Продуктивність || Отримання залишків на дату за таблицею 1 млрд рухів — ≤ 200 мс (P95) на еталонному стенді.&lt;br /&gt;
|-&lt;br /&gt;
| Ц4 || Цілісність || Неможливість існування рухів без активного реєстратора (100 % сценаріїв у тесті цілісності).&lt;br /&gt;
|-&lt;br /&gt;
| Ц5 || Міграція || Перенесення ≥ 90 % наявних «регістроподібних» структур K2 на новий механізм без втрати даних.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3.4. Що НЕ входить до обсягу (Out of scope) ==&lt;br /&gt;
* Механізм розподілених інформаційних баз / реплікації рухів (окреме ТЗ).&lt;br /&gt;
* Візуальний конструктор звітів поверх регістрів (окреме ТЗ, залежність).&lt;br /&gt;
* OLAP-куби та зовнішні аналітичні вітрини.&lt;br /&gt;
* Автоматичне перенесення прикладного коду замовника (тільки дані + мапінг).&lt;br /&gt;
&lt;br /&gt;
= 4. Припущення та обмеження щодо платформи K2 ERP =&lt;br /&gt;
&lt;br /&gt;
{{Note|Розділ фіксує припущення, які &#039;&#039;&#039;обов&#039;язково&#039;&#039;&#039; підлягають верифікації з архітектором платформи до затвердження ТЗ. Місця, що потребують уточнення, позначені як &#039;&#039;[уточнити]&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Припущення !! Наслідок для ТЗ&lt;br /&gt;
|-&lt;br /&gt;
| П1 || K2 ERP має підсистему метаданих із власним репозиторієм об&#039;єктів (документи, довідники, перерахування) і механізмом версіонування конфігурації. || Регістр вбудовується як новий &#039;&#039;&#039;рід&#039;&#039;&#039; об&#039;єкта метаданих у наявний репозиторій (розділ 6).&lt;br /&gt;
|-&lt;br /&gt;
| П2 || Об&#039;єкти-документи мають унікальний ідентифікатор посилання (GUID/UUID) та проведення як окрему операцію. || Реєстратор адресується парою «код типу + UUID» (розділ 8.2).&lt;br /&gt;
|-&lt;br /&gt;
| П3 || Платформа має власну мову запитів або транслятор у SQL. || Віртуальні таблиці реалізуються на рівні транслятора (розділ 7.6). Якщо мови запитів немає — потрібен окремий етап Е0 (розділ 14).&lt;br /&gt;
|-&lt;br /&gt;
| П4 || Цільова СКБД підтримує &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;INSERT ... ON CONFLICT&amp;lt;/code&amp;gt;, віконні функції, часткові та покривні індекси. || Алгоритми підсумків (розділ 10) використовують ці можливості.&lt;br /&gt;
|-&lt;br /&gt;
| П5 || Прикладний код виконується на сервері застосунків із керованими транзакціями. || Проведення документа — одна транзакція БД (розділ 7.1).&lt;br /&gt;
|-&lt;br /&gt;
| П6 || Максимальна довжина ідентифікатора об&#039;єкта БД — 63 символи (PostgreSQL). || Фізичні імена таблиць будуються за сурогатним числовим кодом, а не за іменем регістру (розділ 8.1).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обмеження:&#039;&#039;&#039;&lt;br /&gt;
* О1. Зміна складу вимірювань/ресурсів існуючого регістру — операція реструктуризації з простоєм; онлайн-міграція не гарантується для таблиць &amp;gt; 100 млн записів.&lt;br /&gt;
* О2. Підсистема не гарантує коректність прикладної логіки проведення — лише цілісність механізму.&lt;br /&gt;
* О3. Мінімальна дискретність періоду — 1 секунда (тип &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt;) &#039;&#039;[уточнити: чи потрібна мілісекундна]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= 5. Класифікація регістрів =&lt;br /&gt;
&lt;br /&gt;
== 5.1. Дерево типів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Registers {&lt;br /&gt;
  rankdir=TB;&lt;br /&gt;
  bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fillcolor=&amp;quot;#f5f5f5&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=10];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  R [label=&amp;quot;РЕГІСТР\n(абстрактний об&#039;єкт метаданих)&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI [label=&amp;quot;Регістр відомостей\n(РВ / Information)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA [label=&amp;quot;Регістр накопичення\n(РН / Accumulation)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RB [label=&amp;quot;Регістр бухгалтерії\n(РБ / Accounting)&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RC [label=&amp;quot;Регістр розрахунку\n(РР / Calculation)&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  R -&amp;gt; RI; R -&amp;gt; RA; R -&amp;gt; RB; R -&amp;gt; RC;&lt;br /&gt;
&lt;br /&gt;
  RI_np [label=&amp;quot;Неперіодичний&amp;quot;];&lt;br /&gt;
  RI_p  [label=&amp;quot;Періодичний&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_np; RI -&amp;gt; RI_p;&lt;br /&gt;
&lt;br /&gt;
  RI_i [label=&amp;quot;Незалежний\n(режим запису)&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI_s [label=&amp;quot;Підпорядкований\nреєстратору&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_i [style=dashed]; RI -&amp;gt; RI_s [style=dashed];&lt;br /&gt;
&lt;br /&gt;
  RA_b [label=&amp;quot;Вид: Залишки\n(Balance)&amp;quot;];&lt;br /&gt;
  RA_t [label=&amp;quot;Вид: Обороти\n(Turnover)&amp;quot;];&lt;br /&gt;
  RA -&amp;gt; RA_b; RA -&amp;gt; RA_t;&lt;br /&gt;
&lt;br /&gt;
  RB_c [label=&amp;quot;З кореспонденцією\n(подвійний запис)&amp;quot;];&lt;br /&gt;
  RB_n [label=&amp;quot;Без кореспонденції\n(уніграфічний)&amp;quot;];&lt;br /&gt;
  RB -&amp;gt; RB_c; RB -&amp;gt; RB_n;&lt;br /&gt;
&lt;br /&gt;
  RC_a [label=&amp;quot;З періодом дії\n(+ витіснення)&amp;quot;];&lt;br /&gt;
  RC_b [label=&amp;quot;З базовим періодом\n(+ база розрахунку)&amp;quot;];&lt;br /&gt;
  RC_g [label=&amp;quot;З графіком часу&amp;quot;];&lt;br /&gt;
  RC -&amp;gt; RC_a; RC -&amp;gt; RC_b; RC -&amp;gt; RC_g;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5.2. Порівняльна матриця типів ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Характеристика !! РВ !! РН (Залишки) !! РН (Обороти) !! РБ !! РР&lt;br /&gt;
|-&lt;br /&gt;
| Ключ запису || Вимірювання (+Період) або Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№&lt;br /&gt;
|-&lt;br /&gt;
| Незалежний запис || &#039;&#039;&#039;Так&#039;&#039;&#039; || Ні || Ні || Ні || Ні&lt;br /&gt;
|-&lt;br /&gt;
| Періодичність || Опційна || Обов&#039;язкова (Період) || Обов&#039;язкова || Обов&#039;язкова || Обов&#039;язкова&lt;br /&gt;
|-&lt;br /&gt;
| Ресурси підсумовуються || Ні || Так (±) || Так (+) || Так (Дт/Кт) || Так&lt;br /&gt;
|-&lt;br /&gt;
| Вид руху (Прихід/Витрата) || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || Дт/Кт || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця залишків || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця оборотів || — || Так (опц.) || &#039;&#039;&#039;Так&#039;&#039;&#039; || Так || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із планом рахунків || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із ПВР || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Період дії / витіснення || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Базовий період || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Графік часу || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Субконто || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерахунки || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Типові приклади || Курси валют, ціни, кадрова історія, графік роботи || Товари на складах, взаєморозрахунки || Продажі, витрати за статтями || Госпрозрахунковий, управлінський, податковий облік || Нарахування ЗП, утримання&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 6. Метамодель: як регістр задається =&lt;br /&gt;
&lt;br /&gt;
== 6.1. Місце в репозиторії метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Конфігурація K2 ERP&lt;br /&gt;
├── Довідники&lt;br /&gt;
├── Документи&lt;br /&gt;
├── Плани рахунків              ← використовується РБ&lt;br /&gt;
├── Плани видів характеристик   ← використовується як тип субконто / вимірювання&lt;br /&gt;
├── Плани видів розрахунку      ← використовується РР&lt;br /&gt;
└── Регістри                    ◄── НОВИЙ РОЗДІЛ&lt;br /&gt;
    ├── Регістри відомостей&lt;br /&gt;
    │   └── КурсиВалют&lt;br /&gt;
    │       ├── Вимірювання      → Валюта&lt;br /&gt;
    │       ├── Ресурси          → Курс, Кратність&lt;br /&gt;
    │       ├── Реквізити        →&lt;br /&gt;
    │       └── Форми            → ФормаСписку, ФормаЗапису&lt;br /&gt;
    ├── Регістри накопичення&lt;br /&gt;
    │   └── ТовариНаСкладах&lt;br /&gt;
    │       ├── Вимірювання      → Номенклатура, Склад, Партія&lt;br /&gt;
    │       ├── Ресурси          → Кількість, Сума&lt;br /&gt;
    │       ├── Реквізити        → Коментар&lt;br /&gt;
    │       └── Реєстратори      → [ПрихіднаНакладна, ВидатковаНакладна, ...]&lt;br /&gt;
    ├── Регістри бухгалтерії&lt;br /&gt;
    │   └── Госпрозрахунковий&lt;br /&gt;
    │       ├── Вимірювання      → Організація, Підрозділ(небаланс.)&lt;br /&gt;
    │       ├── Ресурси          → Сума(баланс.), Кількість(небаланс.), ВалютнаСума&lt;br /&gt;
    │       ├── Реквізити        → Зміст, № журналу&lt;br /&gt;
    │       └── Реєстратори      → [...]&lt;br /&gt;
    └── Регістри розрахунку&lt;br /&gt;
        └── Нарахування&lt;br /&gt;
            ├── Вимірювання      → Співробітник(баз.), Підрозділ&lt;br /&gt;
            ├── Ресурси          → Результат, ВідпрацьованоДнів&lt;br /&gt;
            ├── Реквізити        → Графік&lt;br /&gt;
            ├── Перерахунки      → ПерерахунокЗаБазою&lt;br /&gt;
            └── Реєстратори      → [НарахуванняЗП]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6.2. Загальні властивості будь-якого регістру ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Тип !! Обов&#039;язк. !! Опис / допустимі значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt; || Ідентифікатор || Так || Унікальне в межах роду. Латиниця/кирилиця, ≤ 80 симв., без пробілів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Рядок || Ні || Подання для користувача.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Коментар&amp;lt;/code&amp;gt; || Текст || Ні || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Відомостей&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Накопичення&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Бухгалтерії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Розрахунку&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Незмінна після створення.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Незалежний&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;. Для РН/РБ/РР — примусово &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Неперіодичний&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахСекунди&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахДня&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахМісяця&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахКварталу&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахРоку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратори&amp;lt;/code&amp;gt; || Список посилань на типи документів || Умовно || Обов&#039;язково для РН/РБ/РР та підпорядкованого РВ. Порожній список = регістр непридатний до запису.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БлокуванняДаних&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Автоматичне&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt; (за замовчуванням &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВключатиДоЗвітів&amp;lt;/code&amp;gt; || Булево || Ні || Показувати в універсальному конструкторі звітів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПравоДоступуЗаЗамовчуванням&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Заборонено&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиРLS&amp;lt;/code&amp;gt; || Булево || Ні || Row-level security (розділ 7.9).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Партиціонування&amp;lt;/code&amp;gt; || Структура || Ні || &amp;lt;code&amp;gt;Немає&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодом(RANGE, крок)&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаВимірюванням(HASH, n)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.3. Поля регістру ==&lt;br /&gt;
&lt;br /&gt;
Кожне поле має:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Ідентифікація.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Роль&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Ресурс&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Реквізит&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Тип&amp;lt;/code&amp;gt; || Примітивний (&amp;lt;code&amp;gt;Число(p,s)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Рядок(n)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Булево&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;УНІ&amp;lt;/code&amp;gt;), посилальний (&amp;lt;code&amp;gt;Довідник.X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Документ.Y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перерахування.Z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланРахунків.A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланВидівХарактеристик.B&amp;lt;/code&amp;gt;) або &#039;&#039;&#039;складений&#039;&#039;&#039; (список типів).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Не індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ІндексуватиЗДодаткомВимірювань&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ведуче&amp;lt;/code&amp;gt; (Master) || Тільки для вимірювань. Якщо &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; — записи регістру видаляються разом з об&#039;єктом, на який посилається вимірювання; регістр показується у формі цього об&#039;єкта.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || Брати участь у стандартному відборі форми списку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗаборонитиНезаповненіЗначення&amp;lt;/code&amp;gt; || Валідація на запис.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Специфічні прапорці полів по типах регістрів:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Прапорець !! Застосовний до !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Балансовий&amp;lt;/code&amp;gt; || Ресурс/Вимірювання РБ || Ресурс бере участь у контролі рівності Дт=Кт; має єдине значення на запис (а не пару Дт/Кт). Вимірювання балансове — однакове для Дт і Кт.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Облік&amp;lt;/code&amp;gt; (AccountingFlag) || Ресурс РБ || Посилання на ознаку обліку рахунка з ПР; ресурс заповнюється, лише якщо ознака встановлена.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОблікСубконто&amp;lt;/code&amp;gt; || Ресурс РБ || Посилання на ознаку обліку субконто (напр. кількісний облік у розрізі субконто).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Базове&amp;lt;/code&amp;gt; (BaseDimension) || Вимірювання РР || Використовується для зіставлення записів під час отримання бази розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиПоточніЗначення&amp;lt;/code&amp;gt; || Ресурс/Реквізит РР || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.4. Специфічні властивості за типами ==&lt;br /&gt;
&lt;br /&gt;
=== 6.4.1. Регістр відомостей ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Неперіодичний … ПоПозиціїРеєстратора || Визначає наявність поля &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; і його гранулярність.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Незалежний / ПідпорядкованийРеєстратору || У незалежному ключ = (Період) + Вимірювання.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумки&amp;lt;/code&amp;gt; || — || У РВ підсумків немає; замість них — зрізи.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ключ унікальності:&#039;&#039;&#039;&lt;br /&gt;
* Незалежний неперіодичний: &amp;lt;code&amp;gt;UNIQUE(Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Незалежний періодичний: &amp;lt;code&amp;gt;UNIQUE(Період, Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Підпорядкований: &amp;lt;code&amp;gt;PK(Реєстратор, НомерРядка)&amp;lt;/code&amp;gt;, унікальність за вимірюваннями &#039;&#039;&#039;не&#039;&#039;&#039; контролюється.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.2. Регістр накопичення ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиЗалишків&amp;lt;/code&amp;gt; || Булево (тільки для виду «Залишки»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиОборотів&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодичністьПідсумківОборотів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt; (тільки для виду «Обороти»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || Список визначень агрегатів (тільки для виду «Обороти»), див. 7.4.4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимАгрегатів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 6.4.3. Регістр бухгалтерії ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланРахунків&amp;lt;/code&amp;gt; || Посилання на об&#039;єкт «План рахунків» || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039; Незмінне після створення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Кореспонденція&amp;lt;/code&amp;gt; || Булево || &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; → подвійний запис (поля &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt;); &amp;lt;code&amp;gt;Хиба&amp;lt;/code&amp;gt; → уніграфічний (&amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || Число (успадковується з ПР) || Ліміт платформи: 5 &#039;&#039;[узгодити; 1С — 3 за замовчуванням, до 5]&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пов&#039;язаний об&#039;єкт &#039;&#039;&#039;План рахунків&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* ієрархію рахунків, &amp;lt;code&amp;gt;Код&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Найменування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вид&amp;lt;/code&amp;gt; (Активний/Пасивний/Активно-пасивний);&lt;br /&gt;
* &amp;lt;code&amp;gt;Забалансовий&amp;lt;/code&amp;gt; (булево);&lt;br /&gt;
* &amp;lt;code&amp;gt;Ознаки обліку&amp;lt;/code&amp;gt; (набір булевих реквізитів, напр. «Кількісний», «Валютний»);&lt;br /&gt;
* табличну частину &amp;lt;code&amp;gt;ВидиСубконто&amp;lt;/code&amp;gt; (ВидСубконто → ПВХ, &#039;&#039;Тільки обороти&#039;&#039;, &#039;&#039;Підсумкова сума&#039;&#039;, ознаки обліку субконто);&lt;br /&gt;
* &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.4. Регістр розрахунку ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || Посилання || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Квартал&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Рік&amp;lt;/code&amp;gt; || Період реєстрації.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; || Булево || Вмикає поля &amp;lt;code&amp;gt;ПеріодДіїПочаток/Кінець&amp;lt;/code&amp;gt;, фактичні періоди дії та витіснення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріод&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;БезБазовогоПеріоду&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; || Режим отримання бази.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Графік&amp;lt;/code&amp;gt; || Посилання на РВ || Регістр-графік часу.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗначенняГрафіка&amp;lt;/code&amp;gt; || Ресурс регістру-графіка || Напр. «Значення» (1/0 — робочий день) або «Годин».&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДатаГрафіка&amp;lt;/code&amp;gt; || Вимірювання регістру-графіка типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Перерахунки&amp;lt;/code&amp;gt; || Список підпорядкованих об&#039;єктів «Перерахунок» || Див. 7.5.3.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Об&#039;єкт &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (підпорядкований РР):&lt;br /&gt;
* &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; — список, кожне зіставляється з вимірюванням основного РР (&amp;lt;code&amp;gt;ВимірюванняРегістру&amp;lt;/code&amp;gt;);&lt;br /&gt;
* правило: перерахунок реєструє «об&#039;єкт перерахунку» = (Реєстратор, ВидРозрахунку, Вимірювання…).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* &amp;lt;code&amp;gt;ВикористовуєПеріодДії&amp;lt;/code&amp;gt;;&lt;br /&gt;
* табличні частини &amp;lt;code&amp;gt;БазовіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВитісняючіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВедучіВидиРозрахунку&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;НеЗалежить&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 6.5. Стандартні реквізити (генеруються автоматично) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Реквізит !! РВ !! РН !! РБ !! РР !! Тип&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; || якщо періодичний || + || + || + (період реєстрації) || Дата/час&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Складене посилання (ДокументПосилання)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;НомерРядка&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Число(9,0)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Активність&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || — || тільки «Залишки» || — || — || Перелік {Прихід, Витрата}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt; || — || — || + (з кореспонденцією) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРухуРахунку&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || Перелік {Дебет, Кредит}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; (колекція) || — || — || + || — || Відповідність(ВидСубконто→Значення)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРозрахунку&amp;lt;/code&amp;gt; || — || — || — || + || ПВРПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДіїПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПеріодДіїКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо ПеріодДії) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріодПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;БазовийПеріодКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо БазовийПеріод) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Сторно&amp;lt;/code&amp;gt; || — || — || — || + || Булево&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.6. Кількісні обмеження метамоделі ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Ліміт !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| Кількість вимірювань || 20 || Понад 8 — попередження конструктора (деградація підсумків)&lt;br /&gt;
|-&lt;br /&gt;
| Кількість ресурсів || 20 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реквізитів || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість типів у складеному типі поля || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реєстраторів || Не обмежено ||&lt;br /&gt;
|-&lt;br /&gt;
| Максимум субконто на рахунок || 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| Довжина ключа підсумків || ≤ 900 байт (обмеження індексу MS SQL) || Валідація в конструкторі&lt;br /&gt;
|-&lt;br /&gt;
| Глибина періодичності підсумків || День / Місяць || Тиждень/Квартал — не підтримуються (обчислюються згортанням)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.7. Декларативний опис (DSL) ==&lt;br /&gt;
&lt;br /&gt;
Регістр зберігається в репозиторії у вигляді XML/YAML-маніфесту. Приклад:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр накопичення (вид: Залишки) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: ТовариНаСкладах&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  synonym: &amp;quot;Товари на складах&amp;quot;&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  writeMode: SubordinateToRecorder&lt;br /&gt;
  enableBalanceTotals: true&lt;br /&gt;
  enableTurnoverTotals: true&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура, type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true,  index: true }&lt;br /&gt;
    - { name: Склад,        type: &amp;quot;Довідник.Склади&amp;quot;,       master: true,  index: true }&lt;br /&gt;
    - { name: Партія,       type: [&amp;quot;Документ.ПрихіднаНакладна&amp;quot;, &amp;quot;Документ.ВведенняЗалишків&amp;quot;], index: false }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;ПланВидівХарактеристик.Характеристики&amp;quot;, nullable: true }&lt;br /&gt;
&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість, type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
    - { name: Сума,      type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Коментар, type: &amp;quot;Рядок(200)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ПрихіднаНакладна&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ПереміщенняТоварів&lt;br /&gt;
    - Документ.Інвентаризація&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр відомостей (періодичний, незалежний) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: КурсиВалют&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot;, master: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Курс,     type: &amp;quot;Число(15,4)&amp;quot; }&lt;br /&gt;
    - { name: Кратність, type: &amp;quot;Число(10,0)&amp;quot;, default: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр бухгалтерії ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Госпрозрахунковий&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Госпрозрахунковий&lt;br /&gt;
  correspondence: true&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Підрозділ,   type: &amp;quot;Довідник.Підрозділи&amp;quot;,  balance: false }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,       type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Кількість,  type: &amp;quot;Число(15,3)&amp;quot;, balance: false, accountingFlag: Кількісний }&lt;br /&gt;
    - { name: ВалютнаСума, type: &amp;quot;Число(15,2)&amp;quot;, balance: false, accountingFlag: Валютний }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Зміст, type: &amp;quot;Рядок(255)&amp;quot; }&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot; }&lt;br /&gt;
  recorders: [Документ.БухгалтерськаОперація, Документ.ПрихіднаНакладна]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр розрахунку ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Нарахування&lt;br /&gt;
  kind: Calculation&lt;br /&gt;
  calculationTypesPlan: ПланВидівРозрахунку.ОсновніНарахування&lt;br /&gt;
  periodicity: Month&lt;br /&gt;
  actionPeriod: true&lt;br /&gt;
  basePeriod: ByActionPeriod&lt;br /&gt;
  schedule:&lt;br /&gt;
    register: РегістрВідомостей.ГрафікРоботи&lt;br /&gt;
    valueResource: Значення&lt;br /&gt;
    dateDimension: ДатаГрафіка&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, baseDimension: true, master: true }&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Результат,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: ВідпрацьованоДнів, type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
    - { name: НормаДнів,        type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
  recalculations:&lt;br /&gt;
    - name: ПерерахунокЗаБазою&lt;br /&gt;
      dimensions:&lt;br /&gt;
        - { name: Співробітник, registerDimension: Співробітник }&lt;br /&gt;
  recorders: [Документ.НарахуванняЗарплати]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Розширений каталог із 17 прикладів регістрів усіх типів і підвидів — з деклараціями, даними у фізичних таблицях, запитами, наскрізними сценаріями та антипатернами — див. &#039;&#039;&#039;Додаток Д&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
== 6.8. UI конструктора метаданих ==&lt;br /&gt;
&lt;br /&gt;
=== 6.8.1. Загальний макет ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Конфігуратор K2 ERP ─────────────────────────────────────────────────────────┐&lt;br /&gt;
│ Файл  Правка  Конфігурація  Адміністрування  Сервіс  Довідка                  │&lt;br /&gt;
├──────────────────────┬────────────────────────────────────────────────────────┤&lt;br /&gt;
│ Дерево конфігурації  │  Регістр накопичення: ТовариНаСкладах                  │&lt;br /&gt;
│                      │  ┌──────┬─────────┬──────────┬──────────┬───────────┐  │&lt;br /&gt;
│ ▾ Регістри           │  │Основ.│Дані     │Реєстратор│Форми     │Права      │  │&lt;br /&gt;
│   ▸ відомостей       │  └──────┴─────────┴──────────┴──────────┴───────────┘  │&lt;br /&gt;
│   ▾ накопичення      │                                                        │&lt;br /&gt;
│     ▾ ТовариНаСклад. │  Ім&#039;я           [ТовариНаСкладах.............]         │&lt;br /&gt;
│       ▾ Вимірювання  │  Синонім        [Товари на складах...........]         │&lt;br /&gt;
│           Номенклат. │  Коментар       [.............................]        │&lt;br /&gt;
│           Склад      │                                                        │&lt;br /&gt;
│           Партія     │  Вид регістру   ( ) Обороти   (•) Залишки              │&lt;br /&gt;
│       ▾ Ресурси      │  Періодичність  [ У межах секунди        ▾]            │&lt;br /&gt;
│           Кількість  │  Режим запису   [ Підпорядкований реєстратору ▾]       │&lt;br /&gt;
│           Сума       │                                                        │&lt;br /&gt;
│       ▸ Реквізити    │  ☑ Дозволити підсумки залишків                        │&lt;br /&gt;
│       ▸ Форми        │  ☑ Дозволити підсумки оборотів                        │&lt;br /&gt;
│     ▸ Взаєморозрах.  │      Періодичність підсумків оборотів [Місяць  ▾]      │&lt;br /&gt;
│   ▸ бухгалтерії      │  ☐ Дозволити розділення підсумків                     │&lt;br /&gt;
│   ▸ розрахунку       │                                                        │&lt;br /&gt;
│                      │  Блокування даних  [Кероване ▾]                        │&lt;br /&gt;
│                      │  Партиціонування   [За періодом, крок: місяць ▾]       │&lt;br /&gt;
│                      │                                                        │&lt;br /&gt;
│                      │  [ Конструктор рухів... ]  [ Перевірити ]  [ Закрити ] │&lt;br /&gt;
├──────────────────────┴────────────────────────────────────────────────────────┤&lt;br /&gt;
│ ⚠ Попередження: 4 вимірювання + місячні підсумки → оцінка таблиці підсумків    │&lt;br /&gt;
│   ~ 12 млн записів/рік. Розгляньте виключення вимірювання «Партія» з підсумків.│&lt;br /&gt;
└───────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.2. Палітра властивостей поля ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Властивості: Вимірювання «Партія» ────────────────┐&lt;br /&gt;
│ Ім&#039;я                  [Партія...................]  │&lt;br /&gt;
│ Синонім               [Партія...................]  │&lt;br /&gt;
│ Тип                   [Складений тип........ [...]]│&lt;br /&gt;
│    ├ Документ.ПрихіднаНакладна                     │&lt;br /&gt;
│    └ Документ.ВведенняЗалишків                     │&lt;br /&gt;
│ Індексувати           [Не індексувати         ▾]   │&lt;br /&gt;
│ ☐ Ведуче                                           │&lt;br /&gt;
│ ☐ Основний відбір                                  │&lt;br /&gt;
│ ☐ Заборонити незаповнені значення                  │&lt;br /&gt;
│ ☑ Використовувати в підсумках                      │&lt;br /&gt;
│ Подання                                            │&lt;br /&gt;
│    Підказка           [Партія товару...........]   │&lt;br /&gt;
└────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.3. Вкладка «Реєстратори» ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ ТовариНаСкладах → Реєстратори ────────────────────────────┐&lt;br /&gt;
│ ☑ Документ.ПрихіднаНакладна                                │&lt;br /&gt;
│ ☑ Документ.ВидатковаНакладна                               │&lt;br /&gt;
│ ☑ Документ.ПереміщенняТоварів                              │&lt;br /&gt;
│ ☑ Документ.Інвентаризація                                  │&lt;br /&gt;
│ ☐ Документ.Замовлення                                      │&lt;br /&gt;
│ ☐ Документ.РахунокНаОплату                                 │&lt;br /&gt;
│                                     [Позначити всі] [Зняти]│&lt;br /&gt;
│ ─────────────────────────────────────────────────────────  │&lt;br /&gt;
│ ⓘ Знімання прапорця для документа, що має рухи, вимагає    │&lt;br /&gt;
│   очищення рухів. Знайдено рухів: 0                        │&lt;br /&gt;
└────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.4. Вимоги до конструктора ===&lt;br /&gt;
* ФТ-К-01. Валідація метаопису в реальному часі з переліком помилок/попереджень.&lt;br /&gt;
* ФТ-К-02. Попередній перегляд згенерованого DDL (кнопка «Показати SQL»).&lt;br /&gt;
* ФТ-К-03. Калькулятор оцінки обсягу таблиць підсумків (добуток кардинальностей вимірювань × кількість періодів).&lt;br /&gt;
* ФТ-К-04. Заборона неприпустимих комбінацій (напр. «Незалежний» + «Регістр накопичення»).&lt;br /&gt;
* ФТ-К-05. «Конструктор рухів» — генерація коду формування рухів за табличною частиною документа.&lt;br /&gt;
* ФТ-К-06. Порівняння/об&#039;єднання конфігурацій має коректно обробляти об&#039;єкти-регістри.&lt;br /&gt;
&lt;br /&gt;
= 7. Функціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 7.1. Набір записів і проведення документа ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-01.&#039;&#039;&#039; Платформа надає прикладний об&#039;єкт &amp;lt;code&amp;gt;НабірЗаписів&amp;lt;/code&amp;gt; для кожного регістру з властивостями: &amp;lt;code&amp;gt;Відбір&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записувати&amp;lt;/code&amp;gt;, і методами &amp;lt;code&amp;gt;Прочитати()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записати(Заміщати)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Очистити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗаблокуватиДляЗміни()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вивантажити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Завантажити()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-02.&#039;&#039;&#039; Для документа доступна колекція &amp;lt;code&amp;gt;Рухи&amp;lt;/code&amp;gt; з наборами записів усіх регістрів, де документ вказано реєстратором.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-03. Сценарій проведення:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
skinparam monochrome false&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
actor Користувач&lt;br /&gt;
participant &amp;quot;Форма\nдокумента&amp;quot; as UI&lt;br /&gt;
participant &amp;quot;Об&#039;єкт\nДокумент&amp;quot; as Doc&lt;br /&gt;
participant &amp;quot;Менеджер\nпроведення&amp;quot; as PM&lt;br /&gt;
participant &amp;quot;Набори\nзаписів&amp;quot; as RS&lt;br /&gt;
database &amp;quot;СКБД&amp;quot; as DB&lt;br /&gt;
&lt;br /&gt;
Користувач -&amp;gt; UI: Провести&lt;br /&gt;
UI -&amp;gt; Doc: Записати(РежимЗапису.Проведення)&lt;br /&gt;
activate Doc&lt;br /&gt;
Doc -&amp;gt; PM: НачатьТранзакцию()&lt;br /&gt;
PM -&amp;gt; DB: BEGIN&lt;br /&gt;
Doc -&amp;gt; Doc: ПередЗаписью()&lt;br /&gt;
Doc -&amp;gt; DB: UPDATE doc SET Проведений=1&lt;br /&gt;
Doc -&amp;gt; Doc: ОбработкаПроведения(Отказ, Режим)&lt;br /&gt;
note right of Doc&lt;br /&gt;
  Прикладний код:&lt;br /&gt;
  Рухи.ТовариНаСкладах.Записувати = Істина;&lt;br /&gt;
  Рух = Рухи.ТовариНаСкладах.Добавить();&lt;br /&gt;
  Рух.ВидРуху = ВидРухуНакопичення.Витрата;&lt;br /&gt;
  ...&lt;br /&gt;
  // контроль залишків (оперативне проведення)&lt;br /&gt;
end note&lt;br /&gt;
Doc -&amp;gt; RS: (формування рухів у пам&#039;яті)&lt;br /&gt;
Doc -&amp;gt; PM: ЗаписатьДвижения()&lt;br /&gt;
PM -&amp;gt; RS: для кожного НЗ з Записувати=Істина&lt;br /&gt;
RS -&amp;gt; DB: DELETE FROM rg_a_0012 WHERE rec_ref = :doc&lt;br /&gt;
RS -&amp;gt; DB: INSERT INTO rg_a_0012 (...) VALUES (...)&lt;br /&gt;
RS -&amp;gt; PM: ОновитиПідсумки(delta)&lt;br /&gt;
PM -&amp;gt; DB: MERGE rg_a_0012_tb (див. розд. 10.2)&lt;br /&gt;
Doc -&amp;gt; Doc: ПриЗаписи() / ПослеЗаписи()&lt;br /&gt;
alt Відмова = Хиба&lt;br /&gt;
  PM -&amp;gt; DB: COMMIT&lt;br /&gt;
  PM --&amp;gt; UI: Успіх&lt;br /&gt;
else Відмова = Істина або виключення&lt;br /&gt;
  PM -&amp;gt; DB: ROLLBACK&lt;br /&gt;
  PM --&amp;gt; UI: Помилка &amp;quot;Документ не проведено: ...&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
deactivate Doc&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-04.&#039;&#039;&#039; Запис набору записів у режимі &amp;lt;code&amp;gt;Заміщати = Істина&amp;lt;/code&amp;gt; (за замовчуванням для рухів) виконує &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt; усіх записів за відбором + &amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt; нових — атомарно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-05.&#039;&#039;&#039; Скасування проведення документа: усі набори записів за реєстратором очищуються, підсумки коригуються, документ отримує &amp;lt;code&amp;gt;Проведений = Хиба&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-06.&#039;&#039;&#039; Видалення документа-реєстратора (у т.ч. позначеного на видалення) &#039;&#039;&#039;зобов&#039;язане&#039;&#039;&#039; каскадно видалити всі його рухи в межах однієї транзакції. Реалізація — на рівні платформи (не FK, оскільки посилання поліморфне) + фонова перевірка цілісності (розділ 7.10).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-07.&#039;&#039;&#039; Режими проведення:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Режим !! Умова !! Поведінка&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Оперативне&#039;&#039;&#039; || Дата документа = поточна дата, документ у межах «оперативної точки» || Дозволено контроль залишків «на зараз»; дата може перепризначатися на поточну.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Неоперативне&#039;&#039;&#039; || Дата в минулому/майбутньому або документ перепроводиться || Контроль залишків виконується на дату документа; можливий негативний залишок за налаштуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.2. Активність записів ==&lt;br /&gt;
&#039;&#039;&#039;ФТ-08.&#039;&#039;&#039; Реквізит &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; означає, що запис фізично існує, але &#039;&#039;&#039;не&#039;&#039;&#039; впливає на підсумки та не потрапляє до віртуальних таблиць.&lt;br /&gt;
&#039;&#039;&#039;ФТ-09.&#039;&#039;&#039; Зміна активності будь-якого запису тягне коригування підсумків.&lt;br /&gt;
&#039;&#039;&#039;ФТ-10.&#039;&#039;&#039; Скасування проведення документа переводить усі його записи в &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; &#039;&#039;&#039;або&#039;&#039;&#039; видаляє їх — залежно від налаштування регістру &amp;lt;code&amp;gt;ПоведінкаПриСкасуванні&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Видаляти&amp;lt;/code&amp;gt; — за замовчуванням / &amp;lt;code&amp;gt;Деактивувати&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.3. Віртуальні таблиці ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-11.&#039;&#039;&#039; Мова запитів надає для кожного регістру набір віртуальних таблиць. Транслятор перетворює звернення до них на SQL із використанням таблиць підсумків та «живих» рухів після ТА.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Регістр !! Віртуальна таблиця !! Параметри !! Повертає&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РВ&#039;&#039;&#039; || &amp;lt;code&amp;gt;ЗрізОстанніх&amp;lt;/code&amp;gt; || (Період, Умова) || Останній запис на кожну комбінацію вимірювань з періодом ≤ Період&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗрізПерших&amp;lt;/code&amp;gt; || (Період, Умова) || Перший запис з періодом ≥ Період&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Усі записи&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РН.Залишки&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, Умова) || Вимірювання + &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, МетодДоповнення, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ПочатковийЗалишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;КінцевийЗалишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН.Обороти&#039;&#039;&#039; || &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | &#039;&#039;&#039;РБ&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, УмоваРахунку, Субконто, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахунку, Субконто, Умова, УмоваКорРахунку, КорСубконто) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (…) || Повний набір&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОборотиДтКт&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахункуДт, СубконтоДт, УмоваРахункуКт, СубконтоКт) || Кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДвиженияССубконто&amp;lt;/code&amp;gt; || (Початок, Кінець, УмоваРахунку, Субконто, Умова) || Рухи з розшифровкою субконто&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; || (Умова, Порядок…) || Значення субконто записів&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РР&#039;&#039;&#039; || &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; || (Умова) || &amp;lt;code&amp;gt;ЗначенняПеріодуДії&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняПеріодуРеєстрації&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняБазовогоПеріоду&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняФактичногоПеріодуДії&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ФактичнийПеріодДії&amp;lt;/code&amp;gt; || (Умова) || Записи з фактичними (після витіснення) межами&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; || (ВимірюванняБази, ВимірюванняОсновногоРегістру, Розрізи, ВидиРозрахунку, Умова) || Агреговані значення ресурсів базових видів розрахунку&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-12.&#039;&#039;&#039; Приклад запиту:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Залишки.Номенклатура,&lt;br /&gt;
    Залишки.Склад,&lt;br /&gt;
    Залишки.КількістьЗалишок,&lt;br /&gt;
    Обороти.КількістьПрихід,&lt;br /&gt;
    Обороти.КількістьВитрата&lt;br /&gt;
З&lt;br /&gt;
    РегістрНакопичення.ТовариНаСкладах.ЗалишкиІОбороти(&lt;br /&gt;
        &amp;amp;ПочатокПеріоду,&lt;br /&gt;
        &amp;amp;КінецьПеріоду,&lt;br /&gt;
        Місяць,&lt;br /&gt;
        Рух,&lt;br /&gt;
        Склад = &amp;amp;Склад&lt;br /&gt;
            І Номенклатура В ІЄРАРХІЇ (&amp;amp;ГрупаНоменклатури)&lt;br /&gt;
    ) ЯК Залишки&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-13.&#039;&#039;&#039; Параметри віртуальних таблиць &#039;&#039;&#039;зобов&#039;язані&#039;&#039;&#039; транслюватися у &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; підзапиту до звернення до підсумків (push-down), а не фільтруватися після агрегації.&lt;br /&gt;
&lt;br /&gt;
== 7.4. Підсумки ==&lt;br /&gt;
&lt;br /&gt;
=== 7.4.1. Модель підсумків залишків ===&lt;br /&gt;
Таблиця залишків зберігає &#039;&#039;&#039;кумулятивний залишок на початок кожного періоду&#039;&#039;&#039; + спеціальний рядок «підсумок за всі періоди» з &amp;lt;code&amp;gt;period = &#039;5999-11-01&#039;&amp;lt;/code&amp;gt; (маркер MAXPERIOD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                     Таблиця підсумків (місячна)                  ТА&lt;br /&gt;
                     ┌────┬────┬────┬────┬────┐                    ▼&lt;br /&gt;
  ─────┬────┬────┬───┴────┴────┴────┴────┴────┴────────────────────┬──────────►&lt;br /&gt;
       │    │    │  01.10  01.11  01.12  01.01  01.02             15.02      t&lt;br /&gt;
       │    │    │   ●      ●      ●      ●      ●&lt;br /&gt;
       │    │    │  бал.   бал.   бал.   бал.   бал.&lt;br /&gt;
                                                    └─ «живі» рухи ─┘&lt;br /&gt;
                                                      (сканування)&lt;br /&gt;
  Залишок на 10.02 = Підсумок(01.02) + Σ рухів (01.02 … 10.02]&lt;br /&gt;
  Залишок на 20.02 = Підсумок(01.02) + Σ рухів (01.02 … 20.02]   // після ТА — теж&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-14.&#039;&#039;&#039; Регламентна операція «Перерахунок підсумків» перебудовує таблиці підсумків з нуля.&lt;br /&gt;
&#039;&#039;&#039;ФТ-15.&#039;&#039;&#039; Регламентна операція «Встановлення періоду розрахунку підсумків» переносить ТА вперед/назад.&lt;br /&gt;
&#039;&#039;&#039;ФТ-16.&#039;&#039;&#039; При записі рухів раніше ТА підсумки коригуються &#039;&#039;інкрементально&#039;&#039; (див. 10.2), без повного перерахунку.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.2. Розділення підсумків ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-17.&#039;&#039;&#039; За увімкненого &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; у таблиці підсумків додається колонка &amp;lt;code&amp;gt;splitter smallint&amp;lt;/code&amp;gt;. Одночасні транзакції пишуть у різні «сплітери», що усуває конкуренцію за рядок. Читання агрегує по всіх сплітерах. Регламентне завдання зливає сплітери.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.3. Обороти ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-18.&#039;&#039;&#039; Таблиця оборотів зберігає агрегати за календарний період (день або місяць — за налаштуванням), без кумуляції.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.4. Агрегати (тільки РН виду «Обороти») ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-19.&#039;&#039;&#039; Агрегат — додаткова матеріалізована таблиця з підмножиною вимірювань і власною періодичністю (День/Місяць/Квартал/Рік). Оптимізатор запитів обирає найдешевший агрегат, що покриває запит.&lt;br /&gt;
&#039;&#039;&#039;ФТ-20.&#039;&#039;&#039; Режими: &amp;lt;code&amp;gt;Реальний час&amp;lt;/code&amp;gt; (оновлюється при записі рухів) / &amp;lt;code&amp;gt;Регламентний&amp;lt;/code&amp;gt; (оновлюється завданням; запит враховує рухи після дати актуальності агрегату).&lt;br /&gt;
&#039;&#039;&#039;ФТ-21.&#039;&#039;&#039; «Порадник агрегатів» аналізує статистику запитів і пропонує склад агрегатів (&amp;lt;code&amp;gt;ВизначитиОптимальніАгрегати()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.5. Механіка регістру розрахунку ==&lt;br /&gt;
&lt;br /&gt;
=== 7.5.1. Витіснення за періодом дії ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-22.&#039;&#039;&#039; Якщо у ПВР для виду розрахунку A вказано B у складі «Витісняючі види розрахунку», то запис виду B скорочує фактичний період дії запису виду A на інтервал перетину.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Період реєстрації: Січень 2026.   Пріоритет витіснення: Лікарняний &amp;gt; Відпустка &amp;gt; Оклад&lt;br /&gt;
&lt;br /&gt;
Заявлені періоди дії:&lt;br /&gt;
Оклад        01.01 ├══════════════════════════════════════════════┤ 31.01&lt;br /&gt;
Відпустка              10.01 ├════════════┤ 17.01&lt;br /&gt;
Лікарняний                     14.01 ├════════════┤ 22.01&lt;br /&gt;
&lt;br /&gt;
Фактичні періоди дії (rg_c_XXXX_ap):&lt;br /&gt;
Оклад        01.01 ├═══════┤ 09.01            23.01 ├════════════┤ 31.01&lt;br /&gt;
Відпустка              10.01 ├═══┤ 13.01&lt;br /&gt;
Лікарняний                     14.01 ├════════════┤ 22.01&lt;br /&gt;
&lt;br /&gt;
⇒ у таблиці фактичних періодів «Оклад» породжує ДВА інтервали (запис — один).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-23.&#039;&#039;&#039; Фактичні періоди дії матеріалізуються у службовій таблиці &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;код&amp;amp;gt;_ap&amp;lt;/code&amp;gt; під час запису набору записів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-24.&#039;&#039;&#039; Витіснення обчислюється в межах збігу &#039;&#039;&#039;усіх&#039;&#039;&#039; вимірювань регістру та перетину періодів реєстрації, визначених ПВР.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.2. Базовий період і база розрахунку ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-25.&#039;&#039;&#039; Віртуальна таблиця &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; повертає суму ресурсів записів базових видів розрахунку, зіставлених за базовими вимірюваннями, з урахуванням режиму &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період дії&#039;&#039;&#039; перетинається з базовим періодом поточного запису; результат пропорційно розподіляється за часткою перетину (за графіком, якщо заданий);&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період реєстрації&#039;&#039;&#039; потрапляє в базовий період.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.3. Перерахунки ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-26.&#039;&#039;&#039; При записі/зміні/видаленні запису базового виду розрахунку платформа &#039;&#039;&#039;автоматично&#039;&#039;&#039; формує записи у таблиці перерахунку для всіх залежних записів (за збігом вимірювань перерахунку та потраплянням у базовий період).&lt;br /&gt;
&#039;&#039;&#039;ФТ-27.&#039;&#039;&#039; Прикладний код читає перерахунок як набір записів, перепроводить відповідні документи та очищує оброблені записи.&lt;br /&gt;
&#039;&#039;&#039;ФТ-28.&#039;&#039;&#039; Перерахунок доступний як об&#039;єкт для звіту «Документи до перерахунку».&lt;br /&gt;
&lt;br /&gt;
=== 7.5.4. Графік часу ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-29.&#039;&#039;&#039; Графік — це РВ з обов&#039;язковим вимірюванням типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; та числовим ресурсом. Віртуальна таблиця &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; повертає суму значень графіка за відповідний період (дії / реєстрації / базовий / фактичний період дії).&lt;br /&gt;
&#039;&#039;&#039;ФТ-30.&#039;&#039;&#039; Якщо у графіку є додаткові вимірювання (напр. &amp;lt;code&amp;gt;ВидГрафіка&amp;lt;/code&amp;gt;), вони зіставляються з однойменними реквізитами/вимірюваннями РР.&lt;br /&gt;
&lt;br /&gt;
== 7.6. Прикладний API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// --- Регістр відомостей: незалежний запис ---&lt;br /&gt;
var mgr = Registers.Information[&amp;quot;КурсиВалют&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// точковий запис&lt;br /&gt;
var rec = mgr.CreateRecordManager();&lt;br /&gt;
rec.Період = new DateTime(2026, 7, 17);&lt;br /&gt;
rec.Валюта = usd;&lt;br /&gt;
rec.Курс = 41.85m;&lt;br /&gt;
rec.Кратність = 1;&lt;br /&gt;
rec.Write(replace: true);          // INSERT ... ON CONFLICT DO UPDATE&lt;br /&gt;
&lt;br /&gt;
// зріз останніх&lt;br /&gt;
var slice = mgr.GetLast(DateTime.Today, new Filter { [&amp;quot;Валюта&amp;quot;] = usd });&lt;br /&gt;
decimal курс = slice.Курс;&lt;br /&gt;
&lt;br /&gt;
// --- Регістр накопичення: рухи документа ---&lt;br /&gt;
protected override void OnPosting(PostingContext ctx)&lt;br /&gt;
{&lt;br /&gt;
    var rs = Movements[&amp;quot;ТовариНаСкладах&amp;quot;];&lt;br /&gt;
    rs.Write = true;              // набір буде записано наприкінці транзакції&lt;br /&gt;
    rs.Clear();&lt;br /&gt;
&lt;br /&gt;
    foreach (var row in this.Товари)&lt;br /&gt;
    {&lt;br /&gt;
        var m = rs.Add();&lt;br /&gt;
        m.Період       = this.Дата;&lt;br /&gt;
        m.MovementType = AccumulationMovementType.Expense;   // Витрата&lt;br /&gt;
        m.Номенклатура = row.Номенклатура;&lt;br /&gt;
        m.Склад        = this.Склад;&lt;br /&gt;
        m.Партія       = row.Партія;&lt;br /&gt;
        m.Кількість    = row.Кількість;&lt;br /&gt;
        m.Сума         = row.Сума;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // керовані блокування перед контролем залишків&lt;br /&gt;
    var lock_ = new DataLock();&lt;br /&gt;
    var item = lock_.Add(&amp;quot;РегістрНакопичення.ТовариНаСкладах.Залишки&amp;quot;);&lt;br /&gt;
    item.Mode = DataLockMode.Exclusive;&lt;br /&gt;
    item.DataSource = rs.Unload(new[] { &amp;quot;Номенклатура&amp;quot;, &amp;quot;Склад&amp;quot; });&lt;br /&gt;
    item.UseFromDataSource(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Номенклатура&amp;quot;);&lt;br /&gt;
    item.UseFromDataSource(&amp;quot;Склад&amp;quot;, &amp;quot;Склад&amp;quot;);&lt;br /&gt;
    lock_.Lock();&lt;br /&gt;
&lt;br /&gt;
    rs.WriteNow();                // примусовий запис до контролю&lt;br /&gt;
    ControlBalances(ctx);         // прикладна перевірка на від&#039;ємні залишки&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --- Регістр бухгалтерії ---&lt;br /&gt;
var rs = Movements[&amp;quot;Госпрозрахунковий&amp;quot;];&lt;br /&gt;
var m  = rs.AddAccountingEntry();&lt;br /&gt;
m.Період    = this.Дата;&lt;br /&gt;
m.РахунокДт = accounts[&amp;quot;281&amp;quot;];&lt;br /&gt;
m.РахунокКт = accounts[&amp;quot;631&amp;quot;];&lt;br /&gt;
m.SubcontoDt[ВидиСубконто.Номенклатура] = row.Номенклатура;&lt;br /&gt;
m.SubcontoDt[ВидиСубконто.Склади]       = this.Склад;&lt;br /&gt;
m.SubcontoKt[ВидиСубконто.Контрагенти]  = this.Контрагент;&lt;br /&gt;
m.Сума      = row.Сума;&lt;br /&gt;
m.КількістьДт = row.Кількість;&lt;br /&gt;
&lt;br /&gt;
// --- Регістр розрахунку ---&lt;br /&gt;
var rs = Movements[&amp;quot;Нарахування&amp;quot;];&lt;br /&gt;
var m = rs.Add();&lt;br /&gt;
m.ВидРозрахунку     = calcTypes[&amp;quot;Оклад&amp;quot;];&lt;br /&gt;
m.Період            = this.Дата;                 // період реєстрації&lt;br /&gt;
m.ПеріодДіїПочаток  = new DateTime(2026,7,1);&lt;br /&gt;
m.ПеріодДіїКінець   = new DateTime(2026,7,31);&lt;br /&gt;
m.БазовийПеріодПочаток = new DateTime(2026,6,1);&lt;br /&gt;
m.БазовийПеріодКінець  = new DateTime(2026,6,30);&lt;br /&gt;
m.Співробітник      = row.Співробітник;&lt;br /&gt;
m.Результат         = 0;                          // заповниться після розрахунку&lt;br /&gt;
rs.WriteNow();&lt;br /&gt;
&lt;br /&gt;
// отримання даних графіка та бази — запитом&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7.7. Блокування та конкурентність ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Вимога&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31 || Режим керованих блокувань — за замовчуванням. Рівень ізоляції транзакцій: &amp;lt;code&amp;gt;READ COMMITTED&amp;lt;/code&amp;gt; (PostgreSQL) / &amp;lt;code&amp;gt;READ COMMITTED SNAPSHOT&amp;lt;/code&amp;gt; (MS SQL).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-32 || Об&#039;єкт &amp;lt;code&amp;gt;DataLock&amp;lt;/code&amp;gt; дозволяє встановити розділювальне/виняткове блокування на «простір» регістру за значеннями вимірювань (реалізація — &amp;lt;code&amp;gt;pg_advisory_xact_lock&amp;lt;/code&amp;gt; за хешем ключа або &amp;lt;code&amp;gt;SELECT ... FOR UPDATE&amp;lt;/code&amp;gt; по таблиці підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-33 || Запис рухів документа блокує тільки записи цього реєстратора (PK містить реєстратор першим).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-34 || Оновлення підсумків не повинно призводити до дедлоків: усі &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;-операції в межах транзакції виконуються у детермінованому порядку сортування ключа.&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-35 || Гарантія: паралельне проведення двох документів з різними наборами вимірювань не конкурує (за увімкненого розділення підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-36 || Таймаут очікування блокування — 20 с (налаштовується); при перевищенні — керована помилка з текстом конфліктного ключа.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.8. Права доступу ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-37.&#039;&#039;&#039; Для регістру визначаються права: &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Додавання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Зміна&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Видалення&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перегляд&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Редагування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПереглядПідсумків&amp;lt;/code&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;ФТ-38.&#039;&#039;&#039; Обмеження на рівні записів (RLS) задаються шаблоном умови по вимірюваннях; транслюються в &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; усіх звернень, включно з віртуальними таблицями.&lt;br /&gt;
&#039;&#039;&#039;ФТ-39.&#039;&#039;&#039; &#039;&#039;Ризик:&#039;&#039; RLS на віртуальних таблицях залишків потребує узгодженості з підсумками. Рішення — RLS дозволено тільки по вимірюваннях, що входять до ключа підсумків; конструктор валідує це правило.&lt;br /&gt;
&lt;br /&gt;
== 7.9. Журналювання, аудит, службові сервіси ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-40.&#039;&#039;&#039; Реєстрація в журналі: перерахунок підсумків, зміна ТА, реструктуризація регістру, злиття сплітерів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-41.&#039;&#039;&#039; Службовий сервіс «Перевірка цілісності регістрів»:&lt;br /&gt;
* «висячі» рухи (реєстратор не існує або не проведений);&lt;br /&gt;
* розбіжність підсумків і сум рухів (контрольний перерахунок у тіньову таблицю з порівнянням);&lt;br /&gt;
* некоректні фактичні періоди дії РР;&lt;br /&gt;
* для РБ — порушення рівності Дт = Кт за балансовим ресурсом у межах реєстратора.&lt;br /&gt;
&#039;&#039;&#039;ФТ-42.&#039;&#039;&#039; Звіт «Аналіз розміру регістрів»: кількість записів, розмір таблиць та індексів, дата останнього перерахунку підсумків.&lt;br /&gt;
&lt;br /&gt;
= 8. Модель даних (як це виглядає в базі даних) =&lt;br /&gt;
&lt;br /&gt;
== 8.1. Конвенції іменування ==&lt;br /&gt;
&lt;br /&gt;
Фізичні імена &#039;&#039;&#039;не&#039;&#039;&#039; успадковують прикладні імена (обмеження довжини ідентифікатора, кирилиця, перейменування об&#039;єктів). Ім&#039;я будується за сурогатним кодом об&#039;єкта метаданих &amp;lt;code&amp;gt;&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; (4-значний hex/dec).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаблон !! Призначення !! Приклад&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_i_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр відомостей — основна таблиця || &amp;lt;code&amp;gt;rg_i_0007&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр накопичення — рухи || &amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tb&amp;lt;/code&amp;gt; || РН — підсумки залишків (Totals Balance) || &amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tt&amp;lt;/code&amp;gt; || РН — підсумки оборотів (Totals Turnover) || &amp;lt;code&amp;gt;rg_a_0012_tt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_ag&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; || РН — агрегат № n || &amp;lt;code&amp;gt;rg_a_0031_ag1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр бухгалтерії — проводки || &amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_ed&amp;lt;/code&amp;gt; || РБ — субконто (якщо винесено в дочірню таблицю) || &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tb&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки залишків за рівнем субконто k (0…N) || &amp;lt;code&amp;gt;rg_b_0020_tb2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tt&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки оборотів за рівнем субконто k || &amp;lt;code&amp;gt;rg_b_0020_tt1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tc&amp;lt;/code&amp;gt; || РБ — обороти між рахунками (кореспонденції) || &amp;lt;code&amp;gt;rg_b_0020_tc&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр розрахунку — рухи || &amp;lt;code&amp;gt;rg_c_0040&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_ap&amp;lt;/code&amp;gt; || РР — фактичні періоди дії || &amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_rc&amp;amp;lt;m&amp;amp;gt;&amp;lt;/code&amp;gt; || РР — перерахунок № m || &amp;lt;code&amp;gt;rg_c_0040_rc1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_&amp;amp;lt;*&amp;amp;gt;_&amp;amp;lt;id&amp;amp;gt;_opt&amp;lt;/code&amp;gt; || Службова: ТА підсумків, налаштування || &amp;lt;code&amp;gt;rg_a_0012_opt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;md_*&amp;lt;/code&amp;gt; || Таблиці метаданих || &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Колонки полів: &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — вимірювання, &amp;lt;code&amp;gt;r&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — ресурс, &amp;lt;code&amp;gt;a&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — реквізит, де &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; — порядковий номер поля в метаописі (стабільний, не перевикористовується після видалення поля). Мапінг «прикладне ім&#039;я ↔ фізична колонка» зберігається в &amp;lt;code&amp;gt;md_register_field&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.2. Типізація та зберігання значень ==&lt;br /&gt;
&lt;br /&gt;
=== 8.2.1. Примітивні типи ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Тип платформи !! PostgreSQL !! MS SQL&lt;br /&gt;
|-&lt;br /&gt;
| Число(p,s) || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(n) || &amp;lt;code&amp;gt;varchar(n)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(необмежена) || &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(max)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Дата / ДатаЧас || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;datetime2(0)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Булево || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| УНІ || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uniqueidentifier&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.2. Посилальні типи ===&lt;br /&gt;
* &#039;&#039;&#039;Простий&#039;&#039;&#039; (один тип): одна колонка &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r uuid NOT NULL&amp;lt;/code&amp;gt;, зовнішній ключ до таблиці об&#039;єкта. Порожнє посилання = &amp;lt;code&amp;gt;&#039;00000000-0000-0000-0000-000000000000&#039;&amp;lt;/code&amp;gt; (а не NULL — щоб зберегти семантику «пустого значення» у ключах підсумків).&lt;br /&gt;
* &#039;&#039;&#039;Складений&#039;&#039;&#039; (кілька типів / примітив + посилання): група колонок:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Колонка !! Тип !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_t&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;smallint&amp;lt;/code&amp;gt; || Код типу: 1=Невизначено, 2=Булево, 3=Число, 4=Рядок, 5=Дата, ≥100 = &amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt; посилального типу&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || Значення, якщо _t=2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_n&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(38,10)&amp;lt;/code&amp;gt; || Значення, якщо _t=3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_s&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;varchar(N)&amp;lt;/code&amp;gt; || Значення, якщо _t=4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_d&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || Значення, якщо _t=5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || Значення, якщо _t≥100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №1.&#039;&#039;&#039; Для складених типів обрано «широку» денормалізацію (кілька колонок), а не JSONB/варіант, тому що: (а) колонки індексуються та беруть участь у ключах підсумків; (б) B-tree по &amp;lt;code&amp;gt;(d1_t, d1_r)&amp;lt;/code&amp;gt; дає range-scan, JSONB — ні; (в) сумісно з обома цільовими СКБД. Ціна — до 6 колонок на одне складене поле.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.3. Реєстратор ===&lt;br /&gt;
Завжди складений (будь-який з дозволених документів):&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_t smallint NOT NULL&amp;lt;/code&amp;gt; — код типу документа (&amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt;);&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_r uuid NOT NULL&amp;lt;/code&amp;gt; — посилання.&lt;br /&gt;
&lt;br /&gt;
FK неможливий (поліморфізм) → цілісність забезпечується платформою + сервісом перевірки (ФТ-41).&lt;br /&gt;
&lt;br /&gt;
=== 8.2.4. Маркери періодів ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа !! Значення !! Використання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MINPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0001-01-01 00:00:00&amp;lt;/code&amp;gt; || Нижня межа&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5999-11-01 00:00:00&amp;lt;/code&amp;gt; || Рядок «підсумок за всі періоди» в таблицях залишків&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8.3. Таблиці метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ============ РЕПОЗИТОРІЙ МЕТАДАНИХ ============&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_type (                       -- реєстр усіх типів конфігурації&lt;br /&gt;
    id            smallint     PRIMARY KEY,&lt;br /&gt;
    kind          varchar(20)  NOT NULL,     -- Catalog|Document|Enum|ChartOfAccounts|ChartOfCalcTypes|Register|...&lt;br /&gt;
    name          varchar(80)  NOT NULL,&lt;br /&gt;
    table_name    varchar(63),&lt;br /&gt;
    UNIQUE (kind, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register (&lt;br /&gt;
    id                   smallint     PRIMARY KEY,          -- = md_type.id&lt;br /&gt;
    name                 varchar(80)  NOT NULL UNIQUE,&lt;br /&gt;
    synonym              varchar(255),&lt;br /&gt;
    comment              text,&lt;br /&gt;
    kind                 varchar(12)  NOT NULL&lt;br /&gt;
        CHECK (kind IN (&#039;Information&#039;,&#039;Accumulation&#039;,&#039;Accounting&#039;,&#039;Calculation&#039;)),&lt;br /&gt;
    -- загальні&lt;br /&gt;
    write_mode           varchar(24)  NOT NULL DEFAULT &#039;SubordinateToRecorder&#039;&lt;br /&gt;
        CHECK (write_mode IN (&#039;Independent&#039;,&#039;SubordinateToRecorder&#039;)),&lt;br /&gt;
    periodicity          varchar(24)  NOT NULL DEFAULT &#039;Nonperiodical&#039;&lt;br /&gt;
        CHECK (periodicity IN (&#039;Nonperiodical&#039;,&#039;WithinSecond&#039;,&#039;WithinDay&#039;,&#039;WithinMonth&#039;,&lt;br /&gt;
                               &#039;WithinQuarter&#039;,&#039;WithinYear&#039;,&#039;ByRecorderPosition&#039;)),&lt;br /&gt;
    lock_mode            varchar(12)  NOT NULL DEFAULT &#039;Managed&#039;,&lt;br /&gt;
    use_rls              boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    partition_mode       varchar(20)  NOT NULL DEFAULT &#039;None&#039;,&lt;br /&gt;
    partition_step       varchar(10),&lt;br /&gt;
    -- РН&lt;br /&gt;
    accumulation_kind    varchar(10)  CHECK (accumulation_kind IN (&#039;Balance&#039;,&#039;Turnover&#039;)),&lt;br /&gt;
    enable_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    enable_tno_totals    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    tno_totals_period    varchar(6)   CHECK (tno_totals_period IN (&#039;Day&#039;,&#039;Month&#039;)),&lt;br /&gt;
    split_totals         boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    split_count          smallint     NOT NULL DEFAULT 1,&lt;br /&gt;
    aggregates_mode      varchar(10),&lt;br /&gt;
    -- РБ&lt;br /&gt;
    chart_of_accounts_id smallint     REFERENCES md_type(id),&lt;br /&gt;
    correspondence       boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    max_extdim_count     smallint     NOT NULL DEFAULT 3,&lt;br /&gt;
    -- РР&lt;br /&gt;
    calc_types_plan_id   smallint     REFERENCES md_type(id),&lt;br /&gt;
    use_action_period    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    base_period_mode     varchar(24)&lt;br /&gt;
        CHECK (base_period_mode IN (&#039;None&#039;,&#039;ByActionPeriod&#039;,&#039;ByRegistrationPeriod&#039;)),&lt;br /&gt;
    schedule_register_id smallint     REFERENCES md_register(id),&lt;br /&gt;
    schedule_value_field smallint,&lt;br /&gt;
    schedule_date_field  smallint,&lt;br /&gt;
    -- службове&lt;br /&gt;
    physical_table       varchar(63)  NOT NULL,&lt;br /&gt;
    struct_version       int          NOT NULL DEFAULT 1,&lt;br /&gt;
    CONSTRAINT chk_kind_props CHECK (&lt;br /&gt;
        (kind = &#039;Accumulation&#039; AND accumulation_kind IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Accounting&#039;   AND chart_of_accounts_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Calculation&#039;  AND calc_types_plan_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Information&#039;)&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_field (&lt;br /&gt;
    id                smallint    NOT NULL,        -- порядковий номер поля (стабільний)&lt;br /&gt;
    register_id       smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name              varchar(80) NOT NULL,&lt;br /&gt;
    synonym           varchar(255),&lt;br /&gt;
    role              varchar(12) NOT NULL CHECK (role IN (&#039;Dimension&#039;,&#039;Resource&#039;,&#039;Attribute&#039;)),&lt;br /&gt;
    data_type_expr    text        NOT NULL,        -- серіалізований опис типу (може бути складеним)&lt;br /&gt;
    is_composite      boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    precision_        smallint,&lt;br /&gt;
    scale_            smallint,&lt;br /&gt;
    length_           int,&lt;br /&gt;
    index_mode        varchar(28) NOT NULL DEFAULT &#039;None&#039;&lt;br /&gt;
        CHECK (index_mode IN (&#039;None&#039;,&#039;Index&#039;,&#039;IndexWithAddDimensions&#039;)),&lt;br /&gt;
    is_master         boolean     NOT NULL DEFAULT false,   -- «Ведуче»&lt;br /&gt;
    in_default_filter boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    deny_empty        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    use_in_totals     boolean     NOT NULL DEFAULT true,&lt;br /&gt;
    -- РБ&lt;br /&gt;
    is_balance        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    accounting_flag   varchar(80),&lt;br /&gt;
    extdim_flag       varchar(80),&lt;br /&gt;
    -- РР&lt;br /&gt;
    is_base_dimension boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    -- фізика&lt;br /&gt;
    column_prefix     varchar(8)  NOT NULL,        -- &#039;d3&#039;,&#039;r1&#039;,&#039;a2&#039;&lt;br /&gt;
    PRIMARY KEY (register_id, id),&lt;br /&gt;
    UNIQUE (register_id, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recorder (&lt;br /&gt;
    register_id  smallint NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    doc_type_id  smallint NOT NULL REFERENCES md_type(id),&lt;br /&gt;
    PRIMARY KEY (register_id, doc_type_id)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_aggregate (&lt;br /&gt;
    id           smallint    NOT NULL,&lt;br /&gt;
    register_id  smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    periodicity  varchar(8)  NOT NULL CHECK (periodicity IN (&#039;Day&#039;,&#039;Month&#039;,&#039;Quarter&#039;,&#039;Year&#039;)),&lt;br /&gt;
    use_mode     varchar(12) NOT NULL DEFAULT &#039;Auto&#039;,&lt;br /&gt;
    is_realtime  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    actual_upto  timestamp(0),&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_aggregate_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    aggregate_id smallint NOT NULL,&lt;br /&gt;
    field_id     smallint NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, aggregate_id, field_id),&lt;br /&gt;
    FOREIGN KEY (register_id, aggregate_id) REFERENCES md_register_aggregate(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recalc (&lt;br /&gt;
    id             smallint    NOT NULL,&lt;br /&gt;
    register_id    smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name           varchar(80) NOT NULL,&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_recalc_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    recalc_id    smallint NOT NULL,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    reg_field_id smallint NOT NULL,          -- вимірювання основного регістру&lt;br /&gt;
    column_prefix varchar(8) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, recalc_id, name),&lt;br /&gt;
    FOREIGN KEY (register_id, recalc_id) REFERENCES md_register_recalc(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.4. Регістр відомостей ==&lt;br /&gt;
&lt;br /&gt;
=== 8.4.1. Незалежний періодичний (приклад: КурсиВалют) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0007 (&lt;br /&gt;
    period   timestamp(0) NOT NULL,                  -- Період (усічений до дня: WithinDay)&lt;br /&gt;
    d1_r     uuid         NOT NULL,                  -- Вимірювання «Валюта»&lt;br /&gt;
    r1       numeric(15,4) NOT NULL,                 -- Ресурс «Курс»&lt;br /&gt;
    r2       numeric(10,0) NOT NULL DEFAULT 1,       -- Ресурс «Кратність»&lt;br /&gt;
    CONSTRAINT pk_rg_i_0007 PRIMARY KEY (period, d1_r)&lt;br /&gt;
);&lt;br /&gt;
-- Індекс для зрізу останніх у розрізі вимірювання&lt;br /&gt;
CREATE INDEX ix_rg_i_0007_d1 ON rg_i_0007 (d1_r, period DESC) INCLUDE (r1, r2);&lt;br /&gt;
ALTER TABLE rg_i_0007 ADD CONSTRAINT fk_rg_i_0007_d1&lt;br /&gt;
    FOREIGN KEY (d1_r) REFERENCES cat_0003(ref);      -- Довідник.Валюти&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.2. Підпорядкований реєстратору ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0008 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    r1       numeric(15,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0008 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_period ON rg_i_0008 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_d1     ON rg_i_0008 (d1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.3. Незалежний неперіодичний ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0009 (&lt;br /&gt;
    d1_r  uuid          NOT NULL,&lt;br /&gt;
    d2_r  uuid          NOT NULL,&lt;br /&gt;
    r1    varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_i_0009 PRIMARY KEY (d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.5. Регістр накопичення ==&lt;br /&gt;
&lt;br /&gt;
=== 8.5.1. Таблиця рухів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ТовариНаСкладах: dims = Номенклатура(d1), Склад(d2), Партія(d3, складений), Характеристика(d4)&lt;br /&gt;
--                  res  = Кількість(r1), Сума(r2);  attr = Коментар(a1)&lt;br /&gt;
CREATE TABLE rg_a_0012 (&lt;br /&gt;
    rec_t    smallint      NOT NULL,&lt;br /&gt;
    rec_r    uuid          NOT NULL,&lt;br /&gt;
    line_no  int           NOT NULL,&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    active   boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    mvt      smallint      NOT NULL CHECK (mvt IN (0,1)),   -- 0=Прихід, 1=Витрата&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,                        -- складене вимірювання «Партія»&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(15,3) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2       numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    a1       varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE rg_a_0012_p2026m07 PARTITION OF rg_a_0012&lt;br /&gt;
    FOR VALUES FROM (&#039;2026-07-01&#039;) TO (&#039;2026-08-01&#039;);&lt;br /&gt;
-- ... інші секції створюються регламентним завданням&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_period ON rg_a_0012 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d1     ON rg_a_0012 (d1_r, period, d2_r) WHERE active;   -- Номенклатура (Індексувати з дод. вимірюваннями)&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d2     ON rg_a_0012 (d2_r, period, d1_r) WHERE active;   -- Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.2. Таблиця підсумків залишків ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tb (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок місяця; MAXPERIOD = підсумок за всі періоди&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,     -- Кількість, знаковий залишок&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,     -- Сума&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tb PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- покривний індекс для типового відбору «залишки по складу»&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_tb_d2 ON rg_a_0012_tb (d2_r, period, d1_r) INCLUDE (r1, r2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Семантика:&#039;&#039;&#039; рядок з &amp;lt;code&amp;gt;period = P&amp;lt;/code&amp;gt; містить залишок &#039;&#039;&#039;на початок&#039;&#039;&#039; періоду P. Рядок з &amp;lt;code&amp;gt;period = MAXPERIOD&amp;lt;/code&amp;gt; — поточний залишок за всі періоди (використовується для запитів «залишки на зараз», найчастіший кейс).&lt;br /&gt;
&lt;br /&gt;
=== 8.5.3. Таблиця підсумків оборотів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tt (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок періоду агрегації (день/місяць)&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1_in    numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Прихід&lt;br /&gt;
    r1_out   numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Витрата&lt;br /&gt;
    r2_in    numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2_out   numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tt PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.4. Службова таблиця налаштувань ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_opt (&lt;br /&gt;
    id                smallint     PRIMARY KEY DEFAULT 1 CHECK (id = 1),&lt;br /&gt;
    totals_actual_to  timestamp(0) NOT NULL,   -- ТА: підсумки розраховані до&lt;br /&gt;
    use_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    use_tno_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    min_period        timestamp(0),            -- період першого руху&lt;br /&gt;
    last_recalc_at    timestamp(0),&lt;br /&gt;
    split_merge_at    timestamp(0)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.5. Агрегат (для РН виду «Обороти») ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Агрегат «Продажі за місяцями по номенклатурі та складу» (без Партії, без Характеристики)&lt;br /&gt;
CREATE TABLE rg_a_0031_ag1 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag1 PRIMARY KEY (period, d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.6. Регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
=== 8.6.1. План рахунків (супутні таблиці) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE coa_0005 (                            -- ПланРахунків.Госпрозрахунковий&lt;br /&gt;
    ref          uuid        PRIMARY KEY,&lt;br /&gt;
    parent_ref   uuid        REFERENCES coa_0005(ref),&lt;br /&gt;
    code         varchar(20) NOT NULL,&lt;br /&gt;
    order_code   varchar(40) NOT NULL,             -- впорядкований код для ієрархічних запитів&lt;br /&gt;
    name         varchar(150) NOT NULL,&lt;br /&gt;
    acc_type     smallint    NOT NULL,             -- 0=Активний,1=Пасивний,2=Активно-пасивний&lt;br /&gt;
    off_balance  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    ed_count     smallint    NOT NULL DEFAULT 0,   -- фактична кількість субконто&lt;br /&gt;
    fl_qty       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Кількісний»&lt;br /&gt;
    fl_cur       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Валютний»&lt;br /&gt;
    marked_del   boolean     NOT NULL DEFAULT false&lt;br /&gt;
);&lt;br /&gt;
CREATE UNIQUE INDEX ux_coa_0005_code ON coa_0005 (code);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE coa_0005_ed (                         -- ТЧ «ВидиСубконто»&lt;br /&gt;
    ref        uuid     NOT NULL REFERENCES coa_0005(ref) ON DELETE CASCADE,&lt;br /&gt;
    line_no    int      NOT NULL,&lt;br /&gt;
    ed_type_r  uuid     NOT NULL,                  -- ПланВидівХарактеристик.ВидиСубконто&lt;br /&gt;
    only_tno   boolean  NOT NULL DEFAULT false,    -- «Тільки обороти»&lt;br /&gt;
    sum_flag   boolean  NOT NULL DEFAULT true,     -- «Підсумкова сума»&lt;br /&gt;
    fl_qty     boolean  NOT NULL DEFAULT false,    -- ознака обліку субконто «Кількісний»&lt;br /&gt;
    PRIMARY KEY (ref, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.2. Таблиця проводок (з кореспонденцією) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Госпрозрахунковий: dims = Організація(d1, балансове), Підрозділ(d2, небалансове)&lt;br /&gt;
--   res = Сума(r1, балансовий), Кількість(r2, небалансовий), ВалютнаСума(r3, небалансовий)&lt;br /&gt;
--   attr = Зміст(a1), Валюта(a2);  max_extdim_count = 3&lt;br /&gt;
CREATE TABLE rg_b_0020 (&lt;br /&gt;
    rec_t     smallint      NOT NULL,&lt;br /&gt;
    rec_r     uuid          NOT NULL,&lt;br /&gt;
    line_no   int           NOT NULL,&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    active    boolean       NOT NULL DEFAULT true,&lt;br /&gt;
&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
&lt;br /&gt;
    -- балансове вимірювання: одне значення на проводку&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    -- небалансове вимірювання: окремо для Дт і Кт&lt;br /&gt;
    d2_dt_r   uuid          NOT NULL,&lt;br /&gt;
    d2_kt_r   uuid          NOT NULL,&lt;br /&gt;
&lt;br /&gt;
    -- субконто Дт (3 слоти, складений тип: ПВХ-значення)&lt;br /&gt;
    ed_dt1_t  smallint, ed_dt1_r uuid,&lt;br /&gt;
    ed_dt2_t  smallint, ed_dt2_r uuid,&lt;br /&gt;
    ed_dt3_t  smallint, ed_dt3_r uuid,&lt;br /&gt;
    ed_dt_h   bigint        NOT NULL DEFAULT 0,     -- хеш набору субконто Дт (для JOIN з підсумками)&lt;br /&gt;
    -- субконто Кт&lt;br /&gt;
    ed_kt1_t  smallint, ed_kt1_r uuid,&lt;br /&gt;
    ed_kt2_t  smallint, ed_kt2_r uuid,&lt;br /&gt;
    ed_kt3_t  smallint, ed_kt3_r uuid,&lt;br /&gt;
    ed_kt_h   bigint        NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    -- балансовий ресурс: одне значення&lt;br /&gt;
    r1        numeric(20,2) NOT NULL DEFAULT 0,     -- Сума&lt;br /&gt;
    -- небалансові ресурси: пара Дт/Кт&lt;br /&gt;
    r2_dt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Дт&lt;br /&gt;
    r2_kt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Кт&lt;br /&gt;
    r3_dt     numeric(20,2) NOT NULL DEFAULT 0,     -- ВалютнаСума Дт&lt;br /&gt;
    r3_kt     numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    a1        varchar(255),&lt;br /&gt;
    a2_r      uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_period  ON rg_b_0020 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_dt  ON rg_b_0020 (acc_dt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_kt  ON rg_b_0020 (acc_kt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_dt   ON rg_b_0020 (ed_dt1_t, ed_dt1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №2.&#039;&#039;&#039; Субконто зберігаються &#039;&#039;&#039;слотами в основній таблиці&#039;&#039;&#039;, а не в дочірній таблиці «ключ-значення». Обґрунтування: (а) віртуальні таблиці &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; з відбором за субконто перетворюються на предикат по колонці замість &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; самоз&#039;єднань; (б) кількість субконто жорстко обмежена (≤5) — «широка» таблиця прийнятна; (в) 1С використовує гібрид (&amp;lt;code&amp;gt;_AccRgED&amp;lt;/code&amp;gt;), що дає складніші плани. &#039;&#039;&#039;Ціна:&#039;&#039;&#039; зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; = реструктуризація таблиці. Альтернатива (дочірня таблиця &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;) описана в Додатку Б і зберігається як план «Б» за результатами навантажувального тесту НТ-04.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.6.3. Таблиця проводок (без кореспонденції) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_b_0021 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    acc_mvt  smallint     NOT NULL CHECK (acc_mvt IN (0,1)),  -- 0=Дебет, 1=Кредит&lt;br /&gt;
    acc_r    uuid         NOT NULL REFERENCES coa_0006(ref),&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    ed1_t smallint, ed1_r uuid,&lt;br /&gt;
    ed2_t smallint, ed2_r uuid,&lt;br /&gt;
    ed3_t smallint, ed3_r uuid,&lt;br /&gt;
    ed_h     bigint       NOT NULL DEFAULT 0,&lt;br /&gt;
    r1       numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0021 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.4. Підсумки РБ ===&lt;br /&gt;
Підсумки будуються на кількох «рівнях субконто» — щоб запит без відбору за субконто не сканував найдетальнішу таблицю.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Рівень 0: залишки по рахунку + балансові вимірювання (без субконто)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,               -- Організація (балансове)&lt;br /&gt;
    r1       numeric(24,2) NOT NULL,               -- Сума: &amp;gt;0 = дебетовий, &amp;lt;0 = кредитовий залишок&lt;br /&gt;
    r2       numeric(24,3) NOT NULL,               -- Кількість&lt;br /&gt;
    r3       numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Рівень 1..3: залишки з розшифровкою по субконто (тільки для рахунків з ed_count &amp;gt;= k)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb1 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t   smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb1 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE rg_b_0020_tb2 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    ed2_t smallint NOT NULL, ed2_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb2 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, ed2_t, ed2_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- rg_b_0020_tb3 — аналогічно, 3 субконто&lt;br /&gt;
&lt;br /&gt;
-- Обороти (аналогічні рівні): tt0..tt3&lt;br /&gt;
CREATE TABLE rg_b_0020_tt0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    r1_dt numeric(24,2) NOT NULL, r1_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    r2_dt numeric(24,3) NOT NULL, r2_kt numeric(24,3) NOT NULL,&lt;br /&gt;
    r3_dt numeric(24,2) NOT NULL, r3_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tt0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Обороти між рахунками (кореспонденції)&lt;br /&gt;
CREATE TABLE rg_b_0020_tc (&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter  smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL,&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL,&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    r1        numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tc PRIMARY KEY (period, acc_dt_r, acc_kt_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Правило запису рівнів:&#039;&#039;&#039; для проводки з рахунком, що має &amp;lt;code&amp;gt;ed_count = k&amp;lt;/code&amp;gt;, оновлюються таблиці &amp;lt;code&amp;gt;tb0 … tbK&amp;lt;/code&amp;gt; (k+1 таблиць). Рахунки без субконто оновлюють лише &amp;lt;code&amp;gt;tb0&amp;lt;/code&amp;gt;. Субконто з ознакою «Тільки обороти» не потрапляють у &amp;lt;code&amp;gt;tb*&amp;lt;/code&amp;gt;, лише в &amp;lt;code&amp;gt;tt*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.7. Регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Нарахування: dims = Співробітник(d1, базове), Підрозділ(d2)&lt;br /&gt;
--              res  = Результат(r1), ВідпрацьованоДнів(r2), НормаДнів(r3)&lt;br /&gt;
--              attr = Графік(a1)&lt;br /&gt;
CREATE TABLE rg_c_0040 (&lt;br /&gt;
    rec_t        smallint      NOT NULL,&lt;br /&gt;
    rec_r        uuid          NOT NULL,&lt;br /&gt;
    line_no      int           NOT NULL,&lt;br /&gt;
    period       timestamp(0)  NOT NULL,      -- період реєстрації (початок місяця)&lt;br /&gt;
    active       boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    reversal     boolean       NOT NULL DEFAULT false,   -- Сторно&lt;br /&gt;
    calc_type_r  uuid          NOT NULL,                 -- ВидРозрахунку → pct_0011(ref)&lt;br /&gt;
    act_begin    timestamp(0)  NOT NULL,      -- ПеріодДіїПочаток&lt;br /&gt;
    act_end      timestamp(0)  NOT NULL,      -- ПеріодДіїКінець&lt;br /&gt;
    base_begin   timestamp(0),                -- БазовийПеріодПочаток&lt;br /&gt;
    base_end     timestamp(0),                -- БазовийПеріодКінець&lt;br /&gt;
    d1_r         uuid          NOT NULL,&lt;br /&gt;
    d2_r         uuid          NOT NULL,&lt;br /&gt;
    r1           numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    r3           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    a1_r         uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040 PRIMARY KEY (rec_t, rec_r, line_no),&lt;br /&gt;
    CONSTRAINT chk_rg_c_0040_act CHECK (act_end &amp;gt;= act_begin)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_period ON rg_c_0040 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_d1     ON rg_c_0040 (d1_r, period, calc_type_r) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_act    ON rg_c_0040 (d1_r, act_begin, act_end) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_base   ON rg_c_0040 (d1_r, calc_type_r, base_begin, base_end) WHERE active;&lt;br /&gt;
&lt;br /&gt;
-- Фактичні періоди дії (після витіснення). Один запис → 0..N інтервалів.&lt;br /&gt;
CREATE TABLE rg_c_0040_ap (&lt;br /&gt;
    rec_t       smallint     NOT NULL,&lt;br /&gt;
    rec_r       uuid         NOT NULL,&lt;br /&gt;
    line_no     int          NOT NULL,&lt;br /&gt;
    interval_no smallint     NOT NULL,&lt;br /&gt;
    calc_type_r uuid         NOT NULL,&lt;br /&gt;
    d1_r        uuid         NOT NULL,        -- денормалізація базового вимірювання для швидкого JOIN&lt;br /&gt;
    fact_begin  timestamp(0) NOT NULL,&lt;br /&gt;
    fact_end    timestamp(0) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_ap PRIMARY KEY (rec_t, rec_r, line_no, interval_no),&lt;br /&gt;
    CONSTRAINT fk_rg_c_0040_ap FOREIGN KEY (rec_t, rec_r, line_no)&lt;br /&gt;
        REFERENCES rg_c_0040 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_ap_d1 ON rg_c_0040_ap (d1_r, fact_begin, fact_end);&lt;br /&gt;
&lt;br /&gt;
-- Перерахунок «ПерерахунокЗаБазою»&lt;br /&gt;
CREATE TABLE rg_c_0040_rc1 (&lt;br /&gt;
    rec_t        smallint NOT NULL,     -- реєстратор запису, який треба перерахувати&lt;br /&gt;
    rec_r        uuid     NOT NULL,&lt;br /&gt;
    calc_type_r  uuid     NOT NULL,     -- вид розрахунку, що потребує перерахунку&lt;br /&gt;
    d1_r         uuid     NOT NULL,     -- вимірювання перерахунку «Співробітник»&lt;br /&gt;
    src_rec_t    smallint NOT NULL,     -- реєстратор, що спричинив перерахунок&lt;br /&gt;
    src_rec_r    uuid     NOT NULL,&lt;br /&gt;
    created_at   timestamp(0) NOT NULL DEFAULT now(),&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_rc1 PRIMARY KEY (rec_t, rec_r, calc_type_r, d1_r)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_rc1_src ON rg_c_0040_rc1 (src_rec_t, src_rec_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.8. Зведення: які таблиці породжує кожен тип регістру ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
РВ (незалежний)          →  rg_i_&amp;lt;id&amp;gt;&lt;br /&gt;
РВ (підпорядкований)     →  rg_i_&amp;lt;id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
РН (Залишки)             →  rg_a_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_tb        (якщо ДозволитиПідсумкиЗалишків)&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_tt        (якщо ДозволитиПідсумкиОборотів)&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_opt&lt;br /&gt;
&lt;br /&gt;
РН (Обороти)             →  rg_a_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_tt&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_ag1..agN  (агрегати)&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_opt&lt;br /&gt;
&lt;br /&gt;
РБ                       →  rg_b_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_tb0 .. _tbK   (K = МаксКількістьСубконто)&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_tt0 .. _ttK&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_tc&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_opt&lt;br /&gt;
&lt;br /&gt;
РР                       →  rg_c_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_c_&amp;lt;id&amp;gt;_ap&lt;br /&gt;
                            rg_c_&amp;lt;id&amp;gt;_rc1 .. _rcM   (перерахунки)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оцінка: для РБ з &amp;lt;code&amp;gt;МаксКількістьСубконто = 3&amp;lt;/code&amp;gt; генерується &#039;&#039;&#039;10 фізичних таблиць&#039;&#039;&#039; на один регістр.&lt;br /&gt;
&lt;br /&gt;
= 9. ER-моделі =&lt;br /&gt;
&lt;br /&gt;
== 9.1. ER-модель метаданих (репозиторій) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_type&amp;quot; as T {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * kind : varchar(20)&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  table_name : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register&amp;quot; as R {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK,FK→md_type&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * kind : varchar(12)&lt;br /&gt;
  * write_mode : varchar(24)&lt;br /&gt;
  * periodicity : varchar(24)&lt;br /&gt;
  accumulation_kind : varchar(10)&lt;br /&gt;
  enable_bal_totals : boolean&lt;br /&gt;
  enable_tno_totals : boolean&lt;br /&gt;
  tno_totals_period : varchar(6)&lt;br /&gt;
  split_totals : boolean&lt;br /&gt;
  chart_of_accounts_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  correspondence : boolean&lt;br /&gt;
  max_extdim_count : smallint&lt;br /&gt;
  calc_types_plan_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_period_mode : varchar(24)&lt;br /&gt;
  schedule_register_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
  * struct_version : int&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_field&amp;quot; as F {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * role : Dimension|Resource|Attribute&lt;br /&gt;
  * data_type_expr : text&lt;br /&gt;
  is_composite : boolean&lt;br /&gt;
  index_mode : varchar(28)&lt;br /&gt;
  is_master : boolean&lt;br /&gt;
  is_balance : boolean&lt;br /&gt;
  is_base_dimension : boolean&lt;br /&gt;
  accounting_flag : varchar(80)&lt;br /&gt;
  * column_prefix : varchar(8)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recorder&amp;quot; as RR {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * doc_type_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate&amp;quot; as AG {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * periodicity : Day|Month|Quarter|Year&lt;br /&gt;
  is_realtime : boolean&lt;br /&gt;
  actual_upto : timestamp&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate_dim&amp;quot; as AGD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * aggregate_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * field_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc&amp;quot; as RC {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc_dim&amp;quot; as RCD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * recalc_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * reg_field_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
T ||--o| R          : &amp;quot;є регістром&amp;quot;&lt;br /&gt;
T ||--o{ RR         : &amp;quot;тип документа&amp;quot;&lt;br /&gt;
R ||--|{ F          : &amp;quot;має поля&amp;quot;&lt;br /&gt;
R ||--o{ RR         : &amp;quot;реєстратори&amp;quot;&lt;br /&gt;
R ||--o{ AG         : &amp;quot;агрегати&amp;quot;&lt;br /&gt;
AG ||--|{ AGD       : &amp;quot;склад вимірювань&amp;quot;&lt;br /&gt;
F  ||--o{ AGD       : &amp;quot;вимірювання&amp;quot;&lt;br /&gt;
R ||--o{ RC         : &amp;quot;перерахунки&amp;quot;&lt;br /&gt;
RC ||--|{ RCD       : &amp;quot;вимірювання перерахунку&amp;quot;&lt;br /&gt;
F  ||--o{ RCD       : &amp;quot;відповідає&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план рахунків&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план видів розрахунку&amp;quot;&lt;br /&gt;
R }o--o| R          : &amp;quot;графік часу&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.2. ER-модель: регістр накопичення (вид «Залишки») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0002\n«ПрихіднаНакладна»&amp;quot; as D1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;doc_0003\n«ВидатковаНакладна»&amp;quot; as D2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0001\n«Номенклатура»&amp;quot; as C1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0004\n«Склади»&amp;quot; as C2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012\n«ТовариНаСкладах» (рухи)&amp;quot; as M {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * mvt : smallint  «0=Прихід,1=Витрата»&lt;br /&gt;
  * d1_r : uuid  «Номенклатура» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid  «Склад» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint «Партія:тип»&lt;br /&gt;
  * d3_r : uuid  «Партія:посилання»&lt;br /&gt;
  * d4_r : uuid  «Характеристика» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * r1 : numeric(15,3) «Кількість»&lt;br /&gt;
  * r2 : numeric(15,2) «Сума»&lt;br /&gt;
  a1 : varchar(200) «Коментар»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tb\nпідсумки залишків&amp;quot; as TB {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * r1 : numeric(20,3) «Кількість (±)»&lt;br /&gt;
  * r2 : numeric(20,2) «Сума (±)»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tt\nпідсумки оборотів&amp;quot; as TT {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_in, r1_out : numeric(20,3)&lt;br /&gt;
  r2_in, r2_out : numeric(20,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_opt&amp;quot; as OPT {&lt;br /&gt;
  * id : smallint = 1 &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * totals_actual_to : timestamp(0)&lt;br /&gt;
  use_bal_totals : boolean&lt;br /&gt;
  use_tno_totals : boolean&lt;br /&gt;
  min_period : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
D1 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
D2 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
C1 ||--o{ M : &amp;quot;d1_r&amp;quot;&lt;br /&gt;
C2 ||--o{ M : &amp;quot;d2_r&amp;quot;&lt;br /&gt;
M }o..|| TB : &amp;quot;агрегується в\n(підтримується платформою)&amp;quot;&lt;br /&gt;
M }o..|| TT : &amp;quot;агрегується в&amp;quot;&lt;br /&gt;
OPT ||..|| TB : &amp;quot;ТА підсумків&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note bottom of M&lt;br /&gt;
  PK = (rec_t, rec_r, line_no)&lt;br /&gt;
  → усі рухи одного документа&lt;br /&gt;
    фізично суміжні&lt;br /&gt;
  Партиціонування: RANGE(period)&lt;br /&gt;
end note&lt;br /&gt;
&lt;br /&gt;
note bottom of TB&lt;br /&gt;
  period = MAXPERIOD (&#039;5999-11-01&#039;)&lt;br /&gt;
  → рядок «залишок за всі періоди»&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.3. ER-модель: регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;coa_0005\n«План рахунків»&amp;quot; as A {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  parent_ref : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * code : varchar(20) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  order_code : varchar(40)&lt;br /&gt;
  * name : varchar(150)&lt;br /&gt;
  * acc_type : smallint «Акт/Пас/АП»&lt;br /&gt;
  off_balance : boolean&lt;br /&gt;
  ed_count : smallint&lt;br /&gt;
  fl_qty, fl_cur : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;coa_0005_ed\n«Види субконто рахунку»&amp;quot; as AE {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * ed_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  only_tno : boolean&lt;br /&gt;
  sum_flag : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cvt_0009\n«ПВХ.ВидиСубконто»&amp;quot; as VT {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  value_type : text&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020\n«Госпрозрахунковий» (проводки)&amp;quot; as J {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * acc_dt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid «Організація (балансове)»&lt;br /&gt;
  * d2_dt_r : uuid «Підрозділ Дт»&lt;br /&gt;
  * d2_kt_r : uuid «Підрозділ Кт»&lt;br /&gt;
  ed_dt1_t/_r .. ed_dt3_t/_r : «субконто Дт»&lt;br /&gt;
  ed_dt_h : bigint&lt;br /&gt;
  ed_kt1_t/_r .. ed_kt3_t/_r : «субконто Кт»&lt;br /&gt;
  ed_kt_h : bigint&lt;br /&gt;
  * r1 : numeric(20,2) «Сума (балансовий)»&lt;br /&gt;
  r2_dt, r2_kt : numeric(20,3) «Кількість»&lt;br /&gt;
  r3_dt, r3_kt : numeric(20,2) «ВалютнаСума»&lt;br /&gt;
  a1 : varchar(255) «Зміст»&lt;br /&gt;
  a2_r : uuid «Валюта»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb0\nзалишки, рівень 0&amp;quot; as B0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric «знакові»&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb1..tb3\nзалишки, рівні 1..3&amp;quot; as B1 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * ed1_t, ed1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed2_t, ed2_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed3_t, ed3_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tt0..tt3\nобороти за рівнями&amp;quot; as T0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed…) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_dt, r1_kt&lt;br /&gt;
  r2_dt, r2_kt&lt;br /&gt;
  r3_dt, r3_kt&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tc\nобороти Дт↔Кт&amp;quot; as TC {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_dt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric(24,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
A ||--o{ AE : &amp;quot;види субконто&amp;quot;&lt;br /&gt;
VT ||--o{ AE : &amp;quot;тип субконто&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_dt_r&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_kt_r&amp;quot;&lt;br /&gt;
A ||--o{ B0 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
A ||--o{ B1 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
J }o..|| B0 : &amp;quot;агрегується (Дт: +, Кт: −)&amp;quot;&lt;br /&gt;
J }o..|| B1 : &amp;quot;агрегується, якщо ed_count ≥ k&amp;quot;&lt;br /&gt;
J }o..|| T0 : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
J }o..|| TC : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note right of J&lt;br /&gt;
  Балансовий ресурс r1 — одне значення,&lt;br /&gt;
  контроль Σ(Дт) = Σ(Кт) у межах реєстратора.&lt;br /&gt;
  Небалансові ресурси — пара Дт/Кт.&lt;br /&gt;
  Субконто — слоти (див. Рішення №2).&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.4. ER-модель: регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;pct_0011\n«ПВР.ОсновніНарахування»&amp;quot; as P {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_dependency : varchar(24)&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_base\n«Базові види розрахунку»&amp;quot; as PB {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * base_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_displace\n«Витісняючі види розрахунку»&amp;quot; as PD {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * displacing_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_lead\n«Ведучі види розрахунку»&amp;quot; as PL {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * leading_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040\n«Нарахування» (рухи)&amp;quot; as CR {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0) «період реєстрації»&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * reversal : boolean «Сторно»&lt;br /&gt;
  * calc_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * act_begin : timestamp(0)&lt;br /&gt;
  * act_end : timestamp(0)&lt;br /&gt;
  base_begin : timestamp(0)&lt;br /&gt;
  base_end : timestamp(0)&lt;br /&gt;
  * d1_r : uuid «Співробітник (базове)»&lt;br /&gt;
  * d2_r : uuid «Підрозділ»&lt;br /&gt;
  r1 : numeric «Результат»&lt;br /&gt;
  r2 : numeric «ВідпрацьованоДнів»&lt;br /&gt;
  r3 : numeric «НормаДнів»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_ap\nфактичні періоди дії&amp;quot; as AP {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * interval_no : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * calc_type_r : uuid&lt;br /&gt;
  * d1_r : uuid&lt;br /&gt;
  * fact_begin : timestamp(0)&lt;br /&gt;
  * fact_end : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_rc1\n«ПерерахунокЗаБазою»&amp;quot; as RC {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * calc_type_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  src_rec_t, src_rec_r&lt;br /&gt;
  created_at&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_i_0015\n«ГрафікРоботи» (РВ)&amp;quot; as SCH {&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ВидГрафіка»&lt;br /&gt;
  * d2_d : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ДатаГрафіка»&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric «Значення»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0007\n«НарахуванняЗарплати»&amp;quot; as DOC {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number, date, posted&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
P ||--o{ CR  : &amp;quot;calc_type_r&amp;quot;&lt;br /&gt;
P ||--o{ PB  : &amp;quot;базові&amp;quot;&lt;br /&gt;
P ||--o{ PD  : &amp;quot;витісняючі&amp;quot;&lt;br /&gt;
P ||--o{ PL  : &amp;quot;ведучі&amp;quot;&lt;br /&gt;
DOC ||..o{ CR : &amp;quot;реєстратор&amp;quot;&lt;br /&gt;
CR ||--|{ AP : &amp;quot;1 запис → 0..N\nфактичних інтервалів&amp;quot;&lt;br /&gt;
CR }o..o{ RC : &amp;quot;потребує перерахунку&amp;quot;&lt;br /&gt;
SCH }o..o{ CR : &amp;quot;ДаніГрафіка\n(віртуальна таблиця)&amp;quot;&lt;br /&gt;
CR }o..o{ CR : &amp;quot;БазаРозрахунку\n(self-join через PB\nта базові вимірювання)&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.5. Зведена концептуальна ER (усі типи) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph ER {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=record, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9, style=filled];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  MD  [label=&amp;quot;{md_register|id (PK)\lname\lkind\lperiodicity\lwrite_mode\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDF [label=&amp;quot;{md_register_field|register_id (PK,FK)\lid (PK)\lname\lrole\ldata_type\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDR [label=&amp;quot;{md_register_recorder|register_id (PK,FK)\ldoc_type_id (PK,FK)\l}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  DOC [label=&amp;quot;{doc_XXXX (Документ)|ref (PK)\lnumber\ldate\lposted\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  CAT [label=&amp;quot;{cat_XXXX (Довідник)|ref (PK)\lcode\lname\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  COA [label=&amp;quot;{coa_XXXX (План рахунків)|ref (PK)\lcode\lacc_type\led_count\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  PCT [label=&amp;quot;{pct_XXXX (ПВР)|ref (PK)\lcode\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI  [label=&amp;quot;{rg_i_XXXX (РВ)|period (PK*)\ld1..dN (PK*)\l| rec_t,rec_r,line_no (PK**)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA  [label=&amp;quot;{rg_a_XXXX (РН)|rec_t, rec_r, line_no (PK)\lperiod\lactive\lmvt\ld1..dN\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  RAT [label=&amp;quot;{rg_a_XXXX_tb / _tt|period (PK)\ld1..dN (PK)\lsplitter (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  RB  [label=&amp;quot;{rg_b_XXXX (РБ)|rec_t, rec_r, line_no (PK)\lperiod, active\lacc_dt_r, acc_kt_r\led_dt1..3, ed_kt1..3\ld1..dN\lr1, r2_dt/r2_kt\l}&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RBT [label=&amp;quot;{rg_b_XXXX_tb0..tbK\lrg_b_XXXX_tt0..ttK\lrg_b_XXXX_tc|period, acc_r, d1..dN\led1..edK (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;];&lt;br /&gt;
  RC  [label=&amp;quot;{rg_c_XXXX (РР)|rec_t, rec_r, line_no (PK)\lperiod, active, reversal\lcalc_type_r\lact_begin, act_end\lbase_begin, base_end\ld1..dN, r1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
  RCA [label=&amp;quot;{rg_c_XXXX_ap|rec_t,rec_r,line_no (PK,FK)\linterval_no (PK)\lfact_begin, fact_end\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
  RCR [label=&amp;quot;{rg_c_XXXX_rc1..rcM|rec_t, rec_r (PK)\lcalc_type_r (PK)\ld1..dN (PK)\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  MD  -&amp;gt; MDF [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; MDR [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MDR -&amp;gt; DOC [label=&amp;quot;тип&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; COA [label=&amp;quot;0:1 план рахунків&amp;quot;, style=dashed];&lt;br /&gt;
  MD  -&amp;gt; PCT [label=&amp;quot;0:1 ПВР&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  MD -&amp;gt; RI [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RA [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RB [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RC [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
&lt;br /&gt;
  DOC -&amp;gt; RI [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RA [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RB [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RC [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  CAT -&amp;gt; RI [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  CAT -&amp;gt; RA [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  COA -&amp;gt; RB [label=&amp;quot;FK рахунок&amp;quot;];&lt;br /&gt;
  PCT -&amp;gt; RC [label=&amp;quot;FK вид розрах.&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RA -&amp;gt; RAT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RB -&amp;gt; RBT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RC -&amp;gt; RCA [label=&amp;quot;витіснення → 1:N&amp;quot;, color=purple];&lt;br /&gt;
  RC -&amp;gt; RCR [label=&amp;quot;реєстрація перерахунків&amp;quot;, color=purple, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  { rank=same; MD; MDF; MDR; }&lt;br /&gt;
  { rank=same; RI; RA; RB; RC; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Легенда:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;(PK*)&amp;lt;/code&amp;gt; — ключ для незалежного РВ; &amp;lt;code&amp;gt;(PK**)&amp;lt;/code&amp;gt; — для підпорядкованого.&lt;br /&gt;
* Пунктир «реєстратор» — логічний зв&#039;язок без FK (поліморфне посилання, підтримується платформою).&lt;br /&gt;
* Пунктир «генерує DDL» — метадані → фізична схема (не зв&#039;язок даних).&lt;br /&gt;
&lt;br /&gt;
= 10. Ключові алгоритми =&lt;br /&gt;
&lt;br /&gt;
== 10.1. Запис набору записів (режим «Заміщати») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ЗАПИСАТИ_НАБІР(регістр R, відбір S, записи N[]):&lt;br /&gt;
  1. Перевірити права (Додавання/Зміна)&lt;br /&gt;
  2. Валідація: тип реєстратора ∈ md_register_recorder;&lt;br /&gt;
                вимірювання з deny_empty ≠ порожнє;&lt;br /&gt;
                для РБ — Σ(r1 де балансовий) по Дт = по Кт у межах реєстратора&lt;br /&gt;
  3. У транзакції:&lt;br /&gt;
     3.1. СТАРІ := SELECT * FROM rg_x WHERE &amp;lt;відбір S&amp;gt; FOR UPDATE&lt;br /&gt;
     3.2. Δ := АГРЕГУВАТИ(N, +1) ⊕ АГРЕГУВАТИ(СТАРІ, −1)   // тільки active&lt;br /&gt;
     3.3. DELETE FROM rg_x WHERE &amp;lt;відбір S&amp;gt;&lt;br /&gt;
     3.4. INSERT INTO rg_x SELECT ... FROM N&lt;br /&gt;
     3.5. ОНОВИТИ_ПІДСУМКИ(R, Δ)                          // див. 10.2&lt;br /&gt;
     3.6. ЯКЩО R.kind = Calculation:&lt;br /&gt;
              ПЕРЕРАХУВАТИ_ФАКТИЧНІ_ПЕРІОДИ(R, зачеплені вимірювання)  // 10.4&lt;br /&gt;
              ЗАРЕЄСТРУВАТИ_ПЕРЕРАХУНКИ(R, N ∪ СТАРІ)                  // 10.5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.2. Інкрементальне оновлення підсумків залишків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Δ (delta) — тимчасова таблиця: (period_month, d1_r, d2_r, d3_t, d3_r, d4_r, dr1, dr2)&lt;br /&gt;
-- де dr = Σ (CASE WHEN mvt = 0 THEN +значення ELSE -значення END)&lt;br /&gt;
&lt;br /&gt;
-- Крок 1. Кумулятивні залишки: рух у місяці M впливає на підсумки всіх періодів &amp;gt; M&lt;br /&gt;
--         та на рядок MAXPERIOD.&lt;br /&gt;
INSERT INTO rg_a_0012_tb AS t (period, splitter, d1_r, d2_r, d3_t, d3_r, d4_r, r1, r2)&lt;br /&gt;
SELECT p.period, :splitter, d.d1_r, d.d2_r, d.d3_t, d.d3_r, d.d4_r, d.dr1, d.dr2&lt;br /&gt;
FROM   delta d&lt;br /&gt;
CROSS  JOIN LATERAL (&lt;br /&gt;
         SELECT period FROM totals_periods&lt;br /&gt;
         WHERE period &amp;gt;  d.period_month&lt;br /&gt;
           AND period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
         UNION ALL SELECT TIMESTAMP &#039;5999-11-01&#039;      -- MAXPERIOD&lt;br /&gt;
       ) p&lt;br /&gt;
ORDER BY 1,3,4,5,6,7                                   -- детермінований порядок → без дедлоків&lt;br /&gt;
ON CONFLICT (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
DO UPDATE SET r1 = t.r1 + EXCLUDED.r1,&lt;br /&gt;
              r2 = t.r2 + EXCLUDED.r2;&lt;br /&gt;
&lt;br /&gt;
-- Крок 2. Прибирання нульових рядків (регламентно, не в транзакції проведення)&lt;br /&gt;
DELETE FROM rg_a_0012_tb WHERE r1 = 0 AND r2 = 0 AND period &amp;lt;&amp;gt; TIMESTAMP &#039;5999-11-01&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Оптимізація.&#039;&#039;&#039; Крок 1 у наведеному вигляді має складність O(кількість_періодів_після_руху). Для рухів «заднім числом» на роки це дорого. &#039;&#039;&#039;Проєктне рішення №3:&#039;&#039;&#039; підсумки оновлюються тільки для рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; і для найближчої межі періоду; повні кумулятивні зрізи перебудовуються регламентним завданням «Перерахунок підсумків» за зміненими місяцями (список змінених місяців накопичується в &amp;lt;code&amp;gt;rg_a_0012_opt.dirty_months&amp;lt;/code&amp;gt;). Запити на дату в «брудному» місяці автоматично перемикаються на розрахунок від найближчого чистого зрізу. Остаточний вибір — за результатами НТ-02.}}&lt;br /&gt;
&lt;br /&gt;
== 10.3. Трансляція віртуальної таблиці «Залишки» ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрНакопичення.ТовариНаСкладах.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад)&lt;br /&gt;
WITH boundary AS (&lt;br /&gt;
    SELECT COALESCE(MAX(period), TIMESTAMP &#039;0001-01-01&#039;) AS p&lt;br /&gt;
    FROM   totals_periods&lt;br /&gt;
    WHERE  period &amp;lt;= :Період&lt;br /&gt;
      AND  period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
),&lt;br /&gt;
base AS (                                    -- залишок на межу періоду з підсумків&lt;br /&gt;
    SELECT t.d1_r, t.d2_r, t.d3_t, t.d3_r, t.d4_r,&lt;br /&gt;
           SUM(t.r1) AS r1, SUM(t.r2) AS r2&lt;br /&gt;
    FROM   rg_a_0012_tb t, boundary b&lt;br /&gt;
    WHERE  t.period = b.p&lt;br /&gt;
      AND  t.d2_r  = :Склад                  -- push-down параметра ВТ&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
),&lt;br /&gt;
tail AS (                                    -- «живі» рухи після межі й до &amp;amp;Період&lt;br /&gt;
    SELECT m.d1_r, m.d2_r, m.d3_t, m.d3_r, m.d4_r,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r1 ELSE -m.r1 END) AS r1,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r2 ELSE -m.r2 END) AS r2&lt;br /&gt;
    FROM   rg_a_0012 m, boundary b&lt;br /&gt;
    WHERE  m.active&lt;br /&gt;
      AND  m.period &amp;gt;  b.p&lt;br /&gt;
      AND  m.period &amp;lt;= :Період&lt;br /&gt;
      AND  m.d2_r   =  :Склад&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
)&lt;br /&gt;
SELECT d1_r AS &amp;quot;Номенклатура&amp;quot;, d2_r AS &amp;quot;Склад&amp;quot;,&lt;br /&gt;
       d3_t, d3_r AS &amp;quot;Партія&amp;quot;, d4_r AS &amp;quot;Характеристика&amp;quot;,&lt;br /&gt;
       SUM(r1) AS &amp;quot;КількістьЗалишок&amp;quot;,&lt;br /&gt;
       SUM(r2) AS &amp;quot;СумаЗалишок&amp;quot;&lt;br /&gt;
FROM  (SELECT * FROM base UNION ALL SELECT * FROM tail) u&lt;br /&gt;
GROUP BY 1,2,3,4,5&lt;br /&gt;
HAVING SUM(r1) &amp;lt;&amp;gt; 0 OR SUM(r2) &amp;lt;&amp;gt; 0;         -- нульові залишки не повертаються&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Оптимізація для найчастішого випадку:&#039;&#039;&#039; якщо &amp;lt;code&amp;gt;:Період ≥ ТА&amp;lt;/code&amp;gt; і в регістрі немає рухів у майбутньому — &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; читається з рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; одним index seek, &amp;lt;code&amp;gt;tail&amp;lt;/code&amp;gt; = ∅.&lt;br /&gt;
&lt;br /&gt;
== 10.4. Розрахунок фактичних періодів дії (витіснення) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ПЕРЕРАХУВАТИ_ФАКТИЧНІ_ПЕРІОДИ(регістр R, множина ключів K):&lt;br /&gt;
  ДЛЯ кожного ключа k ∈ K:            // k = кортеж значень усіх вимірювань R&lt;br /&gt;
    Z := SELECT * FROM rg_c_X&lt;br /&gt;
         WHERE вимірювання = k AND active&lt;br /&gt;
         ORDER BY &amp;lt;пріоритет виду розрахунку за ПВР&amp;gt;, period, line_no&lt;br /&gt;
    // пріоритет: A витісняється B, якщо B ∈ ПВР[A].ВитісняючіВидиРозрахунку&lt;br /&gt;
&lt;br /&gt;
    DELETE FROM rg_c_X_ap WHERE (rec,line) ∈ Z&lt;br /&gt;
&lt;br /&gt;
    ДЛЯ кожного запису z ∈ Z (у порядку зростання пріоритету, тобто найслабші — першими):&lt;br /&gt;
      I := { [z.act_begin, z.act_end] }&lt;br /&gt;
      ДЛЯ кожного w ∈ Z, де ВидРозрахунку(w) витісняє ВидРозрахунку(z)&lt;br /&gt;
                         І перетинаються періоди реєстрації за правилами ПВР:&lt;br /&gt;
        I := I \ [w.act_begin, w.act_end]        // різниця множин інтервалів&lt;br /&gt;
      n := 0&lt;br /&gt;
      ДЛЯ кожного інтервалу i ∈ I (упорядковано):&lt;br /&gt;
        INSERT INTO rg_c_X_ap&lt;br /&gt;
          VALUES (z.rec_t, z.rec_r, z.line_no, n, z.calc_type_r, z.d1_r, i.begin, i.end)&lt;br /&gt;
        n := n + 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Складність:&#039;&#039;&#039; O(|Z|² ) на ключ. Обмеження: якщо &amp;lt;code&amp;gt;|Z| &amp;gt; 500&amp;lt;/code&amp;gt; для одного ключа — попередження в журналі та перехід на алгоритм замітання (sweep line) O(|Z| log |Z|).&lt;br /&gt;
&lt;br /&gt;
== 10.5. Реєстрація перерахунків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ЗАРЕЄСТРУВАТИ_ПЕРЕРАХУНКИ(регістр R, змінені записи Z):&lt;br /&gt;
  ДЛЯ кожного перерахунку P ∈ R.Перерахунки:&lt;br /&gt;
    ДЛЯ кожного z ∈ Z:&lt;br /&gt;
      // знайти всі записи, для яких z є базовим&lt;br /&gt;
      залежні := SELECT DISTINCT rec_t, rec_r, calc_type_r, &amp;lt;вимірювання P&amp;gt;&lt;br /&gt;
                 FROM   rg_c_X q&lt;br /&gt;
                 JOIN   pct_base b ON b.ref = q.calc_type_r&lt;br /&gt;
                                  AND b.base_type_r = z.calc_type_r&lt;br /&gt;
                 WHERE  q.active&lt;br /&gt;
                   AND  &amp;lt;вимірювання P у q&amp;gt; = &amp;lt;вимірювання P у z&amp;gt;&lt;br /&gt;
                   AND  ( (R.base_period_mode = &#039;ByActionPeriod&#039;&lt;br /&gt;
                            AND [z.act_begin, z.act_end] ∩ [q.base_begin, q.base_end] ≠ ∅)&lt;br /&gt;
                       OR (R.base_period_mode = &#039;ByRegistrationPeriod&#039;&lt;br /&gt;
                            AND z.period BETWEEN q.base_begin AND q.base_end) )&lt;br /&gt;
                   AND  (q.rec_t, q.rec_r) ≠ (z.rec_t, z.rec_r)&lt;br /&gt;
      INSERT INTO rg_c_X_rc&amp;lt;n&amp;gt; ... ON CONFLICT DO NOTHING&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.6. Зріз останніх ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрВідомостей.КурсиВалют.ЗрізОстанніх(&amp;amp;Дата, Валюта В (&amp;amp;Список))&lt;br /&gt;
SELECT DISTINCT ON (r.d1_r)&lt;br /&gt;
       r.d1_r AS &amp;quot;Валюта&amp;quot;, r.period AS &amp;quot;Період&amp;quot;, r.r1 AS &amp;quot;Курс&amp;quot;, r.r2 AS &amp;quot;Кратність&amp;quot;&lt;br /&gt;
FROM   rg_i_0007 r&lt;br /&gt;
WHERE  r.period &amp;lt;= :Дата&lt;br /&gt;
  AND  r.d1_r = ANY (:Список)&lt;br /&gt;
ORDER  BY r.d1_r, r.period DESC;       -- використовує ix_rg_i_0007_d1 (d1_r, period DESC)&lt;br /&gt;
-- Для MS SQL: ROW_NUMBER() OVER (PARTITION BY d1_r ORDER BY period DESC) = 1&lt;br /&gt;
--             або OUTER APPLY (SELECT TOP 1 ...) для великих списків.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 11. Нефункціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 11.1. Продуктивність ==&lt;br /&gt;
Еталонний стенд: 16 vCPU, 128 ГБ RAM, NVMe, PostgreSQL 15, БД 1,5 ТБ.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Операція !! Обсяг !! Ціль (P95)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01 || Залишки на поточну дату, відбір за 1 вимірюванням || 1 млрд рухів, 20 млн рядків підсумків || ≤ 200 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-02 || Залишки на довільну дату в межах ТА || те саме || ≤ 400 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-03 || Обороти за 12 місяців із групуванням || 1 млрд рухів || ≤ 2 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-04 || Проведення документа зі 100 рядками рухів (3 регістри) || — || ≤ 300 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-05 || Оборотно-сальдова відомість по всіх рахунках за місяць || 200 млн проводок || ≤ 5 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-06 || Розрахунок ЗП: 10 000 співробітників × 8 видів розрахунку || — || ≤ 10 хв&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-07 || Зріз останніх по 5 000 елементів вимірювання || 50 млн записів РВ || ≤ 500 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-08 || Пропускна здатність проведення || — || ≥ 50 док/с (10 паралельних сеансів)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-09 || Перерахунок підсумків РН || 1 млрд рухів || ≤ 4 год (у вікні обслуговування)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 11.2. Масштабованість і обсяги ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Макс. записів в одному регістрі || 10&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Макс. кількість регістрів у конфігурації || 2 000&lt;br /&gt;
|-&lt;br /&gt;
| Макс. одночасних сеансів проведення || 200&lt;br /&gt;
|-&lt;br /&gt;
| Секціонування || Обов&#039;язкове для таблиць &amp;gt; 100 млн записів&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 11.3. Надійність і цілісність ==&lt;br /&gt;
* НФВ-10. Рухи та реєстратор змінюються в одній транзакції БД; часткове проведення неможливе.&lt;br /&gt;
* НФВ-11. Аварійне завершення сервера не залишає підсумки неузгодженими (гарантується транзакцією).&lt;br /&gt;
* НФВ-12. Сервіс перевірки цілісності (ФТ-41) виконується регламентно; розбіжність підсумків = інцидент P1.&lt;br /&gt;
&lt;br /&gt;
== 11.4. Супроводжуваність ==&lt;br /&gt;
* НФВ-13. Реструктуризація регістру (додавання ресурсу/реквізиту) для таблиці ≤ 100 млн записів — ≤ 30 хв.&lt;br /&gt;
* НФВ-14. Додавання вимірювання вимагає перебудови підсумків; система повинна попереджати про оцінку часу до початку операції.&lt;br /&gt;
* НФВ-15. Усі DDL-операції — ідемпотентні та скриптовані (можливість застосувати вручну).&lt;br /&gt;
&lt;br /&gt;
== 11.5. Сумісність ==&lt;br /&gt;
* НФВ-16. PostgreSQL 14+ та MS SQL Server 2019+ — обидві платформи з однаковою функціональністю.&lt;br /&gt;
* НФВ-17. Генератор DDL ізольований у шар «діалект СКБД».&lt;br /&gt;
&lt;br /&gt;
= 12. Міграція існуючих структур K2 ERP =&lt;br /&gt;
&lt;br /&gt;
== 12.1. Етапи ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Етап !! Результат&lt;br /&gt;
|-&lt;br /&gt;
| М1 || Інвентаризація || Реєстр наявних «регістроподібних» таблиць K2 з класифікацією за типом-мішенню (РВ/РН/РБ/РР).&lt;br /&gt;
|-&lt;br /&gt;
| М2 || Мапінг || Для кожної таблиці — метаопис цільового регістру + правила перетворення колонок.&lt;br /&gt;
|-&lt;br /&gt;
| М3 || Створення регістрів || Генерація метаданих і DDL у тестовому контурі.&lt;br /&gt;
|-&lt;br /&gt;
| М4 || Перенесення даних || ETL: історичні дані → рухи, з призначенням реєстратора (реальний документ або службовий «ВведенняЗалишків»).&lt;br /&gt;
|-&lt;br /&gt;
| М5 || Побудова підсумків || Повний перерахунок.&lt;br /&gt;
|-&lt;br /&gt;
| М6 || Звірка || Порівняння залишків/оборотів «стара система vs нова» на контрольних датах; допуск розбіжності = 0.&lt;br /&gt;
|-&lt;br /&gt;
| М7 || Перемикання коду || Заміна прямих SQL-звернень на віртуальні таблиці; період паралельної роботи ≥ 1 звітний період.&lt;br /&gt;
|-&lt;br /&gt;
| М8 || Виведення з експлуатації || Видалення старих таблиць після 2 закритих періодів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 12.2. Проблемні випадки ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Випадок !! Рішення&lt;br /&gt;
|-&lt;br /&gt;
| Історичні записи без документа-джерела || Службовий документ &amp;lt;code&amp;gt;ВведенняЗалишків&amp;lt;/code&amp;gt; (один на період/розділ).&lt;br /&gt;
|-&lt;br /&gt;
| Записи з дублями за ключем (для незалежного РВ) || Дедуплікація з протоколом; конфлікти — на ручний розбір.&lt;br /&gt;
|-&lt;br /&gt;
| Дробові періоди / некоректні дати (NULL, 1900-01-01) || Нормалізація до MINPERIOD; протокол.&lt;br /&gt;
|-&lt;br /&gt;
| Прикладний код, що пише в таблиці напряму || Заборона на рівні прав БД після М7; аудит звернень на етапі М3–М6.&lt;br /&gt;
|-&lt;br /&gt;
| Аналітика, відсутня в цільовій моделі || Перенесення в реквізити (не у вимірювання) або відмова від міграції з обґрунтуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 13. Приймальні випробування =&lt;br /&gt;
&lt;br /&gt;
== 13.1. Функціональні тести (витяг) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Сценарій !! Очікуваний результат&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-01 || Створити РВ періодичний незалежний, записати 2 записи з однаковим ключем || Другий запис заміщує перший; у таблиці 1 рядок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-02 || Провести документ → 5 рухів РН || 5 записів у &amp;lt;code&amp;gt;rg_a_*&amp;lt;/code&amp;gt;; підсумки MAXPERIOD змінилися на суму дельти&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-03 || Скасувати проведення || 0 записів; підсумки повернулися до вихідних значень&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-04 || Видалити документ-реєстратор || Рухи видалені каскадно; перевірка цілісності — 0 помилок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-05 || Записати рух заднім числом (−6 міс.) || Залишки на всі дати після руху коректні (звірка з повним перерахунком)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-06 || Установити &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; || Запис не впливає на віртуальні таблиці; підсумки скориговані&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-07 || РБ: провести незбалансовану проводку (Дт ≠ Кт за балансовим ресурсом) || Помилка проведення, транзакція відкочена&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-08 || РБ: ОСВ по рахунку з 3 субконто || Підсумки за рівнями 0–3 узгоджені між собою (згортка tb3 → tb0)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-09 || РР: сценарій «Оклад + Відпустка + Лікарняний» (розд. 7.5.1) || Фактичні періоди дії відповідають еталону; «Оклад» дає 2 інтервали&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-10 || РР: зміна базового запису || У таблиці перерахунку з&#039;явився запис для залежного документа&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-11 || Паралельне проведення 2 документів за різними складами || Обидва проходять без очікування (розділення підсумків увімкнено)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-12 || Паралельне проведення 2 документів за одним складом і одним товаром з контролем залишків || Один чекає, другий проходить; від&#039;ємного залишку немає&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-13 || Перерахунок підсумків після хаотичних 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; операцій || Підсумки збігаються з повним перерахунком «з нуля» до копійки&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-14 || Реструктуризація: додати ресурс до РН із 10 млн записів || Дані збережені, підсумки перебудовані, час ≤ НФВ-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-15 || RLS: користувач з обмеженням по організації || Віртуальні таблиці повертають лише дозволені дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 13.2. Навантажувальні тести ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Тест !! Критерій&lt;br /&gt;
|-&lt;br /&gt;
| НТ-01 || Генерація 1 млрд рухів РН, заміри НФВ-01…НФВ-03 || Досягнення цілей&lt;br /&gt;
|-&lt;br /&gt;
| НТ-02 || Профіль «90 % рухів поточним періодом, 10 % заднім числом» — порівняння двох стратегій підсумків (розд. 10.2) || Обґрунтований вибір Рішення №3&lt;br /&gt;
|-&lt;br /&gt;
| НТ-03 || Пікове проведення 50 док/с протягом 1 год || Відсутність дедлоків; P95 ≤ НФВ-04&lt;br /&gt;
|-&lt;br /&gt;
| НТ-04 || РБ: субконто-слоти vs дочірня таблиця, 200 млн проводок || Обґрунтований вибір Рішення №2&lt;br /&gt;
|-&lt;br /&gt;
| НТ-05 || Розрахунок ЗП на 10 000 співробітників || НФВ-06&lt;br /&gt;
|-&lt;br /&gt;
| НТ-06 || Деградація за 24 год безперервної роботи || Приріст часу відгуку ≤ 15 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 14. Етапи робіт та оцінка =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Етап !! Зміст !! Результат !! Оцінка, чол.-міс. !! Залежності&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е0&#039;&#039;&#039; || Обстеження платформи, верифікація припущень П1–П6, ескізний проєкт || Затверджений архітектурний ескіз, уточнене ТЗ || 1,5 || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е1&#039;&#039;&#039; || Метамодель + репозиторій + генератор DDL + конструктор (базовий) || Створення регістру будь-якого типу з генерацією схеми || 4 || Е0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е2&#039;&#039;&#039; || Регістр відомостей: рантайм, набори записів, зрізи, форми || РВ у продуктиві || 2,5 || Е1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е3&#039;&#039;&#039; || Регістр накопичення: рухи, підсумки, ТА, віртуальні таблиці || РН у продуктиві || 5 || Е2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е4&#039;&#039;&#039; || Механізм проведення документів, блокування, оперативне/неоперативне проведення || Транзакційне проведення || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е5&#039;&#039;&#039; || Розширення мови запитів (віртуальні таблиці, транслятор, push-down) || Запити до ВТ || 4 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е6&#039;&#039;&#039; || Регістр бухгалтерії + план рахунків + субконто + підсумки за рівнями || РБ у продуктиві || 6 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е7&#039;&#039;&#039; || Регістр розрахунку + ПВР + витіснення + база + графіки + перерахунки || РР у продуктиві || 6 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е8&#039;&#039;&#039; || Агрегати, розділення підсумків, порадник агрегатів || Оптимізація || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е9&#039;&#039;&#039; || Права доступу, RLS, аудит, сервіси цілісності || Безпека та адміністрування || 2 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е10&#039;&#039;&#039; || Реструктуризація, міграція, інструменти звірки || Інструменти міграції || 2,5 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е11&#039;&#039;&#039; || Навантажувальне тестування, оптимізація, документація || Приймальні випробування || 3 || усі&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РАЗОМ&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|Оцінка орієнтовна (±40 %) і підлягає уточненню за результатами Е0. Критичний шлях: Е0 → Е1 → Е3 → Е5 → Е6/Е7 → Е11. За командою 6–8 інженерів — орієнтовно 9–11 календарних місяців.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Мінімальний життєздатний обсяг (MVP)&#039;&#039;&#039;: Е0–Е5 (РВ + РН + проведення + запити) ≈ 19,5 чол.-міс. — покриває ~70 % прикладних сценаріїв K2 ERP.&lt;br /&gt;
&lt;br /&gt;
= 15. Ризики =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Ризик !! Ймов. !! Вплив !! Пом&#039;якшення&lt;br /&gt;
|-&lt;br /&gt;
| Р1 || У K2 ERP немає власної мови запитів → віртуальні таблиці нікуди вбудовувати || Сер. || &#039;&#039;&#039;Крит.&#039;&#039;&#039; || Верифікувати на Е0. План «Б»: віртуальні таблиці як параметризовані view/TVF + шар ORM.&lt;br /&gt;
|-&lt;br /&gt;
| Р2 || Конкуренція за таблицю підсумків на піках проведення || Вис. || Вис. || Розділення підсумків (сплітери), НТ-03, детермінований порядок MERGE.&lt;br /&gt;
|-&lt;br /&gt;
| Р3 || Рухи «заднім числом» роблять оновлення підсумків O(N періодів) || Вис. || Сер. || Рішення №3 (dirty months + регламентний перерахунок), НТ-02.&lt;br /&gt;
|-&lt;br /&gt;
| Р4 || «Широка» схема субконто → реструктуризація при зміні ліміту || Сер. || Сер. || Зафіксувати ліміт 5 із запасом; НТ-04; план «Б» — дочірня таблиця.&lt;br /&gt;
|-&lt;br /&gt;
| Р5 || Механізм витіснення РР — найскладніший і найпомилковіший вузол || Вис. || Вис. || Виділити в окремий модуль з еталонним набором з 50+ тест-кейсів; property-based тестування.&lt;br /&gt;
|-&lt;br /&gt;
| Р6 || Обсяг Е6+Е7 недооцінено (досвід 1С: це роки розробки) || Вис. || Вис. || MVP-підхід: спершу Е0–Е5, рішення про Е6/Е7 — після ретроспективи.&lt;br /&gt;
|-&lt;br /&gt;
| Р7 || Різна поведінка PostgreSQL і MS SQL (плани, MERGE, ізоляція) || Сер. || Сер. || Єдиний набір тестів на обох СКБД у CI від Е1.&lt;br /&gt;
|-&lt;br /&gt;
| Р8 || Міграція історичних даних без реєстраторів || Вис. || Сер. || Службовий документ «ВведенняЗалишків»; етап звірки М6 з нульовим допуском.&lt;br /&gt;
|-&lt;br /&gt;
| Р9 || Патентні / ліцензійні претензії щодо копіювання механізмів || Низ. || Вис. || Юридична експертиза до Е1: реалізація &#039;&#039;концепцій&#039;&#039; обліку (загальновідомих), а не коду/API; уникати дослівного копіювання найменувань API та документації.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Ризик Р9 — обов&#039;язково до опрацювання перед стартом.&#039;&#039;&#039; ТЗ описує &#039;&#039;функціональні концепції&#039;&#039; (накопичувальний облік, подвійний запис, витіснення періодів дії), що є загальновідомими практиками обліку. Проте пряме відтворення пропрієтарних інтерфейсів, найменувань і структур конкретного вендора потребує окремої правової оцінки. Рекомендується узгодити з юридичною службою власну термінологію та API до початку Е1.}}&lt;br /&gt;
&lt;br /&gt;
= 16. Додатки =&lt;br /&gt;
&lt;br /&gt;
== Додаток А. Матриця відповідності «1С ↔ K2 ERP» ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Об&#039;єкт / поняття 1С !! Пропонований аналог K2 ERP !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| РегистрСведений || &amp;lt;code&amp;gt;Регістри.Відомостей.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрНакопления || &amp;lt;code&amp;gt;Регістри.Накопичення.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрБухгалтерии || &amp;lt;code&amp;gt;Регістри.Бухгалтерії.*&amp;lt;/code&amp;gt; || Субконто зберігаються інакше (слоти)&lt;br /&gt;
|-&lt;br /&gt;
| РегистрРасчета || &amp;lt;code&amp;gt;Регістри.Розрахунку.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| Регистратор || &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ВидДвижения || &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Итоги || &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Точка актуальности итогов || &amp;lt;code&amp;gt;ТА підсумків&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Разделение итогов || &amp;lt;code&amp;gt;Розділення підсумків&amp;lt;/code&amp;gt; (splitter) || —&lt;br /&gt;
|-&lt;br /&gt;
| Агрегаты || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Субконто / ПланВидовХарактеристик || &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПланВидівХарактеристик&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПланВидовРасчета || &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерасчет || &amp;lt;code&amp;gt;Перерахунок&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПериодДействия / Вытеснение || &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Витіснення&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Границя послідовності || &#039;&#039;&#039;Не реалізується&#039;&#039;&#039; || Механізм визнано застарілим; замість нього — перепроведення за списком «брудних» документів&lt;br /&gt;
|-&lt;br /&gt;
| РегистрыСведений з режимом «ПоПозицииРегистратора» || &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt; || Реалізується як (period, rec_t, rec_r, line_no) у ключі&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Б. Альтернатива зберігання субконто (план «Б» до Рішення №2) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Дочірня таблиця «ключ-значення» замість слотів&lt;br /&gt;
CREATE TABLE rg_b_0020_ed (&lt;br /&gt;
    rec_t     smallint NOT NULL,&lt;br /&gt;
    rec_r     uuid     NOT NULL,&lt;br /&gt;
    line_no   int      NOT NULL,&lt;br /&gt;
    side      smallint NOT NULL CHECK (side IN (0,1)),   -- 0=Дт, 1=Кт&lt;br /&gt;
    ed_no     smallint NOT NULL,                          -- порядковий номер субконто рахунка&lt;br /&gt;
    ed_type_r uuid     NOT NULL,                          -- вид субконто&lt;br /&gt;
    val_t     smallint NOT NULL,&lt;br /&gt;
    val_r     uuid,&lt;br /&gt;
    val_n     numeric(38,10),&lt;br /&gt;
    val_s     varchar(150),&lt;br /&gt;
    val_d     timestamp(0),&lt;br /&gt;
    PRIMARY KEY (rec_t, rec_r, line_no, side, ed_no),&lt;br /&gt;
    FOREIGN KEY (rec_t, rec_r, line_no) REFERENCES rg_b_0020 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_val ON rg_b_0020_ed (ed_type_r, val_t, val_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Критерій !! Слоти (Рішення №2) !! Дочірня таблиця (план «Б»)&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 1 субконто || Index seek по колонці || JOIN + семі-з&#039;єднання&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 3 субконто || 3 предикати в одному скані || 3 JOIN&lt;br /&gt;
|-&lt;br /&gt;
| Зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || ALTER TABLE (реструктуризація) || Без змін схеми&lt;br /&gt;
|-&lt;br /&gt;
| Розмір рядка проводки || +48 байт × 2 (Дт/Кт) || Базовий&lt;br /&gt;
|-&lt;br /&gt;
| Складність генератора DDL || Вища || Нижча&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рекомендація&#039;&#039;&#039; || &#039;&#039;&#039;Обрано за замовчуванням&#039;&#039;&#039; || Резерв за результатами НТ-04&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток В. Перелік вимог (реєстр трасування) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! ID !! Розділ !! Коротко !! Пріоритет !! Тест&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-01…ФТ-07 || 7.1 || Набори записів, проведення || Must || ФТ-Т-02…04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-08…ФТ-10 || 7.2 || Активність || Must || ФТ-Т-06&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-11…ФТ-13 || 7.3 || Віртуальні таблиці || Must || ФТ-Т-08, НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-14…ФТ-18 || 7.4 || Підсумки, ТА || Must || ФТ-Т-05, ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-19…ФТ-21 || 7.4.4 || Агрегати || Should || НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-22…ФТ-30 || 7.5 || Механіка РР || Must (для Е7) || ФТ-Т-09, ФТ-Т-10&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31…ФТ-36 || 7.7 || Блокування || Must || ФТ-Т-11, ФТ-Т-12, НТ-03&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-37…ФТ-39 || 7.8 || Права, RLS || Must || ФТ-Т-15&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-40…ФТ-42 || 7.9 || Аудит, цілісність || Should || ФТ-Т-04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-К-01…06 || 6.8.4 || Конструктор || Should || —&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01…НФВ-09 || 11.1 || Продуктивність || Must || НТ-01…НТ-06&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-10…НФВ-12 || 11.3 || Цілісність || Must || ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-13…НФВ-17 || 11.4–11.5 || Супровід, сумісність || Should || ФТ-Т-14&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Г. Відкриті питання ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Питання !! Кому !! Термін&lt;br /&gt;
|-&lt;br /&gt;
| В1 || Чи існує в K2 ERP мова запитів / транслятор у SQL? (визначає Р1 та обсяг Е5) || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В2 || Формат ідентифікації об&#039;єктів: UUID чи сурогатний int? || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В3 || Чи потрібна мілісекундна дискретність періоду? || Замовник || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В4 || Максимальна кількість субконто: 3 чи 5? || Головний бухгалтер / методолог || До Е6&lt;br /&gt;
|-&lt;br /&gt;
| В5 || Чи потрібен механізм «Границя послідовності»? (пропонується відмова) || Методолог || До Е3&lt;br /&gt;
|-&lt;br /&gt;
| В6 || Пріоритет типів регістрів: чи достатньо MVP (РВ + РН) для першого релізу? || Замовник || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В7 || Правова оцінка ризику Р9 || Юридична служба || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В8 || Цільова СКБД для першої черги: тільки PostgreSQL чи одразу обидві? || Архітектор / ІТ-експлуатація || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В9 || &#039;&#039;&#039;Міжпланова база розрахунку:&#039;&#039;&#039; чи потрібна можливість брати базу з &#039;&#039;іншого&#039;&#039; регістру розрахунку (Утримання ← ОсновніНарахування)? Якщо так — ФТ-25 і &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt; потребують розширення полем &amp;lt;code&amp;gt;base_register_id&amp;lt;/code&amp;gt; (див. Д.7.2) || Методолог ЗП / архітектор || До Е7&lt;br /&gt;
|-&lt;br /&gt;
| В10 || Чи прийнятна поведінка підпорядкованого РВ без контролю унікальності за (Період + Вимірювання)? (сумісність із 1С vs. захист від дублів — див. Д.3.2, антипатерн А-6) || Методолог || До Е2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Д. Каталог прикладів регістрів ==&lt;br /&gt;
&lt;br /&gt;
Додаток містить прикладні приклади регістрів усіх типів і підвидів. Для кожного наведено: декларацію (DSL), пояснення проєктних рішень, приклад даних у фізичних таблицях і типовий запит. Приклади призначені для: (а) перевірки повноти метамоделі на етапі Е0; (б) формування набору приймальних тестів; (в) навчання прикладних розробників.&lt;br /&gt;
&lt;br /&gt;
=== Д.1. Як обрати тип регістру (дерево рішень) ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Choose {&lt;br /&gt;
  rankdir=TB; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  q1 [label=&amp;quot;Що зберігаємо?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q2 [label=&amp;quot;Потрібні залишки\n(скільки Є зараз)?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q3 [label=&amp;quot;Подвійний запис,\nплан рахунків,\nсубконто?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q4 [label=&amp;quot;Періоди дії,\nвитіснення,\nбаза розрахунку?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  q5 [label=&amp;quot;Значення прив&#039;язане\nдо документа?&amp;quot;, shape=diamond, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  ri_i [label=&amp;quot;РВ незалежний\n(КурсиВалют,\nШтрихкоди)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  ri_s [label=&amp;quot;РВ підпорядкований\n(ЦіниНоменклатури,\nКадровіДані)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  ra_b [label=&amp;quot;РН «Залишки»\n(ТовариНаСкладах,\nВзаєморозрахунки)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  ra_t [label=&amp;quot;РН «Обороти»\n(Продажі,\nВитрати)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  rb   [label=&amp;quot;РБ\n(Госпрозрахунковий)&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  rc   [label=&amp;quot;РР\n(Нарахування,\nУтримання)&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q3 [label=&amp;quot;облікові проводки&amp;quot;];&lt;br /&gt;
  q3 -&amp;gt; rb [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q3 -&amp;gt; q4 [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
  q4 -&amp;gt; rc [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q4 -&amp;gt; q2 [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q2 [label=&amp;quot;кількісні/сумові\nрухи&amp;quot;];&lt;br /&gt;
  q2 -&amp;gt; ra_b [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q2 -&amp;gt; ra_t [label=&amp;quot;ні,\nлише обороти\nза період&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  q1 -&amp;gt; q5 [label=&amp;quot;значення\nатрибута\nв часі&amp;quot;];&lt;br /&gt;
  q5 -&amp;gt; ri_s [label=&amp;quot;так&amp;quot;];&lt;br /&gt;
  q5 -&amp;gt; ri_i [label=&amp;quot;ні&amp;quot;];&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Контрольні питання при проєктуванні будь-якого регістру:&#039;&#039;&#039;&lt;br /&gt;
# Чи можна відповісти на всі прикладні питання &#039;&#039;лише&#039;&#039; полями цього регістру, без з&#039;єднання з документами? Якщо ні — бракує реквізиту (не вимірювання!).&lt;br /&gt;
# Яка &#039;&#039;кардинальність&#039;&#039; таблиці підсумків = ∏(кількість значень вимірювань) × кількість періодів? Якщо &amp;gt; 10&amp;lt;sup&amp;gt;8&amp;lt;/sup&amp;gt; — переглянути склад вимірювань.&lt;br /&gt;
# Чи потрібно фільтрувати/групувати за цим полем у звітах? Так → вимірювання. Ні, лише показувати → реквізит.&lt;br /&gt;
# Чи підсумовується поле? Так → ресурс. Ні → реквізит або вимірювання.&lt;br /&gt;
&lt;br /&gt;
=== Д.2. Зведений каталог ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! № !! Регістр !! Тип !! Підвид / режим !! Вимірювання !! Ресурси !! Розділ&lt;br /&gt;
|-&lt;br /&gt;
| 1 || КурсиВалют || РВ || Періодичний (день), незалежний || Валюта || Курс, Кратність || Д.3.1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ЦіниНоменклатури || РВ || Періодичний (день), підпорядкований || Номенклатура, Характеристика, ТипЦін || Ціна || Д.3.2&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ШтрихкодиНоменклатури || РВ || Неперіодичний, незалежний || Штрихкод || Номенклатура, Характеристика, Упаковка || Д.3.3&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ГрафікРоботи || РВ || Неперіодичний, незалежний || ВидГрафіка, ДатаГрафіка || Значення, Годин || Д.3.4&lt;br /&gt;
|-&lt;br /&gt;
| 5 || КадровіДані || РВ || По позиції реєстратора, підпорядкований || Співробітник || Підрозділ, Посада, Ставка, ВидЗайнятості || Д.3.5&lt;br /&gt;
|-&lt;br /&gt;
| 6 || НалаштуванняКористувачів || РВ || Неперіодичний, незалежний || Користувач, Налаштування || Значення (складений) || Д.3.6&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ТовариНаСкладах || РН || Залишки || Номенклатура, Склад, Партія, Характеристика || Кількість, Сума || Д.4.1&lt;br /&gt;
|-&lt;br /&gt;
| 8 || ВзаєморозрахункиЗКонтрагентами || РН || Залишки || Організація, Контрагент, Договір, Замовлення || Сума, СумаВал || Д.4.2&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ТовариВРезерві || РН || Залишки || Номенклатура, Склад, Замовлення, Характеристика || Кількість || Д.4.3&lt;br /&gt;
|-&lt;br /&gt;
| 10 || ГрошовіКоштиБезготівкові || РН || Залишки || Організація, БанківськийРахунок || Сума, СумаВал || Д.4.4&lt;br /&gt;
|-&lt;br /&gt;
| 11 || Продажі || РН || Обороти (місяць) + агрегати || Номенклатура, Контрагент, Договір, Менеджер, Склад || Кількість, Сума, СумаБезПДВ, Собівартість || Д.5.1&lt;br /&gt;
|-&lt;br /&gt;
| 12 || ВитратиЗаСтаттями || РН || Обороти (місяць) || Організація, Підрозділ, СтаттяВитрат, Проєкт || Сума || Д.5.2&lt;br /&gt;
|-&lt;br /&gt;
| 13 || Госпрозрахунковий || РБ || З кореспонденцією || Організація (бал.), Підрозділ (небал.) || Сума (бал.), Кількість, ВалютнаСума || Д.6.1&lt;br /&gt;
|-&lt;br /&gt;
| 14 || ПодатковийОблік || РБ || Без кореспонденції || Організація, ВидРізниці || Сума || Д.6.2&lt;br /&gt;
|-&lt;br /&gt;
| 15 || Бюджетування || РБ || З кореспонденцією || Сценарій, ЦФВ, Проєкт || Сума || Д.6.3&lt;br /&gt;
|-&lt;br /&gt;
| 16 || ОсновніНарахування || РР || Період дії + база за періодом дії || Співробітник (баз.), Підрозділ || Результат, ВідпрацьованоДнів, НормаДнів || Д.7.1&lt;br /&gt;
|-&lt;br /&gt;
| 17 || Утримання || РР || Без періоду дії, база за періодом реєстрації || Співробітник (баз.), Підрозділ || Результат, БазаОподаткування || Д.7.2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.3. Регістри відомостей ===&lt;br /&gt;
&lt;br /&gt;
==== Д.3.1. КурсиВалют — періодичний, незалежний ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати історію курсів валют; отримувати курс на будь-яку дату.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: КурсиВалют&lt;br /&gt;
  kind: Information&lt;br /&gt;
  synonym: &amp;quot;Курси валют&amp;quot;&lt;br /&gt;
  periodicity: WithinDay            # один курс на валюту на день&lt;br /&gt;
  writeMode: Independent            # курси вводяться вручну/завантажуються з НБУ&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Курс,      type: &amp;quot;Число(15,4)&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Кратність, type: &amp;quot;Число(10,0)&amp;quot;, default: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;Independent&amp;lt;/code&amp;gt; — курс не породжується документом, він є зовнішнім фактом.&lt;br /&gt;
* &amp;lt;code&amp;gt;master: true&amp;lt;/code&amp;gt; для Валюти — при видаленні валюти курси видаляються; регістр видно у формі елемента довідника.&lt;br /&gt;
* Періодичність &amp;lt;code&amp;gt;WithinDay&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;WithinSecond&amp;lt;/code&amp;gt; — повторний запис курсу за той самий день &#039;&#039;замістить&#039;&#039; попередній, а не створить дубль.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0007&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! d1_r (Валюта) !! r1 (Курс) !! r2 (Кратність)&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-15 00:00:00 || USD || 41.8200 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-15 00:00:00 || EUR || 45.6100 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-16 00:00:00 || USD || 41.8500 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-17 00:00:00 || USD || 41.9000 || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-17 00:00:00 || EUR || 45.7300 || 1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (курс на дату документа):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ Курси.Курс, Курси.Кратність&lt;br /&gt;
З РегістрВідомостей.КурсиВалют.ЗрізОстанніх(&amp;amp;ДатаДокумента, Валюта = &amp;amp;Валюта) ЯК Курси&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// або через менеджер&lt;br /&gt;
var курс = Registers.Information[&amp;quot;КурсиВалют&amp;quot;]&lt;br /&gt;
                    .GetLast(doc.Дата, new Filter { [&amp;quot;Валюта&amp;quot;] = doc.Валюта });&lt;br /&gt;
decimal сумаГрн = doc.СумаВалюти * курс.Курс / курс.Кратність;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.3.2. ЦіниНоменклатури — періодичний, підпорядкований реєстратору ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати історію цін; ціна встановлюється наказом (документом), який можна скасувати.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ЦіниНоменклатури&lt;br /&gt;
  kind: Information&lt;br /&gt;
  synonym: &amp;quot;Ціни номенклатури&amp;quot;&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  writeMode: SubordinateToRecorder   # ← ключова відмінність від КурсиВалют&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: ТипЦін,         type: &amp;quot;Довідник.ТипиЦін&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Ціна, type: &amp;quot;Число(15,2)&amp;quot;, denyEmpty: true }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Валюта,   type: &amp;quot;Довідник.Валюти&amp;quot; }&lt;br /&gt;
    - { name: Одиниця,  type: &amp;quot;Довідник.ОдиниціВиміру&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ВстановленняЦінНоменклатури&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;SubordinateToRecorder&amp;lt;/code&amp;gt; — потрібна юридична прив&#039;язка ціни до наказу, можливість скасувати наказ і «відкотити» ціни одним рухом.&lt;br /&gt;
* &amp;lt;code&amp;gt;Валюта&amp;lt;/code&amp;gt; і &amp;lt;code&amp;gt;Одиниця&amp;lt;/code&amp;gt; — &#039;&#039;&#039;реквізити&#039;&#039;&#039;, а не вимірювання: за ними не фільтрують і не будують зрізи, вони визначаються типом цін. &#039;&#039;Помилка новачка&#039;&#039; — зробити Валюту вимірюванням, що подвоїть кількість записів і зламає зріз останніх.&lt;br /&gt;
* &amp;lt;code&amp;gt;Характеристика&amp;lt;/code&amp;gt; дозволяє порожнє значення — для номенклатури без характеристик.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0010&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec_t !! rec_r !! line_no !! period !! active !! d1_r (Номенкл.) !! d2_r (Характ.) !! d3_r (ТипЦін) !! r1 (Ціна) !! a1_r (Валюта)&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 1 || 2026-07-01 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 480.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 2 || 2026-07-01 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Оптова || 410.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || a3f…01 || 3 || 2026-07-01 || true || Чай Ahmad 100г || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 95.00 || UAH&lt;br /&gt;
|-&lt;br /&gt;
| 15 || b7c…04 || 1 || 2026-07-15 || true || Кава Lavazza 1кг || &#039;&#039;(порожня)&#039;&#039; || Роздрібна || 495.00 || UAH&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|Зверніть увагу: у підпорядкованому РВ &#039;&#039;&#039;немає&#039;&#039;&#039; унікальності за (Період + Вимірювання). Два різні документи можуть встановити ціну на ту саму дату — платформа це дозволить, зріз останніх поверне запис із більшим &amp;lt;code&amp;gt;line_no&amp;lt;/code&amp;gt; у межах реєстратора з пізнішою позицією. Це &#039;&#039;&#039;свідома&#039;&#039;&#039; поведінка (сумісність із 1С), але прикладний розробник має контролювати дублі самостійно — див. антипатерн А-6 (Д.10).}}&lt;br /&gt;
&lt;br /&gt;
==== Д.3.3. ШтрихкодиНоменклатури — неперіодичний, незалежний ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; за штрихкодом знайти номенклатуру. Класичний приклад «вимірювання = те, &#039;&#039;за чим&#039;&#039; шукаємо; ресурс = те, що &#039;&#039;знаходимо&#039;&#039;».&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ШтрихкодиНоменклатури&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Штрихкод, type: &amp;quot;Рядок(30)&amp;quot;, denyEmpty: true }     # ← ключ пошуку&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Упаковка,       type: &amp;quot;Довідник.УпаковкиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0011 (&lt;br /&gt;
    d1_s  varchar(30) NOT NULL,      -- Штрихкод&lt;br /&gt;
    r1_r  uuid        NOT NULL,      -- Номенклатура&lt;br /&gt;
    r2_r  uuid        NOT NULL,      -- Характеристика&lt;br /&gt;
    r3_r  uuid        NOT NULL,      -- Упаковка&lt;br /&gt;
    CONSTRAINT pk_rg_i_0011 PRIMARY KEY (d1_s)     -- ← унікальність штрихкоду «безкоштовно»&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0011_r1 ON rg_i_0011 (r1_r);  -- зворотний пошук: штрихкоди товару&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; PK за вимірюванням автоматично гарантує, що один штрихкод не може вказувати на два товари. Якби Номенклатуру зробили вимірюванням, а Штрихкод — ресурсом, ця гарантія зникла б, і довелося б писати перевірку в прикладному коді.&lt;br /&gt;
&lt;br /&gt;
==== Д.3.4. ГрафікРоботи — неперіодичний, незалежний (використовується як графік для РР) ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ГрафікРоботи&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: ВидГрафіка,  type: &amp;quot;Довідник.ГрафікиРоботи&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
    - { name: ДатаГрафіка, type: &amp;quot;Дата&amp;quot;, denyEmpty: true }        # ← вимірювання типу Дата, не Період!&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Значення, type: &amp;quot;Число(1,0)&amp;quot; }      # 1 = робочий день, 0 = вихідний&lt;br /&gt;
    - { name: Годин,    type: &amp;quot;Число(4,2)&amp;quot; }      # тривалість зміни&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення (важливе):&#039;&#039;&#039; &amp;lt;code&amp;gt;ДатаГрафіка&amp;lt;/code&amp;gt; — це &#039;&#039;&#039;вимірювання&#039;&#039;&#039; типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt;, а не стандартний реквізит &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;. Регістр &#039;&#039;&#039;неперіодичний&#039;&#039;&#039;. Причина: графік описує &#039;&#039;календар&#039;&#039; (кожна дата — окремий факт), а не &#039;&#039;історію зміни значення&#039;&#039;. Якби використали періодичність, зріз останніх повертав би «останній робочий день», що безглуздо. Механізм РР (&amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt;) очікує саме таку структуру.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Дані у таблиці &amp;lt;code&amp;gt;rg_i_0015&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! d1_r (ВидГрафіка) !! d2_d (ДатаГрафіка) !! r1 (Значення) !! r2 (Годин)&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-01 || 1 || 8.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-04 || 0 || 0.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-05 || 0 || 0.00&lt;br /&gt;
|-&lt;br /&gt;
| П&#039;ятиденка || 2026-07-06 || 1 || 8.00&lt;br /&gt;
|-&lt;br /&gt;
| Змінний 2/2 || 2026-07-01 || 1 || 12.00&lt;br /&gt;
|-&lt;br /&gt;
| Змінний 2/2 || 2026-07-03 || 0 || 0.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Д.3.5. КадровіДані — по позиції реєстратора ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; зберігати актуальні кадрові дані співробітника з історією; підтримати кілька наказів однією датою в правильному порядку.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: КадровіДані&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: ByRecorderPosition   # ← упорядкування за позицією документа, не лише за датою&lt;br /&gt;
  writeMode: SubordinateToRecorder&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
    - { name: Посада,       type: &amp;quot;Довідник.Посади&amp;quot; }&lt;br /&gt;
    - { name: Ставка,       type: &amp;quot;Число(5,2)&amp;quot; }&lt;br /&gt;
    - { name: ВидЗайнятості, type: &amp;quot;Перерахування.ВидиЗайнятості&amp;quot; }&lt;br /&gt;
    - { name: ГрафікРоботи, type: &amp;quot;Довідник.ГрафікиРоботи&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ПрийомНаРоботу&lt;br /&gt;
    - Документ.КадровеПереміщення&lt;br /&gt;
    - Документ.Звільнення&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; &amp;lt;code&amp;gt;ByRecorderPosition&amp;lt;/code&amp;gt; — коли два накази оформлені однією датою (переміщення + зміна ставки), звичайна періодичність «у межах дня» дала б недетермінований результат зрізу. Позиція реєстратора додає до ключа &amp;lt;code&amp;gt;(rec_t, rec_r, line_no)&amp;lt;/code&amp;gt; і впорядковує за моментом часу документа.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фізична схема:&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0016 (&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    d1_r     uuid         NOT NULL,        -- Співробітник&lt;br /&gt;
    r1_r     uuid NOT NULL, r2_r uuid NOT NULL,&lt;br /&gt;
    r3       numeric(5,2) NOT NULL,&lt;br /&gt;
    r4       smallint     NOT NULL,        -- Перерахування зберігається як порядковий номер&lt;br /&gt;
    r5_r     uuid NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0016 PRIMARY KEY (period, rec_t, rec_r, line_no)  -- ← Період у ключі ПЕРШИЙ&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0016_d1 ON rg_i_0016 (d1_r, period DESC, rec_t, rec_r, line_no DESC)&lt;br /&gt;
    WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.3.6. НалаштуванняКористувачів — складений тип ресурсу ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: НалаштуванняКористувачів&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: Nonperiodical&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Користувач,   type: &amp;quot;Довідник.Користувачі&amp;quot;, master: true }&lt;br /&gt;
    - { name: Налаштування, type: &amp;quot;ПланВидівХарактеристик.НалаштуванняКористувачів&amp;quot;, master: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - name: Значення&lt;br /&gt;
      type: [&amp;quot;Рядок(500)&amp;quot;, &amp;quot;Число(15,2)&amp;quot;, &amp;quot;Дата&amp;quot;, &amp;quot;Булево&amp;quot;,&lt;br /&gt;
             &amp;quot;Довідник.Організації&amp;quot;, &amp;quot;Довідник.Склади&amp;quot;]     # ← складений тип&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0018 (&lt;br /&gt;
    d1_r  uuid           NOT NULL,&lt;br /&gt;
    d2_r  uuid           NOT NULL,&lt;br /&gt;
    r1_t  smallint       NOT NULL,      -- код типу значення&lt;br /&gt;
    r1_b  boolean,&lt;br /&gt;
    r1_n  numeric(15,2),&lt;br /&gt;
    r1_s  varchar(500),&lt;br /&gt;
    r1_d  timestamp(0),&lt;br /&gt;
    r1_r  uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0018 PRIMARY KEY (d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! d1_r !! d2_r !! r1_t !! r1_b !! r1_n !! r1_s !! r1_d !! r1_r&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ОсновнаОрганізація || 101 || || || || || ТОВ «Альфа»&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ОсновнийСклад || 104 || || || || || Центральний&lt;br /&gt;
|-&lt;br /&gt;
| Іваненко || ПоказуватиПідказки || 2 || true || || || ||&lt;br /&gt;
|-&lt;br /&gt;
| Петренко || КількістьРядківСписку || 3 || || 50 || || ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.4. Регістри накопичення, вид «Залишки» ===&lt;br /&gt;
&lt;br /&gt;
==== Д.4.1. ТовариНаСкладах ====&lt;br /&gt;
&lt;br /&gt;
Декларація — розділ 6.7, фізична схема — розділ 8.5, ER — розділ 9.2. Тут — дані.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Рухи (&amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt;) після проведення трьох документів:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec_t !! rec_r !! line_no !! period !! mvt !! d1_r (Номенкл.) !! d2_r (Склад) !! r1 (К-сть) !! r2 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 2 (ПрихНакл) || p1 || 1 || 2026-06-10 || 0 &#039;&#039;Прихід&#039;&#039; || Кава Lavazza || Центральний || 100.000 || 35 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 (ПрихНакл) || p1 || 2 || 2026-06-10 || 0 &#039;&#039;Прихід&#039;&#039; || Чай Ahmad || Центральний || 200.000 || 12 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 (ВидНакл) || v1 || 1 || 2026-07-05 || 1 &#039;&#039;Витрата&#039;&#039; || Кава Lavazza || Центральний || 30.000 || 10 500.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 (Переміщ) || m1 || 1 || 2026-07-12 || 1 &#039;&#039;Витрата&#039;&#039; || Кава Lavazza || Центральний || 20.000 || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 (Переміщ) || m1 || 2 || 2026-07-12 || 0 &#039;&#039;Прихід&#039;&#039; || Кава Lavazza || Роздрібний || 20.000 || 7 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки залишків (&amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt;), ТА = 2026-07-31:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! d1_r !! d2_r !! r1 (К-сть ±) !! r2 (Сума ±) !! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Кава Lavazza || Центральний || 100.000 || 35 000.00 || залишок &#039;&#039;на початок&#039;&#039; липня&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Чай Ahmad || Центральний || 200.000 || 12 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Кава Lavazza || Центральний || 50.000 || 17 500.00 || 100 − 30 − 20&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Кава Lavazza || Роздрібний || 20.000 || 7 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2026-08-01 || Чай Ahmad || Центральний || 200.000 || 12 000.00 ||&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Кава Lavazza || Центральний || 50.000 || 17 500.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039; — поточний залишок&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Кава Lavazza || Роздрібний || 20.000 || 7 000.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;5999-11-01&#039;&#039;&#039; || Чай Ahmad || Центральний || 200.000 || 12 000.00 || &#039;&#039;&#039;MAXPERIOD&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;(Вимірювання Партія і Характеристика для стислості опущені.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==== Д.4.2. ВзаєморозрахункиЗКонтрагентами ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; облік дебіторської/кредиторської заборгованості в розрізі договорів і замовлень.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ВзаєморозрахункиЗКонтрагентами&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  enableBalanceTotals: true&lt;br /&gt;
  enableTurnoverTotals: true&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true, index: true }&lt;br /&gt;
    - { name: Контрагент,  type: &amp;quot;Довідник.Контрагенти&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Договір,     type: &amp;quot;Довідник.ДоговориКонтрагентів&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Замовлення,  type: [&amp;quot;Документ.ЗамовленняПокупця&amp;quot;, &amp;quot;Документ.ЗамовленняПостачальнику&amp;quot;],&lt;br /&gt;
        nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,    type: &amp;quot;Число(15,2)&amp;quot; }     # у валюті регламентованого обліку&lt;br /&gt;
    - { name: СумаВал, type: &amp;quot;Число(15,2)&amp;quot; }     # у валюті договору&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Коментар, type: &amp;quot;Рядок(200)&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ПрихіднаНакладна&lt;br /&gt;
    - Документ.ПлатіжнеДоручення&lt;br /&gt;
    - Документ.КасовийОрдер&lt;br /&gt;
    - Документ.КоригуванняБоргу&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Угода про знак (обов&#039;язково фіксується в методології!):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид руху !! Сенс !! Приклад документа&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Прихід&#039;&#039;&#039; || Борг контрагента перед нами &#039;&#039;&#039;зростає&#039;&#039;&#039; (дебіторка +) || Видаткова накладна&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витрата&#039;&#039;&#039; || Борг контрагента перед нами &#039;&#039;&#039;зменшується&#039;&#039;&#039; (оплата) || Платіжне доручення вхідне&lt;br /&gt;
|}&lt;br /&gt;
Кредиторська заборгованість = від&#039;ємний залишок. &#039;&#039;Альтернатива&#039;&#039; — два окремих ресурси (СумаДт/СумаКт) або два регістри; обраний варіант — один знаковий ресурс (простіше, менший обсяг підсумків).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Документ !! period !! mvt !! Контрагент !! Договір !! r1 (Сума) !! Залишок після&lt;br /&gt;
|-&lt;br /&gt;
| ВидатковаНакладна №12 || 2026-07-05 || Прихід || ТОВ «Бета» || Основний || 12 000.00 || +12 000 &#039;&#039;(винні нам)&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| ПлатіжнеДоручення №88 || 2026-07-09 || Витрата || ТОВ «Бета» || Основний || 8 000.00 || +4 000&lt;br /&gt;
|-&lt;br /&gt;
| ПлатіжнеДоручення №91 || 2026-07-16 || Витрата || ТОВ «Бета» || Основний || 6 000.00 || −2 000 &#039;&#039;(передоплата)&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (акт звірки):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Контрагент, Дані.Договір,&lt;br /&gt;
    Дані.СумаПочатковийЗалишок, Дані.СумаПрихід,&lt;br /&gt;
    Дані.СумаВитрата,           Дані.СумаКінцевийЗалишок&lt;br /&gt;
З РегістрНакопичення.ВзаєморозрахункиЗКонтрагентами.ЗалишкиІОбороти(&lt;br /&gt;
       &amp;amp;Початок, &amp;amp;Кінець, Авто, Рух,&lt;br /&gt;
       Організація = &amp;amp;Організація І Контрагент = &amp;amp;Контрагент&lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.4.3. ТовариВРезерві — регістр «супутник» ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ТовариВРезерві&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Склад,          type: &amp;quot;Довідник.Склади&amp;quot;, master: true, index: true }&lt;br /&gt;
    - { name: Замовлення,     type: &amp;quot;Документ.ЗамовленняПокупця&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість, type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ЗамовленняПокупця&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ЗакриттяЗамовлень&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Патерн «доступний залишок»&#039;&#039;&#039; — з&#039;єднання двох регістрів:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    ЄСТЬNULL(Зал.Номенклатура, Рез.Номенклатура) ЯК Номенклатура,&lt;br /&gt;
    ЄСТЬNULL(Зал.Склад, Рез.Склад) ЯК Склад,&lt;br /&gt;
    ЄСТЬNULL(Зал.КількістьЗалишок, 0) ЯК ВСкладі,&lt;br /&gt;
    ЄСТЬNULL(Рез.КількістьЗалишок, 0) ЯК ВРезерві,&lt;br /&gt;
    ЄСТЬNULL(Зал.КількістьЗалишок, 0) - ЄСТЬNULL(Рез.КількістьЗалишок, 0) ЯК Доступно&lt;br /&gt;
З РегістрНакопичення.ТовариНаСкладах.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад) ЯК Зал&lt;br /&gt;
ПОВНЕ З&#039;ЄДНАННЯ РегістрНакопичення.ТовариВРезерві.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад) ЯК Рез&lt;br /&gt;
    ЗА Зал.Номенклатура = Рез.Номенклатура І Зал.Склад = Рез.Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|Чому окремий регістр, а не ресурс «Резерв» у &amp;lt;code&amp;gt;ТовариНаСкладах&amp;lt;/code&amp;gt;? Тому що резерв ведеться в розрізі &#039;&#039;&#039;Замовлення&#039;&#039;&#039;, а залишок — у розрізі &#039;&#039;&#039;Партії&#039;&#039;&#039;. Додавання Замовлення як вимірювання до &amp;lt;code&amp;gt;ТовариНаСкладах&amp;lt;/code&amp;gt; помножило б таблицю підсумків на кардинальність замовлень (сотні тисяч рядків на товар). Це ілюстрація контрольного питання №2 з Д.1.}}&lt;br /&gt;
&lt;br /&gt;
==== Д.4.4. ГрошовіКоштиБезготівкові ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ГрошовіКоштиБезготівкові&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  periodicity: WithinDay              # достатньо дня: банківська виписка — денна&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація,       type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: БанківськийРахунок, type: &amp;quot;Довідник.БанківськіРахунки&amp;quot;, master: true, denyEmpty: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,    type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: СумаВал, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.ПлатіжнеДоручення, Документ.БанківськаВиписка, Документ.ПереміщенняКоштів]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; Валюта — &#039;&#039;&#039;не&#039;&#039;&#039; вимірювання, тому що вона однозначно визначається банківським рахунком (функціональна залежність). Її додавання як вимірювання створило б надлишковість і ризик неузгоджених даних. Валюта отримується з&#039;єднанням із довідником.&lt;br /&gt;
&lt;br /&gt;
=== Д.5. Регістри накопичення, вид «Обороти» ===&lt;br /&gt;
&lt;br /&gt;
==== Д.5.1. Продажі — з агрегатами ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Продажі&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Turnover          # ← залишків не буває: «залишок продажів» безглуздий&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  turnoverTotalsPeriod: Month&lt;br /&gt;
  aggregatesMode: Aggregates&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура,   type: &amp;quot;Довідник.Номенклатура&amp;quot;, index: true }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;Довідник.ХарактеристикиНоменклатури&amp;quot;, nullable: true }&lt;br /&gt;
    - { name: Контрагент,     type: &amp;quot;Довідник.Контрагенти&amp;quot;, index: true }&lt;br /&gt;
    - { name: Договір,        type: &amp;quot;Довідник.ДоговориКонтрагентів&amp;quot; }&lt;br /&gt;
    - { name: Менеджер,       type: &amp;quot;Довідник.Користувачі&amp;quot;, index: true }&lt;br /&gt;
    - { name: Склад,          type: &amp;quot;Довідник.Склади&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість,   type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
    - { name: Сума,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: СумаБезПДВ,  type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: Собівартість, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.ВидатковаНакладна, Документ.ПовернненняВідПокупця, Документ.ЗвітПроРоздрібніПродажі]&lt;br /&gt;
&lt;br /&gt;
  aggregates:&lt;br /&gt;
    - name: ПродажіПоМісяцяхІТоварах&lt;br /&gt;
      periodicity: Month&lt;br /&gt;
      dimensions: [Номенклатура, Склад]&lt;br /&gt;
      realtime: true&lt;br /&gt;
    - name: ПродажіПоМенеджерах&lt;br /&gt;
      periodicity: Day&lt;br /&gt;
      dimensions: [Менеджер]&lt;br /&gt;
      realtime: false                 # оновлюється регламентно&lt;br /&gt;
    - name: ПродажіПоКонтрагентах&lt;br /&gt;
      periodicity: Quarter&lt;br /&gt;
      dimensions: [Контрагент, Договір]&lt;br /&gt;
      realtime: false&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктні рішення:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;Turnover&amp;lt;/code&amp;gt;, а не &amp;lt;code&amp;gt;Balance&amp;lt;/code&amp;gt;: немає &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt;, немає таблиці залишків → удвічі менше підсумків і немає кумулятивних оновлень. Повернення відображається &#039;&#039;&#039;від&#039;ємною&#039;&#039;&#039; сумою, а не «витратою».&lt;br /&gt;
* 6 вимірювань → таблиця підсумків надто широка для швидких звітів → компенсуємо агрегатами.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ефект агрегатів:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Звіт !! Без агрегатів (&amp;lt;code&amp;gt;rg_a_0031_tt&amp;lt;/code&amp;gt;) !! З агрегатом !! Виграш&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по товарах за рік || скан 8 млн рядків підсумків || &amp;lt;code&amp;gt;ag1&amp;lt;/code&amp;gt;: 40 тис. рядків || ×200&lt;br /&gt;
|-&lt;br /&gt;
| Рейтинг менеджерів за квартал || скан 8 млн рядків || &amp;lt;code&amp;gt;ag2&amp;lt;/code&amp;gt;: 1,8 тис. рядків || ×4000&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по контрагенту за 3 роки || скан 8 млн рядків || &amp;lt;code&amp;gt;ag3&amp;lt;/code&amp;gt;: 60 тис. рядків || ×130&lt;br /&gt;
|-&lt;br /&gt;
| Продажі по товару + контрагенту || &#039;&#039;&#039;агрегат не покриває&#039;&#039;&#039; → підсумки || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0031_ag1 (          -- Місяць × (Номенклатура, Склад)&lt;br /&gt;
    period timestamp(0) NOT NULL, d1_r uuid NOT NULL, d6_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(20,3) NOT NULL, r2 numeric(20,2) NOT NULL,&lt;br /&gt;
    r3 numeric(20,2) NOT NULL, r4 numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag1 PRIMARY KEY (period, d1_r, d6_r)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE rg_a_0031_ag2 (          -- День × (Менеджер)&lt;br /&gt;
    period timestamp(0) NOT NULL, d5_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(20,3) NOT NULL, r2 numeric(20,2) NOT NULL,&lt;br /&gt;
    r3 numeric(20,2) NOT NULL, r4 numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag2 PRIMARY KEY (period, d5_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.5.2. ВитратиЗаСтаттями ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ВитратиЗаСтаттями&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Turnover&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  turnoverTotalsPeriod: Month&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація,    type: &amp;quot;Довідник.Організації&amp;quot;, denyEmpty: true }&lt;br /&gt;
    - { name: Підрозділ,      type: &amp;quot;Довідник.Підрозділи&amp;quot;, index: true }&lt;br /&gt;
    - { name: СтаттяВитрат,   type: &amp;quot;Довідник.СтаттіВитрат&amp;quot;, master: true, denyEmpty: true, index: true }&lt;br /&gt;
    - { name: Проєкт,         type: &amp;quot;Довідник.Проєкти&amp;quot;, nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.АвансовийЗвіт, Документ.НадходженняПослуг, Документ.НарахуванняЗарплати, Документ.Амортизація]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних (&amp;lt;code&amp;gt;rg_a_0032_tt&amp;lt;/code&amp;gt;, підсумки оборотів за місяць):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! period !! Підрозділ !! СтаттяВитрат !! Проєкт !! r1 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || Оренда || &#039;&#039;(порожній)&#039;&#039; || 45 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || ЗП і нарахування || &#039;&#039;(порожній)&#039;&#039; || 320 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || Відділ продажів || Реклама || Запуск «Альфа» || 78 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || ІТ-відділ || ЗП і нарахування || &#039;&#039;(порожній)&#039;&#039; || 410 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2026-07-01 || ІТ-відділ || Ліцензії ПЗ || &#039;&#039;(порожній)&#039;&#039; || 62 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.6. Регістри бухгалтерії ===&lt;br /&gt;
&lt;br /&gt;
==== Д.6.1. Госпрозрахунковий — з кореспонденцією ====&lt;br /&gt;
&lt;br /&gt;
Декларація — розділ 6.7, схема — 8.6, ER — 9.3. Тут — приклад проводок.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Господарська операція:&#039;&#039;&#039; реалізація товару на 12 000 грн (у т.ч. ПДВ 2 000), собівартість 7 000 грн.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проводки (&amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt;, реєстратор = ВидатковаНакладна №12):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! acc_dt !! ed_dt1 !! ed_dt2 !! acc_kt !! ed_kt1 !! ed_kt2 !! r1 (Сума) !! r2_dt !! r2_kt&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 361 &#039;&#039;Розрах. з покупцями&#039;&#039; || ТОВ «Бета» || Договір №5 || 702 &#039;&#039;Дохід від реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 12 000.00 || || 30.000&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 702 &#039;&#039;Дохід від реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 641 &#039;&#039;Розрах. за податками&#039;&#039; || ПДВ || &#039;&#039;—&#039;&#039; || 2 000.00 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 902 &#039;&#039;Собівартість реалізації&#039;&#039; || Кава Lavazza || &#039;&#039;—&#039;&#039; || 281 &#039;&#039;Товари на складі&#039;&#039; || Кава Lavazza || Центральний || 7 000.00 || 30.000 || 30.000&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Контроль:&#039;&#039;&#039; Σ(Сума) по Дт = Σ(Сума) по Кт у межах реєстратора → 12 000 + 2 000 + 7 000 = 21 000 з обох боків. ✔&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки, рівень 0 (&amp;lt;code&amp;gt;rg_b_0020_tb0&amp;lt;/code&amp;gt;), на 5999-11-01:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! acc_r !! d1_r (Організація) !! r1 (Сума ±) !! Інтерпретація&lt;br /&gt;
|-&lt;br /&gt;
| 281 || ТОВ «Альфа» || +28 000.00 || дебетовий залишок (товари є)&lt;br /&gt;
|-&lt;br /&gt;
| 361 || ТОВ «Альфа» || +12 000.00 || дебетовий (дебіторка)&lt;br /&gt;
|-&lt;br /&gt;
| 641 || ТОВ «Альфа» || −2 000.00 || кредитовий (винні бюджету)&lt;br /&gt;
|-&lt;br /&gt;
| 702 || ТОВ «Альфа» || −10 000.00 || кредитовий (дохід)&lt;br /&gt;
|-&lt;br /&gt;
| 902 || ТОВ «Альфа» || +7 000.00 || дебетовий (собівартість)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Підсумки, рівень 2 (&amp;lt;code&amp;gt;rg_b_0020_tb2&amp;lt;/code&amp;gt;) — для рахунку 281 (2 субконто: Номенклатура, Склад):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! acc_r !! ed1_r (Номенклатура) !! ed2_r (Склад) !! r1 (Сума) !! r2 (Кількість)&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Кава Lavazza || Центральний || 17 500.00 || 50.000&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Кава Lavazza || Роздрібний || 7 000.00 || 20.000&lt;br /&gt;
|-&lt;br /&gt;
| 281 || Чай Ahmad || Центральний || 12 000.00 || 200.000&lt;br /&gt;
|}&lt;br /&gt;
Згортка &amp;lt;code&amp;gt;tb2&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;tb0&amp;lt;/code&amp;gt;: 17 500 + 7 000 + 12 000 = &#039;&#039;&#039;36 500&#039;&#039;&#039;… &#039;&#039;(різниця з таблицею вище — інші операції; у тесті ФТ-Т-08 перевіряється точна рівність)&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (ОСВ по рахунку):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Субконто1 ЯК Номенклатура, Дані.Субконто2 ЯК Склад,&lt;br /&gt;
    Дані.СумаПочатковийЗалишокДт, Дані.КількістьПочатковийЗалишокДт,&lt;br /&gt;
    Дані.СумаОборотДт, Дані.СумаОборотКт,&lt;br /&gt;
    Дані.СумаКінцевийЗалишокДт, Дані.КількістьКінцевийЗалишокДт&lt;br /&gt;
З РегістрБухгалтерії.Госпрозрахунковий.ЗалишкиІОбороти(&lt;br /&gt;
       &amp;amp;Початок, &amp;amp;Кінець, Місяць,&lt;br /&gt;
       Рахунок = &amp;amp;Рахунок281,&lt;br /&gt;
       , Організація = &amp;amp;Організація,&lt;br /&gt;
       , &lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.6.2. ПодатковийОблік — без кореспонденції ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Задача:&#039;&#039;&#039; податковий облік із розділенням на постійні/тимчасові різниці, де подвійний запис не потрібен (кожен факт реєструється окремо по Дт або по Кт).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: ПодатковийОблік&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Податковий&lt;br /&gt;
  correspondence: false               # ← уніграфічний облік&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, balance: true, denyEmpty: true }&lt;br /&gt;
    - { name: ВидРізниці,  type: &amp;quot;Перерахування.ВидиРізниць&amp;quot;, balance: true }   # БУ|ПУ|ПР|ТР&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Зміст, type: &amp;quot;Рядок(255)&amp;quot; }&lt;br /&gt;
  recorders: [Документ.БухгалтерськаОперація, Документ.ВидатковаНакладна, Документ.НадходженняПослуг]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проводки (&amp;lt;code&amp;gt;rg_b_0021&amp;lt;/code&amp;gt;):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! acc_mvt !! acc_r !! ed1 (Номенкл.) !! d1 (Організація) !! d2 (ВидРізниці) !! r1 (Сума)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 0 &#039;&#039;Дебет&#039;&#039; || 902.НУ || Кава Lavazza || ТОВ «Альфа» || ПУ &#039;&#039;податковий&#039;&#039; || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 1 &#039;&#039;Кредит&#039;&#039; || 281.НУ || Кава Lavazza || ТОВ «Альфа» || ПУ || 7 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 0 &#039;&#039;Дебет&#039;&#039; || 902.НУ || Кава Lavazza || ТОВ «Альфа» || ПР &#039;&#039;постійна різниця&#039;&#039; || 350.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 || 1 &#039;&#039;Кредит&#039;&#039; || 281.НУ || Кава Lavazza || ТОВ «Альфа» || ПР || 350.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Відмінності від Д.6.1:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! !! З кореспонденцією !! Без кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| Один факт = || 1 запис (Дт+Кт) || 2 записи (окремо Дт, окремо Кт)&lt;br /&gt;
|-&lt;br /&gt;
| Поля рахунків || &amp;lt;code&amp;gt;acc_dt_r&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;acc_kt_r&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;acc_r&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;acc_mvt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Субконто || 2 набори (Дт, Кт) || 1 набір&lt;br /&gt;
|-&lt;br /&gt;
| Кількість записів || N || 2N&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця &amp;lt;code&amp;gt;_tc&amp;lt;/code&amp;gt; (кореспонденції) || Є || &#039;&#039;&#039;Немає&#039;&#039;&#039; — «шахова відомість» неможлива&lt;br /&gt;
|-&lt;br /&gt;
| Контроль Дт=Кт || У межах реєстратора || Опційно (може бути незбалансовано за задумом)&lt;br /&gt;
|-&lt;br /&gt;
| Коли обирати || Класичний облік, потрібен аналіз кореспонденцій || Облік без потреби в кореспонденціях, забалансовий, статистичний&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==== Д.6.3. Бюджетування ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Бюджетування&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Бюджетування&lt;br /&gt;
  correspondence: true&lt;br /&gt;
  periodicity: WithinMonth            # бюджет — помісячний, до секунди не потрібно&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Сценарій, type: &amp;quot;Довідник.СценаріїБюджетування&amp;quot;, balance: true, denyEmpty: true }&lt;br /&gt;
    - { name: ЦФВ,      type: &amp;quot;Довідник.ЦентриФінансовоїВідповідальності&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Проєкт,   type: &amp;quot;Довідник.Проєкти&amp;quot;, balance: true, nullable: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума, type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
  recorders: [Документ.БюджетнаОперація, Документ.ВведенняБюджету]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Проєктне рішення:&#039;&#039;&#039; &amp;lt;code&amp;gt;Сценарій&amp;lt;/code&amp;gt; — вимірювання, а не окремий регістр на кожен сценарій (План/Факт/Прогноз). Це дозволяє план-фактний аналіз одним запитом. Усі три вимірювання &#039;&#039;&#039;балансові&#039;&#039;&#039; — бюджетна проводка не змінює сценарій/ЦФВ між дебетом і кредитом.&lt;br /&gt;
&lt;br /&gt;
=== Д.7. Регістри розрахунку ===&lt;br /&gt;
&lt;br /&gt;
==== Д.7.1. ОсновніНарахування — період дії + витіснення ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид розрахунку !! Період дії !! Витісняючі !! Базові !! Залежність від бази&lt;br /&gt;
|-&lt;br /&gt;
| Оклад || Так || Відпустка, Лікарняний || — || Не залежить&lt;br /&gt;
|-&lt;br /&gt;
| Відпустка || Так || Лікарняний || Оклад, Премія || За періодом дії&lt;br /&gt;
|-&lt;br /&gt;
| Лікарняний || Так || — || Оклад || За періодом дії&lt;br /&gt;
|-&lt;br /&gt;
| Премія || Ні || — || Оклад || За періодом реєстрації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Декларація регістру — розділ 6.7.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Записи (&amp;lt;code&amp;gt;rg_c_0040&amp;lt;/code&amp;gt;), період реєстрації = липень 2026:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! calc_type !! period !! act_begin !! act_end !! base_begin !! base_end !! d1 (Співробітник) !! r1 (Результат)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Оклад || 2026-07-01 || 2026-07-01 || 2026-07-31 || || || Іваненко || 18 000.00&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Відпустка || 2026-07-01 || 2026-07-10 || 2026-07-17 || 2026-01-01 || 2026-06-30 || Іваненко || 6 420.00&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Лікарняний || 2026-07-01 || 2026-07-14 || 2026-07-22 || 2026-01-01 || 2026-06-30 || Іваненко || 5 180.00&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Оклад || 2026-07-01 || 2026-07-01 || 2026-07-31 || || || Петренко || 22 000.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фактичні періоди дії (&amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt;) — результат витіснення:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! rec/line !! interval_no !! calc_type !! d1 !! fact_begin !! fact_end !! Коментар&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 1 || 0 || Оклад || Іваненко || 2026-07-01 || 2026-07-09 || до відпустки&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 1 || 1 || Оклад || Іваненко || 2026-07-23 || 2026-07-31 || після лікарняного&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 2 || 0 || Відпустка || Іваненко || 2026-07-10 || 2026-07-13 || витіснена лікарняним з 14-го&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 3 || 0 || Лікарняний || Іваненко || 2026-07-14 || 2026-07-22 || не витісняється нічим&lt;br /&gt;
|-&lt;br /&gt;
| n1 / 4 || 0 || Оклад || Петренко || 2026-07-01 || 2026-07-31 || витіснення відсутнє&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Один запис «Оклад» Іваненка → два інтервали&#039;&#039;&#039; — ілюстрація зв&#039;язку 1:N у розділі 9.4.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (дані графіка для розрахунку окладу):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Дані.Співробітник, Дані.НомерРядка,&lt;br /&gt;
    Дані.ЗначенняФактичногоПеріодуДії ЯК ВідпрацьованоДнів,&lt;br /&gt;
    Дані.ЗначенняПеріодуДії           ЯК НормаДнів&lt;br /&gt;
З РегістрРозрахунку.ОсновніНарахування.ДаніГрафіка(&lt;br /&gt;
       ВидРозрахунку = ЗНАЧЕННЯ(ПланВидівРозрахунку.ОсновніНарахування.Оклад)&lt;br /&gt;
       І Реєстратор = &amp;amp;Реєстратор&lt;br /&gt;
   ) ЯК Дані&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Результат:&#039;&#039;&#039; Іваненко — &amp;lt;code&amp;gt;ВідпрацьованоДнів = 13&amp;lt;/code&amp;gt; (робочі дні у 01–09 та 23–31), &amp;lt;code&amp;gt;НормаДнів = 23&amp;lt;/code&amp;gt; → Оклад = 18 000 × 13 / 23 = &#039;&#039;&#039;10 173,91&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Запит (база для відпустки):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ База.Співробітник, База.НомерРядка, База.РезультатБаза ЯК Заробіток&lt;br /&gt;
З РегістрРозрахунку.ОсновніНарахування.БазаРозрахунку(&lt;br /&gt;
       , /* вимірювання бази */&lt;br /&gt;
       , /* вимірювання основного регістру */&lt;br /&gt;
       Співробітник,                          /* розрізи */&lt;br /&gt;
       ВидРозрахунку = ЗНАЧЕННЯ(ПланВидівРозрахунку.ОсновніНарахування.Відпустка)&lt;br /&gt;
   ) ЯК База&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Д.7.2. Утримання — без періоду дії, база за періодом реєстрації ====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt;:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Вид розрахунку !! Період дії !! Базові види розрахунку !! Залежність&lt;br /&gt;
|-&lt;br /&gt;
| ПДФО || Ні || &#039;&#039;(усі з ПВР ОсновніНарахування)&#039;&#039; || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Військовий збір || Ні || &#039;&#039;(усі з ПВР ОсновніНарахування)&#039;&#039; || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Аліменти || Ні || Оклад, Премія, Відпустка || За періодом реєстрації&lt;br /&gt;
|-&lt;br /&gt;
| Профспілковий внесок || Ні || Оклад || За періодом реєстрації&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
register:&lt;br /&gt;
  name: Утримання&lt;br /&gt;
  kind: Calculation&lt;br /&gt;
  calculationTypesPlan: ПланВидівРозрахунку.Утримання&lt;br /&gt;
  periodicity: Month&lt;br /&gt;
  actionPeriod: false                 # ← утримання не має періоду дії&lt;br /&gt;
  basePeriod: ByRegistrationPeriod    # ← база береться за періодом реєстрації&lt;br /&gt;
  # schedule: не задається — графік не потрібен&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, baseDimension: true, master: true, denyEmpty: true }&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Результат,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: БазаОподаткування, type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
  recalculations:&lt;br /&gt;
    - name: ПерерахунокУтримань&lt;br /&gt;
      dimensions:&lt;br /&gt;
        - { name: Співробітник, registerDimension: Співробітник }&lt;br /&gt;
  recorders: [Документ.НарахуванняЗарплати]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Фізична схема (спрощена — немає полів періоду дії):&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_c_0041 (&lt;br /&gt;
    rec_t       smallint     NOT NULL,&lt;br /&gt;
    rec_r       uuid         NOT NULL,&lt;br /&gt;
    line_no     int          NOT NULL,&lt;br /&gt;
    period      timestamp(0) NOT NULL,     -- період реєстрації&lt;br /&gt;
    active      boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    reversal    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    calc_type_r uuid         NOT NULL,&lt;br /&gt;
    base_begin  timestamp(0) NOT NULL,     -- ← є, бо basePeriod ≠ None&lt;br /&gt;
    base_end    timestamp(0) NOT NULL,&lt;br /&gt;
    -- act_begin / act_end ВІДСУТНІ (actionPeriod: false)&lt;br /&gt;
    d1_r        uuid         NOT NULL,&lt;br /&gt;
    d2_r        uuid         NOT NULL,&lt;br /&gt;
    r1          numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2          numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0041 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
-- Таблиця rg_c_0041_ap НЕ створюється (немає періоду дії → немає витіснення)&lt;br /&gt;
CREATE TABLE rg_c_0041_rc1 (            -- ПерерахунокУтримань&lt;br /&gt;
    rec_t smallint NOT NULL, rec_r uuid NOT NULL,&lt;br /&gt;
    calc_type_r uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    src_rec_t smallint NOT NULL, src_rec_r uuid NOT NULL,&lt;br /&gt;
    created_at timestamp(0) NOT NULL DEFAULT now(),&lt;br /&gt;
    CONSTRAINT pk_rg_c_0041_rc1 PRIMARY KEY (rec_t, rec_r, calc_type_r, d1_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Міжпланова база.&#039;&#039;&#039; Базові види розрахунку для ПВР &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt; належать до &#039;&#039;іншого&#039;&#039; ПВР — &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;. Це означає, що віртуальна таблиця &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; регістру &amp;lt;code&amp;gt;Утримання&amp;lt;/code&amp;gt; має читати записи регістру &amp;lt;code&amp;gt;ОсновніНарахування&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Вимога ФТ-25 має бути розширена:&#039;&#039;&#039; метамодель повинна дозволяти вказати &#039;&#039;регістр-джерело бази&#039;&#039;. Це &#039;&#039;&#039;відкрите питання В9&#039;&#039;&#039; (див. оновлений Додаток Г) — у 1С механізм працює через відповідність ПВР, а не регістрів, що обмежує сценарії. Пропозиція: додати до &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt; поле &amp;lt;code&amp;gt;base_register_id&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Приклад даних:&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! line !! calc_type !! period !! base_begin !! base_end !! Співробітник !! r2 (База) !! r1 (Результат)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ПДФО || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 21 773.91 || 3 919.30&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Військовий збір || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 21 773.91 || 326.61&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Аліменти || 2026-07-01 || 2026-07-01 || 2026-07-31 || Іваненко || 17 528.00 || 4 382.00&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.8. Наскрізний приклад: проведення видаткової накладної ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Документ:&#039;&#039;&#039; Видаткова накладна №12 від 05.07.2026, ТОВ «Бета», 30 кг кави за 400 грн (12 000 грн з ПДВ), собівартість 7 000 грн.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Posting {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9];&lt;br /&gt;
&lt;br /&gt;
  D [label=&amp;quot;Документ\nВидаткова накладна №12\n05.07.2026&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;, shape=note];&lt;br /&gt;
&lt;br /&gt;
  R1 [label=&amp;quot;РН ТовариНаСкладах\n(Залишки)\nВитрата: 30 кг / 7 000 грн&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R2 [label=&amp;quot;РН Взаєморозрахунки\n(Залишки)\nПрихід: 12 000 грн&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R3 [label=&amp;quot;РН Продажі\n(Обороти)\n30 кг / 12 000 / 10 000 / 7 000&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R4 [label=&amp;quot;РН ТовариВРезерві\n(Залишки)\nВитрата: 30 кг&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  R5 [label=&amp;quot;РБ Госпрозрахунковий\n3 проводки на 21 000&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  T1 [label=&amp;quot;rg_a_0012_tb\nMAXPERIOD: 80 → 50 кг&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T2 [label=&amp;quot;rg_a_0013_tb\nMAXPERIOD: 0 → +12 000&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T3 [label=&amp;quot;rg_a_0031_tt\n2026-07: +30 / +12 000&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;, shape=cylinder];&lt;br /&gt;
  T5 [label=&amp;quot;rg_b_0020_tb0/tb2/tt0/tc&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;, shape=cylinder];&lt;br /&gt;
&lt;br /&gt;
  D -&amp;gt; R1; D -&amp;gt; R2; D -&amp;gt; R3; D -&amp;gt; R4; D -&amp;gt; R5;&lt;br /&gt;
  R1 -&amp;gt; T1; R2 -&amp;gt; T2; R3 -&amp;gt; T3; R5 -&amp;gt; T5;&lt;br /&gt;
&lt;br /&gt;
  label=&amp;quot;ОДНА транзакція БД: усі 5 регістрів + підсумки + прапорець Проведений&amp;quot;;&lt;br /&gt;
  labelloc=b; fontname=&amp;quot;Helvetica&amp;quot;; fontsize=10;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
protected override void OnPosting(PostingContext ctx)&lt;br /&gt;
{&lt;br /&gt;
    // --- 0. Блокування перед контролем залишків ---&lt;br /&gt;
    var dl = new DataLock();&lt;br /&gt;
    var li = dl.Add(&amp;quot;РегістрНакопичення.ТовариНаСкладах.Залишки&amp;quot;);&lt;br /&gt;
    li.Mode = DataLockMode.Exclusive;&lt;br /&gt;
    li.DataSource = this.Товари.Unload(new[] { &amp;quot;Номенклатура&amp;quot;, &amp;quot;Характеристика&amp;quot; });&lt;br /&gt;
    li.UseFromDataSource(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Номенклатура&amp;quot;);&lt;br /&gt;
    li.UseFromDataSource(&amp;quot;Характеристика&amp;quot;, &amp;quot;Характеристика&amp;quot;);&lt;br /&gt;
    li.SetValue(&amp;quot;Склад&amp;quot;, this.Склад);&lt;br /&gt;
    dl.Lock();&lt;br /&gt;
&lt;br /&gt;
    // --- 1. РН ТовариНаСкладах: списання ---&lt;br /&gt;
    var rsGoods = Movements[&amp;quot;ТовариНаСкладах&amp;quot;];  rsGoods.Write = true;  rsGoods.Clear();&lt;br /&gt;
    foreach (var row in this.Товари) {&lt;br /&gt;
        var m = rsGoods.Add();&lt;br /&gt;
        m.Період = this.Дата;&lt;br /&gt;
        m.MovementType = AccumulationMovementType.Expense;&lt;br /&gt;
        m.Номенклатура = row.Номенклатура;  m.Характеристика = row.Характеристика;&lt;br /&gt;
        m.Склад = this.Склад;               m.Партія = row.Партія;&lt;br /&gt;
        m.Кількість = row.Кількість;        m.Сума = row.Собівартість;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // --- 2. РН Взаєморозрахунки: дебіторка зростає ---&lt;br /&gt;
    var rsAR = Movements[&amp;quot;ВзаєморозрахункиЗКонтрагентами&amp;quot;];  rsAR.Write = true;  rsAR.Clear();&lt;br /&gt;
    var ar = rsAR.Add();&lt;br /&gt;
    ar.Період = this.Дата;&lt;br /&gt;
    ar.MovementType = AccumulationMovementType.Receipt;      // Прихід = борг зростає&lt;br /&gt;
    ar.Організація = this.Організація;  ar.Контрагент = this.Контрагент;&lt;br /&gt;
    ar.Договір = this.Договір;          ar.Замовлення = this.ЗамовленняПокупця;&lt;br /&gt;
    ar.Сума = this.СумаДокумента;       ar.СумаВал = this.СумаДокументаВал;&lt;br /&gt;
&lt;br /&gt;
    // --- 3. РН Продажі: оборот (без ВидРуху!) ---&lt;br /&gt;
    var rsSales = Movements[&amp;quot;Продажі&amp;quot;];  rsSales.Write = true;  rsSales.Clear();&lt;br /&gt;
    foreach (var row in this.Товари) {&lt;br /&gt;
        var s = rsSales.Add();&lt;br /&gt;
        s.Період = this.Дата;&lt;br /&gt;
        s.Номенклатура = row.Номенклатура;  s.Контрагент = this.Контрагент;&lt;br /&gt;
        s.Договір = this.Договір;           s.Менеджер = this.Менеджер;&lt;br /&gt;
        s.Склад = this.Склад;&lt;br /&gt;
        s.Кількість = row.Кількість;        s.Сума = row.Сума;&lt;br /&gt;
        s.СумаБезПДВ = row.СумаБезПДВ;      s.Собівартість = row.Собівартість;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // --- 4. РН ТовариВРезерві: зняття резерву ---&lt;br /&gt;
    if (!this.ЗамовленняПокупця.IsEmpty()) { /* ... Витрата ... */ }&lt;br /&gt;
&lt;br /&gt;
    // --- 5. РБ Госпрозрахунковий: проводки ---&lt;br /&gt;
    var rsAcc = Movements[&amp;quot;Госпрозрахунковий&amp;quot;];  rsAcc.Write = true;  rsAcc.Clear();&lt;br /&gt;
    foreach (var row in this.Товари) {&lt;br /&gt;
        var e1 = rsAcc.AddAccountingEntry();       // Дт 361 / Кт 702&lt;br /&gt;
        e1.Період = this.Дата;&lt;br /&gt;
        e1.РахунокДт = Accounts[&amp;quot;361&amp;quot;];  e1.РахунокКт = Accounts[&amp;quot;702&amp;quot;];&lt;br /&gt;
        e1.SubcontoDt[ВидиСубконто.Контрагенти] = this.Контрагент;&lt;br /&gt;
        e1.SubcontoDt[ВидиСубконто.Договори]    = this.Договір;&lt;br /&gt;
        e1.SubcontoKt[ВидиСубконто.Номенклатура] = row.Номенклатура;&lt;br /&gt;
        e1.Організація = this.Організація;&lt;br /&gt;
        e1.Сума = row.Сума;  e1.КількістьКт = row.Кількість;&lt;br /&gt;
&lt;br /&gt;
        var e2 = rsAcc.AddAccountingEntry();       // Дт 702 / Кт 641&lt;br /&gt;
        /* ... ПДВ ... */&lt;br /&gt;
&lt;br /&gt;
        var e3 = rsAcc.AddAccountingEntry();       // Дт 902 / Кт 281&lt;br /&gt;
        /* ... собівартість ... */&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    rsGoods.WriteNow();                            // примусовий запис до контролю&lt;br /&gt;
    ControlNegativeBalances(ctx);                  // прикладна перевірка&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Що відбувається у БД (одна транзакція):&#039;&#039;&#039;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Крок !! Таблиця !! Операція !! Рядків&lt;br /&gt;
|-&lt;br /&gt;
| 1 || &amp;lt;code&amp;gt;doc_0003&amp;lt;/code&amp;gt; || UPDATE posted = true || 1&lt;br /&gt;
|-&lt;br /&gt;
| 2 || &amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt; (ТовариНаСкладах) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 3 || &amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt; || MERGE (MAXPERIOD + періоди &amp;gt; 07.2026) || 2&lt;br /&gt;
|-&lt;br /&gt;
| 4 || &amp;lt;code&amp;gt;rg_a_0013&amp;lt;/code&amp;gt; (Взаєморозрахунки) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 5 || &amp;lt;code&amp;gt;rg_a_0013_tb&amp;lt;/code&amp;gt; || MERGE || 2&lt;br /&gt;
|-&lt;br /&gt;
| 6 || &amp;lt;code&amp;gt;rg_a_0031&amp;lt;/code&amp;gt; (Продажі) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 7 || &amp;lt;code&amp;gt;rg_a_0031_tt&amp;lt;/code&amp;gt; || MERGE (тільки період 2026-07) || 1&lt;br /&gt;
|-&lt;br /&gt;
| 8 || &amp;lt;code&amp;gt;rg_a_0031_ag1&amp;lt;/code&amp;gt; || MERGE (realtime-агрегат) || 1&lt;br /&gt;
|-&lt;br /&gt;
| 9 || &amp;lt;code&amp;gt;rg_a_0014&amp;lt;/code&amp;gt; (Резерв) || DELETE + INSERT || 1&lt;br /&gt;
|-&lt;br /&gt;
| 10 || &amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt; (проводки) || DELETE + INSERT || 3&lt;br /&gt;
|-&lt;br /&gt;
| 11 || &amp;lt;code&amp;gt;rg_b_0020_tb0&amp;lt;/code&amp;gt; || MERGE || 10&lt;br /&gt;
|-&lt;br /&gt;
| 12 || &amp;lt;code&amp;gt;rg_b_0020_tb1/tb2&amp;lt;/code&amp;gt; || MERGE || 8&lt;br /&gt;
|-&lt;br /&gt;
| 13 || &amp;lt;code&amp;gt;rg_b_0020_tt0..tt2&amp;lt;/code&amp;gt; || MERGE || 12&lt;br /&gt;
|-&lt;br /&gt;
| 14 || &amp;lt;code&amp;gt;rg_b_0020_tc&amp;lt;/code&amp;gt; || MERGE || 3&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;Разом&#039;&#039;&#039; || &#039;&#039;&#039;≈ 47 рядків, 1 COMMIT&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Спостереження для НФВ-04.&#039;&#039;&#039; Один рядок товару в накладній породжує ~47 модифікацій рядків у 14 таблицях. Для накладної зі 100 рядків це ~2 000–4 000 модифікацій. Саме тут — основне навантаження проведення, і саме тому РБ (кроки 10–14) дає ~70 % вартості транзакції. Це аргумент на користь MVP без РБ (розділ 14) і предмет вимірювання в НТ-03.}}&lt;br /&gt;
&lt;br /&gt;
=== Д.9. Наскрізний приклад: розрахунок зарплати ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
КРОК 1. Документ «Нарахування зарплати» за липень 2026, Іваненко.&lt;br /&gt;
        Записуємо рухи в РР ОсновніНарахування (Результат = 0).&lt;br /&gt;
&lt;br /&gt;
КРОК 2. Платформа автоматично будує фактичні періоди дії (rg_c_0040_ap):&lt;br /&gt;
        Оклад      → [01.07–09.07], [23.07–31.07]&lt;br /&gt;
        Відпустка  → [10.07–13.07]&lt;br /&gt;
        Лікарняний → [14.07–22.07]&lt;br /&gt;
&lt;br /&gt;
КРОК 3. Розрахунок «первинних» видів (без бази) — Оклад.&lt;br /&gt;
        Запит до ДаніГрафіка:&lt;br /&gt;
          НормаДнів            = 23 (робочих днів у липні за П&#039;ятиденкою)&lt;br /&gt;
          ВідпрацьованоДнів    = 13 (робочі дні у фактичних періодах дії)&lt;br /&gt;
        Результат = 18 000 × 13 / 23 = 10 173,91&lt;br /&gt;
        → UPDATE rg_c_0040 SET r1 = 10173.91, r2 = 13, r3 = 23 WHERE line_no = 1&lt;br /&gt;
&lt;br /&gt;
КРОК 4. Розрахунок видів із базою — Відпустка, Лікарняний.&lt;br /&gt;
        Запит до БазаРозрахунку (базовий період 01.01–30.06, база = Оклад+Премія):&lt;br /&gt;
          Заробіток за 6 міс. = 115 560,00&lt;br /&gt;
          Календарних днів    = 181&lt;br /&gt;
          Середньоденний      = 638,45&lt;br /&gt;
        Відпустка: 638,45 × 4 дні (10–13.07) = 2 553,80&lt;br /&gt;
        Лікарняний: 638,45 × 9 днів × 100 % = 5 746,05&lt;br /&gt;
        → UPDATE rg_c_0040 SET r1 = ... WHERE line_no IN (2, 3)&lt;br /&gt;
&lt;br /&gt;
КРОК 5. Записуємо рухи в РР Утримання (базовий період = період реєстрації, липень).&lt;br /&gt;
        База ПДФО = 10 173,91 + 2 553,80 + 5 746,05 = 18 473,76&lt;br /&gt;
        ПДФО = 18 473,76 × 18 % = 3 325,28&lt;br /&gt;
        ВЗ   = 18 473,76 × 1,5 % =   277,11&lt;br /&gt;
&lt;br /&gt;
КРОК 6. Проведення документа → рухи в:&lt;br /&gt;
        РН ВитратиЗаСтаттями (Обороти):  Стаття «ЗП і нарахування» = 18 473,76&lt;br /&gt;
        РБ Госпрозрахунковий:            Дт 92 / Кт 661 = 18 473,76&lt;br /&gt;
                                         Дт 661 / Кт 641.ПДФО = 3 325,28&lt;br /&gt;
                                         Дт 661 / Кт 642.ВЗ =     277,11&lt;br /&gt;
&lt;br /&gt;
КРОК 7. Через тиждень бухгалтер змінює Оклад Іваненка за червень (заднім числом).&lt;br /&gt;
        → Платформа реєструє в rg_c_0040_rc1 (ПерерахунокЗаБазою):&lt;br /&gt;
             (Реєстратор = НарахуванняЗП липня, ВидРозрахунку = Відпустка,  Співробітник = Іваненко)&lt;br /&gt;
             (Реєстратор = НарахуванняЗП липня, ВидРозрахунку = Лікарняний, Співробітник = Іваненко)&lt;br /&gt;
        → Звіт «Документи до перерахунку» показує липневий документ.&lt;br /&gt;
        → Бухгалтер перепроводить → база перераховується → записи перерахунку очищаються.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Д.10. Антипатерни проєктування регістрів ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Антипатерн !! Чому погано !! Як правильно&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-1&#039;&#039;&#039; || Дата як &#039;&#039;&#039;вимірювання&#039;&#039;&#039; у РН (замість стандартного &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;) || Таблиця підсумків множиться на кількість дат і зростає нескінченно; віртуальні таблиці &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; ігнорують це вимірювання і дають безглузді результати || Використовувати стандартний реквізит &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt;. Виняток — календарі (Д.3.4), де це РВ, а не РН&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-2&#039;&#039;&#039; || РН «Залишки» там, де потрібна лише історія значення || Надлишкові таблиці підсумків, кумулятивні оновлення, вид руху без сенсу || РВ періодичний&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-3&#039;&#039;&#039; || РН «Залишки» там, де залишок безглуздий (Продажі, Витрати) || Удвічі більший обсяг підсумків, кумулятивні MERGE на всі майбутні періоди || РН «Обороти» + агрегати (Д.5.1)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-4&#039;&#039;&#039; || Реквізит документа продубльовано у вимірювання «щоб фільтрувати у звіті» || Кардинальність підсумків × N; типовий випадок — Менеджер/Валюта/Коментар || Реквізит регістру + з&#039;єднання з документом у звіті; або окремий регістр «Обороти»&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-5&#039;&#039;&#039; || &amp;gt; 8 вимірювань в одному РН || Таблиця підсумків стає &#039;&#039;&#039;більшою&#039;&#039;&#039; за таблицю рухів; проведення сповільнюється в рази || Розділити на регістри за призначенням; частину аналітики — в «Обороти» з агрегатами&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-6&#039;&#039;&#039; || Незалежний РВ «у межах секунди» як журнал подій || Два записи в ту саму секунду → другий &#039;&#039;&#039;мовчки замістить&#039;&#039;&#039; перший; втрата даних || Підпорядкований РВ (реєстратор у ключі) або додати вимірювання-дискримінатор&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-7&#039;&#039;&#039; || Ресурс типу &amp;lt;code&amp;gt;Рядок&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Посилання&amp;lt;/code&amp;gt; у РН || Підсумовування неможливе; підсумки не побудуються || Реквізит (не агрегується) або вимірювання (якщо це розріз)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-8&#039;&#039;&#039; || Прямий &amp;lt;code&amp;gt;UPDATE&amp;lt;/code&amp;gt; таблиці підсумків із прикладного коду || Розсинхронізація підсумків і рухів; діагностика — тижні || Тільки через набори записів. Заборона на рівні прав БД (розділ 12.2)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-9&#039;&#039;&#039; || Один «універсальний» регістр із вимірюванням &amp;lt;code&amp;gt;ВидОбліку&amp;lt;/code&amp;gt; (БУ/ПУ/УО) замість трьох || Втричі більша таблиця; конкуренція за блокування між незалежними обліками; неможливо окремо перерахувати підсумки || Окремі регістри. Виняток — РБ &amp;lt;code&amp;gt;ПодатковийОблік&amp;lt;/code&amp;gt; (Д.6.2), де ВидРізниці — це справді розріз одного обліку&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-10&#039;&#039;&#039; || Функціонально залежне поле як вимірювання (Валюта при БанківськомуРахунку) || Надлишковість; ризик неузгоджених даних; зайвий розмір ключа підсумків || З&#039;єднання з довідником у запиті (Д.4.4)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-11&#039;&#039;&#039; || РБ там, де достатньо РН || Замість 1 таблиці — 10; ~70 % вартості проведення (Д.8); складність субконто без потреби || РН. РБ — лише коли потрібні план рахунків, подвійний запис і кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-12&#039;&#039;&#039; || Вимірювання з &amp;lt;code&amp;gt;nullable&amp;lt;/code&amp;gt; без потреби || Порожнє посилання — окреме значення ключа; підсумки «розмазуються» на два рядки замість одного || &amp;lt;code&amp;gt;denyEmpty: true&amp;lt;/code&amp;gt; скрізь, де порожнє значення не має сенсу&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-13&#039;&#039;&#039; || Контроль залишків &#039;&#039;&#039;до&#039;&#039;&#039; запису рухів || Класична гонитва: два сеанси проходять контроль і обидва списують у мінус || Спершу &amp;lt;code&amp;gt;DataLock&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;WriteNow()&amp;lt;/code&amp;gt; → потім контроль (Д.8, ФТ-Т-12)&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;А-14&#039;&#039;&#039; || &amp;lt;code&amp;gt;periodicity: WithinSecond&amp;lt;/code&amp;gt; «про всяк випадок» скрізь || Для РВ — неможливість замістити запис за день; для РН — марна точність, більші індекси || Обирати мінімально достатню: день для цін/курсів/виписок, секунда — для складських рухів&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Д.11. Чек-лист рев&#039;ю нового регістру ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
□ Тип регістру обґрунтований за деревом Д.1&lt;br /&gt;
□ Кожне вимірювання використовується у фільтрі АБО групуванні звітів&lt;br /&gt;
□ Кожен ресурс має сенс при підсумовуванні&lt;br /&gt;
□ Немає полів з антипатернів А-1, А-4, А-7, А-10, А-12&lt;br /&gt;
□ Оцінка кардинальності підсумків ≤ 10^8 (калькулятор конструктора, ФТ-К-03)&lt;br /&gt;
□ Для вимірювань, де порожнє значення безглузде, стоїть denyEmpty&lt;br /&gt;
□ Ведучі (master) вимірювання визначені — інакше «висячі» записи при видаленні об&#039;єктів&lt;br /&gt;
□ Склад реєстраторів повний; зайвих типів документів немає&lt;br /&gt;
□ Угода про знак / вид руху зафіксована в методологічній документації&lt;br /&gt;
□ Періодичність мінімально достатня (А-14)&lt;br /&gt;
□ Для РН «Обороти» з &amp;gt;4 вимірюваннями визначено ≥1 агрегат&lt;br /&gt;
□ Для РБ: балансові/небалансові вимірювання та ресурси розставлені свідомо&lt;br /&gt;
□ Для РР: витісняючі та базові види розрахунку в ПВР заповнені; перерахунки визначені&lt;br /&gt;
□ Партиціонування ввімкнене, якщо очікується &amp;gt;100 млн записів&lt;br /&gt;
□ Написано тест на проведення + скасування + перерахунок підсумків&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;Кінець документа. Версія 1.1. Підлягає узгодженню з архітектором платформи K2 ERP до затвердження.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2758</id>
		<title>Регістри в K2 ERP</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A0%D0%B5%D0%B3%D1%96%D1%81%D1%82%D1%80%D0%B8_%D0%B2_K2_ERP&amp;diff=2758"/>
		<updated>2026-07-17T18:31:01Z</updated>

		<summary type="html">&lt;p&gt;R: Створена сторінка: {{DISPLAYTITLE:ТЗ. Підсистема регістрів K2 ERP}} __TOC__  = 1. Паспорт документа =  {| class=&amp;quot;wikitable&amp;quot; ! Атрибут !! Значення |- | Назва || Технічне завдання на розробку підсистеми «Регістри» платформи K2 ERP |- | Шифр || K2-ERP-TZ-REG-001 |- | Версія || 1.0 (чернетка на узгодження) |- | Статус || На роз...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{DISPLAYTITLE:ТЗ. Підсистема регістрів K2 ERP}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
= 1. Паспорт документа =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Атрибут !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Назва || Технічне завдання на розробку підсистеми «Регістри» платформи K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| Шифр || K2-ERP-TZ-REG-001&lt;br /&gt;
|-&lt;br /&gt;
| Версія || 1.0 (чернетка на узгодження)&lt;br /&gt;
|-&lt;br /&gt;
| Статус || На розгляді&lt;br /&gt;
|-&lt;br /&gt;
| Замовник || &#039;&#039;[підрозділ-замовник]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Виконавець || &#039;&#039;[команда платформи K2 ERP]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Тип документа || Технічне завдання (ГОСТ 34.602 адаптовано)&lt;br /&gt;
|-&lt;br /&gt;
| Аналог / прототип || Механізм регістрів платформи «1С:Підприємство 8.3»&lt;br /&gt;
|-&lt;br /&gt;
| Мова розробки || &#039;&#039;[уточнити: C#/.NET | Delphi | Java]&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| СКБД || PostgreSQL 14+ (основна), MS SQL Server 2019+ (додаткова)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 1.1. Необхідні розширення MediaWiki для перегляду ==&lt;br /&gt;
&lt;br /&gt;
Документ використовує теги діаграм. Для коректного рендерингу потрібні:&lt;br /&gt;
* &amp;lt;code&amp;gt;Extension:GraphViz&amp;lt;/code&amp;gt; — тег &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;graphviz&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Extension:PlantUML&amp;lt;/code&amp;gt; — тег &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;plantuml&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
* &amp;lt;code&amp;gt;Extension:SyntaxHighlight_GeSHi&amp;lt;/code&amp;gt; — тег &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;syntaxhighlight&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Також використовується шаблон &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{Note|текст}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;. Якщо його немає у вашій вікі — створіть сторінку &amp;lt;code&amp;gt;Template:Note&amp;lt;/code&amp;gt; з вмістом:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left:4px solid #36c; background:#eaf3ff; padding:8px 12px; margin:8px 0;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;ⓘ&#039;&#039;&#039; {{{1}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Якщо розширення недоступні — блоки діаграм відображатимуться як текстовий вихідний код; дублюючі ASCII-схеми наведені в тілі документа.&lt;br /&gt;
&lt;br /&gt;
= 2. Терміни, визначення та скорочення =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Термін !! Визначення&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Регістр&#039;&#039;&#039; || Об&#039;єкт метаданих, призначений для зберігання та накопичення структурованої облікової інформації у вигляді записів фіксованої структури, з механізмами агрегації, зрізів і транзакційного зв&#039;язку з документами-реєстраторами.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РВ&#039;&#039;&#039; || Регістр відомостей (аналог «Регистр сведений»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН&#039;&#039;&#039; || Регістр накопичення (аналог «Регистр накопления»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РБ&#039;&#039;&#039; || Регістр бухгалтерії (аналог «Регистр бухгалтерии»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РР&#039;&#039;&#039; || Регістр розрахунку (аналог «Регистр расчёта»).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Вимірювання&#039;&#039;&#039; (Dimension) || Поле регістру, що визначає розріз аналітики; входить у ключ запису/підсумку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Ресурс&#039;&#039;&#039; (Resource) || Поле регістру, значення якого підсумовується (для РН/РБ/РР) або зберігається як значення (для РВ).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реквізит&#039;&#039;&#039; (Attribute) || Довідкове поле запису, що не бере участі в ключі та не агрегується.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Реєстратор&#039;&#039;&#039; (Recorder) || Документ, який породив набір записів регістру та володіє ним.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рухи&#039;&#039;&#039; (Movements) || Записи регістру, підпорядковані конкретному реєстратору.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Набір записів&#039;&#039;&#039; (RecordSet) || Прикладний об&#039;єкт для читання/запису групи записів регістру за заданим відбором.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Підсумки&#039;&#039;&#039; (Totals) || Попередньо розраховані агрегати (залишки/обороти), що зберігаються в окремих таблицях.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ТА&#039;&#039;&#039; || Точка актуальності підсумків — момент часу, до якого підсумки розраховані.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Зріз останніх&#039;&#039;&#039; (SliceLast) || Вибірка останніх за періодом записів РВ у розрізі кожної комбінації вимірювань.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Субконто&#039;&#039;&#039; (ExtDimension, ED) || Додатковий розріз аналітики бухгалтерського рахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;ПВР&#039;&#039;&#039; || План видів розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Витіснення&#039;&#039;&#039; || Механізм РР: запис із вищим пріоритетом скорочує фактичний період дії запису з нижчим.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (Recalculation) || Підпорядкований РР об&#039;єкт, що реєструє записи, які потребують повторного розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Віртуальна таблиця&#039;&#039;&#039; || Обчислювана таблиця в мові запитів, що не має фізичного відповідника (Залишки, Обороти, ЗрізОстанніх тощо).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 3. Призначення, цілі та підстава розробки =&lt;br /&gt;
&lt;br /&gt;
== 3.1. Підстава ==&lt;br /&gt;
Поточна модель K2 ERP не має уніфікованого декларативного механізму накопичувального обліку. Регістроподібні структури реалізуються &#039;&#039;ad hoc&#039;&#039; — окремими таблицями та процедурами під кожну прикладну задачу, що спричиняє:&lt;br /&gt;
* дублювання коду розрахунку залишків та оборотів;&lt;br /&gt;
* відсутність гарантованої узгодженості «документ ↔ рухи»;&lt;br /&gt;
* деградацію продуктивності на великих обсягах (повний перерахунок з початку обліку);&lt;br /&gt;
* високу вартість введення нової аналітики (зміна схеми БД + правка десятків процедур).&lt;br /&gt;
&lt;br /&gt;
== 3.2. Мета ==&lt;br /&gt;
Створити в K2 ERP підсистему &#039;&#039;&#039;декларативно описуваних регістрів&#039;&#039;&#039; чотирьох типів, функціонально еквівалентну механізму регістрів «1С:Підприємство 8.3», з автоматичною генерацією схеми БД, підтримкою підсумків, віртуальних таблиць у мові запитів і транзакційного проведення документів.&lt;br /&gt;
&lt;br /&gt;
== 3.3. Цілі проєкту (вимірювані) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Ціль !! Критерій досягнення&lt;br /&gt;
|-&lt;br /&gt;
| Ц1 || Декларативне визначення регістру || Новий регістр з 5 вимірюваннями та 3 ресурсами створюється в конструкторі без написання коду; DDL генерується автоматично.&lt;br /&gt;
|-&lt;br /&gt;
| Ц2 || Автоматична агрегація || Залишки/обороти доступні запитом без ручних процедур перерахунку.&lt;br /&gt;
|-&lt;br /&gt;
| Ц3 || Продуктивність || Отримання залишків на дату за таблицею 1 млрд рухів — ≤ 200 мс (P95) на еталонному стенді.&lt;br /&gt;
|-&lt;br /&gt;
| Ц4 || Цілісність || Неможливість існування рухів без активного реєстратора (100 % сценаріїв у тесті цілісності).&lt;br /&gt;
|-&lt;br /&gt;
| Ц5 || Міграція || Перенесення ≥ 90 % наявних «регістроподібних» структур K2 на новий механізм без втрати даних.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 3.4. Що НЕ входить до обсягу (Out of scope) ==&lt;br /&gt;
* Механізм розподілених інформаційних баз / реплікації рухів (окреме ТЗ).&lt;br /&gt;
* Візуальний конструктор звітів поверх регістрів (окреме ТЗ, залежність).&lt;br /&gt;
* OLAP-куби та зовнішні аналітичні вітрини.&lt;br /&gt;
* Автоматичне перенесення прикладного коду замовника (тільки дані + мапінг).&lt;br /&gt;
&lt;br /&gt;
= 4. Припущення та обмеження щодо платформи K2 ERP =&lt;br /&gt;
&lt;br /&gt;
{{Note|Розділ фіксує припущення, які &#039;&#039;&#039;обов&#039;язково&#039;&#039;&#039; підлягають верифікації з архітектором платформи до затвердження ТЗ. Місця, що потребують уточнення, позначені як &#039;&#039;[уточнити]&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Припущення !! Наслідок для ТЗ&lt;br /&gt;
|-&lt;br /&gt;
| П1 || K2 ERP має підсистему метаданих із власним репозиторієм об&#039;єктів (документи, довідники, перерахування) і механізмом версіонування конфігурації. || Регістр вбудовується як новий &#039;&#039;&#039;рід&#039;&#039;&#039; об&#039;єкта метаданих у наявний репозиторій (розділ 6).&lt;br /&gt;
|-&lt;br /&gt;
| П2 || Об&#039;єкти-документи мають унікальний ідентифікатор посилання (GUID/UUID) та проведення як окрему операцію. || Реєстратор адресується парою «код типу + UUID» (розділ 8.2).&lt;br /&gt;
|-&lt;br /&gt;
| П3 || Платформа має власну мову запитів або транслятор у SQL. || Віртуальні таблиці реалізуються на рівні транслятора (розділ 7.6). Якщо мови запитів немає — потрібен окремий етап Е0 (розділ 14).&lt;br /&gt;
|-&lt;br /&gt;
| П4 || Цільова СКБД підтримує &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;INSERT ... ON CONFLICT&amp;lt;/code&amp;gt;, віконні функції, часткові та покривні індекси. || Алгоритми підсумків (розділ 10) використовують ці можливості.&lt;br /&gt;
|-&lt;br /&gt;
| П5 || Прикладний код виконується на сервері застосунків із керованими транзакціями. || Проведення документа — одна транзакція БД (розділ 7.1).&lt;br /&gt;
|-&lt;br /&gt;
| П6 || Максимальна довжина ідентифікатора об&#039;єкта БД — 63 символи (PostgreSQL). || Фізичні імена таблиць будуються за сурогатним числовим кодом, а не за іменем регістру (розділ 8.1).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Обмеження:&#039;&#039;&#039;&lt;br /&gt;
* О1. Зміна складу вимірювань/ресурсів існуючого регістру — операція реструктуризації з простоєм; онлайн-міграція не гарантується для таблиць &amp;gt; 100 млн записів.&lt;br /&gt;
* О2. Підсистема не гарантує коректність прикладної логіки проведення — лише цілісність механізму.&lt;br /&gt;
* О3. Мінімальна дискретність періоду — 1 секунда (тип &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt;) &#039;&#039;[уточнити: чи потрібна мілісекундна]&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
= 5. Класифікація регістрів =&lt;br /&gt;
&lt;br /&gt;
== 5.1. Дерево типів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph Registers {&lt;br /&gt;
  rankdir=TB;&lt;br /&gt;
  bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=box, style=&amp;quot;rounded,filled&amp;quot;, fillcolor=&amp;quot;#f5f5f5&amp;quot;, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=10];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  R [label=&amp;quot;РЕГІСТР\n(абстрактний об&#039;єкт метаданих)&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI [label=&amp;quot;Регістр відомостей\n(РВ / Information)&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA [label=&amp;quot;Регістр накопичення\n(РН / Accumulation)&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  RB [label=&amp;quot;Регістр бухгалтерії\n(РБ / Accounting)&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RC [label=&amp;quot;Регістр розрахунку\n(РР / Calculation)&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  R -&amp;gt; RI; R -&amp;gt; RA; R -&amp;gt; RB; R -&amp;gt; RC;&lt;br /&gt;
&lt;br /&gt;
  RI_np [label=&amp;quot;Неперіодичний&amp;quot;];&lt;br /&gt;
  RI_p  [label=&amp;quot;Періодичний&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_np; RI -&amp;gt; RI_p;&lt;br /&gt;
&lt;br /&gt;
  RI_i [label=&amp;quot;Незалежний\n(режим запису)&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI_s [label=&amp;quot;Підпорядкований\nреєстратору&amp;quot;, shape=note, fillcolor=&amp;quot;#ffffff&amp;quot;];&lt;br /&gt;
  RI -&amp;gt; RI_i [style=dashed]; RI -&amp;gt; RI_s [style=dashed];&lt;br /&gt;
&lt;br /&gt;
  RA_b [label=&amp;quot;Вид: Залишки\n(Balance)&amp;quot;];&lt;br /&gt;
  RA_t [label=&amp;quot;Вид: Обороти\n(Turnover)&amp;quot;];&lt;br /&gt;
  RA -&amp;gt; RA_b; RA -&amp;gt; RA_t;&lt;br /&gt;
&lt;br /&gt;
  RB_c [label=&amp;quot;З кореспонденцією\n(подвійний запис)&amp;quot;];&lt;br /&gt;
  RB_n [label=&amp;quot;Без кореспонденції\n(уніграфічний)&amp;quot;];&lt;br /&gt;
  RB -&amp;gt; RB_c; RB -&amp;gt; RB_n;&lt;br /&gt;
&lt;br /&gt;
  RC_a [label=&amp;quot;З періодом дії\n(+ витіснення)&amp;quot;];&lt;br /&gt;
  RC_b [label=&amp;quot;З базовим періодом\n(+ база розрахунку)&amp;quot;];&lt;br /&gt;
  RC_g [label=&amp;quot;З графіком часу&amp;quot;];&lt;br /&gt;
  RC -&amp;gt; RC_a; RC -&amp;gt; RC_b; RC -&amp;gt; RC_g;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 5.2. Порівняльна матриця типів ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Характеристика !! РВ !! РН (Залишки) !! РН (Обороти) !! РБ !! РР&lt;br /&gt;
|-&lt;br /&gt;
| Ключ запису || Вимірювання (+Період) або Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№ || Реєстратор+№&lt;br /&gt;
|-&lt;br /&gt;
| Незалежний запис || &#039;&#039;&#039;Так&#039;&#039;&#039; || Ні || Ні || Ні || Ні&lt;br /&gt;
|-&lt;br /&gt;
| Періодичність || Опційна || Обов&#039;язкова (Період) || Обов&#039;язкова || Обов&#039;язкова || Обов&#039;язкова&lt;br /&gt;
|-&lt;br /&gt;
| Ресурси підсумовуються || Ні || Так (±) || Так (+) || Так (Дт/Кт) || Так&lt;br /&gt;
|-&lt;br /&gt;
| Вид руху (Прихід/Витрата) || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || Дт/Кт || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця залишків || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Таблиця оборотів || — || Так (опц.) || &#039;&#039;&#039;Так&#039;&#039;&#039; || Так || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із планом рахунків || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Зв&#039;язок із ПВР || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Період дії / витіснення || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Базовий період || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Графік часу || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Субконто || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерахунки || — || — || — || — || &#039;&#039;&#039;Так&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| Типові приклади || Курси валют, ціни, кадрова історія, графік роботи || Товари на складах, взаєморозрахунки || Продажі, витрати за статтями || Госпрозрахунковий, управлінський, податковий облік || Нарахування ЗП, утримання&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 6. Метамодель: як регістр задається =&lt;br /&gt;
&lt;br /&gt;
== 6.1. Місце в репозиторії метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Конфігурація K2 ERP&lt;br /&gt;
├── Довідники&lt;br /&gt;
├── Документи&lt;br /&gt;
├── Плани рахунків              ← використовується РБ&lt;br /&gt;
├── Плани видів характеристик   ← використовується як тип субконто / вимірювання&lt;br /&gt;
├── Плани видів розрахунку      ← використовується РР&lt;br /&gt;
└── Регістри                    ◄── НОВИЙ РОЗДІЛ&lt;br /&gt;
    ├── Регістри відомостей&lt;br /&gt;
    │   └── КурсиВалют&lt;br /&gt;
    │       ├── Вимірювання      → Валюта&lt;br /&gt;
    │       ├── Ресурси          → Курс, Кратність&lt;br /&gt;
    │       ├── Реквізити        →&lt;br /&gt;
    │       └── Форми            → ФормаСписку, ФормаЗапису&lt;br /&gt;
    ├── Регістри накопичення&lt;br /&gt;
    │   └── ТовариНаСкладах&lt;br /&gt;
    │       ├── Вимірювання      → Номенклатура, Склад, Партія&lt;br /&gt;
    │       ├── Ресурси          → Кількість, Сума&lt;br /&gt;
    │       ├── Реквізити        → Коментар&lt;br /&gt;
    │       └── Реєстратори      → [ПрихіднаНакладна, ВидатковаНакладна, ...]&lt;br /&gt;
    ├── Регістри бухгалтерії&lt;br /&gt;
    │   └── Госпрозрахунковий&lt;br /&gt;
    │       ├── Вимірювання      → Організація, Підрозділ(небаланс.)&lt;br /&gt;
    │       ├── Ресурси          → Сума(баланс.), Кількість(небаланс.), ВалютнаСума&lt;br /&gt;
    │       ├── Реквізити        → Зміст, № журналу&lt;br /&gt;
    │       └── Реєстратори      → [...]&lt;br /&gt;
    └── Регістри розрахунку&lt;br /&gt;
        └── Нарахування&lt;br /&gt;
            ├── Вимірювання      → Співробітник(баз.), Підрозділ&lt;br /&gt;
            ├── Ресурси          → Результат, ВідпрацьованоДнів&lt;br /&gt;
            ├── Реквізити        → Графік&lt;br /&gt;
            ├── Перерахунки      → ПерерахунокЗаБазою&lt;br /&gt;
            └── Реєстратори      → [НарахуванняЗП]&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6.2. Загальні властивості будь-якого регістру ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Тип !! Обов&#039;язк. !! Опис / допустимі значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt; || Ідентифікатор || Так || Унікальне в межах роду. Латиниця/кирилиця, ≤ 80 симв., без пробілів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Рядок || Ні || Подання для користувача.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Коментар&amp;lt;/code&amp;gt; || Текст || Ні || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Відомостей&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Накопичення&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Бухгалтерії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Розрахунку&amp;lt;/code&amp;gt;. &#039;&#039;&#039;Незмінна після створення.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Незалежний&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;. Для РН/РБ/РР — примусово &amp;lt;code&amp;gt;ПідпорядкованийРеєстратору&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Перелік || Так || &amp;lt;code&amp;gt;Неперіодичний&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахСекунди&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахДня&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахМісяця&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахКварталу&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВМежахРоку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратори&amp;lt;/code&amp;gt; || Список посилань на типи документів || Умовно || Обов&#039;язково для РН/РБ/РР та підпорядкованого РВ. Порожній список = регістр непридатний до запису.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БлокуванняДаних&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Автоматичне&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt; (за замовчуванням &amp;lt;code&amp;gt;Кероване&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВключатиДоЗвітів&amp;lt;/code&amp;gt; || Булево || Ні || Показувати в універсальному конструкторі звітів.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПравоДоступуЗаЗамовчуванням&amp;lt;/code&amp;gt; || Перелік || Ні || &amp;lt;code&amp;gt;Заборонено&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиРLS&amp;lt;/code&amp;gt; || Булево || Ні || Row-level security (розділ 7.9).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Партиціонування&amp;lt;/code&amp;gt; || Структура || Ні || &amp;lt;code&amp;gt;Немає&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодом(RANGE, крок)&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаВимірюванням(HASH, n)&amp;lt;/code&amp;gt;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.3. Поля регістру ==&lt;br /&gt;
&lt;br /&gt;
Кожне поле має:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Синонім&amp;lt;/code&amp;gt; || Ідентифікація.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Роль&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Ресурс&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Реквізит&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Тип&amp;lt;/code&amp;gt; || Примітивний (&amp;lt;code&amp;gt;Число(p,s)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Рядок(n)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Булево&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;УНІ&amp;lt;/code&amp;gt;), посилальний (&amp;lt;code&amp;gt;Довідник.X&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Документ.Y&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перерахування.Z&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланРахунків.A&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПланВидівХарактеристик.B&amp;lt;/code&amp;gt;) або &#039;&#039;&#039;складений&#039;&#039;&#039; (список типів).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Не індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Індексувати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ІндексуватиЗДодаткомВимірювань&amp;lt;/code&amp;gt;.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Ведуче&amp;lt;/code&amp;gt; (Master) || Тільки для вимірювань. Якщо &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; — записи регістру видаляються разом з об&#039;єктом, на який посилається вимірювання; регістр показується у формі цього об&#039;єкта.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || Брати участь у стандартному відборі форми списку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗаборонитиНезаповненіЗначення&amp;lt;/code&amp;gt; || Валідація на запис.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Специфічні прапорці полів по типах регістрів:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Прапорець !! Застосовний до !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Балансовий&amp;lt;/code&amp;gt; || Ресурс/Вимірювання РБ || Ресурс бере участь у контролі рівності Дт=Кт; має єдине значення на запис (а не пару Дт/Кт). Вимірювання балансове — однакове для Дт і Кт.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Облік&amp;lt;/code&amp;gt; (AccountingFlag) || Ресурс РБ || Посилання на ознаку обліку рахунка з ПР; ресурс заповнюється, лише якщо ознака встановлена.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОблікСубконто&amp;lt;/code&amp;gt; || Ресурс РБ || Посилання на ознаку обліку субконто (напр. кількісний облік у розрізі субконто).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Базове&amp;lt;/code&amp;gt; (BaseDimension) || Вимірювання РР || Використовується для зіставлення записів під час отримання бази розрахунку.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВикористовуватиПоточніЗначення&amp;lt;/code&amp;gt; || Ресурс/Реквізит РР || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.4. Специфічні властивості за типами ==&lt;br /&gt;
&lt;br /&gt;
=== 6.4.1. Регістр відомостей ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || Неперіодичний … ПоПозиціїРеєстратора || Визначає наявність поля &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; і його гранулярність.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимЗапису&amp;lt;/code&amp;gt; || Незалежний / ПідпорядкованийРеєстратору || У незалежному ключ = (Період) + Вимірювання.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОсновнийВідбір&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумки&amp;lt;/code&amp;gt; || — || У РВ підсумків немає; замість них — зрізи.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ключ унікальності:&#039;&#039;&#039;&lt;br /&gt;
* Незалежний неперіодичний: &amp;lt;code&amp;gt;UNIQUE(Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Незалежний періодичний: &amp;lt;code&amp;gt;UNIQUE(Період, Вимірювання…)&amp;lt;/code&amp;gt;&lt;br /&gt;
* Підпорядкований: &amp;lt;code&amp;gt;PK(Реєстратор, НомерРядка)&amp;lt;/code&amp;gt;, унікальність за вимірюваннями &#039;&#039;&#039;не&#039;&#039;&#039; контролюється.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.2. Регістр накопичення ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРегістру&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиЗалишків&amp;lt;/code&amp;gt; || Булево (тільки для виду «Залишки»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиПідсумкиОборотів&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодичністьПідсумківОборотів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt; (тільки для виду «Обороти»)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || Список визначень агрегатів (тільки для виду «Обороти»), див. 7.4.4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РежимАгрегатів&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 6.4.3. Регістр бухгалтерії ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланРахунків&amp;lt;/code&amp;gt; || Посилання на об&#039;єкт «План рахунків» || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039; Незмінне після створення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Кореспонденція&amp;lt;/code&amp;gt; || Булево || &amp;lt;code&amp;gt;Істина&amp;lt;/code&amp;gt; → подвійний запис (поля &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt;); &amp;lt;code&amp;gt;Хиба&amp;lt;/code&amp;gt; → уніграфічний (&amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; + &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt;).&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || Число (успадковується з ПР) || Ліміт платформи: 5 &#039;&#039;[узгодити; 1С — 3 за замовчуванням, до 5]&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Пов&#039;язаний об&#039;єкт &#039;&#039;&#039;План рахунків&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* ієрархію рахунків, &amp;lt;code&amp;gt;Код&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Найменування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вид&amp;lt;/code&amp;gt; (Активний/Пасивний/Активно-пасивний);&lt;br /&gt;
* &amp;lt;code&amp;gt;Забалансовий&amp;lt;/code&amp;gt; (булево);&lt;br /&gt;
* &amp;lt;code&amp;gt;Ознаки обліку&amp;lt;/code&amp;gt; (набір булевих реквізитів, напр. «Кількісний», «Валютний»);&lt;br /&gt;
* табличну частину &amp;lt;code&amp;gt;ВидиСубконто&amp;lt;/code&amp;gt; (ВидСубконто → ПВХ, &#039;&#039;Тільки обороти&#039;&#039;, &#039;&#039;Підсумкова сума&#039;&#039;, ознаки обліку субконто);&lt;br /&gt;
* &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
=== 6.4.4. Регістр розрахунку ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Властивість !! Значення !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || Посилання || &#039;&#039;&#039;Обов&#039;язково.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Періодичність&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;День&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Місяць&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Квартал&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Рік&amp;lt;/code&amp;gt; || Період реєстрації.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; || Булево || Вмикає поля &amp;lt;code&amp;gt;ПеріодДіїПочаток/Кінець&amp;lt;/code&amp;gt;, фактичні періоди дії та витіснення.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріод&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;БезБазовогоПеріоду&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; || Режим отримання бази.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Графік&amp;lt;/code&amp;gt; || Посилання на РВ || Регістр-графік часу.&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗначенняГрафіка&amp;lt;/code&amp;gt; || Ресурс регістру-графіка || Напр. «Значення» (1/0 — робочий день) або «Годин».&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДатаГрафіка&amp;lt;/code&amp;gt; || Вимірювання регістру-графіка типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Перерахунки&amp;lt;/code&amp;gt; || Список підпорядкованих об&#039;єктів «Перерахунок» || Див. 7.5.3.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Об&#039;єкт &#039;&#039;&#039;Перерахунок&#039;&#039;&#039; (підпорядкований РР):&lt;br /&gt;
* &amp;lt;code&amp;gt;Ім&#039;я&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;Вимірювання&amp;lt;/code&amp;gt; — список, кожне зіставляється з вимірюванням основного РР (&amp;lt;code&amp;gt;ВимірюванняРегістру&amp;lt;/code&amp;gt;);&lt;br /&gt;
* правило: перерахунок реєструє «об&#039;єкт перерахунку» = (Реєстратор, ВидРозрахунку, Вимірювання…).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;План видів розрахунку&#039;&#039;&#039; повинен підтримувати:&lt;br /&gt;
* &amp;lt;code&amp;gt;ВикористовуєПеріодДії&amp;lt;/code&amp;gt;;&lt;br /&gt;
* табличні частини &amp;lt;code&amp;gt;БазовіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВитісняючіВидиРозрахунку&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ВедучіВидиРозрахунку&amp;lt;/code&amp;gt;;&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;: &amp;lt;code&amp;gt;НеЗалежить&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 6.5. Стандартні реквізити (генеруються автоматично) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Реквізит !! РВ !! РН !! РБ !! РР !! Тип&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Період&amp;lt;/code&amp;gt; || якщо періодичний || + || + || + (період реєстрації) || Дата/час&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Складене посилання (ДокументПосилання)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;НомерРядка&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Число(9,0)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Активність&amp;lt;/code&amp;gt; || якщо підпорядкований || + || + || + || Булево&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || — || тільки «Залишки» || — || — || Перелік {Прихід, Витрата}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Рахунок&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;РахунокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;РахунокКт&amp;lt;/code&amp;gt; || — || — || + (з кореспонденцією) || — || ПланРахунківПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРухуРахунку&amp;lt;/code&amp;gt; || — || — || + (без кореспонденції) || — || Перелік {Дебет, Кредит}&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; (колекція) || — || — || + || — || Відповідність(ВидСубконто→Значення)&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ВидРозрахунку&amp;lt;/code&amp;gt; || — || — || — || + || ПВРПосилання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ПеріодДіїПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПеріодДіїКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо ПеріодДії) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазовийПеріодПочаток&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;БазовийПеріодКінець&amp;lt;/code&amp;gt; || — || — || — || + (якщо БазовийПеріод) || Дата&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Сторно&amp;lt;/code&amp;gt; || — || — || — || + || Булево&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.6. Кількісні обмеження метамоделі ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Ліміт !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| Кількість вимірювань || 20 || Понад 8 — попередження конструктора (деградація підсумків)&lt;br /&gt;
|-&lt;br /&gt;
| Кількість ресурсів || 20 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реквізитів || 30 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість типів у складеному типі поля || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| Кількість реєстраторів || Не обмежено ||&lt;br /&gt;
|-&lt;br /&gt;
| Максимум субконто на рахунок || 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| Довжина ключа підсумків || ≤ 900 байт (обмеження індексу MS SQL) || Валідація в конструкторі&lt;br /&gt;
|-&lt;br /&gt;
| Глибина періодичності підсумків || День / Місяць || Тиждень/Квартал — не підтримуються (обчислюються згортанням)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 6.7. Декларативний опис (DSL) ==&lt;br /&gt;
&lt;br /&gt;
Регістр зберігається в репозиторії у вигляді XML/YAML-маніфесту. Приклад:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр накопичення (вид: Залишки) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: ТовариНаСкладах&lt;br /&gt;
  kind: Accumulation&lt;br /&gt;
  accumulationKind: Balance&lt;br /&gt;
  synonym: &amp;quot;Товари на складах&amp;quot;&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  writeMode: SubordinateToRecorder&lt;br /&gt;
  enableBalanceTotals: true&lt;br /&gt;
  enableTurnoverTotals: true&lt;br /&gt;
  partitioning: { mode: RangeByPeriod, step: month }&lt;br /&gt;
&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Номенклатура, type: &amp;quot;Довідник.Номенклатура&amp;quot;, master: true,  index: true }&lt;br /&gt;
    - { name: Склад,        type: &amp;quot;Довідник.Склади&amp;quot;,       master: true,  index: true }&lt;br /&gt;
    - { name: Партія,       type: [&amp;quot;Документ.ПрихіднаНакладна&amp;quot;, &amp;quot;Документ.ВведенняЗалишків&amp;quot;], index: false }&lt;br /&gt;
    - { name: Характеристика, type: &amp;quot;ПланВидівХарактеристик.Характеристики&amp;quot;, nullable: true }&lt;br /&gt;
&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Кількість, type: &amp;quot;Число(15,3)&amp;quot; }&lt;br /&gt;
    - { name: Сума,      type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Коментар, type: &amp;quot;Рядок(200)&amp;quot; }&lt;br /&gt;
&lt;br /&gt;
  recorders:&lt;br /&gt;
    - Документ.ПрихіднаНакладна&lt;br /&gt;
    - Документ.ВидатковаНакладна&lt;br /&gt;
    - Документ.ПереміщенняТоварів&lt;br /&gt;
    - Документ.Інвентаризація&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр відомостей (періодичний, незалежний) ---&lt;br /&gt;
register:&lt;br /&gt;
  name: КурсиВалют&lt;br /&gt;
  kind: Information&lt;br /&gt;
  periodicity: WithinDay&lt;br /&gt;
  writeMode: Independent&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot;, master: true }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Курс,     type: &amp;quot;Число(15,4)&amp;quot; }&lt;br /&gt;
    - { name: Кратність, type: &amp;quot;Число(10,0)&amp;quot;, default: 1 }&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр бухгалтерії ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Госпрозрахунковий&lt;br /&gt;
  kind: Accounting&lt;br /&gt;
  chartOfAccounts: ПланРахунків.Госпрозрахунковий&lt;br /&gt;
  correspondence: true&lt;br /&gt;
  periodicity: WithinSecond&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Організація, type: &amp;quot;Довідник.Організації&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Підрозділ,   type: &amp;quot;Довідник.Підрозділи&amp;quot;,  balance: false }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Сума,       type: &amp;quot;Число(15,2)&amp;quot;, balance: true }&lt;br /&gt;
    - { name: Кількість,  type: &amp;quot;Число(15,3)&amp;quot;, balance: false, accountingFlag: Кількісний }&lt;br /&gt;
    - { name: ВалютнаСума, type: &amp;quot;Число(15,2)&amp;quot;, balance: false, accountingFlag: Валютний }&lt;br /&gt;
  attributes:&lt;br /&gt;
    - { name: Зміст, type: &amp;quot;Рядок(255)&amp;quot; }&lt;br /&gt;
    - { name: Валюта, type: &amp;quot;Довідник.Валюти&amp;quot; }&lt;br /&gt;
  recorders: [Документ.БухгалтерськаОперація, Документ.ПрихіднаНакладна]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;yaml&amp;quot;&amp;gt;&lt;br /&gt;
# --- Регістр розрахунку ---&lt;br /&gt;
register:&lt;br /&gt;
  name: Нарахування&lt;br /&gt;
  kind: Calculation&lt;br /&gt;
  calculationTypesPlan: ПланВидівРозрахунку.ОсновніНарахування&lt;br /&gt;
  periodicity: Month&lt;br /&gt;
  actionPeriod: true&lt;br /&gt;
  basePeriod: ByActionPeriod&lt;br /&gt;
  schedule:&lt;br /&gt;
    register: РегістрВідомостей.ГрафікРоботи&lt;br /&gt;
    valueResource: Значення&lt;br /&gt;
    dateDimension: ДатаГрафіка&lt;br /&gt;
  dimensions:&lt;br /&gt;
    - { name: Співробітник, type: &amp;quot;Довідник.Співробітники&amp;quot;, baseDimension: true, master: true }&lt;br /&gt;
    - { name: Підрозділ,    type: &amp;quot;Довідник.Підрозділи&amp;quot; }&lt;br /&gt;
  resources:&lt;br /&gt;
    - { name: Результат,        type: &amp;quot;Число(15,2)&amp;quot; }&lt;br /&gt;
    - { name: ВідпрацьованоДнів, type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
    - { name: НормаДнів,        type: &amp;quot;Число(5,0)&amp;quot; }&lt;br /&gt;
  recalculations:&lt;br /&gt;
    - name: ПерерахунокЗаБазою&lt;br /&gt;
      dimensions:&lt;br /&gt;
        - { name: Співробітник, registerDimension: Співробітник }&lt;br /&gt;
  recorders: [Документ.НарахуванняЗарплати]&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 6.8. UI конструктора метаданих ==&lt;br /&gt;
&lt;br /&gt;
=== 6.8.1. Загальний макет ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Конфігуратор K2 ERP ─────────────────────────────────────────────────────────┐&lt;br /&gt;
│ Файл  Правка  Конфігурація  Адміністрування  Сервіс  Довідка                  │&lt;br /&gt;
├──────────────────────┬────────────────────────────────────────────────────────┤&lt;br /&gt;
│ Дерево конфігурації  │  Регістр накопичення: ТовариНаСкладах                  │&lt;br /&gt;
│                      │  ┌──────┬─────────┬──────────┬──────────┬───────────┐  │&lt;br /&gt;
│ ▾ Регістри           │  │Основ.│Дані     │Реєстратор│Форми     │Права      │  │&lt;br /&gt;
│   ▸ відомостей       │  └──────┴─────────┴──────────┴──────────┴───────────┘  │&lt;br /&gt;
│   ▾ накопичення      │                                                        │&lt;br /&gt;
│     ▾ ТовариНаСклад. │  Ім&#039;я           [ТовариНаСкладах.............]         │&lt;br /&gt;
│       ▾ Вимірювання  │  Синонім        [Товари на складах...........]         │&lt;br /&gt;
│           Номенклат. │  Коментар       [.............................]        │&lt;br /&gt;
│           Склад      │                                                        │&lt;br /&gt;
│           Партія     │  Вид регістру   ( ) Обороти   (•) Залишки              │&lt;br /&gt;
│       ▾ Ресурси      │  Періодичність  [ У межах секунди        ▾]            │&lt;br /&gt;
│           Кількість  │  Режим запису   [ Підпорядкований реєстратору ▾]       │&lt;br /&gt;
│           Сума       │                                                        │&lt;br /&gt;
│       ▸ Реквізити    │  ☑ Дозволити підсумки залишків                        │&lt;br /&gt;
│       ▸ Форми        │  ☑ Дозволити підсумки оборотів                        │&lt;br /&gt;
│     ▸ Взаєморозрах.  │      Періодичність підсумків оборотів [Місяць  ▾]      │&lt;br /&gt;
│   ▸ бухгалтерії      │  ☐ Дозволити розділення підсумків                     │&lt;br /&gt;
│   ▸ розрахунку       │                                                        │&lt;br /&gt;
│                      │  Блокування даних  [Кероване ▾]                        │&lt;br /&gt;
│                      │  Партиціонування   [За періодом, крок: місяць ▾]       │&lt;br /&gt;
│                      │                                                        │&lt;br /&gt;
│                      │  [ Конструктор рухів... ]  [ Перевірити ]  [ Закрити ] │&lt;br /&gt;
├──────────────────────┴────────────────────────────────────────────────────────┤&lt;br /&gt;
│ ⚠ Попередження: 4 вимірювання + місячні підсумки → оцінка таблиці підсумків    │&lt;br /&gt;
│   ~ 12 млн записів/рік. Розгляньте виключення вимірювання «Партія» з підсумків.│&lt;br /&gt;
└───────────────────────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.2. Палітра властивостей поля ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ Властивості: Вимірювання «Партія» ────────────────┐&lt;br /&gt;
│ Ім&#039;я                  [Партія...................]  │&lt;br /&gt;
│ Синонім               [Партія...................]  │&lt;br /&gt;
│ Тип                   [Складений тип........ [...]]│&lt;br /&gt;
│    ├ Документ.ПрихіднаНакладна                     │&lt;br /&gt;
│    └ Документ.ВведенняЗалишків                     │&lt;br /&gt;
│ Індексувати           [Не індексувати         ▾]   │&lt;br /&gt;
│ ☐ Ведуче                                           │&lt;br /&gt;
│ ☐ Основний відбір                                  │&lt;br /&gt;
│ ☐ Заборонити незаповнені значення                  │&lt;br /&gt;
│ ☑ Використовувати в підсумках                      │&lt;br /&gt;
│ Подання                                            │&lt;br /&gt;
│    Підказка           [Партія товару...........]   │&lt;br /&gt;
└────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.3. Вкладка «Реєстратори» ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
┌─ ТовариНаСкладах → Реєстратори ────────────────────────────┐&lt;br /&gt;
│ ☑ Документ.ПрихіднаНакладна                                │&lt;br /&gt;
│ ☑ Документ.ВидатковаНакладна                               │&lt;br /&gt;
│ ☑ Документ.ПереміщенняТоварів                              │&lt;br /&gt;
│ ☑ Документ.Інвентаризація                                  │&lt;br /&gt;
│ ☐ Документ.Замовлення                                      │&lt;br /&gt;
│ ☐ Документ.РахунокНаОплату                                 │&lt;br /&gt;
│                                     [Позначити всі] [Зняти]│&lt;br /&gt;
│ ─────────────────────────────────────────────────────────  │&lt;br /&gt;
│ ⓘ Знімання прапорця для документа, що має рухи, вимагає    │&lt;br /&gt;
│   очищення рухів. Знайдено рухів: 0                        │&lt;br /&gt;
└────────────────────────────────────────────────────────────┘&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 6.8.4. Вимоги до конструктора ===&lt;br /&gt;
* ФТ-К-01. Валідація метаопису в реальному часі з переліком помилок/попереджень.&lt;br /&gt;
* ФТ-К-02. Попередній перегляд згенерованого DDL (кнопка «Показати SQL»).&lt;br /&gt;
* ФТ-К-03. Калькулятор оцінки обсягу таблиць підсумків (добуток кардинальностей вимірювань × кількість періодів).&lt;br /&gt;
* ФТ-К-04. Заборона неприпустимих комбінацій (напр. «Незалежний» + «Регістр накопичення»).&lt;br /&gt;
* ФТ-К-05. «Конструктор рухів» — генерація коду формування рухів за табличною частиною документа.&lt;br /&gt;
* ФТ-К-06. Порівняння/об&#039;єднання конфігурацій має коректно обробляти об&#039;єкти-регістри.&lt;br /&gt;
&lt;br /&gt;
= 7. Функціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 7.1. Набір записів і проведення документа ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-01.&#039;&#039;&#039; Платформа надає прикладний об&#039;єкт &amp;lt;code&amp;gt;НабірЗаписів&amp;lt;/code&amp;gt; для кожного регістру з властивостями: &amp;lt;code&amp;gt;Відбір&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записувати&amp;lt;/code&amp;gt;, і методами &amp;lt;code&amp;gt;Прочитати()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Записати(Заміщати)&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Очистити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗаблокуватиДляЗміни()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Вивантажити()&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Завантажити()&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-02.&#039;&#039;&#039; Для документа доступна колекція &amp;lt;code&amp;gt;Рухи&amp;lt;/code&amp;gt; з наборами записів усіх регістрів, де документ вказано реєстратором.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-03. Сценарій проведення:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
skinparam monochrome false&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
actor Користувач&lt;br /&gt;
participant &amp;quot;Форма\nдокумента&amp;quot; as UI&lt;br /&gt;
participant &amp;quot;Об&#039;єкт\nДокумент&amp;quot; as Doc&lt;br /&gt;
participant &amp;quot;Менеджер\nпроведення&amp;quot; as PM&lt;br /&gt;
participant &amp;quot;Набори\nзаписів&amp;quot; as RS&lt;br /&gt;
database &amp;quot;СКБД&amp;quot; as DB&lt;br /&gt;
&lt;br /&gt;
Користувач -&amp;gt; UI: Провести&lt;br /&gt;
UI -&amp;gt; Doc: Записати(РежимЗапису.Проведення)&lt;br /&gt;
activate Doc&lt;br /&gt;
Doc -&amp;gt; PM: НачатьТранзакцию()&lt;br /&gt;
PM -&amp;gt; DB: BEGIN&lt;br /&gt;
Doc -&amp;gt; Doc: ПередЗаписью()&lt;br /&gt;
Doc -&amp;gt; DB: UPDATE doc SET Проведений=1&lt;br /&gt;
Doc -&amp;gt; Doc: ОбработкаПроведения(Отказ, Режим)&lt;br /&gt;
note right of Doc&lt;br /&gt;
  Прикладний код:&lt;br /&gt;
  Рухи.ТовариНаСкладах.Записувати = Істина;&lt;br /&gt;
  Рух = Рухи.ТовариНаСкладах.Добавить();&lt;br /&gt;
  Рух.ВидРуху = ВидРухуНакопичення.Витрата;&lt;br /&gt;
  ...&lt;br /&gt;
  // контроль залишків (оперативне проведення)&lt;br /&gt;
end note&lt;br /&gt;
Doc -&amp;gt; RS: (формування рухів у пам&#039;яті)&lt;br /&gt;
Doc -&amp;gt; PM: ЗаписатьДвижения()&lt;br /&gt;
PM -&amp;gt; RS: для кожного НЗ з Записувати=Істина&lt;br /&gt;
RS -&amp;gt; DB: DELETE FROM rg_a_0012 WHERE rec_ref = :doc&lt;br /&gt;
RS -&amp;gt; DB: INSERT INTO rg_a_0012 (...) VALUES (...)&lt;br /&gt;
RS -&amp;gt; PM: ОновитиПідсумки(delta)&lt;br /&gt;
PM -&amp;gt; DB: MERGE rg_a_0012_tb (див. розд. 10.2)&lt;br /&gt;
Doc -&amp;gt; Doc: ПриЗаписи() / ПослеЗаписи()&lt;br /&gt;
alt Відмова = Хиба&lt;br /&gt;
  PM -&amp;gt; DB: COMMIT&lt;br /&gt;
  PM --&amp;gt; UI: Успіх&lt;br /&gt;
else Відмова = Істина або виключення&lt;br /&gt;
  PM -&amp;gt; DB: ROLLBACK&lt;br /&gt;
  PM --&amp;gt; UI: Помилка &amp;quot;Документ не проведено: ...&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
deactivate Doc&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-04.&#039;&#039;&#039; Запис набору записів у режимі &amp;lt;code&amp;gt;Заміщати = Істина&amp;lt;/code&amp;gt; (за замовчуванням для рухів) виконує &amp;lt;code&amp;gt;DELETE&amp;lt;/code&amp;gt; усіх записів за відбором + &amp;lt;code&amp;gt;INSERT&amp;lt;/code&amp;gt; нових — атомарно.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-05.&#039;&#039;&#039; Скасування проведення документа: усі набори записів за реєстратором очищуються, підсумки коригуються, документ отримує &amp;lt;code&amp;gt;Проведений = Хиба&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-06.&#039;&#039;&#039; Видалення документа-реєстратора (у т.ч. позначеного на видалення) &#039;&#039;&#039;зобов&#039;язане&#039;&#039;&#039; каскадно видалити всі його рухи в межах однієї транзакції. Реалізація — на рівні платформи (не FK, оскільки посилання поліморфне) + фонова перевірка цілісності (розділ 7.10).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-07.&#039;&#039;&#039; Режими проведення:&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Режим !! Умова !! Поведінка&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Оперативне&#039;&#039;&#039; || Дата документа = поточна дата, документ у межах «оперативної точки» || Дозволено контроль залишків «на зараз»; дата може перепризначатися на поточну.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Неоперативне&#039;&#039;&#039; || Дата в минулому/майбутньому або документ перепроводиться || Контроль залишків виконується на дату документа; можливий негативний залишок за налаштуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.2. Активність записів ==&lt;br /&gt;
&#039;&#039;&#039;ФТ-08.&#039;&#039;&#039; Реквізит &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; означає, що запис фізично існує, але &#039;&#039;&#039;не&#039;&#039;&#039; впливає на підсумки та не потрапляє до віртуальних таблиць.&lt;br /&gt;
&#039;&#039;&#039;ФТ-09.&#039;&#039;&#039; Зміна активності будь-якого запису тягне коригування підсумків.&lt;br /&gt;
&#039;&#039;&#039;ФТ-10.&#039;&#039;&#039; Скасування проведення документа переводить усі його записи в &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; &#039;&#039;&#039;або&#039;&#039;&#039; видаляє їх — залежно від налаштування регістру &amp;lt;code&amp;gt;ПоведінкаПриСкасуванні&amp;lt;/code&amp;gt; (&amp;lt;code&amp;gt;Видаляти&amp;lt;/code&amp;gt; — за замовчуванням / &amp;lt;code&amp;gt;Деактивувати&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.3. Віртуальні таблиці ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-11.&#039;&#039;&#039; Мова запитів надає для кожного регістру набір віртуальних таблиць. Транслятор перетворює звернення до них на SQL із використанням таблиць підсумків та «живих» рухів після ТА.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Регістр !! Віртуальна таблиця !! Параметри !! Повертає&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РВ&#039;&#039;&#039; || &amp;lt;code&amp;gt;ЗрізОстанніх&amp;lt;/code&amp;gt; || (Період, Умова) || Останній запис на кожну комбінацію вимірювань з періодом ≤ Період&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗрізПерших&amp;lt;/code&amp;gt; || (Період, Умова) || Перший запис з періодом ≥ Період&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Усі записи&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РН.Залишки&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, Умова) || Вимірювання + &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, МетодДоповнення, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ПочатковийЗалишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Прихід&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Витрата&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;КінцевийЗалишок&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;РН.Обороти&#039;&#039;&#039; || &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Ресурс&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;6&amp;quot; | &#039;&#039;&#039;РБ&#039;&#039;&#039; || &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt; || (Період, УмоваРахунку, Субконто, Умова) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Залишок&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ЗалишокКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахунку, Субконто, Умова, УмоваКорРахунку, КорСубконто) || &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;Оборот&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотДт&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;amp;lt;Р&amp;amp;gt;ОборотКт&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ЗалишкиІОбороти&amp;lt;/code&amp;gt; || (…) || Повний набір&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ОборотиДтКт&amp;lt;/code&amp;gt; || (Початок, Кінець, Періодичність, УмоваРахункуДт, СубконтоДт, УмоваРахункуКт, СубконтоКт) || Кореспонденції&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ДвиженияССубконто&amp;lt;/code&amp;gt; || (Початок, Кінець, УмоваРахунку, Субконто, Умова) || Рухи з розшифровкою субконто&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; || (Умова, Порядок…) || Значення субконто записів&lt;br /&gt;
|-&lt;br /&gt;
| rowspan=&amp;quot;4&amp;quot; | &#039;&#039;&#039;РР&#039;&#039;&#039; || &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; || (Умова) || &amp;lt;code&amp;gt;ЗначенняПеріодуДії&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняПеріодуРеєстрації&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняБазовогоПеріоду&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ЗначенняФактичногоПеріодуДії&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;ФактичнийПеріодДії&amp;lt;/code&amp;gt; || (Умова) || Записи з фактичними (після витіснення) межами&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; || (ВимірюванняБази, ВимірюванняОсновногоРегістру, Розрізи, ВидиРозрахунку, Умова) || Агреговані значення ресурсів базових видів розрахунку&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;(основна)&#039;&#039; || — || Рухи&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-12.&#039;&#039;&#039; Приклад запиту:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
ВИБРАТИ&lt;br /&gt;
    Залишки.Номенклатура,&lt;br /&gt;
    Залишки.Склад,&lt;br /&gt;
    Залишки.КількістьЗалишок,&lt;br /&gt;
    Обороти.КількістьПрихід,&lt;br /&gt;
    Обороти.КількістьВитрата&lt;br /&gt;
З&lt;br /&gt;
    РегістрНакопичення.ТовариНаСкладах.ЗалишкиІОбороти(&lt;br /&gt;
        &amp;amp;ПочатокПеріоду,&lt;br /&gt;
        &amp;amp;КінецьПеріоду,&lt;br /&gt;
        Місяць,&lt;br /&gt;
        Рух,&lt;br /&gt;
        Склад = &amp;amp;Склад&lt;br /&gt;
            І Номенклатура В ІЄРАРХІЇ (&amp;amp;ГрупаНоменклатури)&lt;br /&gt;
    ) ЯК Залишки&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-13.&#039;&#039;&#039; Параметри віртуальних таблиць &#039;&#039;&#039;зобов&#039;язані&#039;&#039;&#039; транслюватися у &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; підзапиту до звернення до підсумків (push-down), а не фільтруватися після агрегації.&lt;br /&gt;
&lt;br /&gt;
== 7.4. Підсумки ==&lt;br /&gt;
&lt;br /&gt;
=== 7.4.1. Модель підсумків залишків ===&lt;br /&gt;
Таблиця залишків зберігає &#039;&#039;&#039;кумулятивний залишок на початок кожного періоду&#039;&#039;&#039; + спеціальний рядок «підсумок за всі періоди» з &amp;lt;code&amp;gt;period = &#039;5999-11-01&#039;&amp;lt;/code&amp;gt; (маркер MAXPERIOD).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
                     Таблиця підсумків (місячна)                  ТА&lt;br /&gt;
                     ┌────┬────┬────┬────┬────┐                    ▼&lt;br /&gt;
  ─────┬────┬────┬───┴────┴────┴────┴────┴────┴────────────────────┬──────────►&lt;br /&gt;
       │    │    │  01.10  01.11  01.12  01.01  01.02             15.02      t&lt;br /&gt;
       │    │    │   ●      ●      ●      ●      ●&lt;br /&gt;
       │    │    │  бал.   бал.   бал.   бал.   бал.&lt;br /&gt;
                                                    └─ «живі» рухи ─┘&lt;br /&gt;
                                                      (сканування)&lt;br /&gt;
  Залишок на 10.02 = Підсумок(01.02) + Σ рухів (01.02 … 10.02]&lt;br /&gt;
  Залишок на 20.02 = Підсумок(01.02) + Σ рухів (01.02 … 20.02]   // після ТА — теж&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-14.&#039;&#039;&#039; Регламентна операція «Перерахунок підсумків» перебудовує таблиці підсумків з нуля.&lt;br /&gt;
&#039;&#039;&#039;ФТ-15.&#039;&#039;&#039; Регламентна операція «Встановлення періоду розрахунку підсумків» переносить ТА вперед/назад.&lt;br /&gt;
&#039;&#039;&#039;ФТ-16.&#039;&#039;&#039; При записі рухів раніше ТА підсумки коригуються &#039;&#039;інкрементально&#039;&#039; (див. 10.2), без повного перерахунку.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.2. Розділення підсумків ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-17.&#039;&#039;&#039; За увімкненого &amp;lt;code&amp;gt;ДозволитиРозділенняПідсумків&amp;lt;/code&amp;gt; у таблиці підсумків додається колонка &amp;lt;code&amp;gt;splitter smallint&amp;lt;/code&amp;gt;. Одночасні транзакції пишуть у різні «сплітери», що усуває конкуренцію за рядок. Читання агрегує по всіх сплітерах. Регламентне завдання зливає сплітери.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.3. Обороти ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-18.&#039;&#039;&#039; Таблиця оборотів зберігає агрегати за календарний період (день або місяць — за налаштуванням), без кумуляції.&lt;br /&gt;
&lt;br /&gt;
=== 7.4.4. Агрегати (тільки РН виду «Обороти») ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-19.&#039;&#039;&#039; Агрегат — додаткова матеріалізована таблиця з підмножиною вимірювань і власною періодичністю (День/Місяць/Квартал/Рік). Оптимізатор запитів обирає найдешевший агрегат, що покриває запит.&lt;br /&gt;
&#039;&#039;&#039;ФТ-20.&#039;&#039;&#039; Режими: &amp;lt;code&amp;gt;Реальний час&amp;lt;/code&amp;gt; (оновлюється при записі рухів) / &amp;lt;code&amp;gt;Регламентний&amp;lt;/code&amp;gt; (оновлюється завданням; запит враховує рухи після дати актуальності агрегату).&lt;br /&gt;
&#039;&#039;&#039;ФТ-21.&#039;&#039;&#039; «Порадник агрегатів» аналізує статистику запитів і пропонує склад агрегатів (&amp;lt;code&amp;gt;ВизначитиОптимальніАгрегати()&amp;lt;/code&amp;gt;).&lt;br /&gt;
&lt;br /&gt;
== 7.5. Механіка регістру розрахунку ==&lt;br /&gt;
&lt;br /&gt;
=== 7.5.1. Витіснення за періодом дії ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-22.&#039;&#039;&#039; Якщо у ПВР для виду розрахунку A вказано B у складі «Витісняючі види розрахунку», то запис виду B скорочує фактичний період дії запису виду A на інтервал перетину.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Період реєстрації: Січень 2026.   Пріоритет витіснення: Лікарняний &amp;gt; Відпустка &amp;gt; Оклад&lt;br /&gt;
&lt;br /&gt;
Заявлені періоди дії:&lt;br /&gt;
Оклад        01.01 ├══════════════════════════════════════════════┤ 31.01&lt;br /&gt;
Відпустка              10.01 ├════════════┤ 17.01&lt;br /&gt;
Лікарняний                     14.01 ├════════════┤ 22.01&lt;br /&gt;
&lt;br /&gt;
Фактичні періоди дії (rg_c_XXXX_ap):&lt;br /&gt;
Оклад        01.01 ├═══════┤ 09.01            23.01 ├════════════┤ 31.01&lt;br /&gt;
Відпустка              10.01 ├═══┤ 13.01&lt;br /&gt;
Лікарняний                     14.01 ├════════════┤ 22.01&lt;br /&gt;
&lt;br /&gt;
⇒ у таблиці фактичних періодів «Оклад» породжує ДВА інтервали (запис — один).&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-23.&#039;&#039;&#039; Фактичні періоди дії матеріалізуються у службовій таблиці &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;код&amp;amp;gt;_ap&amp;lt;/code&amp;gt; під час запису набору записів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-24.&#039;&#039;&#039; Витіснення обчислюється в межах збігу &#039;&#039;&#039;усіх&#039;&#039;&#039; вимірювань регістру та перетину періодів реєстрації, визначених ПВР.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.2. Базовий період і база розрахунку ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-25.&#039;&#039;&#039; Віртуальна таблиця &amp;lt;code&amp;gt;БазаРозрахунку&amp;lt;/code&amp;gt; повертає суму ресурсів записів базових видів розрахунку, зіставлених за базовими вимірюваннями, з урахуванням режиму &amp;lt;code&amp;gt;ЗалежністьВідБази&amp;lt;/code&amp;gt;:&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодДії&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період дії&#039;&#039;&#039; перетинається з базовим періодом поточного запису; результат пропорційно розподіляється за часткою перетину (за графіком, якщо заданий);&lt;br /&gt;
* &amp;lt;code&amp;gt;ЗаПеріодРеєстрації&amp;lt;/code&amp;gt; — беруться записи, чий &#039;&#039;&#039;період реєстрації&#039;&#039;&#039; потрапляє в базовий період.&lt;br /&gt;
&lt;br /&gt;
=== 7.5.3. Перерахунки ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-26.&#039;&#039;&#039; При записі/зміні/видаленні запису базового виду розрахунку платформа &#039;&#039;&#039;автоматично&#039;&#039;&#039; формує записи у таблиці перерахунку для всіх залежних записів (за збігом вимірювань перерахунку та потраплянням у базовий період).&lt;br /&gt;
&#039;&#039;&#039;ФТ-27.&#039;&#039;&#039; Прикладний код читає перерахунок як набір записів, перепроводить відповідні документи та очищує оброблені записи.&lt;br /&gt;
&#039;&#039;&#039;ФТ-28.&#039;&#039;&#039; Перерахунок доступний як об&#039;єкт для звіту «Документи до перерахунку».&lt;br /&gt;
&lt;br /&gt;
=== 7.5.4. Графік часу ===&lt;br /&gt;
&#039;&#039;&#039;ФТ-29.&#039;&#039;&#039; Графік — це РВ з обов&#039;язковим вимірюванням типу &amp;lt;code&amp;gt;Дата&amp;lt;/code&amp;gt; та числовим ресурсом. Віртуальна таблиця &amp;lt;code&amp;gt;ДаніГрафіка&amp;lt;/code&amp;gt; повертає суму значень графіка за відповідний період (дії / реєстрації / базовий / фактичний період дії).&lt;br /&gt;
&#039;&#039;&#039;ФТ-30.&#039;&#039;&#039; Якщо у графіку є додаткові вимірювання (напр. &amp;lt;code&amp;gt;ВидГрафіка&amp;lt;/code&amp;gt;), вони зіставляються з однойменними реквізитами/вимірюваннями РР.&lt;br /&gt;
&lt;br /&gt;
== 7.6. Прикладний API ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;csharp&amp;quot;&amp;gt;&lt;br /&gt;
// --- Регістр відомостей: незалежний запис ---&lt;br /&gt;
var mgr = Registers.Information[&amp;quot;КурсиВалют&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
// точковий запис&lt;br /&gt;
var rec = mgr.CreateRecordManager();&lt;br /&gt;
rec.Період = new DateTime(2026, 7, 17);&lt;br /&gt;
rec.Валюта = usd;&lt;br /&gt;
rec.Курс = 41.85m;&lt;br /&gt;
rec.Кратність = 1;&lt;br /&gt;
rec.Write(replace: true);          // INSERT ... ON CONFLICT DO UPDATE&lt;br /&gt;
&lt;br /&gt;
// зріз останніх&lt;br /&gt;
var slice = mgr.GetLast(DateTime.Today, new Filter { [&amp;quot;Валюта&amp;quot;] = usd });&lt;br /&gt;
decimal курс = slice.Курс;&lt;br /&gt;
&lt;br /&gt;
// --- Регістр накопичення: рухи документа ---&lt;br /&gt;
protected override void OnPosting(PostingContext ctx)&lt;br /&gt;
{&lt;br /&gt;
    var rs = Movements[&amp;quot;ТовариНаСкладах&amp;quot;];&lt;br /&gt;
    rs.Write = true;              // набір буде записано наприкінці транзакції&lt;br /&gt;
    rs.Clear();&lt;br /&gt;
&lt;br /&gt;
    foreach (var row in this.Товари)&lt;br /&gt;
    {&lt;br /&gt;
        var m = rs.Add();&lt;br /&gt;
        m.Період       = this.Дата;&lt;br /&gt;
        m.MovementType = AccumulationMovementType.Expense;   // Витрата&lt;br /&gt;
        m.Номенклатура = row.Номенклатура;&lt;br /&gt;
        m.Склад        = this.Склад;&lt;br /&gt;
        m.Партія       = row.Партія;&lt;br /&gt;
        m.Кількість    = row.Кількість;&lt;br /&gt;
        m.Сума         = row.Сума;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // керовані блокування перед контролем залишків&lt;br /&gt;
    var lock_ = new DataLock();&lt;br /&gt;
    var item = lock_.Add(&amp;quot;РегістрНакопичення.ТовариНаСкладах.Залишки&amp;quot;);&lt;br /&gt;
    item.Mode = DataLockMode.Exclusive;&lt;br /&gt;
    item.DataSource = rs.Unload(new[] { &amp;quot;Номенклатура&amp;quot;, &amp;quot;Склад&amp;quot; });&lt;br /&gt;
    item.UseFromDataSource(&amp;quot;Номенклатура&amp;quot;, &amp;quot;Номенклатура&amp;quot;);&lt;br /&gt;
    item.UseFromDataSource(&amp;quot;Склад&amp;quot;, &amp;quot;Склад&amp;quot;);&lt;br /&gt;
    lock_.Lock();&lt;br /&gt;
&lt;br /&gt;
    rs.WriteNow();                // примусовий запис до контролю&lt;br /&gt;
    ControlBalances(ctx);         // прикладна перевірка на від&#039;ємні залишки&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// --- Регістр бухгалтерії ---&lt;br /&gt;
var rs = Movements[&amp;quot;Госпрозрахунковий&amp;quot;];&lt;br /&gt;
var m  = rs.AddAccountingEntry();&lt;br /&gt;
m.Період    = this.Дата;&lt;br /&gt;
m.РахунокДт = accounts[&amp;quot;281&amp;quot;];&lt;br /&gt;
m.РахунокКт = accounts[&amp;quot;631&amp;quot;];&lt;br /&gt;
m.SubcontoDt[ВидиСубконто.Номенклатура] = row.Номенклатура;&lt;br /&gt;
m.SubcontoDt[ВидиСубконто.Склади]       = this.Склад;&lt;br /&gt;
m.SubcontoKt[ВидиСубконто.Контрагенти]  = this.Контрагент;&lt;br /&gt;
m.Сума      = row.Сума;&lt;br /&gt;
m.КількістьДт = row.Кількість;&lt;br /&gt;
&lt;br /&gt;
// --- Регістр розрахунку ---&lt;br /&gt;
var rs = Movements[&amp;quot;Нарахування&amp;quot;];&lt;br /&gt;
var m = rs.Add();&lt;br /&gt;
m.ВидРозрахунку     = calcTypes[&amp;quot;Оклад&amp;quot;];&lt;br /&gt;
m.Період            = this.Дата;                 // період реєстрації&lt;br /&gt;
m.ПеріодДіїПочаток  = new DateTime(2026,7,1);&lt;br /&gt;
m.ПеріодДіїКінець   = new DateTime(2026,7,31);&lt;br /&gt;
m.БазовийПеріодПочаток = new DateTime(2026,6,1);&lt;br /&gt;
m.БазовийПеріодКінець  = new DateTime(2026,6,30);&lt;br /&gt;
m.Співробітник      = row.Співробітник;&lt;br /&gt;
m.Результат         = 0;                          // заповниться після розрахунку&lt;br /&gt;
rs.WriteNow();&lt;br /&gt;
&lt;br /&gt;
// отримання даних графіка та бази — запитом&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 7.7. Блокування та конкурентність ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Вимога&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31 || Режим керованих блокувань — за замовчуванням. Рівень ізоляції транзакцій: &amp;lt;code&amp;gt;READ COMMITTED&amp;lt;/code&amp;gt; (PostgreSQL) / &amp;lt;code&amp;gt;READ COMMITTED SNAPSHOT&amp;lt;/code&amp;gt; (MS SQL).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-32 || Об&#039;єкт &amp;lt;code&amp;gt;DataLock&amp;lt;/code&amp;gt; дозволяє встановити розділювальне/виняткове блокування на «простір» регістру за значеннями вимірювань (реалізація — &amp;lt;code&amp;gt;pg_advisory_xact_lock&amp;lt;/code&amp;gt; за хешем ключа або &amp;lt;code&amp;gt;SELECT ... FOR UPDATE&amp;lt;/code&amp;gt; по таблиці підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-33 || Запис рухів документа блокує тільки записи цього реєстратора (PK містить реєстратор першим).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-34 || Оновлення підсумків не повинно призводити до дедлоків: усі &amp;lt;code&amp;gt;MERGE&amp;lt;/code&amp;gt;-операції в межах транзакції виконуються у детермінованому порядку сортування ключа.&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-35 || Гарантія: паралельне проведення двох документів з різними наборами вимірювань не конкурує (за увімкненого розділення підсумків).&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-36 || Таймаут очікування блокування — 20 с (налаштовується); при перевищенні — керована помилка з текстом конфліктного ключа.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 7.8. Права доступу ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-37.&#039;&#039;&#039; Для регістру визначаються права: &amp;lt;code&amp;gt;Читання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Додавання&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Зміна&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Видалення&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Перегляд&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;Редагування&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;ПереглядПідсумків&amp;lt;/code&amp;gt;.&lt;br /&gt;
&#039;&#039;&#039;ФТ-38.&#039;&#039;&#039; Обмеження на рівні записів (RLS) задаються шаблоном умови по вимірюваннях; транслюються в &amp;lt;code&amp;gt;WHERE&amp;lt;/code&amp;gt; усіх звернень, включно з віртуальними таблицями.&lt;br /&gt;
&#039;&#039;&#039;ФТ-39.&#039;&#039;&#039; &#039;&#039;Ризик:&#039;&#039; RLS на віртуальних таблицях залишків потребує узгодженості з підсумками. Рішення — RLS дозволено тільки по вимірюваннях, що входять до ключа підсумків; конструктор валідує це правило.&lt;br /&gt;
&lt;br /&gt;
== 7.9. Журналювання, аудит, службові сервіси ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;ФТ-40.&#039;&#039;&#039; Реєстрація в журналі: перерахунок підсумків, зміна ТА, реструктуризація регістру, злиття сплітерів.&lt;br /&gt;
&#039;&#039;&#039;ФТ-41.&#039;&#039;&#039; Службовий сервіс «Перевірка цілісності регістрів»:&lt;br /&gt;
* «висячі» рухи (реєстратор не існує або не проведений);&lt;br /&gt;
* розбіжність підсумків і сум рухів (контрольний перерахунок у тіньову таблицю з порівнянням);&lt;br /&gt;
* некоректні фактичні періоди дії РР;&lt;br /&gt;
* для РБ — порушення рівності Дт = Кт за балансовим ресурсом у межах реєстратора.&lt;br /&gt;
&#039;&#039;&#039;ФТ-42.&#039;&#039;&#039; Звіт «Аналіз розміру регістрів»: кількість записів, розмір таблиць та індексів, дата останнього перерахунку підсумків.&lt;br /&gt;
&lt;br /&gt;
= 8. Модель даних (як це виглядає в базі даних) =&lt;br /&gt;
&lt;br /&gt;
== 8.1. Конвенції іменування ==&lt;br /&gt;
&lt;br /&gt;
Фізичні імена &#039;&#039;&#039;не&#039;&#039;&#039; успадковують прикладні імена (обмеження довжини ідентифікатора, кирилиця, перейменування об&#039;єктів). Ім&#039;я будується за сурогатним кодом об&#039;єкта метаданих &amp;lt;code&amp;gt;&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; (4-значний hex/dec).&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Шаблон !! Призначення !! Приклад&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_i_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр відомостей — основна таблиця || &amp;lt;code&amp;gt;rg_i_0007&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр накопичення — рухи || &amp;lt;code&amp;gt;rg_a_0012&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tb&amp;lt;/code&amp;gt; || РН — підсумки залишків (Totals Balance) || &amp;lt;code&amp;gt;rg_a_0012_tb&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_tt&amp;lt;/code&amp;gt; || РН — підсумки оборотів (Totals Turnover) || &amp;lt;code&amp;gt;rg_a_0012_tt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_a_&amp;amp;lt;id&amp;amp;gt;_ag&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; || РН — агрегат № n || &amp;lt;code&amp;gt;rg_a_0031_ag1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр бухгалтерії — проводки || &amp;lt;code&amp;gt;rg_b_0020&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_ed&amp;lt;/code&amp;gt; || РБ — субконто (якщо винесено в дочірню таблицю) || &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tb&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки залишків за рівнем субконто k (0…N) || &amp;lt;code&amp;gt;rg_b_0020_tb2&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tt&amp;amp;lt;k&amp;amp;gt;&amp;lt;/code&amp;gt; || РБ — підсумки оборотів за рівнем субконто k || &amp;lt;code&amp;gt;rg_b_0020_tt1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_b_&amp;amp;lt;id&amp;amp;gt;_tc&amp;lt;/code&amp;gt; || РБ — обороти між рахунками (кореспонденції) || &amp;lt;code&amp;gt;rg_b_0020_tc&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;&amp;lt;/code&amp;gt; || Регістр розрахунку — рухи || &amp;lt;code&amp;gt;rg_c_0040&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_ap&amp;lt;/code&amp;gt; || РР — фактичні періоди дії || &amp;lt;code&amp;gt;rg_c_0040_ap&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_c_&amp;amp;lt;id&amp;amp;gt;_rc&amp;amp;lt;m&amp;amp;gt;&amp;lt;/code&amp;gt; || РР — перерахунок № m || &amp;lt;code&amp;gt;rg_c_0040_rc1&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;rg_&amp;amp;lt;*&amp;amp;gt;_&amp;amp;lt;id&amp;amp;gt;_opt&amp;lt;/code&amp;gt; || Службова: ТА підсумків, налаштування || &amp;lt;code&amp;gt;rg_a_0012_opt&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;md_*&amp;lt;/code&amp;gt; || Таблиці метаданих || &amp;lt;code&amp;gt;md_register&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Колонки полів: &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — вимірювання, &amp;lt;code&amp;gt;r&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — ресурс, &amp;lt;code&amp;gt;a&amp;amp;lt;n&amp;amp;gt;&amp;lt;/code&amp;gt; — реквізит, де &amp;lt;code&amp;gt;n&amp;lt;/code&amp;gt; — порядковий номер поля в метаописі (стабільний, не перевикористовується після видалення поля). Мапінг «прикладне ім&#039;я ↔ фізична колонка» зберігається в &amp;lt;code&amp;gt;md_register_field&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.2. Типізація та зберігання значень ==&lt;br /&gt;
&lt;br /&gt;
=== 8.2.1. Примітивні типи ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Тип платформи !! PostgreSQL !! MS SQL&lt;br /&gt;
|-&lt;br /&gt;
| Число(p,s) || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(p,s)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(n) || &amp;lt;code&amp;gt;varchar(n)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(n)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Рядок(необмежена) || &amp;lt;code&amp;gt;text&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;nvarchar(max)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Дата / ДатаЧас || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;datetime2(0)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Булево || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;bit&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| УНІ || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uniqueidentifier&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.2. Посилальні типи ===&lt;br /&gt;
* &#039;&#039;&#039;Простий&#039;&#039;&#039; (один тип): одна колонка &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r uuid NOT NULL&amp;lt;/code&amp;gt;, зовнішній ключ до таблиці об&#039;єкта. Порожнє посилання = &amp;lt;code&amp;gt;&#039;00000000-0000-0000-0000-000000000000&#039;&amp;lt;/code&amp;gt; (а не NULL — щоб зберегти семантику «пустого значення» у ключах підсумків).&lt;br /&gt;
* &#039;&#039;&#039;Складений&#039;&#039;&#039; (кілька типів / примітив + посилання): група колонок:&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Колонка !! Тип !! Опис&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_t&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;smallint&amp;lt;/code&amp;gt; || Код типу: 1=Невизначено, 2=Булево, 3=Число, 4=Рядок, 5=Дата, ≥100 = &amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt; посилального типу&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;boolean&amp;lt;/code&amp;gt; || Значення, якщо _t=2&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_n&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;numeric(38,10)&amp;lt;/code&amp;gt; || Значення, якщо _t=3&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_s&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;varchar(N)&amp;lt;/code&amp;gt; || Значення, якщо _t=4&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_d&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;timestamp(0)&amp;lt;/code&amp;gt; || Значення, якщо _t=5&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;d&amp;amp;lt;n&amp;amp;gt;_r&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; || Значення, якщо _t≥100&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №1.&#039;&#039;&#039; Для складених типів обрано «широку» денормалізацію (кілька колонок), а не JSONB/варіант, тому що: (а) колонки індексуються та беруть участь у ключах підсумків; (б) B-tree по &amp;lt;code&amp;gt;(d1_t, d1_r)&amp;lt;/code&amp;gt; дає range-scan, JSONB — ні; (в) сумісно з обома цільовими СКБД. Ціна — до 6 колонок на одне складене поле.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.2.3. Реєстратор ===&lt;br /&gt;
Завжди складений (будь-який з дозволених документів):&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_t smallint NOT NULL&amp;lt;/code&amp;gt; — код типу документа (&amp;lt;code&amp;gt;md_type.id&amp;lt;/code&amp;gt;);&lt;br /&gt;
* &amp;lt;code&amp;gt;rec_r uuid NOT NULL&amp;lt;/code&amp;gt; — посилання.&lt;br /&gt;
&lt;br /&gt;
FK неможливий (поліморфізм) → цілісність забезпечується платформою + сервісом перевірки (ФТ-41).&lt;br /&gt;
&lt;br /&gt;
=== 8.2.4. Маркери періодів ===&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Константа !! Значення !! Використання&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MINPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;0001-01-01 00:00:00&amp;lt;/code&amp;gt; || Нижня межа&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;5999-11-01 00:00:00&amp;lt;/code&amp;gt; || Рядок «підсумок за всі періоди» в таблицях залишків&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 8.3. Таблиці метаданих ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ============ РЕПОЗИТОРІЙ МЕТАДАНИХ ============&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_type (                       -- реєстр усіх типів конфігурації&lt;br /&gt;
    id            smallint     PRIMARY KEY,&lt;br /&gt;
    kind          varchar(20)  NOT NULL,     -- Catalog|Document|Enum|ChartOfAccounts|ChartOfCalcTypes|Register|...&lt;br /&gt;
    name          varchar(80)  NOT NULL,&lt;br /&gt;
    table_name    varchar(63),&lt;br /&gt;
    UNIQUE (kind, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register (&lt;br /&gt;
    id                   smallint     PRIMARY KEY,          -- = md_type.id&lt;br /&gt;
    name                 varchar(80)  NOT NULL UNIQUE,&lt;br /&gt;
    synonym              varchar(255),&lt;br /&gt;
    comment              text,&lt;br /&gt;
    kind                 varchar(12)  NOT NULL&lt;br /&gt;
        CHECK (kind IN (&#039;Information&#039;,&#039;Accumulation&#039;,&#039;Accounting&#039;,&#039;Calculation&#039;)),&lt;br /&gt;
    -- загальні&lt;br /&gt;
    write_mode           varchar(24)  NOT NULL DEFAULT &#039;SubordinateToRecorder&#039;&lt;br /&gt;
        CHECK (write_mode IN (&#039;Independent&#039;,&#039;SubordinateToRecorder&#039;)),&lt;br /&gt;
    periodicity          varchar(24)  NOT NULL DEFAULT &#039;Nonperiodical&#039;&lt;br /&gt;
        CHECK (periodicity IN (&#039;Nonperiodical&#039;,&#039;WithinSecond&#039;,&#039;WithinDay&#039;,&#039;WithinMonth&#039;,&lt;br /&gt;
                               &#039;WithinQuarter&#039;,&#039;WithinYear&#039;,&#039;ByRecorderPosition&#039;)),&lt;br /&gt;
    lock_mode            varchar(12)  NOT NULL DEFAULT &#039;Managed&#039;,&lt;br /&gt;
    use_rls              boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    partition_mode       varchar(20)  NOT NULL DEFAULT &#039;None&#039;,&lt;br /&gt;
    partition_step       varchar(10),&lt;br /&gt;
    -- РН&lt;br /&gt;
    accumulation_kind    varchar(10)  CHECK (accumulation_kind IN (&#039;Balance&#039;,&#039;Turnover&#039;)),&lt;br /&gt;
    enable_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    enable_tno_totals    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    tno_totals_period    varchar(6)   CHECK (tno_totals_period IN (&#039;Day&#039;,&#039;Month&#039;)),&lt;br /&gt;
    split_totals         boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    split_count          smallint     NOT NULL DEFAULT 1,&lt;br /&gt;
    aggregates_mode      varchar(10),&lt;br /&gt;
    -- РБ&lt;br /&gt;
    chart_of_accounts_id smallint     REFERENCES md_type(id),&lt;br /&gt;
    correspondence       boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    max_extdim_count     smallint     NOT NULL DEFAULT 3,&lt;br /&gt;
    -- РР&lt;br /&gt;
    calc_types_plan_id   smallint     REFERENCES md_type(id),&lt;br /&gt;
    use_action_period    boolean      NOT NULL DEFAULT false,&lt;br /&gt;
    base_period_mode     varchar(24)&lt;br /&gt;
        CHECK (base_period_mode IN (&#039;None&#039;,&#039;ByActionPeriod&#039;,&#039;ByRegistrationPeriod&#039;)),&lt;br /&gt;
    schedule_register_id smallint     REFERENCES md_register(id),&lt;br /&gt;
    schedule_value_field smallint,&lt;br /&gt;
    schedule_date_field  smallint,&lt;br /&gt;
    -- службове&lt;br /&gt;
    physical_table       varchar(63)  NOT NULL,&lt;br /&gt;
    struct_version       int          NOT NULL DEFAULT 1,&lt;br /&gt;
    CONSTRAINT chk_kind_props CHECK (&lt;br /&gt;
        (kind = &#039;Accumulation&#039; AND accumulation_kind IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Accounting&#039;   AND chart_of_accounts_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Calculation&#039;  AND calc_types_plan_id IS NOT NULL) OR&lt;br /&gt;
        (kind = &#039;Information&#039;)&lt;br /&gt;
    )&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_field (&lt;br /&gt;
    id                smallint    NOT NULL,        -- порядковий номер поля (стабільний)&lt;br /&gt;
    register_id       smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name              varchar(80) NOT NULL,&lt;br /&gt;
    synonym           varchar(255),&lt;br /&gt;
    role              varchar(12) NOT NULL CHECK (role IN (&#039;Dimension&#039;,&#039;Resource&#039;,&#039;Attribute&#039;)),&lt;br /&gt;
    data_type_expr    text        NOT NULL,        -- серіалізований опис типу (може бути складеним)&lt;br /&gt;
    is_composite      boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    precision_        smallint,&lt;br /&gt;
    scale_            smallint,&lt;br /&gt;
    length_           int,&lt;br /&gt;
    index_mode        varchar(28) NOT NULL DEFAULT &#039;None&#039;&lt;br /&gt;
        CHECK (index_mode IN (&#039;None&#039;,&#039;Index&#039;,&#039;IndexWithAddDimensions&#039;)),&lt;br /&gt;
    is_master         boolean     NOT NULL DEFAULT false,   -- «Ведуче»&lt;br /&gt;
    in_default_filter boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    deny_empty        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    use_in_totals     boolean     NOT NULL DEFAULT true,&lt;br /&gt;
    -- РБ&lt;br /&gt;
    is_balance        boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    accounting_flag   varchar(80),&lt;br /&gt;
    extdim_flag       varchar(80),&lt;br /&gt;
    -- РР&lt;br /&gt;
    is_base_dimension boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    -- фізика&lt;br /&gt;
    column_prefix     varchar(8)  NOT NULL,        -- &#039;d3&#039;,&#039;r1&#039;,&#039;a2&#039;&lt;br /&gt;
    PRIMARY KEY (register_id, id),&lt;br /&gt;
    UNIQUE (register_id, name)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recorder (&lt;br /&gt;
    register_id  smallint NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    doc_type_id  smallint NOT NULL REFERENCES md_type(id),&lt;br /&gt;
    PRIMARY KEY (register_id, doc_type_id)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_aggregate (&lt;br /&gt;
    id           smallint    NOT NULL,&lt;br /&gt;
    register_id  smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    periodicity  varchar(8)  NOT NULL CHECK (periodicity IN (&#039;Day&#039;,&#039;Month&#039;,&#039;Quarter&#039;,&#039;Year&#039;)),&lt;br /&gt;
    use_mode     varchar(12) NOT NULL DEFAULT &#039;Auto&#039;,&lt;br /&gt;
    is_realtime  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    actual_upto  timestamp(0),&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_aggregate_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    aggregate_id smallint NOT NULL,&lt;br /&gt;
    field_id     smallint NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, aggregate_id, field_id),&lt;br /&gt;
    FOREIGN KEY (register_id, aggregate_id) REFERENCES md_register_aggregate(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE md_register_recalc (&lt;br /&gt;
    id             smallint    NOT NULL,&lt;br /&gt;
    register_id    smallint    NOT NULL REFERENCES md_register(id) ON DELETE CASCADE,&lt;br /&gt;
    name           varchar(80) NOT NULL,&lt;br /&gt;
    physical_table varchar(63) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, id)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE md_register_recalc_dim (&lt;br /&gt;
    register_id  smallint NOT NULL,&lt;br /&gt;
    recalc_id    smallint NOT NULL,&lt;br /&gt;
    name         varchar(80) NOT NULL,&lt;br /&gt;
    reg_field_id smallint NOT NULL,          -- вимірювання основного регістру&lt;br /&gt;
    column_prefix varchar(8) NOT NULL,&lt;br /&gt;
    PRIMARY KEY (register_id, recalc_id, name),&lt;br /&gt;
    FOREIGN KEY (register_id, recalc_id) REFERENCES md_register_recalc(register_id, id) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.4. Регістр відомостей ==&lt;br /&gt;
&lt;br /&gt;
=== 8.4.1. Незалежний періодичний (приклад: КурсиВалют) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0007 (&lt;br /&gt;
    period   timestamp(0) NOT NULL,                  -- Період (усічений до дня: WithinDay)&lt;br /&gt;
    d1_r     uuid         NOT NULL,                  -- Вимірювання «Валюта»&lt;br /&gt;
    r1       numeric(15,4) NOT NULL,                 -- Ресурс «Курс»&lt;br /&gt;
    r2       numeric(10,0) NOT NULL DEFAULT 1,       -- Ресурс «Кратність»&lt;br /&gt;
    CONSTRAINT pk_rg_i_0007 PRIMARY KEY (period, d1_r)&lt;br /&gt;
);&lt;br /&gt;
-- Індекс для зрізу останніх у розрізі вимірювання&lt;br /&gt;
CREATE INDEX ix_rg_i_0007_d1 ON rg_i_0007 (d1_r, period DESC) INCLUDE (r1, r2);&lt;br /&gt;
ALTER TABLE rg_i_0007 ADD CONSTRAINT fk_rg_i_0007_d1&lt;br /&gt;
    FOREIGN KEY (d1_r) REFERENCES cat_0003(ref);      -- Довідник.Валюти&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.2. Підпорядкований реєстратору ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0008 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    r1       numeric(15,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_i_0008 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_period ON rg_i_0008 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_i_0008_d1     ON rg_i_0008 (d1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.4.3. Незалежний неперіодичний ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_i_0009 (&lt;br /&gt;
    d1_r  uuid          NOT NULL,&lt;br /&gt;
    d2_r  uuid          NOT NULL,&lt;br /&gt;
    r1    varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_i_0009 PRIMARY KEY (d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.5. Регістр накопичення ==&lt;br /&gt;
&lt;br /&gt;
=== 8.5.1. Таблиця рухів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- ТовариНаСкладах: dims = Номенклатура(d1), Склад(d2), Партія(d3, складений), Характеристика(d4)&lt;br /&gt;
--                  res  = Кількість(r1), Сума(r2);  attr = Коментар(a1)&lt;br /&gt;
CREATE TABLE rg_a_0012 (&lt;br /&gt;
    rec_t    smallint      NOT NULL,&lt;br /&gt;
    rec_r    uuid          NOT NULL,&lt;br /&gt;
    line_no  int           NOT NULL,&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    active   boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    mvt      smallint      NOT NULL CHECK (mvt IN (0,1)),   -- 0=Прихід, 1=Витрата&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,                        -- складене вимірювання «Партія»&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(15,3) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2       numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    a1       varchar(200),&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE rg_a_0012_p2026m07 PARTITION OF rg_a_0012&lt;br /&gt;
    FOR VALUES FROM (&#039;2026-07-01&#039;) TO (&#039;2026-08-01&#039;);&lt;br /&gt;
-- ... інші секції створюються регламентним завданням&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_period ON rg_a_0012 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d1     ON rg_a_0012 (d1_r, period, d2_r) WHERE active;   -- Номенклатура (Індексувати з дод. вимірюваннями)&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_d2     ON rg_a_0012 (d2_r, period, d1_r) WHERE active;   -- Склад&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.2. Таблиця підсумків залишків ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tb (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок місяця; MAXPERIOD = підсумок за всі періоди&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,     -- Кількість, знаковий залишок&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,     -- Сума&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tb PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- покривний індекс для типового відбору «залишки по складу»&lt;br /&gt;
CREATE INDEX ix_rg_a_0012_tb_d2 ON rg_a_0012_tb (d2_r, period, d1_r) INCLUDE (r1, r2);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Семантика:&#039;&#039;&#039; рядок з &amp;lt;code&amp;gt;period = P&amp;lt;/code&amp;gt; містить залишок &#039;&#039;&#039;на початок&#039;&#039;&#039; періоду P. Рядок з &amp;lt;code&amp;gt;period = MAXPERIOD&amp;lt;/code&amp;gt; — поточний залишок за всі періоди (використовується для запитів «залишки на зараз», найчастіший кейс).&lt;br /&gt;
&lt;br /&gt;
=== 8.5.3. Таблиця підсумків оборотів ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_tt (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,     -- початок періоду агрегації (день/місяць)&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    d3_t     smallint      NOT NULL,&lt;br /&gt;
    d3_r     uuid          NOT NULL,&lt;br /&gt;
    d4_r     uuid          NOT NULL,&lt;br /&gt;
    r1_in    numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Прихід&lt;br /&gt;
    r1_out   numeric(20,3) NOT NULL DEFAULT 0,   -- Кількість Витрата&lt;br /&gt;
    r2_in    numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2_out   numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0012_tt PRIMARY KEY (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.4. Службова таблиця налаштувань ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_a_0012_opt (&lt;br /&gt;
    id                smallint     PRIMARY KEY DEFAULT 1 CHECK (id = 1),&lt;br /&gt;
    totals_actual_to  timestamp(0) NOT NULL,   -- ТА: підсумки розраховані до&lt;br /&gt;
    use_bal_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    use_tno_totals    boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    min_period        timestamp(0),            -- період першого руху&lt;br /&gt;
    last_recalc_at    timestamp(0),&lt;br /&gt;
    split_merge_at    timestamp(0)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.5.5. Агрегат (для РН виду «Обороти») ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Агрегат «Продажі за місяцями по номенклатурі та складу» (без Партії, без Характеристики)&lt;br /&gt;
CREATE TABLE rg_a_0031_ag1 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    d2_r     uuid          NOT NULL,&lt;br /&gt;
    r1       numeric(20,3) NOT NULL,&lt;br /&gt;
    r2       numeric(20,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_a_0031_ag1 PRIMARY KEY (period, d1_r, d2_r)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.6. Регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
=== 8.6.1. План рахунків (супутні таблиці) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE coa_0005 (                            -- ПланРахунків.Госпрозрахунковий&lt;br /&gt;
    ref          uuid        PRIMARY KEY,&lt;br /&gt;
    parent_ref   uuid        REFERENCES coa_0005(ref),&lt;br /&gt;
    code         varchar(20) NOT NULL,&lt;br /&gt;
    order_code   varchar(40) NOT NULL,             -- впорядкований код для ієрархічних запитів&lt;br /&gt;
    name         varchar(150) NOT NULL,&lt;br /&gt;
    acc_type     smallint    NOT NULL,             -- 0=Активний,1=Пасивний,2=Активно-пасивний&lt;br /&gt;
    off_balance  boolean     NOT NULL DEFAULT false,&lt;br /&gt;
    ed_count     smallint    NOT NULL DEFAULT 0,   -- фактична кількість субконто&lt;br /&gt;
    fl_qty       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Кількісний»&lt;br /&gt;
    fl_cur       boolean     NOT NULL DEFAULT false,  -- ознака обліку «Валютний»&lt;br /&gt;
    marked_del   boolean     NOT NULL DEFAULT false&lt;br /&gt;
);&lt;br /&gt;
CREATE UNIQUE INDEX ux_coa_0005_code ON coa_0005 (code);&lt;br /&gt;
&lt;br /&gt;
CREATE TABLE coa_0005_ed (                         -- ТЧ «ВидиСубконто»&lt;br /&gt;
    ref        uuid     NOT NULL REFERENCES coa_0005(ref) ON DELETE CASCADE,&lt;br /&gt;
    line_no    int      NOT NULL,&lt;br /&gt;
    ed_type_r  uuid     NOT NULL,                  -- ПланВидівХарактеристик.ВидиСубконто&lt;br /&gt;
    only_tno   boolean  NOT NULL DEFAULT false,    -- «Тільки обороти»&lt;br /&gt;
    sum_flag   boolean  NOT NULL DEFAULT true,     -- «Підсумкова сума»&lt;br /&gt;
    fl_qty     boolean  NOT NULL DEFAULT false,    -- ознака обліку субконто «Кількісний»&lt;br /&gt;
    PRIMARY KEY (ref, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.2. Таблиця проводок (з кореспонденцією) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Госпрозрахунковий: dims = Організація(d1, балансове), Підрозділ(d2, небалансове)&lt;br /&gt;
--   res = Сума(r1, балансовий), Кількість(r2, небалансовий), ВалютнаСума(r3, небалансовий)&lt;br /&gt;
--   attr = Зміст(a1), Валюта(a2);  max_extdim_count = 3&lt;br /&gt;
CREATE TABLE rg_b_0020 (&lt;br /&gt;
    rec_t     smallint      NOT NULL,&lt;br /&gt;
    rec_r     uuid          NOT NULL,&lt;br /&gt;
    line_no   int           NOT NULL,&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    active    boolean       NOT NULL DEFAULT true,&lt;br /&gt;
&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL REFERENCES coa_0005(ref),&lt;br /&gt;
&lt;br /&gt;
    -- балансове вимірювання: одне значення на проводку&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    -- небалансове вимірювання: окремо для Дт і Кт&lt;br /&gt;
    d2_dt_r   uuid          NOT NULL,&lt;br /&gt;
    d2_kt_r   uuid          NOT NULL,&lt;br /&gt;
&lt;br /&gt;
    -- субконто Дт (3 слоти, складений тип: ПВХ-значення)&lt;br /&gt;
    ed_dt1_t  smallint, ed_dt1_r uuid,&lt;br /&gt;
    ed_dt2_t  smallint, ed_dt2_r uuid,&lt;br /&gt;
    ed_dt3_t  smallint, ed_dt3_r uuid,&lt;br /&gt;
    ed_dt_h   bigint        NOT NULL DEFAULT 0,     -- хеш набору субконто Дт (для JOIN з підсумками)&lt;br /&gt;
    -- субконто Кт&lt;br /&gt;
    ed_kt1_t  smallint, ed_kt1_r uuid,&lt;br /&gt;
    ed_kt2_t  smallint, ed_kt2_r uuid,&lt;br /&gt;
    ed_kt3_t  smallint, ed_kt3_r uuid,&lt;br /&gt;
    ed_kt_h   bigint        NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    -- балансовий ресурс: одне значення&lt;br /&gt;
    r1        numeric(20,2) NOT NULL DEFAULT 0,     -- Сума&lt;br /&gt;
    -- небалансові ресурси: пара Дт/Кт&lt;br /&gt;
    r2_dt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Дт&lt;br /&gt;
    r2_kt     numeric(20,3) NOT NULL DEFAULT 0,     -- Кількість Кт&lt;br /&gt;
    r3_dt     numeric(20,2) NOT NULL DEFAULT 0,     -- ВалютнаСума Дт&lt;br /&gt;
    r3_kt     numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
&lt;br /&gt;
    a1        varchar(255),&lt;br /&gt;
    a2_r      uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
) PARTITION BY RANGE (period);&lt;br /&gt;
&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_period  ON rg_b_0020 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_dt  ON rg_b_0020 (acc_dt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_acc_kt  ON rg_b_0020 (acc_kt_r, period) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_dt   ON rg_b_0020 (ed_dt1_t, ed_dt1_r, period) WHERE active;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Проєктне рішення №2.&#039;&#039;&#039; Субконто зберігаються &#039;&#039;&#039;слотами в основній таблиці&#039;&#039;&#039;, а не в дочірній таблиці «ключ-значення». Обґрунтування: (а) віртуальні таблиці &amp;lt;code&amp;gt;Залишки&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;Обороти&amp;lt;/code&amp;gt; з відбором за субконто перетворюються на предикат по колонці замість &amp;lt;code&amp;gt;N&amp;lt;/code&amp;gt; самоз&#039;єднань; (б) кількість субконто жорстко обмежена (≤5) — «широка» таблиця прийнятна; (в) 1С використовує гібрид (&amp;lt;code&amp;gt;_AccRgED&amp;lt;/code&amp;gt;), що дає складніші плани. &#039;&#039;&#039;Ціна:&#039;&#039;&#039; зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; = реструктуризація таблиці. Альтернатива (дочірня таблиця &amp;lt;code&amp;gt;rg_b_0020_ed&amp;lt;/code&amp;gt;) описана в Додатку Б і зберігається як план «Б» за результатами навантажувального тесту НТ-04.}}&lt;br /&gt;
&lt;br /&gt;
=== 8.6.3. Таблиця проводок (без кореспонденції) ===&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
CREATE TABLE rg_b_0021 (&lt;br /&gt;
    rec_t    smallint     NOT NULL,&lt;br /&gt;
    rec_r    uuid         NOT NULL,&lt;br /&gt;
    line_no  int          NOT NULL,&lt;br /&gt;
    period   timestamp(0) NOT NULL,&lt;br /&gt;
    active   boolean      NOT NULL DEFAULT true,&lt;br /&gt;
    acc_mvt  smallint     NOT NULL CHECK (acc_mvt IN (0,1)),  -- 0=Дебет, 1=Кредит&lt;br /&gt;
    acc_r    uuid         NOT NULL REFERENCES coa_0006(ref),&lt;br /&gt;
    d1_r     uuid         NOT NULL,&lt;br /&gt;
    ed1_t smallint, ed1_r uuid,&lt;br /&gt;
    ed2_t smallint, ed2_r uuid,&lt;br /&gt;
    ed3_t smallint, ed3_r uuid,&lt;br /&gt;
    ed_h     bigint       NOT NULL DEFAULT 0,&lt;br /&gt;
    r1       numeric(20,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0021 PRIMARY KEY (rec_t, rec_r, line_no)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== 8.6.4. Підсумки РБ ===&lt;br /&gt;
Підсумки будуються на кількох «рівнях субконто» — щоб запит без відбору за субконто не сканував найдетальнішу таблицю.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Рівень 0: залишки по рахунку + балансові вимірювання (без субконто)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,               -- Організація (балансове)&lt;br /&gt;
    r1       numeric(24,2) NOT NULL,               -- Сума: &amp;gt;0 = дебетовий, &amp;lt;0 = кредитовий залишок&lt;br /&gt;
    r2       numeric(24,3) NOT NULL,               -- Кількість&lt;br /&gt;
    r3       numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Рівень 1..3: залишки з розшифровкою по субконто (тільки для рахунків з ed_count &amp;gt;= k)&lt;br /&gt;
CREATE TABLE rg_b_0020_tb1 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t   smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb1 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
CREATE TABLE rg_b_0020_tb2 (&lt;br /&gt;
    period  timestamp(0) NOT NULL, splitter smallint NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r   uuid NOT NULL, d1_r uuid NOT NULL,&lt;br /&gt;
    ed1_t smallint NOT NULL, ed1_r uuid NOT NULL,&lt;br /&gt;
    ed2_t smallint NOT NULL, ed2_r uuid NOT NULL,&lt;br /&gt;
    r1 numeric(24,2) NOT NULL, r2 numeric(24,3) NOT NULL, r3 numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tb2 PRIMARY KEY (period, acc_r, d1_r, ed1_t, ed1_r, ed2_t, ed2_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
-- rg_b_0020_tb3 — аналогічно, 3 субконто&lt;br /&gt;
&lt;br /&gt;
-- Обороти (аналогічні рівні): tt0..tt3&lt;br /&gt;
CREATE TABLE rg_b_0020_tt0 (&lt;br /&gt;
    period   timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_r    uuid          NOT NULL,&lt;br /&gt;
    d1_r     uuid          NOT NULL,&lt;br /&gt;
    r1_dt numeric(24,2) NOT NULL, r1_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    r2_dt numeric(24,3) NOT NULL, r2_kt numeric(24,3) NOT NULL,&lt;br /&gt;
    r3_dt numeric(24,2) NOT NULL, r3_kt numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tt0 PRIMARY KEY (period, acc_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&lt;br /&gt;
-- Обороти між рахунками (кореспонденції)&lt;br /&gt;
CREATE TABLE rg_b_0020_tc (&lt;br /&gt;
    period    timestamp(0)  NOT NULL,&lt;br /&gt;
    splitter  smallint      NOT NULL DEFAULT 0,&lt;br /&gt;
    acc_dt_r  uuid          NOT NULL,&lt;br /&gt;
    acc_kt_r  uuid          NOT NULL,&lt;br /&gt;
    d1_r      uuid          NOT NULL,&lt;br /&gt;
    r1        numeric(24,2) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_b_0020_tc PRIMARY KEY (period, acc_dt_r, acc_kt_r, d1_r, splitter)&lt;br /&gt;
);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Правило запису рівнів:&#039;&#039;&#039; для проводки з рахунком, що має &amp;lt;code&amp;gt;ed_count = k&amp;lt;/code&amp;gt;, оновлюються таблиці &amp;lt;code&amp;gt;tb0 … tbK&amp;lt;/code&amp;gt; (k+1 таблиць). Рахунки без субконто оновлюють лише &amp;lt;code&amp;gt;tb0&amp;lt;/code&amp;gt;. Субконто з ознакою «Тільки обороти» не потрапляють у &amp;lt;code&amp;gt;tb*&amp;lt;/code&amp;gt;, лише в &amp;lt;code&amp;gt;tt*&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== 8.7. Регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Нарахування: dims = Співробітник(d1, базове), Підрозділ(d2)&lt;br /&gt;
--              res  = Результат(r1), ВідпрацьованоДнів(r2), НормаДнів(r3)&lt;br /&gt;
--              attr = Графік(a1)&lt;br /&gt;
CREATE TABLE rg_c_0040 (&lt;br /&gt;
    rec_t        smallint      NOT NULL,&lt;br /&gt;
    rec_r        uuid          NOT NULL,&lt;br /&gt;
    line_no      int           NOT NULL,&lt;br /&gt;
    period       timestamp(0)  NOT NULL,      -- період реєстрації (початок місяця)&lt;br /&gt;
    active       boolean       NOT NULL DEFAULT true,&lt;br /&gt;
    reversal     boolean       NOT NULL DEFAULT false,   -- Сторно&lt;br /&gt;
    calc_type_r  uuid          NOT NULL,                 -- ВидРозрахунку → pct_0011(ref)&lt;br /&gt;
    act_begin    timestamp(0)  NOT NULL,      -- ПеріодДіїПочаток&lt;br /&gt;
    act_end      timestamp(0)  NOT NULL,      -- ПеріодДіїКінець&lt;br /&gt;
    base_begin   timestamp(0),                -- БазовийПеріодПочаток&lt;br /&gt;
    base_end     timestamp(0),                -- БазовийПеріодКінець&lt;br /&gt;
    d1_r         uuid          NOT NULL,&lt;br /&gt;
    d2_r         uuid          NOT NULL,&lt;br /&gt;
    r1           numeric(15,2) NOT NULL DEFAULT 0,&lt;br /&gt;
    r2           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    r3           numeric(5,0)  NOT NULL DEFAULT 0,&lt;br /&gt;
    a1_r         uuid,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040 PRIMARY KEY (rec_t, rec_r, line_no),&lt;br /&gt;
    CONSTRAINT chk_rg_c_0040_act CHECK (act_end &amp;gt;= act_begin)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_period ON rg_c_0040 (period, rec_t, rec_r, line_no);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_d1     ON rg_c_0040 (d1_r, period, calc_type_r) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_act    ON rg_c_0040 (d1_r, act_begin, act_end) WHERE active;&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_base   ON rg_c_0040 (d1_r, calc_type_r, base_begin, base_end) WHERE active;&lt;br /&gt;
&lt;br /&gt;
-- Фактичні періоди дії (після витіснення). Один запис → 0..N інтервалів.&lt;br /&gt;
CREATE TABLE rg_c_0040_ap (&lt;br /&gt;
    rec_t       smallint     NOT NULL,&lt;br /&gt;
    rec_r       uuid         NOT NULL,&lt;br /&gt;
    line_no     int          NOT NULL,&lt;br /&gt;
    interval_no smallint     NOT NULL,&lt;br /&gt;
    calc_type_r uuid         NOT NULL,&lt;br /&gt;
    d1_r        uuid         NOT NULL,        -- денормалізація базового вимірювання для швидкого JOIN&lt;br /&gt;
    fact_begin  timestamp(0) NOT NULL,&lt;br /&gt;
    fact_end    timestamp(0) NOT NULL,&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_ap PRIMARY KEY (rec_t, rec_r, line_no, interval_no),&lt;br /&gt;
    CONSTRAINT fk_rg_c_0040_ap FOREIGN KEY (rec_t, rec_r, line_no)&lt;br /&gt;
        REFERENCES rg_c_0040 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_ap_d1 ON rg_c_0040_ap (d1_r, fact_begin, fact_end);&lt;br /&gt;
&lt;br /&gt;
-- Перерахунок «ПерерахунокЗаБазою»&lt;br /&gt;
CREATE TABLE rg_c_0040_rc1 (&lt;br /&gt;
    rec_t        smallint NOT NULL,     -- реєстратор запису, який треба перерахувати&lt;br /&gt;
    rec_r        uuid     NOT NULL,&lt;br /&gt;
    calc_type_r  uuid     NOT NULL,     -- вид розрахунку, що потребує перерахунку&lt;br /&gt;
    d1_r         uuid     NOT NULL,     -- вимірювання перерахунку «Співробітник»&lt;br /&gt;
    src_rec_t    smallint NOT NULL,     -- реєстратор, що спричинив перерахунок&lt;br /&gt;
    src_rec_r    uuid     NOT NULL,&lt;br /&gt;
    created_at   timestamp(0) NOT NULL DEFAULT now(),&lt;br /&gt;
    CONSTRAINT pk_rg_c_0040_rc1 PRIMARY KEY (rec_t, rec_r, calc_type_r, d1_r)&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_c_0040_rc1_src ON rg_c_0040_rc1 (src_rec_t, src_rec_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 8.8. Зведення: які таблиці породжує кожен тип регістру ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
РВ (незалежний)          →  rg_i_&amp;lt;id&amp;gt;&lt;br /&gt;
РВ (підпорядкований)     →  rg_i_&amp;lt;id&amp;gt;&lt;br /&gt;
&lt;br /&gt;
РН (Залишки)             →  rg_a_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_tb        (якщо ДозволитиПідсумкиЗалишків)&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_tt        (якщо ДозволитиПідсумкиОборотів)&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_opt&lt;br /&gt;
&lt;br /&gt;
РН (Обороти)             →  rg_a_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_tt&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_ag1..agN  (агрегати)&lt;br /&gt;
                            rg_a_&amp;lt;id&amp;gt;_opt&lt;br /&gt;
&lt;br /&gt;
РБ                       →  rg_b_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_tb0 .. _tbK   (K = МаксКількістьСубконто)&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_tt0 .. _ttK&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_tc&lt;br /&gt;
                            rg_b_&amp;lt;id&amp;gt;_opt&lt;br /&gt;
&lt;br /&gt;
РР                       →  rg_c_&amp;lt;id&amp;gt;&lt;br /&gt;
                            rg_c_&amp;lt;id&amp;gt;_ap&lt;br /&gt;
                            rg_c_&amp;lt;id&amp;gt;_rc1 .. _rcM   (перерахунки)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Оцінка: для РБ з &amp;lt;code&amp;gt;МаксКількістьСубконто = 3&amp;lt;/code&amp;gt; генерується &#039;&#039;&#039;10 фізичних таблиць&#039;&#039;&#039; на один регістр.&lt;br /&gt;
&lt;br /&gt;
= 9. ER-моделі =&lt;br /&gt;
&lt;br /&gt;
== 9.1. ER-модель метаданих (репозиторій) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_type&amp;quot; as T {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * kind : varchar(20)&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  table_name : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register&amp;quot; as R {&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK,FK→md_type&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * kind : varchar(12)&lt;br /&gt;
  * write_mode : varchar(24)&lt;br /&gt;
  * periodicity : varchar(24)&lt;br /&gt;
  accumulation_kind : varchar(10)&lt;br /&gt;
  enable_bal_totals : boolean&lt;br /&gt;
  enable_tno_totals : boolean&lt;br /&gt;
  tno_totals_period : varchar(6)&lt;br /&gt;
  split_totals : boolean&lt;br /&gt;
  chart_of_accounts_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  correspondence : boolean&lt;br /&gt;
  max_extdim_count : smallint&lt;br /&gt;
  calc_types_plan_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_period_mode : varchar(24)&lt;br /&gt;
  schedule_register_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
  * struct_version : int&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_field&amp;quot; as F {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  * role : Dimension|Resource|Attribute&lt;br /&gt;
  * data_type_expr : text&lt;br /&gt;
  is_composite : boolean&lt;br /&gt;
  index_mode : varchar(28)&lt;br /&gt;
  is_master : boolean&lt;br /&gt;
  is_balance : boolean&lt;br /&gt;
  is_base_dimension : boolean&lt;br /&gt;
  accounting_flag : varchar(80)&lt;br /&gt;
  * column_prefix : varchar(8)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recorder&amp;quot; as RR {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * doc_type_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate&amp;quot; as AG {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * periodicity : Day|Month|Quarter|Year&lt;br /&gt;
  is_realtime : boolean&lt;br /&gt;
  actual_upto : timestamp&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_aggregate_dim&amp;quot; as AGD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * aggregate_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * field_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc&amp;quot; as RC {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * id : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * name : varchar(80)&lt;br /&gt;
  * physical_table : varchar(63)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;md_register_recalc_dim&amp;quot; as RCD {&lt;br /&gt;
  * register_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * recalc_id : smallint &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * name : varchar(80) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * reg_field_id : smallint &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
T ||--o| R          : &amp;quot;є регістром&amp;quot;&lt;br /&gt;
T ||--o{ RR         : &amp;quot;тип документа&amp;quot;&lt;br /&gt;
R ||--|{ F          : &amp;quot;має поля&amp;quot;&lt;br /&gt;
R ||--o{ RR         : &amp;quot;реєстратори&amp;quot;&lt;br /&gt;
R ||--o{ AG         : &amp;quot;агрегати&amp;quot;&lt;br /&gt;
AG ||--|{ AGD       : &amp;quot;склад вимірювань&amp;quot;&lt;br /&gt;
F  ||--o{ AGD       : &amp;quot;вимірювання&amp;quot;&lt;br /&gt;
R ||--o{ RC         : &amp;quot;перерахунки&amp;quot;&lt;br /&gt;
RC ||--|{ RCD       : &amp;quot;вимірювання перерахунку&amp;quot;&lt;br /&gt;
F  ||--o{ RCD       : &amp;quot;відповідає&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план рахунків&amp;quot;&lt;br /&gt;
R }o--o| T          : &amp;quot;план видів розрахунку&amp;quot;&lt;br /&gt;
R }o--o| R          : &amp;quot;графік часу&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.2. ER-модель: регістр накопичення (вид «Залишки») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0002\n«ПрихіднаНакладна»&amp;quot; as D1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;doc_0003\n«ВидатковаНакладна»&amp;quot; as D2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number : varchar&lt;br /&gt;
  date : timestamp&lt;br /&gt;
  posted : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0001\n«Номенклатура»&amp;quot; as C1 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cat_0004\n«Склади»&amp;quot; as C2 {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012\n«ТовариНаСкладах» (рухи)&amp;quot; as M {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * mvt : smallint  «0=Прихід,1=Витрата»&lt;br /&gt;
  * d1_r : uuid  «Номенклатура» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid  «Склад» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint «Партія:тип»&lt;br /&gt;
  * d3_r : uuid  «Партія:посилання»&lt;br /&gt;
  * d4_r : uuid  «Характеристика» &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * r1 : numeric(15,3) «Кількість»&lt;br /&gt;
  * r2 : numeric(15,2) «Сума»&lt;br /&gt;
  a1 : varchar(200) «Коментар»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tb\nпідсумки залишків&amp;quot; as TB {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * r1 : numeric(20,3) «Кількість (±)»&lt;br /&gt;
  * r2 : numeric(20,2) «Сума (±)»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_tt\nпідсумки оборотів&amp;quot; as TT {&lt;br /&gt;
  * period : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d2_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d3_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d4_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_in, r1_out : numeric(20,3)&lt;br /&gt;
  r2_in, r2_out : numeric(20,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_a_0012_opt&amp;quot; as OPT {&lt;br /&gt;
  * id : smallint = 1 &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * totals_actual_to : timestamp(0)&lt;br /&gt;
  use_bal_totals : boolean&lt;br /&gt;
  use_tno_totals : boolean&lt;br /&gt;
  min_period : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
D1 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
D2 ||..o{ M : &amp;quot;реєстратор\n(поліморфний, без FK)&amp;quot;&lt;br /&gt;
C1 ||--o{ M : &amp;quot;d1_r&amp;quot;&lt;br /&gt;
C2 ||--o{ M : &amp;quot;d2_r&amp;quot;&lt;br /&gt;
M }o..|| TB : &amp;quot;агрегується в\n(підтримується платформою)&amp;quot;&lt;br /&gt;
M }o..|| TT : &amp;quot;агрегується в&amp;quot;&lt;br /&gt;
OPT ||..|| TB : &amp;quot;ТА підсумків&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note bottom of M&lt;br /&gt;
  PK = (rec_t, rec_r, line_no)&lt;br /&gt;
  → усі рухи одного документа&lt;br /&gt;
    фізично суміжні&lt;br /&gt;
  Партиціонування: RANGE(period)&lt;br /&gt;
end note&lt;br /&gt;
&lt;br /&gt;
note bottom of TB&lt;br /&gt;
  period = MAXPERIOD (&#039;5999-11-01&#039;)&lt;br /&gt;
  → рядок «залишок за всі періоди»&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.3. ER-модель: регістр бухгалтерії ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;coa_0005\n«План рахунків»&amp;quot; as A {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  parent_ref : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * code : varchar(20) &amp;lt;&amp;lt;U&amp;gt;&amp;gt;&lt;br /&gt;
  order_code : varchar(40)&lt;br /&gt;
  * name : varchar(150)&lt;br /&gt;
  * acc_type : smallint «Акт/Пас/АП»&lt;br /&gt;
  off_balance : boolean&lt;br /&gt;
  ed_count : smallint&lt;br /&gt;
  fl_qty, fl_cur : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;coa_0005_ed\n«Види субконто рахунку»&amp;quot; as AE {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * ed_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  only_tno : boolean&lt;br /&gt;
  sum_flag : boolean&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;cvt_0009\n«ПВХ.ВидиСубконто»&amp;quot; as VT {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  value_type : text&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020\n«Госпрозрахунковий» (проводки)&amp;quot; as J {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0)&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * acc_dt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r : uuid «Організація (балансове)»&lt;br /&gt;
  * d2_dt_r : uuid «Підрозділ Дт»&lt;br /&gt;
  * d2_kt_r : uuid «Підрозділ Кт»&lt;br /&gt;
  ed_dt1_t/_r .. ed_dt3_t/_r : «субконто Дт»&lt;br /&gt;
  ed_dt_h : bigint&lt;br /&gt;
  ed_kt1_t/_r .. ed_kt3_t/_r : «субконто Кт»&lt;br /&gt;
  ed_kt_h : bigint&lt;br /&gt;
  * r1 : numeric(20,2) «Сума (балансовий)»&lt;br /&gt;
  r2_dt, r2_kt : numeric(20,3) «Кількість»&lt;br /&gt;
  r3_dt, r3_kt : numeric(20,2) «ВалютнаСума»&lt;br /&gt;
  a1 : varchar(255) «Зміст»&lt;br /&gt;
  a2_r : uuid «Валюта»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb0\nзалишки, рівень 0&amp;quot; as B0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric «знакові»&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tb1..tb3\nзалишки, рівні 1..3&amp;quot; as B1 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * ed1_t, ed1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed2_t, ed2_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed3_t, ed3_r) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * splitter &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1, r2, r3 : numeric&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tt0..tt3\nобороти за рівнями&amp;quot; as T0 {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * (ed…) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1_dt, r1_kt&lt;br /&gt;
  r2_dt, r2_kt&lt;br /&gt;
  r3_dt, r3_kt&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;rg_b_0020_tc\nобороти Дт↔Кт&amp;quot; as TC {&lt;br /&gt;
  * period &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_dt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * acc_kt_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric(24,2)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
A ||--o{ AE : &amp;quot;види субконто&amp;quot;&lt;br /&gt;
VT ||--o{ AE : &amp;quot;тип субконто&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_dt_r&amp;quot;&lt;br /&gt;
A ||--o{ J  : &amp;quot;acc_kt_r&amp;quot;&lt;br /&gt;
A ||--o{ B0 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
A ||--o{ B1 : &amp;quot;acc_r&amp;quot;&lt;br /&gt;
J }o..|| B0 : &amp;quot;агрегується (Дт: +, Кт: −)&amp;quot;&lt;br /&gt;
J }o..|| B1 : &amp;quot;агрегується, якщо ed_count ≥ k&amp;quot;&lt;br /&gt;
J }o..|| T0 : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
J }o..|| TC : &amp;quot;агрегується&amp;quot;&lt;br /&gt;
&lt;br /&gt;
note right of J&lt;br /&gt;
  Балансовий ресурс r1 — одне значення,&lt;br /&gt;
  контроль Σ(Дт) = Σ(Кт) у межах реєстратора.&lt;br /&gt;
  Небалансові ресурси — пара Дт/Кт.&lt;br /&gt;
  Субконто — слоти (див. Рішення №2).&lt;br /&gt;
end note&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.4. ER-модель: регістр розрахунку ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;plantuml&amp;gt;&lt;br /&gt;
@startuml&lt;br /&gt;
hide circle&lt;br /&gt;
skinparam linetype ortho&lt;br /&gt;
skinparam shadowing false&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;pct_0011\n«ПВР.ОсновніНарахування»&amp;quot; as P {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  code, name&lt;br /&gt;
  use_action_period : boolean&lt;br /&gt;
  base_dependency : varchar(24)&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_base\n«Базові види розрахунку»&amp;quot; as PB {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * base_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_displace\n«Витісняючі види розрахунку»&amp;quot; as PD {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * displacing_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
entity &amp;quot;pct_0011_lead\n«Ведучі види розрахунку»&amp;quot; as PL {&lt;br /&gt;
  * ref &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * leading_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040\n«Нарахування» (рухи)&amp;quot; as CR {&lt;br /&gt;
  * rec_t : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no : int &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * period : timestamp(0) «період реєстрації»&lt;br /&gt;
  * active : boolean&lt;br /&gt;
  * reversal : boolean «Сторно»&lt;br /&gt;
  * calc_type_r : uuid &amp;lt;&amp;lt;FK&amp;gt;&amp;gt;&lt;br /&gt;
  * act_begin : timestamp(0)&lt;br /&gt;
  * act_end : timestamp(0)&lt;br /&gt;
  base_begin : timestamp(0)&lt;br /&gt;
  base_end : timestamp(0)&lt;br /&gt;
  * d1_r : uuid «Співробітник (базове)»&lt;br /&gt;
  * d2_r : uuid «Підрозділ»&lt;br /&gt;
  r1 : numeric «Результат»&lt;br /&gt;
  r2 : numeric «ВідпрацьованоДнів»&lt;br /&gt;
  r3 : numeric «НормаДнів»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_ap\nфактичні періоди дії&amp;quot; as AP {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * line_no &amp;lt;&amp;lt;PK,FK&amp;gt;&amp;gt;&lt;br /&gt;
  * interval_no : smallint &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  * calc_type_r : uuid&lt;br /&gt;
  * d1_r : uuid&lt;br /&gt;
  * fact_begin : timestamp(0)&lt;br /&gt;
  * fact_end : timestamp(0)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_c_0040_rc1\n«ПерерахунокЗаБазою»&amp;quot; as RC {&lt;br /&gt;
  * rec_t &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * rec_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * calc_type_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  * d1_r &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  src_rec_t, src_rec_r&lt;br /&gt;
  created_at&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;rg_i_0015\n«ГрафікРоботи» (РВ)&amp;quot; as SCH {&lt;br /&gt;
  * d1_r : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ВидГрафіка»&lt;br /&gt;
  * d2_d : timestamp(0) &amp;lt;&amp;lt;PK&amp;gt;&amp;gt; «ДатаГрафіка»&lt;br /&gt;
  --&lt;br /&gt;
  r1 : numeric «Значення»&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
entity &amp;quot;doc_0007\n«НарахуванняЗарплати»&amp;quot; as DOC {&lt;br /&gt;
  * ref : uuid &amp;lt;&amp;lt;PK&amp;gt;&amp;gt;&lt;br /&gt;
  --&lt;br /&gt;
  number, date, posted&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
P ||--o{ CR  : &amp;quot;calc_type_r&amp;quot;&lt;br /&gt;
P ||--o{ PB  : &amp;quot;базові&amp;quot;&lt;br /&gt;
P ||--o{ PD  : &amp;quot;витісняючі&amp;quot;&lt;br /&gt;
P ||--o{ PL  : &amp;quot;ведучі&amp;quot;&lt;br /&gt;
DOC ||..o{ CR : &amp;quot;реєстратор&amp;quot;&lt;br /&gt;
CR ||--|{ AP : &amp;quot;1 запис → 0..N\nфактичних інтервалів&amp;quot;&lt;br /&gt;
CR }o..o{ RC : &amp;quot;потребує перерахунку&amp;quot;&lt;br /&gt;
SCH }o..o{ CR : &amp;quot;ДаніГрафіка\n(віртуальна таблиця)&amp;quot;&lt;br /&gt;
CR }o..o{ CR : &amp;quot;БазаРозрахунку\n(self-join через PB\nта базові вимірювання)&amp;quot;&lt;br /&gt;
@enduml&lt;br /&gt;
&amp;lt;/plantuml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 9.5. Зведена концептуальна ER (усі типи) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;graphviz&amp;gt;&lt;br /&gt;
digraph ER {&lt;br /&gt;
  rankdir=LR; bgcolor=&amp;quot;transparent&amp;quot;;&lt;br /&gt;
  node [shape=record, fontname=&amp;quot;Helvetica&amp;quot;, fontsize=9, style=filled];&lt;br /&gt;
  edge [fontname=&amp;quot;Helvetica&amp;quot;, fontsize=8];&lt;br /&gt;
&lt;br /&gt;
  MD  [label=&amp;quot;{md_register|id (PK)\lname\lkind\lperiodicity\lwrite_mode\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDF [label=&amp;quot;{md_register_field|register_id (PK,FK)\lid (PK)\lname\lrole\ldata_type\l...}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
  MDR [label=&amp;quot;{md_register_recorder|register_id (PK,FK)\ldoc_type_id (PK,FK)\l}&amp;quot;, fillcolor=&amp;quot;#dbe9ff&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  DOC [label=&amp;quot;{doc_XXXX (Документ)|ref (PK)\lnumber\ldate\lposted\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  CAT [label=&amp;quot;{cat_XXXX (Довідник)|ref (PK)\lcode\lname\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  COA [label=&amp;quot;{coa_XXXX (План рахунків)|ref (PK)\lcode\lacc_type\led_count\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
  PCT [label=&amp;quot;{pct_XXXX (ПВР)|ref (PK)\lcode\l}&amp;quot;, fillcolor=&amp;quot;#fff8e1&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RI  [label=&amp;quot;{rg_i_XXXX (РВ)|period (PK*)\ld1..dN (PK*)\l| rec_t,rec_r,line_no (PK**)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#e8f5e9&amp;quot;];&lt;br /&gt;
  RA  [label=&amp;quot;{rg_a_XXXX (РН)|rec_t, rec_r, line_no (PK)\lperiod\lactive\lmvt\ld1..dN\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#fff3e0&amp;quot;];&lt;br /&gt;
  RAT [label=&amp;quot;{rg_a_XXXX_tb / _tt|period (PK)\ld1..dN (PK)\lsplitter (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ffe0b2&amp;quot;];&lt;br /&gt;
  RB  [label=&amp;quot;{rg_b_XXXX (РБ)|rec_t, rec_r, line_no (PK)\lperiod, active\lacc_dt_r, acc_kt_r\led_dt1..3, ed_kt1..3\ld1..dN\lr1, r2_dt/r2_kt\l}&amp;quot;, fillcolor=&amp;quot;#fce4ec&amp;quot;];&lt;br /&gt;
  RBT [label=&amp;quot;{rg_b_XXXX_tb0..tbK\lrg_b_XXXX_tt0..ttK\lrg_b_XXXX_tc|period, acc_r, d1..dN\led1..edK (PK)\lr1..rM\l}&amp;quot;, fillcolor=&amp;quot;#f8bbd0&amp;quot;];&lt;br /&gt;
  RC  [label=&amp;quot;{rg_c_XXXX (РР)|rec_t, rec_r, line_no (PK)\lperiod, active, reversal\lcalc_type_r\lact_begin, act_end\lbase_begin, base_end\ld1..dN, r1..rM\l}&amp;quot;, fillcolor=&amp;quot;#ede7f6&amp;quot;];&lt;br /&gt;
  RCA [label=&amp;quot;{rg_c_XXXX_ap|rec_t,rec_r,line_no (PK,FK)\linterval_no (PK)\lfact_begin, fact_end\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
  RCR [label=&amp;quot;{rg_c_XXXX_rc1..rcM|rec_t, rec_r (PK)\lcalc_type_r (PK)\ld1..dN (PK)\l}&amp;quot;, fillcolor=&amp;quot;#d1c4e9&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  MD  -&amp;gt; MDF [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; MDR [label=&amp;quot;1:N&amp;quot;];&lt;br /&gt;
  MDR -&amp;gt; DOC [label=&amp;quot;тип&amp;quot;];&lt;br /&gt;
  MD  -&amp;gt; COA [label=&amp;quot;0:1 план рахунків&amp;quot;, style=dashed];&lt;br /&gt;
  MD  -&amp;gt; PCT [label=&amp;quot;0:1 ПВР&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  MD -&amp;gt; RI [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RA [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RB [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
  MD -&amp;gt; RC [label=&amp;quot;генерує DDL&amp;quot;, style=dotted, color=blue];&lt;br /&gt;
&lt;br /&gt;
  DOC -&amp;gt; RI [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RA [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RB [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
  DOC -&amp;gt; RC [label=&amp;quot;реєстратор (поліморф.)&amp;quot;, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  CAT -&amp;gt; RI [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  CAT -&amp;gt; RA [label=&amp;quot;FK вимір.&amp;quot;];&lt;br /&gt;
  COA -&amp;gt; RB [label=&amp;quot;FK рахунок&amp;quot;];&lt;br /&gt;
  PCT -&amp;gt; RC [label=&amp;quot;FK вид розрах.&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
  RA -&amp;gt; RAT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RB -&amp;gt; RBT [label=&amp;quot;агрегація (платформа)&amp;quot;, color=darkgreen];&lt;br /&gt;
  RC -&amp;gt; RCA [label=&amp;quot;витіснення → 1:N&amp;quot;, color=purple];&lt;br /&gt;
  RC -&amp;gt; RCR [label=&amp;quot;реєстрація перерахунків&amp;quot;, color=purple, style=dashed];&lt;br /&gt;
&lt;br /&gt;
  { rank=same; MD; MDF; MDR; }&lt;br /&gt;
  { rank=same; RI; RA; RB; RC; }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/graphviz&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Легенда:&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;code&amp;gt;(PK*)&amp;lt;/code&amp;gt; — ключ для незалежного РВ; &amp;lt;code&amp;gt;(PK**)&amp;lt;/code&amp;gt; — для підпорядкованого.&lt;br /&gt;
* Пунктир «реєстратор» — логічний зв&#039;язок без FK (поліморфне посилання, підтримується платформою).&lt;br /&gt;
* Пунктир «генерує DDL» — метадані → фізична схема (не зв&#039;язок даних).&lt;br /&gt;
&lt;br /&gt;
= 10. Ключові алгоритми =&lt;br /&gt;
&lt;br /&gt;
== 10.1. Запис набору записів (режим «Заміщати») ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ЗАПИСАТИ_НАБІР(регістр R, відбір S, записи N[]):&lt;br /&gt;
  1. Перевірити права (Додавання/Зміна)&lt;br /&gt;
  2. Валідація: тип реєстратора ∈ md_register_recorder;&lt;br /&gt;
                вимірювання з deny_empty ≠ порожнє;&lt;br /&gt;
                для РБ — Σ(r1 де балансовий) по Дт = по Кт у межах реєстратора&lt;br /&gt;
  3. У транзакції:&lt;br /&gt;
     3.1. СТАРІ := SELECT * FROM rg_x WHERE &amp;lt;відбір S&amp;gt; FOR UPDATE&lt;br /&gt;
     3.2. Δ := АГРЕГУВАТИ(N, +1) ⊕ АГРЕГУВАТИ(СТАРІ, −1)   // тільки active&lt;br /&gt;
     3.3. DELETE FROM rg_x WHERE &amp;lt;відбір S&amp;gt;&lt;br /&gt;
     3.4. INSERT INTO rg_x SELECT ... FROM N&lt;br /&gt;
     3.5. ОНОВИТИ_ПІДСУМКИ(R, Δ)                          // див. 10.2&lt;br /&gt;
     3.6. ЯКЩО R.kind = Calculation:&lt;br /&gt;
              ПЕРЕРАХУВАТИ_ФАКТИЧНІ_ПЕРІОДИ(R, зачеплені вимірювання)  // 10.4&lt;br /&gt;
              ЗАРЕЄСТРУВАТИ_ПЕРЕРАХУНКИ(R, N ∪ СТАРІ)                  // 10.5&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.2. Інкрементальне оновлення підсумків залишків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Δ (delta) — тимчасова таблиця: (period_month, d1_r, d2_r, d3_t, d3_r, d4_r, dr1, dr2)&lt;br /&gt;
-- де dr = Σ (CASE WHEN mvt = 0 THEN +значення ELSE -значення END)&lt;br /&gt;
&lt;br /&gt;
-- Крок 1. Кумулятивні залишки: рух у місяці M впливає на підсумки всіх періодів &amp;gt; M&lt;br /&gt;
--         та на рядок MAXPERIOD.&lt;br /&gt;
INSERT INTO rg_a_0012_tb AS t (period, splitter, d1_r, d2_r, d3_t, d3_r, d4_r, r1, r2)&lt;br /&gt;
SELECT p.period, :splitter, d.d1_r, d.d2_r, d.d3_t, d.d3_r, d.d4_r, d.dr1, d.dr2&lt;br /&gt;
FROM   delta d&lt;br /&gt;
CROSS  JOIN LATERAL (&lt;br /&gt;
         SELECT period FROM totals_periods&lt;br /&gt;
         WHERE period &amp;gt;  d.period_month&lt;br /&gt;
           AND period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
         UNION ALL SELECT TIMESTAMP &#039;5999-11-01&#039;      -- MAXPERIOD&lt;br /&gt;
       ) p&lt;br /&gt;
ORDER BY 1,3,4,5,6,7                                   -- детермінований порядок → без дедлоків&lt;br /&gt;
ON CONFLICT (period, d1_r, d2_r, d3_t, d3_r, d4_r, splitter)&lt;br /&gt;
DO UPDATE SET r1 = t.r1 + EXCLUDED.r1,&lt;br /&gt;
              r2 = t.r2 + EXCLUDED.r2;&lt;br /&gt;
&lt;br /&gt;
-- Крок 2. Прибирання нульових рядків (регламентно, не в транзакції проведення)&lt;br /&gt;
DELETE FROM rg_a_0012_tb WHERE r1 = 0 AND r2 = 0 AND period &amp;lt;&amp;gt; TIMESTAMP &#039;5999-11-01&#039;;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Оптимізація.&#039;&#039;&#039; Крок 1 у наведеному вигляді має складність O(кількість_періодів_після_руху). Для рухів «заднім числом» на роки це дорого. &#039;&#039;&#039;Проєктне рішення №3:&#039;&#039;&#039; підсумки оновлюються тільки для рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; і для найближчої межі періоду; повні кумулятивні зрізи перебудовуються регламентним завданням «Перерахунок підсумків» за зміненими місяцями (список змінених місяців накопичується в &amp;lt;code&amp;gt;rg_a_0012_opt.dirty_months&amp;lt;/code&amp;gt;). Запити на дату в «брудному» місяці автоматично перемикаються на розрахунок від найближчого чистого зрізу. Остаточний вибір — за результатами НТ-02.}}&lt;br /&gt;
&lt;br /&gt;
== 10.3. Трансляція віртуальної таблиці «Залишки» ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрНакопичення.ТовариНаСкладах.Залишки(&amp;amp;Період, Склад = &amp;amp;Склад)&lt;br /&gt;
WITH boundary AS (&lt;br /&gt;
    SELECT COALESCE(MAX(period), TIMESTAMP &#039;0001-01-01&#039;) AS p&lt;br /&gt;
    FROM   totals_periods&lt;br /&gt;
    WHERE  period &amp;lt;= :Період&lt;br /&gt;
      AND  period &amp;lt;= (SELECT totals_actual_to FROM rg_a_0012_opt)&lt;br /&gt;
),&lt;br /&gt;
base AS (                                    -- залишок на межу періоду з підсумків&lt;br /&gt;
    SELECT t.d1_r, t.d2_r, t.d3_t, t.d3_r, t.d4_r,&lt;br /&gt;
           SUM(t.r1) AS r1, SUM(t.r2) AS r2&lt;br /&gt;
    FROM   rg_a_0012_tb t, boundary b&lt;br /&gt;
    WHERE  t.period = b.p&lt;br /&gt;
      AND  t.d2_r  = :Склад                  -- push-down параметра ВТ&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
),&lt;br /&gt;
tail AS (                                    -- «живі» рухи після межі й до &amp;amp;Період&lt;br /&gt;
    SELECT m.d1_r, m.d2_r, m.d3_t, m.d3_r, m.d4_r,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r1 ELSE -m.r1 END) AS r1,&lt;br /&gt;
           SUM(CASE WHEN m.mvt = 0 THEN m.r2 ELSE -m.r2 END) AS r2&lt;br /&gt;
    FROM   rg_a_0012 m, boundary b&lt;br /&gt;
    WHERE  m.active&lt;br /&gt;
      AND  m.period &amp;gt;  b.p&lt;br /&gt;
      AND  m.period &amp;lt;= :Період&lt;br /&gt;
      AND  m.d2_r   =  :Склад&lt;br /&gt;
    GROUP BY 1,2,3,4,5&lt;br /&gt;
)&lt;br /&gt;
SELECT d1_r AS &amp;quot;Номенклатура&amp;quot;, d2_r AS &amp;quot;Склад&amp;quot;,&lt;br /&gt;
       d3_t, d3_r AS &amp;quot;Партія&amp;quot;, d4_r AS &amp;quot;Характеристика&amp;quot;,&lt;br /&gt;
       SUM(r1) AS &amp;quot;КількістьЗалишок&amp;quot;,&lt;br /&gt;
       SUM(r2) AS &amp;quot;СумаЗалишок&amp;quot;&lt;br /&gt;
FROM  (SELECT * FROM base UNION ALL SELECT * FROM tail) u&lt;br /&gt;
GROUP BY 1,2,3,4,5&lt;br /&gt;
HAVING SUM(r1) &amp;lt;&amp;gt; 0 OR SUM(r2) &amp;lt;&amp;gt; 0;         -- нульові залишки не повертаються&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Оптимізація для найчастішого випадку:&#039;&#039;&#039; якщо &amp;lt;code&amp;gt;:Період ≥ ТА&amp;lt;/code&amp;gt; і в регістрі немає рухів у майбутньому — &amp;lt;code&amp;gt;base&amp;lt;/code&amp;gt; читається з рядка &amp;lt;code&amp;gt;MAXPERIOD&amp;lt;/code&amp;gt; одним index seek, &amp;lt;code&amp;gt;tail&amp;lt;/code&amp;gt; = ∅.&lt;br /&gt;
&lt;br /&gt;
== 10.4. Розрахунок фактичних періодів дії (витіснення) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ПЕРЕРАХУВАТИ_ФАКТИЧНІ_ПЕРІОДИ(регістр R, множина ключів K):&lt;br /&gt;
  ДЛЯ кожного ключа k ∈ K:            // k = кортеж значень усіх вимірювань R&lt;br /&gt;
    Z := SELECT * FROM rg_c_X&lt;br /&gt;
         WHERE вимірювання = k AND active&lt;br /&gt;
         ORDER BY &amp;lt;пріоритет виду розрахунку за ПВР&amp;gt;, period, line_no&lt;br /&gt;
    // пріоритет: A витісняється B, якщо B ∈ ПВР[A].ВитісняючіВидиРозрахунку&lt;br /&gt;
&lt;br /&gt;
    DELETE FROM rg_c_X_ap WHERE (rec,line) ∈ Z&lt;br /&gt;
&lt;br /&gt;
    ДЛЯ кожного запису z ∈ Z (у порядку зростання пріоритету, тобто найслабші — першими):&lt;br /&gt;
      I := { [z.act_begin, z.act_end] }&lt;br /&gt;
      ДЛЯ кожного w ∈ Z, де ВидРозрахунку(w) витісняє ВидРозрахунку(z)&lt;br /&gt;
                         І перетинаються періоди реєстрації за правилами ПВР:&lt;br /&gt;
        I := I \ [w.act_begin, w.act_end]        // різниця множин інтервалів&lt;br /&gt;
      n := 0&lt;br /&gt;
      ДЛЯ кожного інтервалу i ∈ I (упорядковано):&lt;br /&gt;
        INSERT INTO rg_c_X_ap&lt;br /&gt;
          VALUES (z.rec_t, z.rec_r, z.line_no, n, z.calc_type_r, z.d1_r, i.begin, i.end)&lt;br /&gt;
        n := n + 1&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Складність:&#039;&#039;&#039; O(|Z|² ) на ключ. Обмеження: якщо &amp;lt;code&amp;gt;|Z| &amp;gt; 500&amp;lt;/code&amp;gt; для одного ключа — попередження в журналі та перехід на алгоритм замітання (sweep line) O(|Z| log |Z|).&lt;br /&gt;
&lt;br /&gt;
== 10.5. Реєстрація перерахунків ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;text&amp;quot;&amp;gt;&lt;br /&gt;
ЗАРЕЄСТРУВАТИ_ПЕРЕРАХУНКИ(регістр R, змінені записи Z):&lt;br /&gt;
  ДЛЯ кожного перерахунку P ∈ R.Перерахунки:&lt;br /&gt;
    ДЛЯ кожного z ∈ Z:&lt;br /&gt;
      // знайти всі записи, для яких z є базовим&lt;br /&gt;
      залежні := SELECT DISTINCT rec_t, rec_r, calc_type_r, &amp;lt;вимірювання P&amp;gt;&lt;br /&gt;
                 FROM   rg_c_X q&lt;br /&gt;
                 JOIN   pct_base b ON b.ref = q.calc_type_r&lt;br /&gt;
                                  AND b.base_type_r = z.calc_type_r&lt;br /&gt;
                 WHERE  q.active&lt;br /&gt;
                   AND  &amp;lt;вимірювання P у q&amp;gt; = &amp;lt;вимірювання P у z&amp;gt;&lt;br /&gt;
                   AND  ( (R.base_period_mode = &#039;ByActionPeriod&#039;&lt;br /&gt;
                            AND [z.act_begin, z.act_end] ∩ [q.base_begin, q.base_end] ≠ ∅)&lt;br /&gt;
                       OR (R.base_period_mode = &#039;ByRegistrationPeriod&#039;&lt;br /&gt;
                            AND z.period BETWEEN q.base_begin AND q.base_end) )&lt;br /&gt;
                   AND  (q.rec_t, q.rec_r) ≠ (z.rec_t, z.rec_r)&lt;br /&gt;
      INSERT INTO rg_c_X_rc&amp;lt;n&amp;gt; ... ON CONFLICT DO NOTHING&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== 10.6. Зріз останніх ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- РегістрВідомостей.КурсиВалют.ЗрізОстанніх(&amp;amp;Дата, Валюта В (&amp;amp;Список))&lt;br /&gt;
SELECT DISTINCT ON (r.d1_r)&lt;br /&gt;
       r.d1_r AS &amp;quot;Валюта&amp;quot;, r.period AS &amp;quot;Період&amp;quot;, r.r1 AS &amp;quot;Курс&amp;quot;, r.r2 AS &amp;quot;Кратність&amp;quot;&lt;br /&gt;
FROM   rg_i_0007 r&lt;br /&gt;
WHERE  r.period &amp;lt;= :Дата&lt;br /&gt;
  AND  r.d1_r = ANY (:Список)&lt;br /&gt;
ORDER  BY r.d1_r, r.period DESC;       -- використовує ix_rg_i_0007_d1 (d1_r, period DESC)&lt;br /&gt;
-- Для MS SQL: ROW_NUMBER() OVER (PARTITION BY d1_r ORDER BY period DESC) = 1&lt;br /&gt;
--             або OUTER APPLY (SELECT TOP 1 ...) для великих списків.&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= 11. Нефункціональні вимоги =&lt;br /&gt;
&lt;br /&gt;
== 11.1. Продуктивність ==&lt;br /&gt;
Еталонний стенд: 16 vCPU, 128 ГБ RAM, NVMe, PostgreSQL 15, БД 1,5 ТБ.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Операція !! Обсяг !! Ціль (P95)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01 || Залишки на поточну дату, відбір за 1 вимірюванням || 1 млрд рухів, 20 млн рядків підсумків || ≤ 200 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-02 || Залишки на довільну дату в межах ТА || те саме || ≤ 400 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-03 || Обороти за 12 місяців із групуванням || 1 млрд рухів || ≤ 2 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-04 || Проведення документа зі 100 рядками рухів (3 регістри) || — || ≤ 300 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-05 || Оборотно-сальдова відомість по всіх рахунках за місяць || 200 млн проводок || ≤ 5 с&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-06 || Розрахунок ЗП: 10 000 співробітників × 8 видів розрахунку || — || ≤ 10 хв&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-07 || Зріз останніх по 5 000 елементів вимірювання || 50 млн записів РВ || ≤ 500 мс&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-08 || Пропускна здатність проведення || — || ≥ 50 док/с (10 паралельних сеансів)&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-09 || Перерахунок підсумків РН || 1 млрд рухів || ≤ 4 год (у вікні обслуговування)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 11.2. Масштабованість і обсяги ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Значення&lt;br /&gt;
|-&lt;br /&gt;
| Макс. записів в одному регістрі || 10&amp;lt;sup&amp;gt;10&amp;lt;/sup&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| Макс. кількість регістрів у конфігурації || 2 000&lt;br /&gt;
|-&lt;br /&gt;
| Макс. одночасних сеансів проведення || 200&lt;br /&gt;
|-&lt;br /&gt;
| Секціонування || Обов&#039;язкове для таблиць &amp;gt; 100 млн записів&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 11.3. Надійність і цілісність ==&lt;br /&gt;
* НФВ-10. Рухи та реєстратор змінюються в одній транзакції БД; часткове проведення неможливе.&lt;br /&gt;
* НФВ-11. Аварійне завершення сервера не залишає підсумки неузгодженими (гарантується транзакцією).&lt;br /&gt;
* НФВ-12. Сервіс перевірки цілісності (ФТ-41) виконується регламентно; розбіжність підсумків = інцидент P1.&lt;br /&gt;
&lt;br /&gt;
== 11.4. Супроводжуваність ==&lt;br /&gt;
* НФВ-13. Реструктуризація регістру (додавання ресурсу/реквізиту) для таблиці ≤ 100 млн записів — ≤ 30 хв.&lt;br /&gt;
* НФВ-14. Додавання вимірювання вимагає перебудови підсумків; система повинна попереджати про оцінку часу до початку операції.&lt;br /&gt;
* НФВ-15. Усі DDL-операції — ідемпотентні та скриптовані (можливість застосувати вручну).&lt;br /&gt;
&lt;br /&gt;
== 11.5. Сумісність ==&lt;br /&gt;
* НФВ-16. PostgreSQL 14+ та MS SQL Server 2019+ — обидві платформи з однаковою функціональністю.&lt;br /&gt;
* НФВ-17. Генератор DDL ізольований у шар «діалект СКБД».&lt;br /&gt;
&lt;br /&gt;
= 12. Міграція існуючих структур K2 ERP =&lt;br /&gt;
&lt;br /&gt;
== 12.1. Етапи ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Етап !! Результат&lt;br /&gt;
|-&lt;br /&gt;
| М1 || Інвентаризація || Реєстр наявних «регістроподібних» таблиць K2 з класифікацією за типом-мішенню (РВ/РН/РБ/РР).&lt;br /&gt;
|-&lt;br /&gt;
| М2 || Мапінг || Для кожної таблиці — метаопис цільового регістру + правила перетворення колонок.&lt;br /&gt;
|-&lt;br /&gt;
| М3 || Створення регістрів || Генерація метаданих і DDL у тестовому контурі.&lt;br /&gt;
|-&lt;br /&gt;
| М4 || Перенесення даних || ETL: історичні дані → рухи, з призначенням реєстратора (реальний документ або службовий «ВведенняЗалишків»).&lt;br /&gt;
|-&lt;br /&gt;
| М5 || Побудова підсумків || Повний перерахунок.&lt;br /&gt;
|-&lt;br /&gt;
| М6 || Звірка || Порівняння залишків/оборотів «стара система vs нова» на контрольних датах; допуск розбіжності = 0.&lt;br /&gt;
|-&lt;br /&gt;
| М7 || Перемикання коду || Заміна прямих SQL-звернень на віртуальні таблиці; період паралельної роботи ≥ 1 звітний період.&lt;br /&gt;
|-&lt;br /&gt;
| М8 || Виведення з експлуатації || Видалення старих таблиць після 2 закритих періодів.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 12.2. Проблемні випадки ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Випадок !! Рішення&lt;br /&gt;
|-&lt;br /&gt;
| Історичні записи без документа-джерела || Службовий документ &amp;lt;code&amp;gt;ВведенняЗалишків&amp;lt;/code&amp;gt; (один на період/розділ).&lt;br /&gt;
|-&lt;br /&gt;
| Записи з дублями за ключем (для незалежного РВ) || Дедуплікація з протоколом; конфлікти — на ручний розбір.&lt;br /&gt;
|-&lt;br /&gt;
| Дробові періоди / некоректні дати (NULL, 1900-01-01) || Нормалізація до MINPERIOD; протокол.&lt;br /&gt;
|-&lt;br /&gt;
| Прикладний код, що пише в таблиці напряму || Заборона на рівні прав БД після М7; аудит звернень на етапі М3–М6.&lt;br /&gt;
|-&lt;br /&gt;
| Аналітика, відсутня в цільовій моделі || Перенесення в реквізити (не у вимірювання) або відмова від міграції з обґрунтуванням.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 13. Приймальні випробування =&lt;br /&gt;
&lt;br /&gt;
== 13.1. Функціональні тести (витяг) ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Сценарій !! Очікуваний результат&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-01 || Створити РВ періодичний незалежний, записати 2 записи з однаковим ключем || Другий запис заміщує перший; у таблиці 1 рядок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-02 || Провести документ → 5 рухів РН || 5 записів у &amp;lt;code&amp;gt;rg_a_*&amp;lt;/code&amp;gt;; підсумки MAXPERIOD змінилися на суму дельти&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-03 || Скасувати проведення || 0 записів; підсумки повернулися до вихідних значень&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-04 || Видалити документ-реєстратор || Рухи видалені каскадно; перевірка цілісності — 0 помилок&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-05 || Записати рух заднім числом (−6 міс.) || Залишки на всі дати після руху коректні (звірка з повним перерахунком)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-06 || Установити &amp;lt;code&amp;gt;Активність = Хиба&amp;lt;/code&amp;gt; || Запис не впливає на віртуальні таблиці; підсумки скориговані&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-07 || РБ: провести незбалансовану проводку (Дт ≠ Кт за балансовим ресурсом) || Помилка проведення, транзакція відкочена&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-08 || РБ: ОСВ по рахунку з 3 субконто || Підсумки за рівнями 0–3 узгоджені між собою (згортка tb3 → tb0)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-09 || РР: сценарій «Оклад + Відпустка + Лікарняний» (розд. 7.5.1) || Фактичні періоди дії відповідають еталону; «Оклад» дає 2 інтервали&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-10 || РР: зміна базового запису || У таблиці перерахунку з&#039;явився запис для залежного документа&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-11 || Паралельне проведення 2 документів за різними складами || Обидва проходять без очікування (розділення підсумків увімкнено)&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-12 || Паралельне проведення 2 документів за одним складом і одним товаром з контролем залишків || Один чекає, другий проходить; від&#039;ємного залишку немає&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-13 || Перерахунок підсумків після хаотичних 10&amp;lt;sup&amp;gt;6&amp;lt;/sup&amp;gt; операцій || Підсумки збігаються з повним перерахунком «з нуля» до копійки&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-14 || Реструктуризація: додати ресурс до РН із 10 млн записів || Дані збережені, підсумки перебудовані, час ≤ НФВ-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-Т-15 || RLS: користувач з обмеженням по організації || Віртуальні таблиці повертають лише дозволені дані&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== 13.2. Навантажувальні тести ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Тест !! Критерій&lt;br /&gt;
|-&lt;br /&gt;
| НТ-01 || Генерація 1 млрд рухів РН, заміри НФВ-01…НФВ-03 || Досягнення цілей&lt;br /&gt;
|-&lt;br /&gt;
| НТ-02 || Профіль «90 % рухів поточним періодом, 10 % заднім числом» — порівняння двох стратегій підсумків (розд. 10.2) || Обґрунтований вибір Рішення №3&lt;br /&gt;
|-&lt;br /&gt;
| НТ-03 || Пікове проведення 50 док/с протягом 1 год || Відсутність дедлоків; P95 ≤ НФВ-04&lt;br /&gt;
|-&lt;br /&gt;
| НТ-04 || РБ: субконто-слоти vs дочірня таблиця, 200 млн проводок || Обґрунтований вибір Рішення №2&lt;br /&gt;
|-&lt;br /&gt;
| НТ-05 || Розрахунок ЗП на 10 000 співробітників || НФВ-06&lt;br /&gt;
|-&lt;br /&gt;
| НТ-06 || Деградація за 24 год безперервної роботи || Приріст часу відгуку ≤ 15 %&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= 14. Етапи робіт та оцінка =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Етап !! Зміст !! Результат !! Оцінка, чол.-міс. !! Залежності&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е0&#039;&#039;&#039; || Обстеження платформи, верифікація припущень П1–П6, ескізний проєкт || Затверджений архітектурний ескіз, уточнене ТЗ || 1,5 || —&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е1&#039;&#039;&#039; || Метамодель + репозиторій + генератор DDL + конструктор (базовий) || Створення регістру будь-якого типу з генерацією схеми || 4 || Е0&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е2&#039;&#039;&#039; || Регістр відомостей: рантайм, набори записів, зрізи, форми || РВ у продуктиві || 2,5 || Е1&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е3&#039;&#039;&#039; || Регістр накопичення: рухи, підсумки, ТА, віртуальні таблиці || РН у продуктиві || 5 || Е2&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е4&#039;&#039;&#039; || Механізм проведення документів, блокування, оперативне/неоперативне проведення || Транзакційне проведення || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е5&#039;&#039;&#039; || Розширення мови запитів (віртуальні таблиці, транслятор, push-down) || Запити до ВТ || 4 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е6&#039;&#039;&#039; || Регістр бухгалтерії + план рахунків + субконто + підсумки за рівнями || РБ у продуктиві || 6 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е7&#039;&#039;&#039; || Регістр розрахунку + ПВР + витіснення + база + графіки + перерахунки || РР у продуктиві || 6 || Е4, Е5&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е8&#039;&#039;&#039; || Агрегати, розділення підсумків, порадник агрегатів || Оптимізація || 2,5 || Е3&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е9&#039;&#039;&#039; || Права доступу, RLS, аудит, сервіси цілісності || Безпека та адміністрування || 2 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е10&#039;&#039;&#039; || Реструктуризація, міграція, інструменти звірки || Інструменти міграції || 2,5 || Е6, Е7&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Е11&#039;&#039;&#039; || Навантажувальне тестування, оптимізація, документація || Приймальні випробування || 3 || усі&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;3&amp;quot; | &#039;&#039;&#039;РАЗОМ&#039;&#039;&#039; || &#039;&#039;&#039;41,5&#039;&#039;&#039; ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|Оцінка орієнтовна (±40 %) і підлягає уточненню за результатами Е0. Критичний шлях: Е0 → Е1 → Е3 → Е5 → Е6/Е7 → Е11. За командою 6–8 інженерів — орієнтовно 9–11 календарних місяців.}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Мінімальний життєздатний обсяг (MVP)&#039;&#039;&#039;: Е0–Е5 (РВ + РН + проведення + запити) ≈ 19,5 чол.-міс. — покриває ~70 % прикладних сценаріїв K2 ERP.&lt;br /&gt;
&lt;br /&gt;
= 15. Ризики =&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! ID !! Ризик !! Ймов. !! Вплив !! Пом&#039;якшення&lt;br /&gt;
|-&lt;br /&gt;
| Р1 || У K2 ERP немає власної мови запитів → віртуальні таблиці нікуди вбудовувати || Сер. || &#039;&#039;&#039;Крит.&#039;&#039;&#039; || Верифікувати на Е0. План «Б»: віртуальні таблиці як параметризовані view/TVF + шар ORM.&lt;br /&gt;
|-&lt;br /&gt;
| Р2 || Конкуренція за таблицю підсумків на піках проведення || Вис. || Вис. || Розділення підсумків (сплітери), НТ-03, детермінований порядок MERGE.&lt;br /&gt;
|-&lt;br /&gt;
| Р3 || Рухи «заднім числом» роблять оновлення підсумків O(N періодів) || Вис. || Сер. || Рішення №3 (dirty months + регламентний перерахунок), НТ-02.&lt;br /&gt;
|-&lt;br /&gt;
| Р4 || «Широка» схема субконто → реструктуризація при зміні ліміту || Сер. || Сер. || Зафіксувати ліміт 5 із запасом; НТ-04; план «Б» — дочірня таблиця.&lt;br /&gt;
|-&lt;br /&gt;
| Р5 || Механізм витіснення РР — найскладніший і найпомилковіший вузол || Вис. || Вис. || Виділити в окремий модуль з еталонним набором з 50+ тест-кейсів; property-based тестування.&lt;br /&gt;
|-&lt;br /&gt;
| Р6 || Обсяг Е6+Е7 недооцінено (досвід 1С: це роки розробки) || Вис. || Вис. || MVP-підхід: спершу Е0–Е5, рішення про Е6/Е7 — після ретроспективи.&lt;br /&gt;
|-&lt;br /&gt;
| Р7 || Різна поведінка PostgreSQL і MS SQL (плани, MERGE, ізоляція) || Сер. || Сер. || Єдиний набір тестів на обох СКБД у CI від Е1.&lt;br /&gt;
|-&lt;br /&gt;
| Р8 || Міграція історичних даних без реєстраторів || Вис. || Сер. || Службовий документ «ВведенняЗалишків»; етап звірки М6 з нульовим допуском.&lt;br /&gt;
|-&lt;br /&gt;
| Р9 || Патентні / ліцензійні претензії щодо копіювання механізмів || Низ. || Вис. || Юридична експертиза до Е1: реалізація &#039;&#039;концепцій&#039;&#039; обліку (загальновідомих), а не коду/API; уникати дослівного копіювання найменувань API та документації.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{Note|&#039;&#039;&#039;Ризик Р9 — обов&#039;язково до опрацювання перед стартом.&#039;&#039;&#039; ТЗ описує &#039;&#039;функціональні концепції&#039;&#039; (накопичувальний облік, подвійний запис, витіснення періодів дії), що є загальновідомими практиками обліку. Проте пряме відтворення пропрієтарних інтерфейсів, найменувань і структур конкретного вендора потребує окремої правової оцінки. Рекомендується узгодити з юридичною службою власну термінологію та API до початку Е1.}}&lt;br /&gt;
&lt;br /&gt;
= 16. Додатки =&lt;br /&gt;
&lt;br /&gt;
== Додаток А. Матриця відповідності «1С ↔ K2 ERP» ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Об&#039;єкт / поняття 1С !! Пропонований аналог K2 ERP !! Примітка&lt;br /&gt;
|-&lt;br /&gt;
| РегистрСведений || &amp;lt;code&amp;gt;Регістри.Відомостей.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрНакопления || &amp;lt;code&amp;gt;Регістри.Накопичення.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| РегистрБухгалтерии || &amp;lt;code&amp;gt;Регістри.Бухгалтерії.*&amp;lt;/code&amp;gt; || Субконто зберігаються інакше (слоти)&lt;br /&gt;
|-&lt;br /&gt;
| РегистрРасчета || &amp;lt;code&amp;gt;Регістри.Розрахунку.*&amp;lt;/code&amp;gt; || Повний паритет&lt;br /&gt;
|-&lt;br /&gt;
| Регистратор || &amp;lt;code&amp;gt;Реєстратор&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ВидДвижения || &amp;lt;code&amp;gt;ВидРуху&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Итоги || &amp;lt;code&amp;gt;Підсумки&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Точка актуальности итогов || &amp;lt;code&amp;gt;ТА підсумків&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Разделение итогов || &amp;lt;code&amp;gt;Розділення підсумків&amp;lt;/code&amp;gt; (splitter) || —&lt;br /&gt;
|-&lt;br /&gt;
| Агрегаты || &amp;lt;code&amp;gt;Агрегати&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Субконто / ПланВидовХарактеристик || &amp;lt;code&amp;gt;Субконто&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;ПланВидівХарактеристик&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПланВидовРасчета || &amp;lt;code&amp;gt;ПланВидівРозрахунку&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Перерасчет || &amp;lt;code&amp;gt;Перерахунок&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| ПериодДействия / Вытеснение || &amp;lt;code&amp;gt;ПеріодДії&amp;lt;/code&amp;gt; / &amp;lt;code&amp;gt;Витіснення&amp;lt;/code&amp;gt; || —&lt;br /&gt;
|-&lt;br /&gt;
| Границя послідовності || &#039;&#039;&#039;Не реалізується&#039;&#039;&#039; || Механізм визнано застарілим; замість нього — перепроведення за списком «брудних» документів&lt;br /&gt;
|-&lt;br /&gt;
| РегистрыСведений з режимом «ПоПозицииРегистратора» || &amp;lt;code&amp;gt;ПоПозиціїРеєстратора&amp;lt;/code&amp;gt; || Реалізується як (period, rec_t, rec_r, line_no) у ключі&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Б. Альтернатива зберігання субконто (план «Б» до Рішення №2) ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;sql&amp;quot;&amp;gt;&lt;br /&gt;
-- Дочірня таблиця «ключ-значення» замість слотів&lt;br /&gt;
CREATE TABLE rg_b_0020_ed (&lt;br /&gt;
    rec_t     smallint NOT NULL,&lt;br /&gt;
    rec_r     uuid     NOT NULL,&lt;br /&gt;
    line_no   int      NOT NULL,&lt;br /&gt;
    side      smallint NOT NULL CHECK (side IN (0,1)),   -- 0=Дт, 1=Кт&lt;br /&gt;
    ed_no     smallint NOT NULL,                          -- порядковий номер субконто рахунка&lt;br /&gt;
    ed_type_r uuid     NOT NULL,                          -- вид субконто&lt;br /&gt;
    val_t     smallint NOT NULL,&lt;br /&gt;
    val_r     uuid,&lt;br /&gt;
    val_n     numeric(38,10),&lt;br /&gt;
    val_s     varchar(150),&lt;br /&gt;
    val_d     timestamp(0),&lt;br /&gt;
    PRIMARY KEY (rec_t, rec_r, line_no, side, ed_no),&lt;br /&gt;
    FOREIGN KEY (rec_t, rec_r, line_no) REFERENCES rg_b_0020 (rec_t, rec_r, line_no) ON DELETE CASCADE&lt;br /&gt;
);&lt;br /&gt;
CREATE INDEX ix_rg_b_0020_ed_val ON rg_b_0020_ed (ed_type_r, val_t, val_r);&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Критерій !! Слоти (Рішення №2) !! Дочірня таблиця (план «Б»)&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 1 субконто || Index seek по колонці || JOIN + семі-з&#039;єднання&lt;br /&gt;
|-&lt;br /&gt;
| Відбір за 3 субконто || 3 предикати в одному скані || 3 JOIN&lt;br /&gt;
|-&lt;br /&gt;
| Зміна &amp;lt;code&amp;gt;МаксКількістьСубконто&amp;lt;/code&amp;gt; || ALTER TABLE (реструктуризація) || Без змін схеми&lt;br /&gt;
|-&lt;br /&gt;
| Розмір рядка проводки || +48 байт × 2 (Дт/Кт) || Базовий&lt;br /&gt;
|-&lt;br /&gt;
| Складність генератора DDL || Вища || Нижча&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Рекомендація&#039;&#039;&#039; || &#039;&#039;&#039;Обрано за замовчуванням&#039;&#039;&#039; || Резерв за результатами НТ-04&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток В. Перелік вимог (реєстр трасування) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
! ID !! Розділ !! Коротко !! Пріоритет !! Тест&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-01…ФТ-07 || 7.1 || Набори записів, проведення || Must || ФТ-Т-02…04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-08…ФТ-10 || 7.2 || Активність || Must || ФТ-Т-06&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-11…ФТ-13 || 7.3 || Віртуальні таблиці || Must || ФТ-Т-08, НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-14…ФТ-18 || 7.4 || Підсумки, ТА || Must || ФТ-Т-05, ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-19…ФТ-21 || 7.4.4 || Агрегати || Should || НТ-01&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-22…ФТ-30 || 7.5 || Механіка РР || Must (для Е7) || ФТ-Т-09, ФТ-Т-10&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-31…ФТ-36 || 7.7 || Блокування || Must || ФТ-Т-11, ФТ-Т-12, НТ-03&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-37…ФТ-39 || 7.8 || Права, RLS || Must || ФТ-Т-15&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-40…ФТ-42 || 7.9 || Аудит, цілісність || Should || ФТ-Т-04&lt;br /&gt;
|-&lt;br /&gt;
| ФТ-К-01…06 || 6.8.4 || Конструктор || Should || —&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-01…НФВ-09 || 11.1 || Продуктивність || Must || НТ-01…НТ-06&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-10…НФВ-12 || 11.3 || Цілісність || Must || ФТ-Т-13&lt;br /&gt;
|-&lt;br /&gt;
| НФВ-13…НФВ-17 || 11.4–11.5 || Супровід, сумісність || Should || ФТ-Т-14&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Додаток Г. Відкриті питання ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! № !! Питання !! Кому !! Термін&lt;br /&gt;
|-&lt;br /&gt;
| В1 || Чи існує в K2 ERP мова запитів / транслятор у SQL? (визначає Р1 та обсяг Е5) || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В2 || Формат ідентифікації об&#039;єктів: UUID чи сурогатний int? || Архітектор платформи || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В3 || Чи потрібна мілісекундна дискретність періоду? || Замовник || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В4 || Максимальна кількість субконто: 3 чи 5? || Головний бухгалтер / методолог || До Е6&lt;br /&gt;
|-&lt;br /&gt;
| В5 || Чи потрібен механізм «Границя послідовності»? (пропонується відмова) || Методолог || До Е3&lt;br /&gt;
|-&lt;br /&gt;
| В6 || Пріоритет типів регістрів: чи достатньо MVP (РВ + РН) для першого релізу? || Замовник || До Е0&lt;br /&gt;
|-&lt;br /&gt;
| В7 || Правова оцінка ризику Р9 || Юридична служба || До Е1&lt;br /&gt;
|-&lt;br /&gt;
| В8 || Цільова СКБД для першої черги: тільки PostgreSQL чи одразу обидві? || Архітектор / ІТ-експлуатація || До Е1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&#039;&#039;Кінець документа. Версія 1.0. Підлягає узгодженню з архітектором платформи K2 ERP до затвердження.&#039;&#039;&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%82%D0%B5%D1%85%D0%BD%D1%96%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%B2%D0%B4%D0%B0%D0%BD%D0%BD%D1%8F_K2_ERP&amp;diff=2757</id>
		<title>Приклади технічного завдання K2 ERP</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%82%D0%B5%D1%85%D0%BD%D1%96%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%B2%D0%B4%D0%B0%D0%BD%D0%BD%D1%8F_K2_ERP&amp;diff=2757"/>
		<updated>2026-07-17T17:53:41Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Виробництво&lt;br /&gt;
&lt;br /&gt;
[[Технічне завдання на облік виробництва в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Аграрний сектор ==&lt;br /&gt;
[[Технічне завдання: Облік виробництва аграрної компанії]]&lt;br /&gt;
&lt;br /&gt;
== Ресторан ==&lt;br /&gt;
[[Технічне завдання на облік в ресторані]]&amp;lt;br&amp;gt;[[Інтерфейс створення технологічних карт]]&lt;br /&gt;
&lt;br /&gt;
== Зарплата ==&lt;br /&gt;
[[Технічне завдання: Облік зарплати]]&lt;br /&gt;
&lt;br /&gt;
== Бухгалтерський та податковий облік ==&lt;br /&gt;
&lt;br /&gt;
=== Зарплата ===&lt;br /&gt;
[[Технічне завдання: Облік основних засобів]]&lt;br /&gt;
&lt;br /&gt;
=== Проводки ===&lt;br /&gt;
[[Технічне завдання: Бухгалтерські проводки основних операцій]]&lt;br /&gt;
&lt;br /&gt;
== Маркетинг ==&lt;br /&gt;
[[Технічне завдання: Афіліантська система]]&lt;br /&gt;
&lt;br /&gt;
== Інструментарій ==&lt;br /&gt;
[[Технічне завдання: Редактор ER-моделей K2 ERP]]&amp;lt;br&amp;gt;[[Технічне завдання: Редактор BP-моделей K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Подача звітност в ДПС та інші державні органи України ==&lt;br /&gt;
[[Технічне завдання: Передача звітності з K2 ERP до Електронного кабінету ДПС]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Вчасно для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Приват24 для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Медок для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Птах для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Edin для Python]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад подачі звітів ФОП на єдиному податку]]&lt;br /&gt;
&lt;br /&gt;
[[Декларація ФОП]]&lt;br /&gt;
&lt;br /&gt;
[[Звітність компанії на загальній системі оподаткування]]&lt;br /&gt;
&lt;br /&gt;
[[Звітність компанії на особливому режимі Дія-Сіті]]&lt;br /&gt;
&lt;br /&gt;
== Приклади ==&lt;br /&gt;
[[Приклад розрахунку зарплати]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад розрахунки податків на загальній системі оподаткування]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад розрахунків подаків компанії на особливому режимі Дія-Сіті]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад розрахунку основних засобів за кілька місяців]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад роботи торгової організації з обліком генераторів у K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Обмін з банками ==&lt;br /&gt;
[[Технічне завдання: отримання банківських виписок з Приват24 для Python]]&lt;br /&gt;
&lt;br /&gt;
[[Документація та формати банківських виписок різних банків України]]&lt;br /&gt;
&lt;br /&gt;
[[Технічне завдання: Гнучкий модуль імпорту банківських виписок у K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Контроль сроків та звітність ==&lt;br /&gt;
[[Технічне завдання: контроль сроків подачі звітності підприємствами в Україні]]&amp;lt;br&amp;gt;[[Технічне завдання: види податкових систем та звіти, що подаються]]&lt;br /&gt;
&lt;br /&gt;
== РРО та ПРРО ==&lt;br /&gt;
[[Технічне завдання: інтеграція Вчасно каса для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: інтеграція ПРРО Checkbox для Python]]&amp;lt;br&amp;gt;[[Інтеграція РРО в Python]]&amp;lt;br&amp;gt;[[Інтеграція РРО в Python через загальну бібліотеку для різних РРО]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Інтеграції в K2 ERP ==&lt;br /&gt;
[[Інтеграція з Мурашина логістика в Python]]&amp;lt;br&amp;gt;[[Інтеграція з Новою поштою в Python]]&amp;lt;br&amp;gt;[[Інтеграція з Укрпоштою в Python]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Електронний підпис ==&lt;br /&gt;
[[Накладення електронного підпису за допомогою Дія в Python]]&amp;lt;br&amp;gt;[[Накладення електронного підпису за допомогою електронного підпису Приват24]]&amp;lt;br&amp;gt;[[Уніфіковане накладання електронного підпису різних сервісних центрів України]]&lt;br /&gt;
&lt;br /&gt;
== Інтеграція з інтернет-магазинами та маркетплейсами ==&lt;br /&gt;
[[Інтеграція з Horoshop]]&amp;lt;br&amp;gt;[[Інтеграція з Prom, Rozetka, Hotline]]&lt;br /&gt;
&lt;br /&gt;
== CRM ==&lt;br /&gt;
[[Життєвий цикл ліда]]&lt;br /&gt;
&lt;br /&gt;
== Собівартість ==&lt;br /&gt;
[[Розрахунок собівартості]]&lt;br /&gt;
&lt;br /&gt;
== Система онлайн-навчання ==&lt;br /&gt;
[[Система онлайн-навчання]]&lt;br /&gt;
&lt;br /&gt;
== Документообіг ==&lt;br /&gt;
[[Технічне завдання на документообіг]]&lt;br /&gt;
&lt;br /&gt;
[[Технічне завдання VDoc K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Комунікації ==&lt;br /&gt;
[[Технічне завдання на створення чату в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Технологічна платформа ==&lt;br /&gt;
[[Регістри в K2 ERP]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2756</id>
		<title>Налаштування організації (приклад)</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2756"/>
		<updated>2026-07-14T13:07:36Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Obl pol1.png|центр|міні|600x600пкс]]&lt;br /&gt;
[[Файл:Obl pol3.png|центр|міні|600x600пкс]]&lt;br /&gt;
[[Файл:Obl pol2.png|центр|міні|600x600пкс]]&lt;br /&gt;
[[Файл:Obl pol5.png|центр|міні|600x600пкс]]&lt;br /&gt;
[[Файл:Obl pol7.png|центр|міні|600x600пкс]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Налаштування організації для бухгалтерського та податкового обліку&#039;&#039;&#039; — це формалізація [[Облікова політика|облікової політики]] підприємства у параметрах [[ERP-система|ERP-системи]]. Нижче наведено перелік реквізитів, політик та параметрів, які необхідно визначити для коректної роботи регламентованого обліку.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Реквізити та статус організації ==&lt;br /&gt;
&lt;br /&gt;
Базовий рівень даних, без якого неможливий запуск обліку:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Найменування&#039;&#039;&#039; — повне та скорочене&lt;br /&gt;
* &#039;&#039;&#039;Код&#039;&#039;&#039; — ЄДРПОУ (для юросіб) або ІПН / РНОКПП (для ФОП)&lt;br /&gt;
* &#039;&#039;&#039;Організаційно-правова форма&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Адреси&#039;&#039;&#039; — юридична та фактична, контактні дані&lt;br /&gt;
* &#039;&#039;&#039;Реєстраційні дані&#039;&#039;&#039; в органах ДПС, орган ДПС за місцем обліку&lt;br /&gt;
* &#039;&#039;&#039;Банківські рахунки&#039;&#039;&#039; у форматі IBAN, обслуговуючі банки&lt;br /&gt;
* &#039;&#039;&#039;Відповідальні особи&#039;&#039;&#039; — керівник, головний бухгалтер, касир (підставляються у первинні документи та звітність)&lt;br /&gt;
* &#039;&#039;&#039;Відокремлені підрозділи&#039;&#039;&#039; — за наявності консолідації чи роздільного обліку&lt;br /&gt;
&lt;br /&gt;
== Система оподаткування ==&lt;br /&gt;
&lt;br /&gt;
Визначає всю логіку податкового блоку.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Можливі значення&lt;br /&gt;
|-&lt;br /&gt;
| Система оподаткування || Загальна / спрощена&lt;br /&gt;
|-&lt;br /&gt;
| Група єдиного податку || 2, 3 (для спрощеної)&lt;br /&gt;
|-&lt;br /&gt;
| Статус платника ПДВ || Так / ні, дата реєстрації, ІПН платника ПДВ&lt;br /&gt;
|-&lt;br /&gt;
| Період з податку на прибуток || Квартальний / річний&lt;br /&gt;
|-&lt;br /&gt;
| Податкові різниці || Застосовуються / не застосовуються&lt;br /&gt;
|-&lt;br /&gt;
| Особливі статуси || Платник акцизу, рентних платежів, спецрежими&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Облікова політика (бухгалтерський облік) ==&lt;br /&gt;
&lt;br /&gt;
Серцевина налаштувань. Рішення з наказу про облікову політику відображаються у параметрах системи.&lt;br /&gt;
&lt;br /&gt;
=== План рахунків ===&lt;br /&gt;
Стандартний за [[НП(С)БО]] або за [[МСФЗ]], з визначенням робочого плану рахунків і субрахунків.&lt;br /&gt;
&lt;br /&gt;
=== Метод оцінки вибуття запасів ===&lt;br /&gt;
Один з дозволених методів:&lt;br /&gt;
* ідентифікована собівартість;&lt;br /&gt;
* середньозважена собівартість (FIFO);&lt;br /&gt;
* нормативні затрати;&lt;br /&gt;
* ціна продажу.&lt;br /&gt;
&lt;br /&gt;
{{Увага|Критичний параметр — визначає, як списуватимуться товари й матеріали. Зміна після проведення документів дуже болісна.}}&lt;br /&gt;
&lt;br /&gt;
=== Амортизація ===&lt;br /&gt;
Метод визначається &#039;&#039;&#039;окремо для бухгалтерського та податкового обліку&#039;&#039;&#039;, оскільки строки й підходи можуть відрізнятися:&lt;br /&gt;
* прямолінійний;&lt;br /&gt;
* зменшення залишкової вартості;&lt;br /&gt;
* прискорене зменшення залишкової вартості;&lt;br /&gt;
* кумулятивний;&lt;br /&gt;
* виробничий.&lt;br /&gt;
&lt;br /&gt;
=== Межа вартості ОЗ / МНМА ===&lt;br /&gt;
Межа розмежування основних засобів та [[МНМА|малоцінних необоротних матеріальних активів]] і метод їхньої амортизації:&lt;br /&gt;
* 100 % при введенні в експлуатацію;&lt;br /&gt;
* 50 % / 50 %.&lt;br /&gt;
&lt;br /&gt;
=== Собівартість ===&lt;br /&gt;
Порядок формування виробничої собівартості: які витрати входять до неї, база розподілу загальновиробничих витрат (ЗВВ), віднесення постійних та змінних ЗВВ.&lt;br /&gt;
&lt;br /&gt;
=== Резерви та забезпечення ===&lt;br /&gt;
* резерв сумнівних боргів;&lt;br /&gt;
* резерв відпусток;&lt;br /&gt;
* забезпечення гарантійних зобов&#039;язань;&lt;br /&gt;
* метод розрахунку кожного з них.&lt;br /&gt;
&lt;br /&gt;
=== Курсові різниці ===&lt;br /&gt;
Порядок перерахунку монетарних статей; джерело курсу — як правило, офіційний курс [[НБУ]].&lt;br /&gt;
&lt;br /&gt;
== Параметри ПДВ ==&lt;br /&gt;
&lt;br /&gt;
Для організації — платника ПДВ:&lt;br /&gt;
&lt;br /&gt;
* застосовувані ставки: 20 %, 14 %, 7 %, 0 %, звільнення;&lt;br /&gt;
* правило &#039;&#039;&#039;першої події&#039;&#039;&#039; для дати податкових зобов&#039;язань і кредиту;&lt;br /&gt;
* порядок реєстрації податкових накладних та розрахунків коригування в [[ЄРПН]];&lt;br /&gt;
* облік за напрямками для розподілу ПДВ (оподатковувані / неоподатковувані операції), розрахунок [[ЧВ|частки використання]];&lt;br /&gt;
* касовий метод — за наявності відповідних операцій.&lt;br /&gt;
&lt;br /&gt;
== Фінансові періоди та валюта ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Дата старту&#039;&#039;&#039; — початок ведення обліку в системі&lt;br /&gt;
* &#039;&#039;&#039;Фінансовий рік&#039;&#039;&#039; і межі облікових періодів&lt;br /&gt;
* &#039;&#039;&#039;Закриття періоду&#039;&#039;&#039; — механізм заборони змін заднім числом&lt;br /&gt;
* &#039;&#039;&#039;Функціональна валюта&#039;&#039;&#039; — гривня&lt;br /&gt;
* &#039;&#039;&#039;Завантаження курсів&#039;&#039;&#039; — джерело НБУ, автоматичне чи ручне&lt;br /&gt;
* &#039;&#039;&#039;Валюти взаєморозрахунків&#039;&#039;&#039; та валютних рахунків&lt;br /&gt;
&lt;br /&gt;
== Аналітичні розрізи ==&lt;br /&gt;
&lt;br /&gt;
Визначають глибину управлінського й регламентованого аналізу. Продумуються на старті, бо зміна постфактум складна.&lt;br /&gt;
&lt;br /&gt;
* підрозділи, центри витрат / центри відповідальності;&lt;br /&gt;
* напрямки діяльності, номенклатурні групи;&lt;br /&gt;
* статті витрат і доходів;&lt;br /&gt;
* проєкти, замовлення (для позамовного обліку).&lt;br /&gt;
&lt;br /&gt;
== Технічні параметри роботи ERP ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Група !! Що налаштовується&lt;br /&gt;
|-&lt;br /&gt;
| Нумерація документів || Префікси, періодичність скидання, роздільна для кожної організації&lt;br /&gt;
|-&lt;br /&gt;
| Округлення || Правила округлення сум і кількостей&lt;br /&gt;
|-&lt;br /&gt;
| Друковані форми || Первинні та друковані форми під потреби організації&lt;br /&gt;
|-&lt;br /&gt;
| Права доступу || Ролі користувачів, розмежування за організаціями й підрозділами&lt;br /&gt;
|-&lt;br /&gt;
| Регламентована звітність || Форми декларацій і фінзвітності, електронна подача&lt;br /&gt;
|-&lt;br /&gt;
| Початкові залишки || Введення залишків по рахунках і аналітиці на дату старту&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Порядок впровадження ==&lt;br /&gt;
&lt;br /&gt;
# Внести реквізити та статус організації.&lt;br /&gt;
# Визначити систему оподаткування.&lt;br /&gt;
# Налаштувати облікову політику (бух. та податкову).&lt;br /&gt;
# Задати параметри ПДВ.&lt;br /&gt;
# Встановити фінансові періоди та валюту.&lt;br /&gt;
# Налаштувати аналітичні розрізи.&lt;br /&gt;
# Задати технічні параметри та права доступу.&lt;br /&gt;
# Ввести початкові залишки на дату старту.&lt;br /&gt;
&lt;br /&gt;
== Примітки ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорія:Регламентований облік]]&lt;br /&gt;
[[Категорія:Налаштування ERP]]&lt;br /&gt;
[[Категорія:Облікова політика]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2755</id>
		<title>Налаштування організації (приклад)</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2755"/>
		<updated>2026-07-14T13:07:16Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Obl pol1.png|центр|міні|600x600пкс]]&lt;br /&gt;
[[Файл:Obl pol3.png|центр|міні|600x600пкс]]&lt;br /&gt;
[[Файл:Obl pol2.png|центр|міні|600x600пкс]]&lt;br /&gt;
[[Файл:Obl pol5.png|центр|міні|600x600пкс]]&lt;br /&gt;
[[Файл:Obl pol7.png|центр|міні|600x600пкс]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Налаштування організації для бухгалтерського та податкового обліку&#039;&#039;&#039; — це формалізація [[Облікова політика|облікової політики]] підприємства у параметрах [[ERP-система|ERP-системи]]. Нижче наведено перелік реквізитів, політик та параметрів, які необхідно визначити для коректної роботи регламентованого обліку.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Реквізити та статус організації ==&lt;br /&gt;
&lt;br /&gt;
Базовий рівень даних, без якого неможливий запуск обліку:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Найменування&#039;&#039;&#039; — повне та скорочене&lt;br /&gt;
* &#039;&#039;&#039;Код&#039;&#039;&#039; — ЄДРПОУ (для юросіб) або ІПН / РНОКПП (для ФОП)&lt;br /&gt;
* &#039;&#039;&#039;Організаційно-правова форма&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Адреси&#039;&#039;&#039; — юридична та фактична, контактні дані&lt;br /&gt;
* &#039;&#039;&#039;Реєстраційні дані&#039;&#039;&#039; в органах ДПС, орган ДПС за місцем обліку&lt;br /&gt;
* &#039;&#039;&#039;Банківські рахунки&#039;&#039;&#039; у форматі IBAN, обслуговуючі банки&lt;br /&gt;
* &#039;&#039;&#039;Відповідальні особи&#039;&#039;&#039; — керівник, головний бухгалтер, касир (підставляються у первинні документи та звітність)&lt;br /&gt;
* &#039;&#039;&#039;Відокремлені підрозділи&#039;&#039;&#039; — за наявності консолідації чи роздільного обліку&lt;br /&gt;
&lt;br /&gt;
== Система оподаткування ==&lt;br /&gt;
&lt;br /&gt;
Визначає всю логіку податкового блоку.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Можливі значення&lt;br /&gt;
|-&lt;br /&gt;
| Система оподаткування || Загальна / спрощена&lt;br /&gt;
|-&lt;br /&gt;
| Група єдиного податку || 2, 3 (для спрощеної)&lt;br /&gt;
|-&lt;br /&gt;
| Статус платника ПДВ || Так / ні, дата реєстрації, ІПН платника ПДВ&lt;br /&gt;
|-&lt;br /&gt;
| Період з податку на прибуток || Квартальний / річний&lt;br /&gt;
|-&lt;br /&gt;
| Податкові різниці || Застосовуються / не застосовуються&lt;br /&gt;
|-&lt;br /&gt;
| Особливі статуси || Платник акцизу, рентних платежів, спецрежими&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Облікова політика (бухгалтерський облік) ==&lt;br /&gt;
&lt;br /&gt;
Серцевина налаштувань. Рішення з наказу про облікову політику відображаються у параметрах системи.&lt;br /&gt;
&lt;br /&gt;
=== План рахунків ===&lt;br /&gt;
Стандартний за [[НП(С)БО]] або за [[МСФЗ]], з визначенням робочого плану рахунків і субрахунків.&lt;br /&gt;
&lt;br /&gt;
=== Метод оцінки вибуття запасів ===&lt;br /&gt;
Один з дозволених методів:&lt;br /&gt;
* ідентифікована собівартість;&lt;br /&gt;
* середньозважена собівартість (FIFO);&lt;br /&gt;
* нормативні затрати;&lt;br /&gt;
* ціна продажу.&lt;br /&gt;
&lt;br /&gt;
{{Увага|Критичний параметр — визначає, як списуватимуться товари й матеріали. Зміна після проведення документів дуже болісна.}}&lt;br /&gt;
&lt;br /&gt;
=== Амортизація ===&lt;br /&gt;
Метод визначається &#039;&#039;&#039;окремо для бухгалтерського та податкового обліку&#039;&#039;&#039;, оскільки строки й підходи можуть відрізнятися:&lt;br /&gt;
* прямолінійний;&lt;br /&gt;
* зменшення залишкової вартості;&lt;br /&gt;
* прискорене зменшення залишкової вартості;&lt;br /&gt;
* кумулятивний;&lt;br /&gt;
* виробничий.&lt;br /&gt;
&lt;br /&gt;
=== Межа вартості ОЗ / МНМА ===&lt;br /&gt;
Межа розмежування основних засобів та [[МНМА|малоцінних необоротних матеріальних активів]] і метод їхньої амортизації:&lt;br /&gt;
* 100 % при введенні в експлуатацію;&lt;br /&gt;
* 50 % / 50 %.&lt;br /&gt;
&lt;br /&gt;
=== Собівартість ===&lt;br /&gt;
Порядок формування виробничої собівартості: які витрати входять до неї, база розподілу загальновиробничих витрат (ЗВВ), віднесення постійних та змінних ЗВВ.&lt;br /&gt;
&lt;br /&gt;
=== Резерви та забезпечення ===&lt;br /&gt;
* резерв сумнівних боргів;&lt;br /&gt;
* резерв відпусток;&lt;br /&gt;
* забезпечення гарантійних зобов&#039;язань;&lt;br /&gt;
* метод розрахунку кожного з них.&lt;br /&gt;
&lt;br /&gt;
=== Курсові різниці ===&lt;br /&gt;
Порядок перерахунку монетарних статей; джерело курсу — як правило, офіційний курс [[НБУ]].&lt;br /&gt;
&lt;br /&gt;
== Параметри ПДВ ==&lt;br /&gt;
&lt;br /&gt;
Для організації — платника ПДВ:&lt;br /&gt;
&lt;br /&gt;
* застосовувані ставки: 20 %, 14 %, 7 %, 0 %, звільнення;&lt;br /&gt;
* правило &#039;&#039;&#039;першої події&#039;&#039;&#039; для дати податкових зобов&#039;язань і кредиту;&lt;br /&gt;
* порядок реєстрації податкових накладних та розрахунків коригування в [[ЄРПН]];&lt;br /&gt;
* облік за напрямками для розподілу ПДВ (оподатковувані / неоподатковувані операції), розрахунок [[ЧВ|частки використання]];&lt;br /&gt;
* касовий метод — за наявності відповідних операцій.&lt;br /&gt;
&lt;br /&gt;
== Фінансові періоди та валюта ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Дата старту&#039;&#039;&#039; — початок ведення обліку в системі&lt;br /&gt;
* &#039;&#039;&#039;Фінансовий рік&#039;&#039;&#039; і межі облікових періодів&lt;br /&gt;
* &#039;&#039;&#039;Закриття періоду&#039;&#039;&#039; — механізм заборони змін заднім числом&lt;br /&gt;
* &#039;&#039;&#039;Функціональна валюта&#039;&#039;&#039; — гривня&lt;br /&gt;
* &#039;&#039;&#039;Завантаження курсів&#039;&#039;&#039; — джерело НБУ, автоматичне чи ручне&lt;br /&gt;
* &#039;&#039;&#039;Валюти взаєморозрахунків&#039;&#039;&#039; та валютних рахунків&lt;br /&gt;
&lt;br /&gt;
== Аналітичні розрізи ==&lt;br /&gt;
&lt;br /&gt;
Визначають глибину управлінського й регламентованого аналізу. Продумуються на старті, бо зміна постфактум складна.&lt;br /&gt;
&lt;br /&gt;
* підрозділи, центри витрат / центри відповідальності;&lt;br /&gt;
* напрямки діяльності, номенклатурні групи;&lt;br /&gt;
* статті витрат і доходів;&lt;br /&gt;
* проєкти, замовлення (для позамовного обліку).&lt;br /&gt;
&lt;br /&gt;
== Технічні параметри роботи ERP ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Група !! Що налаштовується&lt;br /&gt;
|-&lt;br /&gt;
| Нумерація документів || Префікси, періодичність скидання, роздільна для кожної організації&lt;br /&gt;
|-&lt;br /&gt;
| Округлення || Правила округлення сум і кількостей&lt;br /&gt;
|-&lt;br /&gt;
| Друковані форми || Первинні та друковані форми під потреби організації&lt;br /&gt;
|-&lt;br /&gt;
| Права доступу || Ролі користувачів, розмежування за організаціями й підрозділами&lt;br /&gt;
|-&lt;br /&gt;
| Регламентована звітність || Форми декларацій і фінзвітності, електронна подача&lt;br /&gt;
|-&lt;br /&gt;
| Початкові залишки || Введення залишків по рахунках і аналітиці на дату старту&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Порядок впровадження ==&lt;br /&gt;
&lt;br /&gt;
# Внести реквізити та статус організації.&lt;br /&gt;
# Визначити систему оподаткування.&lt;br /&gt;
# Налаштувати облікову політику (бух. та податкову).&lt;br /&gt;
# Задати параметри ПДВ.&lt;br /&gt;
# Встановити фінансові періоди та валюту.&lt;br /&gt;
# Налаштувати аналітичні розрізи.&lt;br /&gt;
# Задати технічні параметри та права доступу.&lt;br /&gt;
# Ввести початкові залишки на дату старту.&lt;br /&gt;
&lt;br /&gt;
== Примітки ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Категорія:Регламентований облік]]&lt;br /&gt;
[[index.php?title=Категорія:Налаштування ERP]]&lt;br /&gt;
[[index.php?title=Категорія:Облікова політика]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2754</id>
		<title>Налаштування організації (приклад)</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2754"/>
		<updated>2026-07-14T13:02:40Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;gallery mode=&amp;quot;slideshow&amp;quot;&amp;gt;&lt;br /&gt;
Файл:Index.php?title=Файл:Obl pol6.png|посилання=Файл:Obl_pol6.png&lt;br /&gt;
Файл:Index.php?title=Файл:Obl pol7.png|посилання=Файл:Obl_pol7.png&lt;br /&gt;
Файл:Index.php?title=Файл:Obl pol4.png|посилання=Файл:Obl_pol4.png&lt;br /&gt;
Файл:Index.php?title=Файл:Obl pol5.png|посилання=Файл:Obl_pol5.png&lt;br /&gt;
Файл:Index.php?title=Файл:Obl pol2.png|посилання=Файл:Obl_pol2.png&lt;br /&gt;
Файл:Index.php?title=Файл:Obl pol3.png|посилання=Файл:Obl_pol3.png&lt;br /&gt;
Файл:Index.php?title=Файл:Obl pol1.png|посилання=Файл:Obl_pol1.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&#039;&#039;&#039;Налаштування організації для бухгалтерського та податкового обліку&#039;&#039;&#039; — це формалізація [[Облікова політика|облікової політики]] підприємства у параметрах [[ERP-система|ERP-системи]]. Нижче наведено перелік реквізитів, політик та параметрів, які необхідно визначити для коректної роботи регламентованого обліку.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Реквізити та статус організації ==&lt;br /&gt;
&lt;br /&gt;
Базовий рівень даних, без якого неможливий запуск обліку:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Найменування&#039;&#039;&#039; — повне та скорочене&lt;br /&gt;
* &#039;&#039;&#039;Код&#039;&#039;&#039; — ЄДРПОУ (для юросіб) або ІПН / РНОКПП (для ФОП)&lt;br /&gt;
* &#039;&#039;&#039;Організаційно-правова форма&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Адреси&#039;&#039;&#039; — юридична та фактична, контактні дані&lt;br /&gt;
* &#039;&#039;&#039;Реєстраційні дані&#039;&#039;&#039; в органах ДПС, орган ДПС за місцем обліку&lt;br /&gt;
* &#039;&#039;&#039;Банківські рахунки&#039;&#039;&#039; у форматі IBAN, обслуговуючі банки&lt;br /&gt;
* &#039;&#039;&#039;Відповідальні особи&#039;&#039;&#039; — керівник, головний бухгалтер, касир (підставляються у первинні документи та звітність)&lt;br /&gt;
* &#039;&#039;&#039;Відокремлені підрозділи&#039;&#039;&#039; — за наявності консолідації чи роздільного обліку&lt;br /&gt;
&lt;br /&gt;
== Система оподаткування ==&lt;br /&gt;
&lt;br /&gt;
Визначає всю логіку податкового блоку.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Можливі значення&lt;br /&gt;
|-&lt;br /&gt;
| Система оподаткування || Загальна / спрощена&lt;br /&gt;
|-&lt;br /&gt;
| Група єдиного податку || 2, 3 (для спрощеної)&lt;br /&gt;
|-&lt;br /&gt;
| Статус платника ПДВ || Так / ні, дата реєстрації, ІПН платника ПДВ&lt;br /&gt;
|-&lt;br /&gt;
| Період з податку на прибуток || Квартальний / річний&lt;br /&gt;
|-&lt;br /&gt;
| Податкові різниці || Застосовуються / не застосовуються&lt;br /&gt;
|-&lt;br /&gt;
| Особливі статуси || Платник акцизу, рентних платежів, спецрежими&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Облікова політика (бухгалтерський облік) ==&lt;br /&gt;
&lt;br /&gt;
Серцевина налаштувань. Рішення з наказу про облікову політику відображаються у параметрах системи.&lt;br /&gt;
&lt;br /&gt;
=== План рахунків ===&lt;br /&gt;
Стандартний за [[НП(С)БО]] або за [[МСФЗ]], з визначенням робочого плану рахунків і субрахунків.&lt;br /&gt;
&lt;br /&gt;
=== Метод оцінки вибуття запасів ===&lt;br /&gt;
Один з дозволених методів:&lt;br /&gt;
* ідентифікована собівартість;&lt;br /&gt;
* середньозважена собівартість (FIFO);&lt;br /&gt;
* нормативні затрати;&lt;br /&gt;
* ціна продажу.&lt;br /&gt;
&lt;br /&gt;
{{Увага|Критичний параметр — визначає, як списуватимуться товари й матеріали. Зміна після проведення документів дуже болісна.}}&lt;br /&gt;
&lt;br /&gt;
=== Амортизація ===&lt;br /&gt;
Метод визначається &#039;&#039;&#039;окремо для бухгалтерського та податкового обліку&#039;&#039;&#039;, оскільки строки й підходи можуть відрізнятися:&lt;br /&gt;
* прямолінійний;&lt;br /&gt;
* зменшення залишкової вартості;&lt;br /&gt;
* прискорене зменшення залишкової вартості;&lt;br /&gt;
* кумулятивний;&lt;br /&gt;
* виробничий.&lt;br /&gt;
&lt;br /&gt;
=== Межа вартості ОЗ / МНМА ===&lt;br /&gt;
Межа розмежування основних засобів та [[МНМА|малоцінних необоротних матеріальних активів]] і метод їхньої амортизації:&lt;br /&gt;
* 100 % при введенні в експлуатацію;&lt;br /&gt;
* 50 % / 50 %.&lt;br /&gt;
&lt;br /&gt;
=== Собівартість ===&lt;br /&gt;
Порядок формування виробничої собівартості: які витрати входять до неї, база розподілу загальновиробничих витрат (ЗВВ), віднесення постійних та змінних ЗВВ.&lt;br /&gt;
&lt;br /&gt;
=== Резерви та забезпечення ===&lt;br /&gt;
* резерв сумнівних боргів;&lt;br /&gt;
* резерв відпусток;&lt;br /&gt;
* забезпечення гарантійних зобов&#039;язань;&lt;br /&gt;
* метод розрахунку кожного з них.&lt;br /&gt;
&lt;br /&gt;
=== Курсові різниці ===&lt;br /&gt;
Порядок перерахунку монетарних статей; джерело курсу — як правило, офіційний курс [[НБУ]].&lt;br /&gt;
&lt;br /&gt;
== Параметри ПДВ ==&lt;br /&gt;
&lt;br /&gt;
Для організації — платника ПДВ:&lt;br /&gt;
&lt;br /&gt;
* застосовувані ставки: 20 %, 14 %, 7 %, 0 %, звільнення;&lt;br /&gt;
* правило &#039;&#039;&#039;першої події&#039;&#039;&#039; для дати податкових зобов&#039;язань і кредиту;&lt;br /&gt;
* порядок реєстрації податкових накладних та розрахунків коригування в [[ЄРПН]];&lt;br /&gt;
* облік за напрямками для розподілу ПДВ (оподатковувані / неоподатковувані операції), розрахунок [[ЧВ|частки використання]];&lt;br /&gt;
* касовий метод — за наявності відповідних операцій.&lt;br /&gt;
&lt;br /&gt;
== Фінансові періоди та валюта ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Дата старту&#039;&#039;&#039; — початок ведення обліку в системі&lt;br /&gt;
* &#039;&#039;&#039;Фінансовий рік&#039;&#039;&#039; і межі облікових періодів&lt;br /&gt;
* &#039;&#039;&#039;Закриття періоду&#039;&#039;&#039; — механізм заборони змін заднім числом&lt;br /&gt;
* &#039;&#039;&#039;Функціональна валюта&#039;&#039;&#039; — гривня&lt;br /&gt;
* &#039;&#039;&#039;Завантаження курсів&#039;&#039;&#039; — джерело НБУ, автоматичне чи ручне&lt;br /&gt;
* &#039;&#039;&#039;Валюти взаєморозрахунків&#039;&#039;&#039; та валютних рахунків&lt;br /&gt;
&lt;br /&gt;
== Аналітичні розрізи ==&lt;br /&gt;
&lt;br /&gt;
Визначають глибину управлінського й регламентованого аналізу. Продумуються на старті, бо зміна постфактум складна.&lt;br /&gt;
&lt;br /&gt;
* підрозділи, центри витрат / центри відповідальності;&lt;br /&gt;
* напрямки діяльності, номенклатурні групи;&lt;br /&gt;
* статті витрат і доходів;&lt;br /&gt;
* проєкти, замовлення (для позамовного обліку).&lt;br /&gt;
&lt;br /&gt;
== Технічні параметри роботи ERP ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Група !! Що налаштовується&lt;br /&gt;
|-&lt;br /&gt;
| Нумерація документів || Префікси, періодичність скидання, роздільна для кожної організації&lt;br /&gt;
|-&lt;br /&gt;
| Округлення || Правила округлення сум і кількостей&lt;br /&gt;
|-&lt;br /&gt;
| Друковані форми || Первинні та друковані форми під потреби організації&lt;br /&gt;
|-&lt;br /&gt;
| Права доступу || Ролі користувачів, розмежування за організаціями й підрозділами&lt;br /&gt;
|-&lt;br /&gt;
| Регламентована звітність || Форми декларацій і фінзвітності, електронна подача&lt;br /&gt;
|-&lt;br /&gt;
| Початкові залишки || Введення залишків по рахунках і аналітиці на дату старту&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Порядок впровадження ==&lt;br /&gt;
&lt;br /&gt;
# Внести реквізити та статус організації.&lt;br /&gt;
# Визначити систему оподаткування.&lt;br /&gt;
# Налаштувати облікову політику (бух. та податкову).&lt;br /&gt;
# Задати параметри ПДВ.&lt;br /&gt;
# Встановити фінансові періоди та валюту.&lt;br /&gt;
# Налаштувати аналітичні розрізи.&lt;br /&gt;
# Задати технічні параметри та права доступу.&lt;br /&gt;
# Ввести початкові залишки на дату старту.&lt;br /&gt;
&lt;br /&gt;
== Примітки ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Категорія:Регламентований облік]]&lt;br /&gt;
[[index.php?title=Категорія:Налаштування ERP]]&lt;br /&gt;
[[index.php?title=Категорія:Облікова політика]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2753</id>
		<title>Налаштування організації (приклад)</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2753"/>
		<updated>2026-07-14T13:01:33Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;gallery&amp;gt;&lt;br /&gt;
Файл:Obl pol6.png&lt;br /&gt;
Файл:Obl pol7.png&lt;br /&gt;
Файл:Obl pol4.png&lt;br /&gt;
Файл:Obl pol5.png&lt;br /&gt;
Файл:Obl pol2.png&lt;br /&gt;
Файл:Obl pol3.png&lt;br /&gt;
Файл:Obl pol1.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&#039;&#039;&#039;Налаштування організації для бухгалтерського та податкового обліку&#039;&#039;&#039; — це формалізація [[Облікова політика|облікової політики]] підприємства у параметрах [[ERP-система|ERP-системи]]. Нижче наведено перелік реквізитів, політик та параметрів, які необхідно визначити для коректної роботи регламентованого обліку.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Реквізити та статус організації ==&lt;br /&gt;
&lt;br /&gt;
Базовий рівень даних, без якого неможливий запуск обліку:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Найменування&#039;&#039;&#039; — повне та скорочене&lt;br /&gt;
* &#039;&#039;&#039;Код&#039;&#039;&#039; — ЄДРПОУ (для юросіб) або ІПН / РНОКПП (для ФОП)&lt;br /&gt;
* &#039;&#039;&#039;Організаційно-правова форма&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Адреси&#039;&#039;&#039; — юридична та фактична, контактні дані&lt;br /&gt;
* &#039;&#039;&#039;Реєстраційні дані&#039;&#039;&#039; в органах ДПС, орган ДПС за місцем обліку&lt;br /&gt;
* &#039;&#039;&#039;Банківські рахунки&#039;&#039;&#039; у форматі IBAN, обслуговуючі банки&lt;br /&gt;
* &#039;&#039;&#039;Відповідальні особи&#039;&#039;&#039; — керівник, головний бухгалтер, касир (підставляються у первинні документи та звітність)&lt;br /&gt;
* &#039;&#039;&#039;Відокремлені підрозділи&#039;&#039;&#039; — за наявності консолідації чи роздільного обліку&lt;br /&gt;
&lt;br /&gt;
== Система оподаткування ==&lt;br /&gt;
&lt;br /&gt;
Визначає всю логіку податкового блоку.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Можливі значення&lt;br /&gt;
|-&lt;br /&gt;
| Система оподаткування || Загальна / спрощена&lt;br /&gt;
|-&lt;br /&gt;
| Група єдиного податку || 2, 3 (для спрощеної)&lt;br /&gt;
|-&lt;br /&gt;
| Статус платника ПДВ || Так / ні, дата реєстрації, ІПН платника ПДВ&lt;br /&gt;
|-&lt;br /&gt;
| Період з податку на прибуток || Квартальний / річний&lt;br /&gt;
|-&lt;br /&gt;
| Податкові різниці || Застосовуються / не застосовуються&lt;br /&gt;
|-&lt;br /&gt;
| Особливі статуси || Платник акцизу, рентних платежів, спецрежими&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Облікова політика (бухгалтерський облік) ==&lt;br /&gt;
&lt;br /&gt;
Серцевина налаштувань. Рішення з наказу про облікову політику відображаються у параметрах системи.&lt;br /&gt;
&lt;br /&gt;
=== План рахунків ===&lt;br /&gt;
Стандартний за [[НП(С)БО]] або за [[МСФЗ]], з визначенням робочого плану рахунків і субрахунків.&lt;br /&gt;
&lt;br /&gt;
=== Метод оцінки вибуття запасів ===&lt;br /&gt;
Один з дозволених методів:&lt;br /&gt;
* ідентифікована собівартість;&lt;br /&gt;
* середньозважена собівартість (FIFO);&lt;br /&gt;
* нормативні затрати;&lt;br /&gt;
* ціна продажу.&lt;br /&gt;
&lt;br /&gt;
{{Увага|Критичний параметр — визначає, як списуватимуться товари й матеріали. Зміна після проведення документів дуже болісна.}}&lt;br /&gt;
&lt;br /&gt;
=== Амортизація ===&lt;br /&gt;
Метод визначається &#039;&#039;&#039;окремо для бухгалтерського та податкового обліку&#039;&#039;&#039;, оскільки строки й підходи можуть відрізнятися:&lt;br /&gt;
* прямолінійний;&lt;br /&gt;
* зменшення залишкової вартості;&lt;br /&gt;
* прискорене зменшення залишкової вартості;&lt;br /&gt;
* кумулятивний;&lt;br /&gt;
* виробничий.&lt;br /&gt;
&lt;br /&gt;
=== Межа вартості ОЗ / МНМА ===&lt;br /&gt;
Межа розмежування основних засобів та [[МНМА|малоцінних необоротних матеріальних активів]] і метод їхньої амортизації:&lt;br /&gt;
* 100 % при введенні в експлуатацію;&lt;br /&gt;
* 50 % / 50 %.&lt;br /&gt;
&lt;br /&gt;
=== Собівартість ===&lt;br /&gt;
Порядок формування виробничої собівартості: які витрати входять до неї, база розподілу загальновиробничих витрат (ЗВВ), віднесення постійних та змінних ЗВВ.&lt;br /&gt;
&lt;br /&gt;
=== Резерви та забезпечення ===&lt;br /&gt;
* резерв сумнівних боргів;&lt;br /&gt;
* резерв відпусток;&lt;br /&gt;
* забезпечення гарантійних зобов&#039;язань;&lt;br /&gt;
* метод розрахунку кожного з них.&lt;br /&gt;
&lt;br /&gt;
=== Курсові різниці ===&lt;br /&gt;
Порядок перерахунку монетарних статей; джерело курсу — як правило, офіційний курс [[НБУ]].&lt;br /&gt;
&lt;br /&gt;
== Параметри ПДВ ==&lt;br /&gt;
&lt;br /&gt;
Для організації — платника ПДВ:&lt;br /&gt;
&lt;br /&gt;
* застосовувані ставки: 20 %, 14 %, 7 %, 0 %, звільнення;&lt;br /&gt;
* правило &#039;&#039;&#039;першої події&#039;&#039;&#039; для дати податкових зобов&#039;язань і кредиту;&lt;br /&gt;
* порядок реєстрації податкових накладних та розрахунків коригування в [[ЄРПН]];&lt;br /&gt;
* облік за напрямками для розподілу ПДВ (оподатковувані / неоподатковувані операції), розрахунок [[ЧВ|частки використання]];&lt;br /&gt;
* касовий метод — за наявності відповідних операцій.&lt;br /&gt;
&lt;br /&gt;
== Фінансові періоди та валюта ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Дата старту&#039;&#039;&#039; — початок ведення обліку в системі&lt;br /&gt;
* &#039;&#039;&#039;Фінансовий рік&#039;&#039;&#039; і межі облікових періодів&lt;br /&gt;
* &#039;&#039;&#039;Закриття періоду&#039;&#039;&#039; — механізм заборони змін заднім числом&lt;br /&gt;
* &#039;&#039;&#039;Функціональна валюта&#039;&#039;&#039; — гривня&lt;br /&gt;
* &#039;&#039;&#039;Завантаження курсів&#039;&#039;&#039; — джерело НБУ, автоматичне чи ручне&lt;br /&gt;
* &#039;&#039;&#039;Валюти взаєморозрахунків&#039;&#039;&#039; та валютних рахунків&lt;br /&gt;
&lt;br /&gt;
== Аналітичні розрізи ==&lt;br /&gt;
&lt;br /&gt;
Визначають глибину управлінського й регламентованого аналізу. Продумуються на старті, бо зміна постфактум складна.&lt;br /&gt;
&lt;br /&gt;
* підрозділи, центри витрат / центри відповідальності;&lt;br /&gt;
* напрямки діяльності, номенклатурні групи;&lt;br /&gt;
* статті витрат і доходів;&lt;br /&gt;
* проєкти, замовлення (для позамовного обліку).&lt;br /&gt;
&lt;br /&gt;
== Технічні параметри роботи ERP ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Група !! Що налаштовується&lt;br /&gt;
|-&lt;br /&gt;
| Нумерація документів || Префікси, періодичність скидання, роздільна для кожної організації&lt;br /&gt;
|-&lt;br /&gt;
| Округлення || Правила округлення сум і кількостей&lt;br /&gt;
|-&lt;br /&gt;
| Друковані форми || Первинні та друковані форми під потреби організації&lt;br /&gt;
|-&lt;br /&gt;
| Права доступу || Ролі користувачів, розмежування за організаціями й підрозділами&lt;br /&gt;
|-&lt;br /&gt;
| Регламентована звітність || Форми декларацій і фінзвітності, електронна подача&lt;br /&gt;
|-&lt;br /&gt;
| Початкові залишки || Введення залишків по рахунках і аналітиці на дату старту&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Порядок впровадження ==&lt;br /&gt;
&lt;br /&gt;
# Внести реквізити та статус організації.&lt;br /&gt;
# Визначити систему оподаткування.&lt;br /&gt;
# Налаштувати облікову політику (бух. та податкову).&lt;br /&gt;
# Задати параметри ПДВ.&lt;br /&gt;
# Встановити фінансові періоди та валюту.&lt;br /&gt;
# Налаштувати аналітичні розрізи.&lt;br /&gt;
# Задати технічні параметри та права доступу.&lt;br /&gt;
# Ввести початкові залишки на дату старту.&lt;br /&gt;
&lt;br /&gt;
== Примітки ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорія:Регламентований облік]]&lt;br /&gt;
[[Категорія:Налаштування ERP]]&lt;br /&gt;
[[Категорія:Облікова політика]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2752</id>
		<title>Налаштування організації (приклад)</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2752"/>
		<updated>2026-07-14T13:01:25Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;gallery&amp;gt;&lt;br /&gt;
Файл:Obl pol6.png&lt;br /&gt;
Файл:Obl pol7.png&lt;br /&gt;
Файл:Obl pol4.png&lt;br /&gt;
Файл:Obl pol5.png&lt;br /&gt;
Файл:Obl pol2.png&lt;br /&gt;
Файл:Obl pol3.png&lt;br /&gt;
Файл:Obl pol1.png&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&#039;&#039;&#039;Налаштування організації для бухгалтерського та податкового обліку&#039;&#039;&#039; — це формалізація [[Облікова політика|облікової політики]] підприємства у параметрах [[ERP-система|ERP-системи]]. Нижче наведено перелік реквізитів, політик та параметрів, які необхідно визначити для коректної роботи регламентованого обліку.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Реквізити та статус організації ==&lt;br /&gt;
&lt;br /&gt;
Базовий рівень даних, без якого неможливий запуск обліку:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Найменування&#039;&#039;&#039; — повне та скорочене&lt;br /&gt;
* &#039;&#039;&#039;Код&#039;&#039;&#039; — ЄДРПОУ (для юросіб) або ІПН / РНОКПП (для ФОП)&lt;br /&gt;
* &#039;&#039;&#039;Організаційно-правова форма&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Адреси&#039;&#039;&#039; — юридична та фактична, контактні дані&lt;br /&gt;
* &#039;&#039;&#039;Реєстраційні дані&#039;&#039;&#039; в органах ДПС, орган ДПС за місцем обліку&lt;br /&gt;
* &#039;&#039;&#039;Банківські рахунки&#039;&#039;&#039; у форматі IBAN, обслуговуючі банки&lt;br /&gt;
* &#039;&#039;&#039;Відповідальні особи&#039;&#039;&#039; — керівник, головний бухгалтер, касир (підставляються у первинні документи та звітність)&lt;br /&gt;
* &#039;&#039;&#039;Відокремлені підрозділи&#039;&#039;&#039; — за наявності консолідації чи роздільного обліку&lt;br /&gt;
&lt;br /&gt;
== Система оподаткування ==&lt;br /&gt;
&lt;br /&gt;
Визначає всю логіку податкового блоку.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Можливі значення&lt;br /&gt;
|-&lt;br /&gt;
| Система оподаткування || Загальна / спрощена&lt;br /&gt;
|-&lt;br /&gt;
| Група єдиного податку || 2, 3 (для спрощеної)&lt;br /&gt;
|-&lt;br /&gt;
| Статус платника ПДВ || Так / ні, дата реєстрації, ІПН платника ПДВ&lt;br /&gt;
|-&lt;br /&gt;
| Період з податку на прибуток || Квартальний / річний&lt;br /&gt;
|-&lt;br /&gt;
| Податкові різниці || Застосовуються / не застосовуються&lt;br /&gt;
|-&lt;br /&gt;
| Особливі статуси || Платник акцизу, рентних платежів, спецрежими&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Облікова політика (бухгалтерський облік) ==&lt;br /&gt;
&lt;br /&gt;
Серцевина налаштувань. Рішення з наказу про облікову політику відображаються у параметрах системи.&lt;br /&gt;
&lt;br /&gt;
=== План рахунків ===&lt;br /&gt;
Стандартний за [[НП(С)БО]] або за [[МСФЗ]], з визначенням робочого плану рахунків і субрахунків.&lt;br /&gt;
&lt;br /&gt;
=== Метод оцінки вибуття запасів ===&lt;br /&gt;
Один з дозволених методів:&lt;br /&gt;
* ідентифікована собівартість;&lt;br /&gt;
* середньозважена собівартість (FIFO);&lt;br /&gt;
* нормативні затрати;&lt;br /&gt;
* ціна продажу.&lt;br /&gt;
&lt;br /&gt;
{{Увага|Критичний параметр — визначає, як списуватимуться товари й матеріали. Зміна після проведення документів дуже болісна.}}&lt;br /&gt;
&lt;br /&gt;
=== Амортизація ===&lt;br /&gt;
Метод визначається &#039;&#039;&#039;окремо для бухгалтерського та податкового обліку&#039;&#039;&#039;, оскільки строки й підходи можуть відрізнятися:&lt;br /&gt;
* прямолінійний;&lt;br /&gt;
* зменшення залишкової вартості;&lt;br /&gt;
* прискорене зменшення залишкової вартості;&lt;br /&gt;
* кумулятивний;&lt;br /&gt;
* виробничий.&lt;br /&gt;
&lt;br /&gt;
=== Межа вартості ОЗ / МНМА ===&lt;br /&gt;
Межа розмежування основних засобів та [[МНМА|малоцінних необоротних матеріальних активів]] і метод їхньої амортизації:&lt;br /&gt;
* 100 % при введенні в експлуатацію;&lt;br /&gt;
* 50 % / 50 %.&lt;br /&gt;
&lt;br /&gt;
=== Собівартість ===&lt;br /&gt;
Порядок формування виробничої собівартості: які витрати входять до неї, база розподілу загальновиробничих витрат (ЗВВ), віднесення постійних та змінних ЗВВ.&lt;br /&gt;
&lt;br /&gt;
=== Резерви та забезпечення ===&lt;br /&gt;
* резерв сумнівних боргів;&lt;br /&gt;
* резерв відпусток;&lt;br /&gt;
* забезпечення гарантійних зобов&#039;язань;&lt;br /&gt;
* метод розрахунку кожного з них.&lt;br /&gt;
&lt;br /&gt;
=== Курсові різниці ===&lt;br /&gt;
Порядок перерахунку монетарних статей; джерело курсу — як правило, офіційний курс [[НБУ]].&lt;br /&gt;
&lt;br /&gt;
== Параметри ПДВ ==&lt;br /&gt;
&lt;br /&gt;
Для організації — платника ПДВ:&lt;br /&gt;
&lt;br /&gt;
* застосовувані ставки: 20 %, 14 %, 7 %, 0 %, звільнення;&lt;br /&gt;
* правило &#039;&#039;&#039;першої події&#039;&#039;&#039; для дати податкових зобов&#039;язань і кредиту;&lt;br /&gt;
* порядок реєстрації податкових накладних та розрахунків коригування в [[ЄРПН]];&lt;br /&gt;
* облік за напрямками для розподілу ПДВ (оподатковувані / неоподатковувані операції), розрахунок [[ЧВ|частки використання]];&lt;br /&gt;
* касовий метод — за наявності відповідних операцій.&lt;br /&gt;
&lt;br /&gt;
== Фінансові періоди та валюта ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Дата старту&#039;&#039;&#039; — початок ведення обліку в системі&lt;br /&gt;
* &#039;&#039;&#039;Фінансовий рік&#039;&#039;&#039; і межі облікових періодів&lt;br /&gt;
* &#039;&#039;&#039;Закриття періоду&#039;&#039;&#039; — механізм заборони змін заднім числом&lt;br /&gt;
* &#039;&#039;&#039;Функціональна валюта&#039;&#039;&#039; — гривня&lt;br /&gt;
* &#039;&#039;&#039;Завантаження курсів&#039;&#039;&#039; — джерело НБУ, автоматичне чи ручне&lt;br /&gt;
* &#039;&#039;&#039;Валюти взаєморозрахунків&#039;&#039;&#039; та валютних рахунків&lt;br /&gt;
&lt;br /&gt;
== Аналітичні розрізи ==&lt;br /&gt;
&lt;br /&gt;
Визначають глибину управлінського й регламентованого аналізу. Продумуються на старті, бо зміна постфактум складна.&lt;br /&gt;
&lt;br /&gt;
* підрозділи, центри витрат / центри відповідальності;&lt;br /&gt;
* напрямки діяльності, номенклатурні групи;&lt;br /&gt;
* статті витрат і доходів;&lt;br /&gt;
* проєкти, замовлення (для позамовного обліку).&lt;br /&gt;
&lt;br /&gt;
== Технічні параметри роботи ERP ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Група !! Що налаштовується&lt;br /&gt;
|-&lt;br /&gt;
| Нумерація документів || Префікси, періодичність скидання, роздільна для кожної організації&lt;br /&gt;
|-&lt;br /&gt;
| Округлення || Правила округлення сум і кількостей&lt;br /&gt;
|-&lt;br /&gt;
| Друковані форми || Первинні та друковані форми під потреби організації&lt;br /&gt;
|-&lt;br /&gt;
| Права доступу || Ролі користувачів, розмежування за організаціями й підрозділами&lt;br /&gt;
|-&lt;br /&gt;
| Регламентована звітність || Форми декларацій і фінзвітності, електронна подача&lt;br /&gt;
|-&lt;br /&gt;
| Початкові залишки || Введення залишків по рахунках і аналітиці на дату старту&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Порядок впровадження ==&lt;br /&gt;
&lt;br /&gt;
# Внести реквізити та статус організації.&lt;br /&gt;
# Визначити систему оподаткування.&lt;br /&gt;
# Налаштувати облікову політику (бух. та податкову).&lt;br /&gt;
# Задати параметри ПДВ.&lt;br /&gt;
# Встановити фінансові періоди та валюту.&lt;br /&gt;
# Налаштувати аналітичні розрізи.&lt;br /&gt;
# Задати технічні параметри та права доступу.&lt;br /&gt;
# Ввести початкові залишки на дату старту.&lt;br /&gt;
&lt;br /&gt;
== Примітки ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Категорія:Регламентований облік]]&lt;br /&gt;
[[index.php?title=Категорія:Налаштування ERP]]&lt;br /&gt;
[[index.php?title=Категорія:Облікова політика]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol7.png&amp;diff=2751</id>
		<title>Файл:Obl pol7.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol7.png&amp;diff=2751"/>
		<updated>2026-07-14T13:00:14Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol6.png&amp;diff=2750</id>
		<title>Файл:Obl pol6.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol6.png&amp;diff=2750"/>
		<updated>2026-07-14T13:00:14Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol5.png&amp;diff=2749</id>
		<title>Файл:Obl pol5.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol5.png&amp;diff=2749"/>
		<updated>2026-07-14T13:00:13Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol4.png&amp;diff=2748</id>
		<title>Файл:Obl pol4.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol4.png&amp;diff=2748"/>
		<updated>2026-07-14T13:00:13Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol3.png&amp;diff=2747</id>
		<title>Файл:Obl pol3.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol3.png&amp;diff=2747"/>
		<updated>2026-07-14T13:00:12Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol2.png&amp;diff=2746</id>
		<title>Файл:Obl pol2.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol2.png&amp;diff=2746"/>
		<updated>2026-07-14T13:00:12Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol1.png&amp;diff=2745</id>
		<title>Файл:Obl pol1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:Obl_pol1.png&amp;diff=2745"/>
		<updated>2026-07-14T13:00:11Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2744</id>
		<title>Налаштування організації (приклад)</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9D%D0%B0%D0%BB%D0%B0%D1%88%D1%82%D1%83%D0%B2%D0%B0%D0%BD%D0%BD%D1%8F_%D0%BE%D1%80%D0%B3%D0%B0%D0%BD%D1%96%D0%B7%D0%B0%D1%86%D1%96%D1%97_(%D0%BF%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4)&amp;diff=2744"/>
		<updated>2026-07-14T12:55:58Z</updated>

		<summary type="html">&lt;p&gt;R: Створена сторінка: {{Стаття про облік | система        = ERP | розділ         = Регламентований облік | актуально_на   = 2026 }}  &amp;#039;&amp;#039;&amp;#039;Налаштування організації для бухгалтерського та податкового обліку&amp;#039;&amp;#039;&amp;#039; — це формалізація облікової політики підприємства у параметрах [...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Стаття про облік&lt;br /&gt;
| система        = ERP&lt;br /&gt;
| розділ         = Регламентований облік&lt;br /&gt;
| актуально_на   = 2026&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Налаштування організації для бухгалтерського та податкового обліку&#039;&#039;&#039; — це формалізація [[облікова політика|облікової політики]] підприємства у параметрах [[ERP-система|ERP-системи]]. Нижче наведено перелік реквізитів, політик та параметрів, які необхідно визначити для коректної роботи регламентованого обліку.&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
== Реквізити та статус організації ==&lt;br /&gt;
&lt;br /&gt;
Базовий рівень даних, без якого неможливий запуск обліку:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Найменування&#039;&#039;&#039; — повне та скорочене&lt;br /&gt;
* &#039;&#039;&#039;Код&#039;&#039;&#039; — ЄДРПОУ (для юросіб) або ІПН / РНОКПП (для ФОП)&lt;br /&gt;
* &#039;&#039;&#039;Організаційно-правова форма&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;Адреси&#039;&#039;&#039; — юридична та фактична, контактні дані&lt;br /&gt;
* &#039;&#039;&#039;Реєстраційні дані&#039;&#039;&#039; в органах ДПС, орган ДПС за місцем обліку&lt;br /&gt;
* &#039;&#039;&#039;Банківські рахунки&#039;&#039;&#039; у форматі IBAN, обслуговуючі банки&lt;br /&gt;
* &#039;&#039;&#039;Відповідальні особи&#039;&#039;&#039; — керівник, головний бухгалтер, касир (підставляються у первинні документи та звітність)&lt;br /&gt;
* &#039;&#039;&#039;Відокремлені підрозділи&#039;&#039;&#039; — за наявності консолідації чи роздільного обліку&lt;br /&gt;
&lt;br /&gt;
== Система оподаткування ==&lt;br /&gt;
&lt;br /&gt;
Визначає всю логіку податкового блоку.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Параметр !! Можливі значення&lt;br /&gt;
|-&lt;br /&gt;
| Система оподаткування || Загальна / спрощена&lt;br /&gt;
|-&lt;br /&gt;
| Група єдиного податку || 2, 3 (для спрощеної)&lt;br /&gt;
|-&lt;br /&gt;
| Статус платника ПДВ || Так / ні, дата реєстрації, ІПН платника ПДВ&lt;br /&gt;
|-&lt;br /&gt;
| Період з податку на прибуток || Квартальний / річний&lt;br /&gt;
|-&lt;br /&gt;
| Податкові різниці || Застосовуються / не застосовуються&lt;br /&gt;
|-&lt;br /&gt;
| Особливі статуси || Платник акцизу, рентних платежів, спецрежими&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Облікова політика (бухгалтерський облік) ==&lt;br /&gt;
&lt;br /&gt;
Серцевина налаштувань. Рішення з наказу про облікову політику відображаються у параметрах системи.&lt;br /&gt;
&lt;br /&gt;
=== План рахунків ===&lt;br /&gt;
Стандартний за [[НП(С)БО]] або за [[МСФЗ]], з визначенням робочого плану рахунків і субрахунків.&lt;br /&gt;
&lt;br /&gt;
=== Метод оцінки вибуття запасів ===&lt;br /&gt;
Один з дозволених методів:&lt;br /&gt;
* ідентифікована собівартість;&lt;br /&gt;
* середньозважена собівартість (FIFO);&lt;br /&gt;
* нормативні затрати;&lt;br /&gt;
* ціна продажу.&lt;br /&gt;
&lt;br /&gt;
{{Увага|Критичний параметр — визначає, як списуватимуться товари й матеріали. Зміна після проведення документів дуже болісна.}}&lt;br /&gt;
&lt;br /&gt;
=== Амортизація ===&lt;br /&gt;
Метод визначається &#039;&#039;&#039;окремо для бухгалтерського та податкового обліку&#039;&#039;&#039;, оскільки строки й підходи можуть відрізнятися:&lt;br /&gt;
* прямолінійний;&lt;br /&gt;
* зменшення залишкової вартості;&lt;br /&gt;
* прискорене зменшення залишкової вартості;&lt;br /&gt;
* кумулятивний;&lt;br /&gt;
* виробничий.&lt;br /&gt;
&lt;br /&gt;
=== Межа вартості ОЗ / МНМА ===&lt;br /&gt;
Межа розмежування основних засобів та [[МНМА|малоцінних необоротних матеріальних активів]] і метод їхньої амортизації:&lt;br /&gt;
* 100 % при введенні в експлуатацію;&lt;br /&gt;
* 50 % / 50 %.&lt;br /&gt;
&lt;br /&gt;
=== Собівартість ===&lt;br /&gt;
Порядок формування виробничої собівартості: які витрати входять до неї, база розподілу загальновиробничих витрат (ЗВВ), віднесення постійних та змінних ЗВВ.&lt;br /&gt;
&lt;br /&gt;
=== Резерви та забезпечення ===&lt;br /&gt;
* резерв сумнівних боргів;&lt;br /&gt;
* резерв відпусток;&lt;br /&gt;
* забезпечення гарантійних зобов&#039;язань;&lt;br /&gt;
* метод розрахунку кожного з них.&lt;br /&gt;
&lt;br /&gt;
=== Курсові різниці ===&lt;br /&gt;
Порядок перерахунку монетарних статей; джерело курсу — як правило, офіційний курс [[НБУ]].&lt;br /&gt;
&lt;br /&gt;
== Параметри ПДВ ==&lt;br /&gt;
&lt;br /&gt;
Для організації — платника ПДВ:&lt;br /&gt;
&lt;br /&gt;
* застосовувані ставки: 20 %, 14 %, 7 %, 0 %, звільнення;&lt;br /&gt;
* правило &#039;&#039;&#039;першої події&#039;&#039;&#039; для дати податкових зобов&#039;язань і кредиту;&lt;br /&gt;
* порядок реєстрації податкових накладних та розрахунків коригування в [[ЄРПН]];&lt;br /&gt;
* облік за напрямками для розподілу ПДВ (оподатковувані / неоподатковувані операції), розрахунок [[ЧВ|частки використання]];&lt;br /&gt;
* касовий метод — за наявності відповідних операцій.&lt;br /&gt;
&lt;br /&gt;
== Фінансові періоди та валюта ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Дата старту&#039;&#039;&#039; — початок ведення обліку в системі&lt;br /&gt;
* &#039;&#039;&#039;Фінансовий рік&#039;&#039;&#039; і межі облікових періодів&lt;br /&gt;
* &#039;&#039;&#039;Закриття періоду&#039;&#039;&#039; — механізм заборони змін заднім числом&lt;br /&gt;
* &#039;&#039;&#039;Функціональна валюта&#039;&#039;&#039; — гривня&lt;br /&gt;
* &#039;&#039;&#039;Завантаження курсів&#039;&#039;&#039; — джерело НБУ, автоматичне чи ручне&lt;br /&gt;
* &#039;&#039;&#039;Валюти взаєморозрахунків&#039;&#039;&#039; та валютних рахунків&lt;br /&gt;
&lt;br /&gt;
== Аналітичні розрізи ==&lt;br /&gt;
&lt;br /&gt;
Визначають глибину управлінського й регламентованого аналізу. Продумуються на старті, бо зміна постфактум складна.&lt;br /&gt;
&lt;br /&gt;
* підрозділи, центри витрат / центри відповідальності;&lt;br /&gt;
* напрямки діяльності, номенклатурні групи;&lt;br /&gt;
* статті витрат і доходів;&lt;br /&gt;
* проєкти, замовлення (для позамовного обліку).&lt;br /&gt;
&lt;br /&gt;
== Технічні параметри роботи ERP ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
! Група !! Що налаштовується&lt;br /&gt;
|-&lt;br /&gt;
| Нумерація документів || Префікси, періодичність скидання, роздільна для кожної організації&lt;br /&gt;
|-&lt;br /&gt;
| Округлення || Правила округлення сум і кількостей&lt;br /&gt;
|-&lt;br /&gt;
| Друковані форми || Первинні та друковані форми під потреби організації&lt;br /&gt;
|-&lt;br /&gt;
| Права доступу || Ролі користувачів, розмежування за організаціями й підрозділами&lt;br /&gt;
|-&lt;br /&gt;
| Регламентована звітність || Форми декларацій і фінзвітності, електронна подача&lt;br /&gt;
|-&lt;br /&gt;
| Початкові залишки || Введення залишків по рахунках і аналітиці на дату старту&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Порядок впровадження ==&lt;br /&gt;
&lt;br /&gt;
# Внести реквізити та статус організації.&lt;br /&gt;
# Визначити систему оподаткування.&lt;br /&gt;
# Налаштувати облікову політику (бух. та податкову).&lt;br /&gt;
# Задати параметри ПДВ.&lt;br /&gt;
# Встановити фінансові періоди та валюту.&lt;br /&gt;
# Налаштувати аналітичні розрізи.&lt;br /&gt;
# Задати технічні параметри та права доступу.&lt;br /&gt;
# Ввести початкові залишки на дату старту.&lt;br /&gt;
&lt;br /&gt;
== Примітки ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;references /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категорія:Регламентований облік]]&lt;br /&gt;
[[Категорія:Налаштування ERP]]&lt;br /&gt;
[[Категорія:Облікова політика]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2&amp;diff=2743</id>
		<title>Приклади розрахунків</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2&amp;diff=2743"/>
		<updated>2026-07-14T12:53:54Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Основні засоби ==&lt;br /&gt;
[[Приклад розрахунків основних засобів, згідно українського законодавства]]&lt;br /&gt;
&lt;br /&gt;
[[Налаштування організації (приклад)]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B8%D1%85_%D0%B7%D0%B0%D1%81%D0%BE%D0%B1%D1%96%D0%B2,_%D0%B7%D0%B3%D1%96%D0%B4%D0%BD%D0%BE_%D1%83%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D0%BE%D0%B4%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%B0&amp;diff=2742</id>
		<title>Приклад розрахунків основних засобів, згідно українського законодавства</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B8%D1%85_%D0%B7%D0%B0%D1%81%D0%BE%D0%B1%D1%96%D0%B2,_%D0%B7%D0%B3%D1%96%D0%B4%D0%BD%D0%BE_%D1%83%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D0%BE%D0%B4%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%B0&amp;diff=2742"/>
		<updated>2026-07-14T12:43:49Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Амортизація основних засобів: методи та повний помісячний розрахунок =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Амортизація&#039;&#039;&#039; — це систематичний розподіл вартості необоротного активу, яка амортизується, протягом строку його корисного використання (пп. 14.1.3 ПКУ; п. 4 НП(С)БО 7). Стаття містить нормативну базу, порядок вибору методу та &#039;&#039;&#039;повний помісячний розрахунок за всіма п&#039;ятьма методами за весь строк служби (60 місяців)&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Нормативна база ==&lt;br /&gt;
&lt;br /&gt;
Бухгалтерський облік регулює &#039;&#039;&#039;НП(С)БО 7 «Основні засоби»&#039;&#039;&#039;, податковий — &#039;&#039;&#039;ст. 138 Податкового кодексу України&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Амортизація нараховується &#039;&#039;&#039;щомісячно&#039;&#039;&#039;, починаючи з місяця, &#039;&#039;&#039;наступного за місяцем&#039;&#039;&#039;, у якому об&#039;єкт став придатним для використання, і припиняється з місяця, наступного за місяцем вибуття (п. 29 НП(С)БО 7).&lt;br /&gt;
* НП(С)БО 7 передбачає &#039;&#039;&#039;5 методів&#039;&#039;&#039; амортизації (п. 26).&lt;br /&gt;
* Для податку на прибуток діють &#039;&#039;&#039;мінімально допустимі строки&#039;&#039;&#039; корисного використання (пп. 138.3.3 ПКУ). Наприклад, &#039;&#039;&#039;група 4 (машини та обладнання) — 5 років&#039;&#039;&#039; (для ЕОМ у складі групи — 2 роки).&lt;br /&gt;
* Якщо бухгалтерський строк &#039;&#039;&#039;менший&#039;&#039;&#039; за мінімальний податковий — для податку беруть &#039;&#039;&#039;податковий мінімум&#039;&#039;&#039;; якщо &#039;&#039;&#039;дорівнює або більший&#039;&#039;&#039; — беруть бухгалтерський.&lt;br /&gt;
* Виробничий метод для податкової амортизації &#039;&#039;&#039;дозволений з 23.05.2020&#039;&#039;&#039; (Закон № 466-IX); при його застосуванні мінімально допустимі строки &#039;&#039;&#039;не застосовуються&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Методи амортизації (п. 26 НП(С)БО 7) ==&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Прямолінійний&#039;&#039;&#039; — рівномірне списання протягом строку служби.&lt;br /&gt;
# &#039;&#039;&#039;Зменшення залишкової вартості&#039;&#039;&#039; — фіксована норма до залишкової вартості; більші суми на початку служби.&lt;br /&gt;
# &#039;&#039;&#039;Прискореного зменшення залишкової вартості&#039;&#039;&#039; — подвоєна прямолінійна норма до залишкової вартості.&lt;br /&gt;
# &#039;&#039;&#039;Кумулятивний&#039;&#039;&#039; — річна сума = вартість, що амортизується × кумулятивний коефіцієнт (сума чисел років).&lt;br /&gt;
# &#039;&#039;&#039;Виробничий&#039;&#039;&#039; — сума прямо залежить від фактичного обсягу продукції (робіт) за місяць.&lt;br /&gt;
&lt;br /&gt;
Для &#039;&#039;&#039;малоцінних необоротних матеріальних активів (група 11)&#039;&#039;&#039; і &#039;&#039;&#039;бібліотечних фондів (група 10)&#039;&#039;&#039; дозволені лише &#039;&#039;&#039;прямолінійний і виробничий&#039;&#039;&#039; методи, або нарахування &#039;&#039;&#039;50 % / 50 %&#039;&#039;&#039;, або &#039;&#039;&#039;100 % у першому місяці&#039;&#039;&#039; використання (п. 27 НП(С)БО 7).&lt;br /&gt;
&lt;br /&gt;
== Хто обирає метод амортизації та чим керується ==&lt;br /&gt;
&lt;br /&gt;
=== Хто обирає ===&lt;br /&gt;
&lt;br /&gt;
Метод амортизації &#039;&#039;&#039;підприємство обирає самостійно&#039;&#039;&#039; (п. 28 НП(С)БО 7). На практиці:&lt;br /&gt;
* &#039;&#039;&#039;Керівник підприємства&#039;&#039;&#039; затверджує загальні підходи &#039;&#039;&#039;наказом про облікову політику&#039;&#039;&#039; (за поданням &#039;&#039;&#039;головного бухгалтера&#039;&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Постійно діюча комісія&#039;&#039;&#039; при введенні об&#039;єкта в експлуатацію в &#039;&#039;&#039;Акті введення в експлуатацію&#039;&#039;&#039; визначає для кожного об&#039;єкта &#039;&#039;&#039;строк корисного використання&#039;&#039;&#039;, &#039;&#039;&#039;ліквідаційну вартість&#039;&#039;&#039; і &#039;&#039;&#039;метод амортизації&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Метод обирається &#039;&#039;&#039;окремо для кожного об&#039;єкта&#039;&#039;&#039; (або групи однорідних об&#039;єктів).&lt;br /&gt;
&lt;br /&gt;
=== Головний критерій вибору ===&lt;br /&gt;
&lt;br /&gt;
Основний принцип (п. 28 НП(С)БО 7): метод обирається &#039;&#039;&#039;з урахуванням очікуваного способу отримання економічних вигод&#039;&#039;&#039; від використання об&#039;єкта:&lt;br /&gt;
* вигоди надходять &#039;&#039;&#039;рівномірно&#039;&#039;&#039; → прямолінійний;&lt;br /&gt;
* віддача &#039;&#039;&#039;інтенсивніша на початку&#039;&#039;&#039; служби → зменшення залишкової, прискореного зменшення або кумулятивний;&lt;br /&gt;
* вигоди &#039;&#039;&#039;пропорційні обсягу випуску&#039;&#039;&#039; → виробничий.&lt;br /&gt;
&lt;br /&gt;
Строк корисного використання визначають самостійно, враховуючи (п. 24 НП(С)БО 7): очікувану потужність і продуктивність, фізичний та моральний знос, правові й інші обмеження, інші чинники.&lt;br /&gt;
&lt;br /&gt;
=== Орієнтири для кожного методу ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Коли який метод доцільний&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#455A64; color:white;&amp;quot; | Метод&lt;br /&gt;
! style=&amp;quot;background:#455A64; color:white;&amp;quot; | Коли застосовують&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Прямолінійний&#039;&#039;&#039; || Вигоди надходять рівномірно; найпростіший і найпоширеніший; &#039;&#039;&#039;зближує бухгалтерський і податковий облік&#039;&#039;&#039;. Будівлі, меблі, офісне обладнання.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Зменшення залишкової вартості&#039;&#039;&#039; || Найбільша віддача &#039;&#039;&#039;на початку&#039;&#039;&#039; служби, швидке моральне старіння. &#039;&#039;&#039;Обов&#039;язково ліквідаційна вартість &amp;gt; 0.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Прискореного зменшення&#039;&#039;&#039; || Те саме, але простіша норма (подвоєна прямолінійна). Техніка, IT, транспорт.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Кумулятивний&#039;&#039;&#039; || Прискорене списання &#039;&#039;&#039;без вимоги&#039;&#039;&#039; до ліквідаційної вартості; плавніше за метод зменшення залишкової.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Виробничий&#039;&#039;&#039; || Знос прямо залежить від &#039;&#039;&#039;обсягу&#039;&#039;&#039;; &#039;&#039;&#039;не має незмінної місячної суми&#039;&#039;&#039;.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Чинники, що впливають на рішення ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Очікуваний спосіб отримання вигод&#039;&#039;&#039; — головний нормативний критерій.&lt;br /&gt;
* &#039;&#039;&#039;Характер експлуатації&#039;&#039;&#039; (рівномірний / інтенсивний / залежний від обсягу).&lt;br /&gt;
* &#039;&#039;&#039;Вплив на звітність&#039;&#039;&#039; — прискорені методи зменшують прибуток і вартість активів у перші роки.&lt;br /&gt;
* &#039;&#039;&#039;Податкові наслідки&#039;&#039;&#039; — мінімально допустимі строки; виробничий метод дозволяє їх не застосовувати.&lt;br /&gt;
* &#039;&#039;&#039;Зближення обліків&#039;&#039;&#039; — щоб уникнути податкових різниць, часто обирають &#039;&#039;&#039;прямолінійний&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Простота адміністрування&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Зміна методу ===&lt;br /&gt;
&lt;br /&gt;
Метод можна &#039;&#039;&#039;переглянути&#039;&#039;&#039;, якщо змінюється очікуваний спосіб отримання вигод (п. 28 НП(С)БО 7). Це &#039;&#039;&#039;зміна облікової оцінки&#039;&#039;&#039;, застосовується &#039;&#039;&#039;перспективно&#039;&#039;&#039; — з місяця, наступного за місяцем зміни (НП(С)БО 6); перерахунок раніше нарахованої амортизації не робиться.&lt;br /&gt;
&lt;br /&gt;
== Вихідні дані прикладу ==&lt;br /&gt;
&lt;br /&gt;
Обладнання (група 4): первісна вартість &#039;&#039;&#039;120 000 грн&#039;&#039;&#039;, строк &#039;&#039;&#039;5 років (60 місяців)&#039;&#039;&#039;, введено в експлуатацію у &#039;&#039;&#039;грудні 2024 р.&#039;&#039;&#039; → амортизація з &#039;&#039;&#039;січня 2025 р.&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;&#039;Ліквідаційна вартість:&#039;&#039;&#039; 0 грн для всіх методів, окрім методу зменшення залишкової вартості, що &#039;&#039;&#039;математично вимагає значення &amp;gt; 0&#039;&#039;&#039; — для нього прийнято &#039;&#039;&#039;3 750 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Приклад 1. Прямолінійний метод ==&lt;br /&gt;
&lt;br /&gt;
Річна сума = (120 000 − 0) / 5 = &#039;&#039;&#039;24 000 грн&#039;&#039;&#039;; місячна = &#039;&#039;&#039;2 000 грн&#039;&#039;&#039;. Проводка щомісяця: &#039;&#039;&#039;Дт 92 – Кт 131 = 2 000 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Прямолінійний метод — весь строк служби (2025–2029)&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Період&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Накопичена (Кт 131), грн&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2025 || 2 000 || 2 000 || 118 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2025 || 2 000 || 4 000 || 116 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2025 || 2 000 || 6 000 || 114 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2025 || 2 000 || 8 000 || 112 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2025 || 2 000 || 10 000 || 110 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2025 || 2 000 || 12 000 || 108 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2025 || 2 000 || 14 000 || 106 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2025 || 2 000 || 16 000 || 104 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2025 || 2 000 || 18 000 || 102 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2025 || 2 000 || 20 000 || 100 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2025 || 2 000 || 22 000 || 98 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2025 || 2 000 || 24 000 || 96 000&lt;br /&gt;
|- style=&amp;quot;background:#DCE6F1; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2025 рік || 24 000 || 24 000 || 96 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2026 || 2 000 || 26 000 || 94 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2026 || 2 000 || 28 000 || 92 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2026 || 2 000 || 30 000 || 90 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2026 || 2 000 || 32 000 || 88 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2026 || 2 000 || 34 000 || 86 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2026 || 2 000 || 36 000 || 84 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2026 || 2 000 || 38 000 || 82 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2026 || 2 000 || 40 000 || 80 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2026 || 2 000 || 42 000 || 78 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2026 || 2 000 || 44 000 || 76 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2026 || 2 000 || 46 000 || 74 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2026 || 2 000 || 48 000 || 72 000&lt;br /&gt;
|- style=&amp;quot;background:#DCE6F1; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2026 рік || 24 000 || 48 000 || 72 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2027 || 2 000 || 50 000 || 70 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2027 || 2 000 || 52 000 || 68 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2027 || 2 000 || 54 000 || 66 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2027 || 2 000 || 56 000 || 64 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2027 || 2 000 || 58 000 || 62 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2027 || 2 000 || 60 000 || 60 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2027 || 2 000 || 62 000 || 58 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2027 || 2 000 || 64 000 || 56 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2027 || 2 000 || 66 000 || 54 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2027 || 2 000 || 68 000 || 52 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2027 || 2 000 || 70 000 || 50 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2027 || 2 000 || 72 000 || 48 000&lt;br /&gt;
|- style=&amp;quot;background:#DCE6F1; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2027 рік || 24 000 || 72 000 || 48 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2028 || 2 000 || 74 000 || 46 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2028 || 2 000 || 76 000 || 44 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2028 || 2 000 || 78 000 || 42 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2028 || 2 000 || 80 000 || 40 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2028 || 2 000 || 82 000 || 38 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2028 || 2 000 || 84 000 || 36 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2028 || 2 000 || 86 000 || 34 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2028 || 2 000 || 88 000 || 32 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2028 || 2 000 || 90 000 || 30 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2028 || 2 000 || 92 000 || 28 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2028 || 2 000 || 94 000 || 26 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2028 || 2 000 || 96 000 || 24 000&lt;br /&gt;
|- style=&amp;quot;background:#DCE6F1; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2028 рік || 24 000 || 96 000 || 24 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2029 || 2 000 || 98 000 || 22 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2029 || 2 000 || 100 000 || 20 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2029 || 2 000 || 102 000 || 18 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2029 || 2 000 || 104 000 || 16 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2029 || 2 000 || 106 000 || 14 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2029 || 2 000 || 108 000 || 12 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2029 || 2 000 || 110 000 || 10 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2029 || 2 000 || 112 000 || 8 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2029 || 2 000 || 114 000 || 6 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2029 || 2 000 || 116 000 || 4 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2029 || 2 000 || 118 000 || 2 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2029 || 2 000 || 120 000 || 0&lt;br /&gt;
|- style=&amp;quot;background:#DCE6F1; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2029 рік || 24 000 || 120 000 || 0&lt;br /&gt;
|- style=&amp;quot;background:#DCE6F1; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | РАЗОМ за 5 років || 120 000 || 120 000 || 0&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; за прямолінійним, зменшення залишкової, прискореного зменшення та кумулятивним методами місячна сума &#039;&#039;&#039;в межах одного року незмінна&#039;&#039;&#039; і змінюється лише &#039;&#039;&#039;рік до року&#039;&#039;&#039;. Реальну помісячну варіацію дає &#039;&#039;&#039;виробничий метод&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Приклад 2. Виробничий метод ==&lt;br /&gt;
&lt;br /&gt;
Загальний розрахунковий обсяг продукції — 240 000 од. Ставка = 120 000 / 240 000 = &#039;&#039;&#039;0,5 грн/од.&#039;&#039;&#039; Проводка: &#039;&#039;&#039;Дт 23 – Кт 131&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Виробничий метод — приклад повного року (2025)&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Період&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Обсяг, од.&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Ставка, грн/од.&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Накопичена, грн&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2025 || 1 800 || 0,50 || 900 || 900 || 119 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2025 || 2 000 || 0,50 || 1 000 || 1 900 || 118 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2025 || 2 200 || 0,50 || 1 100 || 3 000 || 117 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2025 || 1 500 || 0,50 || 750 || 3 750 || 116 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2025 || 2 500 || 0,50 || 1 250 || 5 000 || 115 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2025 || 3 000 || 0,50 || 1 500 || 6 500 || 113 500&lt;br /&gt;
|- style=&amp;quot;background:#FFF3CD;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;лип. 2025 (ремонт)&#039;&#039;&#039; || 0 || 0,50 || &#039;&#039;&#039;0&#039;&#039;&#039; || 6 500 || 113 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2025 || 2 800 || 0,50 || 1 400 || 7 900 || 112 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2025 || 2 600 || 0,50 || 1 300 || 9 200 || 110 800&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2025 || 2 400 || 0,50 || 1 200 || 10 400 || 109 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2025 || 2 000 || 0,50 || 1 000 || 11 400 || 108 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2025 || 1 700 || 0,50 || 850 || 12 250 || 107 750&lt;br /&gt;
|- style=&amp;quot;background:#D4EDDA; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2025 рік || 24 500 || — || 12 250 || 12 250 || 107 750&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Особливість методу:&#039;&#039;&#039; виробничий метод &#039;&#039;&#039;не має фіксованого календарного графіка&#039;&#039;&#039; — амортизація нараховується пропорційно &#039;&#039;&#039;фактичному&#039;&#039;&#039; обсягу випуску і триває, доки сумарний обсяг не досягне розрахункових 240 000 од. (тобто доки накопичена амортизація не сягне 120 000 грн). Тому його показано за &#039;&#039;&#039;повний рік&#039;&#039;&#039; як зразок помісячної механіки; для наступних періодів суми залежать від реального виробництва.&lt;br /&gt;
&lt;br /&gt;
== Приклад 3. Зменшення залишкової вартості ==&lt;br /&gt;
&lt;br /&gt;
Річна норма: На = 1 − ⁵√(3 750 / 120 000) = &#039;&#039;&#039;50 %&#039;&#039;&#039;. Річна сума = залишкова вартість на початок року × 50 %.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Зменшення залишкової вартості — весь строк служби (норма 50 %)&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#6A1B9A; color:white;&amp;quot; | Період&lt;br /&gt;
! style=&amp;quot;background:#6A1B9A; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#6A1B9A; color:white;&amp;quot; | Накопичена (Кт 131), грн&lt;br /&gt;
! style=&amp;quot;background:#6A1B9A; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2025 || 5 000 || 5 000 || 115 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2025 || 5 000 || 10 000 || 110 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2025 || 5 000 || 15 000 || 105 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2025 || 5 000 || 20 000 || 100 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2025 || 5 000 || 25 000 || 95 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2025 || 5 000 || 30 000 || 90 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2025 || 5 000 || 35 000 || 85 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2025 || 5 000 || 40 000 || 80 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2025 || 5 000 || 45 000 || 75 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2025 || 5 000 || 50 000 || 70 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2025 || 5 000 || 55 000 || 65 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2025 || 5 000 || 60 000 || 60 000&lt;br /&gt;
|- style=&amp;quot;background:#E1BEE7; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2025 рік || 60 000 || 60 000 || 60 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2026 || 2 500 || 62 500 || 57 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2026 || 2 500 || 65 000 || 55 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2026 || 2 500 || 67 500 || 52 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2026 || 2 500 || 70 000 || 50 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2026 || 2 500 || 72 500 || 47 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2026 || 2 500 || 75 000 || 45 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2026 || 2 500 || 77 500 || 42 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2026 || 2 500 || 80 000 || 40 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2026 || 2 500 || 82 500 || 37 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2026 || 2 500 || 85 000 || 35 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2026 || 2 500 || 87 500 || 32 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2026 || 2 500 || 90 000 || 30 000&lt;br /&gt;
|- style=&amp;quot;background:#E1BEE7; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2026 рік || 30 000 || 90 000 || 30 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2027 || 1 250 || 91 250 || 28 750&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2027 || 1 250 || 92 500 || 27 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2027 || 1 250 || 93 750 || 26 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2027 || 1 250 || 95 000 || 25 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2027 || 1 250 || 96 250 || 23 750&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2027 || 1 250 || 97 500 || 22 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2027 || 1 250 || 98 750 || 21 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2027 || 1 250 || 100 000 || 20 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2027 || 1 250 || 101 250 || 18 750&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2027 || 1 250 || 102 500 || 17 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2027 || 1 250 || 103 750 || 16 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2027 || 1 250 || 105 000 || 15 000&lt;br /&gt;
|- style=&amp;quot;background:#E1BEE7; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2027 рік || 15 000 || 105 000 || 15 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2028 || 625 || 105 625 || 14 375&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2028 || 625 || 106 250 || 13 750&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2028 || 625 || 106 875 || 13 125&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2028 || 625 || 107 500 || 12 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2028 || 625 || 108 125 || 11 875&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2028 || 625 || 108 750 || 11 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2028 || 625 || 109 375 || 10 625&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2028 || 625 || 110 000 || 10 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2028 || 625 || 110 625 || 9 375&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2028 || 625 || 111 250 || 8 750&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2028 || 625 || 111 875 || 8 125&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2028 || 625 || 112 500 || 7 500&lt;br /&gt;
|- style=&amp;quot;background:#E1BEE7; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2028 рік || 7 500 || 112 500 || 7 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2029 || 312,50 || 112 812,50 || 7 187,50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2029 || 312,50 || 113 125 || 6 875&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2029 || 312,50 || 113 437,50 || 6 562,50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2029 || 312,50 || 113 750 || 6 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2029 || 312,50 || 114 062,50 || 5 937,50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2029 || 312,50 || 114 375 || 5 625&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2029 || 312,50 || 114 687,50 || 5 312,50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2029 || 312,50 || 115 000 || 5 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2029 || 312,50 || 115 312,50 || 4 687,50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2029 || 312,50 || 115 625 || 4 375&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2029 || 312,50 || 115 937,50 || 4 062,50&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2029 || 312,50 || 116 250 || 3 750&lt;br /&gt;
|- style=&amp;quot;background:#E1BEE7; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2029 рік || 3 750 || 116 250 || 3 750&lt;br /&gt;
|- style=&amp;quot;background:#E1BEE7; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | РАЗОМ за 5 років || 116 250 || 116 250 || 3 750  (= ліквідаційна 3 750)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Приклад 4. Прискореного зменшення залишкової вартості ==&lt;br /&gt;
&lt;br /&gt;
Річна норма = (100 % / 5) × 2 = &#039;&#039;&#039;40 %&#039;&#039;&#039; (ліквідаційна вартість у нормі не враховується). В &#039;&#039;&#039;останній рік&#039;&#039;&#039; списується &#039;&#039;&#039;весь залишок&#039;&#039;&#039; до ліквідаційної вартості, тому місячна сума 2029 р. більша за 2028 р.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Прискореного зменшення залишкової вартості — весь строк (норма 40 %)&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#E65100; color:white;&amp;quot; | Період&lt;br /&gt;
! style=&amp;quot;background:#E65100; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#E65100; color:white;&amp;quot; | Накопичена (Кт 131), грн&lt;br /&gt;
! style=&amp;quot;background:#E65100; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2025 || 4 000 || 4 000 || 116 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2025 || 4 000 || 8 000 || 112 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2025 || 4 000 || 12 000 || 108 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2025 || 4 000 || 16 000 || 104 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2025 || 4 000 || 20 000 || 100 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2025 || 4 000 || 24 000 || 96 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2025 || 4 000 || 28 000 || 92 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2025 || 4 000 || 32 000 || 88 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2025 || 4 000 || 36 000 || 84 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2025 || 4 000 || 40 000 || 80 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2025 || 4 000 || 44 000 || 76 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2025 || 4 000 || 48 000 || 72 000&lt;br /&gt;
|- style=&amp;quot;background:#FFE0B2; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2025 рік || 48 000 || 48 000 || 72 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2026 || 2 400 || 50 400 || 69 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2026 || 2 400 || 52 800 || 67 200&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2026 || 2 400 || 55 200 || 64 800&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2026 || 2 400 || 57 600 || 62 400&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2026 || 2 400 || 60 000 || 60 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2026 || 2 400 || 62 400 || 57 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2026 || 2 400 || 64 800 || 55 200&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2026 || 2 400 || 67 200 || 52 800&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2026 || 2 400 || 69 600 || 50 400&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2026 || 2 400 || 72 000 || 48 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2026 || 2 400 || 74 400 || 45 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2026 || 2 400 || 76 800 || 43 200&lt;br /&gt;
|- style=&amp;quot;background:#FFE0B2; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2026 рік || 28 800 || 76 800 || 43 200&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2027 || 1 440 || 78 240 || 41 760&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2027 || 1 440 || 79 680 || 40 320&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2027 || 1 440 || 81 120 || 38 880&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2027 || 1 440 || 82 560 || 37 440&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2027 || 1 440 || 84 000 || 36 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2027 || 1 440 || 85 440 || 34 560&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2027 || 1 440 || 86 880 || 33 120&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2027 || 1 440 || 88 320 || 31 680&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2027 || 1 440 || 89 760 || 30 240&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2027 || 1 440 || 91 200 || 28 800&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2027 || 1 440 || 92 640 || 27 360&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2027 || 1 440 || 94 080 || 25 920&lt;br /&gt;
|- style=&amp;quot;background:#FFE0B2; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2027 рік || 17 280 || 94 080 || 25 920&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2028 || 864 || 94 944 || 25 056&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2028 || 864 || 95 808 || 24 192&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2028 || 864 || 96 672 || 23 328&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2028 || 864 || 97 536 || 22 464&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2028 || 864 || 98 400 || 21 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2028 || 864 || 99 264 || 20 736&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2028 || 864 || 100 128 || 19 872&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2028 || 864 || 100 992 || 19 008&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2028 || 864 || 101 856 || 18 144&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2028 || 864 || 102 720 || 17 280&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2028 || 864 || 103 584 || 16 416&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2028 || 864 || 104 448 || 15 552&lt;br /&gt;
|- style=&amp;quot;background:#FFE0B2; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2028 рік || 10 368 || 104 448 || 15 552&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2029 || 1 296 || 105 744 || 14 256&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2029 || 1 296 || 107 040 || 12 960&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2029 || 1 296 || 108 336 || 11 664&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2029 || 1 296 || 109 632 || 10 368&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2029 || 1 296 || 110 928 || 9 072&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2029 || 1 296 || 112 224 || 7 776&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2029 || 1 296 || 113 520 || 6 480&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2029 || 1 296 || 114 816 || 5 184&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2029 || 1 296 || 116 112 || 3 888&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2029 || 1 296 || 117 408 || 2 592&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2029 || 1 296 || 118 704 || 1 296&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2029 || 1 296 || 120 000 || 0&lt;br /&gt;
|- style=&amp;quot;background:#FFE0B2; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2029 рік || 15 552 || 120 000 || 0&lt;br /&gt;
|- style=&amp;quot;background:#FFE0B2; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | РАЗОМ за 5 років || 120 000 || 120 000 || 0  (= ліквідаційна 0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Приклад 5. Кумулятивний метод ==&lt;br /&gt;
&lt;br /&gt;
Сума чисел років = 1+2+3+4+5 = &#039;&#039;&#039;15&#039;&#039;&#039;. Коефіцієнти за роками: 5/15, 4/15, 3/15, 2/15, 1/15. Вартість, що амортизується = 120 000 грн.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Кумулятивний метод — весь строк служби&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#00695C; color:white;&amp;quot; | Період&lt;br /&gt;
! style=&amp;quot;background:#00695C; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#00695C; color:white;&amp;quot; | Накопичена (Кт 131), грн&lt;br /&gt;
! style=&amp;quot;background:#00695C; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2025 || 3 333,33 || 3 333,33 || 116 666,67&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2025 || 3 333,33 || 6 666,66 || 113 333,34&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2025 || 3 333,33 || 9 999,99 || 110 000,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2025 || 3 333,33 || 13 333,32 || 106 666,68&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2025 || 3 333,33 || 16 666,65 || 103 333,35&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2025 || 3 333,33 || 19 999,98 || 100 000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2025 || 3 333,33 || 23 333,31 || 96 666,69&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2025 || 3 333,33 || 26 666,64 || 93 333,36&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2025 || 3 333,33 || 29 999,97 || 90 000,03&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2025 || 3 333,33 || 33 333,30 || 86 666,70&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2025 || 3 333,33 || 36 666,63 || 83 333,37&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2025 || 3 333,37 || 40 000 || 80 000&lt;br /&gt;
|- style=&amp;quot;background:#B2DFDB; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2025 рік || 40 000 || 40 000 || 80 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2026 || 2 666,67 || 42 666,67 || 77 333,33&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2026 || 2 666,67 || 45 333,34 || 74 666,66&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2026 || 2 666,67 || 48 000,01 || 71 999,99&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2026 || 2 666,67 || 50 666,68 || 69 333,32&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2026 || 2 666,67 || 53 333,35 || 66 666,65&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2026 || 2 666,67 || 56 000,02 || 63 999,98&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2026 || 2 666,67 || 58 666,69 || 61 333,31&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2026 || 2 666,67 || 61 333,36 || 58 666,64&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2026 || 2 666,67 || 64 000,03 || 55 999,97&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2026 || 2 666,67 || 66 666,70 || 53 333,30&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2026 || 2 666,67 || 69 333,37 || 50 666,63&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2026 || 2 666,63 || 72 000 || 48 000&lt;br /&gt;
|- style=&amp;quot;background:#B2DFDB; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2026 рік || 32 000 || 72 000 || 48 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2027 || 2 000 || 74 000 || 46 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2027 || 2 000 || 76 000 || 44 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2027 || 2 000 || 78 000 || 42 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2027 || 2 000 || 80 000 || 40 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2027 || 2 000 || 82 000 || 38 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2027 || 2 000 || 84 000 || 36 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2027 || 2 000 || 86 000 || 34 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2027 || 2 000 || 88 000 || 32 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2027 || 2 000 || 90 000 || 30 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2027 || 2 000 || 92 000 || 28 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2027 || 2 000 || 94 000 || 26 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2027 || 2 000 || 96 000 || 24 000&lt;br /&gt;
|- style=&amp;quot;background:#B2DFDB; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2027 рік || 24 000 || 96 000 || 24 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2028 || 1 333,33 || 97 333,33 || 22 666,67&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2028 || 1 333,33 || 98 666,66 || 21 333,34&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2028 || 1 333,33 || 99 999,99 || 20 000,01&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2028 || 1 333,33 || 101 333,32 || 18 666,68&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2028 || 1 333,33 || 102 666,65 || 17 333,35&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2028 || 1 333,33 || 103 999,98 || 16 000,02&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2028 || 1 333,33 || 105 333,31 || 14 666,69&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2028 || 1 333,33 || 106 666,64 || 13 333,36&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2028 || 1 333,33 || 107 999,97 || 12 000,03&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2028 || 1 333,33 || 109 333,30 || 10 666,70&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2028 || 1 333,33 || 110 666,63 || 9 333,37&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2028 || 1 333,37 || 112 000 || 8 000&lt;br /&gt;
|- style=&amp;quot;background:#B2DFDB; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2028 рік || 16 000 || 112 000 || 8 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | січ. 2029 || 666,67 || 112 666,67 || 7 333,33&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лют. 2029 || 666,67 || 113 333,34 || 6 666,66&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | бер. 2029 || 666,67 || 114 000,01 || 5 999,99&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | кві. 2029 || 666,67 || 114 666,68 || 5 333,32&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | тра. 2029 || 666,67 || 115 333,35 || 4 666,65&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | чер. 2029 || 666,67 || 116 000,02 || 3 999,98&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лип. 2029 || 666,67 || 116 666,69 || 3 333,31&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | сер. 2029 || 666,67 || 117 333,36 || 2 666,64&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | вер. 2029 || 666,67 || 118 000,03 || 1 999,97&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | жовт. 2029 || 666,67 || 118 666,70 || 1 333,30&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | лист. 2029 || 666,67 || 119 333,37 || 666,63&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | груд. 2029 || 666,63 || 120 000 || 0&lt;br /&gt;
|- style=&amp;quot;background:#B2DFDB; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за 2029 рік || 8 000 || 120 000 || 0&lt;br /&gt;
|- style=&amp;quot;background:#B2DFDB; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | РАЗОМ за 5 років || 120 000 || 120 000 || 0  (= ліквідаційна 0)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Зведене порівняння методів (річна амортизація) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Річна сума амортизації за методами, грн&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white; text-align:left;&amp;quot; | Метод&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | Місяць (рік 1)&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | 2025&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | 2026&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | 2027&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | 2028&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | 2029&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | Разом&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Прямолінійний&#039;&#039;&#039; || 2 000,00 || 24 000 || 24 000 || 24 000 || 24 000 || 24 000 || 120 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Зменшення залишкової вартості&#039;&#039;&#039;* || 5 000,00 || 60 000 || 30 000 || 15 000 || 7 500 || 3 750 || 116 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Прискореного зменшення&#039;&#039;&#039; || 4 000,00 || 48 000 || 28 800 || 17 280 || 10 368 || 15 552** || 120 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Кумулятивний&#039;&#039;&#039; || 3 333,33 || 40 000 || 32 000 || 24 000 || 16 000 || 8 000 || 120 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Виробничий&#039;&#039;&#039; || змінна || colspan=&amp;quot;6&amp;quot; style=&amp;quot;text-align:center;&amp;quot; | залежить від обсягу випуску щомісяця (усього 120 000 грн за 240 000 од.)&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;small&amp;gt;* база амортизації = 116 250 грн (ліквідаційна 3 750 грн).&amp;lt;br&amp;gt;** у 2029 р. списується весь залишок до ліквідаційної вартості (0).&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Бухгалтерські рахунки ==&lt;br /&gt;
&lt;br /&gt;
Нарахування — за кредитом рахунка &#039;&#039;&#039;131 «Знос основних засобів»&#039;&#039;&#039;; дебет залежить від напряму використання:&lt;br /&gt;
* &#039;&#039;&#039;Дт 23&#039;&#039;&#039; — виробництво;&lt;br /&gt;
* &#039;&#039;&#039;Дт 91&#039;&#039;&#039; — загальновиробничі витрати;&lt;br /&gt;
* &#039;&#039;&#039;Дт 92&#039;&#039;&#039; — адміністративні витрати;&lt;br /&gt;
* &#039;&#039;&#039;Дт 93&#039;&#039;&#039; — витрати на збут;&lt;br /&gt;
* &#039;&#039;&#039;Дт 949&#039;&#039;&#039; — інші витрати операційної діяльності.&lt;br /&gt;
&lt;br /&gt;
== Джерела ==&lt;br /&gt;
&lt;br /&gt;
* Податковий кодекс України, ст. 138, пп. 14.1.3, пп. 138.3.3.&lt;br /&gt;
* НП(С)БО 7 «Основні засоби» (наказ Мінфіну від 27.04.2000 № 92), пп. 24, 26, 27, 28, 29.&lt;br /&gt;
* НП(С)БО 6 «Виправлення помилок і зміни у фінансових звітах».&lt;br /&gt;
* Закон України від 16.01.2020 № 466-IX.&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B8%D1%85_%D0%B7%D0%B0%D1%81%D0%BE%D0%B1%D1%96%D0%B2,_%D0%B7%D0%B3%D1%96%D0%B4%D0%BD%D0%BE_%D1%83%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D0%BE%D0%B4%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%B0&amp;diff=2741</id>
		<title>Приклад розрахунків основних засобів, згідно українського законодавства</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B8%D1%85_%D0%B7%D0%B0%D1%81%D0%BE%D0%B1%D1%96%D0%B2,_%D0%B7%D0%B3%D1%96%D0%B4%D0%BD%D0%BE_%D1%83%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D0%BE%D0%B4%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%B0&amp;diff=2741"/>
		<updated>2026-07-14T11:58:33Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Амортизація основних засобів: методи та приклади помісячного розрахунку =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Амортизація&#039;&#039;&#039; — це систематичний розподіл вартості основного засобу, яка амортизується, протягом строку його корисного використання (пп. 14.1.3 ПКУ; п. 4 НП(С)БО 7). Ця стаття містить нормативну базу, порядок вибору методу нарахування та практичні приклади помісячного розрахунку за рік за всіма п&#039;ятьма методами.&lt;br /&gt;
&lt;br /&gt;
== Нормативна база ==&lt;br /&gt;
&lt;br /&gt;
Бухгалтерський облік регулює &#039;&#039;&#039;НП(С)БО 7 «Основні засоби»&#039;&#039;&#039;, податковий — &#039;&#039;&#039;ст. 138 Податкового кодексу України&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Амортизація нараховується &#039;&#039;&#039;щомісячно&#039;&#039;&#039;, починаючи з місяця, &#039;&#039;&#039;наступного за місяцем&#039;&#039;&#039;, у якому об&#039;єкт став придатним для використання, і припиняється з місяця, наступного за місяцем вибуття (п. 29 НП(С)БО 7).&lt;br /&gt;
* НП(С)БО 7 передбачає &#039;&#039;&#039;5 методів&#039;&#039;&#039; амортизації (п. 26).&lt;br /&gt;
* Для податку на прибуток діють &#039;&#039;&#039;мінімально допустимі строки&#039;&#039;&#039; корисного використання (пп. 138.3.3 ПКУ). Наприклад, &#039;&#039;&#039;група 4 (машини та обладнання) — 5 років&#039;&#039;&#039; (для ЕОМ у складі групи — 2 роки).&lt;br /&gt;
* Якщо бухгалтерський строк &#039;&#039;&#039;менший&#039;&#039;&#039; за мінімальний податковий — для податку беруть &#039;&#039;&#039;податковий мінімум&#039;&#039;&#039;; якщо &#039;&#039;&#039;дорівнює або більший&#039;&#039;&#039; — беруть бухгалтерський.&lt;br /&gt;
* Виробничий метод для податкової амортизації &#039;&#039;&#039;дозволений з 23.05.2020&#039;&#039;&#039; (Закон № 466-IX); при його застосуванні мінімально допустимі строки &#039;&#039;&#039;не застосовуються&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Методи амортизації ==&lt;br /&gt;
&lt;br /&gt;
Згідно з п. 26 НП(С)БО 7 застосовуються &#039;&#039;&#039;п&#039;ять методів&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Прямолінійний&#039;&#039;&#039; — рівномірне списання протягом строку служби.&lt;br /&gt;
# &#039;&#039;&#039;Зменшення залишкової вартості&#039;&#039;&#039; — фіксована норма застосовується до залишкової вартості; більші суми на початку служби.&lt;br /&gt;
# &#039;&#039;&#039;Прискореного зменшення залишкової вартості&#039;&#039;&#039; — подвоєна прямолінійна норма до залишкової вартості.&lt;br /&gt;
# &#039;&#039;&#039;Кумулятивний&#039;&#039;&#039; — річна сума = вартість, що амортизується × кумулятивний коефіцієнт (сума чисел років).&lt;br /&gt;
# &#039;&#039;&#039;Виробничий&#039;&#039;&#039; — сума прямо залежить від фактичного обсягу продукції (робіт) за місяць.&lt;br /&gt;
&lt;br /&gt;
Для &#039;&#039;&#039;малоцінних необоротних матеріальних активів (група 11)&#039;&#039;&#039; і &#039;&#039;&#039;бібліотечних фондів (група 10)&#039;&#039;&#039; дозволені лише &#039;&#039;&#039;прямолінійний і виробничий&#039;&#039;&#039; методи, або нарахування &#039;&#039;&#039;50 % / 50 %&#039;&#039;&#039;, або &#039;&#039;&#039;100 % у першому місяці&#039;&#039;&#039; використання (п. 27 НП(С)БО 7).&lt;br /&gt;
&lt;br /&gt;
== Хто обирає метод амортизації та чим керується ==&lt;br /&gt;
&lt;br /&gt;
=== Хто обирає ===&lt;br /&gt;
&lt;br /&gt;
Метод амортизації &#039;&#039;&#039;підприємство обирає самостійно&#039;&#039;&#039; (п. 28 НП(С)БО 7). На практиці:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Керівник підприємства&#039;&#039;&#039; затверджує загальні підходи &#039;&#039;&#039;наказом про облікову політику&#039;&#039;&#039; (за поданням &#039;&#039;&#039;головного бухгалтера&#039;&#039;&#039;). У ньому фіксують, які методи застосовуються до груп об&#039;єктів.&lt;br /&gt;
* &#039;&#039;&#039;Постійно діюча комісія&#039;&#039;&#039; при введенні об&#039;єкта в експлуатацію в &#039;&#039;&#039;Акті приймання-передачі (введення в експлуатацію) основних засобів&#039;&#039;&#039; визначає для кожного об&#039;єкта: &#039;&#039;&#039;строк корисного використання&#039;&#039;&#039;, &#039;&#039;&#039;ліквідаційну вартість&#039;&#039;&#039; і &#039;&#039;&#039;метод амортизації&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Метод обирається &#039;&#039;&#039;окремо для кожного об&#039;єкта&#039;&#039;&#039; (або для групи однорідних об&#039;єктів).&lt;br /&gt;
&lt;br /&gt;
=== Головний критерій вибору ===&lt;br /&gt;
&lt;br /&gt;
Основний принцип (п. 28 НП(С)БО 7): метод обирається &#039;&#039;&#039;з урахуванням очікуваного способу отримання економічних вигод&#039;&#039;&#039; від використання об&#039;єкта.&lt;br /&gt;
&lt;br /&gt;
Тобто ставлять запитання: &#039;&#039;&#039;як саме об&#039;єкт приноситиме вигоду?&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;рівномірно&#039;&#039;&#039; протягом усього строку → прямолінійний;&lt;br /&gt;
* &#039;&#039;&#039;інтенсивніше на початку&#039;&#039;&#039; (швидко морально застаріває, найбільша віддача в перші роки) → зменшення залишкової, прискореного зменшення або кумулятивний;&lt;br /&gt;
* &#039;&#039;&#039;пропорційно обсягу випуску / використання&#039;&#039;&#039; → виробничий.&lt;br /&gt;
&lt;br /&gt;
Строк корисного використання підприємство теж визначає самостійно, враховуючи (п. 24 НП(С)БО 7): очікувану потужність і продуктивність, фізичний та моральний знос, правові й інші обмеження щодо використання, інші чинники.&lt;br /&gt;
&lt;br /&gt;
=== Орієнтири для кожного методу ===&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Коли який метод доцільний&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#455A64; color:white;&amp;quot; | Метод&lt;br /&gt;
! style=&amp;quot;background:#455A64; color:white;&amp;quot; | Коли застосовують&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Прямолінійний&#039;&#039;&#039; || Вигоди надходять рівномірно. Найпростіший і найпоширеніший; &#039;&#039;&#039;зближує бухгалтерський і податковий облік&#039;&#039;&#039; (менше податкових різниць). Будівлі, меблі, офісне обладнання.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Зменшення залишкової вартості&#039;&#039;&#039; || Актив дає найбільшу віддачу &#039;&#039;&#039;на початку&#039;&#039;&#039; служби, швидко морально старіє. &#039;&#039;&#039;Обов&#039;язково потрібна ліквідаційна вартість &amp;gt; 0.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Прискореного зменшення&#039;&#039;&#039; || Те саме, але простіша норма (подвоєна прямолінійна). Техніка, IT-обладнання, транспорт.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Кумулятивний&#039;&#039;&#039; || Прискорене списання без вимоги до ліквідаційної вартості; плавніше за метод зменшення залишкової.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;Виробничий&#039;&#039;&#039; || Знос прямо залежить від &#039;&#039;&#039;обсягу&#039;&#039;&#039; (верстати з нерівномірним завантаженням, транспорт із прив&#039;язкою до пробігу). &#039;&#039;&#039;Не має незмінної місячної суми.&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Чинники, що впливають на рішення ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Очікуваний спосіб отримання вигод&#039;&#039;&#039; — головний нормативний критерій.&lt;br /&gt;
* &#039;&#039;&#039;Характер експлуатації&#039;&#039;&#039; активу (рівномірний / інтенсивний / залежний від обсягу).&lt;br /&gt;
* &#039;&#039;&#039;Вплив на фінансову звітність&#039;&#039;&#039; — прискорені методи зменшують прибуток і вартість активів у перші роки.&lt;br /&gt;
* &#039;&#039;&#039;Податкові наслідки&#039;&#039;&#039; — для платників податку на прибуток, які застосовують різниці за ст. 138 ПКУ, важливі мінімально допустимі строки; виробничий метод дозволяє їх не застосовувати.&lt;br /&gt;
* &#039;&#039;&#039;Зближення обліків&#039;&#039;&#039; — щоб уникнути податкових різниць, часто обирають &#039;&#039;&#039;прямолінійний&#039;&#039;&#039; метод.&lt;br /&gt;
* &#039;&#039;&#039;Простота адміністрування&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Зміна методу ===&lt;br /&gt;
&lt;br /&gt;
Метод можна &#039;&#039;&#039;переглянути&#039;&#039;&#039;, якщо змінюється очікуваний спосіб отримання економічних вигод (п. 28 НП(С)БО 7). Це вважається &#039;&#039;&#039;зміною облікової оцінки&#039;&#039;&#039; і застосовується &#039;&#039;&#039;перспективно&#039;&#039;&#039; — з місяця, наступного за місяцем зміни (НП(С)БО 6). Перерахунок раніше нарахованої амортизації не робиться.&lt;br /&gt;
&lt;br /&gt;
== Вихідні дані прикладу ==&lt;br /&gt;
&lt;br /&gt;
Обладнання (група 4): первісна вартість &#039;&#039;&#039;120 000 грн&#039;&#039;&#039;, строк корисного використання &#039;&#039;&#039;5 років&#039;&#039;&#039;, введено в експлуатацію у &#039;&#039;&#039;грудні 2024 р.&#039;&#039;&#039; → амортизація з &#039;&#039;&#039;січня 2025 р.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Ліквідаційна вартість:&#039;&#039;&#039; 0 грн для всіх методів, окрім методу зменшення залишкової вартості, який &#039;&#039;&#039;математично вимагає значення &amp;gt; 0&#039;&#039;&#039; (інакше норма = 100 %) — для нього прийнято &#039;&#039;&#039;3 750 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Приклад 1. Прямолінійний метод ==&lt;br /&gt;
&lt;br /&gt;
Річна сума = (120 000 − 0) / 5 = &#039;&#039;&#039;24 000 грн&#039;&#039;&#039;; місячна = 24 000 / 12 = &#039;&#039;&#039;2 000 грн&#039;&#039;&#039;. Проводка щомісяця (адмінобладнання): &#039;&#039;&#039;Дт 92 – Кт 131 = 2 000 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Прямолінійний метод — 2025 рік&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Місяць&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Накопичена (Кт 131), грн&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Січень || 2 000 || 2 000 || 118 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Лютий || 2 000 || 4 000 || 116 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Березень || 2 000 || 6 000 || 114 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Квітень || 2 000 || 8 000 || 112 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Травень || 2 000 || 10 000 || 110 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Червень || 2 000 || 12 000 || 108 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Липень || 2 000 || 14 000 || 106 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Серпень || 2 000 || 16 000 || 104 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Вересень || 2 000 || 18 000 || 102 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Жовтень || 2 000 || 20 000 || 100 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Листопад || 2 000 || 22 000 || 98 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Грудень || 2 000 || 24 000 || 96 000&lt;br /&gt;
|- style=&amp;quot;background:#DCE6F1; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за рік || 24 000 || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; за прямолінійним, зменшення залишкової, прискореного зменшення та кумулятивним методами місячна сума &#039;&#039;&#039;в межах одного року незмінна&#039;&#039;&#039; (річна ділиться на 12); різниця між ними видно лише &#039;&#039;&#039;рік до року&#039;&#039;&#039;. Реальну помісячну варіацію дає &#039;&#039;&#039;виробничий метод&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Приклад 2. Виробничий метод ==&lt;br /&gt;
&lt;br /&gt;
Загальний розрахунковий обсяг продукції — 240 000 од. Виробнича ставка = 120 000 / 240 000 = &#039;&#039;&#039;0,5 грн/од.&#039;&#039;&#039; Проводка: &#039;&#039;&#039;Дт 23 – Кт 131&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Виробничий метод — 2025 рік&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Місяць&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Обсяг, од.&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Ставка, грн/од.&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Накопичена, грн&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Січень || 1 800 || 0,5 || 900 || 900 || 119 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Лютий || 2 000 || 0,5 || 1 000 || 1 900 || 118 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Березень || 2 200 || 0,5 || 1 100 || 3 000 || 117 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Квітень || 1 500 || 0,5 || 750 || 3 750 || 116 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Травень || 2 500 || 0,5 || 1 250 || 5 000 || 115 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Червень || 3 000 || 0,5 || 1 500 || 6 500 || 113 500&lt;br /&gt;
|- style=&amp;quot;background:#FFF3CD;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Липень (ремонт)&#039;&#039;&#039; || 0 || 0,5 ||&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B8%D1%85_%D0%B7%D0%B0%D1%81%D0%BE%D0%B1%D1%96%D0%B2,_%D0%B7%D0%B3%D1%96%D0%B4%D0%BD%D0%BE_%D1%83%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D0%BE%D0%B4%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%B0&amp;diff=2740</id>
		<title>Приклад розрахунків основних засобів, згідно українського законодавства</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B8%D1%85_%D0%B7%D0%B0%D1%81%D0%BE%D0%B1%D1%96%D0%B2,_%D0%B7%D0%B3%D1%96%D0%B4%D0%BD%D0%BE_%D1%83%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D0%BE%D0%B4%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%B0&amp;diff=2740"/>
		<updated>2026-07-14T11:54:48Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Нарахування амортизації основних засобів (приклад із помісячним розрахунком) ==&lt;br /&gt;
&lt;br /&gt;
=== Нормативна база ===&lt;br /&gt;
&lt;br /&gt;
Бухгалтерський облік регулює &#039;&#039;&#039;НП(С)БО 7 «Основні засоби»&#039;&#039;&#039;, податковий — &#039;&#039;&#039;ст. 138 Податкового кодексу України&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Амортизація нараховується &#039;&#039;&#039;щомісячно&#039;&#039;&#039;, починаючи з місяця, &#039;&#039;&#039;наступного за місяцем&#039;&#039;&#039;, у якому об&#039;єкт став придатним для використання (п. 29 НП(С)БО 7).&lt;br /&gt;
* НП(С)БО 7 передбачає &#039;&#039;&#039;5 методів&#039;&#039;&#039;: прямолінійний, зменшення залишкової вартості, прискореного зменшення залишкової вартості, кумулятивний і виробничий.&lt;br /&gt;
* Для податку на прибуток діють &#039;&#039;&#039;мінімально допустимі строки&#039;&#039;&#039; (пп. 138.3.3 ПКУ). Наприклад, &#039;&#039;&#039;група 4 (машини та обладнання) — 5 років&#039;&#039;&#039; (для ЕОМ у складі групи — 2 роки).&lt;br /&gt;
* Якщо бухгалтерський строк менший за мінімальний податковий — для податку беруть &#039;&#039;&#039;податковий мінімум&#039;&#039;&#039;.&lt;br /&gt;
* Виробничий метод для податкової амортизації &#039;&#039;&#039;дозволений з 23.05.2020&#039;&#039;&#039; (Закон № 466-IX); при його застосуванні мінімально допустимі строки &#039;&#039;&#039;не застосовуються&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Вихідні дані прикладу ===&lt;br /&gt;
&lt;br /&gt;
Обладнання (група 4): первісна вартість &#039;&#039;&#039;120 000 грн&#039;&#039;&#039;, ліквідаційна вартість &#039;&#039;&#039;0&#039;&#039;&#039;, строк корисного використання &#039;&#039;&#039;5 років&#039;&#039;&#039;, введено в експлуатацію у &#039;&#039;&#039;грудні 2024 р.&#039;&#039;&#039; → амортизація нараховується &#039;&#039;&#039;з січня 2025 р.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Приклад 1. Прямолінійний метод ===&lt;br /&gt;
&lt;br /&gt;
Річна сума = (120 000 − 0) / 5 = &#039;&#039;&#039;24 000 грн&#039;&#039;&#039;; місячна = 24 000 / 12 = &#039;&#039;&#039;2 000 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Проводка щомісяця (адмінобладнання): &#039;&#039;&#039;Дт 92 – Кт 131 = 2 000 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Прямолінійний метод — 2025 рік&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Місяць 2025&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Накопичена аморт. (Кт 131), грн&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Січень || 2 000 || 2 000 || 118 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Лютий || 2 000 || 4 000 || 116 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Березень || 2 000 || 6 000 || 114 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Квітень || 2 000 || 8 000 || 112 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Травень || 2 000 || 10 000 || 110 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Червень || 2 000 || 12 000 || 108 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Липень || 2 000 || 14 000 || 106 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Серпень || 2 000 || 16 000 || 104 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Вересень || 2 000 || 18 000 || 102 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Жовтень || 2 000 || 20 000 || 100 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Листопад || 2 000 || 22 000 || 98 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Грудень || 2 000 || 24 000 || 96 000&lt;br /&gt;
|- style=&amp;quot;background:#DCE6F1; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за рік || 24 000 || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; за прямолінійним, кумулятивним і методами зменшення залишкової вартості місячна сума &#039;&#039;&#039;в межах одного року незмінна&#039;&#039;&#039; (річна ділиться на 12) і змінюється лише рік до року. Реальну помісячну варіацію дає &#039;&#039;&#039;виробничий метод&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Приклад 2. Виробничий метод ===&lt;br /&gt;
&lt;br /&gt;
Загальний розрахунковий обсяг продукції — 240 000 од. Виробнича ставка = 120 000 / 240 000 = &#039;&#039;&#039;0,5 грн/од.&#039;&#039;&#039; Проводка: &#039;&#039;&#039;Дт 23 – Кт 131&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Виробничий метод — 2025 рік&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Місяць 2025&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Обсяг, од.&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Ставка, грн/од.&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Накопичена, грн&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Січень || 1 800 || 0,5 || 900 || 900 || 119 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Лютий || 2 000 || 0,5 || 1 000 || 1 900 || 118 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Березень || 2 200 || 0,5 || 1 100 || 3 000 || 117 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Квітень || 1 500 || 0,5 || 750 || 3 750 || 116 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Травень || 2 500 || 0,5 || 1 250 || 5 000 || 115 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Червень || 3 000 || 0,5 || 1 500 || 6 500 || 113 500&lt;br /&gt;
|- style=&amp;quot;background:#FFF3CD;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Липень (ремонт)&#039;&#039;&#039; || 0 || 0,5 || &#039;&#039;&#039;0&#039;&#039;&#039; || 6 500 || 113 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Серпень || 2 800 || 0,5 || 1 400 || 7 900 || 112 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Вересень || 2 600 || 0,5 || 1 300 || 9 200 || 110 800&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Жовтень || 2 400 || 0,5 || 1 200 || 10 400 || 109 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Листопад || 2 000 || 0,5 || 1 000 || 11 400 || 108 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Грудень || 1 700 || 0,5 || 850 || 12 250 || 107 750&lt;br /&gt;
|- style=&amp;quot;background:#D4EDDA; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом || 24 500 || — || 12 250 || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
У липні під час ремонту випуску не було, тому амортизація за місяць &#039;&#039;&#039;дорівнює 0&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Решта методів амортизації (той самий об&#039;єкт) ==&lt;br /&gt;
&lt;br /&gt;
Вихідні дані ті самі: первісна вартість &#039;&#039;&#039;120 000 грн&#039;&#039;&#039;, строк &#039;&#039;&#039;5 років&#039;&#039;&#039;, амортизація з &#039;&#039;&#039;січня 2025 р.&#039;&#039;&#039;&lt;br /&gt;
Примітка: метод зменшення залишкової вартості &#039;&#039;&#039;математично вимагає ліквідаційної вартості &amp;gt; 0&#039;&#039;&#039; (інакше норма = 100 %), тому для нього прийнято &#039;&#039;&#039;ліквідаційну вартість 3 750 грн&#039;&#039;&#039;; для інших методів вона = 0.&lt;br /&gt;
&lt;br /&gt;
=== Метод 3. Зменшення залишкової вартості ===&lt;br /&gt;
&lt;br /&gt;
Річна норма: На = 1 − ⁵√(3 750 / 120 000) = &#039;&#039;&#039;50 %&#039;&#039;&#039;. Річна сума = залишкова вартість на початок року × 50 %.&lt;br /&gt;
Рік 1: 120 000 × 50 % = 60 000 грн → місячна = &#039;&#039;&#039;5 000 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Зменшення залишкової вартості — 1-й рік&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#6A1B9A; color:white;&amp;quot; | Місяць&lt;br /&gt;
! style=&amp;quot;background:#6A1B9A; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#6A1B9A; color:white;&amp;quot; | Накопичена, грн&lt;br /&gt;
! style=&amp;quot;background:#6A1B9A; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Січень || 5 000 || 5 000 || 115 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Лютий || 5 000 || 10 000 || 110 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Березень || 5 000 || 15 000 || 105 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Квітень || 5 000 || 20 000 || 100 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Травень || 5 000 || 25 000 || 95 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Червень || 5 000 || 30 000 || 90 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Липень || 5 000 || 35 000 || 85 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Серпень || 5 000 || 40 000 || 80 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Вересень || 5 000 || 45 000 || 75 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Жовтень || 5 000 || 50 000 || 70 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Листопад || 5 000 || 55 000 || 65 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Грудень || 5 000 || 60 000 || 60 000&lt;br /&gt;
|- style=&amp;quot;background:#E1BEE7; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за рік || 60 000 || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Метод 4. Прискореного зменшення залишкової вартості ===&lt;br /&gt;
&lt;br /&gt;
Річна норма = (100 % / 5) × 2 = &#039;&#039;&#039;40 %&#039;&#039;&#039; (ліквідаційна вартість у нормі не враховується).&lt;br /&gt;
Рік 1: 120 000 × 40 % = 48 000 грн → місячна = &#039;&#039;&#039;4 000 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Прискореного зменшення — 1-й рік&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#E65100; color:white;&amp;quot; | Місяць&lt;br /&gt;
! style=&amp;quot;background:#E65100; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#E65100; color:white;&amp;quot; | Накопичена, грн&lt;br /&gt;
! style=&amp;quot;background:#E65100; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Січень || 4 000 || 4 000 || 116 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Лютий || 4 000 || 8 000 || 112 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Березень || 4 000 || 12 000 || 108 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Квітень || 4 000 || 16 000 || 104 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Травень || 4 000 || 20 000 || 100 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Червень || 4 000 || 24 000 || 96 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Липень || 4 000 || 28 000 || 92 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Серпень || 4 000 || 32 000 || 88 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Вересень || 4 000 || 36 000 || 84 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Жовтень || 4 000 || 40 000 || 80 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Листопад || 4 000 || 44 000 || 76 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Грудень || 4 000 || 48 000 || 72 000&lt;br /&gt;
|- style=&amp;quot;background:#FFE0B2; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за рік || 48 000 || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Метод 5. Кумулятивний ===&lt;br /&gt;
&lt;br /&gt;
Сума чисел років = 1+2+3+4+5 = &#039;&#039;&#039;15&#039;&#039;&#039;. Кумулятивний коефіцієнт року 1 = 5/15.&lt;br /&gt;
Річна сума = 120 000 × 5/15 = 40 000 грн → місячна ≈ &#039;&#039;&#039;3 333,33 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Кумулятивний — 1-й рік&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#00695C; color:white;&amp;quot; | Місяць&lt;br /&gt;
! style=&amp;quot;background:#00695C; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#00695C; color:white;&amp;quot; | Накопичена, грн&lt;br /&gt;
! style=&amp;quot;background:#00695C; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Січень || 3 333,33 || 3 333,33 || 116 666,67&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Лютий || 3 333,33 || 6 666,67 || 113 333,33&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Березень || 3 333,33 || 10 000,00 || 110 000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Квітень || 3 333,33 || 13 333,33 || 106 666,67&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Травень || 3 333,33 || 16 666,67 || 103 333,33&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Червень || 3 333,33 || 20 000,00 || 100 000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Липень || 3 333,33 || 23 333,33 || 96 666,67&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Серпень || 3 333,33 || 26 666,67 || 93 333,33&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Вересень || 3 333,33 || 30 000,00 || 90 000,00&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Жовтень || 3 333,33 || 33 333,33 || 86 666,67&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Листопад || 3 333,33 || 36 666,67 || 83 333,33&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Грудень || 3 333,33 || 40 000,00 || 80 000,00&lt;br /&gt;
|- style=&amp;quot;background:#B2DFDB; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за рік || 40 000 || — || —&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;small&amp;gt;* грудень враховує заокруглення, тому річна сума точно = 40 000 грн.&amp;lt;/small&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Зведене порівняння методів (річна амортизація за 5 років) ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Річна сума амортизації за методами, грн&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white; text-align:left;&amp;quot; | Метод&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | Місяць (рік 1)&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | Рік 1&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | Рік 2&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | Рік 3&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | Рік 4&lt;br /&gt;
! style=&amp;quot;background:#37474F; color:white;&amp;quot; | Рік 5&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Прямолінійний&#039;&#039;&#039; || 2 000,00 || 24 000 || 24 000 || 24 000 || 24 000 || 24 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Зменшення залишкової вартості&#039;&#039;&#039;* || 5 000,00 || 60 000 || 30 000 || 15 000 || 7 500 || 3 750&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Прискореного зменшення&#039;&#039;&#039; || 4 000,00 || 48 000 || 28 800 || 17 280 || 10 368 || 15 552**&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Кумулятивний&#039;&#039;&#039; || 3 333,33 || 40 000 || 32 000 || 24 000 || 16 000 || 8 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Виробничий&#039;&#039;&#039; || змінна || \multicolumn{5}{c|}{залежить від обсягу випуску щомісяця}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;small&amp;gt;* ліквідаційна вартість 3 750 грн (для решти = 0), тому база амортизації = 116 250 грн.&amp;lt;br&amp;gt;&lt;br /&gt;
** у 5-му році списується &#039;&#039;&#039;весь залишок&#039;&#039;&#039; до ліквідаційної вартості (0), тому сума більша за 4-й рік.&amp;lt;/small&amp;gt;&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B8%D1%85_%D0%B7%D0%B0%D1%81%D0%BE%D0%B1%D1%96%D0%B2,_%D0%B7%D0%B3%D1%96%D0%B4%D0%BD%D0%BE_%D1%83%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D0%BE%D0%B4%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%B0&amp;diff=2739</id>
		<title>Приклад розрахунків основних засобів, згідно українського законодавства</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2_%D0%BE%D1%81%D0%BD%D0%BE%D0%B2%D0%BD%D0%B8%D1%85_%D0%B7%D0%B0%D1%81%D0%BE%D0%B1%D1%96%D0%B2,_%D0%B7%D0%B3%D1%96%D0%B4%D0%BD%D0%BE_%D1%83%D0%BA%D1%80%D0%B0%D1%97%D0%BD%D1%81%D1%8C%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%BA%D0%BE%D0%BD%D0%BE%D0%B4%D0%B0%D0%B2%D1%81%D1%82%D0%B2%D0%B0&amp;diff=2739"/>
		<updated>2026-07-14T11:47:10Z</updated>

		<summary type="html">&lt;p&gt;R: Створена сторінка: == Нарахування амортизації основних засобів (приклад із помісячним розрахунком) ==  === Нормативна база ===  Бухгалтерський облік регулює &amp;#039;&amp;#039;&amp;#039;НП(С)БО 7 «Основні засоби»&amp;#039;&amp;#039;&amp;#039;, податковий — &amp;#039;&amp;#039;&amp;#039;ст. 138 Податкового кодексу України&amp;#039;&amp;#039;&amp;#039;.  * Амортизація нараховується &amp;#039;&amp;#039;&amp;#039;щоміс...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Нарахування амортизації основних засобів (приклад із помісячним розрахунком) ==&lt;br /&gt;
&lt;br /&gt;
=== Нормативна база ===&lt;br /&gt;
&lt;br /&gt;
Бухгалтерський облік регулює &#039;&#039;&#039;НП(С)БО 7 «Основні засоби»&#039;&#039;&#039;, податковий — &#039;&#039;&#039;ст. 138 Податкового кодексу України&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
* Амортизація нараховується &#039;&#039;&#039;щомісячно&#039;&#039;&#039;, починаючи з місяця, &#039;&#039;&#039;наступного за місяцем&#039;&#039;&#039;, у якому об&#039;єкт став придатним для використання (п. 29 НП(С)БО 7).&lt;br /&gt;
* НП(С)БО 7 передбачає &#039;&#039;&#039;5 методів&#039;&#039;&#039;: прямолінійний, зменшення залишкової вартості, прискореного зменшення залишкової вартості, кумулятивний і виробничий.&lt;br /&gt;
* Для податку на прибуток діють &#039;&#039;&#039;мінімально допустимі строки&#039;&#039;&#039; (пп. 138.3.3 ПКУ). Наприклад, &#039;&#039;&#039;група 4 (машини та обладнання) — 5 років&#039;&#039;&#039; (для ЕОМ у складі групи — 2 роки).&lt;br /&gt;
* Якщо бухгалтерський строк менший за мінімальний податковий — для податку беруть &#039;&#039;&#039;податковий мінімум&#039;&#039;&#039;.&lt;br /&gt;
* Виробничий метод для податкової амортизації &#039;&#039;&#039;дозволений з 23.05.2020&#039;&#039;&#039; (Закон № 466-IX); при його застосуванні мінімально допустимі строки &#039;&#039;&#039;не застосовуються&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Вихідні дані прикладу ===&lt;br /&gt;
&lt;br /&gt;
Обладнання (група 4): первісна вартість &#039;&#039;&#039;120 000 грн&#039;&#039;&#039;, ліквідаційна вартість &#039;&#039;&#039;0&#039;&#039;&#039;, строк корисного використання &#039;&#039;&#039;5 років&#039;&#039;&#039;, введено в експлуатацію у &#039;&#039;&#039;грудні 2024 р.&#039;&#039;&#039; → амортизація нараховується &#039;&#039;&#039;з січня 2025 р.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Приклад 1. Прямолінійний метод ===&lt;br /&gt;
&lt;br /&gt;
Річна сума = (120 000 − 0) / 5 = &#039;&#039;&#039;24 000 грн&#039;&#039;&#039;; місячна = 24 000 / 12 = &#039;&#039;&#039;2 000 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Проводка щомісяця (адмінобладнання): &#039;&#039;&#039;Дт 92 – Кт 131 = 2 000 грн&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Прямолінійний метод — 2025 рік&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Місяць 2025&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Накопичена аморт. (Кт 131), грн&lt;br /&gt;
! style=&amp;quot;background:#2E5B9E; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Січень || 2 000 || 2 000 || 118 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Лютий || 2 000 || 4 000 || 116 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Березень || 2 000 || 6 000 || 114 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Квітень || 2 000 || 8 000 || 112 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Травень || 2 000 || 10 000 || 110 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Червень || 2 000 || 12 000 || 108 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Липень || 2 000 || 14 000 || 106 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Серпень || 2 000 || 16 000 || 104 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Вересень || 2 000 || 18 000 || 102 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Жовтень || 2 000 || 20 000 || 100 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Листопад || 2 000 || 22 000 || 98 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Грудень || 2 000 || 24 000 || 96 000&lt;br /&gt;
|- style=&amp;quot;background:#DCE6F1; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом за рік || 24 000 || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; за прямолінійним, кумулятивним і методами зменшення залишкової вартості місячна сума &#039;&#039;&#039;в межах одного року незмінна&#039;&#039;&#039; (річна ділиться на 12) і змінюється лише рік до року. Реальну помісячну варіацію дає &#039;&#039;&#039;виробничий метод&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=== Приклад 2. Виробничий метод ===&lt;br /&gt;
&lt;br /&gt;
Загальний розрахунковий обсяг продукції — 240 000 од. Виробнича ставка = 120 000 / 240 000 = &#039;&#039;&#039;0,5 грн/од.&#039;&#039;&#039; Проводка: &#039;&#039;&#039;Дт 23 – Кт 131&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:right;&amp;quot;&lt;br /&gt;
|+ &#039;&#039;&#039;Виробничий метод — 2025 рік&#039;&#039;&#039;&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Місяць 2025&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Обсяг, од.&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Ставка, грн/од.&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Амортизація за місяць, грн&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Накопичена, грн&lt;br /&gt;
! style=&amp;quot;background:#2E7D32; color:white;&amp;quot; | Залишкова вартість, грн&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Січень || 1 800 || 0,5 || 900 || 900 || 119 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Лютий || 2 000 || 0,5 || 1 000 || 1 900 || 118 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Березень || 2 200 || 0,5 || 1 100 || 3 000 || 117 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Квітень || 1 500 || 0,5 || 750 || 3 750 || 116 250&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Травень || 2 500 || 0,5 || 1 250 || 5 000 || 115 000&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Червень || 3 000 || 0,5 || 1 500 || 6 500 || 113 500&lt;br /&gt;
|- style=&amp;quot;background:#FFF3CD;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | &#039;&#039;&#039;Липень (ремонт)&#039;&#039;&#039; || 0 || 0,5 || &#039;&#039;&#039;0&#039;&#039;&#039; || 6 500 || 113 500&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Серпень || 2 800 || 0,5 || 1 400 || 7 900 || 112 100&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Вересень || 2 600 || 0,5 || 1 300 || 9 200 || 110 800&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Жовтень || 2 400 || 0,5 || 1 200 || 10 400 || 109 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Листопад || 2 000 || 0,5 || 1 000 || 11 400 || 108 600&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Грудень || 1 700 || 0,5 || 850 || 12 250 || 107 750&lt;br /&gt;
|- style=&amp;quot;background:#D4EDDA; font-weight:bold;&amp;quot;&lt;br /&gt;
| style=&amp;quot;text-align:left;&amp;quot; | Разом || 24 500 || — || 12 250 || — || —&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
У липні під час ремонту випуску не було, тому амортизація за місяць &#039;&#039;&#039;дорівнює 0&#039;&#039;&#039;.&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2&amp;diff=2738</id>
		<title>Приклади розрахунків</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2&amp;diff=2738"/>
		<updated>2026-07-14T11:47:01Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Основні засоби ==&lt;br /&gt;
[[Приклад розрахунків основних засобів, згідно українського законодавства]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2&amp;diff=2737</id>
		<title>Приклади розрахунків</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%80%D0%BE%D0%B7%D1%80%D0%B0%D1%85%D1%83%D0%BD%D0%BA%D1%96%D0%B2&amp;diff=2737"/>
		<updated>2026-07-14T11:46:18Z</updated>

		<summary type="html">&lt;p&gt;R: Створена сторінка: ыыы&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;ыыы&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0&amp;diff=2736</id>
		<title>Головна сторінка</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0&amp;diff=2736"/>
		<updated>2026-07-14T11:45:57Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Wiki k2erp.png|центр|міні|800x800пкс|Wiki K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Про систему K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP]] — це комплексна система управління підприємством, яка об’єднує фінанси, бухгалтерію, продажі, склад, закупівлі, документообіг, CRM, аналітику та галузеві модулі в єдиному цифровому середовищі. Система допомагає автоматизувати щоденні процеси, зменшити ручну роботу й кількість помилок, контролювати ресурси в реальному часі, швидше обробляти заявки та документи, бачити повну картину бізнесу й приймати точні управлінські рішення на основі актуальних даних. Завдяки модульності, хмарному доступу та гнучкому налаштуванню K2 ERP підходить для компаній різного масштабу й допомагає бізнесу працювати прозоріше, ефективніше та впевнено масштабуватися.&lt;br /&gt;
&lt;br /&gt;
Подробно про систему читайте в статті: [[K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Відмова від 1С та BAS під ключ: перехід неминучий — питання лише в тому, хто встигне зробити його планово]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP — реальна альтернатива 1С та BAS? Бо міняти російське ПЗ на “майже те саме” — це вже не стратегія, а бізнесовий мазохізм]]&lt;br /&gt;
&lt;br /&gt;
[[ERP нового покоління: чому власна платформа K2 ERP на Python і TypeScript сильніша за спадщину 1С/BAS та важкі enterprise-рішення]]&lt;br /&gt;
&lt;br /&gt;
[[Короткі відео про роботу в K2 ERP: українська ERP, яку можна побачити в дії]]&lt;br /&gt;
&lt;br /&gt;
[[Ознайомче відео про K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Альтернатива 1С: якою вона повинна бути насправді]]&lt;br /&gt;
&lt;br /&gt;
[[Робимо бізнес разом!]]&lt;br /&gt;
&lt;br /&gt;
[[Не витрачайте роки та гроші на ERP з нуля. Об’єднуймося навколо K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Лавинний розвиток K2 ERP: чому відкрита українська ERP-система розвивається швидше за старий світ 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP йде шляхом швидкої розробки, моделей, конструкторів і об’єднання даних]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP розвиває власну систему, а не Odoo, IT-Enterprise чи SAP]]&lt;br /&gt;
&lt;br /&gt;
[[Візитка K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Хто ваш клієнт, K2?]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP відкрила безкоштовну хмару для українського бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Інструменти розробника K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Програмування зі швидкістю думки]]&lt;br /&gt;
&lt;br /&gt;
[[Чим відрізняється робота в cloud.corp2.eu від власної хмари]]&lt;br /&gt;
&lt;br /&gt;
[[Розробка K2 ERP на замовлення як правильний перехід з 1С та BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Продуктова компанія, інтегратор чи гібридна модель K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Нові можливості K2 ERP: коли система розвивається з параболічною швидкістю (травень 2026)]]&lt;br /&gt;
&lt;br /&gt;
[[Можливості K2 ERP — травень 2026]]&lt;br /&gt;
&lt;br /&gt;
[[Новий модуль «Зарплата та кадри» в K2 ERP: коли зарплата рахується, кадри не губляться, а бухгалтер більше не живе в Excel]]&lt;br /&gt;
&lt;br /&gt;
[[Виробництво без хаосу: як модуль «Виробництво» в K2 ERP веде виріб від специфікації до готової продукції]]&lt;br /&gt;
&lt;br /&gt;
== Вартість K2 ERP ==&lt;br /&gt;
[[Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії]]&lt;br /&gt;
&lt;br /&gt;
== Перехід з 1С та BAS на K2 ERP ==&lt;br /&gt;
[[Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка]]&lt;br /&gt;
&lt;br /&gt;
== Стандартизація ==&lt;br /&gt;
[[ISO 9001 Scrum регламент K2 ERP: система якості, тижневі спринти, Zoom-записи, VDoc і Telegram-комунікації|ISO 9001 + Scrum + регламент K2 ERP: система якості, тижневі спринти, Zoom-записи, VDoc і Telegram-комунікації]]&lt;br /&gt;
&lt;br /&gt;
== Акції та пропозиції ==&lt;br /&gt;
[[Навчайте студентів працювати з українською ERP-системою K2 ERP — альтернативою 1С та BAS]]&lt;br /&gt;
&lt;br /&gt;
== Вакансії ==&lt;br /&gt;
[[Python-програмісти, які хочуть працювати з K2 ERP: не чекайте “колись”. Починайте зараз]]&lt;br /&gt;
&lt;br /&gt;
== Історія про K2 ERP ==&lt;br /&gt;
[[Звідки взявся K2® ERP]]&lt;br /&gt;
&lt;br /&gt;
== Сайти K2 ERP ==&lt;br /&gt;
[[Ресурси K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Комунікація з K2 ERP ==&lt;br /&gt;
[[Регламент K2]]&lt;br /&gt;
&lt;br /&gt;
[[Звернення через HelpDesk]]&lt;br /&gt;
&lt;br /&gt;
== Концептуальні підходи та принципи роботи ==&lt;br /&gt;
[[Кількість ліцензій BAS проти безліміту K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Концепція передпродажних модулів K2 ERP: як малими внесками перемагати великі системи]]&lt;br /&gt;
&lt;br /&gt;
[[Магія єдиної системи: чому модульний підхід K2 ERP у рази, десятки разів і навіть на порядки ефективніший за 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[AI в K2 ERP: коли облік перестає бути нудним, а бізнес починає дихати на повні груди]]&lt;br /&gt;
&lt;br /&gt;
[[Чи є ризик залежності від одного підрядника при автоматизації бізнесу?]]&lt;br /&gt;
&lt;br /&gt;
[[Другий раз платити за той самий “зоопарк” ніхто не хоче: чому перехід з 1С на K2 ERP — це не про нову кастомізацію, а про нову логіку бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Чому “олдскульні” гриди насправді рятують бізнес: краса інтерфейсу не дорівнює силі продукту]]&lt;br /&gt;
&lt;br /&gt;
[[Крос-платформеність: та сама “дрібниця”, на якій великі компанії щороку залишають купу грошей]]&lt;br /&gt;
&lt;br /&gt;
== Пояснення термінів ==&lt;br /&gt;
&lt;br /&gt;
[[Що таке ERP — і чому справжня ERP-система починається там, де закінчується звичка зводити бізнес до бухгалтерії]]&lt;br /&gt;
&lt;br /&gt;
[[Що таке CRM і чому її інтеграція з ERP відкриває нові можливості для бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[CMS у K2 ERP: сайт компанії, який не просто “висить в інтернеті”, а працює на бізнес]]&lt;br /&gt;
&lt;br /&gt;
[[Інтернет-магазин у K2 ERP: коли онлайн-продажі стають частиною єдиної системи, а не окремим головним болем]]&lt;br /&gt;
&lt;br /&gt;
== Для користувачів ==&lt;br /&gt;
&lt;br /&gt;
[[Початок роботи з K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Звіти в K2 Cloud ERP|Звіти в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[CRM Файли в K2 ERP|CRM + Файли в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Повне відео демонстрації K2 ERP доступне з оригінальним голосом інтерфейсу та реального показу роботи системи]]&lt;br /&gt;
&lt;br /&gt;
[[Хмара K2 ERP для безкоштовної реальної роботи]] &lt;br /&gt;
&lt;br /&gt;
[[Управлінський облік K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Бухгалтерія K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[CRM K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Складський облік K2 ERP (WMS)]]&lt;br /&gt;
&lt;br /&gt;
[[CMS K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Інтернет-магазин K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 VDoc]]&lt;br /&gt;
&lt;br /&gt;
[[Галузеві рішення K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Звіти та аналітика K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Поширені питання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Використання штучного інтелекту в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Для адміністраторів K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Для адміністраторів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор хмари K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор гілки K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор проєкту K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Користувачі та ролі K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Права доступу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Налаштування інтерфейсу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Друковані форми K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Кастомізація звітів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Контроль і аудит K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Для програмістів ==&lt;br /&gt;
&lt;br /&gt;
[[Розгортання системи K2 ERP Python для розробників]]&lt;br /&gt;
&lt;br /&gt;
[[Архітектура K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Встановлення K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Розгортання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Створення модулів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[База даних K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[API K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Інтеграції K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 CMS]]&lt;br /&gt;
&lt;br /&gt;
[[Розробка веб-інтерфейсів K2]]&lt;br /&gt;
&lt;br /&gt;
[[Бізнес-процеси K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Права доступу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Рекомендації для розробників K2]]&lt;br /&gt;
&lt;br /&gt;
[[Класи та команди K2 ERP Python]]&lt;br /&gt;
&lt;br /&gt;
[[Стандарти UI K2 2025]]&lt;br /&gt;
&lt;br /&gt;
== Атестаційні завдання по K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Атестаційні завдання по K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== K2 ERP PHP ==&lt;br /&gt;
&lt;br /&gt;
[[Практична робота в K2 ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
[[Інструкція по розгортанню K2 ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
[[Класи та команди K2 Cloud ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
== Довідник та модулі системи K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
== Комплексні рішення K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP технологічна платформа]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Управлінський облік]]&lt;br /&gt;
&lt;br /&gt;
== Модулі K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 Ядро]]&lt;br /&gt;
&lt;br /&gt;
[[K2 CMS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Інтернет-магазин]]&lt;br /&gt;
&lt;br /&gt;
[[К2 CRM]]&lt;br /&gt;
&lt;br /&gt;
[[К2 WMS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 VDoc (Електронний документообіг)]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Система online-навчання]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Документообіг]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Дошка оголошень]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Портал творів мистецтва]]&lt;br /&gt;
&lt;br /&gt;
[[К2 ТОІР та облік запчастин]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Update]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Фінансовий облік]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Каса]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Ресторан]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Готель]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Зарплата та кадри]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Виробництво]]&lt;br /&gt;
&lt;br /&gt;
[[K2 multi-GAAP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 HelpDesk]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Мобільний додаток Android]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Мобільний додаток IOS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Стоматологічна клініка]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Салон краси]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Бронювання послуг]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Автоперевезення]]&lt;br /&gt;
&lt;br /&gt;
== Інтеграційні модулі K2 ERP ==&lt;br /&gt;
[[K2 Модуль Медок]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Вчасно]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Птах]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Мурашина логістика]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль GPS-трекінг]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Вчасно Каса]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Ringostat до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Нова пошта]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Укрпошта]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Телеграм бот до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Whatsapp бот до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Turbosms до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Email до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Hurma]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль обмінів з банками]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Horoshop]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Rozetka]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Prom]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Hotline]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль ДПС]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Приватбанк]]&lt;br /&gt;
&lt;br /&gt;
[[Модуль Edin]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Liqpay для інтернет-магазину]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Wayforpay для інтернет-магазину]]&lt;br /&gt;
&lt;br /&gt;
== Інструментальні модулі K2 ERP ==&lt;br /&gt;
[[K2 Конструктор структури бази даних]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Конструктор звітів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Конструктор BI звітів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Реплікатор]]&lt;br /&gt;
&lt;br /&gt;
[[IDE в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Десктопні додатки ==&lt;br /&gt;
[[K2 Cloud ERP: Десктопний додаток для Linux, Windows та macOS — швидка робота з хмарами без хаосу вкладок]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Desktop — коли потужність розробки перетворюється на зручний інструмент]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Cloud ERP Desktop: один додаток замість десятків вкладок, ярликів і “вічного пошуку потрібного вікна”]]&lt;br /&gt;
&lt;br /&gt;
== Торгове та перефірійне обладнання ==&lt;br /&gt;
[[РРО та ПРРО]]&lt;br /&gt;
&lt;br /&gt;
== Модулі на PHP ==&lt;br /&gt;
[[Mantis BT K2]]&lt;br /&gt;
&lt;br /&gt;
== Робота в K2 ==&lt;br /&gt;
[[Налаштування WireGuard]]&lt;br /&gt;
&lt;br /&gt;
[[Веб-Пошта]]&lt;br /&gt;
&lt;br /&gt;
== Навігація за категоріями ==&lt;br /&gt;
Усі статті бази знань автоматично групуються за категоріями:&lt;br /&gt;
&lt;br /&gt;
* [[:Категорія:ERP-системи|ERP-системи]]&lt;br /&gt;
* [[:Категорія:Програмне забезпечення, розроблене в Україні|Українське ПЗ]]&lt;br /&gt;
* [[:Категорія:Програмне забезпечення для бізнесу|ПЗ для бізнесу]]&lt;br /&gt;
&lt;br /&gt;
== Порівняння систем ==&lt;br /&gt;
&lt;br /&gt;
[[Чим K2 ERP краще за 1С/BAS, Парус/Афіна, Бітрікс, BIMP, A5 та інші ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs BAS ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs BAS Управління торгівлею (UT)]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Парус-Підприємство]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs SAP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Microsoft Dynamics 365]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Oracle NetSuite]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Odoo]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Scoro]]&lt;br /&gt;
&lt;br /&gt;
== Партнерство ==&lt;br /&gt;
[[Умови партнерства]]&lt;br /&gt;
&lt;br /&gt;
[[Партнери K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Кейси K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Кейс: як ми посилили ТОІР транспорту Нової пошти та цифровізували облік ремонтів і деталей для Kamag]]&lt;br /&gt;
&lt;br /&gt;
== Статті по IT ==&lt;br /&gt;
&lt;br /&gt;
[[Скільки реально коштують “дешеві” ліцензії Odoo, Microsoft Dynamics і SAP у порівнянні з K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Україна має виростити власні продуктові IT-компанії. Інакше за нас це зроблять чужі]]&lt;br /&gt;
&lt;br /&gt;
[[Смерть під ковдрою ілюзій: Чому перехід з 1С на BAS у 2026 році — це найдорожчий самообман українського бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[BAS маскувалась під український продукт. А тепер російський K2 Cloud може маскувати K2 під російський? Дивний маскарад брендів триває]]&lt;br /&gt;
&lt;br /&gt;
[[BAS нема чого запропонувати ринку, крім 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Давайте називати все своїми іменами: 1С, а не BAS. Говоріть завжди 1С, не йдіть на поводу ребрендіга 1С!]]&lt;br /&gt;
&lt;br /&gt;
[[Пастка SaaS-систем]]&lt;br /&gt;
&lt;br /&gt;
[[BAS стає токсичним — чому українському бізнесу час відмовитися від 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Росія виграє. 12:0 на користь росії]]&lt;br /&gt;
&lt;br /&gt;
[[BAS у вишиванці, або 1С, яка сходила на ребрендинг]]&lt;br /&gt;
&lt;br /&gt;
[[1С нагадує наші технології 20-річної давнини. Ба, це і є технології тих часів]]&lt;br /&gt;
&lt;br /&gt;
[[BAS — це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS та іншому ворожому софту — капут]]&lt;br /&gt;
&lt;br /&gt;
[[Еволюція веде до революції]]&lt;br /&gt;
&lt;br /&gt;
[[Чому українські ERP досі не витіснили 1С та BAS з ринку України за 12 років війни]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: 30 років російського запору в українському бізнесі]]&lt;br /&gt;
&lt;br /&gt;
[[Гібридний трактор Lamborghini і гібридна ERP K2: як українська технологія може змінити ринок автоматизації]]&lt;br /&gt;
&lt;br /&gt;
[[Як російські ERP-системи змінили прапор, але не змінили код]]&lt;br /&gt;
&lt;br /&gt;
[[Кому “заборонено” 1С та BAS?]]&lt;br /&gt;
&lt;br /&gt;
[[BASкетбол з санкціями: як “українська альтернатива 1С” закидає бізнесу рекламні трьохочкові]]&lt;br /&gt;
&lt;br /&gt;
[[BAS, BaaS, BAF — це нова етикетка для старого 1С. Час називати речі своїми іменами]]&lt;br /&gt;
&lt;br /&gt;
[[Як закалявся BAS, або як 1С фарбували на Великдень]]&lt;br /&gt;
&lt;br /&gt;
[[Життя після 1С та BAS: Великий огляд українського ринку ERP-систем та реальних альтернатив у 2026 році]]&lt;br /&gt;
&lt;br /&gt;
[[Відкритий похідний код, Open Source і K2 ERP: коли програмісти відкривають капот, але не віддають ключі від усього автопарку]]&lt;br /&gt;
&lt;br /&gt;
[[Цифрова деокупація та санкції в Україні]]&lt;br /&gt;
&lt;br /&gt;
[[Український бізнес і його токсичні стосунки з 1С/BAS: сміємося, платимо, страждаємо — і далі називаємо це “автоматизацією”]]&lt;br /&gt;
&lt;br /&gt;
[[1С більше не законодавець мод. Тепер тренди створюють українські ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Безкоштовна українська хмара для малого бізнесу: стартуйте сьогодні, зростайте без обмежень]]&lt;br /&gt;
&lt;br /&gt;
[[Не продавати доступ. Продавати свободу: чому майбутнє програмного забезпечення — за відкритими системами з чесною монетизацією]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: софт для країни, де держава не довіряє бізнесу. І саме тому він не потрібен країні, яка хоче бути вільною]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: система, в якій майбутнє давно натиснуло “Вийти без збереження”]]&lt;br /&gt;
&lt;br /&gt;
== Мови програмування, тренди ==&lt;br /&gt;
[[Світ у 2025: які мови «правлять балом»]]&lt;br /&gt;
&lt;br /&gt;
== Технічні завдання K2 ERP ==&lt;br /&gt;
[[Приклади технічного завдання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Приклади розрахунків]]&lt;br /&gt;
&lt;br /&gt;
== Акції K2 ERP ==&lt;br /&gt;
[[Ловіть шару: передпродажний модуль Бухгалтерії та податкового обліку зараз включає CRM, CMS та інтернет-магазин]]&lt;br /&gt;
&lt;br /&gt;
== Інвестиції в K2 ERP ==&lt;br /&gt;
[[Інвестиції в K2 ERP — українську платформу для заміни 1С/BAS та масової автоматизації бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Хто працює в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Використання K2 ERP ==&lt;br /&gt;
[[K2: платформа, після якої старий софт починає нервово шукати валізу]]&lt;br /&gt;
&lt;br /&gt;
[[Новий модуль K2 ERP для контролю звітності: коли сотні клієнтів, десятки дедлайнів і жодного права на ой, забули]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP як український Біткоїн]]&lt;br /&gt;
&lt;br /&gt;
[[Варіанти використання K2 ERP по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[ERP продукти]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP — українська ERP для виробництва, складу, торгівлі, ФОП, агро, логістики та заміни BAS ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Всі ERP терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі бізнес-процеси]]&lt;br /&gt;
&lt;br /&gt;
[[Всі інтеграції]]&lt;br /&gt;
&lt;br /&gt;
[[Всі українські сервіси]]&lt;br /&gt;
&lt;br /&gt;
[[Всі ERP модулі]]&lt;br /&gt;
&lt;br /&gt;
[[BAS / 1С / SAP / Odoo / Dynamics]]&lt;br /&gt;
&lt;br /&gt;
[[Всі 1С конфігурації]]&lt;br /&gt;
&lt;br /&gt;
[[Всі BAS конфігурації]]&lt;br /&gt;
&lt;br /&gt;
[[Всі 1С терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі BAS терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі отраслеві рішення 1С]]&lt;br /&gt;
&lt;br /&gt;
== CRM ==&lt;br /&gt;
[[Варіанти використання K2 ERP CRM по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[CRM продукти]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP CRM - універсальна CRM для виробництва, складу, торговлі, ФОП, інтернет-магазину та заміни Bitrix24, 1C CRM]]&lt;br /&gt;
&lt;br /&gt;
[[Всі терміни CRM]]&lt;br /&gt;
&lt;br /&gt;
== Інтернет-магази ==&lt;br /&gt;
[[Варіанти використання K2 ERP інтернет-магазин по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[Продукти інтернет-магазинів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP Інтернет-магазин - універсальний інтернет-магазин для заміни ShopScript та інших російських рішень]]&lt;br /&gt;
&lt;br /&gt;
[[Всі терміни інтернет-магазинів]]&lt;br /&gt;
&lt;br /&gt;
== Санкції та докази ==&lt;br /&gt;
[[Поглинути 1С, BAS та інший ворожий софт: чому перенесення залишків — це ще не справжня відмова]]&lt;br /&gt;
&lt;br /&gt;
[[Мені соромно за українські ЗМІ — чому медіа мають писати про український софт, K2 ERP та заміну 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Лавочка стала закриватись: 215 продуктів ворожого софту заборонено]]&lt;br /&gt;
&lt;br /&gt;
[[Український бізнес інвестує в російське, бо думає, що українське помре]]&lt;br /&gt;
&lt;br /&gt;
[[Схема мережі 1С, побудованої в Україні під виглядом BAS: коли “ми вже не 1С” звучить як “ми просто змінили табличку на дверях”]]&lt;br /&gt;
&lt;br /&gt;
[[Пертнери BAS - партнери росії]]&lt;br /&gt;
&lt;br /&gt;
[[Скільки грошей 1С намагається “збити” з українського бізнесу через листи щастя]]&lt;br /&gt;
&lt;br /&gt;
[[Не продовжуйте ІТС на BAS. Бо BAS — це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Вали російський бізнес, вали російський софт!]]&lt;br /&gt;
&lt;br /&gt;
[[Програмне забезпечення, яким можна замінити ворожий софт]]&lt;br /&gt;
&lt;br /&gt;
[[Докази, що BAS - це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Список компаній, що розповсюджують BAS, не дивлячись на санкції січня 2026]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр ворожого ПЗ і пов&#039;язаних назв]]&lt;br /&gt;
&lt;br /&gt;
[[Компанії, що почали переходити з ворожого софту]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр компаній, що досі працюють на ворожому софті]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр сервісів, що підтримують інтеграцію з ворожим софтом]]&lt;br /&gt;
&lt;br /&gt;
== Реформи ==&lt;br /&gt;
[[Реформи К2]]&lt;br /&gt;
&lt;br /&gt;
== Wikipedia ==&lt;br /&gt;
[[Різні статті]]&lt;br /&gt;
&lt;br /&gt;
== Книги ==&lt;br /&gt;
[[Архітектура 1С-підприємства]]&lt;br /&gt;
&lt;br /&gt;
[[Архітектура та розробка ERP-систем]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2735</id>
		<title>Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2735"/>
		<updated>2026-07-09T20:49:44Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Заставка 1.png|центр|міні|800x800пкс|Хакнути структуру 1С]]&lt;br /&gt;
&lt;br /&gt;
Коли бізнес говорить про перехід з 1С або BAS на сучасну ERP-систему, часто виникає спокуслива ідея: &#039;&#039;&#039;“А давайте нічого не переносити. Просто підключимо нову систему до старої бази 1С/BAS і будемо працювати далі”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
На перший погляд це виглядає красиво: швидко, дешево, безболісно. Нібито не потрібно переносити довідники, документи, залишки, проводки, регістри, історію операцій. Нібито достатньо зробити новий інтерфейс, під’єднатися до старої бази — і компанія вже працює в “новій системі”.&lt;br /&gt;
&lt;br /&gt;
Але на практиці це приблизно як поставити екран від Tesla в старий “Запорожець” і сказати: тепер у нас електрокар.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не буде електрокара.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Бо проблема 1С та BAS не тільки в інтерфейсі. Проблема значно глибше — &#039;&#039;&#039;у самій структурі бази даних, типах даних, старих архітектурних рішеннях, конфігураціях, партнерських доробках і технологічному багажі, який тягнеться ще з 90-х років&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #e67e22; background: #fff4e6; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна думка:&#039;&#039;&#039; стару базу 1С/BAS можна використовувати як джерело даних для міграції, але не як фундамент для нової ERP-системи.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BAS — це не нова архітектура, а стара технологічна лінія 1С ==&lt;br /&gt;
&lt;br /&gt;
1С з’явилась ще у 90-х роках. Спочатку були DOS-версії, потім Windows-версії, далі 1С 7.5, 1С 7.7, потім платформа 8.1, 8.2, 8.3 та наступні версії.&lt;br /&gt;
&lt;br /&gt;
BAS фактично продовжує технологічну лінію 1С 8.3. Змінилася назва, змінилася іконка, змінилася маркетингова обгортка. Але &#039;&#039;&#039;фундаментальна спадщина 1С залишилася всередині&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це дуже важливо розуміти. Якщо зовні програма виглядає сучасніше, це ще не означає, що всередині вона має сучасну архітектуру. Інтерфейс можна перемалювати. Кнопки можна зробити красивішими. Назву можна змінити. Але якщо структура бази даних, типи даних і логіка зберігання інформації тягнуться з минулого століття — це вже не косметична проблема, а системний технічний борг.&lt;br /&gt;
&lt;br /&gt;
== 1С 7.7: архітектурна археологія у DBF-файлах ==&lt;br /&gt;
&lt;br /&gt;
У 1С 7.7 дані зберігалися у DBF-файлах. Для свого часу це було нормальним рішенням. Але для сучасної ERP це вже &#039;&#039;&#039;технологічна археологія&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
DBF — це файлова база даних. Поруч із файлами даних існували індексні файли. Якщо індекси пошкоджувалися, базу потрібно було відкривати в монопольному режимі й переіндексувати. Додайте сюди старі кодування, обмеження на назви файлів, проблеми з кирилицею, службові файли, специфічне зберігання користувачів і прав — і ми отримуємо цілий набір рішень, які були логічними для 90-х, але погано підходять для сучасної ERP-архітектури.&lt;br /&gt;
&lt;br /&gt;
І найцікавіше, що багато компаній досі мають такі бази. Колись почали облік у 1С 7.7, потім звикли, потім накопичили доробки, потім стало страшно переходити, бо можна втратити історію. І так база живе роками.&lt;br /&gt;
&lt;br /&gt;
Це як старий холодильник на дачі: гуде, тече, морозить тільки одну полицю, але &#039;&#039;&#039;“викидати шкода, він же ще працює”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Чому стара структура не може бути фундаментом нової ERP ==&lt;br /&gt;
&lt;br /&gt;
Користувач у 1С бачить меню, довідники, документи, звіти. Для бухгалтера або менеджера цього достатньо. Але для міграції цього замало.&lt;br /&gt;
&lt;br /&gt;
Потрібно розуміти, &#039;&#039;&#039;де фізично зберігаються дані&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* де лежать довідники;&lt;br /&gt;
* де лежать документи;&lt;br /&gt;
* де шапка документа;&lt;br /&gt;
* де табличні частини;&lt;br /&gt;
* де регістри;&lt;br /&gt;
* де перелічення;&lt;br /&gt;
* де службові поля;&lt;br /&gt;
* де реальні бізнес-дані, а де технічний шум платформи.&lt;br /&gt;
&lt;br /&gt;
У конфігураторі 1С ми бачимо логічну структуру: довідники, документи, журнали документів, перелічення, звіти, обробки, плани рахунків, регістри. Але те, що видно в конфігураторі, і те, як це фізично лежить у базі даних, — це різні речі.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у конфігураторі є довідник “Банки”. А фізично в базі це може бути таблиця з технічною назвою типу &amp;lt;code&amp;gt;SC327&amp;lt;/code&amp;gt;, а поля можуть називатися &amp;lt;code&amp;gt;SP330&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP2499&amp;lt;/code&amp;gt; тощо.&lt;br /&gt;
&lt;br /&gt;
Для людини це незручно. Для міграції це означає, що потрібно будувати карту відповідностей: логічна сутність, фізична таблиця, фізичне поле, тип даних, модель K2 ERP, поле K2 ERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #c0392b; background: #fdecea; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; якщо нова система просто працює поверх старої бази 1С/BAS, вона успадковує не тільки дані. Вона успадковує старі таблиці, технічні назви, службові поля, дивні типи даних, хеші, регістри, табличні частини, конфігураційні особливості та партнерські доробки.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це не модернізація. &#039;&#039;&#039;Це технічне заручництво.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Документи в 1С: не один запис, а ціла конструкція ==&lt;br /&gt;
&lt;br /&gt;
У 1С документ — це не просто один рядок у таблиці. У нього є шапка документа, стандартні реквізити, номер, дата, організація, примітки та інші службові поля. Крім того, документ може мати одну або кілька табличних частин.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у накладній є шапка документа і є рядки з товарами. Один документ — багато рядків. На рівні бази даних це зв’язок “один до багатьох”.&lt;br /&gt;
&lt;br /&gt;
Якщо табличних частин кілька, структура стає ще складнішою.&lt;br /&gt;
&lt;br /&gt;
Для міграції це критично. Не можна просто взяти документ як один запис. Потрібно правильно забрати шапку, правильно забрати табличні частини, відновити зв’язки, зберегти порядок рядків, не переплутати службові поля з бізнес-даними.&lt;br /&gt;
&lt;br /&gt;
А тепер уявімо реальну базу клієнта. Партнер колись додав свої поля. Потім інший партнер змінив документ. Потім третій дописав обробку. Потім бухгалтер сказав: “Не чіпайте, бо працює”. І все це живе 10–15 років.&lt;br /&gt;
&lt;br /&gt;
І після цього хтось пропонує будувати нову ERP прямо поверх цієї структури.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура. Це технічний вінегрет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Перелічення: коли значення є, але в базі його не видно ==&lt;br /&gt;
&lt;br /&gt;
Окрема проблема — перелічення.&lt;br /&gt;
&lt;br /&gt;
У нормальній реляційній базі даних такі речі часто зберігаються в окремих таблицях: тип товару, тип операції, статус документа, вид складу. У 1С частина таких значень може жити не як повноцінна таблиця, а як елемент конфігурації.&lt;br /&gt;
&lt;br /&gt;
Наприклад, користувач бачить види ТМЦ: товар, послуга, тара, продукція, матеріал, паливо. Але коли ми витягуємо дані напряму, можемо отримати лише ідентифікатор, а не людське значення.&lt;br /&gt;
&lt;br /&gt;
І тоді виникає питання: де взяти розшифровку? У таблиці? У конфігурації? У модулі? У XML? У голові програміста, який звільнився 12 років тому?&lt;br /&gt;
&lt;br /&gt;
Саме тому стару структуру не можна тягнути як фундамент. &#039;&#039;&#039;Вона не є нормальною універсальною моделлю. Це набір рішень конкретної платформи, конкретної конфігурації і конкретних доробок.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== XML підходить не завжди ==&lt;br /&gt;
&lt;br /&gt;
XML-вивантаження може бути зручним для невеликих баз. У ньому можна отримати структуру і дані в одному форматі. Для невеликих систем це може працювати нормально.&lt;br /&gt;
&lt;br /&gt;
Але коли база велика, XML дуже швидко перетворюється на проблему. У ньому багато тегів, багато службової інформації, багато надлишковості. Навіть одна цифра може бути обгорнута відкриваючим тегом, закриваючим тегом і додатковою структурою.&lt;br /&gt;
&lt;br /&gt;
Для маленьких баз — нормально. Для великих баз — часто боляче.&lt;br /&gt;
&lt;br /&gt;
Якщо база має 500 гігабайт або терабайт, XML може стати валізою без ручки: &#039;&#039;&#039;нести важко, кинути шкода&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Для великих проєктів ефективніше працювати напряму з базою даних. Але тут дуже важливий нюанс: напряму — &#039;&#039;&#039;як із джерелом даних&#039;&#039;&#039;, а не як із фундаментом нової ERP.&lt;br /&gt;
&lt;br /&gt;
Прямий доступ потрібен, щоб витягнути дані, працювати порціями, переносити дельту, контролювати завантаження. Але нова ERP не повинна вічно жити на старій структурі 1С.&lt;br /&gt;
&lt;br /&gt;
== Фізичні таблиці: абракадабра як спадщина 90-х ==&lt;br /&gt;
&lt;br /&gt;
У старих DBF-базах були обмеження на імена файлів: вісім символів до крапки і три символи після. У такі обмеження неможливо нормально вмістити “Банківські виписки”, “Контрагенти”, “Номенклатура” або “Місця зберігання”.&lt;br /&gt;
&lt;br /&gt;
Тому 1С історично пішла шляхом технічних ідентифікаторів. Таблиці й поля називалися не так, щоб людині було зрозуміло, а так, щоб воно влізло в старі обмеження.&lt;br /&gt;
&lt;br /&gt;
Потім з’явилися SQL-бази, де таких обмежень уже не було. Але традиція абракадабри залишилася.&lt;br /&gt;
&lt;br /&gt;
Це як людині провели водопровід, а вона все одно ходить до криниці з відрами, бо &#039;&#039;&#039;“так історично склалося”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Саме це показує рівень архітектурного рефакторингу. Якщо за десятиліття не привели до нормального вигляду навіть фундаментальні речі — назви таблиць, типи даних, структуру зберігання, — чому бізнес має вірити, що інші частини системи ідеально сучасні?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не треба вірити. Треба дивитися під капот.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== BAS виглядає сучасніше, але тягне той самий багаж ==&lt;br /&gt;
&lt;br /&gt;
У 1С 8 і BAS з’явилися товстий клієнт, тонкий клієнт, SQL-бази, сервер додатків, регістри накопичення, регістри відомостей, регістри бухгалтерії, регістри розрахунку.&lt;br /&gt;
&lt;br /&gt;
Зовні це виглядає сучасніше, ніж 1С 7.7. Але на рівні структури ми знову бачимо технічні назви, складні типи даних, binary-значення, хеші, посилання, регістри, службові таблиці, табличні частини.&lt;br /&gt;
&lt;br /&gt;
Коли потрібно будувати реальні SQL-запити до бази 1С/BAS, наприклад для Power BI або аналітики, починається технічний квест: знайти таблицю, знайти поле, розшифрувати тип, привести binary, знайти хеш перелічення, зробити join-и, перерахувати дату, не переплутати регістр і не забути табличну частину.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура для майбутнього. Це escape room для програміста.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Такі SQL-запити можуть бути великими, складними, повільними. Особливо на базах у сотні гігабайт або терабайти. Сервери можуть лягати від таких запитів, бо структура не призначена для зручної прямої аналітики.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #2980b9; background: #eaf4ff; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Практичний висновок:&#039;&#039;&#039; пряме підключення до бази 1С/BAS може бути корисним для разового аналізу або міграції. Але будувати на цьому постійну роботу нової ERP — означає перенести старі проблеми в нову систему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому 1С/BAS не можуть просто все відрефакторити ==&lt;br /&gt;
&lt;br /&gt;
Логічне питання: чому ці проблеми не виправили за десятиліття?&lt;br /&gt;
&lt;br /&gt;
Відповідь проста: &#039;&#039;&#039;глибоко переробити фундамент уже дуже складно&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1С історично розробляла платформу й інструмент, а прикладні конфігурації масово робили партнери. Кожна конфігурація могла бути змінена під конкретного клієнта. Якщо зараз радикально змінити структуру таблиць, типи даних, принципи зберігання й відповідності, може посипатися величезна кількість конфігурацій, доробок, інтеграцій і партнерських рішень.&lt;br /&gt;
&lt;br /&gt;
Тому старий багаж не прибирали. Його консервували. Потім зверху додавали нові шари. Потім ще нові. Потім це називали розвитком.&lt;br /&gt;
&lt;br /&gt;
Але значна частина такого “розвитку” — це коли старий технічний борг просто прикривають новими меню, новими назвами і новими презентаціями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BAS у цьому сенсі виглядає як сучасна програма, але всередині несе спадщину системи з 90-х років.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Чому “прозорий перехід” — це пастка ==&lt;br /&gt;
&lt;br /&gt;
І тепер головне.&lt;br /&gt;
&lt;br /&gt;
Чому немає сенсу будувати “прозорий перехід” з 1С або BAS на базі існуючих баз даних і конфігурацій?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #27ae60; background: #ecf9f0; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Коротко:&#039;&#039;&#039; стару базу потрібно розібрати, витягнути з неї дані й перенести їх у нову модель. Але не можна залишати стару структуру як основу майбутньої ERP.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Перше: структура стара.&#039;&#039;&#039; Вона тягне спадщину DBF, DOS, FAT16, старих обмежень, технічних ідентифікаторів і рішень 90-х років.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Друге: структура погана як фундамент для сучасної ERP.&#039;&#039;&#039; Вона може бути джерелом даних, але не архітектурою майбутньої системи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третє: структура різна в різних конфігураціях.&#039;&#039;&#039; Бухгалтерія, торгівля, зарплата, управлінський облік, галузеві рішення — усе може відрізнятися.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четверте: структура дороблена партнерами.&#039;&#039;&#039; Кожна база може бути окремою історією, окремим зоопарком, окремою археологічною пам’яткою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;П’яте: самі 1С/BAS не можуть легко це відрефакторити.&#039;&#039;&#039; Їхня екосистема побудована на платформі, конфігураціях і партнерських доробках. Зміниш фундамент — посиплються надбудови.&lt;br /&gt;
&lt;br /&gt;
Тому “прозорий перехід” на старій структурі — це не модернізація. &#039;&#039;&#039;Це пастка.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ви ніби переходите на нову систему, але фактично залишаєтеся прив’язаними до старої бази, старої логіки, старих таблиць, старих типів даних, старих регістрів, старих хешів, старих дат і старих проблем.&lt;br /&gt;
&lt;br /&gt;
== Правильний підхід: переносити дані, а не стару цвіль ==&lt;br /&gt;
&lt;br /&gt;
Правильний підхід інший.&lt;br /&gt;
&lt;br /&gt;
Стару базу 1С або BAS потрібно використовувати як джерело даних. Її треба розібрати, зрозуміти, розшифрувати структуру, витягнути довідники, документи, залишки, проводки, регістри, аналітику.&lt;br /&gt;
&lt;br /&gt;
Потім потрібно побудувати карту відповідності з K2 ERP і перенести дані в нову нормальну модель.&lt;br /&gt;
&lt;br /&gt;
Тобто ми забираємо з 1С те, що належить бізнесу: &#039;&#039;&#039;дані, історію, документи, аналітику&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Але ми не забираємо стару архітектурну цвіль.&lt;br /&gt;
&lt;br /&gt;
Бо бізнесу потрібні його дані, а не музей технічного боргу.&lt;br /&gt;
&lt;br /&gt;
Саме для цього створюється K2 ERP. Не як нова обгортка поверх старої російської технологічної спадщини, а як сучасна українська ERP-платформа з нормальною архітектурою, зрозумілими моделями даних, веб-інтерфейсом, API, інтеграціями, CRM, обліком, виробництвом, складами, документообігом та аналітикою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP переносить дані в нову архітектуру, а не старий хаос у новий інтерфейс.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Відео: хакнути структуру 1С ==&lt;br /&gt;
&lt;br /&gt;
У відео нижче показано, як виглядає структура 1С/BAS зсередини: старі DBF-файли, конфігуратор, довідники, документи, перелічення, XML, фізичні таблиці, SQL-запити, регістри, товстий і тонкий клієнт.&lt;br /&gt;
&lt;br /&gt;
Це відео не про незаконний злам. Це відео про те, чому стару структуру потрібно розуміти, розшифровувати й використовувати тільки як джерело даних.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;А майбутнє українського бізнесу потрібно будувати вже не на 1С і BAS, а на сучасній, зрозумілій і незалежній ERP-платформі.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|FRZJ0AaEJ1c|1280|center|Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка}}&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2734</id>
		<title>Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2734"/>
		<updated>2026-07-09T20:49:23Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Заставка 1.png|центр|міні|800x800пкс|Хакнути структуру 1С]]&lt;br /&gt;
&lt;br /&gt;
Коли бізнес говорить про перехід з 1С або BAS на сучасну ERP-систему, часто виникає спокуслива ідея: &#039;&#039;&#039;“А давайте нічого не переносити. Просто підключимо нову систему до старої бази 1С/BAS і будемо працювати далі”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
На перший погляд це виглядає красиво: швидко, дешево, безболісно. Нібито не потрібно переносити довідники, документи, залишки, проводки, регістри, історію операцій. Нібито достатньо зробити новий інтерфейс, під’єднатися до старої бази — і компанія вже працює в “новій системі”.&lt;br /&gt;
&lt;br /&gt;
Але на практиці це приблизно як поставити екран від Tesla в старий “Запорожець” і сказати: тепер у нас електрокар.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не буде електрокара.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Бо проблема 1С та BAS не тільки в інтерфейсі. Проблема значно глибше — &#039;&#039;&#039;у самій структурі бази даних, типах даних, старих архітектурних рішеннях, конфігураціях, партнерських доробках і технологічному багажі, який тягнеться ще з 90-х років&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #e67e22; background: #fff4e6; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна думка:&#039;&#039;&#039; стару базу 1С/BAS можна використовувати як джерело даних для міграції, але не як фундамент для нової ERP-системи.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BAS — це не нова архітектура, а стара технологічна лінія 1С ==&lt;br /&gt;
&lt;br /&gt;
1С з’явилась ще у 90-х роках. Спочатку були DOS-версії, потім Windows-версії, далі 1С 7.5, 1С 7.7, потім платформа 8.1, 8.2, 8.3 та наступні версії.&lt;br /&gt;
&lt;br /&gt;
BAS фактично продовжує технологічну лінію 1С 8.3. Змінилася назва, змінилася іконка, змінилася маркетингова обгортка. Але &#039;&#039;&#039;фундаментальна спадщина 1С залишилася всередині&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це дуже важливо розуміти. Якщо зовні програма виглядає сучасніше, це ще не означає, що всередині вона має сучасну архітектуру. Інтерфейс можна перемалювати. Кнопки можна зробити красивішими. Назву можна змінити. Але якщо структура бази даних, типи даних і логіка зберігання інформації тягнуться з минулого століття — це вже не косметична проблема, а системний технічний борг.&lt;br /&gt;
&lt;br /&gt;
== 1С 7.7: архітектурна археологія у DBF-файлах ==&lt;br /&gt;
&lt;br /&gt;
У 1С 7.7 дані зберігалися у DBF-файлах. Для свого часу це було нормальним рішенням. Але для сучасної ERP це вже &#039;&#039;&#039;технологічна археологія&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
DBF — це файлова база даних. Поруч із файлами даних існували індексні файли. Якщо індекси пошкоджувалися, базу потрібно було відкривати в монопольному режимі й переіндексувати. Додайте сюди старі кодування, обмеження на назви файлів, проблеми з кирилицею, службові файли, специфічне зберігання користувачів і прав — і ми отримуємо цілий набір рішень, які були логічними для 90-х, але погано підходять для сучасної ERP-архітектури.&lt;br /&gt;
&lt;br /&gt;
І найцікавіше, що багато компаній досі мають такі бази. Колись почали облік у 1С 7.7, потім звикли, потім накопичили доробки, потім стало страшно переходити, бо можна втратити історію. І так база живе роками.&lt;br /&gt;
&lt;br /&gt;
Це як старий холодильник на дачі: гуде, тече, морозить тільки одну полицю, але &#039;&#039;&#039;“викидати шкода, він же ще працює”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Чому стара структура не може бути фундаментом нової ERP ==&lt;br /&gt;
&lt;br /&gt;
Користувач у 1С бачить меню, довідники, документи, звіти. Для бухгалтера або менеджера цього достатньо. Але для міграції цього замало.&lt;br /&gt;
&lt;br /&gt;
Потрібно розуміти, &#039;&#039;&#039;де фізично зберігаються дані&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* де лежать довідники;&lt;br /&gt;
* де лежать документи;&lt;br /&gt;
* де шапка документа;&lt;br /&gt;
* де табличні частини;&lt;br /&gt;
* де регістри;&lt;br /&gt;
* де перелічення;&lt;br /&gt;
* де службові поля;&lt;br /&gt;
* де реальні бізнес-дані, а де технічний шум платформи.&lt;br /&gt;
&lt;br /&gt;
У конфігураторі 1С ми бачимо логічну структуру: довідники, документи, журнали документів, перелічення, звіти, обробки, плани рахунків, регістри. Але те, що видно в конфігураторі, і те, як це фізично лежить у базі даних, — це різні речі.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у конфігураторі є довідник “Банки”. А фізично в базі це може бути таблиця з технічною назвою типу &amp;lt;code&amp;gt;SC327&amp;lt;/code&amp;gt;, а поля можуть називатися &amp;lt;code&amp;gt;SP330&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP2499&amp;lt;/code&amp;gt; тощо.&lt;br /&gt;
&lt;br /&gt;
Для людини це незручно. Для міграції це означає, що потрібно будувати карту відповідностей: логічна сутність, фізична таблиця, фізичне поле, тип даних, модель K2 ERP, поле K2 ERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #c0392b; background: #fdecea; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; якщо нова система просто працює поверх старої бази 1С/BAS, вона успадковує не тільки дані. Вона успадковує старі таблиці, технічні назви, службові поля, дивні типи даних, хеші, регістри, табличні частини, конфігураційні особливості та партнерські доробки.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це не модернізація. &#039;&#039;&#039;Це технічне заручництво.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Документи в 1С: не один запис, а ціла конструкція ==&lt;br /&gt;
&lt;br /&gt;
У 1С документ — це не просто один рядок у таблиці. У нього є шапка документа, стандартні реквізити, номер, дата, організація, примітки та інші службові поля. Крім того, документ може мати одну або кілька табличних частин.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у накладній є шапка документа і є рядки з товарами. Один документ — багато рядків. На рівні бази даних це зв’язок “один до багатьох”.&lt;br /&gt;
&lt;br /&gt;
Якщо табличних частин кілька, структура стає ще складнішою.&lt;br /&gt;
&lt;br /&gt;
Для міграції це критично. Не можна просто взяти документ як один запис. Потрібно правильно забрати шапку, правильно забрати табличні частини, відновити зв’язки, зберегти порядок рядків, не переплутати службові поля з бізнес-даними.&lt;br /&gt;
&lt;br /&gt;
А тепер уявімо реальну базу клієнта. Партнер колись додав свої поля. Потім інший партнер змінив документ. Потім третій дописав обробку. Потім бухгалтер сказав: “Не чіпайте, бо працює”. І все це живе 10–15 років.&lt;br /&gt;
&lt;br /&gt;
І після цього хтось пропонує будувати нову ERP прямо поверх цієї структури.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура. Це технічний вінегрет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Перелічення: коли значення є, але в базі його не видно ==&lt;br /&gt;
&lt;br /&gt;
Окрема проблема — перелічення.&lt;br /&gt;
&lt;br /&gt;
У нормальній реляційній базі даних такі речі часто зберігаються в окремих таблицях: тип товару, тип операції, статус документа, вид складу. У 1С частина таких значень може жити не як повноцінна таблиця, а як елемент конфігурації.&lt;br /&gt;
&lt;br /&gt;
Наприклад, користувач бачить види ТМЦ: товар, послуга, тара, продукція, матеріал, паливо. Але коли ми витягуємо дані напряму, можемо отримати лише ідентифікатор, а не людське значення.&lt;br /&gt;
&lt;br /&gt;
І тоді виникає питання: де взяти розшифровку? У таблиці? У конфігурації? У модулі? У XML? У голові програміста, який звільнився 12 років тому?&lt;br /&gt;
&lt;br /&gt;
Саме тому стару структуру не можна тягнути як фундамент. &#039;&#039;&#039;Вона не є нормальною універсальною моделлю. Це набір рішень конкретної платформи, конкретної конфігурації і конкретних доробок.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== XML підходить не завжди ==&lt;br /&gt;
&lt;br /&gt;
XML-вивантаження може бути зручним для невеликих баз. У ньому можна отримати структуру і дані в одному форматі. Для невеликих систем це може працювати нормально.&lt;br /&gt;
&lt;br /&gt;
Але коли база велика, XML дуже швидко перетворюється на проблему. У ньому багато тегів, багато службової інформації, багато надлишковості. Навіть одна цифра може бути обгорнута відкриваючим тегом, закриваючим тегом і додатковою структурою.&lt;br /&gt;
&lt;br /&gt;
Для маленьких баз — нормально. Для великих баз — часто боляче.&lt;br /&gt;
&lt;br /&gt;
Якщо база має 500 гігабайт або терабайт, XML може стати валізою без ручки: &#039;&#039;&#039;нести важко, кинути шкода&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Для великих проєктів ефективніше працювати напряму з базою даних. Але тут дуже важливий нюанс: напряму — &#039;&#039;&#039;як із джерелом даних&#039;&#039;&#039;, а не як із фундаментом нової ERP.&lt;br /&gt;
&lt;br /&gt;
Прямий доступ потрібен, щоб витягнути дані, працювати порціями, переносити дельту, контролювати завантаження. Але нова ERP не повинна вічно жити на старій структурі 1С.&lt;br /&gt;
&lt;br /&gt;
== Фізичні таблиці: абракадабра як спадщина 90-х ==&lt;br /&gt;
&lt;br /&gt;
У старих DBF-базах були обмеження на імена файлів: вісім символів до крапки і три символи після. У такі обмеження неможливо нормально вмістити “Банківські виписки”, “Контрагенти”, “Номенклатура” або “Місця зберігання”.&lt;br /&gt;
&lt;br /&gt;
Тому 1С історично пішла шляхом технічних ідентифікаторів. Таблиці й поля називалися не так, щоб людині було зрозуміло, а так, щоб воно влізло в старі обмеження.&lt;br /&gt;
&lt;br /&gt;
Потім з’явилися SQL-бази, де таких обмежень уже не було. Але традиція абракадабри залишилася.&lt;br /&gt;
&lt;br /&gt;
Це як людині провели водопровід, а вона все одно ходить до криниці з відрами, бо &#039;&#039;&#039;“так історично склалося”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Саме це показує рівень архітектурного рефакторингу. Якщо за десятиліття не привели до нормального вигляду навіть фундаментальні речі — назви таблиць, типи даних, структуру зберігання, — чому бізнес має вірити, що інші частини системи ідеально сучасні?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не треба вірити. Треба дивитися під капот.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== BAS виглядає сучасніше, але тягне той самий багаж ==&lt;br /&gt;
&lt;br /&gt;
У 1С 8 і BAS з’явилися товстий клієнт, тонкий клієнт, SQL-бази, сервер додатків, регістри накопичення, регістри відомостей, регістри бухгалтерії, регістри розрахунку.&lt;br /&gt;
&lt;br /&gt;
Зовні це виглядає сучасніше, ніж 1С 7.7. Але на рівні структури ми знову бачимо технічні назви, складні типи даних, binary-значення, хеші, посилання, регістри, службові таблиці, табличні частини.&lt;br /&gt;
&lt;br /&gt;
Коли потрібно будувати реальні SQL-запити до бази 1С/BAS, наприклад для Power BI або аналітики, починається технічний квест: знайти таблицю, знайти поле, розшифрувати тип, привести binary, знайти хеш перелічення, зробити join-и, перерахувати дату, не переплутати регістр і не забути табличну частину.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура для майбутнього. Це escape room для програміста.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Такі SQL-запити можуть бути великими, складними, повільними. Особливо на базах у сотні гігабайт або терабайти. Сервери можуть лягати від таких запитів, бо структура не призначена для зручної прямої аналітики.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #2980b9; background: #eaf4ff; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Практичний висновок:&#039;&#039;&#039; пряме підключення до бази 1С/BAS може бути корисним для разового аналізу або міграції. Але будувати на цьому постійну роботу нової ERP — означає перенести старі проблеми в нову систему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому 1С/BAS не можуть просто все відрефакторити ==&lt;br /&gt;
&lt;br /&gt;
Логічне питання: чому ці проблеми не виправили за десятиліття?&lt;br /&gt;
&lt;br /&gt;
Відповідь проста: &#039;&#039;&#039;глибоко переробити фундамент уже дуже складно&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1С історично розробляла платформу й інструмент, а прикладні конфігурації масово робили партнери. Кожна конфігурація могла бути змінена під конкретного клієнта. Якщо зараз радикально змінити структуру таблиць, типи даних, принципи зберігання й відповідності, може посипатися величезна кількість конфігурацій, доробок, інтеграцій і партнерських рішень.&lt;br /&gt;
&lt;br /&gt;
Тому старий багаж не прибирали. Його консервували. Потім зверху додавали нові шари. Потім ще нові. Потім це називали розвитком.&lt;br /&gt;
&lt;br /&gt;
Але значна частина такого “розвитку” — це коли старий технічний борг просто прикривають новими меню, новими назвами і новими презентаціями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BAS у цьому сенсі виглядає як сучасна програма, але всередині несе спадщину системи з 90-х років.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Чому “прозорий перехід” — це пастка ==&lt;br /&gt;
&lt;br /&gt;
І тепер головне.&lt;br /&gt;
&lt;br /&gt;
Чому немає сенсу будувати “прозорий перехід” з 1С або BAS на базі існуючих баз даних і конфігурацій?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #27ae60; background: #ecf9f0; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Коротко:&#039;&#039;&#039; стару базу потрібно розібрати, витягнути з неї дані й перенести їх у нову модель. Але не можна залишати стару структуру як основу майбутньої ERP.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Перше: структура стара.&#039;&#039;&#039; Вона тягне спадщину DBF, DOS, FAT16, старих обмежень, технічних ідентифікаторів і рішень 90-х років.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Друге: структура погана як фундамент для сучасної ERP.&#039;&#039;&#039; Вона може бути джерелом даних, але не архітектурою майбутньої системи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третє: структура різна в різних конфігураціях.&#039;&#039;&#039; Бухгалтерія, торгівля, зарплата, управлінський облік, галузеві рішення — усе може відрізнятися.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четверте: структура дороблена партнерами.&#039;&#039;&#039; Кожна база може бути окремою історією, окремим зоопарком, окремою археологічною пам’яткою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;П’яте: самі 1С/BAS не можуть легко це відрефакторити.&#039;&#039;&#039; Їхня екосистема побудована на платформі, конфігураціях і партнерських доробках. Зміниш фундамент — посиплються надбудови.&lt;br /&gt;
&lt;br /&gt;
Тому “прозорий перехід” на старій структурі — це не модернізація. &#039;&#039;&#039;Це пастка.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ви ніби переходите на нову систему, але фактично залишаєтеся прив’язаними до старої бази, старої логіки, старих таблиць, старих типів даних, старих регістрів, старих хешів, старих дат і старих проблем.&lt;br /&gt;
&lt;br /&gt;
== Правильний підхід: переносити дані, а не стару цвіль ==&lt;br /&gt;
&lt;br /&gt;
Правильний підхід інший.&lt;br /&gt;
&lt;br /&gt;
Стару базу 1С або BAS потрібно використовувати як джерело даних. Її треба розібрати, зрозуміти, розшифрувати структуру, витягнути довідники, документи, залишки, проводки, регістри, аналітику.&lt;br /&gt;
&lt;br /&gt;
Потім потрібно побудувати карту відповідності з K2 ERP і перенести дані в нову нормальну модель.&lt;br /&gt;
&lt;br /&gt;
Тобто ми забираємо з 1С те, що належить бізнесу: &#039;&#039;&#039;дані, історію, документи, аналітику&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Але ми не забираємо стару архітектурну цвіль.&lt;br /&gt;
&lt;br /&gt;
Бо бізнесу потрібні його дані, а не музей технічного боргу.&lt;br /&gt;
&lt;br /&gt;
Саме для цього створюється K2 ERP. Не як нова обгортка поверх старої російської технологічної спадщини, а як сучасна українська ERP-платформа з нормальною архітектурою, зрозумілими моделями даних, веб-інтерфейсом, API, інтеграціями, CRM, обліком, виробництвом, складами, документообігом та аналітикою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP переносить дані в нову архітектуру, а не старий хаос у новий інтерфейс.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Відео: хакнути структуру 1С ==&lt;br /&gt;
&lt;br /&gt;
У відео нижче показано, як виглядає структура 1С/BAS зсередини: старі DBF-файли, конфігуратор, довідники, документи, перелічення, XML, фізичні таблиці, SQL-запити, регістри, товстий і тонкий клієнт.&lt;br /&gt;
&lt;br /&gt;
Це відео не про незаконний злам. Це відео про те, чому стару структуру потрібно розуміти, розшифровувати й використовувати тільки як джерело даних.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;А майбутнє українського бізнесу потрібно будувати вже не на 1С і BAS, а на сучасній, зрозумілій і незалежній ERP-платформі.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|FRZJ0AaEJ1c|100%|center|Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка}}&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2733</id>
		<title>Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2733"/>
		<updated>2026-07-09T20:48:31Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Заставка 1.png|центр|міні|800x800пкс|Хакнути структуру 1С]]&lt;br /&gt;
&lt;br /&gt;
Коли бізнес говорить про перехід з 1С або BAS на сучасну ERP-систему, часто виникає спокуслива ідея: &#039;&#039;&#039;“А давайте нічого не переносити. Просто підключимо нову систему до старої бази 1С/BAS і будемо працювати далі”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
На перший погляд це виглядає красиво: швидко, дешево, безболісно. Нібито не потрібно переносити довідники, документи, залишки, проводки, регістри, історію операцій. Нібито достатньо зробити новий інтерфейс, під’єднатися до старої бази — і компанія вже працює в “новій системі”.&lt;br /&gt;
&lt;br /&gt;
Але на практиці це приблизно як поставити екран від Tesla в старий “Запорожець” і сказати: тепер у нас електрокар.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не буде електрокара.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Бо проблема 1С та BAS не тільки в інтерфейсі. Проблема значно глибше — &#039;&#039;&#039;у самій структурі бази даних, типах даних, старих архітектурних рішеннях, конфігураціях, партнерських доробках і технологічному багажі, який тягнеться ще з 90-х років&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #e67e22; background: #fff4e6; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна думка:&#039;&#039;&#039; стару базу 1С/BAS можна використовувати як джерело даних для міграції, але не як фундамент для нової ERP-системи.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BAS — це не нова архітектура, а стара технологічна лінія 1С ==&lt;br /&gt;
&lt;br /&gt;
1С з’явилась ще у 90-х роках. Спочатку були DOS-версії, потім Windows-версії, далі 1С 7.5, 1С 7.7, потім платформа 8.1, 8.2, 8.3 та наступні версії.&lt;br /&gt;
&lt;br /&gt;
BAS фактично продовжує технологічну лінію 1С 8.3. Змінилася назва, змінилася іконка, змінилася маркетингова обгортка. Але &#039;&#039;&#039;фундаментальна спадщина 1С залишилася всередині&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це дуже важливо розуміти. Якщо зовні програма виглядає сучасніше, це ще не означає, що всередині вона має сучасну архітектуру. Інтерфейс можна перемалювати. Кнопки можна зробити красивішими. Назву можна змінити. Але якщо структура бази даних, типи даних і логіка зберігання інформації тягнуться з минулого століття — це вже не косметична проблема, а системний технічний борг.&lt;br /&gt;
&lt;br /&gt;
== 1С 7.7: архітектурна археологія у DBF-файлах ==&lt;br /&gt;
&lt;br /&gt;
У 1С 7.7 дані зберігалися у DBF-файлах. Для свого часу це було нормальним рішенням. Але для сучасної ERP це вже &#039;&#039;&#039;технологічна археологія&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
DBF — це файлова база даних. Поруч із файлами даних існували індексні файли. Якщо індекси пошкоджувалися, базу потрібно було відкривати в монопольному режимі й переіндексувати. Додайте сюди старі кодування, обмеження на назви файлів, проблеми з кирилицею, службові файли, специфічне зберігання користувачів і прав — і ми отримуємо цілий набір рішень, які були логічними для 90-х, але погано підходять для сучасної ERP-архітектури.&lt;br /&gt;
&lt;br /&gt;
І найцікавіше, що багато компаній досі мають такі бази. Колись почали облік у 1С 7.7, потім звикли, потім накопичили доробки, потім стало страшно переходити, бо можна втратити історію. І так база живе роками.&lt;br /&gt;
&lt;br /&gt;
Це як старий холодильник на дачі: гуде, тече, морозить тільки одну полицю, але &#039;&#039;&#039;“викидати шкода, він же ще працює”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Чому стара структура не може бути фундаментом нової ERP ==&lt;br /&gt;
&lt;br /&gt;
Користувач у 1С бачить меню, довідники, документи, звіти. Для бухгалтера або менеджера цього достатньо. Але для міграції цього замало.&lt;br /&gt;
&lt;br /&gt;
Потрібно розуміти, &#039;&#039;&#039;де фізично зберігаються дані&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* де лежать довідники;&lt;br /&gt;
* де лежать документи;&lt;br /&gt;
* де шапка документа;&lt;br /&gt;
* де табличні частини;&lt;br /&gt;
* де регістри;&lt;br /&gt;
* де перелічення;&lt;br /&gt;
* де службові поля;&lt;br /&gt;
* де реальні бізнес-дані, а де технічний шум платформи.&lt;br /&gt;
&lt;br /&gt;
У конфігураторі 1С ми бачимо логічну структуру: довідники, документи, журнали документів, перелічення, звіти, обробки, плани рахунків, регістри. Але те, що видно в конфігураторі, і те, як це фізично лежить у базі даних, — це різні речі.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у конфігураторі є довідник “Банки”. А фізично в базі це може бути таблиця з технічною назвою типу &amp;lt;code&amp;gt;SC327&amp;lt;/code&amp;gt;, а поля можуть називатися &amp;lt;code&amp;gt;SP330&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP2499&amp;lt;/code&amp;gt; тощо.&lt;br /&gt;
&lt;br /&gt;
Для людини це незручно. Для міграції це означає, що потрібно будувати карту відповідностей: логічна сутність, фізична таблиця, фізичне поле, тип даних, модель K2 ERP, поле K2 ERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #c0392b; background: #fdecea; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; якщо нова система просто працює поверх старої бази 1С/BAS, вона успадковує не тільки дані. Вона успадковує старі таблиці, технічні назви, службові поля, дивні типи даних, хеші, регістри, табличні частини, конфігураційні особливості та партнерські доробки.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це не модернізація. &#039;&#039;&#039;Це технічне заручництво.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Документи в 1С: не один запис, а ціла конструкція ==&lt;br /&gt;
&lt;br /&gt;
У 1С документ — це не просто один рядок у таблиці. У нього є шапка документа, стандартні реквізити, номер, дата, організація, примітки та інші службові поля. Крім того, документ може мати одну або кілька табличних частин.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у накладній є шапка документа і є рядки з товарами. Один документ — багато рядків. На рівні бази даних це зв’язок “один до багатьох”.&lt;br /&gt;
&lt;br /&gt;
Якщо табличних частин кілька, структура стає ще складнішою.&lt;br /&gt;
&lt;br /&gt;
Для міграції це критично. Не можна просто взяти документ як один запис. Потрібно правильно забрати шапку, правильно забрати табличні частини, відновити зв’язки, зберегти порядок рядків, не переплутати службові поля з бізнес-даними.&lt;br /&gt;
&lt;br /&gt;
А тепер уявімо реальну базу клієнта. Партнер колись додав свої поля. Потім інший партнер змінив документ. Потім третій дописав обробку. Потім бухгалтер сказав: “Не чіпайте, бо працює”. І все це живе 10–15 років.&lt;br /&gt;
&lt;br /&gt;
І після цього хтось пропонує будувати нову ERP прямо поверх цієї структури.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура. Це технічний вінегрет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Перелічення: коли значення є, але в базі його не видно ==&lt;br /&gt;
&lt;br /&gt;
Окрема проблема — перелічення.&lt;br /&gt;
&lt;br /&gt;
У нормальній реляційній базі даних такі речі часто зберігаються в окремих таблицях: тип товару, тип операції, статус документа, вид складу. У 1С частина таких значень може жити не як повноцінна таблиця, а як елемент конфігурації.&lt;br /&gt;
&lt;br /&gt;
Наприклад, користувач бачить види ТМЦ: товар, послуга, тара, продукція, матеріал, паливо. Але коли ми витягуємо дані напряму, можемо отримати лише ідентифікатор, а не людське значення.&lt;br /&gt;
&lt;br /&gt;
І тоді виникає питання: де взяти розшифровку? У таблиці? У конфігурації? У модулі? У XML? У голові програміста, який звільнився 12 років тому?&lt;br /&gt;
&lt;br /&gt;
Саме тому стару структуру не можна тягнути як фундамент. &#039;&#039;&#039;Вона не є нормальною універсальною моделлю. Це набір рішень конкретної платформи, конкретної конфігурації і конкретних доробок.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== XML підходить не завжди ==&lt;br /&gt;
&lt;br /&gt;
XML-вивантаження може бути зручним для невеликих баз. У ньому можна отримати структуру і дані в одному форматі. Для невеликих систем це може працювати нормально.&lt;br /&gt;
&lt;br /&gt;
Але коли база велика, XML дуже швидко перетворюється на проблему. У ньому багато тегів, багато службової інформації, багато надлишковості. Навіть одна цифра може бути обгорнута відкриваючим тегом, закриваючим тегом і додатковою структурою.&lt;br /&gt;
&lt;br /&gt;
Для маленьких баз — нормально. Для великих баз — часто боляче.&lt;br /&gt;
&lt;br /&gt;
Якщо база має 500 гігабайт або терабайт, XML може стати валізою без ручки: &#039;&#039;&#039;нести важко, кинути шкода&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Для великих проєктів ефективніше працювати напряму з базою даних. Але тут дуже важливий нюанс: напряму — &#039;&#039;&#039;як із джерелом даних&#039;&#039;&#039;, а не як із фундаментом нової ERP.&lt;br /&gt;
&lt;br /&gt;
Прямий доступ потрібен, щоб витягнути дані, працювати порціями, переносити дельту, контролювати завантаження. Але нова ERP не повинна вічно жити на старій структурі 1С.&lt;br /&gt;
&lt;br /&gt;
== Фізичні таблиці: абракадабра як спадщина 90-х ==&lt;br /&gt;
&lt;br /&gt;
У старих DBF-базах були обмеження на імена файлів: вісім символів до крапки і три символи після. У такі обмеження неможливо нормально вмістити “Банківські виписки”, “Контрагенти”, “Номенклатура” або “Місця зберігання”.&lt;br /&gt;
&lt;br /&gt;
Тому 1С історично пішла шляхом технічних ідентифікаторів. Таблиці й поля називалися не так, щоб людині було зрозуміло, а так, щоб воно влізло в старі обмеження.&lt;br /&gt;
&lt;br /&gt;
Потім з’явилися SQL-бази, де таких обмежень уже не було. Але традиція абракадабри залишилася.&lt;br /&gt;
&lt;br /&gt;
Це як людині провели водопровід, а вона все одно ходить до криниці з відрами, бо &#039;&#039;&#039;“так історично склалося”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Саме це показує рівень архітектурного рефакторингу. Якщо за десятиліття не привели до нормального вигляду навіть фундаментальні речі — назви таблиць, типи даних, структуру зберігання, — чому бізнес має вірити, що інші частини системи ідеально сучасні?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не треба вірити. Треба дивитися під капот.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== BAS виглядає сучасніше, але тягне той самий багаж ==&lt;br /&gt;
&lt;br /&gt;
У 1С 8 і BAS з’явилися товстий клієнт, тонкий клієнт, SQL-бази, сервер додатків, регістри накопичення, регістри відомостей, регістри бухгалтерії, регістри розрахунку.&lt;br /&gt;
&lt;br /&gt;
Зовні це виглядає сучасніше, ніж 1С 7.7. Але на рівні структури ми знову бачимо технічні назви, складні типи даних, binary-значення, хеші, посилання, регістри, службові таблиці, табличні частини.&lt;br /&gt;
&lt;br /&gt;
Коли потрібно будувати реальні SQL-запити до бази 1С/BAS, наприклад для Power BI або аналітики, починається технічний квест: знайти таблицю, знайти поле, розшифрувати тип, привести binary, знайти хеш перелічення, зробити join-и, перерахувати дату, не переплутати регістр і не забути табличну частину.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура для майбутнього. Це escape room для програміста.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Такі SQL-запити можуть бути великими, складними, повільними. Особливо на базах у сотні гігабайт або терабайти. Сервери можуть лягати від таких запитів, бо структура не призначена для зручної прямої аналітики.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #2980b9; background: #eaf4ff; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Практичний висновок:&#039;&#039;&#039; пряме підключення до бази 1С/BAS може бути корисним для разового аналізу або міграції. Але будувати на цьому постійну роботу нової ERP — означає перенести старі проблеми в нову систему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому 1С/BAS не можуть просто все відрефакторити ==&lt;br /&gt;
&lt;br /&gt;
Логічне питання: чому ці проблеми не виправили за десятиліття?&lt;br /&gt;
&lt;br /&gt;
Відповідь проста: &#039;&#039;&#039;глибоко переробити фундамент уже дуже складно&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1С історично розробляла платформу й інструмент, а прикладні конфігурації масово робили партнери. Кожна конфігурація могла бути змінена під конкретного клієнта. Якщо зараз радикально змінити структуру таблиць, типи даних, принципи зберігання й відповідності, може посипатися величезна кількість конфігурацій, доробок, інтеграцій і партнерських рішень.&lt;br /&gt;
&lt;br /&gt;
Тому старий багаж не прибирали. Його консервували. Потім зверху додавали нові шари. Потім ще нові. Потім це називали розвитком.&lt;br /&gt;
&lt;br /&gt;
Але значна частина такого “розвитку” — це коли старий технічний борг просто прикривають новими меню, новими назвами і новими презентаціями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BAS у цьому сенсі виглядає як сучасна програма, але всередині несе спадщину системи з 90-х років.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Чому “прозорий перехід” — це пастка ==&lt;br /&gt;
&lt;br /&gt;
І тепер головне.&lt;br /&gt;
&lt;br /&gt;
Чому немає сенсу будувати “прозорий перехід” з 1С або BAS на базі існуючих баз даних і конфігурацій?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #27ae60; background: #ecf9f0; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Коротко:&#039;&#039;&#039; стару базу потрібно розібрати, витягнути з неї дані й перенести їх у нову модель. Але не можна залишати стару структуру як основу майбутньої ERP.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Перше: структура стара.&#039;&#039;&#039; Вона тягне спадщину DBF, DOS, FAT16, старих обмежень, технічних ідентифікаторів і рішень 90-х років.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Друге: структура погана як фундамент для сучасної ERP.&#039;&#039;&#039; Вона може бути джерелом даних, але не архітектурою майбутньої системи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третє: структура різна в різних конфігураціях.&#039;&#039;&#039; Бухгалтерія, торгівля, зарплата, управлінський облік, галузеві рішення — усе може відрізнятися.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четверте: структура дороблена партнерами.&#039;&#039;&#039; Кожна база може бути окремою історією, окремим зоопарком, окремою археологічною пам’яткою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;П’яте: самі 1С/BAS не можуть легко це відрефакторити.&#039;&#039;&#039; Їхня екосистема побудована на платформі, конфігураціях і партнерських доробках. Зміниш фундамент — посиплються надбудови.&lt;br /&gt;
&lt;br /&gt;
Тому “прозорий перехід” на старій структурі — це не модернізація. &#039;&#039;&#039;Це пастка.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ви ніби переходите на нову систему, але фактично залишаєтеся прив’язаними до старої бази, старої логіки, старих таблиць, старих типів даних, старих регістрів, старих хешів, старих дат і старих проблем.&lt;br /&gt;
&lt;br /&gt;
== Правильний підхід: переносити дані, а не стару цвіль ==&lt;br /&gt;
&lt;br /&gt;
Правильний підхід інший.&lt;br /&gt;
&lt;br /&gt;
Стару базу 1С або BAS потрібно використовувати як джерело даних. Її треба розібрати, зрозуміти, розшифрувати структуру, витягнути довідники, документи, залишки, проводки, регістри, аналітику.&lt;br /&gt;
&lt;br /&gt;
Потім потрібно побудувати карту відповідності з K2 ERP і перенести дані в нову нормальну модель.&lt;br /&gt;
&lt;br /&gt;
Тобто ми забираємо з 1С те, що належить бізнесу: &#039;&#039;&#039;дані, історію, документи, аналітику&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Але ми не забираємо стару архітектурну цвіль.&lt;br /&gt;
&lt;br /&gt;
Бо бізнесу потрібні його дані, а не музей технічного боргу.&lt;br /&gt;
&lt;br /&gt;
Саме для цього створюється K2 ERP. Не як нова обгортка поверх старої російської технологічної спадщини, а як сучасна українська ERP-платформа з нормальною архітектурою, зрозумілими моделями даних, веб-інтерфейсом, API, інтеграціями, CRM, обліком, виробництвом, складами, документообігом та аналітикою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP переносить дані в нову архітектуру, а не старий хаос у новий інтерфейс.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Відео: хакнути структуру 1С ==&lt;br /&gt;
&lt;br /&gt;
У відео нижче показано, як виглядає структура 1С/BAS зсередини: старі DBF-файли, конфігуратор, довідники, документи, перелічення, XML, фізичні таблиці, SQL-запити, регістри, товстий і тонкий клієнт.&lt;br /&gt;
&lt;br /&gt;
Це відео не про незаконний злам. Це відео про те, чому стару структуру потрібно розуміти, розшифровувати й використовувати тільки як джерело даних.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;А майбутнє українського бізнесу потрібно будувати вже не на 1С і BAS, а на сучасній, зрозумілій і незалежній ERP-платформі.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border: 2px dashed #27ae60; background: #f7fff9; padding: 18px; margin: 22px 0; border-radius: 8px; text-align: center;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;[https://www.youtube.com/watch?v=FRZJ0AaEJ1c&amp;amp;list=PLRyc83tAN5QOOCknL2Bv_gHaz0Yzgyehe&amp;amp;index=1]&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2732</id>
		<title>Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2732"/>
		<updated>2026-07-09T19:35:40Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Заставка 1.png|центр|міні|800x800пкс|Хакнути структуру 1С]]&lt;br /&gt;
&lt;br /&gt;
Коли бізнес говорить про перехід з 1С або BAS на сучасну ERP-систему, часто виникає спокуслива ідея: &#039;&#039;&#039;“А давайте нічого не переносити. Просто підключимо нову систему до старої бази 1С/BAS і будемо працювати далі”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
На перший погляд це виглядає красиво: швидко, дешево, безболісно. Нібито не потрібно переносити довідники, документи, залишки, проводки, регістри, історію операцій. Нібито достатньо зробити новий інтерфейс, під’єднатися до старої бази — і компанія вже працює в “новій системі”.&lt;br /&gt;
&lt;br /&gt;
Але на практиці це приблизно як поставити екран від Tesla в старий “Запорожець” і сказати: тепер у нас електрокар.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не буде електрокара.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Бо проблема 1С та BAS не тільки в інтерфейсі. Проблема значно глибше — &#039;&#039;&#039;у самій структурі бази даних, типах даних, старих архітектурних рішеннях, конфігураціях, партнерських доробках і технологічному багажі, який тягнеться ще з 90-х років&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #e67e22; background: #fff4e6; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна думка:&#039;&#039;&#039; стару базу 1С/BAS можна використовувати як джерело даних для міграції, але не як фундамент для нової ERP-системи.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BAS — це не нова архітектура, а стара технологічна лінія 1С ==&lt;br /&gt;
&lt;br /&gt;
1С з’явилась ще у 90-х роках. Спочатку були DOS-версії, потім Windows-версії, далі 1С 7.5, 1С 7.7, потім платформа 8.1, 8.2, 8.3 та наступні версії.&lt;br /&gt;
&lt;br /&gt;
BAS фактично продовжує технологічну лінію 1С 8.3. Змінилася назва, змінилася іконка, змінилася маркетингова обгортка. Але &#039;&#039;&#039;фундаментальна спадщина 1С залишилася всередині&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це дуже важливо розуміти. Якщо зовні програма виглядає сучасніше, це ще не означає, що всередині вона має сучасну архітектуру. Інтерфейс можна перемалювати. Кнопки можна зробити красивішими. Назву можна змінити. Але якщо структура бази даних, типи даних і логіка зберігання інформації тягнуться з минулого століття — це вже не косметична проблема, а системний технічний борг.&lt;br /&gt;
&lt;br /&gt;
== 1С 7.7: архітектурна археологія у DBF-файлах ==&lt;br /&gt;
&lt;br /&gt;
У 1С 7.7 дані зберігалися у DBF-файлах. Для свого часу це було нормальним рішенням. Але для сучасної ERP це вже &#039;&#039;&#039;технологічна археологія&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
DBF — це файлова база даних. Поруч із файлами даних існували індексні файли. Якщо індекси пошкоджувалися, базу потрібно було відкривати в монопольному режимі й переіндексувати. Додайте сюди старі кодування, обмеження на назви файлів, проблеми з кирилицею, службові файли, специфічне зберігання користувачів і прав — і ми отримуємо цілий набір рішень, які були логічними для 90-х, але погано підходять для сучасної ERP-архітектури.&lt;br /&gt;
&lt;br /&gt;
І найцікавіше, що багато компаній досі мають такі бази. Колись почали облік у 1С 7.7, потім звикли, потім накопичили доробки, потім стало страшно переходити, бо можна втратити історію. І так база живе роками.&lt;br /&gt;
&lt;br /&gt;
Це як старий холодильник на дачі: гуде, тече, морозить тільки одну полицю, але &#039;&#039;&#039;“викидати шкода, він же ще працює”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Чому стара структура не може бути фундаментом нової ERP ==&lt;br /&gt;
&lt;br /&gt;
Користувач у 1С бачить меню, довідники, документи, звіти. Для бухгалтера або менеджера цього достатньо. Але для міграції цього замало.&lt;br /&gt;
&lt;br /&gt;
Потрібно розуміти, &#039;&#039;&#039;де фізично зберігаються дані&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* де лежать довідники;&lt;br /&gt;
* де лежать документи;&lt;br /&gt;
* де шапка документа;&lt;br /&gt;
* де табличні частини;&lt;br /&gt;
* де регістри;&lt;br /&gt;
* де перелічення;&lt;br /&gt;
* де службові поля;&lt;br /&gt;
* де реальні бізнес-дані, а де технічний шум платформи.&lt;br /&gt;
&lt;br /&gt;
У конфігураторі 1С ми бачимо логічну структуру: довідники, документи, журнали документів, перелічення, звіти, обробки, плани рахунків, регістри. Але те, що видно в конфігураторі, і те, як це фізично лежить у базі даних, — це різні речі.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у конфігураторі є довідник “Банки”. А фізично в базі це може бути таблиця з технічною назвою типу &amp;lt;code&amp;gt;SC327&amp;lt;/code&amp;gt;, а поля можуть називатися &amp;lt;code&amp;gt;SP330&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP2499&amp;lt;/code&amp;gt; тощо.&lt;br /&gt;
&lt;br /&gt;
Для людини це незручно. Для міграції це означає, що потрібно будувати карту відповідностей: логічна сутність, фізична таблиця, фізичне поле, тип даних, модель K2 ERP, поле K2 ERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #c0392b; background: #fdecea; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; якщо нова система просто працює поверх старої бази 1С/BAS, вона успадковує не тільки дані. Вона успадковує старі таблиці, технічні назви, службові поля, дивні типи даних, хеші, регістри, табличні частини, конфігураційні особливості та партнерські доробки.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це не модернізація. &#039;&#039;&#039;Це технічне заручництво.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Документи в 1С: не один запис, а ціла конструкція ==&lt;br /&gt;
&lt;br /&gt;
У 1С документ — це не просто один рядок у таблиці. У нього є шапка документа, стандартні реквізити, номер, дата, організація, примітки та інші службові поля. Крім того, документ може мати одну або кілька табличних частин.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у накладній є шапка документа і є рядки з товарами. Один документ — багато рядків. На рівні бази даних це зв’язок “один до багатьох”.&lt;br /&gt;
&lt;br /&gt;
Якщо табличних частин кілька, структура стає ще складнішою.&lt;br /&gt;
&lt;br /&gt;
Для міграції це критично. Не можна просто взяти документ як один запис. Потрібно правильно забрати шапку, правильно забрати табличні частини, відновити зв’язки, зберегти порядок рядків, не переплутати службові поля з бізнес-даними.&lt;br /&gt;
&lt;br /&gt;
А тепер уявімо реальну базу клієнта. Партнер колись додав свої поля. Потім інший партнер змінив документ. Потім третій дописав обробку. Потім бухгалтер сказав: “Не чіпайте, бо працює”. І все це живе 10–15 років.&lt;br /&gt;
&lt;br /&gt;
І після цього хтось пропонує будувати нову ERP прямо поверх цієї структури.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура. Це технічний вінегрет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Перелічення: коли значення є, але в базі його не видно ==&lt;br /&gt;
&lt;br /&gt;
Окрема проблема — перелічення.&lt;br /&gt;
&lt;br /&gt;
У нормальній реляційній базі даних такі речі часто зберігаються в окремих таблицях: тип товару, тип операції, статус документа, вид складу. У 1С частина таких значень може жити не як повноцінна таблиця, а як елемент конфігурації.&lt;br /&gt;
&lt;br /&gt;
Наприклад, користувач бачить види ТМЦ: товар, послуга, тара, продукція, матеріал, паливо. Але коли ми витягуємо дані напряму, можемо отримати лише ідентифікатор, а не людське значення.&lt;br /&gt;
&lt;br /&gt;
І тоді виникає питання: де взяти розшифровку? У таблиці? У конфігурації? У модулі? У XML? У голові програміста, який звільнився 12 років тому?&lt;br /&gt;
&lt;br /&gt;
Саме тому стару структуру не можна тягнути як фундамент. &#039;&#039;&#039;Вона не є нормальною універсальною моделлю. Це набір рішень конкретної платформи, конкретної конфігурації і конкретних доробок.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== XML підходить не завжди ==&lt;br /&gt;
&lt;br /&gt;
XML-вивантаження може бути зручним для невеликих баз. У ньому можна отримати структуру і дані в одному форматі. Для невеликих систем це може працювати нормально.&lt;br /&gt;
&lt;br /&gt;
Але коли база велика, XML дуже швидко перетворюється на проблему. У ньому багато тегів, багато службової інформації, багато надлишковості. Навіть одна цифра може бути обгорнута відкриваючим тегом, закриваючим тегом і додатковою структурою.&lt;br /&gt;
&lt;br /&gt;
Для маленьких баз — нормально. Для великих баз — часто боляче.&lt;br /&gt;
&lt;br /&gt;
Якщо база має 500 гігабайт або терабайт, XML може стати валізою без ручки: &#039;&#039;&#039;нести важко, кинути шкода&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Для великих проєктів ефективніше працювати напряму з базою даних. Але тут дуже важливий нюанс: напряму — &#039;&#039;&#039;як із джерелом даних&#039;&#039;&#039;, а не як із фундаментом нової ERP.&lt;br /&gt;
&lt;br /&gt;
Прямий доступ потрібен, щоб витягнути дані, працювати порціями, переносити дельту, контролювати завантаження. Але нова ERP не повинна вічно жити на старій структурі 1С.&lt;br /&gt;
&lt;br /&gt;
== Фізичні таблиці: абракадабра як спадщина 90-х ==&lt;br /&gt;
&lt;br /&gt;
У старих DBF-базах були обмеження на імена файлів: вісім символів до крапки і три символи після. У такі обмеження неможливо нормально вмістити “Банківські виписки”, “Контрагенти”, “Номенклатура” або “Місця зберігання”.&lt;br /&gt;
&lt;br /&gt;
Тому 1С історично пішла шляхом технічних ідентифікаторів. Таблиці й поля називалися не так, щоб людині було зрозуміло, а так, щоб воно влізло в старі обмеження.&lt;br /&gt;
&lt;br /&gt;
Потім з’явилися SQL-бази, де таких обмежень уже не було. Але традиція абракадабри залишилася.&lt;br /&gt;
&lt;br /&gt;
Це як людині провели водопровід, а вона все одно ходить до криниці з відрами, бо &#039;&#039;&#039;“так історично склалося”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Саме це показує рівень архітектурного рефакторингу. Якщо за десятиліття не привели до нормального вигляду навіть фундаментальні речі — назви таблиць, типи даних, структуру зберігання, — чому бізнес має вірити, що інші частини системи ідеально сучасні?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не треба вірити. Треба дивитися під капот.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== BAS виглядає сучасніше, але тягне той самий багаж ==&lt;br /&gt;
&lt;br /&gt;
У 1С 8 і BAS з’явилися товстий клієнт, тонкий клієнт, SQL-бази, сервер додатків, регістри накопичення, регістри відомостей, регістри бухгалтерії, регістри розрахунку.&lt;br /&gt;
&lt;br /&gt;
Зовні це виглядає сучасніше, ніж 1С 7.7. Але на рівні структури ми знову бачимо технічні назви, складні типи даних, binary-значення, хеші, посилання, регістри, службові таблиці, табличні частини.&lt;br /&gt;
&lt;br /&gt;
Коли потрібно будувати реальні SQL-запити до бази 1С/BAS, наприклад для Power BI або аналітики, починається технічний квест: знайти таблицю, знайти поле, розшифрувати тип, привести binary, знайти хеш перелічення, зробити join-и, перерахувати дату, не переплутати регістр і не забути табличну частину.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура для майбутнього. Це escape room для програміста.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Такі SQL-запити можуть бути великими, складними, повільними. Особливо на базах у сотні гігабайт або терабайти. Сервери можуть лягати від таких запитів, бо структура не призначена для зручної прямої аналітики.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #2980b9; background: #eaf4ff; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Практичний висновок:&#039;&#039;&#039; пряме підключення до бази 1С/BAS може бути корисним для разового аналізу або міграції. Але будувати на цьому постійну роботу нової ERP — означає перенести старі проблеми в нову систему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому 1С/BAS не можуть просто все відрефакторити ==&lt;br /&gt;
&lt;br /&gt;
Логічне питання: чому ці проблеми не виправили за десятиліття?&lt;br /&gt;
&lt;br /&gt;
Відповідь проста: &#039;&#039;&#039;глибоко переробити фундамент уже дуже складно&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1С історично розробляла платформу й інструмент, а прикладні конфігурації масово робили партнери. Кожна конфігурація могла бути змінена під конкретного клієнта. Якщо зараз радикально змінити структуру таблиць, типи даних, принципи зберігання й відповідності, може посипатися величезна кількість конфігурацій, доробок, інтеграцій і партнерських рішень.&lt;br /&gt;
&lt;br /&gt;
Тому старий багаж не прибирали. Його консервували. Потім зверху додавали нові шари. Потім ще нові. Потім це називали розвитком.&lt;br /&gt;
&lt;br /&gt;
Але значна частина такого “розвитку” — це коли старий технічний борг просто прикривають новими меню, новими назвами і новими презентаціями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BAS у цьому сенсі виглядає як сучасна програма, але всередині несе спадщину системи з 90-х років.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Чому “прозорий перехід” — це пастка ==&lt;br /&gt;
&lt;br /&gt;
І тепер головне.&lt;br /&gt;
&lt;br /&gt;
Чому немає сенсу будувати “прозорий перехід” з 1С або BAS на базі існуючих баз даних і конфігурацій?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #27ae60; background: #ecf9f0; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Коротко:&#039;&#039;&#039; стару базу потрібно розібрати, витягнути з неї дані й перенести їх у нову модель. Але не можна залишати стару структуру як основу майбутньої ERP.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Перше: структура стара.&#039;&#039;&#039; Вона тягне спадщину DBF, DOS, FAT16, старих обмежень, технічних ідентифікаторів і рішень 90-х років.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Друге: структура погана як фундамент для сучасної ERP.&#039;&#039;&#039; Вона може бути джерелом даних, але не архітектурою майбутньої системи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третє: структура різна в різних конфігураціях.&#039;&#039;&#039; Бухгалтерія, торгівля, зарплата, управлінський облік, галузеві рішення — усе може відрізнятися.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четверте: структура дороблена партнерами.&#039;&#039;&#039; Кожна база може бути окремою історією, окремим зоопарком, окремою археологічною пам’яткою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;П’яте: самі 1С/BAS не можуть легко це відрефакторити.&#039;&#039;&#039; Їхня екосистема побудована на платформі, конфігураціях і партнерських доробках. Зміниш фундамент — посиплються надбудови.&lt;br /&gt;
&lt;br /&gt;
Тому “прозорий перехід” на старій структурі — це не модернізація. &#039;&#039;&#039;Це пастка.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ви ніби переходите на нову систему, але фактично залишаєтеся прив’язаними до старої бази, старої логіки, старих таблиць, старих типів даних, старих регістрів, старих хешів, старих дат і старих проблем.&lt;br /&gt;
&lt;br /&gt;
== Правильний підхід: переносити дані, а не стару цвіль ==&lt;br /&gt;
&lt;br /&gt;
Правильний підхід інший.&lt;br /&gt;
&lt;br /&gt;
Стару базу 1С або BAS потрібно використовувати як джерело даних. Її треба розібрати, зрозуміти, розшифрувати структуру, витягнути довідники, документи, залишки, проводки, регістри, аналітику.&lt;br /&gt;
&lt;br /&gt;
Потім потрібно побудувати карту відповідності з K2 ERP і перенести дані в нову нормальну модель.&lt;br /&gt;
&lt;br /&gt;
Тобто ми забираємо з 1С те, що належить бізнесу: &#039;&#039;&#039;дані, історію, документи, аналітику&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Але ми не забираємо стару архітектурну цвіль.&lt;br /&gt;
&lt;br /&gt;
Бо бізнесу потрібні його дані, а не музей технічного боргу.&lt;br /&gt;
&lt;br /&gt;
Саме для цього створюється K2 ERP. Не як нова обгортка поверх старої російської технологічної спадщини, а як сучасна українська ERP-платформа з нормальною архітектурою, зрозумілими моделями даних, веб-інтерфейсом, API, інтеграціями, CRM, обліком, виробництвом, складами, документообігом та аналітикою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP переносить дані в нову архітектуру, а не старий хаос у новий інтерфейс.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Відео: хакнути структуру 1С ==&lt;br /&gt;
&lt;br /&gt;
У відео нижче показано, як виглядає структура 1С/BAS зсередини: старі DBF-файли, конфігуратор, довідники, документи, перелічення, XML, фізичні таблиці, SQL-запити, регістри, товстий і тонкий клієнт.&lt;br /&gt;
&lt;br /&gt;
Це відео не про незаконний злам. Це відео про те, чому стару структуру потрібно розуміти, розшифровувати й використовувати тільки як джерело даних.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;А майбутнє українського бізнесу потрібно будувати вже не на 1С і BAS, а на сучасній, зрозумілій і незалежній ERP-платформі.&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2731</id>
		<title>Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A5%D0%B0%D0%BA%D0%BD%D1%83%D1%82%D0%B8_%D1%81%D1%82%D1%80%D1%83%D0%BA%D1%82%D1%83%D1%80%D1%83_1%D0%A1:_%D1%87%D0%BE%D0%BC%D1%83_%E2%80%9C%D0%BF%D1%80%D0%BE%D0%B7%D0%BE%D1%80%D0%B8%D0%B9_%D0%BF%D0%B5%D1%80%D0%B5%D1%85%D1%96%D0%B4%E2%80%9D_%D0%B7_BAS_%D0%BD%D0%B0_%D1%81%D1%82%D0%B0%D1%80%D0%B8%D1%85_%D0%B1%D0%B0%D0%B7%D0%B0%D1%85_%E2%80%94_%D1%86%D0%B5_%D0%BF%D0%B0%D1%81%D1%82%D0%BA%D0%B0&amp;diff=2731"/>
		<updated>2026-07-09T19:34:24Z</updated>

		<summary type="html">&lt;p&gt;R: Створена сторінка: = Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка =  Коли бізнес говорить про перехід з 1С або BAS на сучасну ERP-систему, часто виникає спокуслива ідея: &amp;#039;&amp;#039;&amp;#039;“А давайте нічого не переносити. Просто підключимо нову систему до стар...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка =&lt;br /&gt;
&lt;br /&gt;
Коли бізнес говорить про перехід з 1С або BAS на сучасну ERP-систему, часто виникає спокуслива ідея: &#039;&#039;&#039;“А давайте нічого не переносити. Просто підключимо нову систему до старої бази 1С/BAS і будемо працювати далі”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
На перший погляд це виглядає красиво: швидко, дешево, безболісно. Нібито не потрібно переносити довідники, документи, залишки, проводки, регістри, історію операцій. Нібито достатньо зробити новий інтерфейс, під’єднатися до старої бази — і компанія вже працює в “новій системі”.&lt;br /&gt;
&lt;br /&gt;
Але на практиці це приблизно як поставити екран від Tesla в старий “Запорожець” і сказати: тепер у нас електрокар.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не буде електрокара.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Бо проблема 1С та BAS не тільки в інтерфейсі. Проблема значно глибше — &#039;&#039;&#039;у самій структурі бази даних, типах даних, старих архітектурних рішеннях, конфігураціях, партнерських доробках і технологічному багажі, який тягнеться ще з 90-х років&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #e67e22; background: #fff4e6; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна думка:&#039;&#039;&#039; стару базу 1С/BAS можна використовувати як джерело даних для міграції, але не як фундамент для нової ERP-системи.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== BAS — це не нова архітектура, а стара технологічна лінія 1С ==&lt;br /&gt;
&lt;br /&gt;
1С з’явилась ще у 90-х роках. Спочатку були DOS-версії, потім Windows-версії, далі 1С 7.5, 1С 7.7, потім платформа 8.1, 8.2, 8.3 та наступні версії.&lt;br /&gt;
&lt;br /&gt;
BAS фактично продовжує технологічну лінію 1С 8.3. Змінилася назва, змінилася іконка, змінилася маркетингова обгортка. Але &#039;&#039;&#039;фундаментальна спадщина 1С залишилася всередині&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це дуже важливо розуміти. Якщо зовні програма виглядає сучасніше, це ще не означає, що всередині вона має сучасну архітектуру. Інтерфейс можна перемалювати. Кнопки можна зробити красивішими. Назву можна змінити. Але якщо структура бази даних, типи даних і логіка зберігання інформації тягнуться з минулого століття — це вже не косметична проблема, а системний технічний борг.&lt;br /&gt;
&lt;br /&gt;
== 1С 7.7: архітектурна археологія у DBF-файлах ==&lt;br /&gt;
&lt;br /&gt;
У 1С 7.7 дані зберігалися у DBF-файлах. Для свого часу це було нормальним рішенням. Але для сучасної ERP це вже &#039;&#039;&#039;технологічна археологія&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
DBF — це файлова база даних. Поруч із файлами даних існували індексні файли. Якщо індекси пошкоджувалися, базу потрібно було відкривати в монопольному режимі й переіндексувати. Додайте сюди старі кодування, обмеження на назви файлів, проблеми з кирилицею, службові файли, специфічне зберігання користувачів і прав — і ми отримуємо цілий набір рішень, які були логічними для 90-х, але погано підходять для сучасної ERP-архітектури.&lt;br /&gt;
&lt;br /&gt;
І найцікавіше, що багато компаній досі мають такі бази. Колись почали облік у 1С 7.7, потім звикли, потім накопичили доробки, потім стало страшно переходити, бо можна втратити історію. І так база живе роками.&lt;br /&gt;
&lt;br /&gt;
Це як старий холодильник на дачі: гуде, тече, морозить тільки одну полицю, але &#039;&#039;&#039;“викидати шкода, він же ще працює”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Чому стара структура не може бути фундаментом нової ERP ==&lt;br /&gt;
&lt;br /&gt;
Користувач у 1С бачить меню, довідники, документи, звіти. Для бухгалтера або менеджера цього достатньо. Але для міграції цього замало.&lt;br /&gt;
&lt;br /&gt;
Потрібно розуміти, &#039;&#039;&#039;де фізично зберігаються дані&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* де лежать довідники;&lt;br /&gt;
* де лежать документи;&lt;br /&gt;
* де шапка документа;&lt;br /&gt;
* де табличні частини;&lt;br /&gt;
* де регістри;&lt;br /&gt;
* де перелічення;&lt;br /&gt;
* де службові поля;&lt;br /&gt;
* де реальні бізнес-дані, а де технічний шум платформи.&lt;br /&gt;
&lt;br /&gt;
У конфігураторі 1С ми бачимо логічну структуру: довідники, документи, журнали документів, перелічення, звіти, обробки, плани рахунків, регістри. Але те, що видно в конфігураторі, і те, як це фізично лежить у базі даних, — це різні речі.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у конфігураторі є довідник “Банки”. А фізично в базі це може бути таблиця з технічною назвою типу &amp;lt;code&amp;gt;SC327&amp;lt;/code&amp;gt;, а поля можуть називатися &amp;lt;code&amp;gt;SP330&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;SP2499&amp;lt;/code&amp;gt; тощо.&lt;br /&gt;
&lt;br /&gt;
Для людини це незручно. Для міграції це означає, що потрібно будувати карту відповідностей: логічна сутність, фізична таблиця, фізичне поле, тип даних, модель K2 ERP, поле K2 ERP.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #c0392b; background: #fdecea; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; якщо нова система просто працює поверх старої бази 1С/BAS, вона успадковує не тільки дані. Вона успадковує старі таблиці, технічні назви, службові поля, дивні типи даних, хеші, регістри, табличні частини, конфігураційні особливості та партнерські доробки.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це не модернізація. &#039;&#039;&#039;Це технічне заручництво.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Документи в 1С: не один запис, а ціла конструкція ==&lt;br /&gt;
&lt;br /&gt;
У 1С документ — це не просто один рядок у таблиці. У нього є шапка документа, стандартні реквізити, номер, дата, організація, примітки та інші службові поля. Крім того, документ може мати одну або кілька табличних частин.&lt;br /&gt;
&lt;br /&gt;
Наприклад, у накладній є шапка документа і є рядки з товарами. Один документ — багато рядків. На рівні бази даних це зв’язок “один до багатьох”.&lt;br /&gt;
&lt;br /&gt;
Якщо табличних частин кілька, структура стає ще складнішою.&lt;br /&gt;
&lt;br /&gt;
Для міграції це критично. Не можна просто взяти документ як один запис. Потрібно правильно забрати шапку, правильно забрати табличні частини, відновити зв’язки, зберегти порядок рядків, не переплутати службові поля з бізнес-даними.&lt;br /&gt;
&lt;br /&gt;
А тепер уявімо реальну базу клієнта. Партнер колись додав свої поля. Потім інший партнер змінив документ. Потім третій дописав обробку. Потім бухгалтер сказав: “Не чіпайте, бо працює”. І все це живе 10–15 років.&lt;br /&gt;
&lt;br /&gt;
І після цього хтось пропонує будувати нову ERP прямо поверх цієї структури.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура. Це технічний вінегрет.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Перелічення: коли значення є, але в базі його не видно ==&lt;br /&gt;
&lt;br /&gt;
Окрема проблема — перелічення.&lt;br /&gt;
&lt;br /&gt;
У нормальній реляційній базі даних такі речі часто зберігаються в окремих таблицях: тип товару, тип операції, статус документа, вид складу. У 1С частина таких значень може жити не як повноцінна таблиця, а як елемент конфігурації.&lt;br /&gt;
&lt;br /&gt;
Наприклад, користувач бачить види ТМЦ: товар, послуга, тара, продукція, матеріал, паливо. Але коли ми витягуємо дані напряму, можемо отримати лише ідентифікатор, а не людське значення.&lt;br /&gt;
&lt;br /&gt;
І тоді виникає питання: де взяти розшифровку? У таблиці? У конфігурації? У модулі? У XML? У голові програміста, який звільнився 12 років тому?&lt;br /&gt;
&lt;br /&gt;
Саме тому стару структуру не можна тягнути як фундамент. &#039;&#039;&#039;Вона не є нормальною універсальною моделлю. Це набір рішень конкретної платформи, конкретної конфігурації і конкретних доробок.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== XML підходить не завжди ==&lt;br /&gt;
&lt;br /&gt;
XML-вивантаження може бути зручним для невеликих баз. У ньому можна отримати структуру і дані в одному форматі. Для невеликих систем це може працювати нормально.&lt;br /&gt;
&lt;br /&gt;
Але коли база велика, XML дуже швидко перетворюється на проблему. У ньому багато тегів, багато службової інформації, багато надлишковості. Навіть одна цифра може бути обгорнута відкриваючим тегом, закриваючим тегом і додатковою структурою.&lt;br /&gt;
&lt;br /&gt;
Для маленьких баз — нормально. Для великих баз — часто боляче.&lt;br /&gt;
&lt;br /&gt;
Якщо база має 500 гігабайт або терабайт, XML може стати валізою без ручки: &#039;&#039;&#039;нести важко, кинути шкода&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Для великих проєктів ефективніше працювати напряму з базою даних. Але тут дуже важливий нюанс: напряму — &#039;&#039;&#039;як із джерелом даних&#039;&#039;&#039;, а не як із фундаментом нової ERP.&lt;br /&gt;
&lt;br /&gt;
Прямий доступ потрібен, щоб витягнути дані, працювати порціями, переносити дельту, контролювати завантаження. Але нова ERP не повинна вічно жити на старій структурі 1С.&lt;br /&gt;
&lt;br /&gt;
== Фізичні таблиці: абракадабра як спадщина 90-х ==&lt;br /&gt;
&lt;br /&gt;
У старих DBF-базах були обмеження на імена файлів: вісім символів до крапки і три символи після. У такі обмеження неможливо нормально вмістити “Банківські виписки”, “Контрагенти”, “Номенклатура” або “Місця зберігання”.&lt;br /&gt;
&lt;br /&gt;
Тому 1С історично пішла шляхом технічних ідентифікаторів. Таблиці й поля називалися не так, щоб людині було зрозуміло, а так, щоб воно влізло в старі обмеження.&lt;br /&gt;
&lt;br /&gt;
Потім з’явилися SQL-бази, де таких обмежень уже не було. Але традиція абракадабри залишилася.&lt;br /&gt;
&lt;br /&gt;
Це як людині провели водопровід, а вона все одно ходить до криниці з відрами, бо &#039;&#039;&#039;“так історично склалося”&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Саме це показує рівень архітектурного рефакторингу. Якщо за десятиліття не привели до нормального вигляду навіть фундаментальні речі — назви таблиць, типи даних, структуру зберігання, — чому бізнес має вірити, що інші частини системи ідеально сучасні?&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Не треба вірити. Треба дивитися під капот.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== BAS виглядає сучасніше, але тягне той самий багаж ==&lt;br /&gt;
&lt;br /&gt;
У 1С 8 і BAS з’явилися товстий клієнт, тонкий клієнт, SQL-бази, сервер додатків, регістри накопичення, регістри відомостей, регістри бухгалтерії, регістри розрахунку.&lt;br /&gt;
&lt;br /&gt;
Зовні це виглядає сучасніше, ніж 1С 7.7. Але на рівні структури ми знову бачимо технічні назви, складні типи даних, binary-значення, хеші, посилання, регістри, службові таблиці, табличні частини.&lt;br /&gt;
&lt;br /&gt;
Коли потрібно будувати реальні SQL-запити до бази 1С/BAS, наприклад для Power BI або аналітики, починається технічний квест: знайти таблицю, знайти поле, розшифрувати тип, привести binary, знайти хеш перелічення, зробити join-и, перерахувати дату, не переплутати регістр і не забути табличну частину.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Це не архітектура для майбутнього. Це escape room для програміста.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Такі SQL-запити можуть бути великими, складними, повільними. Особливо на базах у сотні гігабайт або терабайти. Сервери можуть лягати від таких запитів, бо структура не призначена для зручної прямої аналітики.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #2980b9; background: #eaf4ff; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Практичний висновок:&#039;&#039;&#039; пряме підключення до бази 1С/BAS може бути корисним для разового аналізу або міграції. Але будувати на цьому постійну роботу нової ERP — означає перенести старі проблеми в нову систему.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому 1С/BAS не можуть просто все відрефакторити ==&lt;br /&gt;
&lt;br /&gt;
Логічне питання: чому ці проблеми не виправили за десятиліття?&lt;br /&gt;
&lt;br /&gt;
Відповідь проста: &#039;&#039;&#039;глибоко переробити фундамент уже дуже складно&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
1С історично розробляла платформу й інструмент, а прикладні конфігурації масово робили партнери. Кожна конфігурація могла бути змінена під конкретного клієнта. Якщо зараз радикально змінити структуру таблиць, типи даних, принципи зберігання й відповідності, може посипатися величезна кількість конфігурацій, доробок, інтеграцій і партнерських рішень.&lt;br /&gt;
&lt;br /&gt;
Тому старий багаж не прибирали. Його консервували. Потім зверху додавали нові шари. Потім ще нові. Потім це називали розвитком.&lt;br /&gt;
&lt;br /&gt;
Але значна частина такого “розвитку” — це коли старий технічний борг просто прикривають новими меню, новими назвами і новими презентаціями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;BAS у цьому сенсі виглядає як сучасна програма, але всередині несе спадщину системи з 90-х років.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Чому “прозорий перехід” — це пастка ==&lt;br /&gt;
&lt;br /&gt;
І тепер головне.&lt;br /&gt;
&lt;br /&gt;
Чому немає сенсу будувати “прозорий перехід” з 1С або BAS на базі існуючих баз даних і конфігурацій?&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;border-left: 6px solid #27ae60; background: #ecf9f0; padding: 14px 18px; margin: 18px 0; border-radius: 6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Коротко:&#039;&#039;&#039; стару базу потрібно розібрати, витягнути з неї дані й перенести їх у нову модель. Але не можна залишати стару структуру як основу майбутньої ERP.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Перше: структура стара.&#039;&#039;&#039; Вона тягне спадщину DBF, DOS, FAT16, старих обмежень, технічних ідентифікаторів і рішень 90-х років.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Друге: структура погана як фундамент для сучасної ERP.&#039;&#039;&#039; Вона може бути джерелом даних, але не архітектурою майбутньої системи.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Третє: структура різна в різних конфігураціях.&#039;&#039;&#039; Бухгалтерія, торгівля, зарплата, управлінський облік, галузеві рішення — усе може відрізнятися.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Четверте: структура дороблена партнерами.&#039;&#039;&#039; Кожна база може бути окремою історією, окремим зоопарком, окремою археологічною пам’яткою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;П’яте: самі 1С/BAS не можуть легко це відрефакторити.&#039;&#039;&#039; Їхня екосистема побудована на платформі, конфігураціях і партнерських доробках. Зміниш фундамент — посиплються надбудови.&lt;br /&gt;
&lt;br /&gt;
Тому “прозорий перехід” на старій структурі — це не модернізація. &#039;&#039;&#039;Це пастка.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Ви ніби переходите на нову систему, але фактично залишаєтеся прив’язаними до старої бази, старої логіки, старих таблиць, старих типів даних, старих регістрів, старих хешів, старих дат і старих проблем.&lt;br /&gt;
&lt;br /&gt;
== Правильний підхід: переносити дані, а не стару цвіль ==&lt;br /&gt;
&lt;br /&gt;
Правильний підхід інший.&lt;br /&gt;
&lt;br /&gt;
Стару базу 1С або BAS потрібно використовувати як джерело даних. Її треба розібрати, зрозуміти, розшифрувати структуру, витягнути довідники, документи, залишки, проводки, регістри, аналітику.&lt;br /&gt;
&lt;br /&gt;
Потім потрібно побудувати карту відповідності з K2 ERP і перенести дані в нову нормальну модель.&lt;br /&gt;
&lt;br /&gt;
Тобто ми забираємо з 1С те, що належить бізнесу: &#039;&#039;&#039;дані, історію, документи, аналітику&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Але ми не забираємо стару архітектурну цвіль.&lt;br /&gt;
&lt;br /&gt;
Бо бізнесу потрібні його дані, а не музей технічного боргу.&lt;br /&gt;
&lt;br /&gt;
Саме для цього створюється K2 ERP. Не як нова обгортка поверх старої російської технологічної спадщини, а як сучасна українська ERP-платформа з нормальною архітектурою, зрозумілими моделями даних, веб-інтерфейсом, API, інтеграціями, CRM, обліком, виробництвом, складами, документообігом та аналітикою.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP переносить дані в нову архітектуру, а не старий хаос у новий інтерфейс.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Відео: хакнути структуру 1С ==&lt;br /&gt;
&lt;br /&gt;
У відео нижче показано, як виглядає структура 1С/BAS зсередини: старі DBF-файли, конфігуратор, довідники, документи, перелічення, XML, фізичні таблиці, SQL-запити, регістри, товстий і тонкий клієнт.&lt;br /&gt;
&lt;br /&gt;
Це відео не про незаконний злам. Це відео про те, чому стару структуру потрібно розуміти, розшифровувати й використовувати тільки як джерело даних.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;А майбутнє українського бізнесу потрібно будувати вже не на 1С і BAS, а на сучасній, зрозумілій і незалежній ERP-платформі.&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%97%D0%B0%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0_1.png&amp;diff=2730</id>
		<title>Файл:Заставка 1.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%A4%D0%B0%D0%B9%D0%BB:%D0%97%D0%B0%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B0_1.png&amp;diff=2730"/>
		<updated>2026-07-09T19:34:06Z</updated>

		<summary type="html">&lt;p&gt;R: Файл завантажений з MsUpload&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Файл завантажений з MsUpload&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0&amp;diff=2729</id>
		<title>Головна сторінка</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%93%D0%BE%D0%BB%D0%BE%D0%B2%D0%BD%D0%B0_%D1%81%D1%82%D0%BE%D1%80%D1%96%D0%BD%D0%BA%D0%B0&amp;diff=2729"/>
		<updated>2026-07-09T19:33:53Z</updated>

		<summary type="html">&lt;p&gt;R: Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Wiki k2erp.png|центр|міні|800x800пкс|Wiki K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Про систему K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP]] — це комплексна система управління підприємством, яка об’єднує фінанси, бухгалтерію, продажі, склад, закупівлі, документообіг, CRM, аналітику та галузеві модулі в єдиному цифровому середовищі. Система допомагає автоматизувати щоденні процеси, зменшити ручну роботу й кількість помилок, контролювати ресурси в реальному часі, швидше обробляти заявки та документи, бачити повну картину бізнесу й приймати точні управлінські рішення на основі актуальних даних. Завдяки модульності, хмарному доступу та гнучкому налаштуванню K2 ERP підходить для компаній різного масштабу й допомагає бізнесу працювати прозоріше, ефективніше та впевнено масштабуватися.&lt;br /&gt;
&lt;br /&gt;
Подробно про систему читайте в статті: [[K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Відмова від 1С та BAS під ключ: перехід неминучий — питання лише в тому, хто встигне зробити його планово]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP — реальна альтернатива 1С та BAS? Бо міняти російське ПЗ на “майже те саме” — це вже не стратегія, а бізнесовий мазохізм]]&lt;br /&gt;
&lt;br /&gt;
[[ERP нового покоління: чому власна платформа K2 ERP на Python і TypeScript сильніша за спадщину 1С/BAS та важкі enterprise-рішення]]&lt;br /&gt;
&lt;br /&gt;
[[Короткі відео про роботу в K2 ERP: українська ERP, яку можна побачити в дії]]&lt;br /&gt;
&lt;br /&gt;
[[Ознайомче відео про K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Альтернатива 1С: якою вона повинна бути насправді]]&lt;br /&gt;
&lt;br /&gt;
[[Робимо бізнес разом!]]&lt;br /&gt;
&lt;br /&gt;
[[Не витрачайте роки та гроші на ERP з нуля. Об’єднуймося навколо K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Лавинний розвиток K2 ERP: чому відкрита українська ERP-система розвивається швидше за старий світ 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP йде шляхом швидкої розробки, моделей, конструкторів і об’єднання даних]]&lt;br /&gt;
&lt;br /&gt;
[[Чому K2 ERP розвиває власну систему, а не Odoo, IT-Enterprise чи SAP]]&lt;br /&gt;
&lt;br /&gt;
[[Візитка K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Хто ваш клієнт, K2?]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP відкрила безкоштовну хмару для українського бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Інструменти розробника K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Програмування зі швидкістю думки]]&lt;br /&gt;
&lt;br /&gt;
[[Чим відрізняється робота в cloud.corp2.eu від власної хмари]]&lt;br /&gt;
&lt;br /&gt;
[[Розробка K2 ERP на замовлення як правильний перехід з 1С та BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Продуктова компанія, інтегратор чи гібридна модель K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Нові можливості K2 ERP: коли система розвивається з параболічною швидкістю (травень 2026)]]&lt;br /&gt;
&lt;br /&gt;
[[Можливості K2 ERP — травень 2026]]&lt;br /&gt;
&lt;br /&gt;
[[Новий модуль «Зарплата та кадри» в K2 ERP: коли зарплата рахується, кадри не губляться, а бухгалтер більше не живе в Excel]]&lt;br /&gt;
&lt;br /&gt;
[[Виробництво без хаосу: як модуль «Виробництво» в K2 ERP веде виріб від специфікації до готової продукції]]&lt;br /&gt;
&lt;br /&gt;
== Вартість K2 ERP ==&lt;br /&gt;
[[Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії]]&lt;br /&gt;
&lt;br /&gt;
== Перехід з 1С та BAS на K2 ERP ==&lt;br /&gt;
[[Хакнути структуру 1С: чому “прозорий перехід” з BAS на старих базах — це пастка]]&lt;br /&gt;
&lt;br /&gt;
== Стандартизація ==&lt;br /&gt;
[[ISO 9001 Scrum регламент K2 ERP: система якості, тижневі спринти, Zoom-записи, VDoc і Telegram-комунікації|ISO 9001 + Scrum + регламент K2 ERP: система якості, тижневі спринти, Zoom-записи, VDoc і Telegram-комунікації]]&lt;br /&gt;
&lt;br /&gt;
== Акції та пропозиції ==&lt;br /&gt;
[[Навчайте студентів працювати з українською ERP-системою K2 ERP — альтернативою 1С та BAS]]&lt;br /&gt;
&lt;br /&gt;
== Вакансії ==&lt;br /&gt;
[[Python-програмісти, які хочуть працювати з K2 ERP: не чекайте “колись”. Починайте зараз]]&lt;br /&gt;
&lt;br /&gt;
== Історія про K2 ERP ==&lt;br /&gt;
[[Звідки взявся K2® ERP]]&lt;br /&gt;
&lt;br /&gt;
== Сайти K2 ERP ==&lt;br /&gt;
[[Ресурси K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Комунікація з K2 ERP ==&lt;br /&gt;
[[Регламент K2]]&lt;br /&gt;
&lt;br /&gt;
[[Звернення через HelpDesk]]&lt;br /&gt;
&lt;br /&gt;
== Концептуальні підходи та принципи роботи ==&lt;br /&gt;
[[Кількість ліцензій BAS проти безліміту K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Концепція передпродажних модулів K2 ERP: як малими внесками перемагати великі системи]]&lt;br /&gt;
&lt;br /&gt;
[[Магія єдиної системи: чому модульний підхід K2 ERP у рази, десятки разів і навіть на порядки ефективніший за 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[AI в K2 ERP: коли облік перестає бути нудним, а бізнес починає дихати на повні груди]]&lt;br /&gt;
&lt;br /&gt;
[[Чи є ризик залежності від одного підрядника при автоматизації бізнесу?]]&lt;br /&gt;
&lt;br /&gt;
[[Другий раз платити за той самий “зоопарк” ніхто не хоче: чому перехід з 1С на K2 ERP — це не про нову кастомізацію, а про нову логіку бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Чому “олдскульні” гриди насправді рятують бізнес: краса інтерфейсу не дорівнює силі продукту]]&lt;br /&gt;
&lt;br /&gt;
[[Крос-платформеність: та сама “дрібниця”, на якій великі компанії щороку залишають купу грошей]]&lt;br /&gt;
&lt;br /&gt;
== Пояснення термінів ==&lt;br /&gt;
&lt;br /&gt;
[[Що таке ERP — і чому справжня ERP-система починається там, де закінчується звичка зводити бізнес до бухгалтерії]]&lt;br /&gt;
&lt;br /&gt;
[[Що таке CRM і чому її інтеграція з ERP відкриває нові можливості для бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[CMS у K2 ERP: сайт компанії, який не просто “висить в інтернеті”, а працює на бізнес]]&lt;br /&gt;
&lt;br /&gt;
[[Інтернет-магазин у K2 ERP: коли онлайн-продажі стають частиною єдиної системи, а не окремим головним болем]]&lt;br /&gt;
&lt;br /&gt;
== Для користувачів ==&lt;br /&gt;
&lt;br /&gt;
[[Початок роботи з K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Звіти в K2 Cloud ERP|Звіти в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[CRM Файли в K2 ERP|CRM + Файли в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Повне відео демонстрації K2 ERP доступне з оригінальним голосом інтерфейсу та реального показу роботи системи]]&lt;br /&gt;
&lt;br /&gt;
[[Хмара K2 ERP для безкоштовної реальної роботи]] &lt;br /&gt;
&lt;br /&gt;
[[Управлінський облік K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Бухгалтерія K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[CRM K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Складський облік K2 ERP (WMS)]]&lt;br /&gt;
&lt;br /&gt;
[[CMS K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Інтернет-магазин K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 VDoc]]&lt;br /&gt;
&lt;br /&gt;
[[Галузеві рішення K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Звіти та аналітика K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Поширені питання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Використання штучного інтелекту в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Для адміністраторів K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Для адміністраторів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор хмари K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор гілки K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Адміністратор проєкту K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Користувачі та ролі K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Права доступу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Налаштування інтерфейсу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Друковані форми K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Кастомізація звітів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Контроль і аудит K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Для програмістів ==&lt;br /&gt;
&lt;br /&gt;
[[Розгортання системи K2 ERP Python для розробників]]&lt;br /&gt;
&lt;br /&gt;
[[Архітектура K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Встановлення K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Розгортання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Створення модулів K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[База даних K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[API K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Інтеграції K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 CMS]]&lt;br /&gt;
&lt;br /&gt;
[[Розробка веб-інтерфейсів K2]]&lt;br /&gt;
&lt;br /&gt;
[[Бізнес-процеси K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Права доступу K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Рекомендації для розробників K2]]&lt;br /&gt;
&lt;br /&gt;
[[Класи та команди K2 ERP Python]]&lt;br /&gt;
&lt;br /&gt;
[[Стандарти UI K2 2025]]&lt;br /&gt;
&lt;br /&gt;
== Атестаційні завдання по K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Атестаційні завдання по K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== K2 ERP PHP ==&lt;br /&gt;
&lt;br /&gt;
[[Практична робота в K2 ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
[[Інструкція по розгортанню K2 ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
[[Класи та команди K2 Cloud ERP PHP]]&lt;br /&gt;
&lt;br /&gt;
== Довідник та модулі системи K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
== Комплексні рішення K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP технологічна платформа]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Управлінський облік]]&lt;br /&gt;
&lt;br /&gt;
== Модулі K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[K2 Ядро]]&lt;br /&gt;
&lt;br /&gt;
[[K2 CMS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Інтернет-магазин]]&lt;br /&gt;
&lt;br /&gt;
[[К2 CRM]]&lt;br /&gt;
&lt;br /&gt;
[[К2 WMS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 VDoc (Електронний документообіг)]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Система online-навчання]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Документообіг]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Дошка оголошень]]&lt;br /&gt;
&lt;br /&gt;
[[К2 Портал творів мистецтва]]&lt;br /&gt;
&lt;br /&gt;
[[К2 ТОІР та облік запчастин]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Update]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Фінансовий облік]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Каса]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Ресторан]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Готель]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Зарплата та кадри]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Виробництво]]&lt;br /&gt;
&lt;br /&gt;
[[K2 multi-GAAP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 HelpDesk]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Мобільний додаток Android]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Мобільний додаток IOS]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Стоматологічна клініка]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Салон краси]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Бронювання послуг]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Автоперевезення]]&lt;br /&gt;
&lt;br /&gt;
== Інтеграційні модулі K2 ERP ==&lt;br /&gt;
[[K2 Модуль Медок]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Вчасно]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Птах]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Мурашина логістика]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль GPS-трекінг]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Вчасно Каса]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Ringostat до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Нова пошта]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Укрпошта]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Телеграм бот до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Whatsapp бот до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Turbosms до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Email до CRM]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Hurma]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль обмінів з банками]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Horoshop]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Rozetka]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Prom]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Hotline]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль ДПС]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Приватбанк]]&lt;br /&gt;
&lt;br /&gt;
[[Модуль Edin]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Liqpay для інтернет-магазину]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Модуль Wayforpay для інтернет-магазину]]&lt;br /&gt;
&lt;br /&gt;
== Інструментальні модулі K2 ERP ==&lt;br /&gt;
[[K2 Конструктор структури бази даних]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Конструктор звітів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Конструктор BI звітів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Реплікатор]]&lt;br /&gt;
&lt;br /&gt;
[[IDE в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Десктопні додатки ==&lt;br /&gt;
[[K2 Cloud ERP: Десктопний додаток для Linux, Windows та macOS — швидка робота з хмарами без хаосу вкладок]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Desktop — коли потужність розробки перетворюється на зручний інструмент]]&lt;br /&gt;
&lt;br /&gt;
[[K2 Cloud ERP Desktop: один додаток замість десятків вкладок, ярликів і “вічного пошуку потрібного вікна”]]&lt;br /&gt;
&lt;br /&gt;
== Торгове та перефірійне обладнання ==&lt;br /&gt;
[[РРО та ПРРО]]&lt;br /&gt;
&lt;br /&gt;
== Модулі на PHP ==&lt;br /&gt;
[[Mantis BT K2]]&lt;br /&gt;
&lt;br /&gt;
== Робота в K2 ==&lt;br /&gt;
[[Налаштування WireGuard]]&lt;br /&gt;
&lt;br /&gt;
[[Веб-Пошта]]&lt;br /&gt;
&lt;br /&gt;
== Навігація за категоріями ==&lt;br /&gt;
Усі статті бази знань автоматично групуються за категоріями:&lt;br /&gt;
&lt;br /&gt;
* [[:Категорія:ERP-системи|ERP-системи]]&lt;br /&gt;
* [[:Категорія:Програмне забезпечення, розроблене в Україні|Українське ПЗ]]&lt;br /&gt;
* [[:Категорія:Програмне забезпечення для бізнесу|ПЗ для бізнесу]]&lt;br /&gt;
&lt;br /&gt;
== Порівняння систем ==&lt;br /&gt;
&lt;br /&gt;
[[Чим K2 ERP краще за 1С/BAS, Парус/Афіна, Бітрікс, BIMP, A5 та інші ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs BAS ERP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs BAS Управління торгівлею (UT)]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Парус-Підприємство]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs SAP]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Microsoft Dynamics 365]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Oracle NetSuite]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Odoo]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP vs Scoro]]&lt;br /&gt;
&lt;br /&gt;
== Партнерство ==&lt;br /&gt;
[[Умови партнерства]]&lt;br /&gt;
&lt;br /&gt;
[[Партнери K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Кейси K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
[[Кейс: як ми посилили ТОІР транспорту Нової пошти та цифровізували облік ремонтів і деталей для Kamag]]&lt;br /&gt;
&lt;br /&gt;
== Статті по IT ==&lt;br /&gt;
&lt;br /&gt;
[[Скільки реально коштують “дешеві” ліцензії Odoo, Microsoft Dynamics і SAP у порівнянні з K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Україна має виростити власні продуктові IT-компанії. Інакше за нас це зроблять чужі]]&lt;br /&gt;
&lt;br /&gt;
[[Смерть під ковдрою ілюзій: Чому перехід з 1С на BAS у 2026 році — це найдорожчий самообман українського бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[BAS маскувалась під український продукт. А тепер російський K2 Cloud може маскувати K2 під російський? Дивний маскарад брендів триває]]&lt;br /&gt;
&lt;br /&gt;
[[BAS нема чого запропонувати ринку, крім 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Давайте називати все своїми іменами: 1С, а не BAS. Говоріть завжди 1С, не йдіть на поводу ребрендіга 1С!]]&lt;br /&gt;
&lt;br /&gt;
[[Пастка SaaS-систем]]&lt;br /&gt;
&lt;br /&gt;
[[BAS стає токсичним — чому українському бізнесу час відмовитися від 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Росія виграє. 12:0 на користь росії]]&lt;br /&gt;
&lt;br /&gt;
[[BAS у вишиванці, або 1С, яка сходила на ребрендинг]]&lt;br /&gt;
&lt;br /&gt;
[[1С нагадує наші технології 20-річної давнини. Ба, це і є технології тих часів]]&lt;br /&gt;
&lt;br /&gt;
[[BAS — це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS та іншому ворожому софту — капут]]&lt;br /&gt;
&lt;br /&gt;
[[Еволюція веде до революції]]&lt;br /&gt;
&lt;br /&gt;
[[Чому українські ERP досі не витіснили 1С та BAS з ринку України за 12 років війни]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: 30 років російського запору в українському бізнесі]]&lt;br /&gt;
&lt;br /&gt;
[[Гібридний трактор Lamborghini і гібридна ERP K2: як українська технологія може змінити ринок автоматизації]]&lt;br /&gt;
&lt;br /&gt;
[[Як російські ERP-системи змінили прапор, але не змінили код]]&lt;br /&gt;
&lt;br /&gt;
[[Кому “заборонено” 1С та BAS?]]&lt;br /&gt;
&lt;br /&gt;
[[BASкетбол з санкціями: як “українська альтернатива 1С” закидає бізнесу рекламні трьохочкові]]&lt;br /&gt;
&lt;br /&gt;
[[BAS, BaaS, BAF — це нова етикетка для старого 1С. Час називати речі своїми іменами]]&lt;br /&gt;
&lt;br /&gt;
[[Як закалявся BAS, або як 1С фарбували на Великдень]]&lt;br /&gt;
&lt;br /&gt;
[[Життя після 1С та BAS: Великий огляд українського ринку ERP-систем та реальних альтернатив у 2026 році]]&lt;br /&gt;
&lt;br /&gt;
[[Відкритий похідний код, Open Source і K2 ERP: коли програмісти відкривають капот, але не віддають ключі від усього автопарку]]&lt;br /&gt;
&lt;br /&gt;
[[Цифрова деокупація та санкції в Україні]]&lt;br /&gt;
&lt;br /&gt;
[[Український бізнес і його токсичні стосунки з 1С/BAS: сміємося, платимо, страждаємо — і далі називаємо це “автоматизацією”]]&lt;br /&gt;
&lt;br /&gt;
[[1С більше не законодавець мод. Тепер тренди створюють українські ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Безкоштовна українська хмара для малого бізнесу: стартуйте сьогодні, зростайте без обмежень]]&lt;br /&gt;
&lt;br /&gt;
[[Не продавати доступ. Продавати свободу: чому майбутнє програмного забезпечення — за відкритими системами з чесною монетизацією]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: софт для країни, де держава не довіряє бізнесу. І саме тому він не потрібен країні, яка хоче бути вільною]]&lt;br /&gt;
&lt;br /&gt;
[[1С/BAS: система, в якій майбутнє давно натиснуло “Вийти без збереження”]]&lt;br /&gt;
&lt;br /&gt;
== Мови програмування, тренди ==&lt;br /&gt;
[[Світ у 2025: які мови «правлять балом»]]&lt;br /&gt;
&lt;br /&gt;
== Технічні завдання K2 ERP ==&lt;br /&gt;
[[Приклади технічного завдання K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Акції K2 ERP ==&lt;br /&gt;
[[Ловіть шару: передпродажний модуль Бухгалтерії та податкового обліку зараз включає CRM, CMS та інтернет-магазин]]&lt;br /&gt;
&lt;br /&gt;
== Інвестиції в K2 ERP ==&lt;br /&gt;
[[Інвестиції в K2 ERP — українську платформу для заміни 1С/BAS та масової автоматизації бізнесу]]&lt;br /&gt;
&lt;br /&gt;
[[Хто працює в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Використання K2 ERP ==&lt;br /&gt;
[[K2: платформа, після якої старий софт починає нервово шукати валізу]]&lt;br /&gt;
&lt;br /&gt;
[[Новий модуль K2 ERP для контролю звітності: коли сотні клієнтів, десятки дедлайнів і жодного права на ой, забули]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP як український Біткоїн]]&lt;br /&gt;
&lt;br /&gt;
[[Варіанти використання K2 ERP по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[ERP продукти]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP — українська ERP для виробництва, складу, торгівлі, ФОП, агро, логістики та заміни BAS ERP]]&lt;br /&gt;
&lt;br /&gt;
[[Всі ERP терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі бізнес-процеси]]&lt;br /&gt;
&lt;br /&gt;
[[Всі інтеграції]]&lt;br /&gt;
&lt;br /&gt;
[[Всі українські сервіси]]&lt;br /&gt;
&lt;br /&gt;
[[Всі ERP модулі]]&lt;br /&gt;
&lt;br /&gt;
[[BAS / 1С / SAP / Odoo / Dynamics]]&lt;br /&gt;
&lt;br /&gt;
[[Всі 1С конфігурації]]&lt;br /&gt;
&lt;br /&gt;
[[Всі BAS конфігурації]]&lt;br /&gt;
&lt;br /&gt;
[[Всі 1С терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі BAS терміни]]&lt;br /&gt;
&lt;br /&gt;
[[Всі отраслеві рішення 1С]]&lt;br /&gt;
&lt;br /&gt;
== CRM ==&lt;br /&gt;
[[Варіанти використання K2 ERP CRM по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[CRM продукти]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP CRM - універсальна CRM для виробництва, складу, торговлі, ФОП, інтернет-магазину та заміни Bitrix24, 1C CRM]]&lt;br /&gt;
&lt;br /&gt;
[[Всі терміни CRM]]&lt;br /&gt;
&lt;br /&gt;
== Інтернет-магази ==&lt;br /&gt;
[[Варіанти використання K2 ERP інтернет-магазин по напрямкам]]&lt;br /&gt;
&lt;br /&gt;
[[Продукти інтернет-магазинів]]&lt;br /&gt;
&lt;br /&gt;
[[K2 ERP Інтернет-магазин - універсальний інтернет-магазин для заміни ShopScript та інших російських рішень]]&lt;br /&gt;
&lt;br /&gt;
[[Всі терміни інтернет-магазинів]]&lt;br /&gt;
&lt;br /&gt;
== Санкції та докази ==&lt;br /&gt;
[[Поглинути 1С, BAS та інший ворожий софт: чому перенесення залишків — це ще не справжня відмова]]&lt;br /&gt;
&lt;br /&gt;
[[Мені соромно за українські ЗМІ — чому медіа мають писати про український софт, K2 ERP та заміну 1С/BAS]]&lt;br /&gt;
&lt;br /&gt;
[[Лавочка стала закриватись: 215 продуктів ворожого софту заборонено]]&lt;br /&gt;
&lt;br /&gt;
[[Український бізнес інвестує в російське, бо думає, що українське помре]]&lt;br /&gt;
&lt;br /&gt;
[[Схема мережі 1С, побудованої в Україні під виглядом BAS: коли “ми вже не 1С” звучить як “ми просто змінили табличку на дверях”]]&lt;br /&gt;
&lt;br /&gt;
[[Пертнери BAS - партнери росії]]&lt;br /&gt;
&lt;br /&gt;
[[Скільки грошей 1С намагається “збити” з українського бізнесу через листи щастя]]&lt;br /&gt;
&lt;br /&gt;
[[Не продовжуйте ІТС на BAS. Бо BAS — це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Вали російський бізнес, вали російський софт!]]&lt;br /&gt;
&lt;br /&gt;
[[Програмне забезпечення, яким можна замінити ворожий софт]]&lt;br /&gt;
&lt;br /&gt;
[[Докази, що BAS - це 1С]]&lt;br /&gt;
&lt;br /&gt;
[[Список компаній, що розповсюджують BAS, не дивлячись на санкції січня 2026]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр ворожого ПЗ і пов&#039;язаних назв]]&lt;br /&gt;
&lt;br /&gt;
[[Компанії, що почали переходити з ворожого софту]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр компаній, що досі працюють на ворожому софті]]&lt;br /&gt;
&lt;br /&gt;
[[Реєстр сервісів, що підтримують інтеграцію з ворожим софтом]]&lt;br /&gt;
&lt;br /&gt;
== Реформи ==&lt;br /&gt;
[[Реформи К2]]&lt;br /&gt;
&lt;br /&gt;
== Wikipedia ==&lt;br /&gt;
[[Різні статті]]&lt;br /&gt;
&lt;br /&gt;
== Книги ==&lt;br /&gt;
[[Архітектура 1С-підприємства]]&lt;br /&gt;
&lt;br /&gt;
[[Архітектура та розробка ERP-систем]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%82%D0%B5%D1%85%D0%BD%D1%96%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%B2%D0%B4%D0%B0%D0%BD%D0%BD%D1%8F_K2_ERP&amp;diff=2728</id>
		<title>Приклади технічного завдання K2 ERP</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D1%80%D0%B8%D0%BA%D0%BB%D0%B0%D0%B4%D0%B8_%D1%82%D0%B5%D1%85%D0%BD%D1%96%D1%87%D0%BD%D0%BE%D0%B3%D0%BE_%D0%B7%D0%B0%D0%B2%D0%B4%D0%B0%D0%BD%D0%BD%D1%8F_K2_ERP&amp;diff=2728"/>
		<updated>2026-07-08T11:20:20Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Виробництво&lt;br /&gt;
&lt;br /&gt;
[[Технічне завдання на облік виробництва в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Аграрний сектор ==&lt;br /&gt;
[[Технічне завдання: Облік виробництва аграрної компанії]]&lt;br /&gt;
&lt;br /&gt;
== Ресторан ==&lt;br /&gt;
[[Технічне завдання на облік в ресторані]]&amp;lt;br&amp;gt;[[Інтерфейс створення технологічних карт]]&lt;br /&gt;
&lt;br /&gt;
== Зарплата ==&lt;br /&gt;
[[Технічне завдання: Облік зарплати]]&lt;br /&gt;
&lt;br /&gt;
== Бухгалтерський та податковий облік ==&lt;br /&gt;
&lt;br /&gt;
=== Зарплата ===&lt;br /&gt;
[[Технічне завдання: Облік основних засобів]]&lt;br /&gt;
&lt;br /&gt;
=== Проводки ===&lt;br /&gt;
[[Технічне завдання: Бухгалтерські проводки основних операцій]]&lt;br /&gt;
&lt;br /&gt;
== Маркетинг ==&lt;br /&gt;
[[Технічне завдання: Афіліантська система]]&lt;br /&gt;
&lt;br /&gt;
== Інструментарій ==&lt;br /&gt;
[[Технічне завдання: Редактор ER-моделей K2 ERP]]&amp;lt;br&amp;gt;[[Технічне завдання: Редактор BP-моделей K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Подача звітност в ДПС та інші державні органи України ==&lt;br /&gt;
[[Технічне завдання: Передача звітності з K2 ERP до Електронного кабінету ДПС]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Вчасно для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Приват24 для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Медок для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Птах для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: передача документів для звітності в податкову через Edin для Python]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад подачі звітів ФОП на єдиному податку]]&lt;br /&gt;
&lt;br /&gt;
[[Декларація ФОП]]&lt;br /&gt;
&lt;br /&gt;
[[Звітність компанії на загальній системі оподаткування]]&lt;br /&gt;
&lt;br /&gt;
[[Звітність компанії на особливому режимі Дія-Сіті]]&lt;br /&gt;
&lt;br /&gt;
== Приклади ==&lt;br /&gt;
[[Приклад розрахунку зарплати]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад розрахунки податків на загальній системі оподаткування]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад розрахунків подаків компанії на особливому режимі Дія-Сіті]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад розрахунку основних засобів за кілька місяців]]&lt;br /&gt;
&lt;br /&gt;
[[Приклад роботи торгової організації з обліком генераторів у K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Обмін з банками ==&lt;br /&gt;
[[Технічне завдання: отримання банківських виписок з Приват24 для Python]]&lt;br /&gt;
&lt;br /&gt;
[[Документація та формати банківських виписок різних банків України]]&lt;br /&gt;
&lt;br /&gt;
[[Технічне завдання: Гнучкий модуль імпорту банківських виписок у K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Контроль сроків та звітність ==&lt;br /&gt;
[[Технічне завдання: контроль сроків подачі звітності підприємствами в Україні]]&amp;lt;br&amp;gt;[[Технічне завдання: види податкових систем та звіти, що подаються]]&lt;br /&gt;
&lt;br /&gt;
== РРО та ПРРО ==&lt;br /&gt;
[[Технічне завдання: інтеграція Вчасно каса для Python]]&amp;lt;br&amp;gt;[[Технічне завдання: інтеграція ПРРО Checkbox для Python]]&amp;lt;br&amp;gt;[[Інтеграція РРО в Python]]&amp;lt;br&amp;gt;[[Інтеграція РРО в Python через загальну бібліотеку для різних РРО]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Інтеграції в K2 ERP ==&lt;br /&gt;
[[Інтеграція з Мурашина логістика в Python]]&amp;lt;br&amp;gt;[[Інтеграція з Новою поштою в Python]]&amp;lt;br&amp;gt;[[Інтеграція з Укрпоштою в Python]]&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Електронний підпис ==&lt;br /&gt;
[[Накладення електронного підпису за допомогою Дія в Python]]&amp;lt;br&amp;gt;[[Накладення електронного підпису за допомогою електронного підпису Приват24]]&amp;lt;br&amp;gt;[[Уніфіковане накладання електронного підпису різних сервісних центрів України]]&lt;br /&gt;
&lt;br /&gt;
== Інтеграція з інтернет-магазинами та маркетплейсами ==&lt;br /&gt;
[[Інтеграція з Horoshop]]&amp;lt;br&amp;gt;[[Інтеграція з Prom, Rozetka, Hotline]]&lt;br /&gt;
&lt;br /&gt;
== CRM ==&lt;br /&gt;
[[Життєвий цикл ліда]]&lt;br /&gt;
&lt;br /&gt;
== Собівартість ==&lt;br /&gt;
[[Розрахунок собівартості]]&lt;br /&gt;
&lt;br /&gt;
== Система онлайн-навчання ==&lt;br /&gt;
[[Система онлайн-навчання]]&lt;br /&gt;
&lt;br /&gt;
== Документообіг ==&lt;br /&gt;
[[Технічне завдання на документообіг]]&lt;br /&gt;
&lt;br /&gt;
[[Технічне завдання VDoc K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
== Комунікації ==&lt;br /&gt;
[[Технічне завдання на створення чату в K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Основні засоби Тест]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2727</id>
		<title>Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2727"/>
		<updated>2026-07-06T06:49:37Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Платний Saas K2.png|центр|міні|800x800пкс|Платний SaaS-сервіс K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP&#039;&#039;&#039; розвиває кілька моделей використання системи, щоб український бізнес міг обрати зручний шлях автоматизації: від безкоштовної хмари для старту до повної серверної ліцензії з відкритим похідним кодом.&lt;br /&gt;
&lt;br /&gt;
Для багатьох компаній ERP-система вже давно не є розкішшю. Це нормальний робочий інструмент для обліку, управління, продажів, складу, документів, звітності, персоналу, навчання, інтеграцій і контролю бізнес-процесів.&lt;br /&gt;
&lt;br /&gt;
Але коли компанія доходить до питання вартості повної серверної ліцензії, часто виникає проста й практична проблема: &#039;&#039;&#039;малий бізнес не завжди може дозволити собі великий одноразовий платіж&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff7e6; border-left:6px solid #f5a623; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна ідея SaaS K2 ERP:&#039;&#039;&#039; дати бізнесу можливість працювати в окремому середовищі K2 ERP за щомісячну оплату, без купівлі повної серверної ліцензії, без передачі похідних кодів і без великого стартового платежу.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У випадку повної ліцензії K2 ERP клієнт отримує зовсім інший рівень прав і можливостей: окремий сервер або окрему віртуальну машину, роботу без обмеження кількості користувачів, окреме середовище, доступ до похідних кодів програмних модулів і можливість глибше працювати з системою.&lt;br /&gt;
&lt;br /&gt;
Але не кожна компанія хоче або може стартувати саме з такої моделі. Саме тому K2 ERP передбачило платні SaaS-пакети обслуговування — для тих компаній, яким потрібна окрема ERP-система в роботі, але без купівлі повної серверної ліцензії.&lt;br /&gt;
&lt;br /&gt;
== Чому повна ліцензія підходить не всім ==&lt;br /&gt;
&lt;br /&gt;
Повна ліцензія K2 ERP — це модель для компаній, які хочуть отримати максимальний контроль над системою.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанія купує повну ліцензію на бухгалтерський облік K2 ERP, її вартість може становити &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;, якщо система розміщується в хмарній інфраструктурі K2.&lt;br /&gt;
&lt;br /&gt;
За ці кошти клієнт отримує не просто «доступ до програми». Він отримує повноцінне окреме серверне середовище, безліміт користувачів, можливість працювати з похідними кодами, розвивати систему, адаптувати її під власні бізнес-процеси та використовувати продукт відповідно до умов ліцензії.&lt;br /&gt;
&lt;br /&gt;
Така модель логічна для середнього й великого бізнесу, для компаній з багатьма користувачами, складними процесами, власними ІТ-фахівцями або бажанням мати глибший контроль над ERP-системою.&lt;br /&gt;
&lt;br /&gt;
Але для невеликої компанії стартовий платіж у тисячі чи десятки тисяч євро може бути завеликим. Особливо якщо бізнесу потрібно почати з кількох користувачів, одного-двох модулів і поступового впровадження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eef7ff; border-left:6px solid #2d7dd2; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Малому бізнесу часто не потрібен одразу безліміт користувачів, доступ до похідних кодів і повна серверна модель.&#039;&#039;&#039; Йому потрібно простіше: почати працювати в ERP вже зараз, платити щомісяця і масштабуватися поступово.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для цього і створена SaaS-модель K2 ERP.&lt;br /&gt;
&lt;br /&gt;
== Що таке платний SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS K2 ERP&#039;&#039;&#039; — це модель користування ERP-системою за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт не купує ліцензію на програмний продукт, не отримує похідні коди програмних модулів і не отримує право самостійно розгортати або змінювати програмне забезпечення як власний програмний актив.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт користується сервісом K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Це означає, що компанія отримує доступ до системи, працює у своїй окремій базі даних, використовує підключені модулі, створює користувачів, веде документи, налаштовує довідники, обробляє операції та отримує обслуговування відповідно до обраного пакета.&lt;br /&gt;
&lt;br /&gt;
Оплата залежить від кількості користувачів, кількості підключених модулів і конфігурації сервісу.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанії потрібен бухгалтерський модуль K2 ERP у SaaS-форматі для &#039;&#039;&#039;5 користувачів&#039;&#039;&#039;, вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Якщо користувачів більше — щомісячна оплата збільшується. Якщо компанія підключає більше модулів — вартість також зростає.&lt;br /&gt;
&lt;br /&gt;
Це нормальна логіка SaaS: бізнес платить за той обсяг сервісу, який реально використовує.&lt;br /&gt;
&lt;br /&gt;
== Чим SaaS відрізняється від безкоштовної хмари cloud.corp2.eu ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP має безкоштовну хмару для роботи — &#039;&#039;&#039;cloud.corp2.eu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це зручний варіант для знайомства з продуктом, навчання, тестування, демонстрацій, перших кроків і базового використання системи. Компанія може зайти в K2 ERP, подивитися інтерфейс, спробувати логіку роботи, перевірити модулі й оцінити можливості системи без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
Але платний SaaS — це інший рівень.&lt;br /&gt;
&lt;br /&gt;
На відміну від безкоштовної публічної хмари, платні SaaS-пакети передбачають роботу компанії в &#039;&#039;&#039;окремій базі даних&#039;&#039;&#039; і на &#039;&#039;&#039;окремому екземплярі програмних продуктів K2 ERP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це важливо для бізнесу, якому потрібне відокремлене робоче середовище, власні дані, власні довідники, власні документи, свої користувачі, налаштування, процеси та регулярне обслуговування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS — це не просто “платна версія безкоштовної хмари”.&#039;&#039;&#039; Це окремий формат роботи для компаній, які хочуть використовувати K2 ERP у щоденній діяльності, але без купівлі серверної ліцензії.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Що отримує клієнт у SaaS-моделі ==&lt;br /&gt;
&lt;br /&gt;
У SaaS-моделі клієнт отримує окреме робоче середовище для своєї компанії.&lt;br /&gt;
&lt;br /&gt;
Він може працювати з підключеними модулями K2 ERP, вести облік, клієнтів, складські операції, документи, звіти, бізнес-процеси, налаштовувати довідники й організовувати роботу користувачів.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з одного модуля, наприклад з бухгалтерського обліку, CRM або складу. Потім поступово підключити інші модулі: документообіг, HR, навчання персоналу, управлінську звітність, інтернет-магазин, сервісне обслуговування, інтеграції чи інші компоненти K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Це дозволяє не купувати все одразу. Бізнес може стартувати з мінімально потрібної конфігурації та розширювати систему тоді, коли в цьому з’являється реальна потреба.&lt;br /&gt;
&lt;br /&gt;
Для малого й середнього бізнесу це часто найбільш зручний варіант. Не потрібно одразу робити великий капітальний платіж. Не потрібно купувати серверну ліцензію. Не потрібно будувати власну інфраструктуру. Можна почати з щомісячної оплати й поступово розвивати автоматизацію.&lt;br /&gt;
&lt;br /&gt;
== Важливо: SaaS — це не передача ліцензії і не передача похідних кодів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #d64545; padding:16px 20px; margin:20px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються похідні коди програмних модулів K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються ліцензії на програмний продукт.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт не купує програму у власність.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це потрібно чітко розуміти до початку роботи.&lt;br /&gt;
&lt;br /&gt;
Компанія користується сервісом K2 ERP доти, доки сплачує щомісячні платежі відповідно до умов договору та обраного тарифного пакета.&lt;br /&gt;
&lt;br /&gt;
Це означає, що клієнт отримує доступ до функціоналу, окремої бази даних, підключених модулів і технічного обслуговування. Але він не отримує право самостійно копіювати, розгортати, змінювати або поширювати програмні модулі K2 ERP як власний програмний продукт.&lt;br /&gt;
&lt;br /&gt;
Якщо щомісячна оплата припиняється, право користування SaaS-сервісом також припиняється або обмежується відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Це нормальна модель для SaaS-ринку. Так працює більшість сучасних хмарних сервісів: клієнт не купує програму, а користується сервісом у період активної оплати.&lt;br /&gt;
&lt;br /&gt;
== Практичне порівняння: повна ліцензія чи SaaS ==&lt;br /&gt;
&lt;br /&gt;
Різницю найкраще видно на прикладі бухгалтерського модуля K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Якщо компанія купує повну ліцензію на бухгалтерський облік, вона сплачує &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт отримує окремий сервер або окрему віртуальну машину, безлімітну кількість користувачів, похідні коди програмних модулів і ширші можливості роботи із системою.&lt;br /&gt;
&lt;br /&gt;
Це модель для тих, хто хоче мати більше контролю, більше прав і не залежати від кількості користувачів у тарифі.&lt;br /&gt;
&lt;br /&gt;
Якщо ж компанія обирає SaaS, вона не сплачує 15 000 євро одноразово. Наприклад, для бухгалтерського модуля при &#039;&#039;&#039;5 користувачах&#039;&#039;&#039; вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Але в SaaS клієнт не отримує похідні коди, не отримує ліцензію на програмні модулі й не отримує програмний продукт у власність. Він користується сервісом за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow-x:auto; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border-collapse:collapse; font-size:95%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#1f4e79; color:#ffffff; padding:10px;&amp;quot; | Параметр&lt;br /&gt;
! style=&amp;quot;background:#2f75b5; color:#ffffff; padding:10px;&amp;quot; | Повна ліцензія K2 ERP&lt;br /&gt;
! style=&amp;quot;background:#70ad47; color:#ffffff; padding:10px;&amp;quot; | SaaS K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Стартовий платіж&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;15 000 € одноразово&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Без купівлі ліцензії&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Щомісячна оплата&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Хостинг, наприклад &#039;&#039;&#039;50 €/міс&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від користувачів і модулів&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Приклад бухгалтерії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Повна ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;85 €/міс&#039;&#039;&#039; при 5 користувачах&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Похідні коди&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Надаються за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не надаються&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія на модулі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Передається за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не передається&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кількість користувачів&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Безліміт&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від тарифу&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Серверне середовище&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий сервер або ВМ&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий SaaS-екземпляр&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Модель використання&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Користування сервісом&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кому підходить&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Середній і великий бізнес, компанії з потребою в контролі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Малий і середній бізнес, швидкий старт без великого платежу&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ця різниця принципова.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це більший стартовий платіж, але більше контролю, більше прав, безліміт користувачів і доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це менший стартовий бар’єр, щомісячна оплата, окрема база даних, окремий екземпляр продукту, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
== Для кого підходить SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS K2 ERP підходить компаніям, які вже переросли безкоштовну хмару, але ще не готові купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це може бути малий бізнес, якому потрібні бухгалтерський облік, CRM, склад, документи або управлінська звітність.&lt;br /&gt;
&lt;br /&gt;
Це може бути сервісна компанія, яка хоче контролювати клієнтів, заявки, роботи, оплату й документи.&lt;br /&gt;
&lt;br /&gt;
Це може бути торгова компанія, якій потрібні товари, залишки, замовлення, постачальники, клієнти та звіти.&lt;br /&gt;
&lt;br /&gt;
Це може бути інтернет-магазин, якому потрібна інтеграція продажів, складу, клієнтів і обліку.&lt;br /&gt;
&lt;br /&gt;
Це може бути навчальний центр, якому потрібні CRM, LMS, документообіг, користувачі, курси, сертифікати й контроль навчання.&lt;br /&gt;
&lt;br /&gt;
Це може бути компанія, яка хоче поступово перейти з 1С або BAS, але не готова одразу купувати серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f7f7f7; border-left:6px solid #666666; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Для таких компаній SaaS — це можливість не відкладати автоматизацію “на потім”, а почати працювати вже зараз.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому SaaS важливий для заміни 1С та BAS ==&lt;br /&gt;
&lt;br /&gt;
Якщо ми говоримо про реальну заміну 1С та BAS в Україні, то потрібно думати не лише про великі підприємства.&lt;br /&gt;
&lt;br /&gt;
Так, великим компаніям потрібні серверні ліцензії, власна інфраструктура, масштабні впровадження, інтеграції, складні бізнес-процеси й доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
Але сотні тисяч малих і середніх компаній не можуть перейти на українську ERP, якщо для старту їм одразу потрібно сплатити велику суму.&lt;br /&gt;
&lt;br /&gt;
Саме тому SaaS-модель є стратегічно важливою.&lt;br /&gt;
&lt;br /&gt;
Вона дає можливість малому бізнесу поступово відмовлятися від застарілого й ворожого програмного забезпечення, не заходячи одразу в дорогий проєкт впровадження.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з кількох користувачів, одного модуля, базового обліку або CRM. Потім — розширити систему. Потім — підключити нові модулі. А коли бізнес виросте і захоче повного контролю, він зможе розглянути перехід на повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це нормальна еволюція автоматизації.&lt;br /&gt;
&lt;br /&gt;
== SaaS як проміжний етап між безкоштовною хмарою і повною ліцензією ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP фактично дає бізнесу три шляхи входу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:block; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#eef7ff; border:1px solid #b7d7f0; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;1. Безкоштовна хмара cloud.corp2.eu&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Старт, знайомство, навчання, тестування і перші кроки.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#f1fff0; border:1px solid #b7e2bc; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;2. Платний SaaS&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окрема база даних, окремий екземпляр програмних продуктів, щомісячна оплата, підключені модулі й робоче середовище для конкретної компанії.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#fff7e6; border:1px solid #f4d28f; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;3. Повна серверна ліцензія&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окремий сервер, безліміт користувачів, похідні коди, ширші права використання і максимальний контроль.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ці моделі не конкурують одна з одною. Вони закривають різні потреби бізнесу.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з безкоштовної хмари, перейти на SaaS, а згодом купити повну ліцензію. Або одразу стартувати з SaaS, якщо вже зрозуміло, які модулі потрібні. Або одразу придбати повну ліцензію, якщо компанії потрібен масштаб, контроль і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Головне — бізнес має вибір.&lt;br /&gt;
&lt;br /&gt;
== Прозорість умов — це основа довіри ==&lt;br /&gt;
&lt;br /&gt;
Для K2 ERP важливо одразу чесно пояснювати клієнтам різницю між моделями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Безкоштовна хмара&#039;&#039;&#039; — це можливість спробувати систему й почати роботу без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це користування сервісом за щомісячну оплату, з окремою базою даних і окремим екземпляром програмних продуктів, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це окрема комерційна модель, яка передбачає інший рівень прав, окремий сервер, безліміт користувачів і доступ до похідних кодів відповідно до умов ліцензування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #c00000; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; SaaS за 85 євро на місяць і повна ліцензія за 15 000 євро — це не одне й те саме.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У першому випадку клієнт користується сервісом.&lt;br /&gt;
&lt;br /&gt;
У другому — отримує ліцензію, похідні коди, окремий сервер і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Саме тому різна вартість. Саме тому різні права. Саме тому різні сценарії використання.&lt;br /&gt;
&lt;br /&gt;
== Платний SaaS K2 ERP — доступний шлях до української ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS-сервіс K2 ERP створений для компаній, які хочуть працювати в сучасній українській ERP-системі, але не готові одразу купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це доступний формат для малого й середнього бізнесу, який дозволяє почати автоматизацію без великого стартового платежу.&lt;br /&gt;
&lt;br /&gt;
Клієнт отримує окрему базу даних, окремий екземпляр програмних продуктів, потрібні модулі, хостинг, технічне обслуговування і можливість працювати в K2 ERP за щомісячною оплатою.&lt;br /&gt;
&lt;br /&gt;
Але при цьому потрібно чітко розуміти: у SaaS-моделі не передаються похідні коди, не передаються ліцензії на програмні модулі й не передаються права на сам програмний продукт. Компанія користується сервісом доти, доки сплачує щомісячні платежі відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Саме така модель робить K2 ERP доступнішою для малого бізнесу.&lt;br /&gt;
&lt;br /&gt;
Не кожна компанія готова одразу платити 15 000 євро за повну ліцензію. Але багато компаній можуть почати з SaaS-пакета, наприклад з бухгалтерського модуля для 5 користувачів за 85 євро на місяць, і поступово розширювати використання системи.&lt;br /&gt;
&lt;br /&gt;
Це дає українському бізнесу реальний шлях переходу на сучасну ERP без різкого фінансового навантаження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:16px 20px; margin:22px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;K2 ERP створює різні моделі для різних компаній:&#039;&#039;&#039; безкоштовну хмару для старту, платний SaaS для відокремленої роботи за щомісячною оплатою і повну серверну ліцензію для тих, кому потрібен максимальний контроль, похідні коди й безліміт користувачів.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це і є нормальна логіка сучасної ERP-платформи: не змушувати всіх купувати однаковий пакет, а дати бізнесу вибір.&lt;br /&gt;
&lt;br /&gt;
Бо головне завдання K2 ERP — зробити українську ERP доступною, масштабованою і реальною альтернативою застарілому та ворожому програмному забезпеченню для бізнесу будь-якого розміру.&lt;br /&gt;
&lt;br /&gt;
Калькулятор для розрахунку вартості SaaS: https://calc.corp2.eu&lt;br /&gt;
&lt;br /&gt;
== Див. також ==&lt;br /&gt;
&lt;br /&gt;
* [[K2 ERP]]&lt;br /&gt;
* [[K2 SaaS]]&lt;br /&gt;
* [[Хмарний ERP-сервіс K2]]&lt;br /&gt;
* [[Заміна 1С та BAS]]&lt;br /&gt;
* [[Бухгалтерський облік K2 ERP]]&lt;br /&gt;
* [[CRM K2 ERP]]&lt;br /&gt;
* [[cloud.corp2.eu]]&lt;br /&gt;
&lt;br /&gt;
[[Категорія:K2 ERP]]&lt;br /&gt;
[[Категорія:SaaS]]&lt;br /&gt;
[[Категорія:ERP]]&lt;br /&gt;
[[Категорія:Українське програмне забезпечення]]&lt;br /&gt;
[[Категорія:Заміна 1С та BAS]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2726</id>
		<title>Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2726"/>
		<updated>2026-07-06T06:49:04Z</updated>

		<summary type="html">&lt;p&gt;R: Калькулятор для розрахунку вартості SaaS: https://calc.corp2.eu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Платний Saas K2.png|центр|міні|800x800пкс|Платний SaaS-сервіс K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP&#039;&#039;&#039; розвиває кілька моделей використання системи, щоб український бізнес міг обрати зручний шлях автоматизації: від безкоштовної хмари для старту до повної серверної ліцензії з відкритим похідним кодом.&lt;br /&gt;
&lt;br /&gt;
Для багатьох компаній ERP-система вже давно не є розкішшю. Це нормальний робочий інструмент для обліку, управління, продажів, складу, документів, звітності, персоналу, навчання, інтеграцій і контролю бізнес-процесів.&lt;br /&gt;
&lt;br /&gt;
Але коли компанія доходить до питання вартості повної серверної ліцензії, часто виникає проста й практична проблема: &#039;&#039;&#039;малий бізнес не завжди може дозволити собі великий одноразовий платіж&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff7e6; border-left:6px solid #f5a623; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна ідея SaaS K2 ERP:&#039;&#039;&#039; дати бізнесу можливість працювати в окремому середовищі K2 ERP за щомісячну оплату, без купівлі повної серверної ліцензії, без передачі похідних кодів і без великого стартового платежу.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У випадку повної ліцензії K2 ERP клієнт отримує зовсім інший рівень прав і можливостей: окремий сервер або окрему віртуальну машину, роботу без обмеження кількості користувачів, окреме середовище, доступ до похідних кодів програмних модулів і можливість глибше працювати з системою.&lt;br /&gt;
&lt;br /&gt;
Але не кожна компанія хоче або може стартувати саме з такої моделі. Саме тому K2 ERP передбачило платні SaaS-пакети обслуговування — для тих компаній, яким потрібна окрема ERP-система в роботі, але без купівлі повної серверної ліцензії.&lt;br /&gt;
&lt;br /&gt;
== Чому повна ліцензія підходить не всім ==&lt;br /&gt;
&lt;br /&gt;
Повна ліцензія K2 ERP — це модель для компаній, які хочуть отримати максимальний контроль над системою.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанія купує повну ліцензію на бухгалтерський облік K2 ERP, її вартість може становити &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;, якщо система розміщується в хмарній інфраструктурі K2.&lt;br /&gt;
&lt;br /&gt;
За ці кошти клієнт отримує не просто «доступ до програми». Він отримує повноцінне окреме серверне середовище, безліміт користувачів, можливість працювати з похідними кодами, розвивати систему, адаптувати її під власні бізнес-процеси та використовувати продукт відповідно до умов ліцензії.&lt;br /&gt;
&lt;br /&gt;
Така модель логічна для середнього й великого бізнесу, для компаній з багатьма користувачами, складними процесами, власними ІТ-фахівцями або бажанням мати глибший контроль над ERP-системою.&lt;br /&gt;
&lt;br /&gt;
Але для невеликої компанії стартовий платіж у тисячі чи десятки тисяч євро може бути завеликим. Особливо якщо бізнесу потрібно почати з кількох користувачів, одного-двох модулів і поступового впровадження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eef7ff; border-left:6px solid #2d7dd2; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Малому бізнесу часто не потрібен одразу безліміт користувачів, доступ до похідних кодів і повна серверна модель.&#039;&#039;&#039; Йому потрібно простіше: почати працювати в ERP вже зараз, платити щомісяця і масштабуватися поступово.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для цього і створена SaaS-модель K2 ERP.&lt;br /&gt;
&lt;br /&gt;
== Що таке платний SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS K2 ERP&#039;&#039;&#039; — це модель користування ERP-системою за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт не купує ліцензію на програмний продукт, не отримує похідні коди програмних модулів і не отримує право самостійно розгортати або змінювати програмне забезпечення як власний програмний актив.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт користується сервісом K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Це означає, що компанія отримує доступ до системи, працює у своїй окремій базі даних, використовує підключені модулі, створює користувачів, веде документи, налаштовує довідники, обробляє операції та отримує обслуговування відповідно до обраного пакета.&lt;br /&gt;
&lt;br /&gt;
Оплата залежить від кількості користувачів, кількості підключених модулів і конфігурації сервісу.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанії потрібен бухгалтерський модуль K2 ERP у SaaS-форматі для &#039;&#039;&#039;5 користувачів&#039;&#039;&#039;, вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Якщо користувачів більше — щомісячна оплата збільшується. Якщо компанія підключає більше модулів — вартість також зростає.&lt;br /&gt;
&lt;br /&gt;
Це нормальна логіка SaaS: бізнес платить за той обсяг сервісу, який реально використовує.&lt;br /&gt;
&lt;br /&gt;
== Чим SaaS відрізняється від безкоштовної хмари cloud.corp2.eu ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP має безкоштовну хмару для роботи — &#039;&#039;&#039;cloud.corp2.eu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це зручний варіант для знайомства з продуктом, навчання, тестування, демонстрацій, перших кроків і базового використання системи. Компанія може зайти в K2 ERP, подивитися інтерфейс, спробувати логіку роботи, перевірити модулі й оцінити можливості системи без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
Але платний SaaS — це інший рівень.&lt;br /&gt;
&lt;br /&gt;
На відміну від безкоштовної публічної хмари, платні SaaS-пакети передбачають роботу компанії в &#039;&#039;&#039;окремій базі даних&#039;&#039;&#039; і на &#039;&#039;&#039;окремому екземплярі програмних продуктів K2 ERP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це важливо для бізнесу, якому потрібне відокремлене робоче середовище, власні дані, власні довідники, власні документи, свої користувачі, налаштування, процеси та регулярне обслуговування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS — це не просто “платна версія безкоштовної хмари”.&#039;&#039;&#039; Це окремий формат роботи для компаній, які хочуть використовувати K2 ERP у щоденній діяльності, але без купівлі серверної ліцензії.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Що отримує клієнт у SaaS-моделі ==&lt;br /&gt;
&lt;br /&gt;
У SaaS-моделі клієнт отримує окреме робоче середовище для своєї компанії.&lt;br /&gt;
&lt;br /&gt;
Він може працювати з підключеними модулями K2 ERP, вести облік, клієнтів, складські операції, документи, звіти, бізнес-процеси, налаштовувати довідники й організовувати роботу користувачів.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з одного модуля, наприклад з бухгалтерського обліку, CRM або складу. Потім поступово підключити інші модулі: документообіг, HR, навчання персоналу, управлінську звітність, інтернет-магазин, сервісне обслуговування, інтеграції чи інші компоненти K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Це дозволяє не купувати все одразу. Бізнес може стартувати з мінімально потрібної конфігурації та розширювати систему тоді, коли в цьому з’являється реальна потреба.&lt;br /&gt;
&lt;br /&gt;
Для малого й середнього бізнесу це часто найбільш зручний варіант. Не потрібно одразу робити великий капітальний платіж. Не потрібно купувати серверну ліцензію. Не потрібно будувати власну інфраструктуру. Можна почати з щомісячної оплати й поступово розвивати автоматизацію.&lt;br /&gt;
&lt;br /&gt;
== Важливо: SaaS — це не передача ліцензії і не передача похідних кодів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #d64545; padding:16px 20px; margin:20px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються похідні коди програмних модулів K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються ліцензії на програмний продукт.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт не купує програму у власність.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це потрібно чітко розуміти до початку роботи.&lt;br /&gt;
&lt;br /&gt;
Компанія користується сервісом K2 ERP доти, доки сплачує щомісячні платежі відповідно до умов договору та обраного тарифного пакета.&lt;br /&gt;
&lt;br /&gt;
Це означає, що клієнт отримує доступ до функціоналу, окремої бази даних, підключених модулів і технічного обслуговування. Але він не отримує право самостійно копіювати, розгортати, змінювати або поширювати програмні модулі K2 ERP як власний програмний продукт.&lt;br /&gt;
&lt;br /&gt;
Якщо щомісячна оплата припиняється, право користування SaaS-сервісом також припиняється або обмежується відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Це нормальна модель для SaaS-ринку. Так працює більшість сучасних хмарних сервісів: клієнт не купує програму, а користується сервісом у період активної оплати.&lt;br /&gt;
&lt;br /&gt;
== Практичне порівняння: повна ліцензія чи SaaS ==&lt;br /&gt;
&lt;br /&gt;
Різницю найкраще видно на прикладі бухгалтерського модуля K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Якщо компанія купує повну ліцензію на бухгалтерський облік, вона сплачує &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт отримує окремий сервер або окрему віртуальну машину, безлімітну кількість користувачів, похідні коди програмних модулів і ширші можливості роботи із системою.&lt;br /&gt;
&lt;br /&gt;
Це модель для тих, хто хоче мати більше контролю, більше прав і не залежати від кількості користувачів у тарифі.&lt;br /&gt;
&lt;br /&gt;
Якщо ж компанія обирає SaaS, вона не сплачує 15 000 євро одноразово. Наприклад, для бухгалтерського модуля при &#039;&#039;&#039;5 користувачах&#039;&#039;&#039; вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Але в SaaS клієнт не отримує похідні коди, не отримує ліцензію на програмні модулі й не отримує програмний продукт у власність. Він користується сервісом за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow-x:auto; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border-collapse:collapse; font-size:95%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#1f4e79; color:#ffffff; padding:10px;&amp;quot; | Параметр&lt;br /&gt;
! style=&amp;quot;background:#2f75b5; color:#ffffff; padding:10px;&amp;quot; | Повна ліцензія K2 ERP&lt;br /&gt;
! style=&amp;quot;background:#70ad47; color:#ffffff; padding:10px;&amp;quot; | SaaS K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Стартовий платіж&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;15 000 € одноразово&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Без купівлі ліцензії&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Щомісячна оплата&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Хостинг, наприклад &#039;&#039;&#039;50 €/міс&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від користувачів і модулів&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Приклад бухгалтерії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Повна ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;85 €/міс&#039;&#039;&#039; при 5 користувачах&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Похідні коди&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Надаються за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не надаються&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія на модулі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Передається за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не передається&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кількість користувачів&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Безліміт&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від тарифу&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Серверне середовище&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий сервер або ВМ&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий SaaS-екземпляр&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Модель використання&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Користування сервісом&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кому підходить&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Середній і великий бізнес, компанії з потребою в контролі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Малий і середній бізнес, швидкий старт без великого платежу&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ця різниця принципова.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це більший стартовий платіж, але більше контролю, більше прав, безліміт користувачів і доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це менший стартовий бар’єр, щомісячна оплата, окрема база даних, окремий екземпляр продукту, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
== Для кого підходить SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS K2 ERP підходить компаніям, які вже переросли безкоштовну хмару, але ще не готові купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це може бути малий бізнес, якому потрібні бухгалтерський облік, CRM, склад, документи або управлінська звітність.&lt;br /&gt;
&lt;br /&gt;
Це може бути сервісна компанія, яка хоче контролювати клієнтів, заявки, роботи, оплату й документи.&lt;br /&gt;
&lt;br /&gt;
Це може бути торгова компанія, якій потрібні товари, залишки, замовлення, постачальники, клієнти та звіти.&lt;br /&gt;
&lt;br /&gt;
Це може бути інтернет-магазин, якому потрібна інтеграція продажів, складу, клієнтів і обліку.&lt;br /&gt;
&lt;br /&gt;
Це може бути навчальний центр, якому потрібні CRM, LMS, документообіг, користувачі, курси, сертифікати й контроль навчання.&lt;br /&gt;
&lt;br /&gt;
Це може бути компанія, яка хоче поступово перейти з 1С або BAS, але не готова одразу купувати серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f7f7f7; border-left:6px solid #666666; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Для таких компаній SaaS — це можливість не відкладати автоматизацію “на потім”, а почати працювати вже зараз.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому SaaS важливий для заміни 1С та BAS ==&lt;br /&gt;
&lt;br /&gt;
Якщо ми говоримо про реальну заміну 1С та BAS в Україні, то потрібно думати не лише про великі підприємства.&lt;br /&gt;
&lt;br /&gt;
Так, великим компаніям потрібні серверні ліцензії, власна інфраструктура, масштабні впровадження, інтеграції, складні бізнес-процеси й доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
Але сотні тисяч малих і середніх компаній не можуть перейти на українську ERP, якщо для старту їм одразу потрібно сплатити велику суму.&lt;br /&gt;
&lt;br /&gt;
Саме тому SaaS-модель є стратегічно важливою.&lt;br /&gt;
&lt;br /&gt;
Вона дає можливість малому бізнесу поступово відмовлятися від застарілого й ворожого програмного забезпечення, не заходячи одразу в дорогий проєкт впровадження.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з кількох користувачів, одного модуля, базового обліку або CRM. Потім — розширити систему. Потім — підключити нові модулі. А коли бізнес виросте і захоче повного контролю, він зможе розглянути перехід на повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це нормальна еволюція автоматизації.&lt;br /&gt;
&lt;br /&gt;
== SaaS як проміжний етап між безкоштовною хмарою і повною ліцензією ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP фактично дає бізнесу три шляхи входу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:block; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#eef7ff; border:1px solid #b7d7f0; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;1. Безкоштовна хмара cloud.corp2.eu&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Старт, знайомство, навчання, тестування і перші кроки.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#f1fff0; border:1px solid #b7e2bc; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;2. Платний SaaS&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окрема база даних, окремий екземпляр програмних продуктів, щомісячна оплата, підключені модулі й робоче середовище для конкретної компанії.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#fff7e6; border:1px solid #f4d28f; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;3. Повна серверна ліцензія&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окремий сервер, безліміт користувачів, похідні коди, ширші права використання і максимальний контроль.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ці моделі не конкурують одна з одною. Вони закривають різні потреби бізнесу.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з безкоштовної хмари, перейти на SaaS, а згодом купити повну ліцензію. Або одразу стартувати з SaaS, якщо вже зрозуміло, які модулі потрібні. Або одразу придбати повну ліцензію, якщо компанії потрібен масштаб, контроль і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Головне — бізнес має вибір.&lt;br /&gt;
&lt;br /&gt;
== Прозорість умов — це основа довіри ==&lt;br /&gt;
&lt;br /&gt;
Для K2 ERP важливо одразу чесно пояснювати клієнтам різницю між моделями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Безкоштовна хмара&#039;&#039;&#039; — це можливість спробувати систему й почати роботу без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це користування сервісом за щомісячну оплату, з окремою базою даних і окремим екземпляром програмних продуктів, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це окрема комерційна модель, яка передбачає інший рівень прав, окремий сервер, безліміт користувачів і доступ до похідних кодів відповідно до умов ліцензування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #c00000; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; SaaS за 85 євро на місяць і повна ліцензія за 15 000 євро — це не одне й те саме.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У першому випадку клієнт користується сервісом.&lt;br /&gt;
&lt;br /&gt;
У другому — отримує ліцензію, похідні коди, окремий сервер і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Саме тому різна вартість. Саме тому різні права. Саме тому різні сценарії використання.&lt;br /&gt;
&lt;br /&gt;
== Платний SaaS K2 ERP — доступний шлях до української ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS-сервіс K2 ERP створений для компаній, які хочуть працювати в сучасній українській ERP-системі, але не готові одразу купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це доступний формат для малого й середнього бізнесу, який дозволяє почати автоматизацію без великого стартового платежу.&lt;br /&gt;
&lt;br /&gt;
Клієнт отримує окрему базу даних, окремий екземпляр програмних продуктів, потрібні модулі, хостинг, технічне обслуговування і можливість працювати в K2 ERP за щомісячною оплатою.&lt;br /&gt;
&lt;br /&gt;
Але при цьому потрібно чітко розуміти: у SaaS-моделі не передаються похідні коди, не передаються ліцензії на програмні модулі й не передаються права на сам програмний продукт. Компанія користується сервісом доти, доки сплачує щомісячні платежі відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Саме така модель робить K2 ERP доступнішою для малого бізнесу.&lt;br /&gt;
&lt;br /&gt;
Не кожна компанія готова одразу платити 15 000 євро за повну ліцензію. Але багато компаній можуть почати з SaaS-пакета, наприклад з бухгалтерського модуля для 5 користувачів за 85 євро на місяць, і поступово розширювати використання системи.&lt;br /&gt;
&lt;br /&gt;
Це дає українському бізнесу реальний шлях переходу на сучасну ERP без різкого фінансового навантаження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:16px 20px; margin:22px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;K2 ERP створює різні моделі для різних компаній:&#039;&#039;&#039; безкоштовну хмару для старту, платний SaaS для відокремленої роботи за щомісячною оплатою і повну серверну ліцензію для тих, кому потрібен максимальний контроль, похідні коди й безліміт користувачів.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це і є нормальна логіка сучасної ERP-платформи: не змушувати всіх купувати однаковий пакет, а дати бізнесу вибір.&lt;br /&gt;
&lt;br /&gt;
Бо головне завдання K2 ERP — зробити українську ERP доступною, масштабованою і реальною альтернативою застарілому та ворожому програмному забезпеченню для бізнесу будь-якого розміру.&lt;br /&gt;
&lt;br /&gt;
Калькулятор для розрахунку вартості SaaS: https://calc.corp2.eu&lt;br /&gt;
&lt;br /&gt;
== Див. також ==&lt;br /&gt;
&lt;br /&gt;
* [[K2 ERP]]&lt;br /&gt;
* [[K2 SaaS]]&lt;br /&gt;
* [[Хмарний ERP-сервіс K2]]&lt;br /&gt;
* [[Заміна 1С та BAS]]&lt;br /&gt;
* [[Бухгалтерський облік K2 ERP]]&lt;br /&gt;
* [[CRM K2 ERP]]&lt;br /&gt;
* [[cloud.corp2.eu]]&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Категорія:K2 ERP]]&lt;br /&gt;
[[index.php?title=Категорія:SaaS]]&lt;br /&gt;
[[index.php?title=Категорія:ERP]]&lt;br /&gt;
[[index.php?title=Категорія:Українське програмне забезпечення]]&lt;br /&gt;
[[index.php?title=Категорія:Заміна 1С та BAS]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2725</id>
		<title>Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2725"/>
		<updated>2026-07-05T19:39:13Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Платний Saas K2.png|центр|міні|800x800пкс|Платний SaaS-сервіс K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP&#039;&#039;&#039; розвиває кілька моделей використання системи, щоб український бізнес міг обрати зручний шлях автоматизації: від безкоштовної хмари для старту до повної серверної ліцензії з відкритим похідним кодом.&lt;br /&gt;
&lt;br /&gt;
Для багатьох компаній ERP-система вже давно не є розкішшю. Це нормальний робочий інструмент для обліку, управління, продажів, складу, документів, звітності, персоналу, навчання, інтеграцій і контролю бізнес-процесів.&lt;br /&gt;
&lt;br /&gt;
Але коли компанія доходить до питання вартості повної серверної ліцензії, часто виникає проста й практична проблема: &#039;&#039;&#039;малий бізнес не завжди може дозволити собі великий одноразовий платіж&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff7e6; border-left:6px solid #f5a623; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна ідея SaaS K2 ERP:&#039;&#039;&#039; дати бізнесу можливість працювати в окремому середовищі K2 ERP за щомісячну оплату, без купівлі повної серверної ліцензії, без передачі похідних кодів і без великого стартового платежу.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У випадку повної ліцензії K2 ERP клієнт отримує зовсім інший рівень прав і можливостей: окремий сервер або окрему віртуальну машину, роботу без обмеження кількості користувачів, окреме середовище, доступ до похідних кодів програмних модулів і можливість глибше працювати з системою.&lt;br /&gt;
&lt;br /&gt;
Але не кожна компанія хоче або може стартувати саме з такої моделі. Саме тому K2 ERP передбачило платні SaaS-пакети обслуговування — для тих компаній, яким потрібна окрема ERP-система в роботі, але без купівлі повної серверної ліцензії.&lt;br /&gt;
&lt;br /&gt;
== Чому повна ліцензія підходить не всім ==&lt;br /&gt;
&lt;br /&gt;
Повна ліцензія K2 ERP — це модель для компаній, які хочуть отримати максимальний контроль над системою.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанія купує повну ліцензію на бухгалтерський облік K2 ERP, її вартість може становити &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;, якщо система розміщується в хмарній інфраструктурі K2.&lt;br /&gt;
&lt;br /&gt;
За ці кошти клієнт отримує не просто «доступ до програми». Він отримує повноцінне окреме серверне середовище, безліміт користувачів, можливість працювати з похідними кодами, розвивати систему, адаптувати її під власні бізнес-процеси та використовувати продукт відповідно до умов ліцензії.&lt;br /&gt;
&lt;br /&gt;
Така модель логічна для середнього й великого бізнесу, для компаній з багатьма користувачами, складними процесами, власними ІТ-фахівцями або бажанням мати глибший контроль над ERP-системою.&lt;br /&gt;
&lt;br /&gt;
Але для невеликої компанії стартовий платіж у тисячі чи десятки тисяч євро може бути завеликим. Особливо якщо бізнесу потрібно почати з кількох користувачів, одного-двох модулів і поступового впровадження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eef7ff; border-left:6px solid #2d7dd2; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Малому бізнесу часто не потрібен одразу безліміт користувачів, доступ до похідних кодів і повна серверна модель.&#039;&#039;&#039; Йому потрібно простіше: почати працювати в ERP вже зараз, платити щомісяця і масштабуватися поступово.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для цього і створена SaaS-модель K2 ERP.&lt;br /&gt;
&lt;br /&gt;
== Що таке платний SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS K2 ERP&#039;&#039;&#039; — це модель користування ERP-системою за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт не купує ліцензію на програмний продукт, не отримує похідні коди програмних модулів і не отримує право самостійно розгортати або змінювати програмне забезпечення як власний програмний актив.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт користується сервісом K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Це означає, що компанія отримує доступ до системи, працює у своїй окремій базі даних, використовує підключені модулі, створює користувачів, веде документи, налаштовує довідники, обробляє операції та отримує обслуговування відповідно до обраного пакета.&lt;br /&gt;
&lt;br /&gt;
Оплата залежить від кількості користувачів, кількості підключених модулів і конфігурації сервісу.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанії потрібен бухгалтерський модуль K2 ERP у SaaS-форматі для &#039;&#039;&#039;5 користувачів&#039;&#039;&#039;, вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Якщо користувачів більше — щомісячна оплата збільшується. Якщо компанія підключає більше модулів — вартість також зростає.&lt;br /&gt;
&lt;br /&gt;
Це нормальна логіка SaaS: бізнес платить за той обсяг сервісу, який реально використовує.&lt;br /&gt;
&lt;br /&gt;
== Чим SaaS відрізняється від безкоштовної хмари cloud.corp2.eu ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP має безкоштовну хмару для роботи — &#039;&#039;&#039;cloud.corp2.eu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це зручний варіант для знайомства з продуктом, навчання, тестування, демонстрацій, перших кроків і базового використання системи. Компанія може зайти в K2 ERP, подивитися інтерфейс, спробувати логіку роботи, перевірити модулі й оцінити можливості системи без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
Але платний SaaS — це інший рівень.&lt;br /&gt;
&lt;br /&gt;
На відміну від безкоштовної публічної хмари, платні SaaS-пакети передбачають роботу компанії в &#039;&#039;&#039;окремій базі даних&#039;&#039;&#039; і на &#039;&#039;&#039;окремому екземплярі програмних продуктів K2 ERP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це важливо для бізнесу, якому потрібне відокремлене робоче середовище, власні дані, власні довідники, власні документи, свої користувачі, налаштування, процеси та регулярне обслуговування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS — це не просто “платна версія безкоштовної хмари”.&#039;&#039;&#039; Це окремий формат роботи для компаній, які хочуть використовувати K2 ERP у щоденній діяльності, але без купівлі серверної ліцензії.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Що отримує клієнт у SaaS-моделі ==&lt;br /&gt;
&lt;br /&gt;
У SaaS-моделі клієнт отримує окреме робоче середовище для своєї компанії.&lt;br /&gt;
&lt;br /&gt;
Він може працювати з підключеними модулями K2 ERP, вести облік, клієнтів, складські операції, документи, звіти, бізнес-процеси, налаштовувати довідники й організовувати роботу користувачів.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з одного модуля, наприклад з бухгалтерського обліку, CRM або складу. Потім поступово підключити інші модулі: документообіг, HR, навчання персоналу, управлінську звітність, інтернет-магазин, сервісне обслуговування, інтеграції чи інші компоненти K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Це дозволяє не купувати все одразу. Бізнес може стартувати з мінімально потрібної конфігурації та розширювати систему тоді, коли в цьому з’являється реальна потреба.&lt;br /&gt;
&lt;br /&gt;
Для малого й середнього бізнесу це часто найбільш зручний варіант. Не потрібно одразу робити великий капітальний платіж. Не потрібно купувати серверну ліцензію. Не потрібно будувати власну інфраструктуру. Можна почати з щомісячної оплати й поступово розвивати автоматизацію.&lt;br /&gt;
&lt;br /&gt;
== Важливо: SaaS — це не передача ліцензії і не передача похідних кодів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #d64545; padding:16px 20px; margin:20px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються похідні коди програмних модулів K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються ліцензії на програмний продукт.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт не купує програму у власність.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це потрібно чітко розуміти до початку роботи.&lt;br /&gt;
&lt;br /&gt;
Компанія користується сервісом K2 ERP доти, доки сплачує щомісячні платежі відповідно до умов договору та обраного тарифного пакета.&lt;br /&gt;
&lt;br /&gt;
Це означає, що клієнт отримує доступ до функціоналу, окремої бази даних, підключених модулів і технічного обслуговування. Але він не отримує право самостійно копіювати, розгортати, змінювати або поширювати програмні модулі K2 ERP як власний програмний продукт.&lt;br /&gt;
&lt;br /&gt;
Якщо щомісячна оплата припиняється, право користування SaaS-сервісом також припиняється або обмежується відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Це нормальна модель для SaaS-ринку. Так працює більшість сучасних хмарних сервісів: клієнт не купує програму, а користується сервісом у період активної оплати.&lt;br /&gt;
&lt;br /&gt;
== Практичне порівняння: повна ліцензія чи SaaS ==&lt;br /&gt;
&lt;br /&gt;
Різницю найкраще видно на прикладі бухгалтерського модуля K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Якщо компанія купує повну ліцензію на бухгалтерський облік, вона сплачує &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт отримує окремий сервер або окрему віртуальну машину, безлімітну кількість користувачів, похідні коди програмних модулів і ширші можливості роботи із системою.&lt;br /&gt;
&lt;br /&gt;
Це модель для тих, хто хоче мати більше контролю, більше прав і не залежати від кількості користувачів у тарифі.&lt;br /&gt;
&lt;br /&gt;
Якщо ж компанія обирає SaaS, вона не сплачує 15 000 євро одноразово. Наприклад, для бухгалтерського модуля при &#039;&#039;&#039;5 користувачах&#039;&#039;&#039; вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Але в SaaS клієнт не отримує похідні коди, не отримує ліцензію на програмні модулі й не отримує програмний продукт у власність. Він користується сервісом за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow-x:auto; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border-collapse:collapse; font-size:95%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#1f4e79; color:#ffffff; padding:10px;&amp;quot; | Параметр&lt;br /&gt;
! style=&amp;quot;background:#2f75b5; color:#ffffff; padding:10px;&amp;quot; | Повна ліцензія K2 ERP&lt;br /&gt;
! style=&amp;quot;background:#70ad47; color:#ffffff; padding:10px;&amp;quot; | SaaS K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Стартовий платіж&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;15 000 € одноразово&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Без купівлі ліцензії&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Щомісячна оплата&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Хостинг, наприклад &#039;&#039;&#039;50 €/міс&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від користувачів і модулів&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Приклад бухгалтерії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Повна ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;85 €/міс&#039;&#039;&#039; при 5 користувачах&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Похідні коди&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Надаються за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не надаються&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія на модулі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Передається за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не передається&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кількість користувачів&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Безліміт&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від тарифу&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Серверне середовище&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий сервер або ВМ&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий SaaS-екземпляр&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Модель використання&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Користування сервісом&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кому підходить&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Середній і великий бізнес, компанії з потребою в контролі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Малий і середній бізнес, швидкий старт без великого платежу&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ця різниця принципова.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це більший стартовий платіж, але більше контролю, більше прав, безліміт користувачів і доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це менший стартовий бар’єр, щомісячна оплата, окрема база даних, окремий екземпляр продукту, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
== Для кого підходить SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS K2 ERP підходить компаніям, які вже переросли безкоштовну хмару, але ще не готові купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це може бути малий бізнес, якому потрібні бухгалтерський облік, CRM, склад, документи або управлінська звітність.&lt;br /&gt;
&lt;br /&gt;
Це може бути сервісна компанія, яка хоче контролювати клієнтів, заявки, роботи, оплату й документи.&lt;br /&gt;
&lt;br /&gt;
Це може бути торгова компанія, якій потрібні товари, залишки, замовлення, постачальники, клієнти та звіти.&lt;br /&gt;
&lt;br /&gt;
Це може бути інтернет-магазин, якому потрібна інтеграція продажів, складу, клієнтів і обліку.&lt;br /&gt;
&lt;br /&gt;
Це може бути навчальний центр, якому потрібні CRM, LMS, документообіг, користувачі, курси, сертифікати й контроль навчання.&lt;br /&gt;
&lt;br /&gt;
Це може бути компанія, яка хоче поступово перейти з 1С або BAS, але не готова одразу купувати серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f7f7f7; border-left:6px solid #666666; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Для таких компаній SaaS — це можливість не відкладати автоматизацію “на потім”, а почати працювати вже зараз.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому SaaS важливий для заміни 1С та BAS ==&lt;br /&gt;
&lt;br /&gt;
Якщо ми говоримо про реальну заміну 1С та BAS в Україні, то потрібно думати не лише про великі підприємства.&lt;br /&gt;
&lt;br /&gt;
Так, великим компаніям потрібні серверні ліцензії, власна інфраструктура, масштабні впровадження, інтеграції, складні бізнес-процеси й доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
Але сотні тисяч малих і середніх компаній не можуть перейти на українську ERP, якщо для старту їм одразу потрібно сплатити велику суму.&lt;br /&gt;
&lt;br /&gt;
Саме тому SaaS-модель є стратегічно важливою.&lt;br /&gt;
&lt;br /&gt;
Вона дає можливість малому бізнесу поступово відмовлятися від застарілого й ворожого програмного забезпечення, не заходячи одразу в дорогий проєкт впровадження.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з кількох користувачів, одного модуля, базового обліку або CRM. Потім — розширити систему. Потім — підключити нові модулі. А коли бізнес виросте і захоче повного контролю, він зможе розглянути перехід на повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це нормальна еволюція автоматизації.&lt;br /&gt;
&lt;br /&gt;
== SaaS як проміжний етап між безкоштовною хмарою і повною ліцензією ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP фактично дає бізнесу три шляхи входу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:block; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#eef7ff; border:1px solid #b7d7f0; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;1. Безкоштовна хмара cloud.corp2.eu&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Старт, знайомство, навчання, тестування і перші кроки.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#f1fff0; border:1px solid #b7e2bc; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;2. Платний SaaS&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окрема база даних, окремий екземпляр програмних продуктів, щомісячна оплата, підключені модулі й робоче середовище для конкретної компанії.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#fff7e6; border:1px solid #f4d28f; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;3. Повна серверна ліцензія&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окремий сервер, безліміт користувачів, похідні коди, ширші права використання і максимальний контроль.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ці моделі не конкурують одна з одною. Вони закривають різні потреби бізнесу.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з безкоштовної хмари, перейти на SaaS, а згодом купити повну ліцензію. Або одразу стартувати з SaaS, якщо вже зрозуміло, які модулі потрібні. Або одразу придбати повну ліцензію, якщо компанії потрібен масштаб, контроль і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Головне — бізнес має вибір.&lt;br /&gt;
&lt;br /&gt;
== Прозорість умов — це основа довіри ==&lt;br /&gt;
&lt;br /&gt;
Для K2 ERP важливо одразу чесно пояснювати клієнтам різницю між моделями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Безкоштовна хмара&#039;&#039;&#039; — це можливість спробувати систему й почати роботу без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це користування сервісом за щомісячну оплату, з окремою базою даних і окремим екземпляром програмних продуктів, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це окрема комерційна модель, яка передбачає інший рівень прав, окремий сервер, безліміт користувачів і доступ до похідних кодів відповідно до умов ліцензування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #c00000; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; SaaS за 85 євро на місяць і повна ліцензія за 15 000 євро — це не одне й те саме.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У першому випадку клієнт користується сервісом.&lt;br /&gt;
&lt;br /&gt;
У другому — отримує ліцензію, похідні коди, окремий сервер і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Саме тому різна вартість. Саме тому різні права. Саме тому різні сценарії використання.&lt;br /&gt;
&lt;br /&gt;
== Платний SaaS K2 ERP — доступний шлях до української ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS-сервіс K2 ERP створений для компаній, які хочуть працювати в сучасній українській ERP-системі, але не готові одразу купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це доступний формат для малого й середнього бізнесу, який дозволяє почати автоматизацію без великого стартового платежу.&lt;br /&gt;
&lt;br /&gt;
Клієнт отримує окрему базу даних, окремий екземпляр програмних продуктів, потрібні модулі, хостинг, технічне обслуговування і можливість працювати в K2 ERP за щомісячною оплатою.&lt;br /&gt;
&lt;br /&gt;
Але при цьому потрібно чітко розуміти: у SaaS-моделі не передаються похідні коди, не передаються ліцензії на програмні модулі й не передаються права на сам програмний продукт. Компанія користується сервісом доти, доки сплачує щомісячні платежі відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Саме така модель робить K2 ERP доступнішою для малого бізнесу.&lt;br /&gt;
&lt;br /&gt;
Не кожна компанія готова одразу платити 15 000 євро за повну ліцензію. Але багато компаній можуть почати з SaaS-пакета, наприклад з бухгалтерського модуля для 5 користувачів за 85 євро на місяць, і поступово розширювати використання системи.&lt;br /&gt;
&lt;br /&gt;
Це дає українському бізнесу реальний шлях переходу на сучасну ERP без різкого фінансового навантаження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:16px 20px; margin:22px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;K2 ERP створює різні моделі для різних компаній:&#039;&#039;&#039; безкоштовну хмару для старту, платний SaaS для відокремленої роботи за щомісячною оплатою і повну серверну ліцензію для тих, кому потрібен максимальний контроль, похідні коди й безліміт користувачів.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це і є нормальна логіка сучасної ERP-платформи: не змушувати всіх купувати однаковий пакет, а дати бізнесу вибір.&lt;br /&gt;
&lt;br /&gt;
Бо головне завдання K2 ERP — зробити українську ERP доступною, масштабованою і реальною альтернативою застарілому та ворожому програмному забезпеченню для бізнесу будь-якого розміру.&lt;br /&gt;
&lt;br /&gt;
== Див. також ==&lt;br /&gt;
&lt;br /&gt;
* [[K2 ERP]]&lt;br /&gt;
* [[K2 SaaS]]&lt;br /&gt;
* [[Хмарний ERP-сервіс K2]]&lt;br /&gt;
* [[Заміна 1С та BAS]]&lt;br /&gt;
* [[Бухгалтерський облік K2 ERP]]&lt;br /&gt;
* [[CRM K2 ERP]]&lt;br /&gt;
* [[cloud.corp2.eu]]&lt;br /&gt;
&lt;br /&gt;
[[Категорія:K2 ERP]]&lt;br /&gt;
[[Категорія:SaaS]]&lt;br /&gt;
[[Категорія:ERP]]&lt;br /&gt;
[[Категорія:Українське програмне забезпечення]]&lt;br /&gt;
[[Категорія:Заміна 1С та BAS]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2724</id>
		<title>Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2724"/>
		<updated>2026-07-05T19:38:52Z</updated>

		<summary type="html">&lt;p&gt;R: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Файл:Платний Saas K2.png|центр|міні|800x800пкс|Платний SaaS-сервіс K2 ERP]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP&#039;&#039;&#039; розвиває кілька моделей використання системи, щоб український бізнес міг обрати зручний шлях автоматизації: від безкоштовної хмари для старту до повної серверної ліцензії з відкритим похідним кодом.&lt;br /&gt;
&lt;br /&gt;
Для багатьох компаній ERP-система вже давно не є розкішшю. Це нормальний робочий інструмент для обліку, управління, продажів, складу, документів, звітності, персоналу, навчання, інтеграцій і контролю бізнес-процесів.&lt;br /&gt;
&lt;br /&gt;
Але коли компанія доходить до питання вартості повної серверної ліцензії, часто виникає проста й практична проблема: &#039;&#039;&#039;малий бізнес не завжди може дозволити собі великий одноразовий платіж&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff7e6; border-left:6px solid #f5a623; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна ідея SaaS K2 ERP:&#039;&#039;&#039; дати бізнесу можливість працювати в окремому середовищі K2 ERP за щомісячну оплату, без купівлі повної серверної ліцензії, без передачі похідних кодів і без великого стартового платежу.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У випадку повної ліцензії K2 ERP клієнт отримує зовсім інший рівень прав і можливостей: окремий сервер або окрему віртуальну машину, роботу без обмеження кількості користувачів, окреме середовище, доступ до похідних кодів програмних модулів і можливість глибше працювати з системою.&lt;br /&gt;
&lt;br /&gt;
Але не кожна компанія хоче або може стартувати саме з такої моделі. Саме тому K2 ERP передбачило платні SaaS-пакети обслуговування — для тих компаній, яким потрібна окрема ERP-система в роботі, але без купівлі повної серверної ліцензії.&lt;br /&gt;
&lt;br /&gt;
== Чому повна ліцензія підходить не всім ==&lt;br /&gt;
&lt;br /&gt;
Повна ліцензія K2 ERP — це модель для компаній, які хочуть отримати максимальний контроль над системою.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанія купує повну ліцензію на бухгалтерський облік K2 ERP, її вартість може становити &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;, якщо система розміщується в хмарній інфраструктурі K2.&lt;br /&gt;
&lt;br /&gt;
За ці кошти клієнт отримує не просто «доступ до програми». Він отримує повноцінне окреме серверне середовище, безліміт користувачів, можливість працювати з похідними кодами, розвивати систему, адаптувати її під власні бізнес-процеси та використовувати продукт відповідно до умов ліцензії.&lt;br /&gt;
&lt;br /&gt;
Така модель логічна для середнього й великого бізнесу, для компаній з багатьма користувачами, складними процесами, власними ІТ-фахівцями або бажанням мати глибший контроль над ERP-системою.&lt;br /&gt;
&lt;br /&gt;
Але для невеликої компанії стартовий платіж у тисячі чи десятки тисяч євро може бути завеликим. Особливо якщо бізнесу потрібно почати з кількох користувачів, одного-двох модулів і поступового впровадження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eef7ff; border-left:6px solid #2d7dd2; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Малому бізнесу часто не потрібен одразу безліміт користувачів, доступ до похідних кодів і повна серверна модель.&#039;&#039;&#039; Йому потрібно простіше: почати працювати в ERP вже зараз, платити щомісяця і масштабуватися поступово.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для цього і створена SaaS-модель K2 ERP.&lt;br /&gt;
&lt;br /&gt;
== Що таке платний SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS K2 ERP&#039;&#039;&#039; — це модель користування ERP-системою за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт не купує ліцензію на програмний продукт, не отримує похідні коди програмних модулів і не отримує право самостійно розгортати або змінювати програмне забезпечення як власний програмний актив.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт користується сервісом K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Це означає, що компанія отримує доступ до системи, працює у своїй окремій базі даних, використовує підключені модулі, створює користувачів, веде документи, налаштовує довідники, обробляє операції та отримує обслуговування відповідно до обраного пакета.&lt;br /&gt;
&lt;br /&gt;
Оплата залежить від кількості користувачів, кількості підключених модулів і конфігурації сервісу.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанії потрібен бухгалтерський модуль K2 ERP у SaaS-форматі для &#039;&#039;&#039;5 користувачів&#039;&#039;&#039;, вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Якщо користувачів більше — щомісячна оплата збільшується. Якщо компанія підключає більше модулів — вартість також зростає.&lt;br /&gt;
&lt;br /&gt;
Це нормальна логіка SaaS: бізнес платить за той обсяг сервісу, який реально використовує.&lt;br /&gt;
&lt;br /&gt;
== Чим SaaS відрізняється від безкоштовної хмари cloud.corp2.eu ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP має безкоштовну хмару для роботи — &#039;&#039;&#039;cloud.corp2.eu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це зручний варіант для знайомства з продуктом, навчання, тестування, демонстрацій, перших кроків і базового використання системи. Компанія може зайти в K2 ERP, подивитися інтерфейс, спробувати логіку роботи, перевірити модулі й оцінити можливості системи без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
Але платний SaaS — це інший рівень.&lt;br /&gt;
&lt;br /&gt;
На відміну від безкоштовної публічної хмари, платні SaaS-пакети передбачають роботу компанії в &#039;&#039;&#039;окремій базі даних&#039;&#039;&#039; і на &#039;&#039;&#039;окремому екземплярі програмних продуктів K2 ERP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це важливо для бізнесу, якому потрібне відокремлене робоче середовище, власні дані, власні довідники, власні документи, свої користувачі, налаштування, процеси та регулярне обслуговування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS — це не просто “платна версія безкоштовної хмари”.&#039;&#039;&#039; Це окремий формат роботи для компаній, які хочуть використовувати K2 ERP у щоденній діяльності, але без купівлі серверної ліцензії.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Що отримує клієнт у SaaS-моделі ==&lt;br /&gt;
&lt;br /&gt;
У SaaS-моделі клієнт отримує окреме робоче середовище для своєї компанії.&lt;br /&gt;
&lt;br /&gt;
Він може працювати з підключеними модулями K2 ERP, вести облік, клієнтів, складські операції, документи, звіти, бізнес-процеси, налаштовувати довідники й організовувати роботу користувачів.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з одного модуля, наприклад з бухгалтерського обліку, CRM або складу. Потім поступово підключити інші модулі: документообіг, HR, навчання персоналу, управлінську звітність, інтернет-магазин, сервісне обслуговування, інтеграції чи інші компоненти K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Це дозволяє не купувати все одразу. Бізнес може стартувати з мінімально потрібної конфігурації та розширювати систему тоді, коли в цьому з’являється реальна потреба.&lt;br /&gt;
&lt;br /&gt;
Для малого й середнього бізнесу це часто найбільш зручний варіант. Не потрібно одразу робити великий капітальний платіж. Не потрібно купувати серверну ліцензію. Не потрібно будувати власну інфраструктуру. Можна почати з щомісячної оплати й поступово розвивати автоматизацію.&lt;br /&gt;
&lt;br /&gt;
== Важливо: SaaS — це не передача ліцензії і не передача похідних кодів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #d64545; padding:16px 20px; margin:20px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються похідні коди програмних модулів K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються ліцензії на програмний продукт.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт не купує програму у власність.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це потрібно чітко розуміти до початку роботи.&lt;br /&gt;
&lt;br /&gt;
Компанія користується сервісом K2 ERP доти, доки сплачує щомісячні платежі відповідно до умов договору та обраного тарифного пакета.&lt;br /&gt;
&lt;br /&gt;
Це означає, що клієнт отримує доступ до функціоналу, окремої бази даних, підключених модулів і технічного обслуговування. Але він не отримує право самостійно копіювати, розгортати, змінювати або поширювати програмні модулі K2 ERP як власний програмний продукт.&lt;br /&gt;
&lt;br /&gt;
Якщо щомісячна оплата припиняється, право користування SaaS-сервісом також припиняється або обмежується відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Це нормальна модель для SaaS-ринку. Так працює більшість сучасних хмарних сервісів: клієнт не купує програму, а користується сервісом у період активної оплати.&lt;br /&gt;
&lt;br /&gt;
== Практичне порівняння: повна ліцензія чи SaaS ==&lt;br /&gt;
&lt;br /&gt;
Різницю найкраще видно на прикладі бухгалтерського модуля K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Якщо компанія купує повну ліцензію на бухгалтерський облік, вона сплачує &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт отримує окремий сервер або окрему віртуальну машину, безлімітну кількість користувачів, похідні коди програмних модулів і ширші можливості роботи із системою.&lt;br /&gt;
&lt;br /&gt;
Це модель для тих, хто хоче мати більше контролю, більше прав і не залежати від кількості користувачів у тарифі.&lt;br /&gt;
&lt;br /&gt;
Якщо ж компанія обирає SaaS, вона не сплачує 15 000 євро одноразово. Наприклад, для бухгалтерського модуля при &#039;&#039;&#039;5 користувачах&#039;&#039;&#039; вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Але в SaaS клієнт не отримує похідні коди, не отримує ліцензію на програмні модулі й не отримує програмний продукт у власність. Він користується сервісом за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow-x:auto; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border-collapse:collapse; font-size:95%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#1f4e79; color:#ffffff; padding:10px;&amp;quot; | Параметр&lt;br /&gt;
! style=&amp;quot;background:#2f75b5; color:#ffffff; padding:10px;&amp;quot; | Повна ліцензія K2 ERP&lt;br /&gt;
! style=&amp;quot;background:#70ad47; color:#ffffff; padding:10px;&amp;quot; | SaaS K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Стартовий платіж&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;15 000 € одноразово&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Без купівлі ліцензії&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Щомісячна оплата&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Хостинг, наприклад &#039;&#039;&#039;50 €/міс&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від користувачів і модулів&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Приклад бухгалтерії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Повна ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;85 €/міс&#039;&#039;&#039; при 5 користувачах&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Похідні коди&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Надаються за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не надаються&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія на модулі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Передається за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не передається&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кількість користувачів&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Безліміт&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від тарифу&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Серверне середовище&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий сервер або ВМ&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий SaaS-екземпляр&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Модель використання&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Користування сервісом&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кому підходить&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Середній і великий бізнес, компанії з потребою в контролі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Малий і середній бізнес, швидкий старт без великого платежу&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ця різниця принципова.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це більший стартовий платіж, але більше контролю, більше прав, безліміт користувачів і доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це менший стартовий бар’єр, щомісячна оплата, окрема база даних, окремий екземпляр продукту, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
== Для кого підходить SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS K2 ERP підходить компаніям, які вже переросли безкоштовну хмару, але ще не готові купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це може бути малий бізнес, якому потрібні бухгалтерський облік, CRM, склад, документи або управлінська звітність.&lt;br /&gt;
&lt;br /&gt;
Це може бути сервісна компанія, яка хоче контролювати клієнтів, заявки, роботи, оплату й документи.&lt;br /&gt;
&lt;br /&gt;
Це може бути торгова компанія, якій потрібні товари, залишки, замовлення, постачальники, клієнти та звіти.&lt;br /&gt;
&lt;br /&gt;
Це може бути інтернет-магазин, якому потрібна інтеграція продажів, складу, клієнтів і обліку.&lt;br /&gt;
&lt;br /&gt;
Це може бути навчальний центр, якому потрібні CRM, LMS, документообіг, користувачі, курси, сертифікати й контроль навчання.&lt;br /&gt;
&lt;br /&gt;
Це може бути компанія, яка хоче поступово перейти з 1С або BAS, але не готова одразу купувати серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f7f7f7; border-left:6px solid #666666; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Для таких компаній SaaS — це можливість не відкладати автоматизацію “на потім”, а почати працювати вже зараз.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому SaaS важливий для заміни 1С та BAS ==&lt;br /&gt;
&lt;br /&gt;
Якщо ми говоримо про реальну заміну 1С та BAS в Україні, то потрібно думати не лише про великі підприємства.&lt;br /&gt;
&lt;br /&gt;
Так, великим компаніям потрібні серверні ліцензії, власна інфраструктура, масштабні впровадження, інтеграції, складні бізнес-процеси й доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
Але сотні тисяч малих і середніх компаній не можуть перейти на українську ERP, якщо для старту їм одразу потрібно сплатити велику суму.&lt;br /&gt;
&lt;br /&gt;
Саме тому SaaS-модель є стратегічно важливою.&lt;br /&gt;
&lt;br /&gt;
Вона дає можливість малому бізнесу поступово відмовлятися від застарілого й ворожого програмного забезпечення, не заходячи одразу в дорогий проєкт впровадження.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з кількох користувачів, одного модуля, базового обліку або CRM. Потім — розширити систему. Потім — підключити нові модулі. А коли бізнес виросте і захоче повного контролю, він зможе розглянути перехід на повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це нормальна еволюція автоматизації.&lt;br /&gt;
&lt;br /&gt;
== SaaS як проміжний етап між безкоштовною хмарою і повною ліцензією ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP фактично дає бізнесу три шляхи входу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:block; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#eef7ff; border:1px solid #b7d7f0; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;1. Безкоштовна хмара cloud.corp2.eu&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Старт, знайомство, навчання, тестування і перші кроки.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#f1fff0; border:1px solid #b7e2bc; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;2. Платний SaaS&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окрема база даних, окремий екземпляр програмних продуктів, щомісячна оплата, підключені модулі й робоче середовище для конкретної компанії.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#fff7e6; border:1px solid #f4d28f; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;3. Повна серверна ліцензія&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окремий сервер, безліміт користувачів, похідні коди, ширші права використання і максимальний контроль.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ці моделі не конкурують одна з одною. Вони закривають різні потреби бізнесу.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з безкоштовної хмари, перейти на SaaS, а згодом купити повну ліцензію. Або одразу стартувати з SaaS, якщо вже зрозуміло, які модулі потрібні. Або одразу придбати повну ліцензію, якщо компанії потрібен масштаб, контроль і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Головне — бізнес має вибір.&lt;br /&gt;
&lt;br /&gt;
== Прозорість умов — це основа довіри ==&lt;br /&gt;
&lt;br /&gt;
Для K2 ERP важливо одразу чесно пояснювати клієнтам різницю між моделями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Безкоштовна хмара&#039;&#039;&#039; — це можливість спробувати систему й почати роботу без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це користування сервісом за щомісячну оплату, з окремою базою даних і окремим екземпляром програмних продуктів, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це окрема комерційна модель, яка передбачає інший рівень прав, окремий сервер, безліміт користувачів і доступ до похідних кодів відповідно до умов ліцензування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #c00000; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; SaaS за 85 євро на місяць і повна ліцензія за 15 000 євро — це не одне й те саме.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У першому випадку клієнт користується сервісом.&lt;br /&gt;
&lt;br /&gt;
У другому — отримує ліцензію, похідні коди, окремий сервер і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Саме тому різна вартість. Саме тому різні права. Саме тому різні сценарії використання.&lt;br /&gt;
&lt;br /&gt;
== Платний SaaS K2 ERP — доступний шлях до української ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS-сервіс K2 ERP створений для компаній, які хочуть працювати в сучасній українській ERP-системі, але не готові одразу купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це доступний формат для малого й середнього бізнесу, який дозволяє почати автоматизацію без великого стартового платежу.&lt;br /&gt;
&lt;br /&gt;
Клієнт отримує окрему базу даних, окремий екземпляр програмних продуктів, потрібні модулі, хостинг, технічне обслуговування і можливість працювати в K2 ERP за щомісячною оплатою.&lt;br /&gt;
&lt;br /&gt;
Але при цьому потрібно чітко розуміти: у SaaS-моделі не передаються похідні коди, не передаються ліцензії на програмні модулі й не передаються права на сам програмний продукт. Компанія користується сервісом доти, доки сплачує щомісячні платежі відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Саме така модель робить K2 ERP доступнішою для малого бізнесу.&lt;br /&gt;
&lt;br /&gt;
Не кожна компанія готова одразу платити 15 000 євро за повну ліцензію. Але багато компаній можуть почати з SaaS-пакета, наприклад з бухгалтерського модуля для 5 користувачів за 85 євро на місяць, і поступово розширювати використання системи.&lt;br /&gt;
&lt;br /&gt;
Це дає українському бізнесу реальний шлях переходу на сучасну ERP без різкого фінансового навантаження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:16px 20px; margin:22px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;K2 ERP створює різні моделі для різних компаній:&#039;&#039;&#039; безкоштовну хмару для старту, платний SaaS для відокремленої роботи за щомісячною оплатою і повну серверну ліцензію для тих, кому потрібен максимальний контроль, похідні коди й безліміт користувачів.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це і є нормальна логіка сучасної ERP-платформи: не змушувати всіх купувати однаковий пакет, а дати бізнесу вибір.&lt;br /&gt;
&lt;br /&gt;
Бо головне завдання K2 ERP — зробити українську ERP доступною, масштабованою і реальною альтернативою застарілому та ворожому програмному забезпеченню для бізнесу будь-якого розміру.&lt;br /&gt;
&lt;br /&gt;
== Див. також ==&lt;br /&gt;
&lt;br /&gt;
* [[K2 ERP]]&lt;br /&gt;
* [[K2 SaaS]]&lt;br /&gt;
* [[Хмарний ERP-сервіс K2]]&lt;br /&gt;
* [[Заміна 1С та BAS]]&lt;br /&gt;
* [[Бухгалтерський облік K2 ERP]]&lt;br /&gt;
* [[CRM K2 ERP]]&lt;br /&gt;
* [[cloud.corp2.eu]]&lt;br /&gt;
&lt;br /&gt;
[[index.php?title=Категорія:K2 ERP]]&lt;br /&gt;
[[index.php?title=Категорія:SaaS]]&lt;br /&gt;
[[index.php?title=Категорія:ERP]]&lt;br /&gt;
[[index.php?title=Категорія:Українське програмне забезпечення]]&lt;br /&gt;
[[index.php?title=Категорія:Заміна 1С та BAS]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
	<entry>
		<id>https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2723</id>
		<title>Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії</title>
		<link rel="alternate" type="text/html" href="https://wiki.erp.kyiv.ua/index.php?title=%D0%9F%D0%BB%D0%B0%D1%82%D0%BD%D0%B8%D0%B9_SaaS-%D1%81%D0%B5%D1%80%D0%B2%D1%96%D1%81_K2_ERP:_%D0%BE%D0%BA%D1%80%D0%B5%D0%BC%D0%B0_ERP-%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D0%B0_%D0%B1%D0%B5%D0%B7_%D0%BA%D1%83%D0%BF%D1%96%D0%B2%D0%BB%D1%96_%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BD%D0%BE%D1%97_%D0%BB%D1%96%D1%86%D0%B5%D0%BD%D0%B7%D1%96%D1%97&amp;diff=2723"/>
		<updated>2026-07-05T19:37:55Z</updated>

		<summary type="html">&lt;p&gt;R: Створена сторінка: = Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії =  &amp;#039;&amp;#039;&amp;#039;K2 ERP&amp;#039;&amp;#039;&amp;#039; розвиває кілька моделей використання системи, щоб український бізнес міг обрати зручний шлях автоматизації: від безкоштовної хмари для старту до повної серверної ліцен...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Платний SaaS-сервіс K2 ERP: окрема ERP-система без купівлі серверної ліцензії =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;K2 ERP&#039;&#039;&#039; розвиває кілька моделей використання системи, щоб український бізнес міг обрати зручний шлях автоматизації: від безкоштовної хмари для старту до повної серверної ліцензії з відкритим похідним кодом.&lt;br /&gt;
&lt;br /&gt;
Для багатьох компаній ERP-система вже давно не є розкішшю. Це нормальний робочий інструмент для обліку, управління, продажів, складу, документів, звітності, персоналу, навчання, інтеграцій і контролю бізнес-процесів.&lt;br /&gt;
&lt;br /&gt;
Але коли компанія доходить до питання вартості повної серверної ліцензії, часто виникає проста й практична проблема: &#039;&#039;&#039;малий бізнес не завжди може дозволити собі великий одноразовий платіж&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff7e6; border-left:6px solid #f5a623; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Головна ідея SaaS K2 ERP:&#039;&#039;&#039; дати бізнесу можливість працювати в окремому середовищі K2 ERP за щомісячну оплату, без купівлі повної серверної ліцензії, без передачі похідних кодів і без великого стартового платежу.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У випадку повної ліцензії K2 ERP клієнт отримує зовсім інший рівень прав і можливостей: окремий сервер або окрему віртуальну машину, роботу без обмеження кількості користувачів, окреме середовище, доступ до похідних кодів програмних модулів і можливість глибше працювати з системою.&lt;br /&gt;
&lt;br /&gt;
Але не кожна компанія хоче або може стартувати саме з такої моделі. Саме тому K2 ERP передбачило платні SaaS-пакети обслуговування — для тих компаній, яким потрібна окрема ERP-система в роботі, але без купівлі повної серверної ліцензії.&lt;br /&gt;
&lt;br /&gt;
== Чому повна ліцензія підходить не всім ==&lt;br /&gt;
&lt;br /&gt;
Повна ліцензія K2 ERP — це модель для компаній, які хочуть отримати максимальний контроль над системою.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанія купує повну ліцензію на бухгалтерський облік K2 ERP, її вартість може становити &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;, якщо система розміщується в хмарній інфраструктурі K2.&lt;br /&gt;
&lt;br /&gt;
За ці кошти клієнт отримує не просто «доступ до програми». Він отримує повноцінне окреме серверне середовище, безліміт користувачів, можливість працювати з похідними кодами, розвивати систему, адаптувати її під власні бізнес-процеси та використовувати продукт відповідно до умов ліцензії.&lt;br /&gt;
&lt;br /&gt;
Така модель логічна для середнього й великого бізнесу, для компаній з багатьма користувачами, складними процесами, власними ІТ-фахівцями або бажанням мати глибший контроль над ERP-системою.&lt;br /&gt;
&lt;br /&gt;
Але для невеликої компанії стартовий платіж у тисячі чи десятки тисяч євро може бути завеликим. Особливо якщо бізнесу потрібно почати з кількох користувачів, одного-двох модулів і поступового впровадження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#eef7ff; border-left:6px solid #2d7dd2; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Малому бізнесу часто не потрібен одразу безліміт користувачів, доступ до похідних кодів і повна серверна модель.&#039;&#039;&#039; Йому потрібно простіше: почати працювати в ERP вже зараз, платити щомісяця і масштабуватися поступово.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для цього і створена SaaS-модель K2 ERP.&lt;br /&gt;
&lt;br /&gt;
== Що таке платний SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS K2 ERP&#039;&#039;&#039; — це модель користування ERP-системою за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт не купує ліцензію на програмний продукт, не отримує похідні коди програмних модулів і не отримує право самостійно розгортати або змінювати програмне забезпечення як власний програмний актив.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт користується сервісом K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Це означає, що компанія отримує доступ до системи, працює у своїй окремій базі даних, використовує підключені модулі, створює користувачів, веде документи, налаштовує довідники, обробляє операції та отримує обслуговування відповідно до обраного пакета.&lt;br /&gt;
&lt;br /&gt;
Оплата залежить від кількості користувачів, кількості підключених модулів і конфігурації сервісу.&lt;br /&gt;
&lt;br /&gt;
Наприклад, якщо компанії потрібен бухгалтерський модуль K2 ERP у SaaS-форматі для &#039;&#039;&#039;5 користувачів&#039;&#039;&#039;, вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Якщо користувачів більше — щомісячна оплата збільшується. Якщо компанія підключає більше модулів — вартість також зростає.&lt;br /&gt;
&lt;br /&gt;
Це нормальна логіка SaaS: бізнес платить за той обсяг сервісу, який реально використовує.&lt;br /&gt;
&lt;br /&gt;
== Чим SaaS відрізняється від безкоштовної хмари cloud.corp2.eu ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP має безкоштовну хмару для роботи — &#039;&#039;&#039;cloud.corp2.eu&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це зручний варіант для знайомства з продуктом, навчання, тестування, демонстрацій, перших кроків і базового використання системи. Компанія може зайти в K2 ERP, подивитися інтерфейс, спробувати логіку роботи, перевірити модулі й оцінити можливості системи без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
Але платний SaaS — це інший рівень.&lt;br /&gt;
&lt;br /&gt;
На відміну від безкоштовної публічної хмари, платні SaaS-пакети передбачають роботу компанії в &#039;&#039;&#039;окремій базі даних&#039;&#039;&#039; і на &#039;&#039;&#039;окремому екземплярі програмних продуктів K2 ERP&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Це важливо для бізнесу, якому потрібне відокремлене робоче середовище, власні дані, власні довідники, власні документи, свої користувачі, налаштування, процеси та регулярне обслуговування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Платний SaaS — це не просто “платна версія безкоштовної хмари”.&#039;&#039;&#039; Це окремий формат роботи для компаній, які хочуть використовувати K2 ERP у щоденній діяльності, але без купівлі серверної ліцензії.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Що отримує клієнт у SaaS-моделі ==&lt;br /&gt;
&lt;br /&gt;
У SaaS-моделі клієнт отримує окреме робоче середовище для своєї компанії.&lt;br /&gt;
&lt;br /&gt;
Він може працювати з підключеними модулями K2 ERP, вести облік, клієнтів, складські операції, документи, звіти, бізнес-процеси, налаштовувати довідники й організовувати роботу користувачів.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з одного модуля, наприклад з бухгалтерського обліку, CRM або складу. Потім поступово підключити інші модулі: документообіг, HR, навчання персоналу, управлінську звітність, інтернет-магазин, сервісне обслуговування, інтеграції чи інші компоненти K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Це дозволяє не купувати все одразу. Бізнес може стартувати з мінімально потрібної конфігурації та розширювати систему тоді, коли в цьому з’являється реальна потреба.&lt;br /&gt;
&lt;br /&gt;
Для малого й середнього бізнесу це часто найбільш зручний варіант. Не потрібно одразу робити великий капітальний платіж. Не потрібно купувати серверну ліцензію. Не потрібно будувати власну інфраструктуру. Можна почати з щомісячної оплати й поступово розвивати автоматизацію.&lt;br /&gt;
&lt;br /&gt;
== Важливо: SaaS — це не передача ліцензії і не передача похідних кодів ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #d64545; padding:16px 20px; margin:20px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються похідні коди програмних модулів K2 ERP.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;У SaaS-моделі клієнту не передаються ліцензії на програмний продукт.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Клієнт не купує програму у власність.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це потрібно чітко розуміти до початку роботи.&lt;br /&gt;
&lt;br /&gt;
Компанія користується сервісом K2 ERP доти, доки сплачує щомісячні платежі відповідно до умов договору та обраного тарифного пакета.&lt;br /&gt;
&lt;br /&gt;
Це означає, що клієнт отримує доступ до функціоналу, окремої бази даних, підключених модулів і технічного обслуговування. Але він не отримує право самостійно копіювати, розгортати, змінювати або поширювати програмні модулі K2 ERP як власний програмний продукт.&lt;br /&gt;
&lt;br /&gt;
Якщо щомісячна оплата припиняється, право користування SaaS-сервісом також припиняється або обмежується відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Це нормальна модель для SaaS-ринку. Так працює більшість сучасних хмарних сервісів: клієнт не купує програму, а користується сервісом у період активної оплати.&lt;br /&gt;
&lt;br /&gt;
== Практичне порівняння: повна ліцензія чи SaaS ==&lt;br /&gt;
&lt;br /&gt;
Різницю найкраще видно на прикладі бухгалтерського модуля K2 ERP.&lt;br /&gt;
&lt;br /&gt;
Якщо компанія купує повну ліцензію на бухгалтерський облік, вона сплачує &#039;&#039;&#039;15 000 євро одноразово&#039;&#039;&#039;. Додатково може оплачуватися хостинг, наприклад &#039;&#039;&#039;50 євро на місяць&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
У цьому випадку клієнт отримує окремий сервер або окрему віртуальну машину, безлімітну кількість користувачів, похідні коди програмних модулів і ширші можливості роботи із системою.&lt;br /&gt;
&lt;br /&gt;
Це модель для тих, хто хоче мати більше контролю, більше прав і не залежати від кількості користувачів у тарифі.&lt;br /&gt;
&lt;br /&gt;
Якщо ж компанія обирає SaaS, вона не сплачує 15 000 євро одноразово. Наприклад, для бухгалтерського модуля при &#039;&#039;&#039;5 користувачах&#039;&#039;&#039; вартість може становити &#039;&#039;&#039;85 євро на місяць&#039;&#039;&#039; за хостинг та оренду бухгалтерського модуля.&lt;br /&gt;
&lt;br /&gt;
Але в SaaS клієнт не отримує похідні коди, не отримує ліцензію на програмні модулі й не отримує програмний продукт у власність. Він користується сервісом за щомісячну оплату.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;overflow-x:auto; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;width:100%; border-collapse:collapse; font-size:95%;&amp;quot;&lt;br /&gt;
! style=&amp;quot;background:#1f4e79; color:#ffffff; padding:10px;&amp;quot; | Параметр&lt;br /&gt;
! style=&amp;quot;background:#2f75b5; color:#ffffff; padding:10px;&amp;quot; | Повна ліцензія K2 ERP&lt;br /&gt;
! style=&amp;quot;background:#70ad47; color:#ffffff; padding:10px;&amp;quot; | SaaS K2 ERP&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Стартовий платіж&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;15 000 € одноразово&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Без купівлі ліцензії&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Щомісячна оплата&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Хостинг, наприклад &#039;&#039;&#039;50 €/міс&#039;&#039;&#039;&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від користувачів і модулів&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Приклад бухгалтерії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Повна ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;85 €/міс&#039;&#039;&#039; при 5 користувачах&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Похідні коди&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Надаються за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не надаються&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія на модулі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Передається за умовами ліцензії&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | &#039;&#039;&#039;Не передається&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кількість користувачів&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Безліміт&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Залежить від тарифу&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Серверне середовище&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий сервер або ВМ&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Окремий SaaS-екземпляр&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Модель використання&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Ліцензія&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Користування сервісом&lt;br /&gt;
|-&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Кому підходить&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Середній і великий бізнес, компанії з потребою в контролі&lt;br /&gt;
| style=&amp;quot;padding:9px;&amp;quot; | Малий і середній бізнес, швидкий старт без великого платежу&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ця різниця принципова.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це більший стартовий платіж, але більше контролю, більше прав, безліміт користувачів і доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це менший стартовий бар’єр, щомісячна оплата, окрема база даних, окремий екземпляр продукту, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
== Для кого підходить SaaS K2 ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS K2 ERP підходить компаніям, які вже переросли безкоштовну хмару, але ще не готові купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це може бути малий бізнес, якому потрібні бухгалтерський облік, CRM, склад, документи або управлінська звітність.&lt;br /&gt;
&lt;br /&gt;
Це може бути сервісна компанія, яка хоче контролювати клієнтів, заявки, роботи, оплату й документи.&lt;br /&gt;
&lt;br /&gt;
Це може бути торгова компанія, якій потрібні товари, залишки, замовлення, постачальники, клієнти та звіти.&lt;br /&gt;
&lt;br /&gt;
Це може бути інтернет-магазин, якому потрібна інтеграція продажів, складу, клієнтів і обліку.&lt;br /&gt;
&lt;br /&gt;
Це може бути навчальний центр, якому потрібні CRM, LMS, документообіг, користувачі, курси, сертифікати й контроль навчання.&lt;br /&gt;
&lt;br /&gt;
Це може бути компанія, яка хоче поступово перейти з 1С або BAS, але не готова одразу купувати серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f7f7f7; border-left:6px solid #666666; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Для таких компаній SaaS — це можливість не відкладати автоматизацію “на потім”, а почати працювати вже зараз.&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Чому SaaS важливий для заміни 1С та BAS ==&lt;br /&gt;
&lt;br /&gt;
Якщо ми говоримо про реальну заміну 1С та BAS в Україні, то потрібно думати не лише про великі підприємства.&lt;br /&gt;
&lt;br /&gt;
Так, великим компаніям потрібні серверні ліцензії, власна інфраструктура, масштабні впровадження, інтеграції, складні бізнес-процеси й доступ до похідних кодів.&lt;br /&gt;
&lt;br /&gt;
Але сотні тисяч малих і середніх компаній не можуть перейти на українську ERP, якщо для старту їм одразу потрібно сплатити велику суму.&lt;br /&gt;
&lt;br /&gt;
Саме тому SaaS-модель є стратегічно важливою.&lt;br /&gt;
&lt;br /&gt;
Вона дає можливість малому бізнесу поступово відмовлятися від застарілого й ворожого програмного забезпечення, не заходячи одразу в дорогий проєкт впровадження.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з кількох користувачів, одного модуля, базового обліку або CRM. Потім — розширити систему. Потім — підключити нові модулі. А коли бізнес виросте і захоче повного контролю, він зможе розглянути перехід на повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це нормальна еволюція автоматизації.&lt;br /&gt;
&lt;br /&gt;
== SaaS як проміжний етап між безкоштовною хмарою і повною ліцензією ==&lt;br /&gt;
&lt;br /&gt;
K2 ERP фактично дає бізнесу три шляхи входу.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display:block; margin:20px 0;&amp;quot;&amp;gt;&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#eef7ff; border:1px solid #b7d7f0; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;1. Безкоштовна хмара cloud.corp2.eu&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Старт, знайомство, навчання, тестування і перші кроки.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#f1fff0; border:1px solid #b7e2bc; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;2. Платний SaaS&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окрема база даних, окремий екземпляр програмних продуктів, щомісячна оплата, підключені модулі й робоче середовище для конкретної компанії.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
  &amp;lt;div style=&amp;quot;background:#fff7e6; border:1px solid #f4d28f; padding:14px 18px; margin-bottom:10px; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;strong&amp;gt;3. Повна серверна ліцензія&amp;lt;/strong&amp;gt;&amp;lt;br /&amp;gt;&lt;br /&gt;
    Окремий сервер, безліміт користувачів, похідні коди, ширші права використання і максимальний контроль.&lt;br /&gt;
  &amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ці моделі не конкурують одна з одною. Вони закривають різні потреби бізнесу.&lt;br /&gt;
&lt;br /&gt;
Компанія може почати з безкоштовної хмари, перейти на SaaS, а згодом купити повну ліцензію. Або одразу стартувати з SaaS, якщо вже зрозуміло, які модулі потрібні. Або одразу придбати повну ліцензію, якщо компанії потрібен масштаб, контроль і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Головне — бізнес має вибір.&lt;br /&gt;
&lt;br /&gt;
== Прозорість умов — це основа довіри ==&lt;br /&gt;
&lt;br /&gt;
Для K2 ERP важливо одразу чесно пояснювати клієнтам різницю між моделями.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Безкоштовна хмара&#039;&#039;&#039; — це можливість спробувати систему й почати роботу без стартових витрат.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;SaaS&#039;&#039;&#039; — це користування сервісом за щомісячну оплату, з окремою базою даних і окремим екземпляром програмних продуктів, але без передачі ліцензій і похідних кодів.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Повна ліцензія&#039;&#039;&#039; — це окрема комерційна модель, яка передбачає інший рівень прав, окремий сервер, безліміт користувачів і доступ до похідних кодів відповідно до умов ліцензування.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#fff0f0; border-left:6px solid #c00000; padding:14px 18px; margin:18px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;Важливо:&#039;&#039;&#039; SaaS за 85 євро на місяць і повна ліцензія за 15 000 євро — це не одне й те саме.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
У першому випадку клієнт користується сервісом.&lt;br /&gt;
&lt;br /&gt;
У другому — отримує ліцензію, похідні коди, окремий сервер і безліміт користувачів.&lt;br /&gt;
&lt;br /&gt;
Саме тому різна вартість. Саме тому різні права. Саме тому різні сценарії використання.&lt;br /&gt;
&lt;br /&gt;
== Платний SaaS K2 ERP — доступний шлях до української ERP ==&lt;br /&gt;
&lt;br /&gt;
Платний SaaS-сервіс K2 ERP створений для компаній, які хочуть працювати в сучасній українській ERP-системі, але не готові одразу купувати повну серверну ліцензію.&lt;br /&gt;
&lt;br /&gt;
Це доступний формат для малого й середнього бізнесу, який дозволяє почати автоматизацію без великого стартового платежу.&lt;br /&gt;
&lt;br /&gt;
Клієнт отримує окрему базу даних, окремий екземпляр програмних продуктів, потрібні модулі, хостинг, технічне обслуговування і можливість працювати в K2 ERP за щомісячною оплатою.&lt;br /&gt;
&lt;br /&gt;
Але при цьому потрібно чітко розуміти: у SaaS-моделі не передаються похідні коди, не передаються ліцензії на програмні модулі й не передаються права на сам програмний продукт. Компанія користується сервісом доти, доки сплачує щомісячні платежі відповідно до умов договору.&lt;br /&gt;
&lt;br /&gt;
Саме така модель робить K2 ERP доступнішою для малого бізнесу.&lt;br /&gt;
&lt;br /&gt;
Не кожна компанія готова одразу платити 15 000 євро за повну ліцензію. Але багато компаній можуть почати з SaaS-пакета, наприклад з бухгалтерського модуля для 5 користувачів за 85 євро на місяць, і поступово розширювати використання системи.&lt;br /&gt;
&lt;br /&gt;
Це дає українському бізнесу реальний шлях переходу на сучасну ERP без різкого фінансового навантаження.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;background:#f1fff0; border-left:6px solid #3ca65c; padding:16px 20px; margin:22px 0; border-radius:6px;&amp;quot;&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;K2 ERP створює різні моделі для різних компаній:&#039;&#039;&#039; безкоштовну хмару для старту, платний SaaS для відокремленої роботи за щомісячною оплатою і повну серверну ліцензію для тих, кому потрібен максимальний контроль, похідні коди й безліміт користувачів.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Це і є нормальна логіка сучасної ERP-платформи: не змушувати всіх купувати однаковий пакет, а дати бізнесу вибір.&lt;br /&gt;
&lt;br /&gt;
Бо головне завдання K2 ERP — зробити українську ERP доступною, масштабованою і реальною альтернативою застарілому та ворожому програмному забезпеченню для бізнесу будь-якого розміру.&lt;br /&gt;
&lt;br /&gt;
== Див. також ==&lt;br /&gt;
&lt;br /&gt;
* [[K2 ERP]]&lt;br /&gt;
* [[K2 SaaS]]&lt;br /&gt;
* [[Хмарний ERP-сервіс K2]]&lt;br /&gt;
* [[Заміна 1С та BAS]]&lt;br /&gt;
* [[Бухгалтерський облік K2 ERP]]&lt;br /&gt;
* [[CRM K2 ERP]]&lt;br /&gt;
* [[cloud.corp2.eu]]&lt;br /&gt;
&lt;br /&gt;
[[Категорія:K2 ERP]]&lt;br /&gt;
[[Категорія:SaaS]]&lt;br /&gt;
[[Категорія:ERP]]&lt;br /&gt;
[[Категорія:Українське програмне забезпечення]]&lt;br /&gt;
[[Категорія:Заміна 1С та BAS]]&lt;/div&gt;</summary>
		<author><name>R</name></author>
	</entry>
</feed>