Операции
Общее
Каждое изменение элемента любого типа CRM сопровождается большим количеством проверок и связанных действий.
Чтобы весь этот процесс был прозрачным, было решено сосредоточить это всё в одном классе.
Т.к. каждый тип сущности может иметь свои особенности и дополнительные действия, то экземпляр объекта получается через фабрику.
После получения объекта его можно дополнительным образом сконфигурировать.
Запуск выполняется методом launch
, который вернет объект \Bitrix\Main\Result
.
В общем случае, процесс выполняется следующим образом:
- Проверка тарифных ограничений.
- Проверка прав доступа к элементу.
- Проверка прав доступа.
- Проверка запущенных бизнес-процессов.
- Выполнение бизнес-логики полей до сохранения.
- Проверка заполнености обязательных полей.
- Если к этому моменту элемент не был изменен, то дальнейшие действия не производятся.
- Выполнение дополнительных действий до сохранения.
- Сохранение элемента.
- Выполнение бизнес-логики полей после сохранения.
- Обновление данных о правах доступа.
- Обновление поискового индекса.
- Сохранение истории действий над элементом.
- Запись данных в таймлайн.
- Выполнение дополнительных действий после сохранения.
- Отправка пуш-уведомления.
- Запуск роботов и шаблонов бизнес-процессов.
Методы, выполняющие проверки и изменения, являются публичными.
При необходимости можно получить объект операции и вызвать, например, проверку прав доступа, до запуска самой операции.
Методы
Метод | Описание | С версии |
---|---|---|
public function __construct (Item $item, Operation\Settings $settings, Collection $fieldsCollection = null) |
Конструктор.
В конструктор необходимо передать элемент, настройки и коллекцию полей. Если не передать $fieldsCollection, то весь функционал, завязанный на поля, не будет выполняться. | |
public function exportSettings(): Operation\Settings |
Возвращает текущий объект настроек. Возвращается тот же объект, а не копия. | |
ppublic function importSettings (Operation\Settings $settings): self |
Устанавливает новый объект настроек для операции. | |
public function getContext(): Context |
Возвращает текущий контекст выполнения операции. | |
public function setContext(Context $context): self |
Устанавливает новый контекст выполнения операции. | |
public function getItem(): Item |
Возвращает элемент, над которым выполняется операция. | |
public function getItemBeforeSave(): Item |
Возвращает копию элемента в его состоянии до сохранения в базу данных. Эта копия есть только после вызова launch() . | |
public function addAction (string $actionPlacement, Action $action): self |
Добавляет дополнительное действие $action на место $actionPlacement.
$actionPlacement может принимать значение beforeSave(Operation::ACTION_BEFORE_SAVE) или afterSave(Operation::ACTION_AFTER_SAVE) . | |
public function launch(): Result |
Запускает выполнение операции. Возвращает \Bitrix\Main\Result . | |
public function checkAccess(): Result |
Выполняет проверку прав доступа. | |
public function processFieldsWithPermissions(): Result |
Выполняет проверку прав доступа полей. | |
public function processFieldsBeforeSave(): Result |
Выполняет проверку полей до сохранения. | |
public function checkFields(): Result |
| |
public function checkRequiredFields (array $requiredFields, Factory $factory): Result |
Метод проверяет, что поля $requtedFields заполнены. $factory - фабрика.
В массиве $requiredFields содержится индексный массив с кодами полей, заполненность которых надо проверить. | |
public function processFieldsAfterSave(): Result |
Выполняет бизнес-логику полей после сохранения. Если какое-то из значений было изменено, то элемент будет сохранен повторно. | |
public function getStageDependantRequiredFields (Factory $factory): array |
Возвращает коды зависимых от стадии обязательных полей, заполненность которых необходимо проверить при выполнении данной операции. | |
public function isItemChanged(): bool |
Возвращает true, если значения полей элемента были изменены, за исключением тех, значения которых генерируются автоматически. | |
public function checkRunningWorkflows(): Result |
Проверяет, что у элемента нет запущенных бизнес-процессов при смене направления. Если направление не меняется, то эта проверка не производится. |
Метод конфигурации
Для управления настройками выполнения операции можно получить объект настройки и работать с его методами напрямую.
Или можно вызвать методы этого класса и работать с настройками.
Метод | Описание |
---|---|
public function disableAllChecks(): self | Метод отключает все проверки при выполнении операции.
Вызов этого метода аналогичен вызову методов disableCheckWorkflows() , disableCheckAccess() , disableCheckFields() , disableCheckRequiredUserFields() . |
enableAutomation / disableAutomation / isAutomationEnabled | Управление запуском роботов. |
enableBizProc / disableBizProc / isBizProcEnabled | Управление запуском шаблонов бизнес-процессов. |
enableCheckAccess / disableCheckAccess / isCheckAccessEnabled | Управление проверкой прав доступа. |
isCheckFieldsEnabled / enableCheckFields / disableCheckFields | Управление проверкой корректности заполения полей и проверкой заполненности обязательных полей. |
enableCheckRequiredUserFields / disableCheckRequiredUserFields / isCheckRequiredUserFields | Управление проверкой заполненности обязательных полей. |
enableFieldProcession / disableFieldProcession / isFieldProcessionEnabled | Управление проверками и изменениями, связанными с бизнес-логикой полей. |
enableSaveToHistory / disableSaveToHistory / isSaveToHistoryEnabled | Управление записью в историю изменений. |
enableBeforeSaveActions / disableBeforeSaveActions / isBeforeSaveActionsEnabled | Управление дополнительными действиями до сохранения. |
enableAfterSaveActions / disableAfterSaveActions / isAfterSaveActionsEnabled | Управление дополнительными действиями после сохранения. |
enableCheckWorkflows / disableCheckWorkflows / isCheckWorkflowsEnabled | Управление проверкой запущенных бизнес-процессов. |
Наследники
Базовый класс операции является абстрактным. У этого класса есть пять реализаций, выполняющий разные виды операций:
Operation\Add
- добавление.Operation\Update
- изменение.Operation\Delete
- удаление.Operation\Copy
- копирование.Operation\Conversion
- конвертация.
В каждом из этих классов переопределены методы, отвечающие за особенности той или иной операции. Но в целом, процесс выполнения выполняется в том же порядке.
Разница в том, что, например, при удалении не запускаются роботы и бизнес-процессы - в этом нет смысла.
Примеры
use Bitrix\Crm\Service; $entityTypeId = 128; $factory = Service\Container::getInstance()->getFactory($entityTypeId); $item = $factory->createItem(); $item->setStageId('D128_3:CLIENT'); $operation = $factory->getAddOperation($item) ->disableCheckAccess() ->disableCheckFields(); $result = $operation->launch(); if (!$result->isSuccess()) { print_r($result->getErrorMessages()); } $newId = $item->getId();
Обновление Предложения с запуском связанных действий
\Bitrix\Main\Loader::includeModule('crm'); use Bitrix\Crm\Service; $factory = Service\Container::getInstance()->getFactory(\CCrmOwnerType::Quote); $itemId = 3; // ID сущности $item = $factory->getItem($itemId); if ($item) { $item->setStageId('SENT'); } $operation = $factory->getUpdateOperation($item) ->disableCheckAccess() ->disableCheckFields(); $result = $operation->launch(); if (!$result->isSuccess()) { print_r($result->getErrorMessages()); }
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.