Посібник з міграції з QuickBooks до Beancount
Етап 1: Експорт даних із QuickBooks
Міграція даних за п'ять років починається з вивантаження всіх записів із QuickBooks у придатному для використання форматі. QuickBooks Desktop та QuickBooks Online мають різні опції експорту:
1.1 QuickBooks Desktop – Опції експорту
IIF (Intuit Interchange Format): QuickBooks Desktop може експортувати списки (як-от план рахунків, клієнти, постачальники) у текстові файли .IIF
. У QuickBooks Desktop перейдіть до Файл → Утиліти → Експорт → Списки до IIF, а потім виберіть потрібні списки (наприклад, План рахунків, Клієнти, Постачальники). Це створить текстовий файл, що містить назви рахунків, їхні типи та дані списків. IIF — це пропрієтарний, але текстовий формат, який відносно легко аналізувати. Використовуйте його для отримання вашого Плану рахунків та списків контактів для подальшого використання в Beancount.
Головна книга/Журнал через CSV: Для експорту транзакцій QuickBooks Desktop не надає повного експорту в один клік, але можна використовувати звіти. Рекомендований метод — експортувати Головний журнал (усі транзакції) за потрібний період. У QuickBooks Desktop відкрийте Звіти → Бухгалтер та податки → Журнал, встановіть Дати від найранішої транзакції до сьогодні, та натисніть Експорт → Excel. Збережіть результат як CSV, видаливши заголовки/нижні колонтитули звіту та порожні стовпці. Переконайтеся, що числові дані чисті: вони мають містити центи (наприклад, 3.00
, а не 3
), не мати зайвих лапок, символів валют або подвійних мінусів у CSV. CSV-файл повинен мати стовпці, такі як Дата, № транзакції, Назва, Рахунок, Примітка, Дебет, Кредит, Залишок (або єдиний стовпець "Сума" залежно від формату звіт у).
Порада: QuickBooks Desktop 2015+ також може експортувати транзакції через діалогове вікно Знайти. Використовуйте Редагувати → Знайти → Розширений пошук, встановіть діапазон дат на п'ять років, а потім експортуйте результати у CSV. Увага: Деякі версії обмежують експорт 32,768 рядками. Якщо у вас дуже великий обсяг даних, експортуйте їх по роках (або меншими частинами), щоб уникнути обрізання, а потім об'єднайте їх. Переконайтеся, що діапазони дат не перетинаються, щоб уникнути дублікатів.
Інші формати (QBO/QFX/QIF): QuickBooks Desktop може імпортувати банківські транзакції через файли .QBO
(Web Connect) або .QFX/.OFX
, але для експорту з QuickBooks вони зазвичай не використовуються. Якщо ваша мета — витягти лише банківські транзакції, ви, можливо, вже маєте їх у форматі QBO/OFX від вашого банку. Однак для повного експорту книги дотримуйтесь IIF та CSV. QuickBooks Desktop не може безпосередньо експортувати у QIF (Quicken Interchange Format) без сторонніх інструментів. Якщо ви все ж знайдете спосіб отримати QIF, зауважте, що деякі інструменти для ведення обліку (старі версії Ledger 2.x) могли читати QIF, але для нашого процесу краще працювати з CSV.
1.2 QuickBooks Online – Опції експорту
Вбудований експорт в Excel/CSV: QuickBooks Online (QBO) надає інструмент Експортувати дані. Перейдіть до Налаштування ⚙ → Інструменти → Експортувати дані. У діалоговому вікні експорту на вкладці Звіти виберіть дані (наприклад, Головна книга або Список транзакцій), а на вкладці Списки — списки (план рахунків тощо), оберіть Усі дати та експортуйте в Excel. QuickBooks Online завантажить ZIP-архів, що містить кілька файлів Excel для вибраних звітів та списків (наприклад, Звіт про прибутки та збитки, Балансовий звіт, Головна книга, Клієнти, Постачальники, План рахунків тощо). Потім ви можете конвертувати ці файли Excel у CSV для обробки.
Звіт про деталізацію транзакцій: Якщо стандартний експорт QBO не містить єдиного файлу Головної книги, ви можете вручну створити детальний звіт:
- Перейдіть д о Звіти та знайдіть Деталізація транзакцій за рахунком (або Головна книга в деяких версіях QBO).
- Встановіть Період звіту на повний п'ятирічний діапазон.
- В опціях звіту встановіть Групувати за = Немає (щоб перелічити окремі транзакції без проміжних підсумків).
- Налаштуйте стовпці, щоб включити принаймні: Дата, Тип транзакції, Номер, Назва (Одержувач/Клієнт), Примітка/Опис, Рахунок, Дебет, Кредит (або єдиний стовпець Сума), та Залишок. Включіть будь-який клас або місцезнаходження, якщо вони використовуються.
- Запустіть звіт, а потім Експортуйте в Excel.
Це дасть детальну книгу всіх транзакцій. Збережіть її як CSV. Кожен рядок представлятиме одне проведення (запис) транзакції. Пізніше вам потрібно буде згрупувати рядки за транзакціями для конвертації.
План рахунків та інші списки: QuickBooks Online може експортувати план рахунків через Бухгалтерія → План рахунків → Пакетні дії → Експортувати в Excel. Зробіть це, щоб отримати назви та типи рахунків. Так само експортуйте Клієнтів, Постачальників тощо, як що хочете перенести імена для метаданих.
API QuickBooks Online (Необов'язково): Для програмного підходу Intuit надає REST API для даних QBO. Досвідчені користувачі можуть створити додаток QuickBooks Online (потрібен акаунт розробника) та використовувати API для отримання даних у форматі JSON. Наприклад, ви можете запитати ендпоінт Account
для плану рахунків та ендпоінти звітів JournalEntry
або GeneralLedger
для транзакцій. Існують Python SDK, як-от python-quickbooks
, що є обгортками для API. Однак використання API включає OAuth-аутентифікацію і є надмірним для одноразової міграції, якщо ви не віддаєте перевагу автоматизації. У більшості випадків ручний експорт у CSV/Excel є простішим та менш схильним до помилок.
Етап 2: Трансформація та очищення даних
Коли ви маєте дані з QuickBooks у форматі CSV (та/або IIF), наступним кроком є їх конвертація у текстовий формат книги Beancount. Це включає аналіз експортованих файлів, зіставлення рахунків QuickBooks із планом рахунків Beancount та форматування транзакцій у синтаксисі Beancount.
2.1 Аналіз експортованих даних QuickBooks за допомогою Python
Використання Python забезпечить точність та відтворюваність трансформації. Ми окреслимо скрипти для двох ключових завдань: імпорту плану рахунків та конвертації транзакцій.
Імпорт та зіставлення рахунків: Важливо налаштувати ваші рахунки в Beancount перед додаванням транзакцій. Рахунки QuickBooks мають типи (Банк, Дебіторська заборгованість, Витрати тощо), які ми зіставимо з ієрархією Beancount (Активи, Зобов'язання, Доходи, Витрати тощо). Наприклад, ми можемо використовувати таке зіставлення:
# Відповідність типу рахунку QuickBooks до кореневої категорії Beancount
AccountTypeMap = {
'BANK': 'Assets',
'CCARD': 'Liabilities',
'AR': 'Assets', # Дебіторська заборгованість як актив
'AP': 'Liabilities', # Кредиторська заборгованість як зобов'язання
'FIXASSET': 'Assets',
'OASSET': 'Assets', # Інший актив
'OCASSET': 'Assets', # Інший поточний актив
'LTLIAB': 'Liabilities', # Довгострокове зобов'язання
'OCLIAB': 'Liabilities', # Інше поточне зобов'язання
'EQUITY': 'Equity',
'INC': 'Income',
'EXP': 'Expenses',
'EXINC': 'Income', # Інший дохід
'EXEXP': 'Expenses', # Інша витрата
}
Використовуючи експорт IIF з QuickBooks Desktop або CSV-файл списку рахунків з QBO, ми отримуємо назву та тип кожного рахунку. Потім:
-
Створюємо назви рахунків Beancount: QuickBooks іноді використовує двокрапки (
:
) у назвах рахунків для позначення субрахунків (наприклад, “Поточні Активи:Розрахунковий”). Beancount використовує ту саму нотацію для ієрархії. Часто можна використовувати назву безпосередньо. Якщо назви рахунків QuickBooks не починаються з категорії, додайте зіставлену категорію. Наприклад, рахунок QuickBooks типуBANK
з назвою "Розрахунковий" станеAssets:Розрахунковий
у Beancount. РахунокEXP
(витрати) "Харчування" станеExpenses:Харчування
і т.д. -
Забезпечуємо валідність назв: Видаліть або замініть будь-які символи, які можуть заплутати Beancount. QuickBooks дозволяє символи на кшталт
&
або/
у назвах. Розумно видалити або замінити спеціальні символи (наприклад, замінити&
наand
, видалити слеші або пробіли). Також переконайтеся, що всі назви рахунків унікальні після трансформації — QuickBooks міг дозволяти однакові назви субрахунків під різними батьківськими, що нормально, але в Beancount повна назва (з батьківськими) має бути унікальною. За потреби перейменуйте або додайте кваліфікатор для їх розрізнення. -
Генеруємо відкриття рахунків: У Beancount кожен використаний рахунок повинен бути відкритий за допомогою директиви
open
. Ви можете вибрати дату перед вашою першою транзакцією (наприклад, якщо мігруєте дані за 2019–2023 роки, використовуйте2018-12-31
або ще ранішу дату для всіх відкриттів). Скрипт запише рядки на кшталт:2018-12-31 open Assets:Checking USD
2018-12-31 open Expenses:Meals USD
для кожного рахунку (припускаючи, що USD є основною валютою). Використовуйте відповідну валюту для кожного рахунку (див. нотатки про мультивалютність нижче).
Конвертація транзакцій: Основна складність полягає в конвертації експортованих транзакцій QuickBooks (CSV) у записи Beancount. Кожна транзакція QuickBooks (рахунок-фактура, рахунок, чек, журнальний запис тощо) може мати кілька проведень (рядків), які необхідно зібрати в одну транзакцію Beancount.
Ми використаємо CSV-рідер Python для ітерації по експортованих рядках та накопичення проведень:
import csv
from collections import defaultdict
# Читаємо всі рядки з CSV журналу QuickBooks
rows = []
with open('quickbooks_exported_journal.csv', 'r', encoding='utf-8') as f:
reader = csv.DictReader(f)
for line in reader:
rows.append(line)
# Групуємо рядки за транзакцією (припускаючи, що '№ транзакції' ідентифікує транзакції)
transactions = defaultdict(list)
for line in rows:
trans_id = line.get('Trans #') or line.get('Transaction ID') or line.get('Num')
transactions[trans_id].append(line)
Тепер transactions
— це словник, де кожен ключ — це ID/номер транзакції, а значення — список проведень для цієї транзакції. Далі ми конвертуємо кожну групу в Beancount:
def format_date(qb_date):
# Дати в QuickBooks можуть бути у форматі "12/31/2019"
m, d, y = qb_date.split('/')
return f"{y}-{int(m):02d}-{int(d):02d}"
output_lines = []
for trans_id, splits in transactions.items():
# Сортуємо проведення за порядком, якщо потрібно (зазвичай вони йдуть по порядку)
splits = sorted(splits, key=lambda x: x.get('Line') or 0)
first = splits[0]
date = format_date(first['Date'])
payee = first.get('Name', "").strip()
memo = first.get('Memo', "").strip()
# Заголовок транзакції
output_lines.append(f"{date} * \"{payee}\" \"{memo}\"")
if first.get('Num'): # додаємо номер, якщо є
output_lines.append(f" number: \"{first['Num']}\"")
# Проходимо по кожному проведенню/запису
for split in splits:
acct_name = split['Account'].strip()
# Зіставляємо назву рахунку QuickBooks з рахунком Beancount (використовуючи попередню мапу)
beancount_acct = account_map.get(acct_name, acct_name)
# Визначаємо суму зі знаком:
amount = split.get('Amount') or ""
debit = split.get('Debit') or ""
credit = split.get('Credit') or ""
if amount:
# Деякі експорти мають один стовпець "Сума" (негативний для кредитів)
amt_str = amount
else:
# Якщо окремі стовпці "Дебет"/"Кредит"
amt_str = debit if debit else f"-{credit}"
# Видаляємо коми в числах для безпеки
amt_str = amt_str.replace(",", "")
# Додаємо валюту
currency = split.get('Currency') or "USD"
amt_str = f"{amt_str} {currency}"
# Примітка/опис для проведення
line_memo = split.get('Memo', "").strip()
comment = f" ; {line_memo}" if line_memo else ""
output_lines.append(f" {beancount_acct:<40} {amt_str}{comment}")
# Кінець транзакції – порожній рядок
output_lines.append("")
Ця логіка скрипта виконує наступне:
-
Форматує дату в YYYY-MM-DD для Beancount.
-
Використовує отримувача (Name) та примітку (Memo) для опису транзакції. Наприклад:
2020-05-01 * "ACME Corp" "Оплата рахунку"
(Якщо отримувача немає, можна використати Тип транзакції QuickBooks або залишити лапки порожніми). -
Додає метадані
number
, якщо є номер (номер чека, рахунку-фактури тощо). -
Ітерує по кожному рядку проведення:
- Зіставляє назву рахунку QuickBooks з рахунком Beancount за допомогою словника
account_map
(заповненого на етапі роботи з планом рахунків). - Визначає суму. Залежно від вашого експорту, у вас може бути один стовпець Сума (з позитивними/негативними значеннями) або окремі стовпці Дебет та Кредит. Наведений вище код обробляє обидва випадки. Він забезпечує, що кредити представлені як негативні суми для Beancount (оскільки в Beancount для кожного проведення використовується одне число зі знаком).
- Додає валюту (припускаючи USD, якщо немає окремого стовпця з валютою).
- Записує рядок проведення Beancount з рахунком, сумою та коментарем з примітки до рядка. Наприклад:
Assets:Checking 500.00 USD ; Депозит
Income:Sales -500.00 USD ; Депозит
Це відображає депозит у $500 (з Доходів на Розрахунковий рахунок).
- Зіставляє назву рахунку QuickBooks з рахунком Beancount за допомогою словника
-
Після переліку всіх проведень, транзакцію відокремлює порожній рядок.
Обробка мультивалютності: Якщо ваші дані QuickBooks включають кілька валют, додайте код валюти до кожного проведення (як показано вище). Переконайтеся, що рахунки в іноземних валютах відкриті з цією валютою. Наприклад, якщо у вас є банківський рахунок в EUR, ви б вивели open Assets:Bank:Checking EUR
, і транзакції на цьому рахунку використовуватимуть EUR. Beancount підтримує мультивалютні книги й відстежуватиме неявні конвертації, але вам може знадобитися додати записи про курси, якщо ви хочете бачити конвертацію в базову валюту у звітах. Також рекомендується оголосити вашу основну операційну валюту на початку файлу Beancount (наприклад, option "operating_currency" "USD"
).
Запуск конвертації: Збережіть скрипт Python (наприклад, як qb_to_beancount.py
) і запустіть його на ваших експортованих файлах. Він повинен створити файл .beancount
, що містить усі рахунки та транзакції.
2.2 Обробка крайніх випадків та очищення даних
Під час трансформації звертайте увагу на ці поширені проблеми та способи їх вирішення:
-
Невідповідності в назвах рахунків: QuickBooks може мати назви рахун ків, що конфліктують з ієрархічними назвами Beancount. Наприклад, у QuickBooks може бути два різні батьківські рахунки, кожен із субрахунком "Страхування". У Beancount
Expenses:Insurance
має бути унікальним. Вирішіть це, перейменувавши один з них (наприклад, "Страхування-Авто" проти "Страхування-Здоров'я") перед експортом або зіставте їх з унікальними рахунками Beancount у вашому скрипті. Послідовні правила іменування (без спеціальних символів та використання ієрархії) заощадять вам головний біль. Використовуйте підхід з файлом перепризначення, якщо потрібно: ведіть CSV або словник "стара назва" → "нова назва Beancount" і застосовуйте його під час конвертації (наш приклад коду використовуєaccount_map
і може завантажувати перевизначення з файлу). -
Дати та формати: Переконайтеся, що всі дати мають послідовний формат. Наведений вище скрипт нормалізує M/D/Y до формату ISO. Також слідкуйте за проблемами фіскального та календарного року, якщо ваш п'ятирічний період перетинає кінець року. Beancount не зважає на межі фіскального року, але ви можете пізніше захотіти розділити файли за роками для зручності.
-
Числова точність: QuickBooks обробляє валюту з центами, тому робота в центах зазвичай не є проблемою. Всі суми в CSV ідеально повинні мати два десяткових знаки. Якщо якісь суми перетворилися на цілі числа (без десяткової частини) або мають коми/дужки (для негативних значень), очистіть їх у скрипті (видаліть коми, перетворіть
(100.00)
на-100.00
тощо). Експорт у CSV, якщо зроблений правильно (згідно з інструкціями), вже повинен уникнути цих проблем з форматуванням. -
Від'ємні суми та знаки: Звіти QuickBooks іноді показують негативні значення як
-100.00
,(100.00)
або навіть--100.00
у певних експортах Excel. Крок очищення повинен обробляти це. Переконайтеся, що дебети та кредити кожної транзакції збалансовані до нуля. Beancount вимагатиме цього (якщо не збалансовано, він видасть помилку під час імпорту). -
Дублікати транзакцій: Якщо вам довелося експортувати транзакції партіями (наприклад, рік за роком або рахунок за рахунком), будьте обережні, щоб об'єднати їх без перекриття. Перевірте, чи перша транзакція року не є також оста нньою з попередньої партії тощо. Легко випадково продублювати кілька транзакцій на межах. Якщо ви підозрюєте дублікати, ви можете відсортувати кінцеві записи Beancount за датою та шукати ідентичні записи, або використовувати унікальні теги транзакцій Beancount для їх виявлення. Одна зі стратегій — включати номери транзакцій QuickBooks як метадані (наприклад, використовувати
№ транзакції
або номер рахунку-фактури як тегtxn
або метаданіquickbooks_id
), а потім переконатися, що дублікатів цих ID немає. -
Незбалансовані проведення / Транзитні рахунки: QuickBooks може мати дивні випадки, як-от транзакція з дисбалансом, який QuickBooks автоматично скоригував на рахунок “Початковий власний капітал” або “Нерозподілений прибуток”. Наприклад, при встановленні початкових залишків на рахунках QuickBooks часто проводить різницю на рахунок власного капіталу. Вони з'являться в експортованих транзакціях. Beancount вимагатиме явного балансування. Вам може знадобитися ввести рахунок власного капіталу для початкових залишків (зазвичай
Equity:Opening-Balances
), щоб відобразити дії QuickBooks. Хорошою практикою є ст ворення запису про початкові залишки в перший день вашої книги, який встановлює стартові баланси всіх рахунків (див. Етап 5). -
Крайні випадки з мультивалютністю: При використанні кількох валют експорт з QuickBooks може містити всі суми в домашній валюті або в їхній рідній валюті. Ідеально отримати дані в рідній валюті для кожного рахунку (звіти QuickBooks Online зазвичай так роблять). У Beancount кожне проведення несе валюту. Якщо QuickBooks надав обмінні курси або конвертацію в домашню валюту, ви можете проігнорувати їх і покластися на записи про ціни Beancount. Якщо QuickBooks не експортував обмінні курси, вам може знадобитися вручну додати записи про ціни (наприклад, за допомогою директиви
price
Beancount) для ключових дат, щоб відповідати оцінці. Однак для базової цілісності книги достатньо, щоб транзакції балансувалися у своїх оригінальних валютах — нереалізовані прибутки/збитки не потрібно явно записувати, якщо ви не хочете мати такі ж звіти. -
Дебіторська / Кредиторська заборгованість: QuickBooks відстежує деталі рахунків-фактур та рахунків (терміни оплати, статус оплати тощо), які не буду ть повністю перенесені в просту книгу. Ви отримаєте транзакції по ДЗ та КЗ (рахунки-фактури, що збільшують ДЗ, платежі, що зменшують ДЗ тощо), але не документи рахунків-фактур або баланси клієнтів за кожним рахунком. Як результат, після міграції ви повинні перевірити, чи баланси ваших рахунків ДЗ та КЗ у Beancount дорівнюють відкритим балансам клієнтів/постачальників у QuickBooks. Якщо вам потрібно відстежувати рахунки-фактури, ви можете використовувати метадані Beancount (наприклад, включити тег
invoice
або посилання). Номери рахунків-фактур QuickBooks повинні були перейти в поляNum
абоMemo
— наш скрипт зберігаєNum
якnumber: "..."
у метаданих транзакції. -
Неактивні або закриті рахунки: Експорт IIF може включати неактивні рахунки (якщо ви вибрали їх включення). Це нормально — імпортувати їх (вони просто не матимуть транзакцій і нульовий баланс, якщо справді неактивні). Ви можете позначити їх як закриті в Beancount після дати останньої транзакції за допомогою директиви
close
. Це підтримує вашу книгу в порядку. Наприклад:2023-12-31 close Expenses:OldAccount ; закрито після міграції
Це нео бов'язково і в основному для чистоти.
Ретельно очистивши та зіставивши дані, як описано вище, ви отримаєте файл книги Beancount, який структурно відображає ваші дані з QuickBooks. Наступний крок — перевірити, чи він також чисельно відповідає QuickBooks.
Етап 3: Перевірка та звірка даних
Перевірка є критично важливим етапом у міграції бухгалтерських даних. Нам потрібно переконатися, що книга Beancount відповідає записам QuickBooks до копійки. Для цього можна використовувати кілька стратегій та інструментів:
3.1 Звірка за оборотним балансом
Звіт оборотний баланс (або пробний баланс) перелічує кінцеві залишки всіх рахунків (з дебетами та кредитами, або позитивними/негативн ими значеннями) і в сумі має давати нуль. Запуск оборотного балансу в обох системах на ту саму дату — найшвидший спосіб підтвердити загальну точність.
-
У QuickBooks: Сформуйте звіт Оборотний баланс на останній день фінального року (наприклад, 31 грудня 2023 року). Цей звіт показує баланс кожного рахунку. Експортуйте його або запишіть ключові показники.
-
У Beancount: Використовуйте звіти Beancount для генерації оборотного балансу. Один з легких способів — через командний рядок:
bean-report migrated.beancount balances
Звіт
balances
є оборотни м балансом, що перелічує всі рахунки та їхні залишки. Ви також можете відкрити файл у Fava (веб-інтерфейс Beancount) і подивитися розділ Balances або Balance Sheet. Кожен залишок рахунку в Beancount повинен збігатися з оборотним балансом QuickBooks. Наприклад, якщо QuickBooks показує Дебіторська заборгованість = 5,000 грн, то рахунок Assets:Accounts Receivable у Beancount повинен мати загальну суму 5,000 грн (дебет). Якщо Дохід від продажів = 200,000 грн, то Income:Sales у Beancount повинен показувати 200,000 грн (кредит, що може відображатися як -200,000, якщо використовується оборотний баланс, який представляє кредити як негативні значення).
Якщо є розбіжності, знайдіть їх:
- Перевірте, чи не відсутній або не є зайвим цілий рахунок (чи не забули ми рахунок, чи не включили той, що був закритий до періоду міграції?).
- Якщо баланс не збігається, заглибтеся: QuickBooks може сформувати Account QuickReport або деталізацію книги для цього рахунку, і ви можете порівняти її з регістром Beancount для цього рахунку (
bean-report migrated.beancount register -a AccountName
). Іноді розбіжності виникають через відсутню або дубльовану транзакцію.
Також перевірте, що сума всіх рахунків дорівнює нулю в оборотному балансі Beancount (він друкує загальну суму, яка повинна бути нульовою або дуже близькою до нуля). Beancount забезпечує подвійний запис, тому якщо у вас є будь-який ненульовий дисбаланс, це означає, що активи мінус зобов'язання-капітал не зійшлися в нуль, що вказує на проблему (яку QuickBooks зазвичай теж не допустив би, але це могло статися, якщо деякі дані були втрачені).
3.2 Порівняння залишків на рахунках
Крім оборотного балансу, ви можете порівняти конкретні фінансові звіти:
-
Балансовий звіт: Сформуйте Балансовий звіт у QuickBooks на кінцеву дату та балансовий звіт у Beancount (
bean-report migrated.beancount balsheet
). Це схоже на оборотний баланс, але організовано за Активами, Зобов'язаннями, Власним капіталом. Цифри повинні збігатися за категоріями. Для більш детальної перевірки порівняйте загальні суми основних рахунків: грошові кошти, ДЗ, основні засоби, КЗ, власний капітал тощо. -
Звіт про прибутки та збитки (Income Statement): Сформуйте Звіт про прибутки та збитки за п'ятирічний період (або рік за роком) у QuickBooks та в Beancount (
bean-report migrated.beancount income
для звіту про прибутки за весь період). Чистий прибуток з Beancount повинен дорівнювати прибутку з QuickBooks для кожного періоду. Якщо ви мігрували всі п'ять років, сукупний чистий прибуток повинен збігатися. Ви також можете порівняти окремі суми доходів та витрат, щоб переконатися, що жодна категорія не була пропущена або подвоєна. -
Випадкова вибірка транзакцій: Виберіть кілька випадкових транзакцій (особливо з кожного року та кожного основного рахунку) і перевірте, чи вони мігрували правильно. Наприклад, знайдіть рахунок-фактуру трирічної давності в QuickBooks, а потім знайдіть його суму або примітку у файлі Beancount (оскільки всі транзакції є текстом, ви можете відкрити файл
.beancount
у текстовому редакторі або використовувати інструменти пошуку). Перевірте, чи збігаються дата, суми та рахунки. Це допоможе виявити будь-які проблеми з форматуванням дати або неправильно зіставлені рахунки.
3.3 Автоматизовані перевірки цілісності
Використовуйте власні інструменти перевірки Beancount:
-
bean-check: Запустіть
bean-check migrated.beancount
. Це проаналізує файл і повідомить про будь-які помилки в синтаксисі або балансуванні. Якщо скрипт щось пропустив, наприклад, невідкритий рахунок або незбалансовану транзакцію,bean-check
позначить це. Чистий прохід (без виводу) означає, що файл принаймні внутрішньо узгоджений. -
Асерції залишків (Balance Assertions): Ви можете додати явні асерції залишків у книгу для ключових рахунків як додаткову перевірку. Наприклад, якщо ви знаєте залишок на банківському рахунку на певну дату, додайте рядок:
2023-12-31 balance Assets:Bank:Checking 10000.00 USD
Тодіbean-check
переконається, що в книзі на цю дату залишок дійсно становить 10,000 USD. Це необов'язково, але може бути корисним для важливих рахунків. Ви м ожете взяти кінцеві залишки з QuickBooks (наприклад, на кінець кожного року) і підтвердити їх у файлі Beancount. Якщо будь-яка асерція не пройде, Beancount повідомить про різницю. -
Перевірка оборотного балансу за періодами: Якщо бажаєте, ви можете зробити перевірку по періодах. Для кожного року порівняйте чисту зміну. Наприклад, чистий прибуток у QuickBooks 2020 проти Beancount 2020 тощо, щоб переконатися, що кожен рік правильно закрився на власний капітал (QuickBooks автоматично переносить чистий прибуток на Нерозподілений прибуток кожного нового року; в Beancount ви просто побачите сукупний власний капітал). Якщо ви бачите розбіжності, це може вказувати на проблему в даних конкретного року.
-
Кількість транзакцій та дублікати: Підрахуйте кількість транзакцій у QuickBooks та Beancount. QuickBooks не показує пряму кількість легко, але ви можете оцінити її, підрахувавши рядки в CSV (кожен заголовок транзакції проти проведень). У Beancount швидкий спосіб — підрахувати кількість входжень
txn
або* "
у файлі. Вони повинні бути рівними або трохи більшими, ніж у QuickBooks (якщо ви додали транзакції початкових залишків або коригування). Значна розбіжність означає, що щось могло бути пропущено або продубльовано. Наше використання унікальних ID в метаданих може допомогти: якщо ви підозрюєте дублікати, знайдіть у файлі Beancount той самий номер чека або рахунку-фактури, що з'являється двічі, коли не повинен. -
Статус звірки: Ми включили метадані
rec: "y"
або"n"
на основі статусу звірки в QuickBooks у нашому скрипті (якrec
у прикладі). Це не є стандартною функцією Beancount (Beancount не відстежує звірені/незавершені транзакції так само, як Ledger), але це може бути корисною метаданою. Ви можете перевірити, чи всі звірені в QuickBooks транзакції присутні. Зрештою, нова звірка банківських рахунків у Beancount (використовуючи ваші виписки) може бути остаточним доказом того, що нічого не пропущено.
Виконуючи ці перевірки, ви зміцнюєте впевненість у тому, що міграція зберегла дані. Не поспішайте на цьому етапі — легше виправити аномалії зараз, ніж через місяці, коли на книги можуть покладатися. Поширені проблеми, якщо перевірка не вдається: відсутній початковий баланс рахунку, транзакція з д атою поза діапазоном або інверсія знаку в записі. Усе це можна виправити після ідентифікації.
Етап 4: Фіксація даних у книзі Beancount
Після очищення та перевірки настав час формалізувати дані у вашій структурі книги Beancount. “Фіксація” тут означає як фіналізацію файлів книги, так і потенційне їх додавання до системи контролю версій для можливості аудиту.
4.1 Організація файлів книги та конфігурація
Вирішіть, як структурувати файли книги Beancount. Для даних за п'ять років ви можете зберігати все в одному файлі або розділити за роками чи категоріями. Поширена, зрозуміла структура така:
- Основний файл книги: наприклад,
ledger.beancount
— це точка входу, яка можеinclude
інші файли. Він може містити глобальні опції, а потім включати річні файли. - Файл рахунків: Визначте план рахунків та початкові залишки. Наприклад,
accounts.beancount
з усіма директивамиopen
(згенерованими скриптом). Тут ви також можете перелічити товари (валюти). - Файли транзакцій: Один на рік, наприклад,
2019.beancount
,2020.beancount
і т.д., що містять транзакції за цей рік. Це зберігає кожен файл у керованому розмірі та дозволяє зосередитися на конкретному році, якщо потрібно. Альтернативно, ви можете розділити за сутностями або рахунками, але поділ за часом є простим для фінансових даних.
Приклад основного файлу:
option "title" "Моя бізнес-книга"
option "operating_currency" "USD"
include "accounts.beancount"
include "2019.beancount"
include "2020.beancount"
...
include "2023.beancount"
Таким чином, усі дані агрегуються під час запуску звітів, але ви підтримуєте порядок.
Beancount не вимагає кількох файлів — ви можете мати один великий файл — але наведена вище структура покращує ясність та контроль версій. Згідно з найкращими практиками Beancount, варто використовувати чіткі заголовки розділів та логічно групувати пов'язані записи.
4.2 Встановлення початкових залишків та власного капіталу
Якщо ваша міграція не починається з абсолютного нуля, вам потрібно буде обробити початкові залишки. Два сценарії:
-
Книги з нуля: Якщо п'ятирічний період починається з моменту заснування бізнесу (наприклад, ви почали використовувати QuickBooks у січні 2019 року з усіма рахунками на нулі, крім початкового капіталу), то вам може не знадобитися окрема транзакція початкових залишків. Перші транзакції у 2019 році (наприклад, початкове фінансування на банківський рахунок) природним чином встановлять початкові баланси. Просто переконайтеся, що будь-який початковий капітал або попередній нерозподілений прибуток враховані через транзакції з власним капіталом.
-
Книги в середині процесу (часткова історія): Якщо ви почали використовувати QuickBooks раніше, і 2019 рік — це середина, то на 1 січня 2019 року кожен рахунок мав залишок, перенесений з попереднього періоду. QuickBooks мав би їх як початкові залишки або нерозподілений прибуток. У Beancount типово створювати запис про початкові залишки на день перед датою початку:
- Використовуйте рахунок власного капіталу під назвою
Equity:Opening-Balances
(або подібний) для компенсації суми всіх початкових залишків. - Приклад: якщо на 31.12.2018 р. Грошові кошти становили 10,000 грн, а ДЗ — 5,000 грн, а КЗ — 3,000 грн (кредит), ви б написали транзакцію:
2018-12-31 * "Початкові залишки"
Assets:Cash 10000.00 UAH
Assets:Accounts Receivable 5000.00 UAH
Liabilities:Accounts Payable -3000.00 UAH
Equity:Opening-Balances -12000.00 UAH
Це залишає на Opening-Balances негативну суму (–12 тис. грн), що балансує запис. Тепер усі рахунки активів/зобов'язань починають 2019 рік з правильними залишками. Це повинно відображати будь-які "Нерозподілені прибутки" QuickBooks або перенесені залишки. - Альтернативно, використовуйте директиви Beancount
pad
таbalance
: для кожного рахунку ви можетеpad
його з Opening-Balances та підтвердити залишок. Це більш автоматизований спосіб. Наприклад:2018-12-31 pad Assets:Cash Equity:Opening-Balances
2018-12-31 balance Assets:Cash 10000.00 UAH
Це каже Beancount вставити будь-який необхідний запис (на Opening-Balances), щоб Грошові кошти дорівнювали 10000 UAH на цю дату. Зробіть це для кожного рахунку. Результат схожий, але написання явної транзакції, як у першому методі, також є простим.
- Використовуйте рахунок власного капіталу під назвою
-
Нерозподілений прибуток: QuickBooks не експортує явно транзакцію “Нерозподілений прибуток” — він просто його обчислює. Після міграції ви можете помітити, що Equity:Retained Earnings дорівнює нулю, якщо ви його не створили. У Beancount нерозподілений прибуток — це просто прибуток попередніх років. Ви можете створити рахунок нерозподіленого прибутку і переносити на нього прибуток попередніх років у перший день кожного нового року, або просто дозволити власному капіталу бути сумою всіх доходів/витрат (що з'являється у розділі Власний капітал у звітах). Для прозорості деякі користувачі щорічно створюють закриваючі записи. Це необов'язково і в основному для презентації. Оскільки ми мігрували всі транзакції, прибуток за кожен рік природним чином згортатиметься, якщо ви запускаєте звіт за рік.
-
Порівняльні перевірки: Після встановлення початкових залишків запустіть балансовий звіт на дату початку, щоб переконатися, що все правильно (він повинен показувати ці початкові залишки проти початкового власного капіталу, що в сумі дає нуль).
4.3 Фіналізація та контроль верс ій
Тепер, коли дані у форматі Beancount і структуровані, розумно зафіксувати файли у репозиторії системи контролю версій (наприклад, git). Кожну зміну в книзі можна відстежувати, і ви маєте аудиторський слід усіх модифікацій. Це головна перевага текстової бухгалтерії. Наприклад, у QuickBooks зміни можуть бути нелегко порівняти, але в Beancount ви можете бачити різницю рядок за рядком. Як зазначають деякі користувачі, з Beancount ви отримуєте прозорість та можливість скасовувати зміни, якщо потрібно — кожен запис можна пов'язати з історією змін.
Розгляньте можливість позначити комміт цієї початкової міграції як v1.0
або подібним чином, щоб ви знали, що він представляє стан книг, імпортованих з QuickBooks. Надалі ви будете вводити нові транзакції безпосередньо в Beancount (або імпортувати з банківських виписок тощо), і ви можете використовувати звичайні практики розробки програмного забезпечення (коммітити щомісяця або щодня, використовувати гілки для експерим ентів тощо).
Налаштування Fava або інших інструментів: Fava — це веб-інтерфейс для Beancount, який полегшує перегляд звітів. Після фіксації запустіть fava ledger.beancount
, щоб переглянути фінансові звіти та порівняти їх з вашими звітами QuickBooks востаннє. Ви можете легше помітити невеликі відмінності в інтерфейсі (наприклад, рахунок, який повинен бути нульовим, але показує невеликий залишок, вказує на відсутній закриваючий запис або випадкову транзакцію).
Правила іменування та послідовність: Тепер у вас повний контроль, тому забезпечте послідовність:
- Всі рахунки повинні мати чіткі назви, що починаються з великих літер назв категорій (Assets, Liabilities тощо). Якщо якісь виглядають дивно (наприклад,
Assets:assets:SomeAccount
через розбіжність регістру з QuickBooks), перейменуйте їх у файлі рахунків та оновіть транзакції (швидкий пошук/заміна у файлі може це зробити, або використовуйтеbean-format
Beancount або мультикурсор редактора). - Символи товарів (коди валют) повинні бути послідовними. Для USD використовуйте
USD
скрізь (не$
абоUS$
). Для інших використовуйте стандартні коди (EUR, GBP, UAH тощо). Ця послідовність важлива для пошуку цін та звітів Beancount. - Видаліть будь-які тимчасові або фіктивні рахунки, які могли бути створені (наприклад, якщо ви використовували
Expenses:Miscellaneous
для невідомих рахунків у скрипті як універсальний варіант, спробуйте усунути їх, правильно зіставивши всі рахунки).
Закриття QuickBooks: На цьому етапі ви повинні мати паралельні книги в Beancount, які збігаються з QuickBooks. Деякі обирають вести обидві системи паралельно протягом короткого періоду, щоб переконатися, що нічого не було пропущено. Але якщо перевірка надійна, ви можете “закрити” книги QuickBooks:
- Якщо це корпоративне середовище, розгляньте експорт усіх вихідних документів QuickBooks (рахунки-фактури, рахунки, квитанції) для архівів, оскільки їх не буде в Beancount, якщо ви не прикріпите їх вручну.
- Зберігайте резервну копію даних QuickBooks (як файл компанії, так і експортовані файли).
- Надалі ведіть книгу Beancount як основну систему обліку.
Зафіксувавши дані в книзі Beancount, ви завершили процес міграції. Останній крок — провести аудит і продемонструвати узгодженість фінансової звітності, щоб переконати себе (і будь-яких зацікавлених сторін чи аудиторів), що міграція пройшла успішно.
Етап 5: Аудит після міграції та приклади
Щоб проілюструвати успіх міграції, підготуйте порівняння фінансової звітності до і після, а також, можливо, порівняння транзакцій. Це надасть докази того, що книги узгоджені.
5.1 Перевірка фінансової звітності
Створіть ключові фінансові звіти з QuickBooks та Beancount на ті самі дати та порівняйте їх:
-
Балансовий звіт на 31 грудня 2023 року: Порівняйте загальні суми Активів, Зобов'язань та Власного капіталу рядок за рядком. Вони повинні збігатися. Наприклад, якщо QuickBooks показував Загальні активи = 150,000 грн та Загальні зобов'язання + Власний капітал = 150,000 грн, балансовий звіт Beancount повинен показувати ті ж самі суми. Якщо ви структурували рахунки трохи інакше (скажімо, об'єднали деякі субрахунки), врахуйте це при порівнянні або розбийте до наступного рівня, щоб переконатися, що суми рівні.
-
Звіт про прибутки та збитки 2019–2023: Переконайтеся, що загальний Дохід, загальні Витрати та Чистий прибуток за кожен рік (або за весь діапазон) ідентичні. Невеликі відмінності можуть виникнути, якщо QuickBooks робив деякі округлення у звітах, але транзакції зазвичай несуть центи точно, тому чистий прибуток повинен бути точним. Якщо прибуток будь-якого року відрізняється, заглибтеся в дані цього року — це часто є індикатором відсутнього або дубльованого запису в цьому періоді.
-
Різниці в оборотному балансі: Якщо можливо, створіть таблицю, де ви перелічите кожен рахунок та залишок з QuickBooks проти Beancount. Оскільки ми очікуємо, що вони збігатимуться, це може бути стовпець з нульовою різницею. Це, по суті, перехресна перевірка оборотного балансу, яку ми обговорювали, але її запис допома гає задокументувати це.
5.2 Приклад порівняння (до та після)
Нижче наведено приклад фрагмента, що демонструє узгодженість даних. Припустимо, наш оборотний баланс QuickBooks на 31 грудня 2023 року був таким:
Рахунок | Баланс QuickBooks (31.12.2023) |
---|---|
Активи | |
Assets:Bank:Checking | 12,500.00 грн (дебет) |
Assets:Accounts Receivable | 3,200.00 грн (дебет) |
Зобов'язання | |
Liabilities:Credit Card | -1,200.00 грн (кредит) |
Liabilities:Loans Payable | -5,000.00 грн (кредит) |
Власний капітал | |
Equity:Opening-Balances | -7,500.00 грн (кредит) |
Equity:Retained Earnings | -2,000.00 грн (кредит) |
Equity:Current Year Profit | 0.00 грн |
У Beancount, після імпорту та проведення всіх транзакцій до 2023 року, звіт bean-report balances
(оборотний баланс) видає:
Рахунок | Баланс Beancount (31.12.2023) |
---|---|
Активи | |
Assets:Bank:Checking | 12,500.00 UAH (дебет) |
Assets:Accounts Receivable | 3,200.00 UAH (дебет) |
Зобов'язання | |
Liabilities:Credit Card | -1,200.00 UAH (кредит) |
Liabilities:Loans Payable | -5,000.00 UAH (кредит) |
Власний капітал | |
Equity:Opening-Balances | -7,500.00 UAH (кредит) |
Equity:Retained Earnings | -2,000.00 UAH (кредит) |
Equity:Profit (2019-2023) | 0.00 UAH |
(Примітка: розділи власного капіталу можуть бути структуровані по-різному; ключовим є збіг загальних сум. Тут "Прибуток (2019-2023)" у Beancount відіграє роль поточного річного прибутку/нерозподіленого прибутку разом, показуючи нуль, оскільки прибуток був закритий на Нерозподілений прибуток.)
Як показано, кожен рахунок збігається до копійки. Сума дебетів дорівнює сумі кредитів з обох сторін.
Крім того, якщо ми запустимо Звіт про прибутки та збитки за 2023 рік:
- QuickBooks: Дохід 50,000 грн, Витрати 48,000 грн, Чистий прибуток 2,000 грн.
- Beancount: Дохід 50,000 грн, Витрати 48,000 грн, Чистий прибуток 2,000 грн (який поті м був закритий на Нерозподілений прибуток або з'являється у розділі Власний капітал у балансовому звіті на кінець року).
Ви можете створити порівняння транзакцій, якщо потрібно, але оскільки дані QuickBooks не у форматі книги, ефективніше покладатися на звіти. Можна відсортувати як CSV з QuickBooks, так і транзакції Beancount за датою і порівняти ключові поля як фінальну перевірку (це можна зробити в Excel або за допомогою скрипта). Однак, враховуючи, що ми довіряємо нашій попередній перевірці, перевірка фінансової звітності зазвичай є достатньою.
5.3 Поради щодо аудиту
- Якщо аудитору або зацікавленій стороні потрібне запевнення, представте фінансову звітність до і після пліч-о-пліч. Прозорість Beancount може насправді спростити аудит, оскільки ви можете швидко відстежити кожне число зі звіту до вихідного запису (особливо використовуючи функцію деталізації Fava).
- Зберігайте резервну копію QuickBooks та експортовані CSV як частину ваш ого аудиторського сліду. Задокументуйте будь-які коригування, зроблені під час міграції (наприклад, “Перейменовано рахунок X на Y для послідовності” або “Розділено транзакцію Z на два записи для ясності”, якщо ви робили такі зміни).
- Надалі впроваджуйте регулярні перевірки в Beancount. Наприклад, щомісячна звірка банківських рахунків та асерція їхнього кінцевого залишку допомагає виявляти будь-які проблеми з даними або помилки в записах. Міграція дає хороший базовий рівень; підтримання дисципліни в новій системі забезпечить подальшу точність.
Нарешті, відсвяткуйте завершення міграції: ви успішно перенесли п'ять років бухгалтерських даних з QuickBooks до Beancount. Дані тепер у легкому, версіонованому текстовому форматі з повною цілісністю подвійного запису. Ви експортували дані, трансформували їх за допомогою скриптів Python, перевірили цілісність через оборотні баланси та звіти, і зафіксували їх у добре організованій книзі Beancount. Цей комплексний процес гарантує, що книга Beancount є точною, вірною копією ваших книг QuickBooks за п'ятирічний період, що налаштовує вас на спрощений облік у майбутнь ому.