Запуск БП при обновлении

Назначаем в настройках бизнес процесса запуск при обновлении сущности. Открываем список сущностей, выбираем нужные, и обновляем их — например, переключаем "сделать доступным для всех" = да, а потом обратно.

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

Скрипт Python через вебхуки

Это мое решение, набросанное на коленке, но рабочее — а работает, не трогай 😅. Если вы с кодом ни разу не работали и это все кажется темным лесом — ничего сложного нет, дам исчерпывающие инструкции.

Принцип простой — создаем входящий вебхук, который будет принимать наши запросы на запуск бизнес-процесса. Затем указываем url этого вебхука в переменной webhook_url в скрипте. При запуске скрипта он запросит ввести список id сущностей через запятую, выбрать тип сущности, и указать ID бизнес-процесса (можно посмотреть в url адресе на странице редактирования БП в Битрикс).

Потом запустится цикл по указанным сущностям - остается только ждать. В облачной версии Битрикса есть ограничение на 2 входящих вебхука в секунду, которое после 50 нарушений приведет к блокировке. Поэтому установлено ограничение на 1 запрос в 0.7 секунды, чтобы избежать таких казусов.

# Скрипт запуска бизнес-процесса по сущностям Битрикс24

import requests
import time

# Время сна по умолчанию - ограничение в облаке 2 запроса в секунду
time_sleep = 0.7 
# URL вебхука формата https://портал.bitrix24.ru/rest/idпользователя/ключвебхука/
webhook_url = ''

id_list_str = input('Введите ID сущностей через запятую: ')
type_doc = int(input('Выберите тип сущности (1 - компании, 2 - контакты, 3 - сделки): '))

if type_doc == 1:
    crm_doc = 'Company'
elif type_doc == 3:
    crm_doc = 'Deal'
elif type_doc == 2:
    crm_doc = 'Contact'
else:
    print('Указан неверный тип сущности CRM')
    time.sleep(15)
    exit

bp_id = int(input('Введите ID процесса: '))

id_list = id_list_str.split(', ')
count = 0
count_main = len(id_list)

for company_id in id_list:
    while True:
        try:
            response = requests.get(webhook_url + 'bizproc.workflow.start.json?TEMPLATE_ID=' + str(bp_id) + '&DOCUMENT_ID[0]=crm&DOCUMENT_ID[1]=CCrmDocument' + crm_doc + '&DOCUMENT_ID[2]=' + crm_doc.upper() + '_' + str(company_id))
            time.sleep(time_sleep)
            count = count + 1

            # print(response.content)
            if 'error' in str(response.content):
                print(f'{str(count)} из {str(count_main)} - ID {str(company_id)} - ERROR')
            else:
                print(f'{str(count)} из {str(count_main)} - ID {str(company_id)} - OK')

            break
        except:
            print('Ошибка, жду 10 секунд и пробую снова')
            time.sleep(10)

input("Нажмите Enter, чтобы завершить.")

Чтобы воспользоваться скриптом, установите у себя Python и сохраните код в файл с расширением .py. Не забудьте указать актуальный адрес для входящих вебхуков. Запускайте скрипт и вводите нужные данные в консоли.