Пользовательские поля (UF, userfield) расширяют стандартные сущности CRM собственными данными: номером договора, датой монтажа, ссылкой на внешнюю систему. Семейство методов crm.{entity}.userfield.* позволяет создавать и настраивать такие поля программно, что критично для воспроизводимого развёртывания интеграций.
Как устроены пользовательские поля
Пользовательские поля создаются отдельно для каждой сущности CRM, и у каждой — свой набор методов:
crm.deal.userfield.*— поля сделок;crm.lead.userfield.*— поля лидов;crm.contact.userfield.*— поля контактов;crm.company.userfield.*— поля компаний.
Внутри каждого семейства доступны add, update, get, list, delete. Имя поля всегда начинается с префикса UF_CRM_, а обращаться к нему при чтении и записи сущности нужно именно по этому имени.
userfieldconfig.* с указанием moduleId и entityId динамической сущности, а не через crm.deal.userfield.Типы пользовательских полей
Тип задаётся полем USER_TYPE_ID. Основные типы, которые встречаются в интеграциях:
| USER_TYPE_ID | Назначение |
|---|---|
string | строка |
integer / double | число целое / дробное |
date / datetime | дата / дата со временем |
boolean | да/нет |
enumeration | список значений |
money | деньги |
url / file | ссылка / файл |
crm / employee | привязка к сущности CRM / к сотруднику |
Полный список типов, доступных на конкретном портале, вернёт метод crm.deal.userfield.fields и метаданные списочных настроек.
Создание поля: crm.deal.userfield.add
Простое строковое поле «Номер договора» для сделок создаётся так:
POST /rest/1/xxxxxxxx/crm.deal.userfield.add.json
{
"fields": {
"FIELD_NAME": "CONTRACT_NO",
"USER_TYPE_ID": "string",
"XML_ID": "contract_no",
"MANDATORY": "N",
"MULTIPLE": "N",
"EDIT_FORM_LABEL": { "ru": "Номер договора" },
"LIST_COLUMN_LABEL": { "ru": "Договор" }
}
}В FIELD_NAME префикс UF_CRM_ добавлять не нужно — система подставит его сама. Метод вернёт числовой ID поля, а его итоговое имя будет UF_CRM_CONTRACT_NO. Заголовки задаются массивом с языковыми ключами.
Списочные поля (enumeration)
Поле-список требует передачи вариантов в поле LIST. Каждый вариант — объект со значением и (опционально) сортировкой:
POST /rest/1/xxxxxxxx/crm.deal.userfield.add.json
{
"fields": {
"FIELD_NAME": "SOURCE_CHANNEL",
"USER_TYPE_ID": "enumeration",
"LIST": [
{ "VALUE": "Сайт", "DEF": "Y", "SORT": 10 },
{ "VALUE": "Телефон", "SORT": 20 },
{ "VALUE": "Партнёр", "SORT": 30 }
]
}
}crm.deal.userfield.get в разделе LIST. Кешируйте соответствие «текст → ID варианта».Чтение и запись значений в сущности
После создания поле становится доступным в обычных методах сущности под своим полным именем. Запись значения при обновлении сделки:
POST /rest/1/xxxxxxxx/crm.deal.update.json
{
"id": 340,
"fields": { "UF_CRM_CONTRACT_NO": "Д-2026/145" }
}Чтобы прочитать значение, добавьте имя поля в select метода crm.deal.list или получите его через crm.deal.get. Множественное поле (MULTIPLE = Y) возвращается и записывается массивом значений.
- Одиночное поле — скалярное значение;
- Множественное поле — массив;
- Файловое поле — при записи base64-содержимое, при чтении — ссылка на скачивание.
Отдельного внимания заслуживает тип crm — привязка к другой сущности. В его настройках указывается, какие именно сущности можно выбирать (контакт, компания, сделка, лид), а значение хранится в виде префиксованного идентификатора, например C_145 для контакта или CO_77 для компании. Если поле допускает несколько типов сущностей, при записи важно передавать значение именно с корректным префиксом, иначе связь не установится. Тип employee хранит ID пользователя портала и удобен, когда нужно закрепить за сделкой не ответственного, а, например, куратора или технического специалиста из внешней системы.
Управление полями как кодом
Поскольку поля создаются через REST, их описание удобно хранить в репозитории и разворачивать одинаково на dev-, stage- и prod-порталах. Рекомендуемый подход:
- Описать все UF-поля в конфигурационном файле (имя, тип, заголовки, списки);
- При деплое проверять наличие поля через
crm.deal.userfield.listс фильтром поXML_ID; - Если поля нет — создавать, если есть — при необходимости обновлять;
- Использовать
XML_IDкак стабильный внешний идентификатор для сопоставления.
XML_ID стоит считать «ключом» поля между окружениями: имя UF_CRM_* может совпасть случайно, а осмысленный XML_ID вы контролируете сами и не привяжетесь к автоинкрементному ID.Отдельно предостережём от бездумного пересоздания полей. Удаление пользовательского поля через delete уничтожает и все накопленные в нём данные по сущностям — это необратимо. Поэтому в скриптах развёртывания операцию удаления либо исключают вовсе, либо выносят в отдельный, явно подтверждаемый шаг. Обновление же (update) безопасно меняет заголовки, обязательность и состав списка, не затрагивая уже введённые значения. Такой аккуратный подход к жизненному циклу полей особенно важен на боевом портале, где за каждым полем стоят реальные данные клиентов.
Итог
Пользовательские поля — основа гибкой CRM: через crm.{entity}.userfield.* вы создаёте их программно, задаёте тип через USER_TYPE_ID и обращаетесь по имени с префиксом UF_CRM_. Два момента требуют внимания: списочные поля работают через числовые ID вариантов, а множественные — через массивы. Хранение описаний полей в коде с ключом XML_ID делает развёртывание предсказуемым.
Мы проектируем структуру пользовательских полей под задачи бизнеса и разворачиваем её одинаково на всех окружениях, связывая поля с данными сайта и 1С. Если нужна воспроизводимая настройка CRM и обмен по кастомным полям — поможем реализовать.
Частые вопросы
Нужно ли добавлять префикс UF_CRM_ в FIELD_NAME?
Нет. В FIELD_NAME указывается только осмысленная часть имени, а префикс UF_CRM_ система добавит сама. Полное имя используйте при чтении и записи значений сущности.
Как задать варианты для списочного поля?
Передайте массив LIST с объектами VALUE и, при необходимости, SORT и DEF. При записи в сущность поле принимает числовой ID варианта, а не его текст.
Чем отличается работа с множественным полем?
Множественное поле с MULTIPLE равным Y и читается, и записывается массивом значений. Одиночное поле принимает и возвращает скалярное значение.
Можно ли создать поле для смарт-процесса?
Да, но не через crm.deal.userfield. Для динамических сущностей используются методы userfieldconfig.* с указанием moduleId и entityId смарт-процесса.
Как безопасно переносить поля между порталами?
Опирайтесь на XML_ID как на стабильный внешний ключ. Перед созданием проверяйте наличие поля через list с фильтром по XML_ID и создавайте только отсутствующие.
Как записать значение в пользовательское поле?
Передайте полное имя поля вида UF_CRM_CONTRACT_NO в fields метода update соответствующей сущности, например crm.deal.update.
Как прочитать пользовательское поле в списке?
Добавьте его полное имя в параметр select метода list, например crm.deal.list. Одиночным методом get поле возвращается вместе с остальными полями.
Поможем с настройкой и поддержкой Для разработчиков
Поможем с настройкой, доработкой и поддержкой Для разработчиков.