Система управления сайтом «1С-Битрикс» предоставляет широкий набор событий, которые позволяют разработчикам вмешиваться в стандартный процесс работы и расширять функционал.

Одно из таких событий — OnBeforeIBlockElementAdd.
Оно вызывается при добавлении нового элемента в инфоблок через метод CIBlockElement::Add
до фактической записи данных в базу.
Это даёт возможность:
- отменить вставку элемента;
- изменить поля элемента;
- проверить корректность вводимых данных и многое другое.
2. Описание события
Сигнатура события:
bool функция-обработчик(
array &arParams
);
- arParams – массив, содержащий параметры добавляемого элемента
(на практике чаще всего используется
$arFields
, передаваемый по ссылке). - Возвращаемое значение: функция-обработчик должна возвращать булево значение
(
true
илиfalse
).true
– продолжить добавление элемента;false
– отменить добавление элемента.
Событие OnBeforeIBlockElementAdd вызывается в момент вызова метода CIBlockElement::Add()
.
Если в ходе обработки вернётся false
, то система прервёт добавление элемента и сформирует исключение (или же вернёт ошибку,
если обработчик предусмотрел соответствующее сообщение).
3. Подключение обработчика
Существует несколько способов подключить обработчик к событию OnBeforeIBlockElementAdd. Наиболее распространённые из них:
- Файл
init.php
:- Расположен в папке
/bitrix/php_interface/
. - В этом файле можно регистрировать обработчики для различных событий.
- Расположен в папке
- Использование модуля “Проактивная защита” (делегирование в админке):
- В административном разделе существует отдельный интерфейс подключения обработчиков (реже используется,
т.к. более универсальным и гибким считается способ через
init.php
).
- В административном разделе существует отдельный интерфейс подключения обработчиков (реже используется,
т.к. более универсальным и гибким считается способ через
Ниже рассмотрим пример с использованием файла init.php
.
<?php
// /bitrix/php_interface/init.php
AddEventHandler(
"iblock", // Имя модуля
"OnBeforeIBlockElementAdd", // Название события
["MyClass", "OnBeforeIBlockElementAddHandler"] // Метод обработки
);
class MyClass
{
public static function OnBeforeIBlockElementAddHandler(&$arFields)
{
// Логика проверки или изменения полей
// Вернуть true, если всё хорошо, или false, если нужно отменить вставку.
return true;
}
}
?>
В примере выше:
- Указываем модуль
iblock
, поскольку событие относится именно к инфоблокам. - Название события —
OnBeforeIBlockElementAdd
. - Передаём в качестве обработчика статический метод класса
MyClass
.
4. Примеры использования
4.1. Проверка обязательных полей
Предположим, в элементе инфоблока необходимо обязательно заполнить свойство «Телефон» (код свойства — PHONE
).
Если оно не заполнено, добавление элемента нужно отменить.
public static function OnBeforeIBlockElementAddHandler(&$arFields)
{
// Проверяем наличие кода свойства PHONE среди свойств
if (empty($arFields["PROPERTY_VALUES"]["PHONE"])) {
global $APPLICATION;
// Формируем текст ошибки
$APPLICATION->throwException("Поле «Телефон» не может быть пустым.");
return false; // Отменяем добавление
}
return true; // Продолжаем добавление
}
4.2. Автоматическая генерация символьного кода
Если требуется автоматически генерировать символьный код (поле CODE
в инфоблоке),
можно добавить следующую логику:
public static function OnBeforeIBlockElementAddHandler(&$arFields)
{
// Если CODE не заполнен – генерируем
if (empty($arFields["CODE"])) {
$arFields["CODE"] = CUtil::translit(
$arFields["NAME"],
"ru",
[
"replace_space" => "-",
"replace_other" => "-",
"max_len" => 100,
]
);
}
return true;
}
В примере мы используем метод CUtil::translit()
для транслитерации названия элемента ($arFields["NAME"]
)
в символьный код. Таким образом, при добавлении элемента в инфоблок будет автоматически выставляться поле CODE
,
если оно изначально пустое.
4.3. Проверка дубликатов
Если необходимо проверять, существует ли уже элемент с таким же названием (NAME
)
в том же инфоблоке, то можно:
public static function OnBeforeIBlockElementAddHandler(&$arFields)
{
$iblockId = (int)$arFields["IBLOCK_ID"];
$elementName = trim($arFields["NAME"]);
$existingElement = CIBlockElement::GetList(
[],
["IBLOCK_ID" => $iblockId, "NAME" => $elementName],
false,
false,
["ID"]
)->Fetch();
if ($existingElement) {
global $APPLICATION;
$APPLICATION->throwException("Элемент с таким названием уже существует.");
return false;
}
return true;
}
Здесь перед добавлением элемент проверяется на существование полного совпадения имени в заданном инфоблоке.
Если дубликат найден, возвращаем false
и показываем сообщение об ошибке пользователю.
5. Заключение
Событие OnBeforeIBlockElementAdd — мощный инструмент в 1С-Битрикс, который позволяет разработчикам контролировать процесс добавления элементов и управлять данными. С его помощью можно:
- проверять корректность заполняемых полей;
- переопределять или дополнять значения до внесения в базу;
- отменять добавление по определённым условиям.
Подключение и использование обработчиков предоставляет гибкость и контроль над логикой работы сайта, повышая качество и надёжность реализуемых решений.
Дополнительные материалы
Метатеги
title:
OnBeforeIBlockElementAdd: как использовать событие в 1С-Битрикс для контроля данных в инфоблоках
description:
Узнайте, как использовать событие OnBeforeIBlockElementAdd в 1С-Битрикс для проверки и изменения полей элемента до внесения в базу. Приведены примеры кода и рекомендации по подключению обработчика.
keywords:
1С-Битрикс, Bitrix, OnBeforeIBlockElementAdd, инфоблок, обработчик, событие, проверка, добавление элемента, CIBlockElement, init.php