Сайт и CRM Битрикс24 Белые Облака

Задача: Обеспечить доработку и поддержку сайта на Битрикс24 "Интернет-магазин + CRM".

Клиент: Белые облака — эзотерический магазин и кафе, расположенное в центре Москвы.

Ввод в эксплуатацию: 01.10.2023

«Белые Облака» – это мир экзотики и чудес; место встреч для желающих думать, слушать, видеть; для тех, кто готов отправиться в духовное путешествие, найти объяснение своей особенности… Для всех, кто не стоит на месте, следит за движением и своему движению следует…
Публичная часть и 1C-Bitrix

Белые облака” - это культурный центр, специализирующийся на эзотерике, духовных и телесных практиках, проводящий лекции и семинары с различными специалистами, обладающий внушительной библиотекой и уютным кафе.

Разумеется, у столь необычной организации обязан быть и сайт, и CRM для связи с клиентами - их мы и получили в свои невероятно заботливые руки для доработки после предыдущих подрядчиков. В этой статье разберем самые любопытные моменты из работы с сайтом.

Сайт использует связку 1C-Bitrix + Bitrix24 в коробке, так что прощай, Rest-api, нам будет тебя не хватать (нет)!

Вкратце о доработках

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

1C-Bitrix

  • Разработка кастомной витрины
  • Разработка кастомного оформления заказа
  • Применение Битрикс-френдли промокодов

Битрикс24

  • Создание воронок продаж
  • Настройка нестандартных форм для Сделок
  • Выгрузка Сегментов с клиентами
  • Настройка Роботов и Бизнес-процессов

Мероприятия

“Белые облака” являются центром экзотики - и их сайт не является исключением. Использование стандартных шаблонов и компонентов здесь - моветон, поэтому необходимо погрузиться в манящие глубины кастомизированного функционала (воистину мечта каждого Битрикс-разработчика).

Первая доработка - это “витрина” мероприятий, в которой нами было сделано несколько важных нововведений:

  • фильтр по мероприятиям
  • отображение актуальных мероприятий

Фильтр по мероприятиям

Позволяет делать выборку по наиболее актуальным полям мероприятий: клиенты зачастую интересуются конкретной тематикой или понравившимся ведущим.
Все поля выборки хранятся в CMS, сам компонент настроен на “нативную” работу с Битриксом.

Отображение актуальных мероприятий

Отображающиеся прошедшие мероприятия, конечно, могут понадобится особо допытливым клиентам, интересующимся, что же они пропустили - но все-таки куда важнее показывать те события, на которые еще можно купить билеты: если они есть, и мероприятие еще не наступило.

Промокоды

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

Тем не менее, сквозь тернии, промокод был добавлен: он использует Битрикс-френдли подход, оперируя функционалом, расположенным в разделе Маркетинг админки Битрикса.

А если кто-то тоже задается вопросом, “Как использовать промокод в кастомном компоненте Битрикс” или “Как применить промокод в 1C-Bitrix” (отчаянно делаем вид, что не подвязываемся к поисковым словам), вот простой способ, который нужно ставить после создания заказа (CSaleOrder::DoSaveOrder, например, и CSaleBasket::OrderBasket):

$coupon = "Вот тут тот самый купон, который мы хотим применить";

$order = Sale\Order::load($orderID); // грузим созданный в Битре заказ

// применяем купон
Sale\DiscountCouponsManager::init(
	Sale\DiscountCouponsManager::MODE_ORDER, [
		"userId" => $order->getUserId(),
		"orderId" => $order->getId()
	]
);
Sale\DiscountCouponsManager::add($coupon);
$discounts = $order->getDiscount(); // пересчитываем скидки, чтобы правила купона применились
$discounts->calculate();
$order->save(); // обязательно сохраняем заказ, иначе все наши манипуляции улетят в бездну

$summ = $order->getPrice(); // берем итоговую сумму заказа, чтобы она летела в оплату

Нестандартное оформление заказа

На этом наша история с нестандартными компонентами не закончилась - ведь все формы здесь кастомные, и мало того, что какая-то должна просто создать заказ, так еще и нужно создавать из этого дела Сделки в Битрикс24, да еще разбитые по разным воронкам.

А ведь самих воронок у организации немало, тут и:

Покупка билетов на мероприятия

Бронь столика в кафе

Аренда залов под проведение мероприятий

Заказ рекламы на проведение мероприятия

