Задать вопрос
  • Где лежит темплейт вкладки "время" в задачах битрикс24?

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


    Нет отдельного шаблона или компонента этой вкладки. Это часть верстки из компонента bitrix:tasks.task.detail.
    Если нужно модифицировать вывод рекомендую воспользоваться JS - при обновлениях будет намного меньше проблем.

    Так же хочу напомнить что править компоненты и шаблоны компонентов в /bitrix/components/bitrix запрещено.
    Ответ написан
    Комментировать
  • Как уменьшить размер области в интерфейсе Битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если это облако, то только через надстройки для браузера.

    Если это коробка, то можно подписаться на событие открытия слайдера и переопределить параметр customLeftBoundary установив его в нужное значение (для чата и почты по-умолчанию 0, обычно начинается с 240).
    Ответ написан
    3 комментария
  • Как вы делаете архитектурные решения AJAX?

    gromdron
    @gromdron
    Работаю с Bitrix24
    На сколько такое решение приемлимо?


    В зависимости от проекта и выделенного времени варьируется и оценка.
    Я бы оценил его как "Неудовлетворительный, находящийся на гране допустимного, но решающий исходный запрос".
    Ваш подход может существовать, однако на Code review у нас бы его завернули с пометкой "Все переделать".

    Есть ли какие то более правильные, гибкие архитектурные решения?


    Вариантов на вкус и цвет, начиная от родного AJAX => 'Y' параметра в компоненте и его работы и заканчивая javascript rendering.
    Замечательным вариантом было бы:
    - Чтобы тег #orders-block рендерил компонент d6core:custom.order.list. Т.е. он был бы самодостаточным.
    - Не создавалась бы отдельная страница под "ajax.php", а использовались бы контроллеры компонентов (хотя бы)
    - Возвращалось как можно меньше данных, т.е. структуры данных, а не верстка.

    Конечно интересует здесь и вопросы ИБ.


    Контроллеры компонентов по-умолчанию имеют защиту от CSRF, а так же можно установить проверки на авторизацию (только от авторизованных пользователей), проверку на метод запроса (POST/GET), проверку на пользователя (передавать его в signedParams).
    Почитайте про контроллеры, там много интересного написано.

    Тогда вопрос, зачем делать такую обертку если я могу тупо тянуть данные из $_POST напрямую?


    Например потому что при обработке запроса глобальный $_POST может поменять любой скрипт выполняющий до вашего, а HttpRequest содержит исходную информацию которая была отправлена на сервер.
    Или потому что при обращении к несуществующему ключу $_POST выдается notice-сообщение, а HttpRequest корректно возвращает null.
    Если ваша функция или метод работает с $_POST, то в случае объекта вы можете указать что ожидается HttpRequest и знать что придет именно параметры запроса и что там будут гарантированно методы getPost и т.п., а в случае с $_POST вам могут направить туда что угодно с какими угодно ключами.
    Ответ написан
    Комментировать
  • Есть ли в БП Б24 функция сложения данных одного пользовательского поля n-го множества сделок?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Секрет хорошего процесса в его простоте.
    Самый простой способ это иметь в компании 2 поля: Текущее значение и Лимит значения.
    В сделке существует поле, которое описывает ее значение (предположим множественное поле) и суммарное значение.

    При создании сделки итератором производим подсчет "Суммарного значения" сделки.
    Как только расчет произведен запрашиваем у компании Текущее значение и Лими значения и сравниваем чтобы текущее значение не было больше Лимита.
    Если больше - бракуем сделку и т.п. В общем отрабатываем процесс превышения.
    Если меньше - обновляем Текущее значение компании как Текущее значение компании + Суммарное значение.

    Как только сделка достигает успеха или неудачи необходимо выполнить перерасчет, т.е. из Текущего значения компании вычесть суммарное значение сделки чтобы высвободить лимит.

    Предполагаю что было бы неплохо дополнительно сделать следующее:
    - Хранить в сделке "Флаг учета значения в компании", который установлен в значение Да, если сделка учтена в текущем значении и Нет, если ее значение не модифицировало компанию.
    - Изменение Текщуего значения (увеличение или уменьшения) реализовать бизнес-процессом с логгированием в историю компании - из какой сущности, какое действие и какое логированию.
    Ответ написан
    Комментировать
  • Как вывести названия задач, привязанных к сделке?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Я смог добиться вывода всех существующих задач,


    Помни, что фильтр выполняется исходя из прав текущего пользователя, а значит что у другого пользователя будет другой результат. Чтобы убрать это поведение поищи в коде CHECK_PERMISSIONS флаги и посмотри как они работают.

    как отфильтровать их по привязке к сделке.


    Привязка к сделке хранится в поле UF_CRM_TASK, хранятся в виде комбинации буквы сущности и идентификатора, разделенные подчеркиванием.
    Например задача имеющая связь со сделкой 123 будет иметь в этом поле D_123
    Ответ написан
    Комментировать
  • Можно ли вести несколько корпоративных порталов Битрикс24 из одной админки?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    что старое нужно удалить, как это лучше сделать?


    Если требуется удалить вообще все, то имеет смысл не восстанавливать бекап, а сделать чистую установку с тем же лицензионным ключем.
    Можно так же воспользоваться Мастером очистки данных.

    Может можно вести сразу 2 корпоративных портала на одной админке, в коробочной версии.


    Нет, нельзя.
    Ответ написан
    Комментировать
  • Возможно ли через вебхук прописать ИНН компании?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Используются неправильные параметры.
    Если вы посмотрите на запрос, то он получается как: ?ENTITY_TYPE_ID=4&ENTITY_ID=1651
    В то время как метод принимает входным аргументом только fields, и соответственно запрос должен выглядеть так:
    ?fields[ENTITY_TYPE_ID]=4&fields[ENTITY_ID]=1651

    Т.е. в качестве ключей нужно использовать fields[ENTITY_TYPE_ID]
    Ответ написан
    2 комментария
  • Как получить ID всех элементов универсального списка?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Технически универсальные списки это надстройка над инфоблоками, поэтому API по работе с инфоблоками будет актуально и для УС: https://dev.1c-bitrix.ru/api_help/iblock/classes/c...
    Ответ написан
    Комментировать
  • Как организовать календарь рекламных постов в Битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Альтернативный вариант создать Универсальный список и вести график там. Нет наглядности (calendar view отсутствует), однако преимуществ там не меньше - например БП можете навесить, согласование докрутить и т.п.
    Ответ написан
    Комментировать
  • Как сделать вызов модуля из задачи?

    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 комментария