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

Поле Selection в Odoo: Полное Руководство для Разработчиков

Полный справочник по полю Selection в модели данных Odoo: от практического применения до тонкостей доработки
6 марта 2026 г. от
Поле Selection в Odoo: Полное Руководство для Разработчиков
Dasolo
| Комментариев пока нет

Введение


Каждый раз, когда менеджер ставит приоритет для лида, покупатель выбирает способ оплаты или администратор отмечает товар как активный или архивный — чаще всего это происходит через поле Selection в Odoo. Это универсальный тип поля, который упрощает работу с данными и служит основой для многих бизнес‑правил в системе.


В отличие от поля с произвольным текстом, Selection ограничивает ввод набором заранее заданных вариантов. Такое ограничение — не баг, а фича: оно гарантирует однообразие записей, облегчает фильтрацию и отчётность, и предотвращает ошибки от опечаток или разнотипных формулировок, которые со временем ломают агрегаты и панели мониторинга.


В этой статье вы найдёте всё необходимое: что именно хранит поле, как оно выглядит в интерфейсе, как создать и настроить его через Odoo Studio, кодом в модуле на Python или через XML‑RPC. Мы также собрали практические примеры из реальных бизнес‑процессов и перечислили распространённые ошибки, которых стоит избегать.

Что такое поле Selection в Odoo


Внутри ORM Odoo поле Selection хранит строку — ключ одного из фиксированных вариантов. Каждый вариант задаётся парой ключ‑метка: ключ сохраняется в базе, а метка показывается пользователю в интерфейсе.


Например, поле приоритета может иметь набор опций, описывающий уровни важности.

priority = fields.Selection([
    ('0', 'Normal'),
    ('1', 'Low'),
    ('2', 'High'),
    ('3', 'Very High'),
], string='Priority', default='0')

Здесь '0', '1', '2', '3' — это ключи, которые попадают в таблицу. Пользователь видит метки Normal, Low, High, Very High. Это разделение важно: метки можно менять ради удобства пользователей, не затрагивая уже сохранённые данные — если вы не меняете ключи.


В интерфейсе поле Selection в формах выводится как выпадающий список; в списках и канбан‑карточках показывается читаемая метка. С виджетом badge варианты отображаются цветными бирками — удобно для быстрого просмотра большого списка записей.


В Odoo Studio тип поля называется Selection. При создании через Studio техническое имя получает префикс x_studio_. Если поле создаётся в коде или через API, вы сами выбираете его техническое имя.

Принцип работы поля


На уровне базы данных такие поля сохраняются в PostgreSQL как колонка VARCHAR. В таблице хранится только ключ, а не метка — это важный момент при составлении доменов и серверных действий: фильтруйте по ключу, а не по отображаемой строке.


Например, чтобы найти лиды с высоким приоритетом, домен будет [('priority', '=', '2')], а не [('priority', '=', 'High')].

Ключевые атрибуты поля

Ниже — главные параметры, которые нужно знать при работе с полем Selection в Odoo:

  • selection: Список кортежей (key, label), задающий доступные варианты. Вместо статического списка можно передать имя метода (строку), который вернёт такой список динамически.
  • default: Ключ варианта, используемый по умолчанию. Если не указан — поле изначально пустое.
  • required: Принуждает пользователя выбрать вариант перед сохранением. В сочетании с default часто применяется для статусных полей.
  • selection_add: Позволяет при наследовании модуля добавить новые варианты к существующему полю, не перезаписывая весь список. Это правильный способ расширять встроенные поля.
  • ondelete: В паре с selection_add описывает, что произойдёт с записями, если опция удалена при деинсталляции модуля.

Статические и динамические списки вариантов

По умолчанию варианты задаются прямо в определении поля. Но можно указать имя метода в параметре selection — Odoo вызовет его во время выполнения и построит список. Это удобно, когда набор зависит от пользователя, компании или контекста.


contract_type = fields.Selection(
    selection='_get_contract_types',
    string='Contract Type'
)

def _get_contract_types(self):
    if self.env.user.has_group('hr.group_hr_manager'):
        return [('permanent', 'Permanent'), ('fixed', 'Fixed Term'), ('interim', 'Interim')]
    return [('permanent', 'Permanent'), ('fixed', 'Fixed Term')]

Отображение в представлениях

В форме Selection выглядит как обычный выпадающий список. Для списка и канбана полезно ставить widget="badge", чтобы превратить значение в цветную метку. Если вариантов немного и их хочется видеть сразу — используйте widget="radio", чтобы вывести их как ряд радиокнопок.


