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

Новые счета

В обновлении 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.



© «Битрикс», 2001-2024, «1С-Битрикс», 2024