Как стать автором
Обновить

Комментарии 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() или что вам надо

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории