Документация для разработчиков
Темная тема

Операции

Общее


Каждое изменение элемента любого типа CRM сопровождается большим количеством проверок и связанных действий.

Чтобы весь этот процесс был прозрачным, было решено сосредоточить это всё в одном классе.

Т.к. каждый тип сущности может иметь свои особенности и дополнительные действия, то экземпляр объекта получается через фабрику.

После получения объекта его можно дополнительным образом сконфигурировать.

Запуск выполняется методом launch, который вернет объект \Bitrix\Main\Result.

В общем случае, процесс выполняется следующим образом:

  1. Проверка тарифных ограничений.
  2. Проверка прав доступа к элементу.
  3. Проверка прав доступа.
  4. Проверка запущенных бизнес-процессов.
  5. Выполнение бизнес-логики полей до сохранения.
  6. Проверка заполнености обязательных полей.
    • Если к этому моменту элемент не был изменен, то дальнейшие действия не производятся.
  7. Выполнение дополнительных действий до сохранения.
  8. Сохранение элемента.
  9. Выполнение бизнес-логики полей после сохранения.
  10. Обновление данных о правах доступа.
  11. Обновление поискового индекса.
  12. Сохранение истории действий над элементом.
  13. Запись данных в таймлайн.
  14. Выполнение дополнительных действий после сохранения.
  15. Отправка пуш-уведомления.
  16. Запуск роботов и шаблонов бизнес-процессов.

Методы, выполняющие проверки и изменения, являются публичными.

При необходимости можно получить объект операции и вызвать, например, проверку прав доступа, до запуска самой операции.

Методы


Метод Описание С версии
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();

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.
0
Александр Корнеев
Сообщение непромодерировано, возможны ошибки и неточности.
обновление предложения с запуском связанных действий
Код
\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());
}
© «Битрикс», 2001-2021, «1С-Битрикс», 2021
Наверх