Счета
В Битрикс24 счёт - финальный этап процесса продаж. Когда сделка заключена, мы создаём счет и выставляем его клиенту для оплаты.
В данный момент, в Б24 существуют только “Новые счета”, основанные на механизме смарт-процессов, в то время как “старые счета” уже не используются и говорить о них нецелесообразно. С другой же стороны - рассуждать контектнонезависимо о новых счетах тоже не имеет смысла, поскольку они основаны на механизме смарт-процессов. Здесь мы поговорим о различиях в работе между смарт-процессами и счетами и посмотрим несколько примеров использования унифицированного api.
Основное
С технической точки зрения счета являются сущностью основанной на смарт-процессах, однако все же нельзя сказать что это одно и то же. Мы будем исходить из позиции что новые счета - это особый зафиксированный тип смарт-процесса со своими допущениями.
В работе со смарт-процессами все начинается с фабрики, а для того чтобы получить фабрику необходимо знать идентификатор типа сущности с которой мы хотим продолжить работу. Для счетов это \CCrmOwnerType::SmartInvoice
или 31
(цифровое значение).
Важно отметить что если для каких-то разработок вы используете динамическое определение сущности, то
\CCrmOwnerType::isPossibleDynamicTypeId
, который говорит о предположительном смарт-процессе вернет вамfalse
. Так что если вы не обработаете эту ситуацию сами вы будете неприятно удивлены.
Говоря об идентификаторах сущностей надо сказать что счета получили полный набор уникальных значений:
- Идентификатор типа сущности (
ENTITY_TYPE_ID
) -\CCrmOwnerType::SmartInvoice
(31
) - Идентификатор типа сущности для корзины (
SPD
) -\CCrmOwnerType::SuspendedSmartInvoice
(32
) - Строковый код типа сущности (
ENTITY_NAME
) -\CCrmOwnerType::SmartInvoiceName
(SMART_INVOICE
) - Строковый код типа сущности для корзины (
ENTITY_NAME_SPD
) -\CCrmOwnerType::SuspendedSmartInvoiceName
(SUS_SMART_INVOICE
) - Короткое обозначения типа (
ABBR
) -\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}
Различия
Счета являются особым типом смарт-процесса и должны реализовывать определенные заложенные в них поведения, а это значит что для счетов нельзя управлять настройками. Добавить или убрать какие-то опции как в своем смарт-процессе не получиться.
Что касается направлений, то они в данный момент не используют направления. Не смотря на то что технически направления существуют и поддерживаются механикой смарт-процессов использовать их не следует. При работе подразумевайте что счета это элементам смарт-процесса, у которого в интерфейсе отключены направления.
Что касается стадий, то работа с ними ведется аналогично работе со смарт-процессами, за исключением того что счетов другой набор стадий при создании (это необходимо для поддержания обратной совместимости со старыми счетами).
Поскольку счета несут в себе бизнес-функцию и “наследуют” возможности старых счетов разработчики битрикса расшириликласс-наследник DataManager
дополнительными полями (через ORM
в runtime
).
При этом добавлены некоторые дополнительные поля:
-
ACCOUNT_NUMBER
- номер счета -
COMMENTS
- html-поле с комментариями
Примеры
Небольшой пример работы со счетами: создадим счет с определенными паремтрами.
Плательщик: “ООО Ромашка” (ID:111), Наше юр.лицо: “ООО Фьюжн” (ID:400), по реквизитам юридического лица (ID:444) Дата выставления счета: 17 ноября 2022 Дата оплаты: до 24 ноября 2022 Сделка: “Продажа пестиков и тычинок в ООО Ромашка” (ID:555)
Товары:
- “Пестик” (1шт, 100.0 руб./шт) (ID:222)
- “Тычинка” (2шт, 150.0 р/шт) (ID:333)
Пример создания такого счета может выглядеть так:
use \Bitrix\Main,
\Bitrix\Crm,
\Bitrix\Crm\Service;
Main\Loader::requireModule('crm');
$factory = Service\Container::getInstance()
->getFactory( \CCrmOwnerType::SmartInvoice );
$invoice = $factory->createItem([
'BEGINDATE' => '17.10.2022',
'CLOSEDATE' => '22.10.2022',
'PARENT_ID_2' => 555,
'COMPANY_ID' => 111,
'MYCOMPANY_ID' => 400,
'MC_REQUISITE_ID' => 444,
'COMMENTS' => 'html comment here!',
]);
$productParseResult = $invoice->setProductRowsFromArrays([
[
'PRODUCT_NAME' => 'Пестик',
'PRODUCT_ID' => '222',
'PRICE' => 100,
'QUANTITY' => 1,
],
[
'PRODUCT_NAME' => 'Тычинка',
'PRODUCT_ID' => '333',
'PRICE' => 150,
'QUANTITY' => 2,
],
]);
if ( !$productParseResult->isSuccess() )
{
// Something wrong with products - no add invoice
return null;
}
$operation = $factory->getAddOperation($invoice);
$operationResult = $operation->launch();
if ( $operationResult->isSuccess() )
{
// Invoice added. ID: $invoice->getId()
}
else
{
var_dump($operationResult->getErrors());
}