Перейти к содержимому

Консолидация Odoo 8 и Odoo 10 в единую базу Odoo 17: контрагенты, товары, заказы, счета

Почему ETL-перенос данных оказался надёжнее девяти последовательных миграций через каждую версию
30 июня 2026 г. от
Консолидация Odoo 8 и Odoo 10 в единую базу Odoo 17: контрагенты, товары, заказы, счета

Консолидация данных из Odoo 8 (история 2014-2018) и Odoo 10 (текущий прод) в единую базу Odoo 17

У клиента параллельно жили две рабочие системы: старая Odoo 8 с историей 2014–2018 годов и текущий продакшн на Odoo 10. Задача — свести всё в одну актуальную Odoo 17, не потеряв ни контрагентов, ни номенклатуру, ни историю заказов и счетов.

Почему не пошаговый апгрейд

Формальный путь обновления Odoo — цепочка последовательных миграций через каждую промежуточную версию (8 → 9 → … → 17), и любое звено в этой цепочке может сломаться. При этом на каждой версии висело около 200 кастомных и сторонних модулей, которые пришлось бы тащить через весь путь и чинить на каждом шаге. Вместо этого выбрали перенос данных напрямую: чистая Odoo 17 плюс два независимых потока данных — Odoo 10 как основной источник (текущий прод) и Odoo 8 только для истории до 2019 года, которой в десятке уже не было.

Как перенос гарантированно не дублирует записи

Каждая перенесённая запись получает технический внешний идентификатор, построенный из источника и исходного ID (например, «этот контрагент — из v10, запись №12345»). Если скрипт переноса упал на середине и его запустили заново, он не создаёт дубликаты — по такому идентификатору Odoo понимает, что запись уже перенесена, и просто обновляет её. Это ключевое свойство для миграции такого объёма: без него любой сбой посреди прогона означал бы разбор дублей вручную.

Что перенеслось из Odoo 10 (текущий прод)

  • контрагенты — около 33 800 записей, с сохранением иерархии (компании и их контактные лица);
  • полная номенклатура товаров — категории, единицы измерения, себестоимость, вес и объём, атрибуты и варианты;
  • 232 прайс-листа и более 2200 позиций в них;
  • заказы на продажу — 31 984 из 31 984 (100%), заказы на закупку — 2 315 из 2 315 (100%);
  • счета — 21 162 созданы, пропущен всего один (без контрагента и без строк), ошибок — ноль.

После переноса суммы по каждому документу сверялись с оригиналом и совпадали с точностью до долей процента — небольшие расхождения объясняются тем, что Odoo 17 пересчитывает НДС на уровне строки заново, а не переносит готовую сумму как есть.

Что добавилось из Odoo 8 (история до 2019 года)

Для более старых данных, которых в Odoo 10 никогда не было, отдельным проходом подмешали архив из Odoo 8: 12 523 контрагента (часть — новые исторические записи, часть сопоставлена с уже перенесёнными из v10 по нормализованному имени, поскольку ИНН в старой системе почти нигде не был заполнен), 1 944 товара, 9 698 заказов на продажу и 8 390 счетов — тоже без единой ошибки. Отдельно всплыла деталь: в Odoo 8 ставка НДС была 18%, а не привычные 20% — под неё завели отдельные налоговые ставки, чтобы суммы старых документов остались такими же, как в оригинале, а не пересчитались задним числом по новой ставке.

Осторожность на каждом шаге

Счета переносились в статусе «черновик» — сознательно: перевод в проведённое состояние требует дополнительных проверок (нумерация, закрытые периоды) и был вынесен в отдельный, контролируемый шаг уже после полной сверки данных. Точно так же весь перенос сначала прогонялся на песочнице и только после проверки количества записей и сумм — переносится в рабочую базу.

Итог

Обе системы — многолетний прод на Odoo 10 и архив Odoo 8 — сведены в единую базу на Odoo 17 без единой ошибки на десятки тысяч перенесённых документов. Именно эта база стала фундаментом, на который позже легли перенесённые кастомные модули — в частности, телефония CRM, о которой мы уже писали.

Восемь контейнеров, один флаг: почему restart: unless-stopped — не мелочь
Приводим политику перезапуска Docker-контейнеров к единому стандарту ради надёжности инфраструктуры

Похожая задача в вашей компании?

Напишите намСмотреть услуги