• Как обработать запрос не получая ошибку по таймауту?

    @PetrPo
    anisimov, добавь события для сущности и перед записью обрабатывай данные
  • Редирект Битрикс?

    @PetrPo
    newbie163, также, только в фильтре будет не ID, а CODE, что не получается?
    $elementCode = $arResult['VARIABLES']['ELEMENT_CODE'];
    $element = CIBLockElement::GetList([], ['IBLOCK_ID' => $arParams['IBLOCK_ID'], 'CODE' => $elementCode], false, false, ['DETAIL_PAGE_URL'])->GetNext();
    
    if($element['DETAIL_PAGE_URL']) {
    	LocalRedirect($element['DETAIL_PAGE_URL']);
    }
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @PetrPo
    d6core,
    1. Если вопрос производительности, зависит от продакшена и количества выбираемых записей (как и в любом другом запросе), но не вижу ничего сверхъестественного.

    2. Если вопрос читаемости кода, то вообще нихера не понятно что ты делаешь)) Советую не использовать алиасы A и B, завтра сам не вспомнишь что они значат, а другой программист вообще не поймет. И переменные называть нормально, а не комментарии ставить, если ИБ как в комменте история транзакций, то почему бы не назвать переменную $transactionIblock, а ИБ счета $billIblock.

    И ествественно просто так оставлять сегодня в 2021 - это нонсенс, должна быть какая обертка - метод классса, с "кричащей" сигнатурой, не уверен что до конца понимаю, что ты в итоге сделал, но например так
    function getCountTransactionsByDate(string $datetime) {
    
    }

    тогда
    а) впринципе не обязательно вникать, что у тебя там написано - это понятно из названия функции и
    б) если надо будет оптимизировать/поправить, то конечные пользователи твоего метода (это можешь быть ты сам) даже об этом не узнают

    3. Если вопрос правильности составленного запроса, то я не вижу твою картину полностью, поэтому советать какой-то 100% хороший вариант не могу. Я изначально отвечал на вопрос про связь ИБ фрукты и Highload-а. Надо сразу было рабочую ситуацию описывать, а не выдумывать))
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @PetrPo
    В select у тебя указана куча полей, например все ID в записях разные, как их группировать? Т.е. выбирать надо только те поля которые можно сгруппировать или явно указывать что с ними делать, в комментах по ссылке написано например просуммировать значения ID (глупый конечно пример, но для понимания). В твоем случае сработает, например так
    use Bitrix\Main\Entity\ExpressionField;
    
    //.....
    'select' => [
    	new ExpressionField('FROM_NAME', 'COUNT(%s)', 'A.NAME'),
    	new ExpressionField('TO_NAME', 'COUNT(%s)', 'B.NAME'),
    ]
    //.....

    ExpressionField из runtime можно убрать. Но как быть с остальным полями я сказать не могу...

    Для дебага, посмотри какой sql у тебя получается и сравни со своим прямым запросом
    \Bitrix\Main\Application::getConnection()->startTracker();
    
    $iterator = // getList_без_fetchAll
    
    print_r($iterator->getTrackerQuery()->getSql());


    UPD
    наверное твой вариант тоже сработает только ID и NAME из select-а надо убрать
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @PetrPo
    d6core, что подразумевается под группировкой?
    new \Bitrix\Main\Entity\ExpressionField('COUNT', 'COUNT(*)'),

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

    Фильтр не работает потому что передаешь дату не в формате БД
    $datetime = ConvertTimeStamp(AddToTimeStamp(array('HH' => -6)), 'FULL');
    \ConvertDateTime($datetime, 'YYYY-MM-DD HH:MI:SS');
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @PetrPo
    d6core, можно в этом запросе join-ы добавить
    $result = ElementTable::getList([
      'select' => ['ID', 'NAME', 'SIMILAR_NAME' => 'SIMILAR.NAME'],
      'filter' => ['IBLOCK_ID' => $iblockId, 'ID' => $elementIds],
      'runtime' => [
        new Reference(
          'HIGHLOAD',
          $referenceClass,
          Join::on('this.ID', 'ref.'.$referenceFieldId)
        ),
        new Reference(
          'SIMILAR',
          ElementTable::class,
          Join::on('this.HIGHLOAD.UF_SIMILAR, 'ref.ID')
        ),
      ]
    ])->fetchAll();


    И на второе поле UF_OTHER надо еще один join добавить
  • Как правильно делать выборку из 2х таблиц с помощью API Bitrix?

    @PetrPo
    Тяжело для восприятия такое чтиво, но если правильно понял, примерно так
    use Bitrix\Main\ORM\Fields\Relations\Reference;
    use Bitrix\Main\ORM\Query\Join;
    use Bitrix\Iblock\ElementTable;
    use Bitrix\Highloadblock\HighloadBlockTable;
    
    \Bitrix\Main\Loader::includeModule('iblock');
    \Bitrix\Main\Loader::includeModule('highloadblock');
    
    // ИБ фрукты
    $iblockId = 2; // укажи свой ИД инфоблока
    $elementIds = [11, 12]; // укажи свои ИД фруктов
    
    // Highload фрукты
    $hlId = 2; // укажи свой ИД Highload-а
    $hlBlock = HighloadBlockTable::getById($hlId)->fetch(); 
    $referenceClass = HighloadBlockTable::compileEntity($hlBlock)->getDataClass();
    $referenceFieldId = 'UF_CATALOG_ELEMENT'; // укажи код поля из своей первой колонки
    
    
    $result = ElementTable::getList([
    	'select' => ['ID', 'NAME', 'HIGHLOAD_FIELD_' => 'HIGHLOAD.*'],
    	'filter' => ['IBLOCK_ID' => $iblockId, 'ID' => $elementIds],
    	'runtime' => [
    		new Reference(
    			'HIGHLOAD',
    			$referenceClass,
    			Join::on('this.ID', 'ref.'.$referenceFieldId)
    		)
    	]
    ])->fetchAll();
    
    print_r($result);
  • Как добавить в адресную строку ID торгового предложения?

    @PetrPo
    Как ты сам написал, вопрос на статью. Напиши хотя бы с чего начал, подскажу что дальше делать
  • Почему не сохраняется марка(бренд) из 1С в CML2_BRAND?

    @PetrPo
    Андрей, в нем конечно не надо дописывать.
    1. Копируешь компонент catalog.import.1c в /local/components/bitrix
    2. В нем создаешь файл с классом наследником от класса CIBlockCMLImport (из файла cml2.php)
    3. Пишешь свой кастом с обработкой поля ТорговаяМарка
    4. Подключаешь файл с классом в component.php и меняешь все объекты, на объекты своего нового класса.
  • Умный фильтр не работает в корне каталога с ЧПУ, как можно исправить?

    @PetrPo
    Abram333,
    1. в SEF_URL_TEMPLATES
    "SEF_URL_TEMPLATES" => array(
    	"sections" => "",
    	"section" => "",
    	"element" => "#ELEMENT_CODE#/",
    	"compare" => "compare/",
    	"smart_filter" => "",
    	"smart_filter_custom" => "filter/#SMART_FILTER_PATH#/apply/",
    )


    В шаблоне комплексного компонента
    2. Файл sections.php в вызове смарт фильтра параметр SEF_RULE меняешь на smart_filter_custom и убираешь параметр SECTION_ID (если он есть)
    "SEF_RULE" => $arResult["FOLDER"].$arResult["URL_TEMPLATES"]["smart_filter_custom"],


    3. Создаешь файл smart_filter_custom.php, в нем
    <?
    if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED !== true) die();
    
    include('sections.php');


    UPD
    4. надо добавить параметр в файл .parameters.php
    $arTemplateParameters['SEF_URL_TEMPLATES_smart_filter_custom'] = array(
        'PARENT' => 'SEF_MODE',
        'NAME' => GetMessage('PARAMETER_SEF_URL_TEMPLATES_SMART_FILTER_CUSTOM'),
        "DEFAULT" => "",
        "VARIABLES" => array(),
    );

    это чтобы при сохранении компонента из публички не стерся твой параметр, GetMessage('PARAMETER_SEF_URL_TEMPLATES_SMART_FILTER_CUSTOM') - надо добавить в lang файл, здесь же папка /lang/ru/.parameters.php

    Есть еще вариант, сделать кастомный комплексный компонент, там всего пару строк изменить надо, тогда не придется такой кандибобер выписывать, как в варианте выше. Если надо, напишу как сделать
  • Умный фильтр не работает в корне каталога с ЧПУ, как можно исправить?

    @PetrPo
    Компонент каталога комплексный? Если да, покажи все настройки SEF_URL_TEMPLATES
  • Почему не сохраняется марка(бренд) из 1С в CML2_BRAND?

    @PetrPo
    Андрей, ну так CML2_MANUFACTURER есть в парсере - файл /bitrix/modules/iblock/classes/general/cml2.php, а CML2_BRAND нет
  • Почему не сохраняется марка(бренд) из 1С в CML2_BRAND?

    @PetrPo
    Откуда инфа про CML2_BRAND, сам придумал или ссылка есть?
    В xml-парсере битрикса нет такого поля
  • На сайте не сохраняется авторизация. В чем может быть проблема?

    @PetrPo
    В файле .settings.php есть ключ session? Если да, что в type указано доки
  • AJAX в Битрикс, как его использовать?

    @PetrPo
    как создать свои ajax запросы для существующих компонентов, что бы не залезать в папку bitrix и делать это в папке local (и возможно ли это)

    Смотря что надо, если надо полностью обновить компонент, то я делаю по аналогии с битриксовым компонентом catalog.section
    - в шаблоне создаю файл ajax.php аналогичный /bitrix/components/bitrix/catalog.section/ajax.php
    - в script.js пишу ajax, пример также можно посмотреть в /bitrix/components/bitrix/catalog.section/templates/bootstrp_v4/script.js функция sendRequest с вызовом BX.ajax в который передается путь к файлу ajax.php
    - в template.php есть инициализация объекта, в данном случае new JCCatalogSectionComponent, в который передается путь к компоненту
    componentPath: '<?=CUtil::JSEscape($componentPath)?>',

    , в твоем случае это будет
    templatePath: '<?=CUtil::JSEscape($this->getFolder())?>',

    - здесь же в template.php есть пример с передачей сериализованных параметров для вызова компонента в файле ajax.php, внизу смотри $signedParams

    что лучше использовать BX.ajax или $.ajax, есть ли между ними особая разница

    принципиально это обертка над xhr, но разница понятное дело есть, обе функции документированы, тут тебе надо самому разобраться.
    Если выбирать именно из BX и jQuery, то я всегда использую BX, т.к. jQuery практически никогда не использую.

    использование ajax вне компонента/модуля, как это проворачивать, просто создавать файл php с методами и данными, которые мне нужно получить, или это делается как-то по особенному (хочу понять как делают профессионалы)

    на этот вопрос не могу дать однозначный ответ, многое зависит от того что ты разрабатываешь (модуль, компонент, шаблон компонента, шаблон сайта):
    - BX.ajax.runAction и BX.ajax.runComponentAction, который ты указал вначале
    - кто-то складывает файлы в папку bitrix/tools (если модуль пишешь)
    - кто-то делает в корне сайта папку ajax
    - кто-то в шаблоне.
    Как-то js extension писал и положил php файлик прямо в него (т.е. в bitrix/js/мой_экстенш/ajax)

    Этот вопрос, разработчик, т.е. ты, должен сам решить))

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

    Этот функционал работает из коробки.
    - в компонентах catalog.section и catalog.element есть js событие на изменение корзины OnBasketChange
    - в компоненте sale.basket.basket.line шаблон bootstrap_v4 файл script.js есть пример
    BX.addCustomEvent(window, 'OnBasketChange', this.closure('refreshCart', {}));
  • Почему не работает компонент?

    @PetrPo
    Александр Маджугин, а в component.php print_r($this); какой тип объекта выдает, твой или CBitrixComponent ?

    Другие компоненты с class.php норм работают?
  • Почему на обновляет пользовательское свойство Битрикс?

    @PetrPo
    Много писанины, а толком ничего не сказано. Чтобы дать однозначный ответ надо перенести твой код себе, что вряд ли кто-то будет делать.
    На вид не хватает global $USER
  • Почему в Битриксе не работают сессии Де Семь?

    @PetrPo
    Trionik, серьезно, сессию в браузере хочешь посмотреть? Если тебе нужны куки, тогда и используй метод для установки куки (в битриксе он тоже есть)
  • Как почистить кеш компонента для неавторизованных пользователей если включен CACHE_GROUPS в компоненте?

    @PetrPo
    Непонятно, что и зачем ты пытаешься сделать. Про кеш все есть в документации ссылка
  • Почему в Битриксе не работают сессии Де Семь?

    @PetrPo
    Так ты ничего не выводишь, принтани сессию и увидишь там свое значение