Введение
При разработке на коробочной версии Битрикс24 часто возникает необходимость программно обновить данные компании по её идентификатору. Это может потребоваться при синхронизации с внешними системами, массовом изменении полей, обработке событий или автоматизации бизнес-процессов. Основным и наиболее гибким методом для обновления информации о компании является объектный вызов CCrmCompany->Update().
Особенности объектного вызова
Ключевая особенность данного подхода — создание экземпляра класса \CCrmCompany с параметром, определяющим проверку прав:
$cCompany = new \CCrmCompany(false); // проверка прав отключена
Это делает метод незаменимым при служебных операциях и в агентах, где требуется обновление без оглядки на текущего пользователя.
| Способ вызова | Особенности |
|---|---|
new \CCrmCompany(false)->Update()
|
Объектный вызов, проверка прав отключена |
new \CCrmCompany(true)->Update()
|
Объектный вызов, проверка прав включена |
Проверка прав доступа
При создании экземпляра класса \CCrmCompany передается параметр $bCheckRight, который определяет, будет ли проверяться право доступа текущего пользователя на выполнение операции.
Значение $bCheckRight
|
Проверка прав | Результат |
|---|---|---|
false
|
❌ Отключена |
Метод Update() выполнит обновление без проверки прав, независимо от того, кто вызвал код
|
true
|
✅ Включена |
Метод Update() проверит, есть ли у текущего пользователя право на редактирование этой компании
|
Важно: текущий пользователь определяется по ключу CURRENT_USER в массиве $arOptions.
$arOptions = array(
"CURRENT_USER" => $userId, // ID пользователя, от имени которого выполняется действие
// ...
);
Рекомендация: для служебных скриптов, агентов и cron-задач используйте false. Для пользовательских сценариев (например, в компонентах) используйте true.
Параметры метода
Метод имеет следующую сигнатуру:
phppublic function Update($ID, $arFields, $bCompare = true, $bSendEvent = true, $arOptions = [])
Параметр $ID
Числовой идентификатор компании, которую необходимо обновить.
Параметр $arFields
Ассоциативный массив с полями компании и новыми значениями. Поддерживаются все стандартные поля и пользовательские поля (UF_CRM_*).
Пример:
php$поля_компании = [
'TITLE' => 'Новое название',
'UF_CRM_12345678' => 'Новое значение'
];
Параметр $bCompare
Логический параметр, определяющий, нужно ли сравнивать старые и новые значения:
| Значение | Описание |
|---|---|
true
|
Выполняется сравнение, в событиях передаются оба набора данных |
false
|
Сравнение не выполняется |
Параметр $bSendEvent
Логический параметр, определяющий, нужно ли запускать системные события:
| Значение | Описание |
|---|---|
true
|
События OnBeforeCrmCompanyUpdate и OnAfterCrmCompanyUpdate вызываются
|
false
|
События не вызываются |
Параметр $arOptions (ключевая особенность)
Массив с дополнительными настройками обновления:
php$arOptions = array(
'DISABLE_USER_FIELD_CHECK' => true, // отключает проверку UF-полей
"CURRENT_USER" => $userId, // ID пользователя (от имени которого обновление)
"ENABLE_SYSTEM_EVENTS" => true // разрешает системные события
);
Доступные опции в $arOptions:
| Опция | Тип | Описание |
|---|---|---|
CURRENT_USER
|
int | ID пользователя, от лица которого выполняется действие (влияет на проверку прав и историю) |
DISABLE_USER_FIELD_CHECK
|
bool |
Если true, отключает проверку и валидацию пользовательских полей
|
DISABLE_REQUIRED_USER_FIELD_CHECK
|
bool |
Если true, отключает проверку обязательности пользовательских полей (игнорируется, если DISABLE_USER_FIELD_CHECK = true)
|
ENABLE_SYSTEM_EVENTS
|
bool |
Если true, разрешает системные события
|
IS_SYSTEM_ACTION
|
bool |
Если true, не обновляет дату изменения и не записывает пользователя
|
REGISTER_SONET_EVENT
|
bool |
Если true, создает сообщение в ленте о изменении
|
ENABLE_DUP_INDEX_INVALIDATION
|
bool |
Если true, отмечает кеш дубликатов неактуальным
|
Практические примеры
Пример 1. Базовое обновление компании (без проверки прав)
php$userId = 1; // ID пользователя, от имени которого выполняется обновление
$cCompany = new \CCrmCompany(false); // проверка прав ОТКЛЮЧЕНА
$arOptions = array(
'DISABLE_USER_FIELD_CHECK' => true,
"CURRENT_USER" => $userId,
"ENABLE_SYSTEM_EVENTS" => true
);
$поля_компании = [
'TITLE' => 'ООО "Новый партнер"',
'ADDRESS' => 'г. Москва, ул. Ленина, д. 1'
];
$upRes = $cCompany->Update(123, $поля_компании, true, true, $arOptions);
if ($upRes) {
echo "Компания успешно обновлена";
} else {
echo "Ошибка: " . $cCompany->LAST_ERROR;
}
Пример 2. Обновление с проверкой прав
php$userId = 1; // ID пользователя, от имени которого выполняется обновление
$cCompany = new \CCrmCompany(true); // проверка прав ВКЛЮЧЕНА
$arOptions = array(
"CURRENT_USER" => $userId,
"ENABLE_SYSTEM_EVENTS" => true
);
$поля_компании = [
'TITLE' => 'Обновленное название'
];
$upRes = $cCompany->Update(123, $поля_компании, true, true, $arOptions);
if (!$upRes) {
echo "Ошибка: " . $cCompany->LAST_ERROR;
}
Пример 3. Обновление пользовательских полей
php$userId = 1;
$cCompany = new \CCrmCompany(false);
$arOptions = array(
'DISABLE_USER_FIELD_CHECK' => true, // обязательно для UF-полей
"CURRENT_USER" => $userId,
"ENABLE_SYSTEM_EVENTS" => true
);
$поля_компании = [
'UF_CRM_1617204193' => 'Новое значение текстового поля',
'UF_CRM_1617204194' => 100500,
'UF_CRM_1617204195' => ['значение1', 'значение2']
];
$upRes = $cCompany->Update(123, $поля_компании, true, true, $arOptions);
Пример 4. Системное обновление (без изменения даты и пользователя)
php$userId = 1;
$cCompany = new \CCrmCompany(false);
$arOptions = array(
'IS_SYSTEM_ACTION' => true, // не обновляет DATE_MODIFY и не записывает пользователя
'DISABLE_USER_FIELD_CHECK' => true,
"CURRENT_USER" => $userId,
"ENABLE_SYSTEM_EVENTS" => true
);
$поля_компании = [
'UF_CRM_SYSTEM_FIELD' => 'Системное значение'
];
$upRes = $cCompany->Update(123, $поля_компании, true, true, $arOptions);
Пример 5. Обновление без событий (для массовых операций)
php$userId = 1;
$cCompany = new \CCrmCompany(false);
$arOptions = array(
'DISABLE_USER_FIELD_CHECK' => true,
"CURRENT_USER" => $userId,
"ENABLE_SYSTEM_EVENTS" => false // отключаем события для скорости
);
$companies = [123, 456, 789];
$поля_компании = ['ASSIGNED_BY_ID' => 10];
foreach ($companies as $companyId) {
$cCompany->Update($companyId, $поля_компании, false, false, $arOptions);
}
Пример 6. Функция-обертка с выбором проверки прав
phpfunction updateCompany(int $companyId, array $fields, int $userId, bool $checkRights = false): array
{
$result = ['success' => false, 'error' => ''];
$cCompany = new \CCrmCompany($checkRights); // проверка прав по параметру
$arOptions = array(
'DISABLE_USER_FIELD_CHECK' => true,
"CURRENT_USER" => $userId,
"ENABLE_SYSTEM_EVENTS" => true
);
if ($cCompany->Update($companyId, $fields, true, true, $arOptions)) {
$result['success'] = true;
} else {
$result['error'] = $cCompany->LAST_ERROR;
}
return $result;
}
// Использование
$userId = 1;
$updateResult = updateCompany(123, ['TITLE' => 'Новое название'], $userId, false);
if ($updateResult['success']) {
echo "Успешно!";
} else {
echo "Ошибка: " . $updateResult['error'];
}
Сравнительная таблица: с проверкой прав и без
| Характеристика |
new CCrmCompany(false)->Update()
|
new CCrmCompany(true)->Update()
|
|---|---|---|
| Проверка прав | ❌ Отключена | ✅ Включена |
CURRENT_USER в $arOptions
|
Влияет на историю и события | Влияет на проверку прав, историю и события |
| Применение | Служебные скрипты, агенты, cron | Пользовательские компоненты, API-вызовы |
| Ошибка при недостатке прав | Не возникает | Возникает, обновление не выполняется |
Особенности и рекомендации
Проверка прав: Определяется при создании объекта new \CCrmCompany($bCheckRight). Для служебных операций используйте false, для пользовательских — true.
Параметр CURRENT_USER: Указывает, от имени какого пользователя выполняется обновление. Влияет на права (если $bCheckRight = true), историю изменений и события.
Параметр DISABLE_USER_FIELD_CHECK: При true система не проверяет корректность значений пользовательских полей. Полезно при массовых обновлениях, но осторожно — можно записать некорректные данные.
Параметр ENABLE_SYSTEM_EVENTS: При false отключаются все системные события. Используйте с осторожностью — могут сломаться бизнес-процессы.
Параметр IS_SYSTEM_ACTION: При true не обновляет дату изменения и не записывает пользователя. Полезно для служебных операций.
Проверка ошибок: Всегда проверяйте $upRes и используйте $cCompany->LAST_ERROR для диагностики.
Заключение
Объектный вызов CCrmCompany->Update() с явным указанием проверки прав при создании экземпляра — это наиболее гибкий способ обновления данных компании в коробочной версии Битрикс24. Его ключевые преимущества:
-
Контроль проверки прав через параметр
$bCheckRightпри создании объекта -
Гибкая настройка через массив
$arOptions(отключение проверки UF-полей, указание пользователя, управление событиями) -
Управление системными действиями через опции
IS_SYSTEM_ACTIONиENABLE_SYSTEM_EVENTS
Понимание этих параметров критически важно для разработчиков, работающих с массовыми операциями, служебными скриптами и сложными сценариями обновления.
