В этой статье мы рассмотрим, как автоматически установить картинку раздела на основе товара в CMS 1С-Битрикс. Это полезно, если нужно связать разделы с изображениями товаров и автоматически их обновлять.

Код:
\Bitrix\Main\Loader::includeModule('iblock');
$arRes = CIBlockSection::GetList(
['SORT' => 'ASC'],
[
'IBLOCK_ID' => 17,
'PICTURE' => false,
],
true,
[
'ID',
'IBLOCK_ID',
'NAME',
]
);
while ($arSection = $arRes->GetNext()) {
var_dump($arSection);
$res = CIBlockElement::getlist(
["SORT" => "ASC"],
[
"IBLOCK_ID" => 17,
'ACTIVE' => 'Y',
'!PREVIEW_PICTURE' => false,
'SECTION_ID' => $arSection['ID'],
'INCLUDE_SUBSECTIONS' => 'Y'
],
false,
false,
["ID", "NAME", "PREVIEW_PICTURE"]
);
$arElement = $res->GetNext();
var_dump($arElement);
$arFile = CFile::MakeFileArray($arElement["PREVIEW_PICTURE"]);
var_dump($arFile);
$sec = new CIBlockSection;
$sec->Update($arSection['ID'], ['PICTURE' => $arFile]);
}
Описание работы кода:
Этот скрипт предназначен для того, чтобы автоматически установить картинку для раздела в 1С-Битрикс на основе картинки первого товара в этом разделе или его подразделах. Рассмотрим каждый шаг этого кода.
1. Подключение модуля "iblock":
\Bitrix\Main\Loader::includeModule('iblock');
Этот код подключает необходимый модуль `iblock`, который предоставляет функции для работы с инфоблоками в Битрикс. Без этого модуля функции для работы с инфоблоками (такие как `CIBlockSection` и `CIBlockElement`) не будут доступны.
2. Получение разделов инфоблока без картинок:
$arRes = CIBlockSection::GetList(
['SORT' => 'ASC'],
[
'IBLOCK_ID' => 17,
'PICTURE' => false,
],
true,
[
'ID',
'IBLOCK_ID',
'NAME',
]
);
Здесь происходит выборка всех разделов из инфоблока с ID `17`, у которых еще не установлена картинка (параметр `PICTURE` равен `false`). Сортировка разделов идет по полю `SORT` в порядке возрастания. В результате переменная `$arRes` будет содержать все разделы, которые необходимо обработать.
3. Перебор разделов и поиск товаров:
while ($arSection = $arRes->GetNext()) {
var_dump($arSection);
Мы начинаем цикл, который перебирает каждый раздел, возвращаемый запросом. На каждой итерации переменная `$arSection` будет содержать информацию о текущем разделе.
4. Поиск товаров в разделе:
$res = CIBlockElement::getlist(
["SORT" => "ASC"],
[
"IBLOCK_ID" => 17,
'ACTIVE' => 'Y',
'!PREVIEW_PICTURE' => false,
'SECTION_ID' => $arSection['ID'],
'INCLUDE_SUBSECTIONS' => 'Y'
],
false,
false,
["ID", "NAME", "PREVIEW_PICTURE"]
);
Для каждого раздела выполняется запрос на поиск товаров (элементов инфоблока) в этом разделе и его подразделах. Параметр `'INCLUDE_SUBSECTIONS' => 'Y'` позволяет искать товары и в подразделах текущего раздела. Также фильтруются товары, у которых нет картинки (по полю `PREVIEW_PICTURE`).
5. Получение первого найденного товара:
$arElement = $res->GetNext();
var_dump($arElement);
Из всех товаров, которые были найдены, мы берем первый (через `GetNext()`), и в переменной `$arElement` будет содержаться информация о товаре, включая его картинку (`PREVIEW_PICTURE`).
6. Подготовка картинки:
$arFile = CFile::MakeFileArray($arElement["PREVIEW_PICTURE"]);
var_dump($arFile);
Если у товара есть картинка, то с помощью функции `CFile::MakeFileArray` эта картинка преобразуется в формат, который можно использовать для установки в раздел. В переменной `$arFile` будет храниться готовый массив, содержащий данные о файле изображения.
7. Обновление картинки раздела:
$sec = new CIBlockSection;
$sec->Update($arSection['ID'], ['PICTURE' => $arFile]);
В этом шаге мы создаем объект класса `CIBlockSection` и с помощью метода `Update` устанавливаем картинку раздела (`PICTURE`) на картинку товара, найденного в предыдущем шаге.
Заключение:
Этот код позволяет автоматически обновить картинку раздела инфоблока в 1С-Битрикс, присвоив ее изображению одного из товаров, который находится в этом разделе или его подразделах. Это полезно, если нужно связать разделы с изображениями товаров и автоматически их обновлять. Такой подход также сокращает время на ручное обновление картинок, что особенно важно при большом количестве разделов и товаров.