Сайт и CRM Битрикс24 Белые Облака
Задача: Обеспечить доработку и поддержку сайта на Битрикс24 "Интернет-магазин + CRM".
Клиент: Белые облака — эзотерический магазин и кафе, расположенное в центре Москвы.
Ввод в эксплуатацию: 01.10.2023
Задача: Обеспечить доработку и поддержку сайта на Битрикс24 "Интернет-магазин + CRM".
Клиент: Белые облака — эзотерический магазин и кафе, расположенное в центре Москвы.
Ввод в эксплуатацию: 01.10.2023
“Белые облака” - это культурный центр, специализирующийся на эзотерике, духовных и телесных практиках, проводящий лекции и семинары с различными специалистами, обладающий внушительной библиотекой и уютным кафе.
Разумеется, у столь необычной организации обязан быть и сайт, и CRM для связи с клиентами - их мы и получили в свои невероятно заботливые руки для доработки после предыдущих подрядчиков. В этой статье разберем самые любопытные моменты из работы с сайтом.
Сайт использует связку 1C-Bitrix + Bitrix24 в коробке, так что прощай, Rest-api, нам будет тебя не хватать (нет)!
Чтобы не вынуждать погружаться в пучины статьи без надобности, сразу приведем список пунктов, которые были выполнены на сайте.
“Белые облака” являются центром экзотики - и их сайт не является исключением. Использование стандартных шаблонов и компонентов здесь - моветон, поэтому необходимо погрузиться в манящие глубины кастомизированного функционала (воистину мечта каждого Битрикс-разработчика).
Первая доработка - это “витрина” мероприятий, в которой нами было сделано несколько важных нововведений:
Позволяет делать выборку по наиболее актуальным полям мероприятий: клиенты зачастую интересуются
конкретной тематикой или понравившимся ведущим.
Все поля выборки хранятся в 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);
Кажется слишком просто, верно? Действительно, на этом работа не заканчивается, потому что можно столкнуться с тремя проблемами:
Если Сделки нет даже в воронке “Общие” - беда обычно отображается в поле с ошибками. Вывести его можно простой конструкцией
echo $deal->LAST_ERROR;
Как правило, ошибка может быть в том, что не заполнено какое-то обязательное поле Сделки.
Вы создали Сделку, и даже прописали ей корректный 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 - название стадии согласно настройкам стадий.
Итак, Сделку мы все-таки добавили, но внезапно обнаруживаем, что Роботы, должные делать кое-какие манипуляции со Сделкой при переходе в статус “Новая” подняли бунт - и взяли выходной. Главное - не паниковать: восстание машин еще не случилось. Пока что.
Дело в том, что создание Сделки через 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-код вел… на сам билет. С одной стороны логично, однако клиенту было бы гораздо удобнее, чтобы все-таки при сканировании видеть саму Сделку, в которой можно отметить, что клиент пришел и не потерялся.
Для этого мы переработали генерацию кода, вшив в него уникальный hash, который в поиске ведет непосредственно на саму Сделку.
Сама отправка QR-кода в теле билета организована через функционал Роботов, генерирующих QR-код и сам билет после получения оплаты. Для генерации же самого QR-кода используется php-библиотека… Какая? А вот пусть будет секретом. Мир полон интриг, особенно - в области эзотерики.
Разумеется, было бы логично добавить капельку автоматизации, которая позволит сразу при сканировании переводить Сделку в Успешные и подтверждать корректность билета - но для этого мы маленечко подождём утверждения бюджета.
Тормоза в Битрикс24
Когда клиент говорит, что Битрикс24 тормозит - первая реакция, разумеется, недоумение: ведь он весь такой оптимизированный и прекрасный, вон, ролики Битрикса посмотрите! И действительно: корень проблем наверняка кроется в том, что чьи-то шаловливые ручки что-то нахулиганили в системе, из-за чего она медленно работает. И если тормоза не постоянные, а “плавающие” - проблема наверняка кроется в агентах. Зачастую эту проблему решают переводом агентов на cron: ведь вместо загрузки сервера хитами, можно загрузить его планировщиком - однако наша задача - лечить причину, а не симптомы.
Агент - это скрипт, который выполняется с определенной периодичностью. Он запускается для того, чтобы поддерживать процессы в системе и актуализировать все данные.
Агент - верный друг и товарищ администратора, однако в случае некорректной работы с системой, они могут расплодиться в огромных количествах. К счастью, до проблем “Матрицы” Битриксу далеко, но решать задачу все-таки нужно.
По пути Настройки -> Настройки продукта -> Агенты можно увидеть список активных агентов (какие агенты сейчас работают или ожидают выполнения).
Большое количество однотипных агентов - мягкий намек на то, что что-то происходит не так. В нашем случае было множество агентов, связанных с Бизнес-процессами (CBPSchedulerService::OnAgent) - что намекало на то, что из-за большого количества Сделок, что не перешли в завершенную стадию, агенты висели и практически на каждом хите проводили свои манипуляции.
Отсюда напрашивается логичный вывод: ваши Сделки (особенно - если используются Бизнес-процессы) должны всегда в конечном итоге переходить на финальные стадии (Успешные или Провальные) - иначе могут возникнуть тормоза.
Однако давайте же дальше углубимся, что интересного удалось раскопать в конкретной этой области - не зря же ее ковыряли. Вернёмся к агенту CBPSchedulerService::OnAgent($workflowId, $eventName, параметры); и подробнее рассмотрим его параметры.
По пути Автоматизация -> Бизнес-процессы -> Все активные можно увидеть все процессы, что связаны с конкретной сделкой.
$workflowid - это ссылка конкретный отдельный Бизнес-процесс. Найти связь можно с помощью Инспектора, чекнув value у чекбокса конкретного БП, а из Списка Бизнес-процессов можно узнать, к какой Сделке это относится.
Это ссылка на конкретный блок в Шаблоне Бизнес-процесса. Узнать его можно, щелкнув на шестеренку блока в Бизнес-процессе и нажав на кнопку ID.
С помощью имеющихся данных можно вычислить не только, какой именно агент тормозит - но проследить буквально до конкретного блока, который вызывает постоянные тормоза, что просто восхитительно.
А чтобы удаленные Сделки не забыли прибрать за собой - следует вызывать конструкцию
Bitrix\Bizproc\Worker\Document\DeleteStepper::execAgent('crm', 'CCrmDocumentDeal', 'DEAL_');
Она удаляет Бизнес-процессы и историю документов, связанный с удаленной сделкой.
Каждый сайт - это новый уникальный опыт, полный чарующих открытий (как минимум - в лексиконе). Пусть некоторые задачи и заставляют валяться в кататонический ступоре, нет проблем нерешаемых - есть только часы, что будут отданы во имя счастливого клиента.
Надеемся, что какая-то информация, выставленная здесь, помогла вам решить встречающиеся проблемы - или хотя бы дала направление, куда копать. Подписывайтесь, ставьте лайки Иначе зачем мы тут буковки печатаем, да ресурс клавиатуры расходуем.