Ответы пользователя по тегу Битрикс24
  • Передача лидов с сайта в 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 такого действия еще не завезли.
    Ответ написан
    Комментировать
  • Есть ли PHP запрос автоматическое создание ссылки Битрикс 24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если вы имеете ввиду REST методы, то нет.

    Если у вас коробочная версия и вы хотите использовать API битрикса чтобы это сделать, то вы можете посмотреть пример в файле:
    /home/bitrix/www/bitrix/activities/bitrix/crmgetpaymenturlactivity/crmgetpaymenturlactivity.php


    Обратите внимание на getUrlByDealId и createPayment методы - они как раз делают то что вам нужно.

    У меня есть небольшая, но непроверенная заготовка-выжимка:

    use \Bitrix\Main,
    	\Bitrix\Salescenter\Builder,
    	\Bitrix\Salescenter\Integration
    	;
    
    /**
     * @var int
     */
    $dealId = 1;
    
    try
    {
    	Main\Loader::requireModule('crm');
    
    	$deal = \CCrmDeal::GetByID($dealId, false);
    	if (!$deal)
    	{
    		throw new \Exception("Deal not found");
    	}
    
    	$builder = Builder\Manager::getBuilder(
    		Builder\SettingsContainer::BUILDER_SCENARIO_PAYMENT
    	);
    
    	$builder->build(
    		$this->getBuilderData($deal)
    	);
    
    	$order = $builder->getOrder();
    
    	$r = $order->save();
    
    	if (!$r->isSuccess())
    	{
    		throw new \Exception("Order update error:".implode(', ', $r->getErrorMessages()));
    	}
    
    	$foundPayment = null;
    
    	foreach ($order->getPaymentCollection() as $payment)
    	{
    		$foundPayment = $payment;
    	}
    
    	if ( is_null($foundPayment) )
    	{
    		throw new \Exception("Payment not found");
    	}
    
    	$urlInfo = Integration\LandingManager::getInstance()->getUrlInfoByOrder(
    		$payment->getOrder(),
    		['paymentId' => $payment->getId()]
    	);
    
    	// Payment url: $urlInfo['shortUrl']
    }
    catch( \Throwable $e )
    {
    	var_dump($e);
    }
    Ответ написан
    Комментировать
  • Как обновить страницу пользователя с помощью Push&Pull?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Возможно ли с помощью Push&Pull обновить страницу лида/сделки, которую просматривает пользователь?


    Если вы спрашиваете про абстрактную возможность обновления страницы через push'n'pull технологии то она есть.
    Если вы спрашиваете конкретно про использование push'n'pull технологии в приложениях Битрикс24, то ее нет.
    Ответ написан
  • Как настроить пропущенные звонки в B24 коробка?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Подобной настройки нет.

    Дело в том, что лид создается заранее, когда еще нет понимания звонок пропущен или нет.
    В коробочной версии Битрикс24 можно сделать отложенный агент обработчик, который бы проверял был ли лид создан по звонку и уже проверял статус звонка.
    Ответ написан
    Комментировать