В вашем случае, если объект, получаемый из $event->getParameters()['object'], не содержит значений полей, то, к сожалению, вам действительно придется делать дополнительный запрос к базе данных для получения нужных данных. Однако, есть несколько способов оптимизировать этот процесс.
Проверка содержимого объекта: Убедитесь, что объект действительно не содержит значений полей. Возможно, вы неправильно интерпретируете содержимое объекта.
Использование событий ORM: Некоторые ORM-системы предоставляют более удобные способы работы с событиями. Например, в некоторых системах можно подписаться на события до и после выполнения операций, что может позволить вам получить доступ к нужным данным без дополнительных запросов.
Кэширование: Если вы часто выполняете такие операции, возможно, имеет смысл кэшировать результаты запросов, чтобы уменьшить нагрузку на базу данных.
Вот пример, как можно проверить содержимое объекта и, если он действительно не содержит значений полей, выполнить дополнительный запрос:
class CertTable extends DataManager
{
public static function OnBeforeDelete(Event $event)
{
$id = $event->getParameter('id');
$object = $event->getParameter('object');
// Проверяем, содержит ли объект значения полей
if ($object && $object->get('FILE_ID')) {
$fid = $object->get('FILE_ID');
} else {
// Если объект не содержит значений полей, делаем дополнительный запрос
$item = self::getByPrimary($id)->fetchObject();
$fid = $item->get('FILE_ID');
}
// Удаляем файл, если FILE_ID найден
if ($fid) {
\CFile::Delete($fid);
}
}
}
Этот код сначала проверяет, содержит ли объект значения полей. Если да, то использует их. Если нет, то выполняет дополнительный запрос к базе данных.
Если вы используете Bitrix ORM, то, к сожалению, в текущей версии действительно может потребоваться дополнительный запрос для получения значений полей. В этом случае, ваша реализация с дополнительным запросом не является избыточной, а скорее необходимой мерой.