Задать вопрос
  • Как решить ошибку с фильтром по годовому обороту в Битрикс?

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


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

    Сама проблема связана с механизмом фильтрации - поле "Годовой оборот" имеет строковый тип, и при сравнении происходит сравнение строк, а не чисел.

    Как временное решение можно создать пользовательского поля с типом "Число" и копировать туда значения поля "Годовой оборот". Копировать можно вручную или с помощью бизнес-процесса.
    Ответ написан
    Комментировать
  • Как автоматизировать поле "Реквизиты" в компании?

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

    use Bitrix\Main\Loader;
    use Bitrix\Crm\Integration\BankDetailResolver;
    use Bitrix\Crm\Integration\ClientResolver;
    
    
    Loader::requireModule('crm');
    
    /**
     * ИНН/БИК для поиска
     *
     * @var        string
     */
    $preparedSearchQuery = "7717586110";
    
    /**
     * Критерий поиска:
     *     - ITIN - ИНН
     *     - BIC  - БИК
     *
     * @var        string
     */
    $typeId = 'ITIN';
    
    /**
     * Идентификатор страны:
     *    1 - Россия
     * @var        int
     */
    $countryId = 1;
    
    $resolverClass = $typeId=='BIC'
        ? BankDetailResolver::class
        : ClientResolver::class
        ;
    
    $result = (new $resolverClass)->resolveClient(
        $typeId,
        $preparedSearchQuery,
        $countryId
    );
    
    var_dump($result);
    
    /*
    array(1) {
      [0]=>
      array(4) {
        ["caption"]=>
        string(27) "ООО "1С-БИТРИКС""
        ["title"]=>
        string(27) "ООО "1С-БИТРИКС""
        ["subTitle"]=>
        string(17) "ИНН 7717586110"
        ["fields"]=>
        array(12) {
          ["RQ_INN"]=>
          string(10) "7717586110"
          ["RQ_KPP"]=>
          string(9) "770501001"
          ["RQ_OGRN"]=>
          string(13) "5077746476209"
          ["RQ_OKVED"]=>
          string(5) "58.29"
          ["RQ_COMPANY_NAME"]=>
          string(27) "ООО "1С-БИТРИКС""
          ["RQ_COMPANY_FULL_NAME"]=>
          string(98) "ОБЩЕСТВО С ОГРАНИЧЕННОЙ ОТВЕТСТВЕННОСТЬЮ "1С-БИТРИКС""
          ["RQ_IFNS"]=>
          string(101) "Инспекция Федеральной налоговой службы № 5 по г. Москве"
          ["PRESET_ID"]=>
          string(1) "1"
          ["PRESET_COUNTRY_ID"]=>
          int(1)
          ["RQ_COMPANY_REG_DATE"]=>
          string(10) "06.04.2007"
          ["RQ_ADDR"]=>
          array(1) {
            [6]=>
            string(234) "{"id":0,"latitude":"","longitude":"","languageId":"ru","fieldCollection":{"410":"ЭНТУЗИАСТОВ Б-Р, Д. 2, ЭТАЖ 13","600":"ПОМЕЩЕНИЯ 8-19","50":"109544","200":"Г.МОСКВА","100":"Россия"},"links":[]}"
          }
          ["RQ_DIRECTOR"]=>
          string(52) "РЫЖИКОВ СЕРГЕЙ ВЛАДИМИРОВИЧ"
        }
      }
    }
    */
    Ответ написан
    Комментировать
  • Почему vmbitrix недоступен из вне?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Я бы сделал так:

    1. Покупаем статический IP адрес у вашего провайдера.
    2. На VirtualBox в сетевой карте настраивем Bridge тип, чтобы виртуалка свой IP адрес в локальной сети.
    3. На вашем роутере выполняем следующие действия:
    3.1 Фиксируем IP за mac-адресом чтобы исключить переназначение адреса другому устройтсву
    3.2 Настраиваем проброс портов 80 и 443 на IP адрес виртуалки.
    4. Проверяем антивирус на хостовой машине чтобы он не гасил ничего (вообще не должен, но на всякий).

    Далее через команду traceroute из внешнего устройства смотрим на какой IP гасятся пакеты.
    Ответ написан
    Комментировать
  • Можно ли изменить функции и добавить фичи в представление "Канбан" модуля задач?

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


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

    Альтернативных средств нет.
    Ответ написан
    2 комментария
  • Как подключиться Бд Битртрикс 24 через СУБД Mysql?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Есть задача подключится к БД Битрикс 24 через СУБД Mysql?


    Настоятельно рекомендую 10 раз подумать прежде чем работать с БД Битрикса через внешнее подключение.
    1. Это не безопасно. Если мы говорим про Bitrix Env то по-умолчанию подклчюение разрешено только с того же сервера.
    Таким образом для того чтобы попасть в БД злоумышленику потребуется сначала получить доступ к серверу.

    2. Битрикс24 не публикует структуру таблиц и связи, так что без опыта не получиться разобраться в хитросплетениях таблиц, т.к. внешних связей он не использует.

    Однако, если вы все же хотите это сделать то вам потребуется:

    1. Сконфигурировать MySQL на прослушивани внешнего порта.
    Почитайте про bind-address настройку.

    2. Создать пользователя с возможностью внешнего доступа к СУБД
    Например через SQL команды:
    GRANT ALL PRIVILEGES ON *.* TO '<user_name>'@'%' IDENTIFIED BY '<password>' WITH GRANT OPTION;
    FLUSH PRIVILEGES;


    где - имя пользователя, а - пароль.
    Рекомендую озаботиться безопасностью и почитать про % в имени пользователя, ограничить доступ конкретной БД и выдать ограничения на операции.
    Подробнее об этом можете узнать в документации к MySQL.

    3. Открыть в iptables или firewalld порты которые будет слушать Mysql.

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

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

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

    По шагам:

    1. Подключаете BX24 JS SDK.
    Как это сделать вы можете прочитать в документации: https://apidocs.bitrix24.ru/api-reference/bx24-js-...

    2. Когда на вашей форме изменилось значение, то необходимо отправить сообщение в родительское окно об изменении.
    BX24.placement.call('setValue', value);

    Пример создание польз.поля можно посмотреть в документации: https://apidocs.bitrix24.ru/tutorials/crm/crm-widg...
    Ответ написан
    Комментировать
  • Задачи и проекты. Как вывести на карточку задачи системное поле, например "Статус"?

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


    Без разработки - никак.
    Дело в том что "Статус" (в вашем случае Статус задачи) это не поле Лида/Сделки, поэтому отобразить его в списке полей карточки Лида/Сделки не получиться. Да и какой статус показывать? Например в сделке может быть 10 задач, а поле статус одно.

    Как верно заметил belc, в timeline (список элементов в правой части страницы) статус задачи отображается в верхнем углу задания на задачу. Если такой вариант не совсем подходит или нужна конкретная задача, то можно рассмотреть альтернативный варианты, среди которых я бы выделил 2:
    Вариант 1: Ставить задачу через БД с контролем завершения. Например есть у нас задача "оплата поставщика" и есть поле "Статус оплаты" с вариантами: "Не в плане", "На оплате", "Оплачено". По-умолчанию значение "Не в плане", при постановке задачи - "На оплате", а после завершения задачи - "Оплачено". Таким образом мы можем сделать простой БП для реализации: При запуске БП меняем наше поле статуса на "На оплате", ставим задачу через БП с опцией "Ожидать завершения", следующим действием изменение поля на "Оплачено".

    Вариант 2: использовать REST приложения или вебхуки для того чтобы реализовать то что не получилось в варианте 1.
    Ответ написан
    Комментировать
  • Для чего нужен wakeUp в Битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Метод wakeUp достаточно полезен в различных сценариях работы.
    Вот несколько примеров его использования:

    1. Использование в целях тестирования.

    Предположим у вас есть некоторый класс объекта Record, который является объектом для RecordTable.
    Вы написали некоторую функицю, которая выполняет сложную проверку (например что дата записи не в прошедшем времени, что указанный пользователь является активным и т.п.).
    Допустим вот такая:
    {
    	public function isAcceptable( Record $record): bool
    	{
    		if ( $this->container()->getDateSerivce()->isEarlyDate($record->getDate()) )
    		{
    			return false;
    		}
    
    		if ( !$this->container()->getUserRepository()->isActiveUser($record->getUserId()))
    		{
    			return false;
    		}
    
    		// ... 
    
    		return true;
    	}
    }


    Как вам ее протестировать?
    Наверное нужно получить объект класса Record из БД и отправить в функцию, но что делать если такой записи нет? Создать ее? Но это же тест, а создание это запись в БД, которая может отразиться над ругих тестах.
    Решение - wakeUp:

    // Now - 20.03.2025
    $earlyDateObject = Record::wakeUp([
    	'ID' => -1,
    	'DATE' => DateTime::createFromTimestamp(strtotime("10.03.2025"))
    ]);
    
    assertFalse( $checker->isAcceptable($earlyDateObject) );
    
    $unexistedUserRecord = Record::wakeUp([
    	'ID' => -1,
    	'DATE' => DateTime::createFromTimestamp(strtotime("21.03.2025")),
    	'USER_ID' => -1
    ]);
    
    assertFalse( $checker->isAcceptable($earlyDateObject) );
    
    $normalRecord = Record::wakeUp([
    	'ID' => -1,
    	'DATE' => DateTime::createFromTimestamp(strtotime("21.03.2025")),
    	'USER_ID' => 1
    ]);
    
    assertTrue( $checker->isAcceptable($earlyDateObject) );


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

    2. Восстановление данных из кеша.

    Предположим, заходя на страницу вы закешировали ID ресурсов отображаемых на ней, но есть некоторая произвольная величина закешировать которую вы ну никак не можете.
    Механизм вычисления этой величины описан в функции calculatePriority, но она принимает объект Record, а у вас массив из кеша.

    Таким образом получается некоторый такой код:

    $myCachedIds = Container::getInstance()->getCacheService()->get('MY_SUPER_KEY');
    
    $records = RecordTable::createCollection();
    
    foreach($myCachedIds as $recordId)
    {
    	$records->add(
    		Record::wakeUp([
    			'ID' => $recordId
    		])
    	);
    }
    
    $records->fill();
    
    foreach( $records as $record )
    {
    	$arResult['RECORDS'][] = [
    		'ID' => $record->getId(),
    		'PRIORITY' => getPriority($record) 
    	];
    }


    3. Получение данных из других источников.

    Допустим у нас есть несколько табилц: Автор и Книга.

    Автор содержит:
    - ID
    - ФИО (NAME)
    - Город (CITY)

    Книга содержит:
    - ID
    - ID автора
    - Название

    Предположим мы делаем постраничную навигацию для каталога книг и нам нужно вывести ФИО автора.

    $authorCollection = AuthorTable::createCollection();
    
    $books = BookTable::getList()->fetchCollection();
    
    foreach( $books as $book)
    {
    	$authorCollection->add(
    		Author::wakeUp([
    			'ID' => $book->getAuthorId()
    		])
    	);
    }
    
    $authorCollection->fill(['CITY', 'NAME']);


    Согласен, здесь пример кажется немного отстраненным, ведь для связи 1:n можно было бы просто дозапросить данные из БД в 1 запрос, но если у вас таких таблиц уже не 2, а скажем 4-6, то последовательные запросы на получение только необходимой информации серьезно сократят время на получение данных.
    Ответ написан
    Комментировать
  • Можно ли в Битрикс24 перенести автоматически значения из пользовательского поля "итоговая цена" в системное поле "сумма и валюта" в карточках лидов?

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


    Да, можно.
    Системное поле "Сумма и валюта" технически это 2 поля - Сумма (тип число) и Валюта (справочник).
    Вы можете сделать бизнес-процесс "Перенос итоговой валюты", внутри через explode разбить вашу переменную по символу вертикальной черты (в поле типа Деньги хранится в формате "<число>|<код валюты>", например "100|RUB"), затем первую часть перенести в поле "Сумма", а вторую в поле "Валюта".

    Этот БП вы можете поставить на стадию или вызывать через другие БП для актуализации.

    Для запуска на существующих элементах вы можете создать "Умный сценарий", который может отработать на нужных элементах - по фильтру.
    Ответ написан
    Комментировать
  • Как в Битрикс24 интегрировать несколько CRM-форм от разных клиентов?

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

    Звучит как профит
    Ответ написан
    4 комментария
  • Как отправить уведомление после смены статус задачи на закрыто?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Без лишних слов, вот так:

    // Подписываемся на событие через современный механизм
    $eventManager = \Bitrix\Main\EventManager::getInstance();
    $eventManager->addEventHandlerCompatible("tasks", "OnTaskUpdate", "OnTaskUpdateHandler");
    
    function OnTaskUpdateHandler($taskId, $editedFields, $originalFields)
    {
    	// Если статус не меняется, ничего делать не нужно
    	if ( !array_key_exists('STATUS', $editedFields) )
    	{
    		return true;
    	}
    
    	// Если статус меняется НЕ в состояние completed - ничего делать не нужно 
    	if ( intval($editedFields["STATUS"]) != \Bitrix\Tasks\Internals\Task\Status::COMPLETED )
    	{
    		return true;
    	}
    
    	// Если вы меняете что-то другое, например название завершенной задачи, а статус просто летит за компанию, то делать ничего не нужно
    	if ( $editedFields["STATUS"] == $editedFields["originalFields"] )
    	{
    		return true;
    	}
    
    	// Наш обработчик не имеет смысла, если модуль "Веб-мессенджер" не подключен
    	if (!\Bitrix\Main\Loader::includeModule('im'))
    	{
    		return true;
    	}
    
    	/**
    	 * Посмотреть поля можно через этот метод.
    	 * Они будут в той же директории где и текущий файл, в файле log.log
    	 */
    	//\Bitrix\Main\Diag\Debug::dumpToFile(
    	//	[
    	//		'$taskId'        => $taskId,
    	//		'$arFields'      => $arFields,
    	//		'$eventTaskData' => $eventTaskData
    	//	],
    	//	date('d.m.Y H:i:s'),
    	//	str_replace($_SERVER['DOCUMENT_ROOT'], '', __DIR__.'/log.log')
    	//);
    
        $notificationParams = [
    		"TO_USER_ID"   => $originalFields["CREATED_BY"],
    		"FROM_USER_ID" => $originalFields["CREATED_BY"],
    		"NOTIFY_TYPE" => IM_NOTIFY_SYSTEM,
    		"NOTIFY_MODULE" => 'tasks', 
    		"NOTIFY_MESSAGE" => "Задача #".$taskId." была закрыта.",
    	];
    
    	\CIMNotify::Add($notificationParams);
    }
    Ответ написан
    Комментировать
  • Как отлавливать событие Изменения/Добавления OnAfter в Битрикс24 после исполнения всех Бизнес процессов?

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

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


    1. На компьютере с Windows вообще не рекомендуется устанавливать Битрикс. Либо VirtualBox/VMWare/Другая виртуализация, а туда CentOS7 + Bitrix Env, либо виртуализация и туда любая ось и сами настраивайте nginx/php-fpm/mysql и т.п.

    2. На крайняк docker + wsl.

    Что касается старых версий то их можно скачать только через техподдержку или у вас есть старый ключ, который не продлевали (в таком случае в ЛК сайта вы можете запросить последний архив).

    Но как уже подсказали вам коллеги - вот допустим вы развернете ее, а дальше что? Маркет не работает, видео-звонки не работают, облачный пуш не работает, конвертация документов не работает, телефония не работает, подпись и КЭДО не работает... как вы поняли добрая четверть механизмов не работает, а та что осталась еще и дырявая.
    Ответ написан
    Комментировать
  • Что происходит с ajax запросами битрикса?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Начните с очевидного - проверьте все onEpilog события, затем проверьте onEndBufferContents и далее если это все не поможет вооружайтесь отладчиком и идите в footer.php смотреть что же именно там выдает это подчеркивание. Вариантов может быть масса, но если ядро не правили скорее всего одно из двух событий подойдет и там обнаружите ваше подчеркивание.
    Ответ написан
    Комментировать
  • Можно ли получить пользовательские поля сделки без токкена?

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


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

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вам нужно получить поля сделки (ID, OPPORTUNITY), посчитать через CCrmAccountingHelper::calculateAccountingData и положить обратно в сделку.

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

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

    1. Должен ли Аналитик Битрикс24 заниматься настройкой битрикс24 в соответствии с требованием заказчика?


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

    Например, в компании где я работаю должности "Аналитик Битрикс24" вообще нет (хотя мы работаем преимущественно с Битрикс24). У нас есть бизнес-аналитики и системные аналитки, при этом они должны знать систему Битрикс24, но совершенно не обязаны ее настраивать.

    2. Какие задачи обычно решает бизнес аналитик Битрикс24?


    Опять же - зависит от конкретных должностных обязанностей.
    Аналитки впринципе довольно субьективная профессия и в зависимости от компании в нее вкладывают разный смысл. Есть компании где "Аналитик Битрикс24" это просто красивое название для человека который выполняет "настройку" Битрикс24 - т.е. собирает требования к бизнес-процессам, пишет тех.задание, а потом сам и создает бизнес-процессы.

    3. Если есть Аналитик Битрикс24 то зачем нужен Администратор Битрикс24 если аналитик может решать все задачи Администратора Битрикс24?


    Опять же - очень субьективная вещь.
    Например я знаю некоторые компании где "Администратор Битрикс24" - это конкретный человек в компании в чьей зоне ответственности лежит работа кор. портала. Т.е. его задача следить чтобы процессы двигались, чтобы бекапы делали (на коробке), чтобы вовремя проходили оплаты за битрикс и так далее.
    В облачном битрикс24 можно считать это впринципе синонимами, а вот на коробке это могут быть разные люди.
    Ответ написан
    Комментировать
  • Как настроить робота в битрикс, чтоб при покупке определенного товара отправлялись определлные файлы?

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


    Здесь штатно такой возможности не предусмотрено и эту потребность закрывает REST.
    Вам нужно поставить какое-нибудь приложение, которое по идентификатору достанет необходимые товары и чтобы вы могли сопоставить условия.
    Ответ написан
  • Почему возникает ошибка при импорте пользователей из Active Directory в Битрикс24?

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


    В настройках главного модуля есть опция "Email является обязательным полем", если ее выключить то можно добавлять пользователей вообще без email.
    После чего из настроек импорта контроллера в Битрикс24 убрать из списка вообще синхронизацию поля email.
    У вас вход все равно по логину.
    Это способ номер 1 - когда вообще никому мыло не нужно.

    На стороне AD можно завести доп. аттрибут куда прописывать валидный email адрес и указать его в качестве синхронизирующего.
    После чего на стороне AD заполнить этот аттрибут у нужных сотрудников.
    Далее в Битрикс24 в настройках модуля AD/LDAP заполнить аттрибут "E-mail для пользователей, у которых он не указан" - туда нужно вписать ЛЮБОЙ ВАЛИДНЫЙ email адрес.
    По техническому условию не обязательно чтобы у каждого сотрудника был уникальный email, так что можно вписать no@email.com например.
    Это способ номер 2 - когда есть сотрудники которым в профиле мыло все-таки нужно, но есть те кому не нужно.

    Эти способы можно и комбинировать.
    Ответ написан
    Комментировать
  • Как найти элемент списка?

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


    Возможно - через REST приложение в облаке или PHP-код (свое активити) в коробке Битрикс24.
    Штатных инструментов в данном случае нет - разве что только очень экзотические.
    Ответ написан
    Комментировать