crm.quote.list
Получить список коммерческих предложений по фильтру
Описание
Метод crm.quote.list возвращает список коммерческих предложений по фильтру.
Метод является реализацией списочного метода для коммерческих предложений.
Параметры
select
string[]
необязательный
Список полей, которые нужно вернуть в ответе.
При выборке можно использовать маски:
- '*' — для выборки всех стандартных полей (без пользовательских и множественных),
- 'UF_*' — для выборки всех пользовательских полей.
Список доступных полей для выборки можно получить с помощью метода crm.quote.fields.
По умолчанию возвращаются все стандартные поля и пользовательские поля ('*' + 'UF_*')
filter
object
необязательный
Объект формата:
{
"field_1": "value_1",
"field_2": "value_2",
"...": "..."
}
где:
- field_n — название поля, по которому фильтруется выборка,
- value_n — значение фильтра.
Формат ключа фильтра: <оператор><поле>.
Пример: >=DATE_CREATE, @ASSIGNED_BY_ID, =%TITLE.
Поддерживаемые операторы:
- = — равно (точное совпадение, используется по умолчанию)
- != — не равно
- ! — не равно
- > — больше
- >= — больше либо равно
- < — меньше
- <= — меньше либо равно
- @ — IN (в значении передается массив)
- !@ — NOT IN (в значении передается массив)
- % — LIKE, поиск по подстроке
- =% — LIKE, поиск по шаблону
- %= — LIKE (аналогично =%)
Для LIKE:
- =%TITLE: "%меб" — подстрока в любом месте
- =%TITLE: "меб%" — начинается с меб
- =%TITLE: "%меб" — заканчивается на меб
Список доступных полей для фильтрации можно получить с помощью метода crm.quote.fields
order
object
необязательный
Объект формата:
{
"field_1": "ASC",
"field_2": "DESC"
}
где:
- field_n — поле сортировки,
- значение:
- ASC — по возрастанию,
- DESC — по убыванию.
Список доступных полей для сортировки можно получить с помощью метода crm.quote.fields.
При сортировке по STATUS_ID используется внутреннее поле STATUS_SORT
start
integer
необязательный
Параметр постраничной навигации.
Размер страницы — 50 записей.
Формула:
start = (N - 1) * 50, где N — номер страницы
Примеры запроса
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"order":{"STATUS_ID":"ASC","ID":"ASC"},"filter":{"=COMPANY_ID":1,"=STATUS_ID":"SENT"},"select":["ID","TITLE","STATUS_ID","OPPORTUNITY","CURRENCY_ID","ASSIGNED_BY_ID"]}' \
https://**put_your_bitrix24_address**/rest/**put_your_user_id_here**/**put_your_webhook_here**/crm.quote.list
curl -X POST \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{"order":{"STATUS_ID":"ASC","ID":"ASC"},"filter":{"=COMPANY_ID":1,"=STATUS_ID":"SENT"},"select":["ID","TITLE","STATUS_ID","OPPORTUNITY","CURRENCY_ID","ASSIGNED_BY_ID"],"auth":"**put_access_token_here**"}' \
https://**put_your_bitrix24_address**/rest/crm.quote.list
// 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
// Shape of each QuoteItem returned in result[]
type QuoteItem = {
ID: string
TITLE: string
STATUS_ID: string
OPPORTUNITY: string
CURRENCY_ID: string
ASSIGNED_BY_ID: string
}
try {
// crm.quote.list returns a single page (max 50 records). For the whole result set
// use a list helper: $b24.actions.v2.callList.make() returns every record as one
// array, $b24.actions.v2.fetchList.make() yields them in chunks (async generator).
// NOTE: the list helpers do not accept `order` (it is excluded from their params, so
// passing it is a TS error) — keep this call.make + `start` variant when sort matters.
const response = await $b24.actions.v2.call.make<QuoteItem[]>({
method: 'crm.quote.list',
params: {
order: { STATUS_ID: 'ASC', ID: 'ASC' },
filter: { '=COMPANY_ID': 1, '=STATUS_ID': 'SENT' },
select: ['ID', 'TITLE', 'STATUS_ID', 'OPPORTUNITY', 'CURRENCY_ID', 'ASSIGNED_BY_ID'],
start: 0,
},
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('Quotes on this page:', result.length, 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 fetchQuoteList() {
try {
// Initialize the SDK inside a Bitrix24 frame
const $b24 = await B24Js.initializeB24Frame()
// crm.quote.list returns a single page (max 50 records). For the whole result set
// use a list helper: $b24.actions.v2.callList.make() returns every record as one
// array, $b24.actions.v2.fetchList.make() yields them in chunks (async generator).
// NOTE: the list helpers do not accept `order` (it is excluded from their params, so
// passing it is a TS error) — keep this call.make + `start` variant when sort matters.
const response = await $b24.actions.v2.call.make({
method: 'crm.quote.list',
params: {
order: { STATUS_ID: 'ASC', ID: 'ASC' },
filter: { '=COMPANY_ID': 1, '=STATUS_ID': 'SENT' },
select: ['ID', 'TITLE', 'STATUS_ID', 'OPPORTUNITY', 'CURRENCY_ID', 'ASSIGNED_BY_ID'],
start: 0,
},
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('Quotes on this page:', result.length, result)
} catch (error) {
// Thrown on transport or SDK failures (AjaxError, SdkError, etc.)
console.error(error)
}
}
document.addEventListener('DOMContentLoaded', fetchQuoteList)
</script>
try {
$response = $b24Service
->core
->call(
'crm.quote.list',
[
'order' => [
'STATUS_ID' => 'ASC',
'ID' => 'ASC',
],
'filter' => [
'=COMPANY_ID' => 1,
'=STATUS_ID' => 'SENT',
],
'select' => [
'ID',
'TITLE',
'STATUS_ID',
'OPPORTUNITY',
'CURRENCY_ID',
'ASSIGNED_BY_ID',
],
]
);
$result = $response
->getResponseData()
->getResult();
echo '<pre>';
print_r($result);
echo '</pre>';
} catch (Throwable $e) {
error_log($e->getMessage());
echo 'Error fetching quote list: ' . $e->getMessage();
}
BX24.callMethod(
'crm.quote.list',
{
order: { STATUS_ID: 'ASC', ID: 'ASC' },
filter: { '=COMPANY_ID': 1, '=STATUS_ID': 'SENT' },
select: ['ID', 'TITLE', 'STATUS_ID', 'OPPORTUNITY', 'CURRENCY_ID', 'ASSIGNED_BY_ID'],
},
(result) => {
result.error()
? console.error(result.error())
: console.info(result.data())
;
},
);
require_once('crest.php');
$result = CRest::call(
'crm.quote.list',
[
'order' => [
'STATUS_ID' => 'ASC',
'ID' => 'ASC',
],
'filter' => [
'=COMPANY_ID' => 1,
'=STATUS_ID' => 'SENT',
],
'select' => [
'ID',
'TITLE',
'STATUS_ID',
'OPPORTUNITY',
'CURRENCY_ID',
'ASSIGNED_BY_ID',
],
]
);
echo '<PRE>';
print_r($result);
echo '</PRE>';
// client и ctx уже созданы — см. раздел «SDK для Go»
res, err := client.Core().Call(ctx, "crm.quote.list", b24.Params{
"order": b24.Params{
"STATUS_ID": "ASC",
"ID": "ASC",
},
"filter": b24.Params{
"=COMPANY_ID": 1,
"=STATUS_ID": "SENT",
},
"select": []string{"ID", "TITLE", "STATUS_ID", "OPPORTUNITY", "CURRENCY_ID", "ASSIGNED_BY_ID"},
}, b24.WithIdempotent())
if err != nil {
return fmt.Errorf("crm.quote.list: %w", err)
}
var items []struct {
ID b24.ID `json:"ID"`
Title string `json:"TITLE"`
StatusID string `json:"STATUS_ID"`
Opportunity string `json:"OPPORTUNITY"`
CurrencyID string `json:"CURRENCY_ID"`
AssignedByID b24.ID `json:"ASSIGNED_BY_ID"`
}
if err := json.Unmarshal(res.Result, &items); err != nil {
return fmt.Errorf("разбор ответа: %w", err)
}
for _, it := range items {
fmt.Println(it.ID, it.Title)
}
// Total и Next заполняют списочные методы; для полного
// обхода списка есть client.Core().Pages и Scan.
if res.Total != nil {
fmt.Println("всего:", *res.Total)
}
Ответ
HTTP-статус: 200
{
"result": [
{
"ID": "9",
"TITLE": "Последняя версия нашего продукта",
"STATUS_ID": "SENT",
"OPPORTUNITY": "45000.00",
"CURRENCY_ID": "RUB",
"ASSIGNED_BY_ID": "7"
},
{
"ID": "43",
"TITLE": "КП на поставку мебели",
"STATUS_ID": "SENT",
"OPPORTUNITY": "150000.00",
"CURRENCY_ID": "RUB",
"ASSIGNED_BY_ID": "1"
}
],
"total": 2,
"time": {
"start": 1773413037,
"finish": 1773413037.105712,
"duration": 0.1057119369506836,
"processing": 0,
"date_start": "2026-03-13T17:43:57+03:00",
"date_finish": "2026-03-13T17:43:57+03:00",
"operating_reset_at": 1773413637,
"operating": 0
}
}
Возвращаемые данные
result
object[]
Массив коммерческих предложений. Состав полей зависит от параметра select
total
integer
Общее количество найденных записей
next
integer
Значение для параметра start в следующем запросе.
Параметр next возвращается, если количество элементов в выборке больше 50
time
time
Информация о времени выполнения запроса
Обработка ошибок
HTTP-статус: 400
{
"error": "",
"error_description": "Access denied."
}
| Код | Описание | Значение |
|---|---|---|
| — | Parameter 'order' must be array. |
В order передан не объект |
| — | Parameter 'filter' must be array. |
В filter передан не объект |
| — | Access denied. |
У пользователя нет прав на чтение коммерческих предложений |
| — | Failed to get list. General error. |
Общая ошибка выполнения запроса |

