@EvgenyJozef3000

Как лучше всего оптимизировать работу циклов с перебором товаров инфоблоков 1C-Bitrix?

Добрый день. Имеется следующий код: https://pastebin.com/ia2Qw8bN
Суть этого кода - перебираем товары из 3-х инфоблоков [ELKO, Treolan и OCS], объединяем их в единый инфоблок [Market].
В каждом из циклов добавляем товар, если его нет в системе (строка - 115), иначе обновляем свойства товара (строка - 118), строки кода предоставил для перебора товаров инфоблока ELKO, остальные циклы практически одинаковые. Свойства товаров записаны в переменную $arLoadProductArray.
Перейдём плавно к моей проблеме. Обратим внимание на самодельную функцию searchElementArr и переменные $articul и $search_id. Именно они используются в условии и функции searchElementArr. Более конкретно - я ранее говорил, что на строке 115 (для ELKO) мы добавляем товаров в случае, если его нет в системе, чтобы это проверить, мы обращаемся к переменной $search_id, которая является вызовом функции searchElementArr - она ищет id товара в системе Bitrix по следующим параметрами ("КОД_СВОЙСТВА_ПО_КОТОРОМУ_ИЩЕМ", "ЗНАЧЕНИЕ_СВОЙСТВА", "МАССИВ_ГДЕ_ИЩЕМ"). Во всех циклах кодом свойства, в котором ищем, является "65", значение свойства - артикул, который в зависимости от цикла (инфоблока) меняется, то бишь артикул берётся из того или иного инфоблока (который перебираем) и наконец массивом, где ищем эти артикулы, является $marketArr - выборка всех товаров из инфоблока Market. Запрос на выборку элементов в моём коде происходит один раз (строка - 52). При этом в каждом цикле у меня идёт добавление товаров и по идее нужно обновлять каждый раз массив $marketArr (делать запрос на выборку), чтобы производить корректно поиск в нём артикулов (так как мы не знаем данных о новодобавленных товарах, потому что массив статичный), но проблема в том, что при каждом запросе на выборку идёт запрос в базу данных, чтобы получить заветные элементы из инфоблока.
Я данную проблему решил следующим образом - так как массив $marketArr статичный, то для обновления массив я при каждом добавлении товара: c072b299c7.png я добавляю данный товар и в массив $marketArr функцией array_push. Где условие на то, что артикула такого не нашлось я записываю как бы изменение товара в массиве: 929ac8b76d.png , где сперва перебираю массив $marketArr, ищу элемент с найденным ID товара (переменная $search_id), удалять данный товар из массива (unset), записываю новый товар в массив функцией array_push.
Примеры массивов 2f568e642b.png ниже:
Один из товаров в массиве ELKO
Array
(
    [IBLOCK_NAME] => ELKO
    [ID] => 512552
    [NAME] => Ноутбук X540MB PMD-N5000 15" 4GB 500GB X540MB-GQ079 ASUS
    [IBLOCK_SECTION_ID] => 10953
    [PROPERTY_22_VALUE] => 90NB0IQ1-M01110               
    [PROPERTY_22_VALUE_ID] => 10820458
    [PROPERTY_3_VALUE] => 
    [PROPERTY_3_VALUE_ID] => 
    [PROPERTY_31_VALUE] => 
    [PROPERTY_31_VALUE_ID] => 
    [PROPERTY_25_VALUE] => 23770
    [PROPERTY_25_VALUE_ID] => 10820460
    [PROPERTY_27_VALUE] => 2
    [PROPERTY_27_VALUE_ID] => 10820461
    [PROPERTY_19_VALUE] => 1266489
    [PROPERTY_19_VALUE_ID] => 10820455
    [PROPERTY_7_VALUE] => 
    [PROPERTY_7_VALUE_ID] => 
    [PROPERTY_1_VALUE] => 
    [PROPERTY_1_VALUE_ID] => 
    [PROPERTY_39_VALUE] => 
    [PROPERTY_39_VALUE_ID] => 
    [PROPERTY_30_VALUE] => 
    [PROPERTY_30_VALUE_ID] => 
    [PROPERTY_65_VALUE] => 
    [PROPERTY_65_VALUE_ID] => 
)

Один из товаров в массиве Treolan
Array
(
    [IBLOCK_NAME] => Treolan
    [ID] => 351947
    [NAME] => ASUS Vivobook XMAS X540MB-GQ079 Pentium N5000/4Gb/500Gb HDD/15.6"HD (1366x768)/NVIDIA GeForce MX110 2Gb/DVD-RW/WiFi/BT/Cam/ENDLESS/2Kg/Black
    [IBLOCK_SECTION_ID] => 11248
    [PROPERTY_22_VALUE] => 
    [PROPERTY_22_VALUE_ID] => 
    [PROPERTY_3_VALUE] => 90NB0IQ1-M01110
    [PROPERTY_3_VALUE_ID] => 7147014
    [PROPERTY_31_VALUE] => 
    [PROPERTY_31_VALUE_ID] => 
    [PROPERTY_25_VALUE] => 
    [PROPERTY_25_VALUE_ID] => 
    [PROPERTY_27_VALUE] => 
    [PROPERTY_27_VALUE_ID] => 
    [PROPERTY_19_VALUE] => 
    [PROPERTY_19_VALUE_ID] => 
    [PROPERTY_7_VALUE] => 24171.00
    [PROPERTY_7_VALUE_ID] => 7147018
    [PROPERTY_1_VALUE] => 053001/1894
    [PROPERTY_1_VALUE_ID] => 7147012
    [PROPERTY_39_VALUE] => 
    [PROPERTY_39_VALUE_ID] => 
    [PROPERTY_30_VALUE] => 
    [PROPERTY_30_VALUE_ID] => 
    [PROPERTY_65_VALUE] => 
    [PROPERTY_65_VALUE_ID] => 
)