Взаимодействие с ORM Odoo

Чтение и запись поля через ORM просты: вы присваиваете ключ, а фреймворк сам отображает метку в интерфейсе. При получении описания поля через XML‑RPC (fields_get) атрибут selection вернёт полный список пар [key, label], что удобно для построения отображения в сторонних системах.


Сценарии применения в бизнесе


Поле Selection встречается почти во всех модулях Odoo. Ниже — пять реальных примеров использования в бизнес‑процессах.


CRM: приоритет лида и тип этапа воронки

Поле приоритета в CRM — классический пример Selection: четыре уровня важности помогают коммерческой команде сфокусироваться на ключевых лидах. Приоритет влияет на цветовую маркировку в канбане и может запускать автоматические задачи при эскалации. Выверенная статистика по приоритетам — одно из первых улучшений качества данных после запуска CRM.


Продажи: условия оплаты и политика выставления счетов

Поле invoice_policy для товара управляет, по отгрузке или по заказу выставлять счета — от этого зависит весь механизм выставления и учёта. Аналогично, в подписках поле, определяющее режим выставления счетов (предоплата/постоплата), влияет на биллинговые сценарии и финансовую логику.


Склад: статусы качества товара и партий

В производстве и контроле качества Selection‑поля отслеживают состояния партий, серий и заказов на ремонт. Поле статуса ремонта проходит через значения draft, confirmed, under repair, ready и done — каждое изменение может запускать письма, перемещения на складе или бухгалтерские проводки. По сути, поле действует как узловой контрольный пункт для всего процесса.


Бухгалтерия: метод оплаты и тип журнала

Тип журнала в учёте — Selection, который разграничивает продажи, закупки, кассу и банк. На его основе Odoo выбирает логику проводок, доступные счета и ограничивает операции по нужным журналам. Это пример поля, которое управляет бизнес‑правилами, а не просто помечает запись.


HR: тип занятости и статус контракта

В HR Selection‑поля используются для типов трудовых отношений, статусов контрактов и заявок на отпуск. Статус контракта, например, меняется от new до open, expired или cancelled; автоматизации могут напомнить HR‑менеджеру за месяц до окончания, запустить чек‑лист при найме и скорректировать правила расчёта зарплаты в зависимости от типа занятости.

Как создать или изменить поле Selection


Три способа добавить поле Selection


Добавление через Odoo Studio (без кода)

Odoo Studio — это низкокодовый инструмент для быстрого добавления полей без Python. Чтобы создать Selection через Studio:

  1. Откройте Odoo Studio из главного меню.
  2. Перейдите на форму, где хотите добавить поле.
  3. Перетащите поле Selection из панели справа на форму.
  4. В свойствах поля добавьте варианты, указав метки для каждого.
  5. При необходимости задайте значение по умолчанию и пометьте поле как обязательное.
  6. Сохраните и закройте Studio.

Studio создаёт ключи автоматически и даёт полю имя с префиксом x_studio_. Это самый быстрый способ прототипирования в ходе бизнес‑сессии с клиентом.


Через Python в пользовательском модуле

Разработчики определяют Selection‑поля в файлах моделей на Python. Такой подход обязателен, если вы хотите версионировать изменения и разворачивать их в нескольких средах:

from odoo import fields, models

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    x_delivery_slot = fields.Selection([
        ('morning', 'Morning (8h - 12h)'),
        ('afternoon', 'Afternoon (13h - 17h)'),
        ('evening', 'Evening (18h - 20h)'),
    ], string='Delivery Slot', default='morning')

После определения поля его добавляют в XML‑представление, чтобы оно отображалось в интерфейсе. База данных и колонка создаются автоматически при установке или обновлении модуля.


При расширении встроенного поля добавляйте варианты через selection_add, а не полностью переопределяйте поле:

class SaleOrder(models.Model):
    _inherit = 'sale.order'

    state = fields.Selection(
        selection_add=[('custom_approval', 'Pending Approval')],
        ondelete={'custom_approval': 'set default'}
    )

Через XML‑RPC API

Если вы автоматизируете конфигурацию или управляете полями удалённо (например, в конвейере деплоя), поле Selection можно создать через XML‑RPC API:

field_id = models.execute_kw(
    ODOO_DB, uid, ODOO_API_KEY,
    'ir.model.fields', 'create',
    [{
        'name': 'x_contract_category',
        'field_description': 'Contract Category',
        'model_id': model_id,
        'ttype': 'selection',
        'selection': "[('standard', 'Standard'), ('premium', 'Premium'), ('custom', 'Custom')]",
        'state': 'manual',
    }]
)

