по XML_ID, если сильном много запросов подряд? На сайте есть импорт, в котором каждый элемент ищется по XML_ID и обновляется. Но с какого-то элемента - порядка 6000+ CIBlockElement::GetList возвращает пустоту
Рекурсивно AJAXом долбить?
Что именно рекурсивно ajax'ом? Рекурсии точно нет никакой
Ну получать callback и в нём обратно вызывать запрос
Возможно ваша проблема происходит из-за того, что заканчивается время исполнения PHP
Нет, в лог-то он в этом момент пишет, дальнейшая логика отрабатывает, но условие по результатам CIBlockElement::GetList не срабатывает ,потому что там пусто. Импорт свой
Пустоту или false? Вообще нормальный импорт разбивают по шагам. Рекомендации "перейти на d7" выкинуть и забыть.
Пустоту, то есть 0 найденных элементов. Да, видимо придется. Изначально элементов для обмена было не много, поэтому деления на шаги не делали, сейчас видимо придется. Только суть в том, что 1С для обмена не обращается к сайту никак, а просто выгружает файл в папку. Поэтому придется использовать какую-то свою идею для шагов, возможно, через агенты
Так, вот теперь стало интересно. Вы в импорте количество элементов считаете или элемент ищите по XML_ID? Насчет файла - ну, распарсите его во временную таблицу, дальше по шагам ее.
Элемент по XML_ID. И вот такое условие по результату не работает if($ob = $res->GetNext()) {}
Тогда почему 0? И фильтр покажите.
Потому что пробовала выводить количество для теста. Фильтр вообще простой $arSelect = Array("ID", "NAME", "ACTIVE"); $arFilter = Array("IBLOCK_ID"=>self::IBLOCK_STOREROOM_ID, "XML_ID"=>$id); $res = CIBlockElement::GetList(Array(), $arFilter, false, false, $arSelect); Он работает до какого-то элемента, а потом в результатах пусто. Если этот же фильтр с теми же данными просто скопировать в тестовый файл - всё нормально находит. А именно в цикле работы над данными импорта в какой-то момент перестает выдавать результат
Нельзя с базой так жестоко (я про фильтр). Замените ключ "XML_ID" на "=XML_ID" - сейчас у вас поиск по подстроке, что ухудшает работу с ростом числа элементов. В оправдание могу сказать, что вы повторили мою ошибку 15-летней примерно давности. Только я Оракл валить пытался.
И GetNext вам тоже не нужен. Используйте Fetch
Спасибо за подсказки в оптимизации работы, но в целом по проблеме не помогло. Как-то через раз находятся элементы: https://photo-screen.ru/i/2FMZaMVSM - хотя все они именно с этими кодами из 1С есть в инфоблоке - и поиск по инфоблоку по внешнему коду в админке их находит
Т.е. в админке находит всегда, в скрипте для АПДЕЙТА - отслучая к случаю? Документооборот и бизнес-процессы выключены?
Для первых 6404 нормально, а дальше от случая к случаю
В настройках инфоблока
Попробуйте свой if заменить на $ob = $res->Fetch(); unset($res); if ($ob)
Редакция Стандарт - там видимо и нет такого
Не помогло. Но спасибо за идеи
В тп с доступом
Если я буду использовать в фильтре array('NAME' => 'NAME'), то будет поиск медленнее, чем использование array('=NAME' => 'NAME') ?
поиск по подстроке, конечно медленнее
Я даже не замечал, что это так работает 😅 Для меня небольшой шок
Просмотр sql-запросов дает много информации для размышлений
Обсуждают сегодня