Ответы пользователя по тегу 1С-Битрикс
  • Как в БД обозначается тип свойства text/html?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для того чтобы создать свойство инфоблока типа "HTML/Текс" необходимо:
    1. Определить значение по-умолчанию.
    DEFAULT_VALUE - для данного случая будет сериализованный (serialize) ассоциативный массив php:

    [
    	"TEXT" => "",
    	"TYPE" => "HTML"
    ]

    В виде значения (то что будет сохранено в БД):
    a:2:{s:4:"TYPE";s:4:"TEXT";s:4:"TEXT";s:0:"";

    Для текста вместо HTML будет TEXT

    2. PROPERTY_TYPE = S
    Это означает что в базе данных будет хранится строка и поиск будет осуществляться как по строке.

    3. USER_TYPE (подтип свойства) = HTML
    Мы указываем что у нас не просто строковое значение, а строковое значение определенного типа

    4. Задаем в ключе USER_TYPE_SETTINGS дополнительные настройки для свойства.
    Подобно значению по-умолчанию это сериализованный (serialize) ассоциативный массив.
    По-умолчанию в нем только высота поля:

    [
    	"height" => 200
    ]

    В виде строки (что сохранится в базу данных):
    a:1:{s:6:"height";i:200;}
    Ответ написан
  • Что необходимо для работы контроллера в 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 комментарий
  • Как подключить Exchange календарь и почту в Битрикс24?

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

    На этом скриншоте вы конфигурируете сихнронизацию задач, событий и контактной книги.
    Для этого нужно чтобы EWS (Exchange web service - отдельная веб-служба Exchange сервера) умел принять от портала plain авторизацию и вы обладали достаточными полномочиями чтобы совершить требуемые действия.

    Если у вас НЕ включен веб-сервис на Exchange, если у на EWS НЕ включена plain авторизация, если у вашего аккаунта недостаточно полномочий (внезапно то что вы входите в свой календарь не значит что у вас есть доступ его подключить), то именно эту ошибку будет раз за разом выдавать EWS
    Ответ написан
  • Как лучше организовать структуру для модуля битрикс?

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

    Если хотите делать более канонично, то ориентируйтесь на те же модули битрикса и смотрите хорошие практики.
    Так, например принято делать делить на `controllers` (для контроллеров), `internals` (внутрение методы).
    Т.е. никаких `ajax.php` только контроллеры и все апи считается публичным (пусть и не документированным), если оно не помечено `@internal` или не находится в `internals`.
    Ответ написан
    1 комментарий
  • Как повторно инициализировать форму?

    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. Если вы делаете функцию под удаление, то смысла в самой функции нет, т.е. вы спокойно можете в этом же цикле определить нужен ли вам этот реквизит и удалить его если хотите.
    Ответ написан
    Комментировать
  • Как запретить создавать дубль контакта через веб-хук?

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


    Нет, нельзя.
    Проверяйте сами перед созданием (getlist или findbycriteria методами).
    Ответ написан
    Комментировать
  • Есть ли PHP запрос автоматическое создание ссылки Битрикс 24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если вы имеете ввиду REST методы, то нет.

    Если у вас коробочная версия и вы хотите использовать API битрикса чтобы это сделать, то вы можете посмотреть пример в файле:
    /home/bitrix/www/bitrix/activities/bitrix/crmgetpaymenturlactivity/crmgetpaymenturlactivity.php


    Обратите внимание на getUrlByDealId и createPayment методы - они как раз делают то что вам нужно.

    У меня есть небольшая, но непроверенная заготовка-выжимка:

    use \Bitrix\Main,
    	\Bitrix\Salescenter\Builder,
    	\Bitrix\Salescenter\Integration
    	;
    
    /**
     * @var int
     */
    $dealId = 1;
    
    try
    {
    	Main\Loader::requireModule('crm');
    
    	$deal = \CCrmDeal::GetByID($dealId, false);
    	if (!$deal)
    	{
    		throw new \Exception("Deal not found");
    	}
    
    	$builder = Builder\Manager::getBuilder(
    		Builder\SettingsContainer::BUILDER_SCENARIO_PAYMENT
    	);
    
    	$builder->build(
    		$this->getBuilderData($deal)
    	);
    
    	$order = $builder->getOrder();
    
    	$r = $order->save();
    
    	if (!$r->isSuccess())
    	{
    		throw new \Exception("Order update error:".implode(', ', $r->getErrorMessages()));
    	}
    
    	$foundPayment = null;
    
    	foreach ($order->getPaymentCollection() as $payment)
    	{
    		$foundPayment = $payment;
    	}
    
    	if ( is_null($foundPayment) )
    	{
    		throw new \Exception("Payment not found");
    	}
    
    	$urlInfo = Integration\LandingManager::getInstance()->getUrlInfoByOrder(
    		$payment->getOrder(),
    		['paymentId' => $payment->getId()]
    	);
    
    	// Payment url: $urlInfo['shortUrl']
    }
    catch( \Throwable $e )
    {
    	var_dump($e);
    }
    Ответ написан
    Комментировать
  • Как обновить страницу пользователя с помощью Push&Pull?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Возможно ли с помощью Push&Pull обновить страницу лида/сделки, которую просматривает пользователь?


    Если вы спрашиваете про абстрактную возможность обновления страницы через push'n'pull технологии то она есть.
    Если вы спрашиваете конкретно про использование push'n'pull технологии в приложениях Битрикс24, то ее нет.
    Ответ написан
  • Как добавить обработку события изменения сделки в коробке Битрикс24?

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


    Читайте документацию:
    1. Как работают события в Bitrix Framework
    2. События CRM
    Ответ написан
    Комментировать
  • Как при импорте создавать категории?

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


    Ответ на этот вопрос можно дать только после полного анализа следующих факторов:
    1. Коробка/Облако? Если коробка, какой версии.
    2. Нужно предоставить файл для анализа

    Рекомендую с этим вопросом и файлом обратиться в техническую поддержку Битрикс24 сразу предоставив файл.

    И как прописать категории более 4-ого уровня

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

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Касательно Битрикс24:
    - Если мы говорим про облачную версию: то только полной копией Интернет-Магазина24.
    - Если мы говорим про коробочную Битрикс24 с девелоперским сайтом, то точно так же как и в БУС.

    Что касается БУС, то кто во что горазд:
    - Создавать дополнительный сайт
    - Создавать дополнительные свойства и ими управлять
    - Просто подключить google translate к сайту

    Сильно много зависит от того на какую аудиторию расчитано, потому что у каждой страны свои законы относительно работы ИМ.
    Ответ написан
    Комментировать
  • Как вывести миниатюру фото в списках CRM Битрикс 24 (Коробочная версия)?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Как в представлении списка, в разделах CRM системы вывести миниатюры изображений (фотографий)?


    Какой-то волшебной кнопки-настройки нет.
    Все по-старинке:
    - Копируем цепочку шаблонов к себе (чтобы шаблоны компонентов прямо в bitrix24 шаблоне сайта не править)
    - Определяем что поле типа файл, определяем что файл - изображение, выводим превью.

    Увы, но в реальности эта работа не на ответ на Q&A, а даже на целую статью или задачу тянет.
    Ответ написан
    Комментировать
  • Как правильно кастомизировать файл header.php шаблона Битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Как можно внести изменения в header не копируя весь шаблон в local?

    Как правильно кастомизировать файл header.php шаблона Битрикс?


    Вы задали 2 противоречивых вопроса потому что "чтобы работало" не есть "правильно".

    Способ "Правильно": копируете весь шаблон в папку local.
    На каждом обновлении смотрите dif'ы и обновляете так же local.

    Способ "чтобы работало": можете обьявить папку положить туда файл, а дальше - симлинки.
    Но в таком случае вам придется проверять симлинки что очень не хорошо.

    Рекомендую не заниматься ерундой и копировать шаблон as is, а сравнивать уже diff инструментами
    Ответ написан
  • Возможно ли создание девелоперского сайта в Bitrix24 коробка?

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

    Либо у вас не активный лицензионный ключ (или он редакции CRM)
    Либо вы не развернули многосайтовость
    Ответ написан
  • Почему \Bitrix\Crm\FieldMultiTable::getList не находит компанию с номером телефона +7, а с 7 видит?

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

    Надо сказать что искать по сырым значениям телефонного номера это то еще занятие и так лучше не делать.

    Лучше воспользоваться методом поиска дубликатов:

    \Bitrix\Main\Loader::requireModule('crm');
    
    /**
     * Телефон который будем искать
     * @var string
     */
    $phone = '2131164';
    
    /**
     * Список всех ID лидов с этим телефонным номером
     * @var int[]
     */
    $leadIds = [];
    
    
    $adapter = \Bitrix\Crm\EntityAdapterFactory::create([
            'FM' => [
                'PHONE' => [
                    ['VALUE' => $phone]
                ]
            ]
        ],
        \CCrmOwnerType::Lead
    );
    
    $dups = (new \Bitrix\Crm\Integrity\ContactDuplicateChecker())
        ->findDuplicates(
            $adapter,
            new \Bitrix\Crm\Integrity\DuplicateSearchParams([
                'FM.PHONE'
            ])
        );
    
    foreach($dups as &$dup)
    {
        if(!($dup instanceof \Bitrix\Crm\Integrity\Duplicate))
        {
            continue;
        }
    
        $entities = $dup->getEntities();
        if(!(is_array($entities) && !empty($entities)))
        {
            continue;
        }
    
        //Each entity type limited by 50 items
        foreach($entities as &$entity)
        {
            if(!($entity instanceof \Bitrix\Crm\Integrity\DuplicateEntity))
            {
                continue;
            }
    
            if ( $entity->getEntityTypeID() != \CCrmOwnerType::Lead)
            {
                continue;
            }
    
            $leadIds[] = $entity->getEntityID();
        }
    }
    Ответ написан
    Комментировать
  • Как заставить работать обработчик событий битрикс?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Нужно больше контекста.

    Я сейчас поставил вот такой код в PHP консоль:
    AddEventHandler("crm", "OnBeforeCrmLeadAdd", "CheckOnBeforeCrmLeadAdd");
    AddEventHandler("crm", "OnAfterCrmLeadAdd", "CheckOnBeforeCrmLeadAdd");
    AddEventHandler("crm", "OnAfterExternalCrmLeadAdd", "CheckOnBeforeCrmLeadAdd");
    
    function CheckOnBeforeCrmLeadAdd(&$arFields) {
    file_put_contents($_SERVER["DOCUMENT_ROOT"]."/log_lead.log",print_r($arFields,true)."\n",FILE_APPEND);
    }
    
    \Bitrix\Main\Loader::IncludeModule('crm');
    
    $obLead = new \CCrmLead(false);
    $ID = $obLead->Add(
    	$leadfields = ['TITLE'=>'test'],
    	true,
    	array("REGISTER_SONET_EVENT" => true, "DISABLE_USER_FIELD_CHECK" => true)
    );


    Файл создался.

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

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вам нужно не открывать iframe в чаты, а разработать код, который будет делать то же самое.
    Т.е. это не какая-то галочка или другой шаблон компонента, а уже более нативная разработка.
    Ответ написан
    Комментировать