Настройка альтернативных текстов для изображений 1С-Битрикс
Пустой alt — это не просто проблема доступности. Это SEO-потеря: Google использует alt-текст как текстовый сигнал для ранжирования изображений в поиске. Интернет-магазин с тысячей товаров, у которых alt либо пустой, либо равен «image.jpg» — это тысяча пропущенных точек входа из Google Images. В Битриксе alt-тексты не заполняются автоматически нигде в стандартных компонентах.
Где хранится alt в инфоблоке
Битрикс хранит alt-текст изображения в таблице b_file — поле DESCRIPTION. Это поле заполняется в административной части при загрузке файла. Также для свойств типа F есть поле DESCRIPTION в b_iblock_element_property — это подпись к конкретному использованию изображения в элементе, независимо от подписи в b_file.
Приоритет при выводе: если у свойства элемента есть DESCRIPTION — использовать его; если нет — взять DESCRIPTION из b_file; если и там пусто — сгенерировать из названия товара.
В шаблоне компонента:
$fileId = $arResult['DETAIL_PICTURE']['ID'];
$fileData = \CFile::GetFileArray($fileId);
$alt = '';
// Приоритет 1: описание свойства элемента
if (!empty($arResult['PROPERTIES']['DETAIL_PICTURE']['DESCRIPTION'])) {
$alt = $arResult['PROPERTIES']['DETAIL_PICTURE']['DESCRIPTION'];
}
// Приоритет 2: описание файла
elseif (!empty($fileData['DESCRIPTION'])) {
$alt = $fileData['DESCRIPTION'];
}
// Приоритет 3: название товара
else {
$alt = $arResult['NAME'];
}
$alt = htmlspecialcharsEx($alt);
Массовое заполнение alt для существующих товаров
Если магазин работает несколько лет и тысячи изображений без alt — нужен скрипт массового заполнения. Логика: пройти все элементы инфоблока, для каждого взять DETAIL_PICTURE и MORE_PHOTO, проверить DESCRIPTION в b_file, при пустом — заполнить из названия элемента.
Скрипт запускается агентом Битрикса или через CLI:
$res = \CIBlockElement::GetList(
['ID' => 'ASC'],
['IBLOCK_ID' => CATALOG_IBLOCK_ID],
false,
['nTopCount' => 100, 'iNumPage' => $page],
['ID', 'NAME', 'DETAIL_PICTURE']
);
while ($el = $res->GetNextElement()) {
$fields = $el->GetFields();
if (empty($fields['DETAIL_PICTURE'])) continue;
$fileId = $fields['DETAIL_PICTURE'];
$fileData = \CFile::GetFileArray($fileId);
if (empty($fileData['DESCRIPTION'])) {
$DB->Query("UPDATE b_file SET DESCRIPTION = '" .
$DB->ForSql($fields['NAME']) .
"' WHERE ID = " . (int)$fileId);
}
}
Прямой UPDATE в b_file быстрее, чем CFile::Update() — тот сбрасывает кеш по каждому файлу отдельно.
Alt для изображений в инфоблоке новостей и статей
Для изображений, вставленных через TinyMCE в поле DETAIL_TEXT, alt заполняется непосредственно в редакторе. Проблема: если контент-менеджеры игнорируют поле alt в диалоге вставки изображения, картинки получают пустой alt="" или alt="image".
Решение на уровне редактора: в настройках TinyMCE (файл конфигурации в шаблоне) добавить обязательность поля alt через кастомный плагин или через валидацию формы вставки. Другой подход — постобработка HTML при сохранении через обработчик OnBeforeIBlockElementUpdate: парсить DETAIL_TEXT через DOMDocument, находить <img> без alt и подставлять заголовок статьи.
Декоративные изображения
Иконки, разделители и декоративные фоновые элементы должны иметь пустой alt="" — это намеренно пустой атрибут, сигнализирующий screen reader игнорировать изображение. Ошибка — вообще не указывать alt (нарушение WCAG 1.1.1) или указывать описательный текст для декора (лишний шум для assistive technology). В шаблонах Битрикса иконки часто выводятся через <img> — стоит заменить их на inline SVG с aria-hidden="true" или добавить явный alt="".







