Введение
В Odoo модели — это схема того, как хранятся бизнес‑данные в базе. Любая запись: от заказа клиента до проводки по банку — представляет собой объект модели с набором полей и связей.
Понимание моделей важно и для бизнес‑консультантов, и для разработчиков: именно модели задают поля, связи между записями и встроенную логику, на которой держится вся система данных Odoo.
В этой статье мы подробно разберём одну из ключевых моделей в учёте Odoo — account.move.line. С ней сталкиваются и те, кто делает отчёты, и те, кто настраивает синхронизацию с внешними системами, и те, кто внедряет процедуру сверки.
Что такое модель account.move.line
Модель account.move.line описывает отдельные строки бухгалтерской проводки — каждую дебетовую или кредитовую запись внутри проводки. В сумме строки проводки должны сходиться: сумма дебетов равна сумме кредитов.
Эта модель принадлежит модулю Бухгалтерия и является «детской» по отношению к account.move, который хранит саму проводку (счёт‑фактуру, платёжное поручение, банковскую выписку). Одна проводка может содержать несколько строк.
Определение модели лежит в модуле account; другие модули дополняют её через наследование: продажи подставляют данные строк счёта, покупки — строки счёта поставщика, аналитика добавляет распределение затрат. Благодаря расширениям каждый модуль добавляет только свою функциональность, не переписывая ядро.
Ключевые поля модели
Ниже — главные поля account.move.line, которые важно знать, чтобы корректно работать с проводками, отчётностью и сверками.
1. name
Тип: Char. Короткое название или описание строки. Обычно показывается в формах и отчётах; в строках счёта берётся из наименования товара или дополнительного текста, если он задан.
2. move_id
Тип: Many2one (account.move). Ссылка на родительскую проводку. Каждая строка относится ровно к одной проводке — это ключевая связь в модели.
3. account_id
Тип: Many2one (account.account). Счёт бухгалтерского плана, на который проводится строка. Обязательное поле; нельзя указывать view‑счёт или закрытый счёт. По нему строятся отчёты и группировки.
4. debit
Тип: Float. Сумма дебета. По умолчанию 0.0. В строке задаётся либо debit, либо credit — не оба. Дебет увеличивает активы и расходы.
5. credit
Тип: Float. Сумма кредита. По умолчанию 0.0. Кредит увеличивает обязательства, капитал и выручку. В проводке сумма дебетов должна равняться сумме кредитов.
6. balance
Тип: Float. Вычисляемое поле: debit минус credit. Показывает чистое влияние строки — положительное для дебета, отрицательное для кредита. Часто используется в отчётах и при сверке.
7. partner_id
Тип: Many2one (res.partner). Контрагент — клиент, поставщик или другая сторона. Важен для учёта дебиторки/кредиторки, ageing‑отчётов и автоматической сверки.
8. date
Тип: Date. Дата проводки. Обычно наследуется от родителя. Влияет на периодизацию, закрытие периодов и отчётность по датам.
9. date_maturity
Тип: Date. Срок оплаты. Актуально для дебиторки и кредиторки; используется в ageing‑таблицах и планировании платежей.
10. currency_id
Тип: Many2one (res.currency). Валюта строки. Может отличаться от валюты компании — это важно для мультивалютных проводок.
11. amount_currency
Тип: Float. Сумма в заявленной валюте. В паре с currency_id позволяет вести учёт в иностранной валюте и правильно рассчитывать курсовые разницы.
12. quantity
Тип: Float. Количество, опционально. Применимо для товарных строк (счета, счета поставщика). Нужен для отчётов по количеству и расчёта цены за единицу.
13. product_id
Тип: Many2one (product.product). Товар или услуга, к которой привязана строка. Заполняется при переносе из заказа продажи/покупки или счёта‑фактуры.
14. product_uom_id
Тип: Many2one (uom.uom). Единица измерения для количества. Используется вместе с product_id для корректного отображения и конверсии.
15. price_unit
Тип: Float. Цена за единицу. В сочетании с quantity определяет сумму в товарных строках счёта или счёта поставщика.
16. tax_ids
Тип: Many2many (account.tax). Налоги, применённые к строке. При проводке Odoo генерирует отдельные налоговые строки по необходимости; поле важно для расчёта НДС и других налогов.
17. tax_line_id
Тип: Many2one (account.tax). Для налоговых строк указывает налог, породивший эту строку. Помогает отличать налоговые позиции от обычных счётов.
18. analytic_account_id
Тип: Many2one (account.analytic.account). Аналитический счёт для разнесения затрат и доходов. Используется при включённой аналитике для детальных отчётов по проектам или отделам.
19. analytic_distribution
Тип: Json или Text. Хранит распределение по нескольким аналитическим счётам. В новых версиях может заменять единичное поле analytic_account_id при использовании планов аналитики.
20. ref
Тип: Char. Внешняя ссылка или пометка, часто наследуется от родителя. Показывается в отчётах и служит маркером при подборе по выпискам.
21. narration
Тип: Text. Внутренний комментарий или заметка, обычно берётся из проводки. По умолчанию не печатается на документах для клиентов.
22. journal_id
Тип: Many2one (account.journal). Журнал родительской проводки. Необходим для фильтрации и отчетности по журналам.
23. company_id
Тип: Many2one (res.company). Компания в мультикомпании: каждая строка принадлежит одной компании — это влияет на видимость записей и консолидацию.
24. reconciled
Тип: Boolean. Флаг, указывающий, свернута ли строка. Полезен для отображения только несверенных позиций в интерфейсе сверки.
25. full_reconcile_id
Тип: Many2one (account.full.reconcile). Связывает вместе все строки, объединённые в одну полную сверку. Помогает отследить группу проводок, свернутых одним действием.
26. payment_id
Тип: Many2one (account.payment). Для платёжных строк — ссылка на платёж. Используется при связывании счёта с оплатой.
27. statement_id
Тип: Many2one (account.bank.statement). Для строк банковской выписки — ссылка на выписку целиком. Применяется при банковской сверке.
28. statement_line_id
Тип: Many2one (account.bank.statement.line). Ссылка на конкретную строку банковской выписки. Нужна для сопоставления проводок с транзакциями банка.
29. display_type
Тип: Selection. Может принимать значения вроде 'line_section' или 'line_note' — используется для заголовков и примечаний в проводке; такие строки не содержат дебета/кредита, служат только для визуального оформления.
30. create_date
Тип: Datetime. Дата и время создания записи. Управляется автоматически и полезна для аудита.
31. write_date
Тип: Datetime. Дата последнего изменения записи. Тоже заполняется системой и помогает отслеживать историю правок.
Как модель используется в бизнес‑процессах
1. Выставление счёта клиенту
При подтверждении счёта Odoo создаёт строки account.move.line: доходная строка идёт на счёт выручки, дебиторская — на счёт клиента, а отдельные налоговые строки формируются для каждого налога. partner_id связывает строку с клиентом для ageing и сверки.
2. Счета поставщиков
Счета от поставщиков создают строки по расходам, входному НДС и кредиторской задолженности. По структуре это зеркальная картина клиентских счетов, но с другими типами счетов и знаками сумм.
3. Банковская сверка
Строки банковской выписки сопоставляются со строками проводок через statement_line_id. В результате сверки Odoo связывает записи, проставляет full_reconcile_id и ставит reconciled = True для сверенных позиций.
4. Ручные проводки
Пользователи могут вручную создавать проводки с несколькими строками: у каждой строки есть счёт, дебет или кредит и опционально партнёр. При публикации система проверяет баланс — сумма дебетов должна равняться сумме кредитов.
5. Аналитическая отчётность и контроль затрат
Когда включена аналитическая бухгалтерия, строки несут analytic_account_id или распределение analytic_distribution. Отчёты группируют данные по аналитическим направлениям — проекты, подразделения, центры затрат.
Как разработчики расширяют эту модель
Разработчики расширяют account.move.line разными способами, а ключевой инструмент для этого — наследование моделей в Odoo.
Наследование модели
В модуле указывают _inherit = 'account.move.line', чтобы добавить поля или переопределить методы. Изменения делаются в отдельном модуле, что упрощает обновления и поддержку при апгрейдах системы.
Добавление полей
В наследуемой модели объявляют новые поля нужного типа: Char, Many2one, Boolean, Integer, Text, Selection и т.д. Для мультикомпаний учитывайте company_dependent; будьте внимательны с вычисляемыми полями и правильно указывайте зависимости.
Расширения на Python
Переопределяйте методы create, write, unlink для внедрения логики — не забывайте вызывать super(), чтобы не нарушить базовую работу. В обработчиках важно не ломать инвариант равенства дебетов и кредитов и учитывать интеграции через API.
Odoo Studio
Odoo Studio позволяет быстро добавить пользовательские поля в account.move.line без кода — удобно для простых меток или тегов. Для серьёзной логики, правил сверки или интеграций предпочтительнее собственный модуль.
Рекомендации по использованию
- Практические правила: не создавайте и не меняйте строки напрямую в базе — используйте API проводки (например, line_ids), чтобы Odoo выполнил все проверки и поддерживал целостность данных.
- При подготовке отчётов фильтруйте строки по move_id.state = 'posted', чтобы исключить черновики и отменённые проводки.
- Указывайте account_id с правильным типом счёта (receivable, payable и т.д.), чтобы корректно работали ageing‑отчёты и автоматическая сверка.
- При интеграции через API сначала создавайте саму проводку, затем — её строки, и убедитесь, что до публикации сумма дебетов равна сумме кредитов.
- Для собственных полей применяйте префикс x_ или префикс модуля, чтобы избежать коллизий с будущими релизами Odoo.
Типичные ошибки
- Не устанавливайте одновременно значения debit и credit в одной строке — это ломает логику учёта; каждая строка должна быть либо дебетовой, либо кредитовой.
- Не создавайте незамбалансированные проводки — Odoo валидирует равенство дебетов и кредитов при проводке.
- Не изменяйте проведённые записи напрямую: корректировки делайте через сторнирование или новые корреспондирующие проводки, иначе вы потеряете аудит и нарушите отчётность.
- Не забывайте проставлять partner_id в строках дебиторки и кредиторки — без этого ломаются ageing‑таблицы и автоматическая сверка по контрагентам.
- Не переопределяйте ключевые методы без вызова super() — это может повредить сверке, блокировкам и работе других модулей.
Заключение
Модель account.move.line — это сердцевина бухгалтерии в Odoo: она хранит каждую дебетовую и кредитовую позицию, возникающую при выставлении счетов, проведении оплат и банковских выписок. Знание её полей и расширений помогает правильно настраивать систему, писать интеграции и формировать отчёты.
Независимо от роли — вы функционал‑консультант, формирующий учётные процессы, или разработчик, создающий отчёты и интеграции — хорошее понимание account.move.line экономит время и снижает риск ошибок.
Нужна помощь с внедрением Odoo?
Dasolo помогает компаниям внедрять, настраивать и оптимизировать Odoo. Мы специализируемся на интеграциях через API и разработке модулей, глубоко понимая архитектуру данных и модели вроде account.move.line.
Если вам нужна помощь с внедрением Odoo, созданием кастомных модулей или интеграцией — мы готовы помочь. Записаться на демонстрацию чтобы обсудить ваш проект.