Создать пользовательское поле для предложений crm.quote.userfield.add

Выберите инструмент для разработки с AI-агентом:

  • используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
  • используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации

Scope: crm

Кто может выполнять метод: пользователь с правом «Разрешить изменять настройки» в CRM

DEPRECATED

Развитие метода остановлено. Используйте метод REST 3.0 crm.quote.field.custom.add. Поля типов «Список» enumeration и «Файл» file метод REST 3.0 не создает, для них используйте этот метод.

Метод crm.quote.userfield.add создает пользовательское поле во всех предложениях Битрикс24 и возвращает его идентификатор. Тип USER_TYPE_ID, код FIELD_NAME и множественность MULTIPLE после создания изменить нельзя.

В REST 3.0 поле создает метод crm.quote.field.custom.add.

Параметры метода

Обязательные параметры отмечены *

Название
тип

Описание

fields*
object

Объект формата:

{
    field_1: value_1,
    field_2: value_2,
    ...,
    field_n: value_n,
}
  • field_n — название поля
  • value_n — значение поля

Список доступных полей описан ниже.

Некорректное поле в fields будет проигнорировано

Параметр fields

Обязательные параметры отмечены *

Название
тип

Описание

USER_TYPE_ID*
string

Тип данных пользовательского поля. Список типов, доступных в Битрикс24, возвращает метод crm.userfield.types. Возможные значения:

  • string — строка
  • integer — целое число
  • double — число
  • boolean — да/нет
  • datetime — дата/время
  • date — дата
  • money — деньги
  • url — ссылка
  • address — адрес
  • enumeration — список
  • file — файл
  • employee — привязка к сотруднику
  • crm_status — привязка к справочнику CRM
  • iblock_section — привязка к разделам информационных блоков
  • iblock_element — привязка к элементам информационных блоков
  • crm — привязка к элементам CRM
  • пользовательские типы полей

FIELD_NAME*
string

Код поля, уникальный среди полей предложений. Из кода Битрикс24 собирает полное имя с префиксом UF_CRM_:

  • MANAGER_NOTE превращается в UF_CRM_MANAGER_NOTE
  • UF_MANAGER_NOTE превращается в UF_CRM_MANAGER_NOTE — префикс UF_ заменяется на UF_CRM_
  • UF_CRM_MANAGER_NOTE остается без изменений

Значение поля записывают и читают универсальные методы crm.item.update и crm.item.get с entityTypeId = 7. В них имя поля пишется в camelCase: UF_CRM_MANAGER_NOTE превращается в ufCrmManagerNote. Методы crm.quote.update и crm.quote.get работают с полным именем, но их развитие остановлено.

Полное имя — до 50 символов вместе с префиксом, то есть код без префикса — до 43 символов. Если код длиннее, метод вернет ошибку ERROR_CORE.

В коде допустимы A-Z, 0-9 и _. Строчные буквы метод переведет в заглавные, на остальные символы вернет ошибку ERROR_CORE

LABEL
string

Название поля. Если LIST_FILTER_LABEL, LIST_COLUMN_LABEL, EDIT_FORM_LABEL, ERROR_MESSAGE или HELP_MESSAGE не переданы, метод запишет в них LABEL.

Если LABEL не передан, вместо него используется полное имя поля, например UF_CRM_MANAGER_NOTE

XML_ID
string

Внешний код

LIST_FILTER_LABEL
string|lang_map

Подпись фильтра в списке.

Что запишет метод:

  • строка — одна подпись для всех языков
  • lang_map — подписи на переданных языках, на остальных — значение LABEL
  • параметр не передан — значение LABEL на всех языках

LIST_COLUMN_LABEL
string|lang_map

Заголовок в списке.

Что запишет метод:

  • строка — одна подпись для всех языков
  • lang_map — подписи на переданных языках, на остальных — значение LABEL
  • параметр не передан — значение LABEL на всех языках

EDIT_FORM_LABEL
string|lang_map

Подпись в форме редактирования.

Что запишет метод:

  • строка — одна подпись для всех языков
  • lang_map — подписи на переданных языках, на остальных — значение LABEL
  • параметр не передан — значение LABEL на всех языках

ERROR_MESSAGE
string|lang_map

Сообщение об ошибке. Строка и lang_map обрабатываются так же, как у LIST_FILTER_LABEL

HELP_MESSAGE
string|lang_map

Помощь. Строка и lang_map обрабатываются так же, как у LIST_FILTER_LABEL

MULTIPLE
char

Множественное ли поле — хранит ли оно несколько значений. Возможные значения:

  • Y — да
  • N — нет

Поля типа boolean не могут быть множественными: если передать MULTIPLE = Y, метод без ошибки сохранит N.

По умолчанию N

MANDATORY
char

Является ли поле обязательным. Возможные значения:

  • Y — да
  • N — нет

По умолчанию N

SHOW_FILTER
char

Показывать ли поле в фильтре. Возможные значения:

  • Y — да
  • N — нет

По умолчанию N.

Вместо Y метод сохранит режим фильтра — его вернут crm.quote.userfield.get и crm.quote.userfield.list:

SETTINGS
object

Дополнительные параметры поля. Набор настроек зависит от типа поля USER_TYPE_ID, описание ниже

LIST
uf_enum_element[]

Список возможных значений для пользовательского поля типа enumeration, описание ниже

По умолчанию []

SORT
integer

Индекс сортировки. Обязательно больше нуля.

По умолчанию 100

SHOW_IN_LIST
char

Показывать ли поле в списке.

В CRM параметр не используется.

