Как отфильтровать элементы по названию стадии
Scope:
crm, user_briefКто может выполнять метод: пользователь с доступом на чтение элементов CRM
Если вы разрабатываете интеграции для Битрикс24 с помощью AI-инструментов (Codex, Claude Code, Cursor), подключите MCP-сервер, чтобы ассистент использовал официальную REST-документацию.
Название стадии не хранится в поле «Стадия» элемента CRM. Поле «Стадия» содержит идентификатор. Соотнести название и идентификатор стадии можно используя методы для работы со справочниками — системными полями типа «список». Для поиска элементов по названию стадии последовательно выполним три метода:
- crm.category.list — получим идентификатор воронки
- crm.status.list — получим идентификатор стадии в воронке
- crm.item.list — получим список элементов на стадии
1. Получим идентификатор воронки
Используем метод crm.category.list с параметрами:
entityTypeId— укажем2для сделок. Это идентификатор типа объекта. Чтобы узнать идентификатор смарт-процесса, выполните метод crm.enum.ownertype без параметров.
Как использовать примеры в документации
BX24.callMethod(
"crm.category.list",
{
entityTypeId: 2,
},
);
require_once('crest.php');
$result = CRest::call(
'crm.category.list',
[
'entityTypeId' => 2
]
);
В результате получили воронки сделок. Определим нужную воронку по названию в поле name. Идентификатор воронки возьмем из поля id.
{
"result": {
"categories": [
{
"id": 9,
"name": "Воронка с оригинальным названием",
"sort": 200,
"entityTypeId": 2,
"isDefault": "N",
"originId": "",
"originatorId": ""
},
{
"id": 10,
"name": "Лидовый маршрут",
"sort": 200,
"entityTypeId": 2,
"isDefault": "N",
"originId": "",
"originatorId": ""
},
{
"id": 11,
"name": "Путь успеха",
"sort": 200,
"entityTypeId": 2,
"isDefault": "N",
"originId": "",
"originatorId": ""
},
{
"id": 0,
"name": "Общая",
"sort": 300,
"entityTypeId": 2,
"isDefault": "Y"
}
]
},
"total": 4,
}
2. Получим идентификатор стадии
Используем метод crm.status.list с фильтром:
ENTITY_ID— укажемDEAL_STAGE_10, где10— идентификатор воронки, полученный на шаге 1.
Для получения стадий смарт-процесса используйте формулу видаDYNAMIC_185_STAGE_11, где185—IDсмарт-процесса,11—IDворонки.
ЕслиIDворонки равно0, запрос стадий делайте без добавления_ID.
BX24.callMethod(
"crm.status.list",
{
filter: { "ENTITY_ID": "DEAL_STAGE_10"}
},
);
require_once('crest.php');
$result = CRest::call(
'crm.status.list',
[
'filter' => [
'ENTITY_ID' => 'DEAL_STAGE_10'
]
]
);
В результате получили список стадий. Определим нужную стадию по названию в поле NAME. Идентификатор стадии возьмем из поля STATUS_ID.
{
"result": [
{
"ID": "331",
"ENTITY_ID": "DEAL_STAGE_10",
"STATUS_ID": "C10:NEW",
"NAME": "Новая",
"NAME_INIT": "Новая",
"SORT": "10",
"SYSTEM": "Y",
"CATEGORY_ID": "5",
"COLOR": "#39A8EF",
"SEMANTICS": null,
"EXTRA": {
"SEMANTICS": "process",
"COLOR": "#39A8EF"
}
},
{
"ID": "333",
"ENTITY_ID": "DEAL_STAGE_10",
"STATUS_ID": "C10:PREPARATION",
"NAME": "Подготовка документов",
"NAME_INIT": "",
"SORT": "20",
"SYSTEM": "N",
"CATEGORY_ID": "5",
"COLOR": "#2FC6F6",
"SEMANTICS": null,
"EXTRA": {
"SEMANTICS": "process",
"COLOR": "#2FC6F6"
}
},
{
"ID": "335",
"ENTITY_ID": "DEAL_STAGE_10",
"STATUS_ID": "C10:PREPAYMENT_INVOICE",
"NAME": "Согласование",
"NAME_INIT": "",
"SORT": "30",
"SYSTEM": "N",
"CATEGORY_ID": "5",
"COLOR": "#55d0e0",
"SEMANTICS": null,
"EXTRA": {
"SEMANTICS": "process",
"COLOR": "#55d0e0"
}
},
{
"ID": "337",
"ENTITY_ID": "DEAL_STAGE_10",
"STATUS_ID": "C10:EXECUTING",
"NAME": "В работе",
"NAME_INIT": "",
"SORT": "40",
"SYSTEM": "N",
"CATEGORY_ID": "5",
"COLOR": "#47E4C2",
"SEMANTICS": null,
"EXTRA": {
"SEMANTICS": "process",
"COLOR": "#47E4C2"
}
},
{
"ID": "339",
"ENTITY_ID": "DEAL_STAGE_10",
"STATUS_ID": "C10:FINAL_INVOICE",
"NAME": "Финальный счёт",
"NAME_INIT": "",
"SORT": "50",
"SYSTEM": "N",
"CATEGORY_ID": "5",
"COLOR": "#FFA900",
"SEMANTICS": null,
"EXTRA": {
"SEMANTICS": "process",
"COLOR": "#FFA900"
}
},
{
"ID": "341",
"ENTITY_ID": "DEAL_STAGE_10",
"STATUS_ID": "C10:WON",
"NAME": "Сделка успешна",
"NAME_INIT": "Сделка успешна",
"SORT": "60",
"SYSTEM": "Y",
"CATEGORY_ID": "5",
"COLOR": "#7BD500",
"SEMANTICS": "S",
"EXTRA": {
"SEMANTICS": "success",
"COLOR": "#7BD500"
}
},
{
"ID": "343",
"ENTITY_ID": "DEAL_STAGE_10",
"STATUS_ID": "C10:LOSE",
"NAME": "Сделка провалена",
"NAME_INIT": "Сделка провалена",
"SORT": "70",
"SYSTEM": "Y",
"CATEGORY_ID": "5",
"COLOR": "#FF5752",
"SEMANTICS": "F",
"EXTRA": {
"SEMANTICS": "failure",
"COLOR": "#FF5752"
}
},
{
"ID": "345",
"ENTITY_ID": "DEAL_STAGE_10",
"STATUS_ID": "C10:APOLOGY",
"NAME": "Анализ причины провала",
"NAME_INIT": "",
"SORT": "80",
"SYSTEM": "N",
"CATEGORY_ID": "5",
"COLOR": "#FF5752",
"SEMANTICS": "F",
"EXTRA": {
"SEMANTICS": "apology",
"COLOR": "#FF5752"
}
}
],
"total": 8,
}
3. Получим список элементов на стадии
Используем метод crm.item.list с параметрами:
entityTypeId— укажем2для сделок. Это идентификатор типа объекта. Чтобы узнать идентификатор смарт-процесса, выполните метод crm.enum.ownertype без параметров.filter[stageId]— укажемC10:PREPAYMENT_INVOICE. Это идентификатор стадии, полученный на шаге 2.select[]— укажем поля элементов, которые хотим получить. Без параметраselectбудут возвращены все поля, в том числе пользовательские.
BX24.callMethod(
'crm.item.list',
{
entityTypeId: 2,
select: [
"id",
"title",
"assignedById",
"opportunity",
],
filter: {
"stageId": ["C10:PREPAYMENT_INVOICE"],
},
},
);
require_once('crest.php');
$result = CRest::call(
'crm.item.list',
[
'entityTypeId' => 2,
'select' => [
"id",
"title",
"assignedById",
"opportunity",
],
'filter' => [
"stageId" => ["C10:PREPAYMENT_INVOICE"],
],
]
);
В результате получили список элементов на запрошенной стадии.
{
"result": {
"items": [
{
"id": 5111,
"assignedById": 1,
"title": "Закупка печей",
"opportunity": 500
},
{
"id": 5199,
"assignedById": 29,
"title": "Закупка обогревателей",
"opportunity": 250
},
{
"id": 5257,
"assignedById": 29,
"title": "Закупка хлебопечек",
"opportunity": 200
},
{
"id": 5273,
"assignedById": 29,
"title": "Закупка машин",
"opportunity": 0
},
{
"id": 5317,
"assignedById": 29,
"title": "Закупка блендеров",
"opportunity": 100
}
]
},
"total": 5,
}
Получим данные ответственного
В полученном результате указан ID ответственного за элемент сотрудника. Чтобы вывести имя и фамилию сотрудника, используем метод user.get с фильтром:
ID— укажем значение из параметраassignedById, полученное на шаге 3.
BX24.callMethod(
"user.get",
{
"ID": 29
},
);
require_once('crest.php');
$result = CRest::call(
'user.get',
[
'ID' => 29
]
);
В результате получим данные по сотруднику, в том числе поля NAME и LAST_NAME.
{
"result": [
{
"ID": "29",
"ACTIVE": true,
"NAME": "Вадим",
"LAST_NAME": "Валеев",
"SECOND_NAME": "",
"EMAIL": "v.r.valeev@bitrix.com",
"LAST_LOGIN": "2025-05-15T13:06:54+00:00",
"DATE_REGISTER": "2024-07-15T00:00:00+00:00",
"TIME_ZONE": "",
"IS_ONLINE": "Y",
"TIMESTAMP_X": {
},
"LAST_ACTIVITY_DATE": {
},
"PERSONAL_GENDER": "",
"PERSONAL_WWW": "",
"PERSONAL_BIRTHDAY": "2000-07-14T00:00:00+00:00",
"PERSONAL_MOBILE": "",
"PERSONAL_CITY": "",
"WORK_PHONE": "",
"WORK_POSITION": "",
"UF_EMPLOYMENT_DATE": "",
"UF_DEPARTMENT": [1],
"USER_TYPE": "employee"
},
],
}
Пример кода
// Шаг 1: Запрос названия воронки у пользователя
let funnelName = prompt("Введите название воронки сделок:");
// Шаг 2: Получаем список воронок
BX24.callMethod(
"crm.category.list",
{
entityTypeId: 2,
},
function (result) {
if (result.error()) {
console.error(result.error().ex);
return;
}
let categories = result.data().categories;
let selectedFunnel = categories.find(cat => cat.name === funnelName);
if (!selectedFunnel) {
alert("Воронка не найдена.");
return;
}
let funnelId = selectedFunnel.id;
// Шаг 3: Запрос названия стадии у пользователя
let stageName = prompt("Введите название стадии:");
// Шаг 4: Получаем список стадий для выбранной воронки
let entityID = funnelId === 0 ? "DEAL_STAGE" : `DEAL_STAGE_${funnelId}`;
BX24.callMethod(
"crm.status.list",
{
filter: { "ENTITY_ID": entityID }
},
function (result) {
if (result.error()) {
console.error(result.error().ex);
return;
}
let stages = result.data();
let selectedStage = stages.find(stage => stage.NAME === stageName);
if (!selectedStage) {
alert("Стадия не найдена.");
return;
}
let stageId = selectedStage.STATUS_ID;
// Шаг 5: Получаем список сделок на выбранной стадии
BX24.callMethod(
"crm.item.list",
{
entityTypeId: 2,
select: ["id", "title", "assignedById", "opportunity"],
filter: {
"stageId": stageId,
},
},
function (result) {
if (result.error()) {
console.error(result.error().ex);
return;
}
let deals = result.data().items;
let uniqueResponsibleIds = [...new Set(deals.map(deal => deal.assignedById))];
let userMap = {};
// Шаг 6: Получаем информацию о пользователях
uniqueResponsibleIds.forEach(userId => {
BX24.callMethod(
"user.get",
{
"ID": userId
},
function (userResult) {
if (userResult.error()) {
console.error(userResult.error().ex);
return;
}
let user = userResult.data()[0];
userMap[userId] = {
name: user.NAME,
lastName: user.LAST_NAME
};
}
);
});
// Шаг 7: Выводим результаты в консоль в виде текстовой таблицы
setTimeout(() => {
let table = [];
// Заголовок
table.push([
"ID сделки",
"Название",
"Имя ответственного",
"Фамилия ответственного",
"Ожидаемый доход"
]);
// Строки данных
deals.forEach(deal => {
let responsible = userMap[deal.assignedById] || { name: "Неизвестно", lastName: "Неизвестно" };
table.push([
deal.id,
deal.title,
responsible.name,
responsible.lastName,
deal.opportunity || 0
]);
});
// Выводим таблицу в консоль
console.table(table);
}, 1000); // Задержка для завершения всех запросов
}
);
}
);
}
);
require_once('crest.php');
// Шаг 1: Запрос названия воронки у пользователя
$funnelName = readline("Введите название воронки сделок: ");
// Шаг 2: Получаем список воронок
$result = CRest::call(
'crm.category.list',
[
'entityTypeId' => 2
]
);
if (!empty($result['error'])) {
echo "Ошибка: " . $result['error_description'] . "\n";
exit;
}
$categories = $result['result']['categories'];
$selectedFunnel = null;
foreach ($categories as $category) {
if ($category['NAME'] === $funnelName) {
$selectedFunnel = $category;
break;
}
}
if (!$selectedFunnel) {
echo "Воронка не найдена.\n";
exit;
}
$funnelId = $selectedFunnel['ID'];
// Шаг 3: Запрос названия стадии у пользователя
$stageName = readline("Введите название стадии: ");
// Шаг 4: Получаем список стадий для выбранной воронки
$entityID = $funnelId === 0 ? "DEAL_STAGE" : "DEAL_STAGE_{$funnelId}";
$result = CRest::call(
'crm.status.list',
[
'filter' => [
'ENTITY_ID' => $entityID
]
]
);
if (!empty($result['error'])) {
echo "Ошибка: " . $result['error_description'] . "\n";
exit;
}
$stages = $result['result'];
$selectedStage = null;
foreach ($stages as $stage) {
if ($stage['NAME'] === $stageName) {
$selectedStage = $stage;
break;
}
}
if (!$selectedStage) {
echo "Стадия не найдена.\n";
exit;
}
$stageId = $selectedStage['STATUS_ID'];
// Шаг 5: Получаем список сделок на выбранной стадии
$result = CRest::call(
'crm.item.list',
[
'entityTypeId' => 2,
'select' => [
"id",
"title",
"assignedById",
"opportunity"
],
'filter' => [
"stageId" => $stageId
]
]
);
if (!empty($result['error'])) {
echo "Ошибка: " . $result['error_description'] . "\n";
exit;
}
$deals = $result['result']['items'];
$uniqueResponsibleIds = array_unique(array_column($deals, 'assignedById'));
$userMap = [];
// Шаг 6: Получаем информацию о пользователях
foreach ($uniqueResponsibleIds as $userId) {
$result = CRest::call(
'user.get',
[
'ID' => $userId
]
);
if (!empty($result['error'])) {
echo "Ошибка: " . $result['error_description'] . "\n";
continue;
}
$user = $result['result'][0];
$userMap[$userId] = [
'name' => $user['NAME'],
'lastName' => $user['LAST_NAME']
];
}
// Шаг 7: Выводим результаты в виде текстовой таблицы
$table = [];
// Заголовок
$table[] = [
"ID сделки",
"Название",
"Имя ответственного",
"Фамилия ответственного",
"Ожидаемый доход"
];
// Строки данных
foreach ($deals as $deal) {
$responsible = $userMap[$deal['assignedById']] ?? ['name' => 'Неизвестно', 'lastName' => 'Неизвестно'];
$table[] = [
$deal['id'],
$deal['title'],
$responsible['name'],
$responsible['lastName'],
$deal['opportunity'] ?? 0
];
}
// Вывод таблицы
foreach ($table as $row) {
echo implode("\t", $row) . "\n";
}