Новые счета
В обновлении 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
.
Пользовательские комментарии
Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.Для этого нужно всего лишь авторизоваться на сайте
Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.
Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.