Через API значение selection передаётся как строка‑представление списка Python. Параметр state: 'manual' отмечает, что поле создано вручную (как через Studio или API) — это корректная настройка для таких полей. Многие консалтинговые команды используют этот способ для скриптовой конфигурации клиентов.


Рекомендации по использованию


1. Используйте информативные и стабильные ключи

Ключ хранится в базе и применяется в доменах, автоматизациях и серверной логике. Выбирайте понятные ключи, которые не придётся менять: короткие строчные строки типа 'draft', 'confirmed', 'cancelled'. Избегайте цифровых ключей, если только порядок действительно не важен — числа затрудняют чтение кода позже.


2. Держите список небольшим и исчерпывающим

Если вариантов больше 8–10, это часто знак, что Selection пытается заменить справочник. В таких случаях разумнее сделать Many2one к модели настроек — тогда пользователи смогут управлять наборами вариантов через интерфейс без вмешательства разработчика.


3. Всегда задавайте дефолт для обязательных полей

Если поле обязательное — укажите корректный default. Это избавит от ошибок при создании записей программно, при импорте или через API, где нет живого пользователя для выбора. Значение по умолчанию должно отражать наиболее частый или наименее фиктивный состояние процесса.


4. Для расширения встроенных полей используйте selection_add

При добавлении вариантов к стандартному полю применяйте selection_add, а не полное переопределение. Это безопаснее и совместимее с другими модулями. Не забывайте указывать ondelete для корректной обработки деинсталляции.


5. Используйте badge‑виджет для видимости в списках

В списках и канбанах текстовое отображение малоинформативно. Добавление widget="badge" превращает значения в цветные метки — так статусы легче сканировать в больших таблицах. Особенно полезно для полей‑статусов, требующих быстрого внимания.


Типичные ошибки и подводные камни


Изменение ключа ломает данные

Метка варианта меняется безопасно, потому что в базе хранится ключ. Но сам ключ нельзя менять, если записи с ним уже существуют: после переименования ключа старые записи будут показывать пустое или некорректное значение, а фильтры и автоматизации перестанут работать. Если нужно сменить ключ — заранее выполните миграцию данных по всему объёму записей.


Удаление опции оставляет «сиротские» записи

Если убрать вариант из списка, но в базе остались записи с таким ключом, они покажут сломанное значение. Перед удалением убедитесь, что таких записей нет — либо переведите их на другой валидный вариант, либо архивируйте. Эта проблема часто возникает при чистке данных, когда изначально список вариантов был недостаточно продуман.


Фильтрация по метке вместо ключа

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


Использование Selection там, где нужен Many2one

Если список часто меняется, пользователи должны уметь управлять опциями самостоятельно или вариантам нужны дополнительные поля (цвет, порядок, связанный счёт) — лучше сделать Many2one на конфигурационную модель. Selection хорош для стабильных, управляемых разработчиком списков; для динамики и расширяемости — выбирайте Many2one.


Неучёт пустого значения в серверной логике

Необязательное Selection‑поле может быть False, если вариант не выбран. Если в коде вы сразу сравниваете поле со строкой, не проверив на False, получите некорректное поведение или ошибку. Всегда обрабатывайте пустой случай в серверных действиях и вычисляемых полях, зависящих от Selection.

Заключение


Поле Selection кажется простым, но имеет важные нюансы. Понимание разницы между ключом и меткой, умение расширять поле безопасно через selection_add, и чувство, когда заменить Selection на Many2one — отличают продуманную внедрённую систему Odoo от той, что создаст проблемы через год.


Будь то добавление типа контракта в Studio, поле слота доставки в кастомном модуле на Python или статус качества через API — описанные шаблоны помогут принять правильное решение для конкретной задачи.

В модели данных Odoo поле Selection — один из ключевых инструментов поддержания качества данных в источнике. При разумном применении оно сохраняет записи аккуратными, отчёты — корректными, а автоматизации — предсказуемыми.

В компании Dasolo мы помогаем организациям внедрять, кастомизировать и оптимизировать Odoo по всему бизнес‑процессу. Если вам нужно спроектировать понятную модель данных, добавить кастомные поля или разработать модуль с нуля — наша команда готова помочь. Свяжитесь с нами и обсудим ваш Odoo‑проект.

Поле Selection в Odoo: Полное Руководство для Разработчиков
Dasolo 6 марта 2026 г.
Поделиться этой записью
Войти оставить комментарий