Компания-клиент ушла, договор расторгнут, и вы хотите архивировать её в Odoo. Odoo отвечает сообщением об ошибке: «Вы не можете архивировать контакты, связанные с активным пользователем. Сначала архивируйте соответствующего пользователя.» Если у компании несколько доступов к порталу, это означает: найти каждого пользователя по отдельности, архивировать по отдельности, вернуться к компании, архивировать повторно.
Для этого мы написали небольшой модуль Архивирование компании вместе с пользователями портала (partner_archive_users) для Odoo 19. Вместо сообщения об ошибке появляется запрос подтверждения, и при ответе «Да» пользователи портала и компания архивируются за один шаг. Модуль доступен на GitHub как свободное программное обеспечение под лицензией AGPL-3:
github.com/Alex0176/odoo-partner-archive-users
Мы используем этот модуль в Biricon IT Services в нашей рабочей системе с 3 ноября 2026 г. Он новый, поэтому опыт его применения невелик. Тому, кто его применяет, стоит обратить внимание на разделы Область действия и Ограничения . Рекомендуем прочитать их до начала работы.
Проблема в стандартном Odoo
При архивировании контакта Odoo проверяет, связан ли с ним пользователь, и прерывает операцию, если да. Проверка имеет смысл, ведь каждому пользователю нужен контакт. Для внутренних пользователей, то есть сотрудников, блокировка также задумана намеренно. Но для пользователей портала клиентов это в первую очередь ручная работа. Для каждой компании-клиента с доступами к порталу, например для просмотра счетов и заявок, при архивировании требуется один и тот же порядок действий:
- найти пользователей компании и её контактных лиц,
- архивировать каждого по отдельности,
- вернуться к компании,
- архивировать компанию.
Решение: запрос подтверждения
Модуль расширяет путь Действие → Архивировать в контакте, как в форме, так и в списке. Если у выбранной компании или её контактных лиц есть активные пользователи портала, открывается диалог с вопросом «Действительно ли архивировать компанию? В системе ещё есть активные пользователи.» Ниже перечислены затронутые пользователи с именем, логином и контактом.
- Да, архивировать компанию и пользователей: сначала архивируются пользователи, затем компания.
- Отмена: ничего не меняется.
- Пользователей портала нет: Odoo ведёт себя как раньше, диалог не появляется.
Что архивируется, а что нет
Область действия намеренно ограничена:
- Только пользователи портала и публичные пользователи (
share = True). Внутренние пользователи этим путём никогда не архивируются. Если к контакту привязан доступ сотрудника, сообщение об ошибке Odoo сохраняется. Так никто не заблокирует сотрудника случайно, архивируя компанию. - Контактные лица остаются активными как контакты. Архивируются только их доступы к порталу. Это соответствует стандартному Odoo, который при архивировании компании также не затрагивает подчинённые контакты.
- Только путь архивирования через интерфейс. Прямой
write({'active': False}), например в импорте или скрипте, выполняется по-прежнему с проверкой Odoo.
Техническая реализация
В модуле нет новых полей в существующих моделях. Он состоит из расширения res.partner.action_archive и мастера (partner.archive.users.wizard), который появляется как диалог.
| Компонент | Задача |
|---|---|
action_archive в контакте | Ищет активных пользователей с share = True, связанных с контактом или (для компаний) с контактами компании. Если такие есть, вместо архивирования возвращается диалог. |
| Мастер | Сохраняет компанию и найденных пользователей, отображает их и при ответе «Да» выполняет архивирование с ключом контекста archive_linked_users. |
Контекст skip_archive_users_wizard | Отключает диалог. Тогда снова действует проверка Odoo. |
| Доступ | Мастер могут создавать и использовать внутренние пользователи (base.group_user). |
| Перевод | Немецкий перевод (de.po) и шаблон (.pot) прилагаются. |
Пользователи ищутся и архивируются с повышенными правами (sudo). Благодаря этому диалог работает и для пользователей без доступа к управлению пользователями. Обратная сторона описана в разделе Ограничения.
Находка: тест был зелёным, а диалог всё равно не работал
При первом применении в модуле обнаружилась ошибка, которую автоматические тесты не нашли. При первом нажатии на «Архивировать» в интерфейсе вместо диалога появился экран ошибки Odoo с сообщением Cannot read properties of undefined (reading 'map').
Причина: веб-клиент напрямую вызывает action_archive и выполняет возвращённое действие без дополнительной обработки. При этом он обязательно читает ключ views действия. У нашего действия был только view_mode. Действия из кнопок с type="object" сервер дополняет заранее (clean_action в call_button), прямой вызов action_archive — нет. Тесты вызывали метод только в Python, и там отсутствующее поле не бросалось в глаза.
Исправление — одна строка ("views": [(False, "form")]), к ней добавлена проверка в тесте, требующая именно этот ключ. При этом ничего не было архивировано. Вывод: тому, кто возвращает действие из метода, который клиент вызывает напрямую (action_archive, action_unarchive и подобные), следует всегда добавлять views.
Установка
git clone https://github.com/Alex0176/odoo-partner-archive-users.git
ln -s /путь/odoo-partner-archive-users/partner_archive_users /путь/addons/
odoo-bin -c odoo.conf -d <база_данных> -i partner_archive_users --stop-after-init
Зависимости — base и contacts. После установки службу Odoo необходимо перезапустить, потому что модуль содержит код Python. Тому, кто эксплуатирует рабочую систему, следует сначала установить модуль на копию базы данных.
Ограничения
- Права доступа. Поскольку пользователи архивируются с повышенными правами, каждый, кому разрешено архивировать контакт, может через диалог архивировать и доступы к порталу этой компании. На внутренних пользователей это не распространяется. Тому, кто хочет защитить доступы к порталу тоньше, нужно доработать модуль.
- Нет автоматического восстановления. Если компанию позже снова активируют, пользователи остаются архивированными. Их нужно реактивировать вручную.
- Только контакты. Модуль относится к компаниям как к контактам (
res.partner). У архивирования компании Odoo (res.company) другие проверки, например если она всё ещё является компанией по умолчанию у пользователей. Модуль для этого не предназначен. - Протестировано только на Odoo 19.0 Community. Для других версий мы его не проверяли.
Часто задаваемые вопросы
Почему сотрудники не архивируются вместе с компанией?
У внутреннего пользователя есть права в системе, и он, как правило, связан с собственными данными, задачами и полномочиями. Блокировать его как побочный эффект архивирования компании для нас слишком рискованно. Поэтому остаётся сообщение об ошибке Odoo.
Можно ли отключить запрос подтверждения?
В коде — через контекст skip_archive_users_wizard. Настройки в интерфейсе нет. Тот, кто удалит модуль, снова получит стандартное поведение Odoo.
Под какой лицензией он распространяется?
Под AGPL-3. Сообщения об ошибках и улучшения приветствуются в виде issue в репозитории GitHub .
Поддержка от Biricon IT Services
Мы обслуживаем установки Odoo для малых и средних предприятий: от внедрения через доработки и миграции до постоянной эксплуатации. Если вы хотите упростить в Odoo такие процессы, как архивирование компаний-клиентов, настроить портал для ваших клиентов или безопасно внедрить модуль в рабочий экземпляр, мы охотно поможем. Другие наши собственные разработки: Номера документов из префикса, года и счётчика, Firmenbuch и проверка адресов для австрийских клиентов и Наборы продуктов в коммерческом предложении как раздел.
По состоянию на 3 ноября 2026 г. Версия модуля 19.0.1.0.0 с исправлением того же дня. Все имена и логины на иллюстрациях выбраны произвольно.