• Как сделать вызов модуля из задачи?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    То что вы хотите сделать не является простым действием для коробки.
    Возможно вам стоит сделать REST приложение и использовать места встройки? Например TASK_VIEW_TOP_PANEL и TASK_LIST_CONTEXT_MENU
    Ответ написан
  • Почему приложение Bitrix24 не передает данные в БД?

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


    Это проблема вашего приложения. Возможно оно запрашивает определенное количество данных и следит за ним и попросту не способно вытягивать все данные. Например там один батч-запрос на 2500 сделок или оно не предназначено для работы с лимитами. В любом случае только анализ вашего приложения может дать какое-то вменяемое решение, так как проблема в нем.
    Ответ написан
    Комментировать
  • Можно ли как то выудить ключ битрикс24 из бэкапа?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Лиценизонный ключ находится в файле bitrix/license_key.php - его можно использовать для разворачивания чистой коробки последней версии.
    Ответ написан
    Комментировать
  • Каким PHP CURL_* константам соответствуют данные опции CURL?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А чем CURLOPT_SSLCERT (cert), CURLOPT_SSLKEY (key) и CURLOPT_CAINFO (cacert) не подходят?

    Например:
    curl_setopt($ch, CURLOPT_CAINFO, dirname(__FILE__) . '/cacert.pem');


    Подробнее в доке: https://www.php.net/manual/ru/function.curl-setopt.php
    Ответ написан
  • Почему не запускается функция при наступлении события?

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

    Давайте разберемся что у вас получлось правильно:
    - Вы решили использовать механизм событий
    - Вы правильно определили событие
    - Вы использовали local-папку для разработки
    - Вы попытались разделить ответственность между подпиской на событием и непосредственно ее обработчиком.

    Теперь что у вас НЕ получилось.

    Для начала это сама подписка на событие.
    - Вы не правильно поняли ее аргументы
    - Вы использовали устаревшую надстройку для подписки.

    Начнем с обратного порядка: AddEventHandler это лишь обертка над \Bitrix\Main\EventManager::addEventHandlerCompatible поэтому мы будем использовать его.

    Для начала перепишем ваш код дословно на "новый лад":

    $eventManager = \Bitrix\Main\EventManager::getInstance();
    $eventManager->addEventHandlerCompatible(
    	'main',
    	'OnAfterUserAdd',
    	[
    		'AddUserToGroupChatsClass',
    		'AddUserToGroupChats'
    	],
    	$_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/event_handlers/add_user_to_group_chats_class.php"
    );


    Оно выглядит лучше но по-прежнему не работает.

    Порядок аргументов addEventHandlerCompatible и AddEventHandler одинаковый и состоит из:

    - FROM_MODULE_ID - на какой модуль подписываемся
    - MESSAGE_ID - на какое событие подписываемся
    - CALLBACK - callback обработчик (будет вызван для )
    - SORT - порядок выполнения относительно других событий
    - FULL_PATH - путь к файлу

    Т.е. получается что у тебя нарушен порядок аргументов. Корректнее было бы так:
    $eventManager = \Bitrix\Main\EventManager::getInstance();
    $eventManager->addEventHandlerCompatible(
    	'main',
    	'OnAfterUserAdd',
    	[
    		'AddUserToGroupChatsClass',
    		'AddUserToGroupChats'
    	],
    	100,
    	$_SERVER["DOCUMENT_ROOT"] . "/local/php_interface/event_handlers/add_user_to_group_chats_class.php"
    );


    Теперь разберемся с самой подписной моделью: вы хотите использовать свой класс и выделить его в отдельный файл для удобства.
    Не будем поднимать вопросы по поводу нейминга, но совершенно не обязательно подключать дополнительный файл для события. Рекомендую почитать про spl_autoload и composer.
    Давайте воспользуемся нашей готовой разработкой init.php и разместим в init.php маленький автолоадер.

    Предположим что за добавление будет отвечать ваш класс AddUserToGroupChatsClass

    Ваш init.php:
    /**
     * - /local/php_interface/classes/{Path|raw}/{*|raw}.php
     * - /local/php_interface/classes/{Path|ucfirst,lowercase}/{*|ucfirst,lowercase}.php
     */
    spl_autoload_register(function($sClassName)
    {
    	$sClassFile = __DIR__.'/classes';
    
    	if ( file_exists($sClassFile.'/'.str_replace('\\', '/', $sClassName).'.php') )
    	{
    		require_once($sClassFile.'/'.str_replace('\\', '/', $sClassName).'.php');
    		return;
    	}
    
    	$arClass = explode('\\', strtolower($sClassName));
    	foreach($arClass as $sPath )
    	{
    	    $sClassFile .= '/'.ucfirst($sPath);
    	}
    	$sClassFile .= '.php';
    	if (file_exists($sClassFile))
    	{
    		require_once($sClassFile);
    	}
    });
    
    $eventManager = \Bitrix\Main\EventManager::getInstance();
    $eventManager->addEventHandlerCompatible(
    
    	'main',
    	'OnAfterUserAdd',
    	[
    		'AddUserToGroupChatsClass',
    		'AddUserToGroupChats'
    	]
    );


    Теперь нужно разметить ваш класс в файле: /local/php_interface/classes/AddUserToGroupChatsClass.php
    Заметьте - мы удалили сортировку (вам не важем порядок) и подключение файла - за это теперь отвечает автолоадер.

    Теперь поработаем с содержимым этого файла.
    Произведем косметические изменения:
    - уберем лишние отступы
    - добавим phpdoc

    Произведем функциональные изменения:
    - приведем файл к виду opentag -> namespace -> use -> class
    - добавим описание метода необходимые для вызова его в call_user_func_array
    - Пропишем корректные праметры к Debug::writeToFile методу

    <?php
    
    use \Bitrix\Main\Diag;
    
    class AddUserToGroupChatsClass
    {
    	/**
    	 * Handle main::OnAfterUserAdd event
    	 *     after add user to groups
    	 * @param array &$arFields User data
    	 * @return void
    	 */
    	public static function AddUserToGroupChats( &$arFields )
    	{		 
    		Diag\Debug::writeToFile(
    			[
    				'text'   => "Событие наступило",
    				'fields' => $arFields
    			],
    			date('d.m.Y'),
    			"AddUserToGroupChatsClass.log"
    		); 
    	}
    }


    В результате проделанной работы будет создан файл `AddUserToGroupChatsClass.log` (у меня bitrix env и $_SERVER['DOCUMENT_ROOT'] указывает на /home/bitrix/www, соответственно файл располагается по пути: /home/bitrix/www/AddUserToGroupChatsClass.log)

    С примерно таким содержимым:

    28.09.2021:
    Array
    (
        [text] => Событие наступило
        [fields] => Array
            (
                [TITLE] => 
                [NAME] => test1
                [LAST_NAME] => test1
                [SECOND_NAME] => test1
                [EMAIL] => test1@test1.test1
                [LOGIN] => test1@test1.test1
                [PERSONAL_PROFESSION] => 
                [PERSONAL_WWW] => 
                [PERSONAL_ICQ] => 
                [PERSONAL_GENDER] => 
                [PERSONAL_BIRTHDAY] => 
                [PERSONAL_PHONE] => 
                [PERSONAL_FAX] => 
                [PERSONAL_MOBILE] => 
                [PERSONAL_PAGER] => 
                [PERSONAL_STREET] => 
                [PERSONAL_MAILBOX] => 
                [PERSONAL_CITY] => 
                [PERSONAL_STATE] => 
                [PERSONAL_ZIP] => 
                [PERSONAL_COUNTRY] => 0
                [PERSONAL_NOTES] => 
                [WORK_COMPANY] => 
                [WORK_DEPARTMENT] => 
                [WORK_POSITION] => 
                [WORK_WWW] => 
                [WORK_PHONE] => 
                [WORK_FAX] => 
                [WORK_PAGER] => 
                [WORK_STREET] => 
                [WORK_MAILBOX] => 
                [WORK_CITY] => 
                [WORK_STATE] => 
                [WORK_ZIP] => 
                [WORK_COUNTRY] => 0
                [WORK_PROFILE] => 
                [WORK_NOTES] => 
                [AUTO_TIME_ZONE] => 
                [XML_ID] => 
                [PHONE_NUMBER] => 
                [PASSWORD_EXPIRED] => N
                [TIME_ZONE] => 
                [LID] => s1
                [LANGUAGE_ID] => 
                [ACTIVE] => Y
                [BLOCKED] => N
                [GROUP_ID] => Array
                    (
                        [0] => Array
                            (
                                [GROUP_ID] => 3
                                [DATE_ACTIVE_FROM] => 
                                [DATE_ACTIVE_TO] => 
                            )
    
                        [1] => Array
                            (
                                [GROUP_ID] => 12
                                [DATE_ACTIVE_FROM] => 
                                [DATE_ACTIVE_TO] => 
                            )
    
                        [2] => Array
                            (
                                [GROUP_ID] => 4
                                [DATE_ACTIVE_FROM] => 
                                [DATE_ACTIVE_TO] => 
                            )
    
                    )
    
                [ADMIN_NOTES] => 
                [PASSWORD] => $5$hjIX0a5X2ps0X6kFG1h5xXAt4elIW.typcRgt23xwX97xU.GgGt0i3HG1a2hwZtcYXwIR3Whg6sXwV.
                [CONFIRM_PASSWORD] => test1@test1.test1
                [UF_DEPARTMENT] => Array
                    (
                        [0] => 2
                    )
    
                [UF_PHONE_INNER] => 
                [UF_USER_CRM_ENTITY] => 
                [UF_INN] => 
                [UF_DISTRICT] => 
                [UF_SKYPE] => 
                [UF_TWITTER] => 
                [UF_FACEBOOK] => 
                [UF_LINKEDIN] => 
                [UF_XING] => 
                [UF_WEB_SITES] => 
                [UF_SKILLS] => 
                [UF_INTERESTS] => 
                [UF_EMPLOYMENT_DATE] => 
                [UF_SKYPE_LINK] => 
                [UF_ZOOM] => 
                [UF_TIMEMAN] => 
                [UF_TM_MAX_START] => 00:00
                [UF_TM_MIN_FINISH] => 00:00
                [UF_TM_MIN_DURATION] => 00:00
                [UF_TM_REPORT_REQ] => 
                [UF_TM_REPORT_TPL] => Array
                    (
                        [0] => 
                    )
    
                [UF_TM_FREE] => 
                [UF_TM_TIME] => 
                [UF_TM_DAY] => 
                [UF_TM_REPORT_DATE] => 
                [UF_REPORT_PERIOD] => 
                [UF_DELAY_TIME] => 
                [UF_LAST_REPORT_DATE] => 
                [UF_SETTING_DATE] => 
                [UF_TM_ALLOWED_DELTA] => 
                [CHECKWORD] => 433ddaf3c8a14fe75431252a2709b8
                [~CHECKWORD_TIME] => now()
                [ID] => 5
                [RESULT] => 5
            )
    )


    Итого на выходе у нас:
    - Подписка на событие (работает)
    - Автолоадер, который позволит подключать классы по мере использования (без необходимости прописывать явно)
    - Разделение логики между подпиской и обработчиком.

    Хорошо было бы углубиться в:
    - php классы (namespace, static, public, protected, private)
    - composer

    Надеюсь помог.
    Ответ написан
    Комментировать
  • Можно ли через веб-формы Битрикс24 ставить задачи?

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


    Нет, такой возможности штатно нет.
    Но можно извращнуться: создать доп поле в Лиде "Является задачей", проставлять его в форме (автоматически) и сделать БП на запуск: при запуске проверять отмечена ли опция и если отмечена - создавать задачу и удалять лид.
    Ответ написан
    Комментировать
  • Как в битрикс24 получить ID чата?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вопрос: Как узнать "Идентификатор чата" - где его посмотреть?


    Через метод im.chat.get
    Ответ написан
  • Как реализовать отображение данных из внешней БД в битрикс24?

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


    Это слишком обширный и абстрактный вопрос на который нельзя дать однозначный ответ.
    Например вы пишите про "Битрикс24", но он поставляется в двух редакциях: облачной версии и коробочной.
    Если вы пишите про облако - пишете свое приложение и выводите как вы хотите. Вам доступно все что позволяет API.
    Если вы говорите про коробку, то ваш вопрос можно классифицировать по-разному: от логического "как я хочу видеть данные из внешней БД" до технического "как на php я могу подключиться к базе данных". В любом случае вам поможет официальная документация разработчика по платформе (у управления сайтом и битрикс24 общая платформа).

    Возможно если вы конкретизируете свой вопрос или разобьете его на несколько частей ответ будет более точным полезным.

    P.S. Если приводить аналогию то ваш вопрос звучит "Как покорить Эверест?", что согласитесь слишком абстрактно. Если вы разобьете его на несколько вопросов (например "Какое снаряжение нужно для покорения горы", "Как проходит подъем на гору" и т.п.) то ответ будет более точным.
    Ответ написан
  • Как в бизнес-процессе получить инфу о датах отсутствия сотрудника?

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

    В облаке подобного api нет, но можно попробовать сделать запросы на calendar.accessibility.get и получить занятость. Это конечно не только отпуск, но и любое другое отсутствие, но возможно подойдет.
    Ответ написан
    1 комментарий
  • Как разом закрыть просроченные дела в CRM Битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Перейдите в раздел "Мои дела" (http://ваш.б24/crm/activity/) - найдите по фильтру все необходимые дела. Внизу таблицы отметьте "Для всех" и выберите пункт "Отметить выполненным"
    Ответ написан
    Комментировать
  • Как в Битрикс дать права администратору филиала на создание пользователей только в рамках своего филиала?

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


    Если у вас Битрикс24: Энтерпрайз и Филиал красноярск выделен в отдельный сайт, то в рамках этого сайта есть кнопка "Пригласить", которая частично решает вашу задачу.

    Однако сам Битрикс24 не разрабатывался под многофилиальные структуры с подобным ограничением прав и все же больше заточен под работу в рамках нехолдинговых компаний.
    Ответ написан
    3 комментария
  • Как получить переменные бизнес-процесса, используя REST API Битрикс24?

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


    В своем действии параметры и переменные шаблона бизнес-процесса вы можете получить только если при регистрации действия обьявите параметры действия БП и явно передадите их в свой обработчик.

    Т.е. если вам нужно значение переменной - добавляете его при регистрации bizproc.activity.add.
    Если хотите его изменить: добавляете в выходные значения и добавляете блок изменения переменных после вашего действия.

    Других возможностей нет.
    Ответ написан
    Комментировать
  • Как правильно выгружать большие объемы данных Битрикс24 на PHP?

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


    batch запрос аггреграция из 50 запросов.
    Каждый списочный запрос может отдать не более 50 элементов.

    Таким образом за 1 батч можно выгрузкить 2500 элементов.

    Т.е. вы офомляете первый батч оперируя start методом (start=0, start=1 и т.п. до start=49).

    Сравнить существование проще в локальном кеше, т.е. получить все, найти расхождения и сформировать батчи для создания/обновления компаний.
    Ответ написан
    Комментировать
  • Битрикс24 постановка задачи через БП с телом письма?

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


    Подобного механизма в облачном Битрикс24 нет.
    В коробочном Битрикс24 это можно сделать через api mail и tasks модулей.
    Ответ написан
    Комментировать
  • Битрикс24 Объединение/Разъединение задачи. Реально?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Здравствуйте. Можно ли реализовать объединение задач?


    Если вы подразумеваете так же как в сделках выбрать поля и т.п., то подобную разработку можно сделать только в коробке. В штатной поставке такого нет.
    Ответ написан
    2 комментария
  • Как импортировать в Битрикс24 пользователей и структуру из 1С?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Да, в Битрикс24 есть возможность импорта орг.структуры и пользователей из 1С, есть даже связывание этих пользователей по логину с конкретным заведенным доменом, однако на практике штатные инструменты для группы компаний не подходят. Подобные работы выполняются под ключ для каждой компании партнерами-интеграторами.
    От себя могу добавить следующее:
    1. Если хотите чтобы проблем не было, то поставщиком пользователей (профилей) и орг.структуры должна являться 1С. И это должна быть именно одна система, потому как несколько подобных систем-источников вызывают коллапс в Б24.
    2. Если хотите использовать несколько доменов AD, то оставьте только минимальный набор полей - флаг активности, логин. AD должен выступать исключительно в роли авторизационного сервера, поэтому никакого обмена с периодичностью, построения орг.структуры и создания пользователей на портале. Только активность и привязка к группам.
    3. Для привязки заранее создайте как минимум 3 группы в каждом AD: "bitrix users", куда включите всех пользователей которые должны маппится в группу сотрудников, "bitrix admins" это те пользователи из числа "bitrix users", кто должны стать админами на портале и "bitrix ignored" (учетки которые будут игнорироваться).
    - Если пользователь должен стать админом - в группы "bitrix users" и "bitrix admins" его.
    - Если учетку не нужно затягивать в Б24 то прописываем в "bitrix ignored" и соответственно ее в исключения. Помните если пользователь будет одновременно в группе ignored и users, то на портал он не попадет.

    По-поводу SSO на мультидоменные структуры (именно чтобы открыть портал и сразу авторизован) это не просто.
    Либо нужно сломать BitrixVM подключив Kerberos, либо нужно пилить свой модуль для какого-нибудь KeyCloak/ADFS или другого поставщика авторизации. Штатный NTLMv2 работает только с одним доменом (тем в который введен сервер).
    Ответ написан
    Комментировать
  • Как связать контакт и сделку в Битрикс24 с помощью REST API?

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


    Это недоработка со стороны Битрикс24: связать контакт со сделкой через rest api нельзя. Ждем обновлений REST API.

    Есть так же проблема с производительностью, массив очень большой, и скрипт обрабатывается долго, как можно это улучшить?


    Сейчас вы выполняете синхронные запросы по 1. Если на обработку одного запроса нужно 1 секунда, то 60 запросов = 60 секунд. Вы можете группировать запросы в batch, таким образом 60 запросов превратятся в 2 запроса и будут обработаны за ~2 секунды

    Еще, я бы рекомендовал использовать готовую библиотеку для отправки запросов: https://github.com/mesilov/bitrix24-php-sdk/tree/2.x
    Ответ написан
  • Как с помощью вебхуков сделать запрос к HeadHunter?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если у вас облачный Битрикс24 и вы не хотите создавать стороннее приложение то никак.
    Битрикс24 в действии Вебхук имеет возможность только отправить нужные данный по url, но никак не обработать результат операции.

    В вашем случае можно было бы сделать некоторое приложение, которое бы добавило действие БП с набором возвращаемых результатов, однако это не полноценные объекты, а скалярные значения.
    Ответ написан
  • Как из списка подтянуть данные в карточку сделки?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Но подтягивается только название, без дополнительной инфы по ней. Что делать ?


    Они и не будут подтягиваться, потому что именно так работает поле с привязкой к элементам инфоблока.
    Что можно с этим сделать? Ну например создать в сделке такие же поля. Написать БП при создании/изменении сделки подтягивать из элемента данные и писать в поля сделки.

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

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

    От себя могу добавить: посмотрите современные активити (bitrix/activities/bitrix/crmsetshipmentfield) и простые (bitrix/activities/bitrix/logactivity) - они помогут быстрее разобраться.
    Ответ написан
    Комментировать