Работа с d7 Factory "Фабрикой" в Битрикс24

Работа с d7 Factory "Фабрикой" в Битрикс24

Не секрет, что в Битрикс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()); }

Это основные приемы, которыми мы пользуемся обычно на практике. Если хотите углубиться в тему то ссылки на документацию:

Наши контакты

Начать дискуссию