Новые счета
В обновлении crm 21.1300.0 добавлен новый тип сущности в CRM, который должен заменить собой старые счета.
Как смарт-процесс
Технически элементы новой сущности работают точно так же, как элементы смарт-процессов. Но это не смарт-процесс в чистом виде. Можно сказать, что новые счета — это зафиксированный тип смарт-процесса, с некоторыми оговорками.
У новых счетов нельзя управлять настройками этого смарт-процесса и есть ряд других ограничений.
Направления
Новые счета на данный момент не используют направления. Но так как они основаны на смарт-процессах, направления поддерживаются на уровне API.
Т.е. элементы новых счетов ведут себя идентично элементам смарт-процесса, у которого в интерфейсе отключены направления.
Стадии
Всё, как в смарт-процессах, кроме идентификаторов. Кроме того, у новых счетов другой набор стадий при создании (такой же, как в старых счетах).
Элементы
Данные об элементах хранятся точно так же, как в смарт-процессах. Класс-наследник
\Bitrix\Main\ORM\Data\DataManager
для работы с БД через ORM компилируется в рантайме.
При этом в рантайме же в таблет добавляются два дополнительных поля, которых нет у смарт-процессов:
-
ACCOUNT_NUMBER
- номер счета. По механизму работы похож на полеQUOTE_NUMBER
у предложений. -
COMMENTS
- html-поле с комментариями.
Пользовательские поля
Хранение данных у новых счетов абсолютно аналогично смарт-процессам, как уже упоминалось выше. Поэтому и хранение значений пользовательских полей не отличается от такового у смарт-процессов.
Работа с настройками пользовательских полей так же идентична смарт-процессам.
Идентификаторы
- Идентификатор типа сущности -
\CCrmOwnerType::SmartInvoice = 31
-
\CCrmOwnerType::isPossibleDynamicTypeId(31)
возвращает false - Добавлены новые методы:
Метод Описание С версии \CCrmOwnerType::isUseFactoryBasedApproach( int $entityTypeId ): bool
Возвращает true
, если новое API для типа сущности полностью реализовано и можно вообще не трогать старое.\CCrmOwnerType::isUseDynamicTypeBasedApproach( int $entityTypeId ): bool
Возвращает true
, если API основано на API смарт-процессов (или если это сам смарт-процесс). Можно воспринимать как проверку на то, что данный тип работает на "движке" смарт-процессов.\CCrmOwnerType::isDynamicTypeBasedStaticEntity( int $entityTypeId ): bool
Возвращает true
, если тип сущности основан на API смарт-процессов, но сам таковым не является (Пример: новые счета).\CCrmOwnerType::getDynamicTypeBasedStaticEntityTypeIds(): array
Возвращает массив идентификаторов типов, которые основаны на смарт-процессах, но таковыми не являются (Пример: новые счета). - У нового типа свой набор идентификаторов почти для всего
-
\CCrmOwnerType::SmartInvoice = 31
- идентификатор типа сущности -
\CCrmOwnerType::SuspendedSmartInvoice = 32
- идентификатор типа сущности для корзины -
\CCrmOwnerType::SmartInvoiceName = "SMART_INVOICE"
- строковый код нового типа сущности -
\CCrmOwnerType::SuspendedSmartInvoiceName = "SUS_SMART_INVOICE"
- строковый код нового типа сущности для корзины -
\CCrmOwnerTypeAbbr::SmartInvoice = "SI"
- короткое обозначения типа. - Идентификатор
ENTITY_ID
для пользовательских полей -\Bitrix\Crm\Service\Factory\SmartInvoice::USER_FIELD_ENTITY_ID = "CRM_SMART_INVOICE"
- Идентификатор
ENTITY_ID
для пользовательских полей в корзине -\Bitrix\Crm\Service\Factory\SmartInvoice::SUSPENDED_USER_FIELD_ENTITY_ID = "CRM_SMART_INVOICE_SPD"
- Идентификатор
ENTITY_ID
для стадий формируется какSMART_INVOICE_STAGE_{categoryId}
- Префикс поля
STATUS_ID
для стадий формируется также, как для смарт-процессов -DT31_{categoryId}
-
Общие рекомендации
В идеальном случае, код не должен делать явных различий между типами сущности. Тогда он будет наиболее расширяемым и универсальным.
Если приходится делать различия (например, в время переходного периода, когда новый API реализован не для всех типов сущностей), то стоит пользоваться следующим алгоритмом:
- Если нужно узнать, поддерживает ли тип новый API, то используется метод
\CCrmOwnerType::isUseFactoryBasedApproach(int $entityTypeId): bool
- Если нужно понять, имеем ли мы дело со смарт-процессами, используется метод
\CCrmOwnerType::isUseDynamicTypeBasedApproach(int $entityTypeId): bool
- Метод
\CCrmOwnerType::isPossibleDynamicTypeId(int $entityTypeId): bool
используется крайне редко, только при наличии полного понимания, что необходим именно он. Метод возвращаетtrue
только в том случае, еслиentityTypeId
принадлежит "настоящему" смарт-процессу. Т.е. исключаются все статические типы, основанные на смарт-процессах (например, новые счета). Чаще всего, это нежелательное поведение.
Настройки отображения раздела
На момент выхода обновления crm 21.1300.0 имеет место переходный период со старых счетов на новые. Сейчас в интерфейсах могут показываться старые счета, новые счета или сразу оба.
Для упрощения работы были добавлены некоторые методы. Их задача — дать ответ на вопрос, нужно ли показывать определенную часть интерфейса, так как точные детали могут меняться со временем.
use Bitrix\Crm\Settings\InvoiceSettings; \Bitrix\Main\Loader::includeModule('crm'); $isShowOldInvoices = InvoiceSettings::getCurrent()->isOldInvoicesEnabled(); // показывать старые счета или нет $isShowSmartInvoices = InvoiceSettings::getCurrent()->isSmartInvoiceEnabled(); // показывать новые счета или нет
Перед показом новых счетов в интерфейсе надо обязательно проверять, надо их показывать или нет. Также рекомендуется скрывать старые счета, если InvoiceSettings::isOldInvoicesEnabled
возвращает false
.