Задать вопрос
  • Как вытащить возвращаемое значение из ajax-запроса?

    Tim-A-2020
    @Tim-A-2020
    У слова async один простой смысл: эта функция всегда возвращает промис. Значения других типов оборачиваются в завершившийся успешно промис автоматически - Источник . Чтобы получить данные нужно использовать асинхронную функцию либо через then.
    Пример 1
    ...
    ProductData.post().then(data => console.log(data));

    Пример 2
    (async function() {
        const response = await ProductData.post();
        console.log(response);
    })()


    Можно использовать callback
    inputNames.then(response => {
        console.log(response.inputs) // работает, возвращает нужный результат
        test(response.inputs);
    })
    
    function test(inputs) {
    	console.log(inputs)
    }

    inputs = undefined - потому что в момент исполнения промис еще не завершился.
    Если принципиально хотите использовать синхронный запрос, то воспользуйтесь синхронным аяксом. На битриксе не знаю как это сделать. На время выполнения запроса будет блокироваться браузер.
    let responce = $.ajax({async: false, ...}).responceText;
    Ответ написан
    Комментировать
  • Как поставить уведомления в Битрикс24?

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


    Проблема в неправильно настроенном push'n'pull модуле.
    Сам по себе код - рабочий*

    * - не конкретно этот код, а подход.
    Тестировал на:
    \Bitrix\Main\Loader::IncludeModule('im');
    
    echo \CIMChat::AddMessage([
      'TO_CHAT_ID' => 6,
      'FROM_USER_ID' => 3,
      'NOTIFY_MESSAGE' => 'Hello',
    ]);
    Ответ написан
    2 комментария
  • Как зациклить получение данных через php в коробке Битркс24?

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

    Ошибка номер 1: права.
    Модуль задач не стандартный - он по-умолчанию включает права и права контролирует жестко. Если пользователь, на чей хит выпал запуск действия не имеет прав на задачу ID:6234, то в $arTask будет false и вы просто не зайдете в условие.
    Почитайте эту статью: https://maxyc.wordpress.com/2017/12/27/bitrix24-ta...

    Ошибка номер 2: неправильно написание кода.

    Посмотрите внимательно на фрагмент кода:
    $this->SetVariable(Variable1, $arTask["TITLE"]);

    У вас Variable1 с точки зрения php это контанта, но ее вы не задаете.
    По тексту я понимаю что вы хотите заполнить переменную бизнес-процесса с кодом Variable1 значением названия задачи.
    У вас это должно выглядеть так:
    $this->SetVariable("Variable1", $arTask["TITLE"]);

    Ошибка номер 3: вера в работу кода.

    Что случится, если внезапно этот код вызовет ошибку? Например какой-нибудь fatal?
    Ваш бизнес-процесс зависнет и перестанет выполняться - а вы даже не узнаете почему.
    Совет: оборачивайте ваш код в try-catch блок и в catch-блоке используйте запись в лог БП или хотя бы в файл.

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

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Есть ли быстрый способ решить эту проблему?


    Чтобы был "быстрый" способ, нужно хотя бы иметь "2 способа" решения, а вы даже проблему (т.е. собственно почему происходит деактивация) не локализовали.

    Как посмотреть пользователей которые пришли во время обмена с AD?


    Таких логов не ведется, но можно подписаться на событие OnLdapUserFields модуля ldap и посмотреть какие приходят данные во время обмена.

    Как записать в лог всех пользователей которые есть в xml с 1с?


    Если мы говорим про штатный импорт, то файл последнего импорта находится в `/upload/1c_intranet/`
    Судя по тому что вы привели код - у вас кастомный импорт и здесь вам нужно обратиться к разработчикам.

    Что касается вашей проблемы, я кажется знаю ее корень: изменение пользователей из 1С.
    В механизме сихнронизации битрикса происходит оперирование тремя датами:
    - Дата последней синхронизации в Битрикс24
    - Дата последнего изменения сотрудника в Битрикс24
    - Дата последнего изменения учетки в AD

    Синхронизация происходит при трех ключевых условиях:
    1. LDAP Query вернул учетку.
    2. Изменение учетке в AD (либо в Б24) произошли ПОСЛЕ последней успешной синхронизации.
    3. Учетка не должна входить в "неимпортируемые группы"

    Соответственно типовые ошибки:
    1. Рассинхрон времени (например по какой-то причине время на сервере Б24 бежит впереди времени AD).
    2. Шаманство с датами (иногда учетки отключают задним числом)
    3. Неправильные условия (ldap query с активностью)
    4. После увольнению учетку добавляют в группу, которая в Б24 помечена как несинхронизируемая
    Ответ написан
    Комментировать
  • Как правильно подключить JS файл в другом JS файле?

    bingo347
    @bingo347 Куратор тега JavaScript
    Crazy on performance...
    const script = document.createElement('script');
    script.src = '/path/to/script.js';
    document.head.appendChild(script);
    Ответ написан
    Комментировать
  • Как можно включить уведомления для всех пользователей сразу?

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

    \Bitrix\Main\Loader::IncludeModule('im');
    
    /**
     * @var integer Чьи настройки берем (id)
     */
    $fromUserId = 1;
    
    /**
     * @var integer Кому их сохраняем (id)
     */
    $toUserId = 2;
    
    $userSettings = CIMSettings::Get($fromUserId);
    
    foreach ($userSettings as $type => $value)
    {
    	CIMSettings::Set($type, $value, $toUserId);
    }
    Ответ написан
    1 комментарий
  • Linux Bodhi 6.0.0. Не работает удаление табуляции: ни Shift+Tab, ни Alt+}. Как пофиксить?

    @Mikhri Автор вопроса
    Проблема устранена. Источник неожиданный: gXNeur. Shift+Tab у него назначен на какую-то бесполезную (для меня) и незаметную при рандомном использовании функцию.
    Отключил эти горячие клавиши в gXNeur - заработало.
    Ответ написан
    Комментировать
  • PhpSpreadsheet: как добавить изображение (gif) в excel?

    xakplant
    @xakplant
    Автор сайта xakplant.ru
    Я написал статейку как раз про новую либу. В phpspreadsheets вставляется картинка так

    TL;DR

    $drawing = new Drawing(); // Новый экземпляр
    $drawing->setName($name); // Имя картинки
    $drawing->setDescription($name); // Описание
    $drawing->setPath($img); // Абсолютный путь на сервере к картинке
    $drawing->setCoordinates('A'. $i); // Координаты картинки
    $drawing->getShadow()->setVisible(true); // Тень если нужно
    $drawing->setWorksheet($sheet); // Нужная вкладка
    $drawing->setHeight(100); // Высота в пикселях
    $drawing->setWidth(100); // Ширина в пикселях
    Ответ написан
    Комментировать
  • Как в DealTable::getList включить проверку прав CRM?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вы неверно трактуете исходную точку.

    DataMapper'ы это низкоуровневая прослойка между данными и вашим кодом. Там не должно быть никакой проверки прав и соответственно ее там нет.

    Для получения списка сделок с правами и сохранением обратной совместимости вы обязаны использовать методы:
    CCrmDeal::GetList($arOrder = Array('DATE_CREATE' => 'DESC'), $arFilter = Array(), $arSelect = Array(), $nPageTop = false)
    CCrmDeal::GetListEx($arOrder = array(), $arFilter = array(), $arGroupBy = false, $arNavStartParams = false, $arSelectFields = array(), $arOptions = array())


    Официально нового API (как принято говорить D7) для CRM нет.
    Ответ написан
    Комментировать
  • Как в Битрикс получить все подразделы инфоблока, включая вложенные?

    alexyarik
    @alexyarik
    Битрикс разработчик
    Чем пример из документации не подошёл?
    https://dev.1c-bitrix.ru/api_help/iblock/classes/c...
    <?
    $rsParentSection = CIBlockSection::GetByID(1);
    if ($arParentSection = $rsParentSection->GetNext())
    {
       $arFilter = array('IBLOCK_ID' => 2,'>LEFT_MARGIN' => $arParentSection['LEFT_MARGIN'],'<RIGHT_MARGIN' => $arParentSection['RIGHT_MARGIN'],'>DEPTH_LEVEL' => $arParentSection['DEPTH_LEVEL']); // выберет потомков без учета активности
       $rsSect = CIBlockSection::GetList(array('left_margin' => 'asc'),$arFilter);
       while ($arSect = $rsSect->GetNext())
       {
           $arTest[] = $arSect;// получаем подразделы
       }
    }
    ?>
    Ответ написан
    1 комментарий
  • Как получить все разделы инфоблока, с подразделами всех уровней вложенности?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Перечитал и вообще не понял вопроса. Есть же стандартный CIblockSection::GetList() который за 1 запрос прекрасно все достает и со вложенностью.

    В спойлере указал код, который получить все разделы включая подразделы для конкретного инфоблока, отсортированные по левому отступу (т.е. сверху вниз, слева на право). И все это за 1 запрос к БД средствами API.

    Пример который проверял
    /**
     * Всегда считаем что модуль установлен, 
     * поэтому просто подключаем его
     */
    \Bitrix\Main\Loader::IncludeModule('iblock');
    
    /**
     * У меня для тестирования инфоблок с номером 5,
     * у тебя может быть любой другой инфобло
     * 
     * @var array Параметры фильтрации
     */
    $arFilter = [
    	'IBLOCK_ID' => 5
    ];
    
    /**
     * В Битриксе разделы хранятся по принципу Nested sets
     * 
     * @var array Параметры сортировки
     */
    $arOrder = [
    	'LEFT_MARGIN' => 'ASC'
    ];
    
    /**
     * @var array Поля разделов
     */
    $arSelect = [
    	'ID',
    	'LEFT_MARGIN',
    	'DEPTH_LEVEL',
    	'NAME'
    ];
    
    $resSections = \CIBlockSection::GetList($arOrder, $arFilter, false, $arSelect);
    
    while( $arSection = $resSections->fetch() )
    {
    	var_dump($arSection);
    }


    В чем я ошибся и где я делаю не так?
    Ответ написан
    1 комментарий
  • Как пропустить итерацию foreach?

    @ArtemioVegas
    php developer
    используйте Continue для пропуска итерации в цикле
    <?php
    $arr = ["a","b","c","e"];
    foreach($arr as $value){
    	if ( $value === 'b' ) continue;
    	echo $value;
    }
    Ответ написан
    Комментировать
  • Bitrix своя цена для товара в корзине CUSTOM_PRICE?

    gromdron
    @gromdron
    Работаю с Bitrix24
    1) Проверьте настройки складского учета и что-то я не вижу класса провайдера при создании товара. Вы его передаете? Проверьте актуальные данные тут - https://dev.1c-bitrix.ru/community/blogs/vws/about...
    2) А в paymentCollection после изменения цены все норм?
    Ответ написан
    Комментировать
  • Как найти ошибку в битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Наилучшим решением служит обращение в техническую поддержку Битрикса, но только после того как перенесете/развернете сайт штатными средствами битрикса.
    Ответ написан
    1 комментарий
  • Как переопределить класс Notify в папке local (или кастомизировать свои оповещения) в Битрикс:Управление сайтом?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Скажите пожалуйста, что можно предпринять?


    Для начала: классы нельзя переопределять - только модули, но это не вариант от слова "совсем".

    Для решения вашей задачи легальные способы:
    - Модифицировать отправляемый почтовый шаблон и добавить в него php-код для получения нужно информации
    - На событии onBeforeEventAdd / onBeforeEventSend дописывать нужные данные в почтовый шаблон
    - Отключить стандартные уведомления и на событиях самому отправлять уведомления.

    Выбирайте способ которым хотите воспользоваться сами :)
    Ответ написан
    3 комментария
  • События для динамически добавленных в DOM элементов?

    Jakim
    @Jakim
    Laravel - developer
    $(function() {
            $(document).on('click touchstart', '.selector', function(){ 
                console.log($(this));
            });
        });

    Ребятки, добавляем такой кусок кода в js и ловим все события как на телефоне так и на ПК, кроссбраузерно кроссплатформенно.
    Не ищите других способов, ибо кто пишет про .delegate() или .live() давно не читали доку jQuery.
    Ответ написан
    Комментировать
  • Как опубликовать сообщение в группе с помощью API?

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

    Подключаем модуль Соц.сети:
    CModule::IncludeModule("socialnetwork");

    Чтобы отправить сообщение в ленту, нужно чтобы существовал пост, который будет отправлен в ленту, поэтому создаем сначала пост:

    $arFields = array(
     "TITLE" => "Заголовок записи",
     "DETAIL_TEXT" => "Тело сообщения",
     "BLOG_ID" => 1, //ID отправителя
     "AUTHOR_ID" => 1, //ID блога, в котором будет запись
     "DATE_PUBLISH" => '11.02.2014 09:08', // дада
     "PUBLISH_STATUS" => BLOG_PUBLISH_STATUS_PUBLISH, // Читаем в API
     "ENABLE_TRACKBACK" => 'N',
     "ENABLE_COMMENTS" => 'Y'
    );


    При успешном добавлении ($ID = CBlogPost::Add($arFields);) получим ID blogPost записи

    Затем необходимо отправить это сообщение в ленту, для нам нужен фрагмент кода (заменить соответствующим образом):

    $arEvent = array (
    	'EVENT_ID'     => 'blog_post',
    	'=LOG_DATE'    => 'now()',
    	'TITLE_TEMPLATE' => '#USER_NAME# добавил(а) сообщение "#TITLE#" в блог',
    	'TITLE'    => "Заголовок записи",
    	'MESSAGE'  => "Текст записи",
    	'TEXT_MESSAGE'  => "Текст записи",
    	'MODULE_ID'     => 'blog',
    	'CALLBACK_FUNC' => false,
    	'SOURCE_ID'     => $ID,
    	'ENABLE_COMMENTS'  => 'Y',
    	'RATING_TYPE_ID'   => 'BLOG_POST',
    	'RATING_ENTITY_ID' => $newID,
    	'ENTITY_TYPE' => 'U',
    	'ENTITY_ID'   => '1',
    	'USER_ID'     => '1',
    	'URL' => '/company/personal/user/1/blog/'.$ID.'/',
    );


    Создаём запись в ленте через: CSocNetLog::Add, на выходе получаем eventID (в случае успеха)

    Если все прошло хорошо, то выставляем права на пост (в премере отправляем ВСЕМ ПОЛЬЗОВАТЕЛЯМ G3)

    // Выдает права
    CSocNetLogRights::Add ( $eventID, array ("G3") );
    // Отправляет уведомление о новом сообщении
    CSocNetLog::SendEvent ( $eventID, 'SONET_NEW_EVENT' );


    Радуемся =)

    Все параметры получаются по средствам GetList например.
    Ответ написан
    4 комментария
  • По какому событию отслеживать редактирование структуры компании в Битрикс24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Добрый день,

    К сожалению, как такового целевого логгирования в Битриксе нет.
    То есть, можно залоггировать отдельные действия, например: изменение пользователя, редактирование файла, изменени структуры.
    Но все данные изменения будут лишь в журнале событий и не будут отражены в публичной части сайта.

    Если смотреть в рамках битрикса, то:
    - редактирование пользователя - событие OnAfterUserUpdate модуля main ( обязательно проверяйте ключ RESULT в $arFields)
    - редактирование подразделения - событие OnAfterIBlockSectionUpdate модуля iblock ( обязательно проверяйте ключи RESULT и IBLOCK_ID для фильтрации только нужных подразделений)
    Аналогично с удалением и добавлением
    Ответ написан
    2 комментария