Комментарии 5
Полезно, спасибо!
Минусы данного подхода: понимание работы механизма требует повышенного уровня знаний
И поймать memory_limit. Спасибо, не надо.
Статья хорошая, но в целом про работу с сохранением из коллекции в доке есть: https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=11749&LESSON_PATH=3913.3516.5748.11743.11749
Плюс в комментариях выше правильно написали про использованную память. Я думаю стоит также добавить в статью сколько памяти сожралось при том или ином варианте.
Ну и еще как вариант можно запросы делать пачками по 1К, 10К, 100К элементов, а не собирать один большой монструозный запрос
Еще рекомендую запекать хайлоады через orm-генерацию. Так не надо будет писать
$hlblockID = 1; // используйте код хайлоада вместо магических чисел, ну или хотя бы константы
$hlblock = HL\HighloadBlockTable::getById($hlblockID)->fetch(); // тут мы получаем сущность из базы с кодом что на деле можно пропустить
$entity = HL\HighloadBlockTable::compileEntity($hlblock); // тут мы создаем "запеченный класс", который могли создать заранее
плюсы запекания - мы сохраняем структуру в коде и соответственно в гите, экономим запросы в базу (не то чтобы было важно), получаем возможность писать хайлоаду методы и проверки. В общем получаем просто таблицу с моделью как в нормальных фреймворках, да еще и с управлением в админке. А еще можно настраивать крутые связи и прочее, что можно для таблиц, но нельзя для хайлоадов ибо админка битры это все еще админка для пользователей.
минусы - мы теряем возможность быстро менять поля, точнее должны перезапекать хайлоад после изменений, впрочем поля не так уж часто меняются, а иметь историю измений в гите - приятно.
Как результат у нас появится модуль, назовем его mkmatrix.main (чтобы не думать над названием), в названии модуля обязательно должна быть одна точка разделяющая два "слова" (копайтесь в битриксовском поиске классов, если интересно почему так)
в модуле будет папочка lib с файликом myhighload.php и примерно таким содержанием
<?php
namespace MKMatriX\Main;
class MyHighloadTable extends DataManager
{
public static function getTableName()
{
return 'myhighload';
}
public static function getMap()
{
return [
new IntegerField(
'ID',
[
'primary' => true,
'autocomplete' => true,
'title' => Loc::getMessage('_ENTITY_ID_FIELD')
]
),
new TextField(
'UF_NAME',
[
'title' => Loc::getMessage('_ENTITY_UF_NAME_FIELD')
]
),
// ...
];
}
}
Кстати его можно не писать самому, а накликать в админке https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=43&LESSON_ID=2410 . А если вы знакомы с консолью битры, то можно еще и сгененировать OE_MyHighloadTable чтобы редактор кода подсказывал вам методы исходя из полей, на мой взгляд это избыточно, хотя и удобно.
Пользоваться соответственно так
use MKMatriX\Main\MyHighloadTable;
if (!CModule::IncludeModule("mkmatrix.main")) { // понимаю что устаревший вариант, но мне влом переписывать сниппеты
ShowError("Модуль mkmatrix.main не установлен!");
return;
}
$this->arResult["ITEMS"] = MyHighloadTable::query()
->setSelect(["*"])
->where("UF_XML_ID", "in", $this->arParams["XML_ID"])
->setOrder(["UF_SORT" => "ASC"])
// ->setLimit(20)
->exec()->fetchAll(); // ну или fetchCollection() или что вам надо
1С-Битрикс. Массовая загрузка элементов в Highload-блоки