Как массово завершить бизнес-процессы с фильтром по дате
Scope:
bizprocКто может выполнять методы: администратор
Выберите инструмент для разработки с AI-агентом:
- используйте Битрикс24 Вайбкод, чтобы создать приложение для Битрикс24 по описанию задачи без знания языков программирования. Агент напишет код и разместит приложение на сервере без ручной настройки хостинга
- используйте MCP-сервер, чтобы разрабатывать интеграцию через REST API в своем проекте. Агент будет обращаться к официальной REST-документации
В процессе работы с Битрикс24 могут накапливаться зависшие бизнес-процессы или процессы, которые остаются в статусе «Выполняется» слишком долго и становятся неактуальными.
Чтобы массово завершить старые бизнес-процессы, последовательно выполним два метода:
- bizproc.workflow.instances — получим отфильтрованный список процессов
- bizproc.workflow.kill — завершим бизнес-процессы с удалением данных. Если нужно сохранить факт запуска бизнес-процесса, используйте метод bizproc.workflow.terminate. Оба метода вызываются одинаково
1. Получим список процессов
Используем метод bizproc.workflow.instances с фильтром:
<STARTED— укажем дату запуска с префиксом<, будут отобраны только те процессы, которые были запущены до этой даты
import { B24Hook } from '@bitrix24/b24jssdk'
const $b24 = B24Hook.fromWebhookUrl('https://your-domain.bitrix24.ru/rest/1/xxxxxxxxxxxxxxxx/')
const response = await $b24.actions.v2.call.make({
method: 'bizproc.workflow.instances',
params: {
filter: { '<STARTED': '2025-01-01T00:00:00Z' },
},
requestId: 'workflow-instances',
})
const instances = response.getData().result
<?php
// composer require bitrix24/b24phpsdk:"^3.0"
require_once 'vendor/autoload.php';
use Bitrix24\SDK\Services\ServiceBuilderFactory;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('b24');
$log->pushHandler(new StreamHandler('php://stdout'));
$b24 = (new ServiceBuilderFactory(new EventDispatcher(), $log))
->initFromWebhook('https://your-domain.bitrix24.ru/rest/1/xxxxxxxxxxxxxxxx/');
$instances = $b24->getBizProcScope()->workflow()->instances(
filter: ['<STARTED' => '2025-01-01T00:00:00Z']
)->getInstances();
from b24pysdk import BitrixWebhook, Client
token = BitrixWebhook(
domain="your-domain.bitrix24.com",
webhook_token="user_id/webhook_key",
)
client = Client(token)
response = client.bizproc.workflow.instances(
filter={
"<STARTED": "2025-01-01T00:00:00Z",
}
).response
В результате получим ID всех активных бизнес-процессов, запущенных до указанной даты.
{
"result": [
{
"ID": "660e559f34af10.95144732",
"MODIFIED": "2024-12-04T10:04:24+03:00",
"OWNED_UNTIL": null
},
{
"ID": "6639c7b59e9eb5.40607056",
"MODIFIED": "2024-12-04T09:52:40+03:00",
"OWNED_UNTIL": null
}
],
"total": 2,
}
2. Завершим бизнес-процессы
Используем метод bizproc.workflow.kill с параметром:
ID— идентификатор процесса, передаемID, полученный на шаге 1
const response = await $b24.actions.v2.call.make({
method: 'bizproc.workflow.kill',
params: { ID: '660e559f34af10.95144732' },
requestId: 'workflow-kill',
})
const isKilled = response.getData().result
$isKilled = $b24->getBizProcScope()->workflow()
->kill('660e559f34af10.95144732')
->isSuccess();
# ID процесса — строка, поэтому вызываем метод напрямую через token.call_method
# (типизированный client.bizproc.workflow.kill ожидает int)
response = token.call_method(
"bizproc.workflow.kill",
{"ID": "660e559f34af10.95144732"},
)
В результате получим true, удаление процесса прошло успешно. Если вы получили ошибку error, изучите описание возможных ошибок в документации метода bizproc.workflow.kill.
{
"result": true,
}
Пример кода
В примере все найденные процессы удаляются в цикле. При удалении большого объема данных возможны ограничения на выполнение запросов. Чтобы оптимизировать код под ваш объем работы, используйте рекомендации раздела Производительность.
// npm install @bitrix24/b24jssdk
import { B24Hook } from '@bitrix24/b24jssdk'
const $b24 = B24Hook.fromWebhookUrl('https://your-domain.bitrix24.ru/rest/1/xxxxxxxxxxxxxxxx/')
// Дату вводим в формате дд.мм.гггг аргументом: node kill.mjs 01.01.2025
const [day, month, year] = (process.argv[2] || '').split('.')
const isoDate = `${year}-${month}-${day}T00:00:00Z`
// callList сам обходит все страницы выборки; getData() возвращает массив элементов
const listResponse = await $b24.actions.v2.callList.make({
method: 'bizproc.workflow.instances',
params: { filter: { '<STARTED': isoDate }, select: ['ID'] },
requestId: 'workflow-instances',
})
const instances = listResponse.getData()
for (const instance of instances) {
const response = await $b24.actions.v2.call.make({
method: 'bizproc.workflow.kill',
params: { ID: instance.ID },
requestId: `kill-${instance.ID}`,
})
console.log(response.isSuccess
? `Процесс ${instance.ID} успешно удален.`
: `Ошибка при удалении процесса ${instance.ID}: ${response.getErrorMessages().join('; ')}`)
}
$b24.destroy()
<?php
// composer require bitrix24/b24phpsdk:"^3.0"
require_once 'vendor/autoload.php';
use Bitrix24\SDK\Services\ServiceBuilderFactory;
use Symfony\Component\EventDispatcher\EventDispatcher;
use Monolog\Logger;
use Monolog\Handler\StreamHandler;
$log = new Logger('b24');
$log->pushHandler(new StreamHandler('php://stdout'));
$b24 = (new ServiceBuilderFactory(new EventDispatcher(), $log))
->initFromWebhook('https://your-domain.bitrix24.ru/rest/1/xxxxxxxxxxxxxxxx/');
$userDateInput = readline('Введите дату в формате дд.мм.гггг: ');
[$day, $month, $year] = explode('.', $userDateInput);
$isoDate = "{$year}-{$month}-{$day}T00:00:00Z";
// Метод instances() возвращает одну страницу. Для постраничного обхода
// вызываем метод напрямую через ядро и читаем смещение следующей страницы.
$start = 0;
do {
$response = $b24->core->call('bizproc.workflow.instances', [
'filter' => ['<STARTED' => $isoDate],
'start' => $start,
]);
foreach ($response->getResponseData()->getResult() as $instance) {
$isKilled = $b24->getBizProcScope()->workflow()->kill($instance['ID'])->isSuccess();
echo $isKilled
? "Процесс {$instance['ID']} успешно удален.\n"
: "Ошибка при удалении процесса {$instance['ID']}\n";
}
$start = $response->getResponseData()->getPagination()->getNextItem();
} while ($start !== null);
from b24pysdk import BitrixWebhook, Client
from b24pysdk.errors import BitrixAPIError
user_date_input = input("Введите дату в формате дд.мм.гггг: ")
day, month, year = user_date_input.split(".")
iso_date = f"{year}-{month}-{day}T00:00:00Z"
token = BitrixWebhook(
domain="your-domain.bitrix24.com",
webhook_token="user_id/webhook_key",
)
client = Client(token)
start = None
while True:
kwargs = {"filter": {"<STARTED": iso_date}}
if start is not None:
kwargs["start"] = start
response = client.bizproc.workflow.instances(**kwargs).response
instances = response.result or []
for instance in instances:
instance_id = instance["ID"]
try:
token.call_method("bizproc.workflow.kill", {"ID": instance_id})
except BitrixAPIError as error:
print(f"Ошибка при удалении процесса {instance_id}: {error}")
else:
print(f"Процесс {instance_id} успешно удален.")
if response.next is None:
break
start = response.next