Один из товаров в массиве OCS
Array
(
    [IBLOCK_NAME] => OCS
    [ID] => 480805
    [NAME] => Ноутбуки
    [IBLOCK_SECTION_ID] => 13165
    [PROPERTY_22_VALUE] => 
    [PROPERTY_22_VALUE_ID] => 
    [PROPERTY_3_VALUE] => 
    [PROPERTY_3_VALUE_ID] => 
    [PROPERTY_31_VALUE] => 90NB0IQ1-M01110
    [PROPERTY_31_VALUE_ID] => 10220466
    [PROPERTY_25_VALUE] => 
    [PROPERTY_25_VALUE_ID] => 
    [PROPERTY_27_VALUE] => 
    [PROPERTY_27_VALUE_ID] => 
    [PROPERTY_19_VALUE] => 
    [PROPERTY_19_VALUE_ID] => 
    [PROPERTY_7_VALUE] => 
    [PROPERTY_7_VALUE_ID] => 
    [PROPERTY_1_VALUE] => 
    [PROPERTY_1_VALUE_ID] => 
    [PROPERTY_39_VALUE] => 23095.000000000000
    [PROPERTY_39_VALUE_ID] => 10220472
    [PROPERTY_30_VALUE] => 1000497541
    [PROPERTY_30_VALUE_ID] => 10220465
    [PROPERTY_65_VALUE] => 
    [PROPERTY_65_VALUE_ID] => 
)

Данный 3 товаров из разных инфоблоков (ELKO, Treolan, OCS) имеют одинаковый артикул 90NB0IQ1-M01110.
Данные товары должны объединиться в единый и сохранится в итоговый инфоблок Market со следующей структурой в массиве $marketArr:
Товар в итоговом массиве Market
Array
(
    [ID] => КАКОЙ-ТО_ID_В_СИСТЕМЕ_BITRIX
    [NAME] => ИМЯ_ТОВАРА
    [IBLOCK_SECTION_ID] => ID_РАЗДЕЛА_К_КОТОРОМУ_ОТНОСИТСЯ_ТОВАР
    [PROPERTY_22_VALUE] => 90NB0IQ1-M01110               
    [PROPERTY_3_VALUE] => 90NB0IQ1-M01110
    [PROPERTY_31_VALUE] => 90NB0IQ1-M01110
    [PROPERTY_25_VALUE] => 23770
    [PROPERTY_27_VALUE] => 2
    [PROPERTY_19_VALUE] => 1266489
    [PROPERTY_7_VALUE] => 24171.00
    [PROPERTY_1_VALUE] => 053001/1894
    [PROPERTY_39_VALUE] => 23095.000000000000
    [PROPERTY_30_VALUE] => 1000497541
    [PROPERTY_65_VALUE] => 90NB0IQ1-M01110
)

Но в итоге, когда выполняется скрипт, товары не объединяются в один, а создаются друг под другом (то есть в итоге получается 3 товара в итоговом инфоблоке Market с разными свойствами):
9bad819ef9.png
Хотя моя модель с добавлением и изменением товара - не только идёт запись в БД, но и в массив $marketArr, работает верно. Вот код примера работы этой модели: https://pastebin.com/YQQNYVrS
Результат этого кода:
Arr1 | 
 Товар добавлен [art] => 546436456 
 Товар добавлен [art] => 7683435 

 Arr2 | 
 Товар изменён [art] => 546436456 
 Товар добавлен [art] => 76653834543283435 

 Arr3 | 
 Товар изменён [art] => 546436456 
 Товар добавлен [art] => 45435233 

 Итоговый масив Arr | 
Array
(
    [0] => Array
        (
            [ID] => 546436456
        )

    [1] => Array
        (
            [ID] => 7683435
        )

    [2] => Array
        (
            [ID] => 76653834543283435
        )

    [3] => Array
        (
            [ID] => 45435233
        )

)

То бишь сначала добавляется товар со свойством [art] => 546436456, а уже в следующих циклах, при нахождении данного [art] идёт изменение товара.
Почему же такого не происходит с товарами из инфоблоков (ELKO, OCS и Treolan), которые должны объединяться в один и идти в инфоблок Market. Повторюсь, на данный момент, товары не объединяются а каждый товар добавляется со своими свойствами.
  • Вопрос задан
  • 541 просмотр
Решения вопроса 2
alexyarik
@alexyarik
Битрикс разработчик
1) Выгружаете все ваши три инфоблока в xml файлы.
2) Пишите свой пользовательский скрипт загрузки товаров по xml
3) Загружаете по очереди каждый xml, на выходе получите все в одном инфоблоке.
Можно и стандартным импортом попробовать импортировать.
Ответ написан
Комментировать
w_the_h
@w_the_h
В примере, который ты указал, где объединяют в один массив из 3, нет добавления в базу в каждом из циклов!
Тебе просто надо создать готовый массив для добавления в базу. А после уже по этому циклу добавить его в сам Битрикс. А не разводить дублирование кода. Вот и все решение твоей проблемы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы