1С-Битрикс. Ядро d7 в работе с элементами инфоблоков

от автора

Код, который будет написан ниже я проверял. Считаю себя middle, но почти не получаю критики. Это моя первая статья на Хабре. Для этого я здесь, жду обратную связь.

Начинающему программисту на 1С-Битрикс очень хорошо известна функция для получения элементов инфоблока.

<?php $iblockId = 12; \CIBlockElement::getList(     ['ID' => 'DESC'], // правила сортировка     [         '>=DATE_ACTIVE_FROM' => '29.11.2023',          'IBLOCK_ID' => $iblockId     ], // фильтр     false, // правила группировки     false, // параметры постраничной навигации     ['PROPERTY_*', '*'], // выборка );

В блоке выше описана сигнатура метода для работы с элементами инфоблоков в Битриксе. У неё, на первый взгляд, есть свои преимущества, она задокументирована, о ней много статей на форумах. Её дебагинг уже разобран подробно за время существования CMS. Замечу, что существует ряд задач, для решения которых она не годится. Эта функция в нынешних реалиях разработки встретится даже начинающему программисту довольно быстро.

К счастью, разработчики 1С-Битрикс упорно продолжают распиливать монолитные конструкции, которые начинали писать ещё на рубеже тысячелетий. Сейчас в арсенале у программиста есть, по крайней мере, 2 разных способа работы с элементами инофблоков в d7 ядре. Рассмотрим первый (он плохой, ниже я рассказываю, почему, можно переходить сразу ко второму).

Наследники DataManager в 1С-Битрикс

<?php use Bitrix\Main\Loader; use Bitrix\Iblock\ElementTable;  Loader::includeModule('iblock');  $iblockId = 12; $rsElements = ElementTable::getList([     'filter' => [         '>=ACTIVE_FROM' => '29.11.2023',         'IBLOCK_ID' => $iblockId,     ],     'select' => [         'ID',         'NAME',     ], ]);

Обращу внимание на то, что у класса ElementTable и метода getList есть документация. К сожалению, получить свойства информационного блока так не получится. Как известно, что в 1С-Битрикс долго не могли решить проблему раздельного хранения свойств и полей. Этот метод, в свою очередь, подойдёт скорее для беглой выборки идентификаторов и отработает быстрее, чем \CIBlockElement::getList. Для получения свойств данным методом придется поломать голову. С помощью ключа runtime можно докинуть магии, нашёл пример тут.

ORM в 1С-Битрикс

К сожалению, так не пойдёт, рассмотрим другой пример. Во-первых, перейдем в настройки интересующего нас инфоблока. Во-вторых, заполним поле «Символьный код API».

Настройки информационного блока "История состояний"

Настройки информационного блока «История состояний»

Далее будем использовать класс  \Bitrix\Iblock\Elements\Element*****Table, где ***** — «Символьный код API».

<?php use Bitrix\Main\Loader;  Loader::includeModule('iblock');  $entityClass = "\Bitrix\Iblock\Elements\ElementStateHistoryS1Table"; // символы между Element и Table регистронезависимы $elementsCollection = $entityClass::getList([     'filter' => [         '>=ACTIVE_FROM' => '29.11.2023'     ],     'select' => [         'ID',         'NAME',         'STATE', // свойство инфоблока История состояний в Битрикс24         'IBLOCK_SECTION',     ], ])->fetchCollection();  foreach ($elementsCollection as $elementObject) {     #var_dump($elementObject) не сработает, можете проверить (это не массив)     $name = $elementObject->getName(); # или $elementObject['NAME']     $id = $elementObject->getId(); # или $elementObject['ID']     $state = $elementObject->getState()->getValue(); # у по другому     $iblockSectionId = $elementObject->getIblockSection()->getName(); }

Метод fetchCollection() позволяет получить свойства с правильно именованными ключами. В свою очередь советую попробуйте сами запустить этот блок кода, используя метод fetchAll(), всё будет не так радужно. Для получения мы можем использовать ключ [‘STATE’] или же метод getState(). Для правильного использования методов используется CamelCase. Также поля можно получить методом ->get(‘ID’). $iblockSectionId->getIblockSection()->getName() получает название раздела инфоблока.

К счастью, этим функционал d7 в модуле iblock 1С-Битрикс не ограничивается. Например, мы можем с легкостью, получить нужные нам разделы инфоблоков, работая с разделом, как с объектом. Рассмотрим пример.

<?php use Bitrix\Main\Loader; use Bitrix\Main\Config\Option; use Bitrix\Iblock\Model\Section;  Loader::includeModule('iblock'); $structureIblockId = Option::get('intranet', 'iblock_structure', 3); $orgStructureEntity = Section::compileEntityByIblock($structureIblockId);  $rsDepartments = $orgStructureEntity::getList([     'filter' => [           'UF_HEAD' => 9,      ],      'select' => ['ID', 'NAME'], ])->fetchAll();  $managerDepartmentNames = ''; foreach ($rsDepartments as $dep) {     $managerDepartmentNames .= $dep['NAME'] . ' '; }

Заметьте, что код выше содержит сразу нескольо подключаемых классов. Об этом поговорим в следующем разделе статьи. В данном куске кода я получаю названия всех отделов, в которых руководителем является пользователь с 9 идентификатором. Замечу, что этот код относится к продукту Битрикс24 компании 1С-Битрикс. Итак, с помощью метода Section::compileEntityByIblock() мы получаем класс для работы с разделами инфоблока оргуструктуры. Напомню, что нечто подобное мы делали выше, когда создавали символьный код API для инфоблока и писали его класс в коде напрямую. В свою очередь, для работы с разделами используется такой метод. Обращу ваше внимание на то, что ключи у массива, передаваемого в getList, те же, что и у элементов, фильтровать по дополнительным полям легко, также как и получить их (добавить в массив [‘ID’, ‘NAME’, ‘UF_HEAD’]).

Полезные ссылки

О классе Option очень хорошо написано в официальной документации. О классе DataManager также читаем там.

Заключение

Я постараюсь писать больше статей о ядре d7. Вероятно я расскажу подробнее о кэшировании запросов (и о кэшировании в 1С-Битрикс в принципе).


ссылка на оригинал статьи https://habr.com/ru/articles/778052/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *