Здравствуйте. Нам нужен партнер (куратор) для доработок и консультаций на платной основе. У нас Битроник 2.0 Мы более года не обновляли не сам Битроник ни Битрикс. Ввиду того, что у нас на сайте было много сделано доработок. Теперь видимо пришло время обновиться и встал вопрос по переносу доработок. Некоторые доработки нам делали через т.п. Ромзы, а некоторые делал Дмитрий Крайний. С ним мы долго и плодотворно сотрудничали. Но недавно он нам сообщил, что устроился на работу, которая у него отнимает много времени. И предложил поискать другого куратора.
Можете ли Вы им стать?
На ближайшее время стоят задачи:
1. Перенести доработки (см. вкладку)
2. Устранить проблему- не отправляются письма триггерных рассылок.
3. Выполнить максимально возможно рекомендации сервиса
моя электронка
\Bitrix\Main\Loader::includeModule('iblock'); // сортировать в таком порядке ID $ids = [115, 120, 117, 109, 128]; $rs = \CIBlockElement::GetList( ['ID' => $ids], ['IBLOCK_ID' => '5', 'ID' => $ids], false, false, ['ID', 'IBLOCK_ID', 'NAME'] ); while ($ar = $rs->Fetch()) { echo $ar['ID'] . ' '; } // имеем вывод: // 115 120 117 109 128 |
SEL ECT `ID`, `IBLOCK_ID`, `NAME` FR OM `b_iblock_element` WHERE `ID` IN (115, 120, 117, 109, 128) AND `IBLOCK_ID` = 5 ORDER BY FIELD(`ID`, 115, 120, 117, 109, 128); |
[mysqld] transaction-isolation=READ-COMMITTED sync_binlog = 0 key_buffer_size = 8M pid-file = /var/run/mysqld/mysqld.pid socket = /var/run/mysqld/mysqld.sock datadir = /var/lib/mysql log-error = /var/log/mysql/error.log key_buffer_size=16M read_buffer_size=16M innodb_flush_method= O_DIRECT table_open_cache = 1200 innodb_flush_log_at_trx_commit = 0 innodb_log_buffer_size = 8M innodb_log_file_size = 32M |
[PHP] engine = On short_open_tag = on precis ion = 14 output_buffering = 4096 zlib.output_compression = Off implicit_flush = Off unserialize_callback_func = serialize_precision = -1 disable_functions = pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals, disable_classes = zend.enable_gc = On expose_php = Off max_execution_time = 30 max_input_time = 60 max_input_vars = 10000 memory_limit = 1000M error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT display_errors = On display_startup_errors = Off log_errors = On log_errors_max_len = 1024 ignore_repeated_errors = Off ignore_repeated_source = Off report_memleaks = On track_errors = Off html_errors = On variables_order = "GPCS" request_order = "GP" register_argc_argv = Off auto_globals_jit = On post_max_size = 100M auto_prepend_file = auto_append_file = default_mimetype = "text/html" default_charset = "UTF-8" doc_root = user_dir = enable_dl = Off cgi.fix_pathinfo=0 file_uploads = On upload_max_filesize = 100M max_file_uploads = 20 allow_url_fopen = On allow_url_include = Off default_socket_timeout = 60 [CLI Server] cli_server.color = On [sqlite3] sqlite3.defensive = 1 [Pcre] pcre.recursion_limit=100000 [Pdo_mysql] pdo_mysql.cache_size = 2000 pdo_mysql.default_socket= [mail function] SMTP = localhost smtp_port = 25 mail.add_x_header = Off [SQL] sql.safe_mode = Off [ODBC] odbc.allow_persistent = On odbc.check_persistent = On odbc.max_persistent = -1 odbc.max_links = -1 odbc.defaultlrl = 4096 odbc.defaultbinmode = 1 [Interbase] ibase.allow_persistent = 1 ibase.max_persistent = -1 ibase.max_links = -1 ibase.timestampformat = "%Y-%m-%d %H:%M:%S" ibase.dateformat = "%Y-%m-%d" ibase.timeformat = "%H:%M:%S" [MySQLi] mysqli.max_persistent = -1 mysqli.allow_persistent = On mysqli.max_links = -1 mysqli.cache_size = 2000 mysqli.default_port = 3306 mysqli.default_socket = mysqli.default_host = mysqli.default_user = mysqli.default_pw = mysqli.reconnect = Off [mysqlnd] mysqlnd.collect_statistics = On mysqlnd.collect_memory_statistics = Off [PostgreSQL] pgsql.allow_persistent = On pgsql.auto_reset_persistent = Off pgsql.max_persistent = -1 pgsql.max_links = -1 pgsql.ignore_notice = 0 pgsql.log_notice = 0 [bcmath] bcmath.scale = 0 [Session] session.save_handler = files session.use_strict_mode = 0 session.use_cookies = 1 session.use_only_cookies = 1 session.name = PHPSESSID session.auto_start = 0 session.cookie_lifetime = 0 session.cookie_path = / session.cookie_domain = session.cookie_httponly = session.serialize_handler = php session.gc_probability = 0 session.gc_divisor = 1000 session.gc_maxlifetime = 1440 session.referer_check = session.cache_limiter = nocache session.cache_expire = 180 session.use_trans_sid = 0 session.sid_length = 26 session.trans_sid_tags = "a=href,area=href,frame=src,form=" session.sid_bits_per_character = 5 [Assertion] zend.assertions = -1 [mbstring] mbstring.internal_encoding = utf-8 mbstring.func_overload = 2 [Tidy] tidy.clean_output = Off [soap] soap.wsdl_cache_enabled=1 soap.wsdl_cache_dir="/tmp" soap.wsdl_cache_ttl=86400 soap.wsdl_cache_limit = 5 [ldap] ldap.max_links = -1 [opcache] opcache.max_accelerated_files=100000 opcache.revalidate_freq=0 |
ALT ER TABLE b_calendar_event CHANGE ATTENDEES_CODES ATTENDEES_CODES LONGTEXT; |
try { $sms4b = new Csms4b(); $message = 'Текст СМС'; $to = '79871234567'; $sender = 'SMS4B-Test'; $sms4b->sendSingleSms($message, $to, $sender); } catch (\Rarus\Sms4b\Exceptions\Sms4bException $e) { //обработка ошибки AddMessage2Log($e->getMessage()); } |
try { $sms4b = new Csms4b(); $arPhonesMessages = [ '79781234567' => 'Текст первой СМС', '79789876543' => 'Текст второй СМС' ]; $sender = 'SMS4B-Test'; $sms4b->sendMultiSms($arPhonesMessages, $sender); } catch (\Rarus\Sms4b\Exceptions\Sms4bException $e) { //обработка ошибки AddMessage2Log($e->getMessage()); } |
try { $sms4b = new Csms4b(); $arPhonesMessages = [ '79781234567' => 'Текст первой СМС', '79789876543' => 'Текст второй СМС', ]; $sender = 'SMS4B-Test'; $dateStart = new \DateTime('2019-08-20 10:00'); $dateFinish = new \DateTime('2019-08-20 18:00'); $sms4b->sendDelayedSms($arPhonesMessages, $sender, $dateStart, $dateFinish); } catch (\Rarus\Sms4b\Exceptions\Sms4bException $e) { //обработка ошибки AddMessage2Log($e->getMessage()); } |
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('rarus.sms4b', 'FinalStatus', 'finalStatusHandler'); /** * @param Rarus\Sms4b\Sendings\Messages\Message $message * @param Rarus\Sms4b\Sendings\Messages\Status $status */ function finalStatusHandler($message, $status) { if ($status->isNotDelivered()) { //уведомление клиента по почте } |
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('rarus.sms4b', 'LoadIncoming', 'loadIncomingHandler'); /** * @param Rarus\Sms4b\Incoming\Incoming $incoming */ function loadIncomingHandler($incoming) { /** * код обработчика */ } |
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('rarus.sms4b', 'BeforeSmsSend', 'beforeSmsSendHandler'); /** * @param array $arPhonesMessages * @param string| null $sender * @param string| null $mailEvent * @param Rarus\Sms4b\Sendings\Source\Source $source * @param int $entitiesId * * @return array */ function beforeSmsSendHandler($arPhonesMessages, &$sender, $mailEvent, $source, $entitiesId) { /** * код обработчика */ return $arPhonesMessages; } |
$eventManager = \Bitrix\Main\EventManager::getInstance(); $eventManager->addEventHandler('rarus.sms4b', 'AfterSmsSend', 'afterSmsSendHandler'); /** * @param \Rarus\Sms4b\Sendings\Sending $sending */ function afterSmsSendHandler(Rarus\Sms4b\Sendings\Sending $sending) { /** * код обработчика */ } |
$eventManager = \Bitrix\Main\EventManager::getInstance(); // Изменение сущности оплаты $eventManager->registerEventHandler( "sale", "OnSalePaymentEntitySaved", $this->MODULE_ID, "\Integration\Handler\Order", "OnSalePaymentEntitySaved" ); |
/** * @param Event $obEvent * @throws \Bitrix\Main\ArgumentException * @throws \Bitrix\Main\ArgumentNullException * @throws \Bitrix\Main\LoaderException * @throws \Bitrix\Main\NotImplementedException */ public function OnSalePaymentEntitySaved(Event $obEvent) { if (!Loader::includeModule("custommolule.integration")) { return; } /** @var \Bitrix\Sale\Payment $obPayment */ $obPayment = $obEvent->getParameter("ENTITY"); $arPayment = $obPayment->getFields()->getValues(); $obEntity = \Bitrix\Sale\Order::load($arPayment["ORDER_ID"]); Payment\Base::createInstance($arPayment, $obEntity); } |
for ($i=0;$i<800;$i++){ preg_match("(.*)def$/", "abc", $matches); } |
"/(.*)def$/" |
// Создаем поток $opts = array( 'http' => array( 'method' => "GET", 'header' => "BX-ACTION-TYPE: get_dynamic\r\n" . "BX-CACHE-MODE: HTMLCACHE\r\n" ) ); $context = stream_context_create($opts); // Открываем файл с помощью установленных выше HTTP-заголовков $pageData = file_get_contents($URL, false, $context); |
Пост скорее ознакомительный, полезный больше для клиентов, чем для разработчиков.
Вопрос особенно актуален в компаниях среднего и крупного размера. Менеджеры ежедневно тратят время на обработку тех заявок, которые до определенного момента не нуждаются во внимании и вполне могут быть обработаны автоматически.
Ниже приведу некоторый список типичных и простых бизнес процессов для лидов, успешно внедренных на одном из предприятий.
Форма подписки
Первое действие, которое можно легко автоматизировать. У каждого лида в Б24 есть поле “источник”, которое можно проверять в блоке условия БП. Далее действия довольно очевидны и можно легко разобраться по скриншоту:
Здесь следует пояснить, что для повторных лидов смена статуса на “успешный” - это в некоторой мере хак, потому что через интерфейс так сделать невозможно (система потребует сконвертировать такой лид в повторную сделку). Но на уровне бизнес-процессов такая операция проходит, сохраняя при этом отчетность по конверсии лидов.
Если же лид не повторный, то наиболее разумное решение - сконвертировать его в контакт без сделки для последующей отправки рассылок через модуль CRM-маркетинга.
Некорректные контактные данные
Тоже вполне актуальная проблема. Не всегда пользователи корректно заполняют свои контактные данные. И не все источники лидов позволяют производить валидацию данных перед отправкой.
Для реализации алгоритма потребуются две переменные - целочисленная длина телефона и булево значение “брать в работу”.
Для определения минимальной допустимой длины телефонного номера можно задать константу:
На практике минимальная длина телефона равна 10. Для более коротких номеров телефона угадать код страны и города затруднительно.
Переменная “длина номера” заполняется конструкцией:
=strlen({=Document:PHONE_PRINTABLE})
В итоге получаем итоговую схему БП:
Случай может быть довольно редкий, но не будет лишний раз отвлекать внимание менеджера.
Форма запроса информации
Пример очень похож на обработку лида с формы подписки. Разница только в том, что клиенту еще дополнительно отправляется на почту некоторая интересующая его информация - в данном случае тематический вебинар. Осуществляется это, например, с помощью блока “Запуск бизнес-процесса”.
Обработка лидов с некорректным телефоном с помощью роботов
Б24 позволяет создавать промежуточные статусы лидов и навешивать на них “роботов”, которые фактически являются теми же бизнес-процессами, только автоматически запускающимися при переводе лида в соответствующий статус.
Следующий бизнес-процесс реализован для статуса “Запрос телефона”. Довольно часто встречаются случаи, когда клиент оставляет в заявке корректный емейл и некорректный номер телефона. Простейший алгоритм робота представлен на скриншоте ниже:
Задача “контроль выхода на связь” здесь очень желательна, потому что если ее не ставить, то во вкладке “Лиды” у менеджера лид будет отображаться как лид без дел.
Также перед отправкой первого письма добавлена пятиминутная пауза на случай ошибочного перевода лида в этот статус.
Заключение
Фактически все приведенные выше бизнес-процессы - это автоматическая реализация некоторых скриптов отдела продаж. При этом выполнение действий запускается либо по нажатию на одну кнопку, либо вообще без участия менеджера. При этом система позволяет выдерживать паузы, слать письма с персонализацией отправителя и получателя, расставлять задачи и уведомлять о результатах работы.
Если говорить о практике внедрения - как правило подобные несложные процессы автоматизации отрабатывают для небольшого процента поступающих лидов. Однако по соотношению затрат на настройку и выгоды от использования игра определенно стоит свеч. Даже если сэкономить таким образом лишние 15 минут работы менеджера в день, то за месяц будет накапливаться по несколько часов на каждого.
Лучше уж потратить один раз пару часов времени одного разработчика, не правда ли?
var initForm = function (presets, fields) { return { "id":"7", "lang":"ru", "sec":"tmrknv", "type":"button", "click":"", "ref" : "https://ВАШ_ПУТЬ_К_Bitrix24/bitrix/js/crm/form_loader.js", "presets": presets, "fields": fields }; } |
var reinitForm = function (presets, fields) { if(!window.Bitrix24FormObject || !window[window.Bitrix24FormObject]) return; if(!window[window.Bitrix24FormObject].forms) return; Bitrix24FormLoader.unload(b24paramsload); b24paramsload = initForm(presets, fields); Bitrix24FormLoader.params = b24paramsload; Bitrix24FormLoader.init(); Bitrix24FormLoader.showPopup(b24paramsload); } ....... //тем временем при загрузке карточки presets = {"izdelie": ''+element.ITEM.NAME}; ....... BX.ready(function () { BX.bind( BX('portfolio_detail_form_open'), 'click', BX.delegate( function(e){ e.preventDefault(); //console.log(e); //посмотреть на Иван Иваныча reinitForm(presets, {"values": { "LEAD_COMMENTS" : 'Хочу такое же - ' +presets.izdelie}}); }, this ) ); }); |