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

Odoo 19: архивирование компании вместе с пользователями портала – модуль partner_archive_users с запросом подтверждения вместо сообщения об ошибке

3 ноября 2026 | Odoo 19 Community | Собственная разработка
3 ноября 2026 г. от
Odoo 19: архивирование компании вместе с пользователями портала – модуль partner_archive_users с запросом подтверждения вместо сообщения об ошибке

Модуль Odoo 19 partner_archive_users: запрос подтверждения при архивировании компании с пользователями портала

Компания-клиент ушла, договор расторгнут, и вы хотите архивировать её в Odoo. Odoo отвечает сообщением об ошибке: «Вы не можете архивировать контакты, связанные с активным пользователем. Сначала архивируйте соответствующего пользователя.» Если у компании несколько доступов к порталу, это означает: найти каждого пользователя по отдельности, архивировать по отдельности, вернуться к компании, архивировать повторно.

Для этого мы написали небольшой модуль Архивирование компании вместе с пользователями портала (partner_archive_users) для Odoo 19. Вместо сообщения об ошибке появляется запрос подтверждения, и при ответе «Да» пользователи портала и компания архивируются за один шаг. Модуль доступен на GitHub как свободное программное обеспечение под лицензией AGPL-3:

github.com/Alex0176/odoo-partner-archive-users

Мы используем этот модуль в Biricon IT Services в нашей рабочей системе с 3 ноября 2026 г. Он новый, поэтому опыт его применения невелик. Тому, кто его применяет, стоит обратить внимание на разделы Область действия и Ограничения . Рекомендуем прочитать их до начала работы.

Проблема в стандартном Odoo

При архивировании контакта Odoo проверяет, связан ли с ним пользователь, и прерывает операцию, если да. Проверка имеет смысл, ведь каждому пользователю нужен контакт. Для внутренних пользователей, то есть сотрудников, блокировка также задумана намеренно. Но для пользователей портала клиентов это в первую очередь ручная работа. Для каждой компании-клиента с доступами к порталу, например для просмотра счетов и заявок, при архивировании требуется один и тот же порядок действий:

  1. найти пользователей компании и её контактных лиц,
  2. архивировать каждого по отдельности,
  3. вернуться к компании,
  4. архивировать компанию.

Решение: запрос подтверждения

Модуль расширяет путь Действие → Архивировать в контакте, как в форме, так и в списке. Если у выбранной компании или её контактных лиц есть активные пользователи портала, открывается диалог с вопросом «Действительно ли архивировать компанию? В системе ещё есть активные пользователи.» Ниже перечислены затронутые пользователи с именем, логином и контактом.

Сравнение: сообщение об ошибке 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 с исправлением того же дня. Все имена и логины на иллюстрациях выбраны произвольно.