Не секрет, что в Битрикс24 api есть множество способов получить элементы и обработать их. В данной статье мы разберем один из последних методов работы через Factory.Важным моментом является то, что со счетами и смарт-процессами возможна работа только через Factory, поэтому данный механизм необходим для изучения. У Битрикса есть документация на эту тему, но мы попытаемся упростить. Ниже обязательно приведем ссылки на официальную документацию.Как обычно, подключаем прологrequire($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php");Далее подключаем модуль CRM, который дает возможность работать с Factory и объявляем пространство имен\Bitrix\Main\Loader::IncludeModule('crm'); use Bitrix\Crm\Service; use Bitrix\Crm\Item;Если работает с датами, то так же добавим, тк Factory принимает определенный формат времени. Форматы date() и strtotime() не прокатятuse Bitrix\Main\Type\DateTime;Далее получаем саму Factory$factory = Service\Container::getInstance()->getFactory(CCrmOwnerType::Deal);Основные константы:Сделки - CCrmOwnerType::Deal - 2Лиды - CCrmOwnerType::Lead - 1Контакты - CCrmOwnerType::Contact - 3Компании - - CCrmOwnerType::Company - 4Счета - CCrmOwnerType::Invoice - 5Смарт-процессы - идентификатором является ID самого смарт процесса, его можно получить либо в списке "Смарт-процессов" в разделе CRM, либо скопировать из сылкиПолучаем либо конкретный элемент, зная его ID$item = $factory->getItem(1);Либо элементы по фильтру:$items = $factory->getItems([ 'order' => ['ID' => 'ASC'], 'filter' => [ 'CATEGORY_ID' => 0, 'DATE_CREATE' => DateTime::createFromTimestamp(strtotime($today)) ], 'limit' => 10 ]);Чтобы фильтровать по дате, необходимо ее конвертировать методом DateTime::createFromTimestamp(), который принимает значения в формате timestampПолучить данные можно так же несколькими методами:Получаем все данные элемента в массиве$item->getData();Получить конкретное поле можно либо по его коду:$item->get('TITLE');Либо именноваными методами. Полный список доступен в документации. Пользовательские поля получить можно только по коду.$item->getTitle();Для установки значения пользуемся методами:$item->set('TITLE', 'Новая заявка'); $item->setTitle('Новая заявка');Так же доступен метод проверки на изменение значения:$item->isChangedTitle();Чтобы создать элемент используем:$item = $factory->createItem([])Чтобы добавить телефон, e-mail, сайт и мессенджер:$fields = [ "FM" => Array ( "EMAIL" => Array ( "n1" => Array ( "VALUE" => "a@a.ru", "VALUE_TYPE" => "WORK" ) ), "PHONE" => Array ( "n1" => Array ( "VALUE" => "222222", "VALUE_TYPE" => "WORK" ) ), "WEB" => Array ( "n1" => Array ( "VALUE" => "ya.ru", "VALUE_TYPE" => "WORK", ), "n2" => Array ( "VALUE" => "", "VALUE_TYPE" => "FACEBOOK", ), "n3" => Array ( "VALUE" => "", "VALUE_TYPE" => "TWITTER", ) ), "IM" => Array ( "n1" => Array ( "VALUE" => "Мессенджер", "VALUE_TYPE" => "SKYPE" ) ) ) ]; $item->setFromCompatibleData($fields);Чтобы добавить товар:$products = [ [ 'PRODUCT_ID' => $prodId, 'QUANTITY' => 1, 'PRICE' => $price, ] ]; $item->setProductRowsFromArrays($products);После всех манипуляций необходимо обязательно сохранить. Есть 2 метода:$item->save(); // Без событий. Не рекомендуетсяВ этом случае не запускаются роботы, триггеры, бизнес-процессы. Обновляются просто значения в таблице БД.Правильнее пользоваться 2 методом:$operation = $factory->getUpdateOperation($item) ->disableCheckAccess() // Отключение проверки прав ->disableCheckFields();// Отключение проверки полей $res = $operation->launch(); if (!$res->isSuccess()) { print_r($res->getErrorMessages()); }Пример полного кода:require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php"); \Bitrix\Main\Loader::IncludeModule('crm'); use Bitrix\Crm\Service; use Bitrix\Crm\Item; $factory = Service\Container::getInstance()->getFactory(CCrmOwnerType::Deal); $item = $factory->getItem(2); $stage = $item->setStageId('DT165_3:PREPARATION'); //$item->save(); // Без событий. Не рекомендуется $operation = $factory->getUpdateOperation($item) ->disableCheckAccess() // Отключение проверки прав ->disableCheckFields();// Отключение проверки полей $res = $operation->launch(); if (!$res->isSuccess()) { print_r($res->getErrorMessages()); }Это основные приемы, которыми мы пользуемся обычно на практике. Если хотите углубиться в тему то ссылки на документацию:Документация по FactoryДокументация по работе с itemНаши контактыTelegramWhatsApp