Возможные значения:

  • Y — да
  • N — нет

По умолчанию Y

EDIT_IN_LIST
char

Разрешать ли редактирование пользователем. Возможные значения:

  • Y — да
  • N — нет

По умолчанию Y. Значение N поддерживают не все типы полей в рамках crm

IS_SEARCHABLE
char

Участвуют ли значения поля в поиске.

В CRM параметр не используется.

Возможные значения:

  • Y — да
  • N — нет

По умолчанию N

Параметр SETTINGS

Набор настроек зависит от типа поля. Метод сохраняет только настройки из вкладок ниже, остальные ключи SETTINGS пропускает. Для типов money, url, address, file, employee и пользовательских типов метод не учитывает SETTINGS вовсе, и поле получает настройки типа по умолчанию.

Метод crm.quote.userfield.get возвращает сохраненные настройки поля, метод crm.userfield.settings.fields — перечень настроек типа. Передать в SETTINGS можно только настройки из вкладок ниже.

Название
тип

Описание

DEFAULT_VALUE
string

Значение по умолчанию.

По умолчанию ''

ROWS
integer

Количество строк в поле ввода. Обязательно больше нуля.

По умолчанию 1

Название
тип

Описание

DEFAULT_VALUE
integer

Значение по умолчанию

Название
тип

Описание

DEFAULT_VALUE
double

Значение по умолчанию

PRECISION
integer

Точность числа. Обязательно больше или равно 0.

По умолчанию 0

Название
тип

Описание

DEFAULT_VALUE
integer

Значение по умолчанию: 1 — да, 0 — нет. Число от 1 и больше метод сохранит как 1, от 0 и меньше — как 0.

По умолчанию 0

DISPLAY
string

Внешний вид. Возможные значения:

  • CHECKBOX — флажок
  • RADIO — радиокнопки
  • DROPDOWN — выпадающий список

По умолчанию CHECKBOX

Название
тип

Описание

DEFAULT_VALUE
object

Значение по умолчанию.
Объект формата:

{
    VALUE: datetime|date,
    TYPE: 'NONE'|'NOW'|'FIXED',
}

где:

  • VALUE — значение по умолчанию типа datetime или date в формате ISO 8601, например 2026-10-28T10:00:00+03:00
  • TYPE — тип значения по умолчанию:
    • NONE — не выставлять значение по умолчанию
    • NOW — использовать текущее время/дату
    • FIXED — использовать время/дату из VALUE

Значение по умолчанию:

{
    VALUE: '',
    TYPE: 'NONE',
}

Название
тип

Описание

DISPLAY
string

Внешний вид. Возможные значения:

  • LIST — список
  • UI — набираемый список
  • CHECKBOX — флажки
  • DIALOG — диалог выбора элементов

По умолчанию LIST

LIST_HEIGHT
integer

Высота списка. Обязательно больше нуля.

Доступен только при DISPLAY = LIST или DISPLAY = UI.

По умолчанию 1

Название
тип

Описание

IBLOCK_TYPE_ID
string

Идентификатор типа информационного блока.

По умолчанию ''

IBLOCK_ID
string

Идентификатор информационного блока.

По умолчанию 0

DEFAULT_VALUE
string

Значение по умолчанию.

По умолчанию ''

DISPLAY
string

Внешний вид. Возможные значения:

  • DIALOG — диалог
  • UI — набираемый список
  • LIST — список
  • CHECKBOX — флажки

По умолчанию LIST

LIST_HEIGHT
integer

Высота списка. Обязательно больше нуля.

По умолчанию 1

ACTIVE_FILTER
char

Показывать ли элементы с включенным флагом активности. Возможные значения:

  • Y — да
  • N — нет

По умолчанию N

Название
тип

Описание

ENTITY_TYPE
string

Идентификатор типа справочника.

Используйте crm.status.entity.types, чтобы узнать возможные значения.

По умолчанию ''

Если все привязки выключены, Битрикс24 включит привязку к лидам LEAD = Y.

Название
тип

Описание

LEAD
char

Включена ли привязка к лидам. Возможные значения:

  • Y — да
  • N — нет

По умолчанию N

CONTACT
char

Включена ли привязка к контактам. Возможные значения:

  • Y — да
  • N — нет

По умолчанию N

COMPANY
char

Включена ли привязка к компаниям. Возможные значения:

  • Y — да
  • N — нет

По умолчанию N

DEAL
char

Включена ли привязка к сделкам. Возможные значения:

  • Y — да
  • N — нет

По умолчанию N

Параметр LIST

Важно

Если элементы LIST не сохранились, например из-за повторяющегося XML_ID, метод ответит ошибкой, но поле уже будет создано — без элементов списка. Перед повторным вызовом найдите поле методом crm.quote.userfield.list и добавьте элементы методом crm.quote.userfield.update или удалите поле.

Название
тип

Описание

VALUE
string

Значение элемента списка.

Элементы списка с пустым или отсутствующим VALUE будут проигнорированы

SORT
integer

Индекс сортировки. Значение 0 и меньше не сохраняется, вместо него элемент получает 500.

По умолчанию 500

DEF
char

Является ли элемент списка значением по умолчанию. Возможные значения:

  • Y — да
  • N — нет

У множественного поля значений по умолчанию может быть несколько. У поля с MULTIPLE = N значением по умолчанию станет первый переданный элемент с DEF = Y.

По умолчанию N

XML_ID
string

Внешний код значения. Обязательно уникальный в рамках элементов списка пользовательского поля

Примеры кода

Как использовать примеры в документации

Пример создания пользовательского поля типа Строка

curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"fields":{"LABEL":"Поле Привет, мир!","USER_TYPE_ID":"string","FIELD_NAME":"HELLO_WORLD","MULTIPLE":"Y","MANDATORY":"Y","SHOW_FILTER":"Y","SETTINGS":{"DEFAULT_VALUE":"Привет, мир! Значение по умолчанию","ROWS":3},"SORT":1000,"EDIT_IN_LIST":"Y","LIST_FILTER_LABEL":"Привет, мир! Фильтр","LIST_COLUMN_LABEL":{"en":"Hello, World! Column","ru":"Привет, мир! Колонка","de":"Hallo, Welt! Spalte"},"EDIT_FORM_LABEL":{"en":"Hello, World! Edit","ru":"Привет, мир! Редактировать","de":"Hallo, Welt! Bearbeiten"},"ERROR_MESSAGE":{"en":"Hello, World! Error","ru":"Привет, мир! Ошибка","de":"Hallo, Welt! Fehler"},"HELP_MESSAGE":{"en":"Hello, World! Help","ru":"Привет, мир! Помощь","de":"Hallo, Welt! Hilfe"}}}' \
https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/crm.quote.userfield.add
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"fields":{"LABEL":"Поле Привет, мир!","USER_TYPE_ID":"string","FIELD_NAME":"HELLO_WORLD","MULTIPLE":"Y","MANDATORY":"Y","SHOW_FILTER":"Y","SETTINGS":{"DEFAULT_VALUE":"Привет, мир! Значение по умолчанию","ROWS":3},"SORT":1000,"EDIT_IN_LIST":"Y","LIST_FILTER_LABEL":"Привет, мир! Фильтр","LIST_COLUMN_LABEL":{"en":"Hello, World! Column","ru":"Привет, мир! Колонка","de":"Hallo, Welt! Spalte"},"EDIT_FORM_LABEL":{"en":"Hello, World! Edit","ru":"Привет, мир! Редактировать","de":"Hallo, Welt! Bearbeiten"},"ERROR_MESSAGE":{"en":"Hello, World! Error","ru":"Привет, мир! Ошибка","de":"Hallo, Welt! Fehler"},"HELP_MESSAGE":{"en":"Hello, World! Help","ru":"Привет, мир! Помощь","de":"Hallo, Welt! Hilfe"}},"auth":"**put_access_token_here**"}' \
https://**put_your_bitrix24_address**/rest/crm.quote.userfield.add
// This snippet is an ES module: top-level await requires type="module" or a bundler.
// $b24 is an already-initialized SDK instance (see the SDK "Get started" guide).
import { Text } from '@bitrix24/b24jssdk'
import type { B24Frame } from '@bitrix24/b24jssdk'

declare const $b24: B24Frame

try {
  const response = await $b24.actions.v2.call.make<number>({
    method: 'crm.quote.userfield.add',
    params: {
      fields: {
        LABEL: 'Поле Привет, мир!',
        USER_TYPE_ID: 'string',
        FIELD_NAME: 'HELLO_WORLD',
        MULTIPLE: 'Y',
        MANDATORY: 'Y',
        SHOW_FILTER: 'Y',
        SETTINGS: {
          DEFAULT_VALUE: 'Привет, мир! Значение по умолчанию',
          ROWS: 3,
        },
        SORT: 1000,
        EDIT_IN_LIST: 'Y',
        LIST_FILTER_LABEL: 'Привет, мир! Фильтр',
        LIST_COLUMN_LABEL: {
          en: 'Hello, World! Column',
          ru: 'Привет, мир! Колонка',
          de: 'Hallo, Welt! Spalte',
        },
        EDIT_FORM_LABEL: {
          en: 'Hello, World! Edit',
          ru: 'Привет, мир! Редактировать',
          de: 'Hallo, Welt! Bearbeiten',
        },
        ERROR_MESSAGE: {
          en: 'Hello, World! Error',
          ru: 'Привет, мир! Ошибка',
          de: 'Hallo, Welt! Fehler',
        },
        HELP_MESSAGE: {
          en: 'Hello, World! Help',
          ru: 'Привет, мир! Помощь',
          de: 'Hallo, Welt! Hilfe',
        },
      },
    },
    requestId: Text.getUuidRfc4122()
  })

  // The payload is available only on a successful response
  if (!response.isSuccess) {
    console.error(response.getErrorMessages().join('; '))
  } else {
    const result = response.getData()!.result
    console.info('Created userfield ID:', result)
  }
} catch (error) {
  // Thrown on transport or SDK failures (AjaxError, SdkError, etc.)
  console.error(error)
}
<!-- Load the SDK (UMD build); it is exposed as the global B24Js -->
<script src="https://unpkg.com/@bitrix24/b24jssdk@1/dist/umd/index.min.js"></script>
<script>
  async function addStringQuoteUserfield() {
    try {
      // Initialize the SDK inside a Bitrix24 frame
      const $b24 = await B24Js.initializeB24Frame()

      const response = await $b24.actions.v2.call.make({
        method: 'crm.quote.userfield.add',
        params: {
          fields: {
            LABEL: 'Поле Привет, мир!',
            USER_TYPE_ID: 'string',
            FIELD_NAME: 'HELLO_WORLD',
            MULTIPLE: 'Y',
            MANDATORY: 'Y',
            SHOW_FILTER: 'Y',
            SETTINGS: {
              DEFAULT_VALUE: 'Привет, мир! Значение по умолчанию',
              ROWS: 3,
            },
            SORT: 1000,
            EDIT_IN_LIST: 'Y',
            LIST_FILTER_LABEL: 'Привет, мир! Фильтр',
            LIST_COLUMN_LABEL: {
              en: 'Hello, World! Column',
              ru: 'Привет, мир! Колонка',
              de: 'Hallo, Welt! Spalte',
            },
            EDIT_FORM_LABEL: {
              en: 'Hello, World! Edit',
              ru: 'Привет, мир! Редактировать',
              de: 'Hallo, Welt! Bearbeiten',
            },
            ERROR_MESSAGE: {
              en: 'Hello, World! Error',
              ru: 'Привет, мир! Ошибка',
              de: 'Hallo, Welt! Fehler',
            },
            HELP_MESSAGE: {
              en: 'Hello, World! Help',
              ru: 'Привет, мир! Помощь',
              de: 'Hallo, Welt! Hilfe',
            },
          },
        },
        requestId: B24Js.Text.getUuidRfc4122()
      })

      // The payload is available only on a successful response
      if (!response.isSuccess) {
        console.error(response.getErrorMessages().join('; '))
        return
      }

      const result = response.getData().result
      console.info('Created userfield ID:', result)
    } catch (error) {
      // Thrown on transport or SDK failures (AjaxError, SdkError, etc.)
      console.error(error)
    }
  }

  document.addEventListener('DOMContentLoaded', addStringQuoteUserfield)
</script>
from b24pysdk.errors import BitrixAPIError, BitrixSDKException

try:
    bitrix_response = client.crm.quote.userfield.add(
        fields={
            "LABEL": "Поле Привет, мир!",
            "USER_TYPE_ID": "string",
            "FIELD_NAME": "HELLO_WORLD",
            "MULTIPLE": "Y",
            "MANDATORY": "Y",
            "SHOW_FILTER": "Y",
            "SETTINGS": {
                "DEFAULT_VALUE": "Привет, мир! Значение по умолчанию",
                "ROWS": 3,
            },
            "SORT": 1000,
            "EDIT_IN_LIST": "Y",
            "LIST_FILTER_LABEL": "Привет, мир! Фильтр",
            "LIST_COLUMN_LABEL": {
                "en": "Hello, World! Column",
                "ru": "Привет, мир! Колонка",
                "de": "Hallo, Welt! Spalte",
            },
            "EDIT_FORM_LABEL": {
                "en": "Hello, World! Edit",
                "ru": "Привет, мир! Редактировать",
                "de": "Hallo, Welt! Bearbeiten",
            },
            "ERROR_MESSAGE": {
                "en": "Hello, World! Error",
                "ru": "Привет, мир! Ошибка",
                "de": "Hallo, Welt! Fehler",
            },
            "HELP_MESSAGE": {
                "en": "Hello, World! Help",
                "ru": "Привет, мир! Помощь",
                "de": "Hallo, Welt! Hilfe",
            },
        },
    ).response
    result = bitrix_response.result
    print(result)
except BitrixAPIError as error:
    print(
        "Ошибка Bitrix API",
        f"error: {error.error}",
        f"error_description: {error.error_description}",
        sep="\n",
    )
except BitrixSDKException as error:
    print(f"Ошибка Bitrix SDK: {error.message}")
except Exception as error:
    print(f"Непредвиденная ошибка: {error}")
try {
    $userfieldItemFields = [
        'FIELD_NAME' => 'HELLO_WORLD',
        'USER_TYPE_ID' => 'string',
        'SORT' => 1000,
        'MULTIPLE' => 'Y',
        'MANDATORY' => 'Y',
        'SHOW_FILTER' => 'Y',
        'EDIT_IN_LIST' => 'Y',
        'LIST_FILTER_LABEL' => 'Привет, мир! Фильтр',
        'LABEL' => 'Поле Привет, мир!',
        'LIST_COLUMN_LABEL' => [
            'en' => 'Hello, World! Column',
            'ru' => 'Привет, мир! Колонка',
            'de' => 'Hallo, Welt! Spalte',
        ],
        'EDIT_FORM_LABEL' => [
            'en' => 'Hello, World! Edit',
            'ru' => 'Привет, мир! Редактировать',
            'de' => 'Hallo, Welt! Bearbeiten',
        ],
        'ERROR_MESSAGE' => [
            'en' => 'Hello, World! Error',
            'ru' => 'Привет, мир! Ошибка',
            'de' => 'Hallo, Welt! Fehler',
        ],
        'HELP_MESSAGE' => [
            'en' => 'Hello, World! Help',
            'ru' => 'Привет, мир! Помощь',
            'de' => 'Hallo, Welt! Hilfe',
        ],
        'SETTINGS' => [
            'DEFAULT_VALUE' => 'Привет, мир! Значение по умолчанию',
            'ROWS' => 3,
        ],
    ];

    $result = $serviceBuilder
        ->getCRMScope()
        ->quoteUserfield()
        ->add($userfieldItemFields);

    print($result->getId());
} catch (Throwable $e) {
    print('Error: ' . $e->getMessage());
}
BX24.callMethod(
    'crm.quote.userfield.add',
    {
        fields: {
            LABEL: 'Поле Привет, мир!',
            USER_TYPE_ID: 'string',
            FIELD_NAME: 'HELLO_WORLD',
            MULTIPLE: 'Y',
            MANDATORY: 'Y',
            SHOW_FILTER: 'Y',
            SETTINGS: {
                DEFAULT_VALUE: 'Привет, мир! Значение по умолчанию',
                ROWS: 3,
            },
            SORT: 1000,
            EDIT_IN_LIST: 'Y',
            LIST_FILTER_LABEL: 'Привет, мир! Фильтр',
            LIST_COLUMN_LABEL: {
                en: 'Hello, World! Column',
                ru: 'Привет, мир! Колонка',
                de: 'Hallo, Welt! Spalte',
            },
            EDIT_FORM_LABEL: {
                en: 'Hello, World! Edit',
                ru: 'Привет, мир! Редактировать',
                de: 'Hallo, Welt! Bearbeiten',
            },
            ERROR_MESSAGE: {
                en: 'Hello, World! Error',
                ru: 'Привет, мир! Ошибка',
                de: 'Hallo, Welt! Fehler',
            },
            HELP_MESSAGE: {
                en: 'Hello, World! Help',
                ru: 'Привет, мир! Помощь',
                de: 'Hallo, Welt! Hilfe',
            },
        },
    },
    (result) => {
        result.error()
            ? console.error(result.error())
            : console.info(result.data());
    }
);
require_once('crest.php');

$result = CRest::call(
    'crm.quote.userfield.add',
    [
        'fields' => [
            'LABEL' => 'Поле Привет, мир!',
            'USER_TYPE_ID' => 'string',
            'FIELD_NAME' => 'HELLO_WORLD',
            'MULTIPLE' => 'Y',
            'MANDATORY' => 'Y',
            'SHOW_FILTER' => 'Y',
            'SETTINGS' => [
                'DEFAULT_VALUE' => 'Привет, мир! Значение по умолчанию',
                'ROWS' => 3,
            ],
            'SORT' => 1000,
            'EDIT_IN_LIST' => 'Y',
            'LIST_FILTER_LABEL' => 'Привет, мир! Фильтр',
            'LIST_COLUMN_LABEL' => [
                'en' => 'Hello, World! Column',
                'ru' => 'Привет, мир! Колонка',
                'de' => 'Hallo, Welt! Spalte',
            ],
            'EDIT_FORM_LABEL' => [
                'en' => 'Hello, World! Edit',
                'ru' => 'Привет, мир! Редактировать',
                'de' => 'Hallo, Welt! Bearbeiten',
            ],
            'ERROR_MESSAGE' => [
                'en' => 'Hello, World! Error',
                'ru' => 'Привет, мир! Ошибка',
                'de' => 'Hallo, Welt! Fehler',
            ],
            'HELP_MESSAGE' => [
                'en' => 'Hello, World! Help',
                'ru' => 'Привет, мир! Помощь',
                'de' => 'Hallo, Welt! Hilfe',
            ],
        ]
    ]
);

echo '<PRE>';
print_r($result);
echo '</PRE>';
// client и ctx уже созданы — см. раздел «SDK для Go»
res, err := client.Core().Call(ctx, "crm.quote.userfield.add", b24.Params{
	"fields": b24.Params{
		"LABEL":        "Поле Привет, мир!",
		"USER_TYPE_ID": "string",
		"FIELD_NAME":   "HELLO_WORLD",
		"MULTIPLE":     "Y",
		"MANDATORY":    "Y",
		"SHOW_FILTER":  "Y",
		"SETTINGS": b24.Params{
			"DEFAULT_VALUE": "Привет, мир! Значение по умолчанию",
			"ROWS":          3,
		},
		"SORT":              1000,
		"EDIT_IN_LIST":      "Y",
		"LIST_FILTER_LABEL": "Привет, мир! Фильтр",
		"LIST_COLUMN_LABEL": b24.Params{
			"en": "Hello, World! Column",
			"ru": "Привет, мир! Колонка",
			"de": "Hallo, Welt! Spalte",
		},
		"EDIT_FORM_LABEL": b24.Params{
			"en": "Hello, World! Edit",
			"ru": "Привет, мир! Редактировать",
			"de": "Hallo, Welt! Bearbeiten",
		},
		"ERROR_MESSAGE": b24.Params{
			"en": "Hello, World! Error",
			"ru": "Привет, мир! Ошибка",
			"de": "Hallo, Welt! Fehler",
		},
		"HELP_MESSAGE": b24.Params{
			"en": "Hello, World! Help",
			"ru": "Привет, мир! Помощь",
			"de": "Hallo, Welt! Hilfe",
		},
	},
})
if err != nil {
	return fmt.Errorf("crm.quote.userfield.add: %w", err)
}

var newID b24.ID
if err := json.Unmarshal(res.Result, &newID); err != nil {
	return fmt.Errorf("разбор ответа: %w", err)
}
fmt.Println("идентификатор:", newID)

Пример создания пользовательского поля типа Список

curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"fields":{"LABEL":"Пользовательское поле (список)","USER_TYPE_ID":"enumeration","FIELD_NAME":"ENUM_EXAMPLE","MULTIPLE":"N","MANDATORY":"N","SHOW_FILTER":"Y","LIST":[{"VALUE":"Элемент списка #1","DEF":"Y","XML_ID":"XML_ID_1","SORT":100},{"VALUE":"Элемент списка #2","XML_ID":"XML_ID_2","SORT":200},{"VALUE":"Элемент списка #3","XML_ID":"XML_ID_3","SORT":300},{"VALUE":"Элемент списка #4","XML_ID":"XML_ID_4","SORT":400}],"SETTINGS":{"DISPLAY":"UI","LIST_HEIGHT":2},"SORT":2000}}' \
https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/crm.quote.userfield.add
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"fields":{"LABEL":"Пользовательское поле (список)","USER_TYPE_ID":"enumeration","FIELD_NAME":"ENUM_EXAMPLE","MULTIPLE":"N","MANDATORY":"N","SHOW_FILTER":"Y","LIST":[{"VALUE":"Элемент списка #1","DEF":"Y","XML_ID":"XML_ID_1","SORT":100},{"VALUE":"Элемент списка #2","XML_ID":"XML_ID_2","SORT":200},{"VALUE":"Элемент списка #3","XML_ID":"XML_ID_3","SORT":300},{"VALUE":"Элемент списка #4","XML_ID":"XML_ID_4","SORT":400}],"SETTINGS":{"DISPLAY":"UI","LIST_HEIGHT":2},"SORT":2000},"auth":"**put_access_token_here**"}' \
https://**put_your_bitrix24_address**/rest/crm.quote.userfield.add
// This snippet is an ES module: top-level await requires type="module" or a bundler.
// $b24 is an already-initialized SDK instance (see the SDK "Get started" guide).
import { Text } from '@bitrix24/b24jssdk'
import type { B24Frame } from '@bitrix24/b24jssdk'