и многое другое. К счастью, перебрасывая формы через ajax в лапы скрипта, мы можем спокойно обработать данные, используя коробочный API:

$deal = new CCrmDeal(false);
$arFields=array(/*массив с полями сделки*/);
$idOfTheDeal = $deal->Add($arFields);

Кажется слишком просто, верно? Действительно, на этом работа не заканчивается, потому что можно столкнуться с тремя проблемами:

Сделка не создается через API Битрикс24

Если Сделки нет даже в воронке “Общие” - беда обычно отображается в поле с ошибками. Вывести его можно простой конструкцией

echo $deal->LAST_ERROR;

Как правило, ошибка может быть в том, что не заполнено какое-то обязательное поле Сделки.

Сделка создается в некорректной воронке через API Битрикс24

Вы создали Сделку, и даже прописали ей корректный CATEGORY_ID, который отвечает за привязку Сделки к конкретной воронке - но она упорно создается в разделе “Общие” - и не хочет лезть в необходимую воронку.

А причина может быть в коварном поле STAGE_ID, в котором сидит статус создаваемой Сделки.

По умолчанию там стоит что-нибудь вроде NEW, что соответствует статусу Новая в стандартном наборе воронок. У каждой воронки свои коды статусов, даже если они называются одинаково. Выглядят они как C#:код, где # - ID воронки. В случае, если в воронке CATEGORY_ID нет статуса STAGE_ID - Битрикс не потерпит такой наглости и сунет Сделку в Общие. Но паниковать не стоит, все это легко поправить.

Где взять коды категорий (воронок) Сделок

Если мы перейдем в раздел CRM -> Настройки -> Настройки CRM -> Воронки продаж, то удивимся, насколько лаконичен Битрикс: не перегружает мозги администратора какими-то непонятными полями вроде “ID” и прочее. К счастью, ID-шник можно вывести, щелкнув по “бургеру” в шапке таблицы -> Колонки списка -> ID.

Разумеется, никто не будет обвинять вас в военном преступлении, если вы попробуете воспользоваться Инспектором браузера - и просто проверите данные чекбокса напротив нужной воронки.

А для любителей ковыряться в таблицах - можно перейти к таблице b_crm_deal_category (Производительность -> Таблицы) - и увидеть там всю информацию о нужной воронке.

Где взять коды статусов Сделки

При переходе в CRM -> Настройки -> Настройки CRM -> Справочники -> Стадии конкретной воронки, мы увидим, как там все красиво, и как тщательно скрыт код статуса сделки.

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

Однако гораздо проще воспользоваться таблицами (Производительность -> Таблицы), а именно - b_crm_status. Нас интересует поле ENTITY_ID = DEAL_STAGE_[ID воронки], в поле STATUS_ID будет сидеть нужный статус, а в NAME - название стадии согласно настройкам стадий.

Не работают Роботы с новыми Сделками Битрикс24

Итак, Сделку мы все-таки добавили, но внезапно обнаруживаем, что Роботы, должные делать кое-какие манипуляции со Сделкой при переходе в статус “Новая” подняли бунт - и взяли выходной. Главное - не паниковать: восстание машин еще не случилось. Пока что.

Дело в том, что создание Сделки через API в Битрикс24 через $deal->add совершенно не означает, что запустились все необходимые Бизнес-процессы. На помощь приходит доблестная техподдержка, которая советует добавить вот такой вот незамысловатый кусок кода, который пнет обнаглевшие куски кремния и заставят-таки исполнить предначертанное, где id - id-шник нашей сделки, возвращенный $deal->add:

CCrmBizProcHelper::AutoStartWorkflows(
	CCrmOwnerType::Deal,
	$id,
	CCrmBizProcEventType::Create, // а вот тут - либо создание, либо обновление, либо еще какие манипуляции со Сделкой
	$arErrors
);

$starter = new \Bitrix\Crm\Automation\Starter(\CCrmOwnerType::Deal, $id);
$starter->runOnAdd();

Отправка QR-кода

Когда клиент оплачивает билет на мероприятие - разумеется, ему на почту должен отправляться сам билет, весь такой брендированный, да с QR-кодом для сканирования на входе.

На входе в зал сидит товарищ проверяющий, который сканирует QR и получает подтверждение, что билет не сверстан на коленке, а действительно подлинный.

Однако на момент получения сайта QR-код вел… на сам билет. С одной стороны логично, однако клиенту было бы гораздо удобнее, чтобы все-таки при сканировании видеть саму Сделку, в которой можно отметить, что клиент пришел и не потерялся.

Для этого мы переработали генерацию кода, вшив в него уникальный hash, который в поиске ведет непосредственно на саму Сделку.

Сама отправка QR-кода в теле билета организована через функционал Роботов, генерирующих QR-код и сам билет после получения оплаты. Для генерации же самого QR-кода используется php-библиотека… Какая? А вот пусть будет секретом. Мир полон интриг, особенно - в области эзотерики.

Разумеется, было бы логично добавить капельку автоматизации, которая позволит сразу при сканировании переводить Сделку в Успешные и подтверждать корректность билета - но для этого мы маленечко подождём утверждения бюджета.

Тормоза в Битрикс24

Когда клиент говорит, что Битрикс24 тормозит - первая реакция, разумеется, недоумение: ведь он весь такой оптимизированный и прекрасный, вон, ролики Битрикса посмотрите! И действительно: корень проблем наверняка кроется в том, что чьи-то шаловливые ручки что-то нахулиганили в системе, из-за чего она медленно работает. И если тормоза не постоянные, а “плавающие” - проблема наверняка кроется в агентах. Зачастую эту проблему решают переводом агентов на cron: ведь вместо загрузки сервера хитами, можно загрузить его планировщиком - однако наша задача - лечить причину, а не симптомы.

Агент - это скрипт, который выполняется с определенной периодичностью. Он запускается для того, чтобы поддерживать процессы в системе и актуализировать все данные.

Агент - верный друг и товарищ администратора, однако в случае некорректной работы с системой, они могут расплодиться в огромных количествах. К счастью, до проблем “Матрицы” Битриксу далеко, но решать задачу все-таки нужно.

Диагностика проблем агентов в 1C-Bitrix и Битрикс24

По пути Настройки -> Настройки продукта -> Агенты можно увидеть список активных агентов (какие агенты сейчас работают или ожидают выполнения).

Большое количество однотипных агентов - мягкий намек на то, что что-то происходит не так. В нашем случае было множество агентов, связанных с Бизнес-процессами (CBPSchedulerService::OnAgent) - что намекало на то, что из-за большого количества Сделок, что не перешли в завершенную стадию, агенты висели и практически на каждом хите проводили свои манипуляции.

Отсюда напрашивается логичный вывод: ваши Сделки (особенно - если используются Бизнес-процессы) должны всегда в конечном итоге переходить на финальные стадии (Успешные или Провальные) - иначе могут возникнуть тормоза.

Однако давайте же дальше углубимся, что интересного удалось раскопать в конкретной этой области - не зря же ее ковыряли. Вернёмся к агенту CBPSchedulerService::OnAgent($workflowId, $eventName, параметры); и подробнее рассмотрим его параметры.

$workflowid

По пути Автоматизация -> Бизнес-процессы -> Все активные можно увидеть все процессы, что связаны с конкретной сделкой.

$workflowid - это ссылка конкретный отдельный Бизнес-процесс. Найти связь можно с помощью Инспектора, чекнув value у чекбокса конкретного БП, а из Списка Бизнес-процессов можно узнать, к какой Сделке это относится.

$eventName

Это ссылка на конкретный блок в Шаблоне Бизнес-процесса. Узнать его можно, щелкнув на шестеренку блока в Бизнес-процессе и нажав на кнопку ID.

Итог

С помощью имеющихся данных можно вычислить не только, какой именно агент тормозит - но проследить буквально до конкретного блока, который вызывает постоянные тормоза, что просто восхитительно.

А чтобы удаленные Сделки не забыли прибрать за собой - следует вызывать конструкцию

Bitrix\Bizproc\Worker\Document\DeleteStepper::execAgent('crm', 'CCrmDocumentDeal', 'DEAL_');

Она удаляет Бизнес-процессы и историю документов, связанный с удаленной сделкой.

Завершение

Каждый сайт - это новый уникальный опыт, полный чарующих открытий (как минимум - в лексиконе). Пусть некоторые задачи и заставляют валяться в кататонический ступоре, нет проблем нерешаемых - есть только часы, что будут отданы во имя счастливого клиента.

Надеемся, что какая-то информация, выставленная здесь, помогла вам решить встречающиеся проблемы - или хотя бы дала направление, куда копать. Подписывайтесь, ставьте лайки Иначе зачем мы тут буковки печатаем, да ресурс клавиатуры расходуем.