Задать вопрос
Ответы пользователя по тегу Битрикс24
  • По какому событию отслеживать редактирование структуры компании в Битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Добрый день,

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

    Если смотреть в рамках битрикса, то:
    - редактирование пользователя - событие OnAfterUserUpdate модуля main ( обязательно проверяйте ключ RESULT в $arFields)
    - редактирование подразделения - событие OnAfterIBlockSectionUpdate модуля iblock ( обязательно проверяйте ключи RESULT и IBLOCK_ID для фильтрации только нужных подразделений)
    Аналогично с удалением и добавлением
    Ответ написан
    2 комментария
  • Почему Метод Fetch() в произвольном php коде бизнес процесса Битрикс24 не возращает false?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Мне кажется, что дело не в методе fetch. Основной вопрос заключается в том, что находится в переменной $em, в тот момент, когда находятся элементы.

    Вы же знаете, что при значении $em = true, это аналогично $em = 1, а $em = false - ничего не найдет.

    После присвоения $em допишите код:
    ob_start();
    echo "<pre>";
    var_dump( array(
      'ENTITY_ID' => 'LEAD',
      'VALUE' =>$em , 
      'COMPLEX_ID' => 'EMAIL_WORK' 
    ));
    file_put_contents($_SERVER['DOCUMENT_ROOT'].'/test_bp_val.txt', ob_get_clean(), FILE_APPEND);

    И поймете почему он возвращает то или иное значение
    Ответ написан
  • Как проверять на существование лидов с таким же Email. Битрикс24. Коробочная версия?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Сделать нужно немножечко подругому:

    Изучите нижеследующий код и rest-метод crm.duplicate.findbycomm. Смотрите в /home/bitrix/www/bitrix/modules/crm/classes/general/restservice.php

    use \Bitrix\Main;
    use \Bitrix\Crm;
    
    /* @var string Email, который будем искать */
    $sEmail = 'swap@google.com';
    
    /* @var array ID лидов, которые попадаются под условия */
    $arLeadIds = [];
    
    if ( Main\Loader::IncludeModule('crm') )
    {
    	// Формируем критерий, подсовываем Email
    	$criterion = new Crm\Integrity\DuplicateCommunicationCriterion( Crm\CommunicationType::EMAIL_NAME, $sEmail);
    
    	// Выполняем поиск первых 20 клиентов
    	$duplicate = $criterion->find( \CCrmOwnerType::Lead, 20);
    
    	// Если найдены entity проитерируем их
    	$entities = $duplicate->getEntities();
    	if ( !empty($entities) )
    	{
    		foreach($entities as $entity)
    		{
    			$arLeadIds[] = $entity->getEntityID();
    		}
    	}
    }
    
    // А тут будут ID сделок
    var_dump($arLeadIds);
    Ответ написан
    3 комментария
  • Как опубликовать сообщение в группе с помощью API?

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

    Подключаем модуль Соц.сети:
    CModule::IncludeModule("socialnetwork");

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

    $arFields = array(
     "TITLE" => "Заголовок записи",
     "DETAIL_TEXT" => "Тело сообщения",
     "BLOG_ID" => 1, //ID отправителя
     "AUTHOR_ID" => 1, //ID блога, в котором будет запись
     "DATE_PUBLISH" => '11.02.2014 09:08', // дада
     "PUBLISH_STATUS" => BLOG_PUBLISH_STATUS_PUBLISH, // Читаем в API
     "ENABLE_TRACKBACK" => 'N',
     "ENABLE_COMMENTS" => 'Y'
    );


    При успешном добавлении ($ID = CBlogPost::Add($arFields);) получим ID blogPost записи

    Затем необходимо отправить это сообщение в ленту, для нам нужен фрагмент кода (заменить соответствующим образом):

    $arEvent = array (
    	'EVENT_ID'     => 'blog_post',
    	'=LOG_DATE'    => 'now()',
    	'TITLE_TEMPLATE' => '#USER_NAME# добавил(а) сообщение "#TITLE#" в блог',
    	'TITLE'    => "Заголовок записи",
    	'MESSAGE'  => "Текст записи",
    	'TEXT_MESSAGE'  => "Текст записи",
    	'MODULE_ID'     => 'blog',
    	'CALLBACK_FUNC' => false,
    	'SOURCE_ID'     => $ID,
    	'ENABLE_COMMENTS'  => 'Y',
    	'RATING_TYPE_ID'   => 'BLOG_POST',
    	'RATING_ENTITY_ID' => $newID,
    	'ENTITY_TYPE' => 'U',
    	'ENTITY_ID'   => '1',
    	'USER_ID'     => '1',
    	'URL' => '/company/personal/user/1/blog/'.$ID.'/',
    );


    Создаём запись в ленте через: CSocNetLog::Add, на выходе получаем eventID (в случае успеха)

    Если все прошло хорошо, то выставляем права на пост (в премере отправляем ВСЕМ ПОЛЬЗОВАТЕЛЯМ G3)

    // Выдает права
    CSocNetLogRights::Add ( $eventID, array ("G3") );
    // Отправляет уведомление о новом сообщении
    CSocNetLog::SendEvent ( $eventID, 'SONET_NEW_EVENT' );


    Радуемся =)

    Все параметры получаются по средствам GetList например.
    Ответ написан
    4 комментария
  • Как добавить фильтр в модуль техподдрежки в Битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Насколько я помню, фильтрация по ответственному менеджеру там есть из коробки.
    Фильтрация по теме и по сообщению идут слитно.
    Есть только одна фильтрация, которой в коробке нет - по автору, т.е. он ищет, но только при условии что автор - пользователь портала.
    Ответ написан
    Комментировать
  • Каким образом открытые линии в Битрикс24 собирают лиды со всех источников?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Давайте для начала немного фактов:
    1) Модуль существует и он работает, но обширной документации нет
    2) Он уже больше года не развивается
    3) Даже 1С-Битрикс не использует данный модуль

    Насколько я знаю, решения для интеграции ТП с ОЛ нет (2 независимых модуля) и учитывая п.2 - ждать ее не стоит (ИМХО).
    Что касается распределения тикетов по сотрудникам - для этого можно использовать подписку на событие: OnBeforeTicketAdd и уже там менять ответственного исходя из Ваших нужд.

    Наиболее адекватный вариант - писать свою прослойку для email и ОЛ, благо современный битрикс в коробке позволяет множество кастомизаций (спасибо rest api bitrix24). Так что, если хотите построить техподдержку на базе битрикса, все придется писать с 0.
    Ответ написан
  • Битрикс CRM Коробка. Как добавить пользовательское поле в форму импорта лидов из файла?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Чтобы это поле появилось при импорте, нужно чтобы оно существовало у лида.
    Для этого нужно создать пользовательское поле у лида. А сделать это можно двумя способами:
    1) Через публичные настройки CRM: Настройки -> Настройки форм отчетов -> Пользовательские поля -> Лид: Добавить поле
    2) Через административную панель: Настройки -> Настройки сайтов -> Пользовательские поля -> Добавить.
    В таком случае Вы должны сначала выбрать тип поля, а потом уже объект, который в случае лида будет (как вы верно указали) - CRM_LEAD (насколько я помню, в идеальном случае оно должно не множественным)
    Ответ написан
    4 комментария
  • А как связать сервис Seeneco и Битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если у Seeneco есть API (а я его на сайте не нашел), то можно и даже относительно легко.
    Если у Seeneco нет API, то можно, но уже сложнее.

    Концептуальный ответ - да.
    Ответ написан
    Комментировать
  • Групповая смена ответственного из сделки в контакте и компании в CRM Битрикс, коробочная версия?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вы правильно нашли, за это отвечает компонент bitrix:crm.deal.list, который лежит в /bitrix/components/bitrix/crm.deal.list/component.php.
    Код несколько запутанный, но работает следующим образом:

    На ~614 сроке ( ~ 614 - 679 ) находится код, который парсит полученные данные и собирает их в массив $actionData
    //region Try to extract user action data
    // We have to extract them before call of CGridOptions::GetFilter() or the custom filter will be corrupted.
    $actionData = array(
    	'METHOD' => $_SERVER['REQUEST_METHOD'],
    	'ACTIVE' => false
    );
    
    if(check_bitrix_sessid())
    {
    	$postAction = 'action_button_'.$arResult['GRID_ID'];
    	$getAction = 'action_'.$arResult['GRID_ID'];
    	//We need to check grid 'controls'
    	$controls = isset($_POST['controls']) && is_array($_POST['controls']) ? $_POST['controls'] : array();
    	if ($actionData['METHOD'] == 'POST' && (isset($controls[$postAction]) || isset($_POST[$postAction])))
    	{
    		CUtil::JSPostUnescape();
    
    		$actionData['ACTIVE'] = true;
    
    		if(isset($controls[$postAction]))
    		{
    			$actionData['NAME'] = $controls[$postAction];
    		}
    		else
    		{
    			$actionData['NAME'] = $_POST[$postAction];
    			unset($_POST[$postAction], $_REQUEST[$postAction]);
    		}
    	...
    	...
    	...
    		$actionData['AJAX_CALL'] = $arResult['IS_AJAX_CALL'];
    	}
    }
    //endregion


    А с ~915 строки начинается непосредственная обработка ( ~915 - 1457):

    // POST & GET actions processing -->
    if($actionData['ACTIVE'])
    {
    	if ($actionData['METHOD'] == 'POST')
    	{
    		if($actionData['NAME'] == 'delete')
    		{
    		...
    		elseif($actionData['NAME'] == 'assign_to')
    		{
    			if(isset($actionData['ASSIGNED_BY_ID']))
    			{
    				$arIDs = array();
    				if ($actionData['ALL_ROWS'])
    				{
    					$arActionFilter = $arFilter;
    					$arActionFilter['CHECK_PERMISSIONS'] = 'N'; // Ignore 'WRITE' permission - we will check it before update.
    					$dbRes = CCrmDeal::GetListEx(array(), $arActionFilter, false, false, array('ID'));
    					while($arDeal = $dbRes->Fetch())
    					{
    						$arIDs[] = $arDeal['ID'];
    					}
    				}
    				elseif (isset($actionData['ID']) && is_array($actionData['ID']))
    				{
    					$arIDs = $actionData['ID'];
    				}
    
    				foreach($arIDs as $ID)
    				{
    					if (!CCrmDeal::CheckUpdatePermission($ID, $userPermissions))
    					{
    						continue;
    					}
    
    					$DB->StartTransaction();
    
    					$arUpdateData = array(
    						'ASSIGNED_BY_ID' => $actionData['ASSIGNED_BY_ID']
    					);
    
    					if($CCrmDeal->Update($ID, $arUpdateData, true, true, array('DISABLE_USER_FIELD_CHECK' => true)))
    					{
    						$DB->Commit();
    
    						$arErrors = array();
    						CCrmBizProcHelper::AutoStartWorkflows(
    							CCrmOwnerType::Deal,
    							$ID,
    							CCrmBizProcEventType::Edit,
    							$arErrors
    						);
    					}
    					else
    					{
    						$DB->Rollback();
    					}
    				}
    			}
    		}
    		...
    	}
    }
    // <-- POST & GET actions processing


    Но есть маленький нюанс, если Вам нужно менять ответственного в связанных сущностях, кастомизация данного кода будет не лучшим решением.
    В таком случае у Вас будет задвоение, например ответственного можно поменять через массовую смену ответственного в списке, через редактирование сделки, через блок действия бизнес-процесса и так далее. И все это разные механизмы. Общее у них только одно - они все используют события на изменения/добавление.
    Ответ написан
  • Битрикс CRM Получить ID контакта?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Есть как минимум 2 варианта (без прямых запросов в базу) как это сделать:

    1) Высокоуровневый (работает всегда). Метод с поддержкой обратной совместимости: CCrmContact::GetList (bxapi.ru/src/?id=183244)

    Применение (за основу взял код описанный Артем):

    /* @var array Список контактов */
    $arContacts = array();
    
    if ( \Bitrix\Main\Loader::IncludeModule('crm') )
    {
    	/* @var array Сортировка полученного списка контактов */
    	$arOrder  = array('ID' => 'DESC');
    
    	/* @var array Условия получаемого списка контактов */
    	$arFilter = array(
    		"NAME"      => "Имя",
    		"LAST_NAME" => "Фамилия",
    		'CHECK_PERMISSIONS' => 'N' // Данный ключ необходим для того чтобы получить всех пользоватей,
    								   // иначе, будет найден только если ответственным за него является тот,
    								   // под кем запускается скрипт в битриксе
    	);
    
    	/* @var array Получаемые поля для списка контактов */
    	$arSelect = array(
    		'ID'
    	);
    
    	// NOTE: Запрашивайте только необходимые поля
    	$res = CCrmContact::GetList( $arOrder, $arFilter, $arSelect );
    
    	while( $arContact = $res->fetch() )
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    }
    
    // Тут в $arContacts либо пустой массив, либо массив с ID контактами, которые соответствуют условию поиска


    2) Низкоуровневый DataMapper (новый подход d7)

    use \Bitrix\Main\Loader;
    use \Bitrix\Crm;
    
    /* @var array Список контактов */
    $arContacts = array();
    
    if ( Loader::IncludeModule('crm') )
    {
    
    	$resContacts = Crm\ContactTable::getList(array(
    		'select' => array('ID'),
    		'filter' => array(
    			"NAME"      => "Имя",
    			"LAST_NAME" => "Фамилия",
    		),
    		'order' => array('ID' => 'DESC')
    	));
    
    	while( $arContact = $resContacts->fetch() )
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    
    	/*
    	Начиная с 17 версии (вроде бы), можно делать так:
    	foreach( $resContacts as $arContact)
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    	вместо while цикла
    	*/
    }


    Преимущество первого подхода:
    - Работает всегда, как для новых, так и для старых проектов
    - Можно использовать уровни доступа

    Преимущество нового подхода:
    - Технологически универсален за счет d7 (можно в runtime прибавлять связи, доставать связанные сущности и т.п.)
    - В DataMapper есть технология кеширования, т.е. можно закешировать результат просто добавив в массив getList еще один ключик
    - Субъективно код легче воспринимается
    Ответ написан
    3 комментария
  • Битрикс CRM Где находиться форма смена ответственного из сделки?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вам не нужно для этого изменять внешний вид сделки и crm.entity.quickpanelview Вам тоже трогать не нужно.

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

    P.S. Я как практикующий Битрикс24 разработчик, могу с уверенностью сказать, что из-за решения которое Вы хотели реализовать (через crm.entity.quickpanelview) битрикс и не любят. Т.е. кто-то кастомит компонент, а другим потом разбираться.
    Ответ написан
    2 комментария
  • Возможно ли настроить телефонию Битрикса24 на мобильные телефоны, минуя "Мои звонки"?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Насчет отправки смс не знаю, а в Вашем случае - ознакомьтесь со статьей - https://www.moizvonki.ru/guide/bitrix24/
    Ответ написан
    Комментировать
  • Как создать новый тип поля в Битрикс24?

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

    Потом, нужно подумать, можно ли это получить другим способом. Например для инфоблока, вы можете использовать существующее поле "HTML/текст" и в нем указать, что принудительно использовать HTML без возможности смены типа.

    Если это не то и уж очень хочется сделать свое, то можно поискать информацию в интернете:

    Есть описание как создать свои типы свойств - https://blog.sibirix.ru/2012/05/12/user-type-descr... статья хорошая и описание приличное. Или вот например тут - blog.gealab.ru/web/user_type_oniblockpropertybuild... есть описание

    Если например вы хотите создать новый тип поля: https://dev.1c-bitrix.ru/community/blogs/oracle/183.php

    Но хочу отметить сразу: Бизнес-процессы и Библиотека документов НЕ будут использовать Ваши типы полей - их список не расширяем и зашит в ядре системы.
    Ответ написан
    2 комментария
  • Битрикс форма для кастомного сайта?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если совсем кастомная форма - https://dev.1c-bitrix.ru/community/blogs/chaos/3980.php

    Это подойдет лучше чем веб-форма, ибо логика и отображение не страдает
    Ответ написан
    Комментировать
  • Почему не создает и не возвращает ошибку при создании свойства в Битрикс?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если он вернул false, ошибку вы можете получить функцией:
    $error = $APPLICATION->GetException();
    Ответ написан
    Комментировать
  • Почему нет пункта меню "Приложения"?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    1) Обновите 1С-Битрикс
    2) Проверьте установлен и активирован ли модуль REST
    Ответ написан
    Комментировать
  • У кого-нибудь есть опыт интеграции Битрикса с Salesforce?

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