declare const $b24: B24Frame

try {
  const response = await $b24.actions.v2.call.make<number>({
    method: 'crm.quote.userfield.add',
    params: {
      fields: {
        LABEL: 'Пользовательское поле (список)',
        USER_TYPE_ID: 'enumeration',
        FIELD_NAME: 'ENUM_EXAMPLE',
        MULTIPLE: 'N',
        MANDATORY: 'N',
        SHOW_FILTER: 'Y',
        LIST: [
          {
            VALUE: 'Элемент списка #1',
            DEF: 'Y',
            XML_ID: 'XML_ID_1',
            SORT: 100,
          },
          {
            VALUE: 'Элемент списка #2',
            XML_ID: 'XML_ID_2',
            SORT: 200,
          },
          {
            VALUE: 'Элемент списка #3',
            XML_ID: 'XML_ID_3',
            SORT: 300,
          },
          {
            VALUE: 'Элемент списка #4',
            XML_ID: 'XML_ID_4',
            SORT: 400,
          },
        ],
        SETTINGS: {
          DISPLAY: 'UI',
          LIST_HEIGHT: 2,
        },
        SORT: 2000,
      },
    },
    requestId: Text.getUuidRfc4122()
  })

  // The payload is available only on a successful response
  if (!response.isSuccess) {
    console.error(response.getErrorMessages().join('; '))
  } else {
    const result = response.getData()!.result
    console.info('Created userfield ID:', result)
  }
} catch (error) {
  // Thrown on transport or SDK failures (AjaxError, SdkError, etc.)
  console.error(error)
}
<!-- Load the SDK (UMD build); it is exposed as the global B24Js -->
<script src="https://unpkg.com/@bitrix24/b24jssdk@1/dist/umd/index.min.js"></script>
<script>
  async function addEnumerationQuoteUserfield() {
    try {
      // Initialize the SDK inside a Bitrix24 frame
      const $b24 = await B24Js.initializeB24Frame()

      const response = await $b24.actions.v2.call.make({
        method: 'crm.quote.userfield.add',
        params: {
          fields: {
            LABEL: 'Пользовательское поле (список)',
            USER_TYPE_ID: 'enumeration',
            FIELD_NAME: 'ENUM_EXAMPLE',
            MULTIPLE: 'N',
            MANDATORY: 'N',
            SHOW_FILTER: 'Y',
            LIST: [
              {
                VALUE: 'Элемент списка #1',
                DEF: 'Y',
                XML_ID: 'XML_ID_1',
                SORT: 100,
              },
              {
                VALUE: 'Элемент списка #2',
                XML_ID: 'XML_ID_2',
                SORT: 200,
              },
              {
                VALUE: 'Элемент списка #3',
                XML_ID: 'XML_ID_3',
                SORT: 300,
              },
              {
                VALUE: 'Элемент списка #4',
                XML_ID: 'XML_ID_4',
                SORT: 400,
              },
            ],
            SETTINGS: {
              DISPLAY: 'UI',
              LIST_HEIGHT: 2,
            },
            SORT: 2000,
          },
        },
        requestId: B24Js.Text.getUuidRfc4122()
      })

      // The payload is available only on a successful response
      if (!response.isSuccess) {
        console.error(response.getErrorMessages().join('; '))
        return
      }

      const result = response.getData().result
      console.info('Created userfield ID:', result)
    } catch (error) {
      // Thrown on transport or SDK failures (AjaxError, SdkError, etc.)
      console.error(error)
    }
  }

  document.addEventListener('DOMContentLoaded', addEnumerationQuoteUserfield)
</script>
from b24pysdk.errors import BitrixAPIError, BitrixSDKException

try:
    bitrix_response = client.crm.quote.userfield.add(
        fields={
            "LABEL": "Пользовательское поле (список)",
            "USER_TYPE_ID": "enumeration",
            "FIELD_NAME": "ENUM_EXAMPLE",
            "MULTIPLE": "N",
            "MANDATORY": "N",
            "SHOW_FILTER": "Y",
            "LIST": [
                {
                    "VALUE": "Элемент списка #1",
                    "DEF": "Y",
                    "XML_ID": "XML_ID_1",
                    "SORT": 100,
                },
                {
                    "VALUE": "Элемент списка #2",
                    "XML_ID": "XML_ID_2",
                    "SORT": 200,
                },
                {
                    "VALUE": "Элемент списка #3",
                    "XML_ID": "XML_ID_3",
                    "SORT": 300,
                },
                {
                    "VALUE": "Элемент списка #4",
                    "XML_ID": "XML_ID_4",
                    "SORT": 400,
                },
            ],
            "SETTINGS": {
                "DISPLAY": "UI",
                "LIST_HEIGHT": 2,
            },
            "SORT": 2000,
        },
    ).response
    result = bitrix_response.result
    print(result)
