• Как получить в ответ от веб хука результат работы бизнес процесса - текстовую строку?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Как получить в ответ от веб хука результат работы бизнес процесса — текстовую строку?


    Никак.

    Как архитектурно работает активити вебхук в Битрикс24 (не важно в облаке или в коробке (без кастомизаций)):
    1. Вызывается действие "Вебхук", на вход подается ссылка которая будет вызвана
    2. Проверяется регистрация на облачном провайдере (oauth.bitrix.info) (если регистрации нет, выполняется авторегистрация)
    3. Если регистрация есть (или прошла успешно) - двигаемся дальше, если нет - пропускаем шаг.
    4. На облачный провайдер (oauth.bitrix.info) передается ссылка. Там формируется задание на отправку и оно падает в очередь.
    5. Облачная очередь обрабатывается асинхронными скриптами и выполняется вызов этой исходной ссылки.

    Как можно увидеть в данном случае вызов осуществляет не портал, а облачная очередь и даже если ссылка что-то вернет - этот результата не будет обработан (ведь его обрабатывает даже не ваш Битрикс24)
    Ответ написан
    Комментировать
  • Правильный ли алгоритм создания сделки через REST в Bitrix24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Правильный ли алгоритм создания сделки через REST в Bitrix24?


    Правильный алгоритм создания сделки: берете метод `crm.deal.add` и создаете.
    Правильный ли это алгоритм с точки зрения бизнеса и вашей автоматизации это другой вопрос.

    Я так понимаю, что это лиды - это пользователи и делается через


    Лид это не пользователь и не сделка, а "намерение какого-то лица получить товар/услугу".
    Почему эта фраза в кавычках? Потому что звонок спамера это тоже лид, только некачественный. Запрос конкурентов - тоже лид.
    Запрос может быть как от нового клиента (новый лид), так и от текущего (повторный лид), но это определяется бизнес-процессами компании (не путать с бизнес-процессами Битрикс24).

    В некоторых компаниях лидов нет. Есть только сделки и контакты/компании. Например подобную схему использует AmoCRM.

    Правильно ли я понимаю, что надо перед тем как создавать сделку, надо сделать поиск лида (crm.lead.get) из списка всех лидов (/crm.lead.list)?


    Нет. Как уже говорили для создания сделки не следует искать лиды (если конечно бизнес-процесс вашего клиента не подразумевает такое), но даже если и следует, то `crm.lead.list` будет достаточно. Мне на практике не встречалось такого чтобы для создания сделки нужно было искать лиды - максимум текущий контакт/компанию по номеру телефону.

    В моем случае, кейсы обычно следующие:

    ~70% - создание лида
    - Сформировать данные которые нужно отправить
    - Отправить на `crm.lead.add`

    ~25% - создание сделки
    - У нас есть телефон или почта, через `crm.duplicate.findbycomm` ищем контакт/компанию.
    - Если контакт/компания не найдена - создаем.
    - Создаем сделку через `crm.deal.add`

    ~4% - создание повторного лида
    - У нас есть телефон или почта, через `crm.duplicate.findbycomm` ищем контакт/компанию.
    - Если контакт или компания найдена - создаем повторный лид
    - Если контакт или компания НЕ найдена - создаем лид
    Ответ написан
    Комментировать
  • Как скопировать файл из одного комментария в другой?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Чтобы прикрепить файл, вы должны его скачать.
    Рестовые методы не поддерживают возможноть быстрого копирования по идентификаторам, поэтому добавляйте accessKey к ссылке, скачивайте к себе и потом загружайте его к новому комментарию как обычно делаете
    Ответ написан
    Комментировать
  • Передача лидов с сайта в CRM BITRIX 24. Почему передается только один параметр fields?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Да дело в общем-то не в Битрикс24, а в механизме работы интернета и функции http_build_query которая не умеет нормально работать с многомерными массивами.
    Можно мучаться, пытаться делать двойное кодирование через http_build_query и т.п. а можно просто отправлять json и жить нормальной жизнью.

    $queryData = [
    	'fields' => [
    		"TITLE" => "lid 1",
    		"NAME" => "name name",
    		'PHONE' => [
    			[
    				"VALUE" => "654654",
    				"VALUE_TYPE" => "WORK"
    			]
    		]
    	],
    	'params' => ["REGISTER_SONET_EVENT" => "Y"]
    ];
    
    echo sendToBitrix('crm.lead.add', $queryData);
    
    function sendToBitrix( $method, $data )
    {
    	$curl = curl_init();
    
    	curl_setopt_array($curl, array(
    	  CURLOPT_URL => 'https://**********/'.$method,
    	  CURLOPT_RETURNTRANSFER => true,
    	  CURLOPT_ENCODING => '',
    	  CURLOPT_MAXREDIRS => 10,
    	  CURLOPT_TIMEOUT => 0,
    	  CURLOPT_FOLLOWLOCATION => true,
    	  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
    	  CURLOPT_CUSTOMREQUEST => 'POST',
    	  CURLOPT_POSTFIELDS =>json_encode($data),
    	  CURLOPT_HTTPHEADER => array(
    	    'Content-Type: application/json',
    	  ),
    	));
    
    	$response = curl_exec($curl);
    
    	curl_close($curl);
    	return $response;
    }
    Ответ написан
  • Как подключить Exchange календарь и почту в Битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Синхронизация почты - персональная.
    Синхронизация задач, событий и контактной книги - общая.

    На этом скриншоте вы конфигурируете сихнронизацию задач, событий и контактной книги.
    Для этого нужно чтобы EWS (Exchange web service - отдельная веб-служба Exchange сервера) умел принять от портала plain авторизацию и вы обладали достаточными полномочиями чтобы совершить требуемые действия.

    Если у вас НЕ включен веб-сервис на Exchange, если у на EWS НЕ включена plain авторизация, если у вашего аккаунта недостаточно полномочий (внезапно то что вы входите в свой календарь не значит что у вас есть доступ его подключить), то именно эту ошибку будет раз за разом выдавать EWS
    Ответ написан
  • Не работает обновление через crm.item.update?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вообще это не свойственная ошибка для данного метода - здесь нужно всегда обращаться в техническую поддержку для пояснения причины.

    Однако, `BX.rest` само по себе не является частью публичной библиотеки для REST приложений, что наталкивает на мысль: вы применяете эти методы в коробочном Битрикс24 и здесь можно предположить любые кастомизации.

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

    В любом случае: это ошибка не самого обновления, а какой-то sideeffect на который невозможно дать полноценного правильного ответа в данном случае.
    Ответ написан
    Комментировать
  • Как лучше организовать структуру для модуля битрикс?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Данный вопрос сильно выходит за пределы Bitrix Framework в целом.
    Это вопрос организации кода, опыта и стиля принятого в команде.

    Если хотите делать более канонично, то ориентируйтесь на те же модули битрикса и смотрите хорошие практики.
    Так, например принято делать делить на `controllers` (для контроллеров), `internals` (внутрение методы).
    Т.е. никаких `ajax.php` только контроллеры и все апи считается публичным (пусть и не документированным), если оно не помечено `@internal` или не находится в `internals`.
    Ответ написан
    1 комментарий
  • Как обновить пользовательские поля в событии календаря?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Метод `CCalendarEvent::GetById` является прослойкой в метод `CCalendarEvent::GetList`, а сам метод `CCalendarEvent::GetList` имеет встроенное кеширование (потому календарь это сложный механизм и там по факту не просто достает данные из БД, но и просчитывает регулярные события).

    Перед запросом попробуйте выключить кеширование:
    // Выключаем кеширование, запоминая предыдущее значение
    $oldCacheTime = \CCalendar::CacheTime();
    \CCalendar::CacheTime(0);
    
    // ... Делаем необходимые действия
    
    // Возвращаем все как было
    \CCalendar::CacheTime($oldCacheTime);
    unset($oldCacheTime);


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

    1. Статическое значение `eventlist`
    2. md5 от сериализованнх (serialize) параметров функции `GetList`
    3. Если включена проверка прав (параметр checkPermissions = true), то добавить 'perm' + ID текущего пользователя + '|'
    4. Если установлен модуль "Социальная сеть" и текущий пользователь администратор, то добавить: 'socnetAdmin|'

    Ну и все эти кеши складываются в `calendar/` подпапку.
    Ответ написан
  • Как возобновить закрытую задачу через БП активити PHP код?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Я набросал фрагмент кода, который поможет в подобной модификации.
    Кстати, в $updateData есть и другие ключи помимо ERRORS которые могут заполнить необходимые доп.объекты.

    use \Bitrix\Main,
    	\Bitrix\Tasks
    	;
    
    /**
     * Оборачиваем наш код в try-catch потому что мы не хотим
     * чтобы упавшее действие подвесело нам ход бизнес-процесса.
     *
     * Обращаю внимание: в catch блоке ловим именно Throwable, а не Exception.
     */
    try
    {
    	/**
    	 * Подключаем модуль Задачи (tasks) через requireModule
    	 * он в случае отсутствия модуля выкинет нам Exception
    	 */
    	Main\Loader::requireModule('tasks');
    
    	/**
    	 * Лучше избегать магических подстановок в c использованием фигурных скобок
    	 * Если там по какой-то причине будет экранирующий символ это больно ударит по системе
    	 *
    	 * Для этого используем 2 хака:
    	 * 1. Используем ParseValue метод, который из подобного синтаксиса достанет значение
    	 * 2. Чтобы мы сами не попали в автозамену регулярок разделим выражение так, чтобы мы 
    	 * не прошли по маске
    	 *
    	 * Ну и само-собой выражения на русском не парсятся, поэтому придется использовать 
    	 * старые выражения из технических полей.
    	 */
    	$actionUserId = (int) mb_substr(
    		$this->ParseValue("{"."=Document:AssigneById}"),
    		5
    	);
    
    	if ( empty($actionUserId) )
    	{
    		throw new \Exception("Employee identifier is empty!");
    	}
    
    	$taskId = (int) $this->ParseValue("{"."=Template:TaskId}");
    
    	if ( empty($taskId) )
    	{
    		throw new \Exception("Task identifier is empty!");
    	}
    
    	/**
    	 * Воспользуемся недокументированной функцией по обновлению задачи
    	 * В целом она дает то же самое - т.е. меняет статус, но дополнительно
    	 * метод вызывает необходимые push-уведомления, записи в логи, очистки 
    	 * кешей и т.п.
    	 */
    	$updateData = Tasks\Manager\Task::update(
    		$actionUserId,
    		$taskId,
    		[
    			'STATUS' => \CTasks::STATE_PENDING
    		]
    	);
    
    	if ( $updateData['ERRORS']->checkHasErrors() )
    	{
    		throw new \Exception( $updateData['ERRORS']->getMessages() );	
    	}
    
    	/* Сигнализируем что все ок */
    	$this->WriteToTrackingService(
    		"Task renewed",
    		0,
    		\CBPTrackingType::Custom
    	);
    }
    catch( \Throwable $e )
    {
    	/* Если что-то поймали - запишем в лог */
    	$this->WriteToTrackingService(
    		sprintf(
    			"Error '%s' in file %s on line %i",
    			$e->getMessage(),
    			$e->getFile(),
    			$e->getLine(),
    		),
    		0,
    		\CBPTrackingType::Error
    	);
    }
    Ответ написан
    1 комментарий
  • Как в Битрикс24 настроить исходящий веб-хук?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Как сделать так, чтобы в веб-хуке отправлялись сразу все данные нового лида (имя, телефон и т.д.)?


    Никак. Исходящий вебхук не предполагает подобных действий.
    Ответ написан
    Комментировать
  • Как повторно инициализировать форму?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вообще инициализация формы проходит один раз.
    Я конечно не проверял, но гипотетически, если вы сохраните ссылку на event.detail.object, то вы в любой момент после инициализации сможете динамически их менять. Но это не точно.
    Ответ написан
    1 комментарий
  • Как перенести страницы из B24 в Bitrix CMS?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если версия "Битрикс: Управление сайтом" и "Битрикс24" одинаковая, то вы можете воспользоваться механизмами экспорта-импорта, описанными в документации.

    При этом есть вероятность что при использовании CRM-форм, Контента из групп, приложений маркета, это будет не 100% перенос или даже вообще может не заработать.
    Ответ написан
  • Как в битрикс24 создать отдельный канбан для заказов с определенной системой оплаты?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Из интернет магазина заказыв летят в битрикс24.


    Здесь очень много нюансов:
    - Битрикс24 облачный или коробочный?
    - Если Битрикс24 коробочный то какая версия?

    Возможные варианты:

    Вариант 1:
    - У вас облачный Битрикс24 или коробочный битрикс последних версий (21.800 и выше)
    - Связь устанавливается Заказ -> Сделка (в б24)
    Тогда вы можете просто установить новую воронку https://helpdesk.bitrix24.ru/open/12048924/ и настроить там все что нужно

    Вариант 2:
    - У вас коробочный Битрикс24.
    - Версия коробочного Битрикс24 старая (21.000 и меньше)
    - Режим работы CRM: Сделки + Заказы
    Тут увы, ничего сделать вы не сможете.

    Вариант 2а:
    - Все то же самое что и в 2 только:
    - Режим работы CRM: Только Сделки
    Все нормально - берете решение от варианта 1 и работаете.
    Ответ написан
    Комментировать
  • Как отфильтровать реквизиты по дате?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    В целом у меня получился такой же код за исключением пары небольших дополнений:
    1. EntityRequisite довольно объемный класс (хранит достаточное количество переменных) и гонять его туда-сюда смысла особого нет, проще использовать существующий инстанс если он есть. Например если на странице не обращались к нему, то он и так будет создан, а если какая-то работа с ним велась то будет использован существующий экземпляр.
    2. В select поле звезда означает не "все" поля, а "все явные поля", т.е. если нужно выбрать действительно все поля то нужно дополнять поиск еще и "UF_*" чтобы выбрать действительно все.
    3. Лучше воспользоваться статической функцией createFromTimestamp на DateTime классе и передать туда strtotime - таким образом вы не будете зависеть от формата даты портала/пользователя.

    use \Bitrix\Main,
    	\Bitrix\Crm;
    
    Main\Loader::requireModule('crm');
    
    $entityRequisite = Crm\EntityRequisite::getSingleInstance();
    
    $requisiteList = $entityRequisite->getList([
    	'select' => ['*', 'UF_*'],
    	'filter' => [
    		'=CREATED_BY_ID' => 1,
    		'><DATE_CREATE'  => [
    			Main\Type\DateTime::createFromTimestamp( strtotime("28.09.2022 00:00:00") ),
    			Main\Type\DateTime::createFromTimestamp( strtotime("01.10.2022 00:00:00") )
    		]
    	],
    ]);
    
    foreach ($requisiteList as $requisite)
    {
    	var_dump($requisite);
    }


    P.S. Если вы делаете функцию под удаление, то смысла в самой функции нет, т.е. вы спокойно можете в этом же цикле определить нужен ли вам этот реквизит и удалить его если хотите.
    Ответ написан
    Комментировать
  • Как открыть в табе карточки CRM страницу базы знаний?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если что, коробок Битрикс.


    Если у вас коробочная версия Битрикс24, то не понимаю зачем вам тогда нужно использовать rest?
    Есть же Sidepanel который прекрасно открывает нужные страницы и не нужно создавать отдельные приложения
    Ответ написан
    Комментировать
  • Как открыть страницу во фрейме?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Использовать расширение sidepanel.
    Тут есть 2 варианта:
    - Вы можете через BX.Sidepanel.Instance.open открывать конкретную ссылку на конкретной странице в слайдере.
    - Либо сделать bind, чтобы при открытии вашей ссылки с любой страницы она открывалась в слайдере.
    Ответ написан
    Комментировать
  • Как исправить ошибки Push and Pull в битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    {"error":"NO_AUTH_FOUND","error_description":"Wrong authorization data"}


    Этот ответ выдает REST часть которая должна вернуть настройки.
    Возможно происходит одна из следующих частей:
    1. Пользователь, под которым наблюдается ошибка, является экстранет пользователем (т.е. не сотрудник организации).
    2. Публичная часть портала закрыта для пользователей (в админке, в настройках главного модуля закрыли доступ)
    3. Есть ошибки с хранением сессии на сервере.

    Если вы не закрывали доступ, то проверьте остальные пункты.
    Как проверить что пользователь является сотрудником организации? Нужно открыть в админке профиль пользователя и проверить чтобы у него было проставлено:
    - Активное подразделение (подразделение, которое является активным, т.е. не деактивировано)
    - Он должен состоять в группе сотрудники (обычно это **: Сотрудники и ID:12)

    Затем нужно проверить сессию.
    Откройте веб-консоль браузера и посмотрите на sessid (PHPSESSID в cookie) значение, при движении по порталу он не должен меняться часто (т.е. когда он один раз в день меняется - нормально, а если он меняется на каждой странице - не нормально).
    Ответ написан
  • Как принудительно обновить карточку лида/сделки?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Как можно принудительно обновить карточку или выкинуть пользователя из карточки?


    Никак
    Ответ написан
    Комментировать
  • Как запретить создавать дубль контакта через веб-хук?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    возможно ли сделать так чтобы если есть контакт то привязать к нему сделку?


    Нет, нельзя.
    Проверяйте сами перед созданием (getlist или findbycriteria методами).
    Ответ написан
    Комментировать
  • Как в сделку добавить "Ожидание" (Ждать) с помощью RestAPI?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    В REST такого действия еще не завезли.
    Ответ написан
    Комментировать