• Что необходимо для работы контроллера в Bitrix?

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


    Есть несколько способов чтобы "Битрикс" (а на самом деле php) видел ваш класс:
    1. Ванильный php: класс должен быть подключен к выполнению явно через подключение файла в которым он описан
    2. Вандальный/Коробочный Б24: Класс должен располагаться где-угодно, но быть заргистрирован через автолоадер (здесь не важно что вы используете: composer, битриксовый или свое на базе spl_autoloader) в init.php
    3. Через модули.

    Если мы говорим о классическом bitrix framework то правильнее делать модуль.
    Причем в модуле есть 2 варианта его инициализации:
    1. Через "автолоадер" или прямое подключение в include.php ()
    2. Через `psr`-подобный загрузчик в папке lib (https://dev.1c-bitrix.ru/learning/course/index.php...)

    Иначе говоря:
    - Либо вы размещаете где хотите и подключаете его сами
    - Либо если вы работаете с модулем то положить его по psr4 в папочку `lib` вашего модуля.

    Как работает автозагрузчик?


    Если вы читали абзац выше, то поняли, что единого центразиованного загрузчика тут нет.
    Есть:
    1. Глобальный автозагрузчик из модулей (который загружает по psr4 из активных подключенных модулей)
    2. Локальный автозагрузчик модуля (для подключенного модуля)
    3. Кастомные загрузчики (тут кто во что горазд).

    Соответственно, если мы говорим про 1 и 2 типы загрузчиков, что сначала необходимо подключить модуль (`\CModule::IncludeModule` или `\Bitrix\Main\Loader`), а потом уже вызывать классы.
    Если вы попытаетесь вызывать классы, а до вас никто не подключил модуль, то вы получите фатал.

    Везде ли он работает?


    Последний абзац выше показывает что нет.

    Есть ли проблемы с версиями? Отличия ядер битрикса или ещё какой черной магии?


    Описания в зависимости от версии особо нет.
    Что касается проблем, то примерно до версии 18 psr-подобного загрузчика не было, потом он начал появляться и совершенствоваться.
    Если ориентироваться на последнюю версию Битрикс24, то проблемы если и есть, то только локального характера связанные с модульной структурой.
    Здесь могу посоветовать только проштудировать документацию и потыкаться самому. Универсальной формулы нет - документация тут скудная.

    Как настроить defaultNamespace и namespaces в .settings.php, чтобы всё заработало?


    Здесь нужно намного больше информации, например: как модуль используете, что сделали, что ожидаете и что работает не так как ожидали.
    Пока могу лишь ограничиться ответом "настроить согласно документации" (ха-ха, злая шутка, особо документации нет - нужно больше вводных данных см выше)

    Есть ли где-то полностью рабочий пример реализации своего класса, с описанием того где файлы и почему они там?


    Нет, такого нет.
    В Битриксе это можно получить только после изучения всех курсов/доков/экзаменов и с точки зрения практического опыта.
    Можно посмотреть уже готовые модули (что-то подобное можно найти на github, например https://github.com/alex-nzr/bitrix-example-boilerp... или https://github.com/zahalski/awz.ydelivery/tree/mas...)/
    Можно посмотреть как это делать без модулей https://bx24devbook.website.yandexcloud.net/index.html (тут скорее больше описания чем конкретные классы).

    Готового гайда как у симфони здесь увы нет.

    Какая именно должна быть ссылка для проверки роута?

    Что вы имеете ввиду? Проверки чем? Ссылка на что? Какого роута?
    Ответ написан
    1 комментарий
  • Как в битрикс24 приостановить выполнение активити в бизнес-процессе, а потом через какое то время 1 час или пару дней, продолжить выполнение?

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

    Если мы говорим про возможность останавливать какое-то уже сложившееся действие, то такая возможность отсутствует.
    Ответ написан
    Комментировать
  • Неожиданно перестал работать BitrixCRM 7.5 белый экран на входе на сайт и не показывает окно авторизации что делать?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Для начала научимся дебажить "белый экран":

    1. Вы видите "белый экран", а если посмотреть исходный код страницы, увидите ли вы php код?
    Если вы видите этот код - значит проверяйте параметр `short_open_tags` - он должен быть "on".

    2. Если кода не видно, но перед этим вы делали какой-либо `var_dump` (или `print_r` и т.п.) в коде.
    Удалите этот код и попробуйте еще раз.

    3. Если все произведенные выполнено, но вы по-прежнему видите белый экран, то нужно проверять логи php.
    Как это можно сделать?
    3.1 Можно в `.settings.php` включить отладку (debug=true)
    3.2 Можно в `.settings.php` настроить логгирование исключений (`debug` -> `log` и посмотреть куда сыпятся логи: чаще этот параметр не задан, но иногда он указывает на `/var/log/php/exception.log` либо на `bitrix/modules/error.log`). Открываем этот файл и смотрим что там не так
    Ответ написан
  • Как в коробочном Битрикс 24 открывать iframe задания бизнес процесса, сразу после его создания?

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


    Никак - это разный контекст.

    Начнем с понимания того как именно могут быть запущены бизнес-процессы?
    1. Через прямой запуск из публички веб-браузера
    2. Через косвенный запуск из публички (когда какое-то действие неявно вызывает запуск процесса)
    3. Через api (например в консоли сервера, cron/агенты и т.п.)
    4. Мобильное приложение (стоит особняком).

    Во всех этих случаях лично мне не понятно как, кому и где открывать попап.

    Обычно на такое есть 2 способа:
    1. Через асинхронный опросник в фиксированную точку.
    2. Через пуш-события

    Рассмотрим подробнее механизм работы каждого. "Асинхронный опросник" выполняет поиск заданий назначенных пользователю с определенной периодичностью и в случае если подобное задание найдено - делает рендер этого задания в определенную область.
    На этой технологии например работает модуль "Процессы в карточках CRM".

    Механизм "пуш-событий" требует немного больше навыков и работающий push.
    Здесь нет опросного механизма, а все действие завязано на "событиях назначения заданий бизнес-процессов", которые выбрасывают сообщние через websocket. Далее при получении сообщения уже понимается контекст работы приложения (десктоп/мобильное, потому что в cli-режиме никто события не слушает) и происходит отрисовка именно на js в нужном контексте (открывается попап или слайдер).

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

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Как получить в ответ от веб хука результат работы бизнес процесса — текстовую строку?


    Никак.

    Как архитектурно работает активити вебхук в Битрикс24 (не важно в облаке или в коробке (без кастомизаций)):
    1. Вызывается действие "Вебхук", на вход подается ссылка которая будет вызвана
    2. Проверяется регистрация на облачном провайдере (oauth.bitrix.info) (если регистрации нет, выполняется авторегистрация)
    3. Если регистрация есть (или прошла успешно) - двигаемся дальше, если нет - пропускаем шаг.
    4. На облачный провайдер (oauth.bitrix.info) передается ссылка. Там формируется задание на отправку и оно падает в очередь.
    5. Облачная очередь обрабатывается асинхронными скриптами и выполняется вызов этой исходной ссылки.

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

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


    Правильный алгоритм создания сделки: берете метод `crm.deal.add` и создаете.
    Правильный ли это алгоритм с точки зрения бизнеса и вашей автоматизации это другой вопрос.

    Я так понимаю, что это лиды - это пользователи и делается через


    Лид это не пользователь и не сделка, а "намерение какого-то лица получить товар/услугу".
    Почему эта фраза в кавычках? Потому что звонок спамера это тоже лид, только некачественный. Запрос конкурентов - тоже лид.
    Запрос может быть как от нового клиента (новый лид), так и от текущего (повторный лид), но это определяется бизнес-процессами компании (не путать с бизнес-процессами Битрикс24).

    В некоторых компаниях лидов нет. Есть только сделки и контакты/компании. Например подобную схему использует AmoCRM.

    Правильно ли я понимаю, что надо перед тем как создавать сделку, надо сделать поиск лида (crm.lead.get) из списка всех лидов (/crm.lead.list)?


    Нет. Как уже говорили для создания сделки не следует искать лиды (если конечно бизнес-процесс вашего клиента не подразумевает такое), но даже если и следует, то `crm.lead.list` будет достаточно. Мне на практике не встречалось такого чтобы для создания сделки нужно было искать лиды - максимум текущий контакт/компанию по номеру телефону.

    В моем случае, кейсы обычно следующие:

    ~70% - создание лида
    - Сформировать данные которые нужно отправить
    - Отправить на `crm.lead.add`

    ~25% - создание сделки
    - У нас есть телефон или почта, через `crm.duplicate.findbycomm` ищем контакт/компанию.
    - Если контакт/компания не найдена - создаем.
    - Создаем сделку через `crm.deal.add`

    ~4% - создание повторного лида
    - У нас есть телефон или почта, через `crm.duplicate.findbycomm` ищем контакт/компанию.
    - Если контакт или компания найдена - создаем повторный лид
    - Если контакт или компания НЕ найдена - создаем лид
    Ответ написан
    Комментировать
  • Как скопировать файл из одного комментария в другой?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Чтобы прикрепить файл, вы должны его скачать.
    Рестовые методы не поддерживают возможноть быстрого копирования по идентификаторам, поэтому добавляйте accessKey к ссылке, скачивайте к себе и потом загружайте его к новому комментарию как обычно делаете
    Ответ написан
    Комментировать
  • Передача лидов с сайта в 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, чтобы при открытии вашей ссылки с любой страницы она открывалась в слайдере.
    Ответ написан
    Комментировать