except BitrixAPIError as error:
    print(
        "Ошибка Bitrix API",
        f"error: {error.error}",
        f"error_description: {error.error_description}",
        sep="\n",
    )
except BitrixSDKException as error:
    print(f"Ошибка Bitrix SDK: {error.message}")
except Exception as error:
    print(f"Непредвиденная ошибка: {error}")
try {
    $userfieldItemFields = [
        'LABEL' => 'Пользовательское поле (список)',
        'USER_TYPE_ID' => 'enumeration',
        // PHP SDK принимает код поля не длиннее 13 символов
        'FIELD_NAME' => 'ENUM_EXAMPLE',
        'MULTIPLE' => 'N',
        'MANDATORY' => 'N',
        'SHOW_FILTER' => 'Y',
        'LIST' => [
            ['VALUE' => 'Элемент списка #1', 'DEF' => 'Y', 'XML_ID' => 'XML_ID_1', 'SORT' => 100],
            ['VALUE' => 'Элемент списка #2', 'XML_ID' => 'XML_ID_2', 'SORT' => 200],
            ['VALUE' => 'Элемент списка #3', 'XML_ID' => 'XML_ID_3', 'SORT' => 300],
            ['VALUE' => 'Элемент списка #4', 'XML_ID' => 'XML_ID_4', 'SORT' => 400],
        ],
        'SETTINGS' => ['DISPLAY' => 'UI', 'LIST_HEIGHT' => 2],
        'SORT' => 2000,
    ];

    $result = $serviceBuilder
        ->getCRMScope()
        ->quoteUserfield()
        ->add($userfieldItemFields);

    print($result->getId());
} catch (Throwable $e) {
    print('Error: ' . $e->getMessage());
}
BX24.callMethod(
    'crm.quote.userfield.add',
    {
        fields: {
            LABEL: 'Пользовательское поле (список)',
            USER_TYPE_ID: 'enumeration',
            FIELD_NAME: 'ENUM_EXAMPLE',
            MULTIPLE: 'N',
            MANDATORY: 'N',
            SHOW_FILTER: 'Y',
            LIST: [
                { VALUE: 'Элемент списка #1', DEF: 'Y', XML_ID: 'XML_ID_1', SORT: 100 },
                { VALUE: 'Элемент списка #2', XML_ID: 'XML_ID_2', SORT: 200 },
                { VALUE: 'Элемент списка #3', XML_ID: 'XML_ID_3', SORT: 300 },
                { VALUE: 'Элемент списка #4', XML_ID: 'XML_ID_4', SORT: 400 },
            ],
            SETTINGS: { DISPLAY: 'UI', LIST_HEIGHT: 2 },
            SORT: 2000,
        },
    },
    (result) => {
        result.error()
            ? console.error(result.error())
            : console.info(result.data());
    }
);
require_once('crest.php');

$result = CRest::call(
    'crm.quote.userfield.add',
    [
        'fields' => [
            'LABEL' => 'Пользовательское поле (список)',
            'USER_TYPE_ID' => 'enumeration',
            'FIELD_NAME' => 'ENUM_EXAMPLE',
            'MULTIPLE' => 'N',
            'MANDATORY' => 'N',
            'SHOW_FILTER' => 'Y',
            'LIST' => [
                ['VALUE' => 'Элемент списка #1', 'DEF' => 'Y', 'XML_ID' => 'XML_ID_1', 'SORT' => 100],
                ['VALUE' => 'Элемент списка #2', 'XML_ID' => 'XML_ID_2', 'SORT' => 200],
                ['VALUE' => 'Элемент списка #3', 'XML_ID' => 'XML_ID_3', 'SORT' => 300],
                ['VALUE' => 'Элемент списка #4', 'XML_ID' => 'XML_ID_4', 'SORT' => 400],
            ],
            'SETTINGS' => [
                'DISPLAY' => 'UI',
                'LIST_HEIGHT' => 2,
            ],
            'SORT' => 2000,
        ]
    ]
);

echo '<PRE>';
print_r($result);
echo '</PRE>';
// client и ctx уже созданы — см. раздел «SDK для Go»
res, err := client.Core().Call(ctx, "crm.quote.userfield.add", b24.Params{
	"fields": b24.Params{
		"LABEL":        "Пользовательское поле (список)",
		"USER_TYPE_ID": "enumeration",
		"FIELD_NAME":   "ENUM_EXAMPLE",
		"MULTIPLE":     "N",
		"MANDATORY":    "N",
		"SHOW_FILTER":  "Y",
		"LIST": []b24.Params{
			{
				"VALUE":  "Элемент списка #1",
				"DEF":    "Y",
				"XML_ID": "XML_ID_1",
				"SORT":   100,
			},
			{
				"VALUE":  "Элемент списка #2",
				"XML_ID": "XML_ID_2",
				"SORT":   200,
			},
			{
				"VALUE":  "Элемент списка #3",
				"XML_ID": "XML_ID_3",
				"SORT":   300,
			},
			{
				"VALUE":  "Элемент списка #4",
				"XML_ID": "XML_ID_4",
				"SORT":   400,
			},
		},
		"SETTINGS": b24.Params{
			"DISPLAY":     "UI",
			"LIST_HEIGHT": 2,
		},
		"SORT": 2000,
	},
})
if err != nil {
	return fmt.Errorf("crm.quote.userfield.add: %w", err)
}

var newID b24.ID
if err := json.Unmarshal(res.Result, &newID); err != nil {
	return fmt.Errorf("разбор ответа: %w", err)
}
fmt.Println("идентификатор:", newID)

Обработка ответа

HTTP-статус: 200

{
    "result": 6997,
    "time": {
        "start": 1753789240.8146,
        "finish": 1753789241.058695,
        "duration": 0.2440950870513916,
        "processing": 0.19217395782470703,
        "date_start": "2025-07-29T14:40:40+03:00",
        "date_finish": "2025-07-29T14:40:41+03:00",
        "operating_reset_at": 1753789840,
        "operating": 0.19216084480285645
    }
}

Возвращаемые данные

Название
тип

Описание

result
integer

Корневой элемент ответа, содержит идентификатор созданного пользовательского поля

time
time

Информация о времени выполнения запроса

Обработка ошибок

HTTP-статус: 400

{
    "error": "",
    "error_description": "The 'USER_TYPE_ID' field is not found."
}

Название
тип

Описание

error
string

Строковый код ошибки. Состоит из цифр, латинских букв и знака подчеркивания. Может прийти пустым — тогда причину показывает только error_description

error_description
string

Текст ошибки для разработчика. Не показывайте его конечному пользователю без обработки

Возможные коды ошибок

Если не переданы и USER_TYPE_ID, и FIELD_NAME, обе ошибки приходят в одном error_description через перевод строки.

Статус

Код

Описание

Значение

400

Пустое значение

Access denied.

У пользователя нет права «Разрешить изменять настройки» в CRM

400

Пустое значение

The 'FIELD_NAME' field is not found.

FIELD_NAME не передан или пустой

400

ERROR_CORE

Имя поля слишком длинное (больше 50-ти символов).

Полное имя поля вместе с префиксом UF_CRM_ содержит более 50 символов, то есть код без префикса длиннее 43 символов

400

ERROR_CORE

Имя поля содержит недопустимые символы. Допустимыми являются: A-Z, 0-9 и _.

Переданный FIELD_NAME содержит символы, кроме A-Z, 0-9 и _

400

Пустое значение

The 'USER_TYPE_ID' field is not found.

USER_TYPE_ID не передан или пустой

400

ERROR_CORE

Указан неверный пользовательский тип.

Переданный USER_TYPE_ID не существует

400

ERROR_CORE

Поле UF_CRM_CODE для объекта CRM_QUOTE уже существует.

Поле с таким FIELD_NAME у предложений уже есть

400

ERROR_CORE

Элемент списка со значением XML_ID=xml_id уже существует.

XML_ID повторяется у элементов LIST

500

INTERNAL_SERVER_ERROR

Текст зависит от причины

У предложений уже 1016 пользовательских полей или создание поля не уложилось в max_execution_time. Подробнее — в разделе Ошибки при работе с пользовательскими полями

Статусы и коды системных ошибок

HTTP-статус: 4xx, 5xx

Описанные ниже ошибки возвращает сам REST API, а не логика конкретного метода. Они могут прийти в ответ на любой метод.

Статус

Код
Текст ошибки

Описание

500

INTERNAL_SERVER_ERROR
Internal server error

Возникла внутренняя ошибка сервера. Повторите вызов, а если ошибка сохраняется, обратитесь к администратору сервера или в техническую поддержку Битрикс24

500

ERROR_UNEXPECTED_ANSWER
Server returned an unexpected response

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

503

QUERY_LIMIT_EXCEEDED
Too many requests

Превышен лимит на интенсивность запросов

429

OPERATION_TIME_LIMIT
Method is blocked due to operation time limit

Метод заблокирован из-за превышения лимита на ресурсоемкость запросов. Блокировка снимается автоматически, когда накопленное время выполнения метода перестает превышать лимит

401

NO_AUTH_FOUND
Wrong authorization data

В запросе нет авторизационных данных: не передан ни access-токен, ни код вебхука

401

INVALID_REQUEST
Https required

Методы вызываются только по протоколу HTTPS

401

OVERLOAD_LIMIT
REST API is blocked due to overload

REST API заблокирован из-за перегрузки. Это ручная индивидуальная блокировка. Чтобы ее снять, обратитесь в техническую поддержку Битрикс24

401

ACCESS_DENIED
REST is available only on commercial plans

REST API доступен только на коммерческих тарифах. У вебхука текст ошибки другой — REST is available only by subscription

401

INVALID_CREDENTIALS
Invalid request credentials

Не найден активный вебхук с указанным идентификатором пользователя и секретным кодом

404

ERROR_METHOD_NOT_FOUND
Method not found!

Метод с таким именем не найден. Имя написано с ошибкой, метода нет в REST API или он недоступен без нужного скоупа

401

insufficient_scope
The request requires higher privileges than provided by the webhook token

Запрос требует более широких прав, чем есть у токена: у вебхука это выданные ему права, у приложения — скоуп. У приложения текст ошибки заканчивается на provided by the access token

401

expired_token
The access token provided has expired

Срок действия access-токена истек

401

user_access_error
The user does not have access to the application

Приложение установлено, но администратор Битрикс24 открыл доступ к нему только конкретным пользователям

403

PORTAL_DELETED
Portal was deleted

Публичная часть сайта закрыта. Чтобы открыть ее на коробочной установке, отключите опцию «Временное закрытие публичной части сайта». Путь к настройке: Рабочий стол > Настройки > Настройки продукта > Настройки модулей > Главный модуль > Временное закрытие публичной части сайта

Продолжите изучение