Задать вопрос
Ответы пользователя по тегу 1С-Битрикс
  • Как автоматизировать поле "Реквизиты" в компании?

    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) "РЫЖИКОВ СЕРГЕЙ ВЛАДИМИРОВИЧ"
        }
      }
    }
    */
    Ответ написан
    Комментировать
  • Для чего нужен 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, то последовательные запросы на получение только необходимой информации серьезно сократят время на получение данных.
    Ответ написан
    Комментировать
  • Как отлавливать событие Изменения/Добавления OnAfter в Битрикс24 после исполнения всех Бизнес процессов?

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

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если вы прописали в php_interface/init.php (а не в конкретный сайт), при этом если он не перекрывается другим init.php то все должно работать с точки зрения подключения классов.

    Однако метод агента должен возвращать строку - либо php-код (полное название функции) следующего агента, либо ничего - у вас же дальше будет "eval("агент");" что вызовет ошибку php.

    Смотрите логи httpd и php
    Ответ написан
  • Как не создавать элемент через событие?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Событие "onCrmDynamicItemAdd" используется исключительно для REST и срабатывает после создания элемента смарт-процесса. Т.е. отменить в этот момент вы ничего не можете.

    Для кастомизации смарт-процессов на коробке вы должны использовать дополнительные Действия, перекрывая фабрику смарт-процесса.
    Ответ написан
    Комментировать
  • Как работать с объектом ORM в методе обработчике класса описания сущности?

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

    Можно сделать работу обработчиков в паре, для получения воспользоваться объектом.

    Для вдохновения можно использовать код:
    use \Bitrix\Main\ORM\Event;
    
    class DeleteHandler
    {
        static $queue = [];
    
        public static function beforeDelete(Event $event)
        {
            // Получаем объект
            $item = $event->getParameter('object');
    
            // Запрашиваем из БД `FILE_ID`
            $item->fill('FILE_ID');
    
            // Пишем в "стек" удаляемый файл
            static::$queue[ $event->getParameter('ID') ] = (int) $item->get('FILE_ID');
        }
    
        public static function afterDelete(Event $event)
        {
            if (
                in_array($event->getParameter('ID'), static::$queue )
                && static::$queue[$event->getParameter('ID')]>0
            )
            {
                \CFile::Delete(static::$queue[$event->getParameter('ID')]);
    
                unset(static::$queue[$event->getParameter('ID')]);
            }
        }
    }
    Ответ написан
    Комментировать
  • Как убрать поле "комментарий" в заданиях бп?

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

    Для того чтобы убрать или контролировать его появление необходима кастомизация шаблона bitrix:bizproc.task
    Ответ написан
    1 комментарий
  • Бизнес процесс и кастомные поля список. Как забрать выбранные значения из поля?

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

    Получить значение глобальной переменной можно многими путями, например через парсинг:

    $globalVarAsdasd = $this->ParseValue('{'.'{Переменные глобальные: asdasd}}');


    Взято из книжки
    Ответ написан
    1 комментарий
  • Как настроить отправку писем в битрикс24 (коробка)?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Скорее всего вы пытаетесь настроить отправку из модуля "Почта", а штатно она отправляется через системную. Обычно smtp relay на почтовых серверах запрещен (или стоит денег).

    Для избежания этой проблемы можно:
    1. Перейти на локальные smtp настройки.
    2. Забить все конфигурациии в msmtp и написать код распределения. На этой технологии кстати работают многие решения по отправке писем.

    Рекомендую вариант 1.
    Ответ написан
  • Как сделать превью pdf документа?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Вопрос такой: как сделать превью пдф документа?


    Через любую программу, которая позволяет конвертировать PDF в изображение, например convert, pdftoppm

    Подобные ответы легко ищутся в интернете:
    https://stackoverflow.com/questions/43085889/how-t...

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


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

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Если у вас абстрактный вопрос "как отслеживать изменение полей", то лучше чем ответил belc не будет.
    Суть подхода такая: вы делаете еще Н полей (по 1 на каждое отслеживаемое поле) и при изменении/создании копируете туда старые значения.
    Делаете БП на изменение и проверяете старые значения, сравнивая с текущими - если есть разница то делаете что нужно.
    Подход самый НЕ оптимальный и самый НЕ гибкий.

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

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

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


    Подзадача отображается на скрам доске в спринте.
    Что такое задача? Это то что нужно сделать.
    Что такое подзадача? Это часть которую нужно сделать для выполнения основной задачи.

    Отсюда получается - в беклоге отображаются только родительские задачи.
    В спринте отображаются и родительские и их дочерние.

    Наглядная иллюстрация:
    65a52c7914156062433796.png
    65a52c74ad383760659904.png
    Ответ написан
  • Как установить АСПРО Максимум на коробочном портале Битрикс 24 на отдельный домен?

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

    2. При создании отдельного сайта с ядром и БД Б24, когда сайт создаётся в папке /home/bitrix/ext_www/папка сайта и создания там символических ссылок на папки /home/bitrix/www/bitrix и /home/bitrix/www/upload, в момент перехода на URL сайта, происходит переадресация на главную страницу Б24(((


    Вам нужно корректно заполнить следующие моменты:
    1. Нужно указать распространение авторизации на все домены
    2. НЕ прописываете адрес сайта у crm в настройках сайта
    3. Указать корректные пути в сайтам
    4. Повысить сортировку сайта ИМ выше CRM
    Ответ написан
  • Как удалить элемент множественного поля Email в Bitrix24?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Работать с таблицей значений мультиполей для записи/изменения или удаления напрямую нельзя.

    Используйте методы CCrmLead или CCrmContact.

    Например для контакта (взято отсюда):
    $contactFields = [
        "FM"       => [
            "PHONE" => [
                // Телефон с ID 3567 будет изменен
                "3567" => [
                    "VALUE"      => '+78889996644',
                    "VALUE_TYPE" => "WORK",
                ],
                // Телефон в ID 1234 будет удален
                "1234" => [
                    "VALUE"      => '',
                    "VALUE_TYPE" => "HOME",
                ]
            ],
        ],
    ];
    
    $contactEntity = new \CCrmContact(false);
    
    $isUpdateSuccess = $contactEntity->Update($contactId);


    А вот как раз 3567 и 1234 вы можете получить либо через GetList той же сущности, либо через FieldMultiTable.
    Ответ написан
    Комментировать
  • Можно ли использовать Bitrix Framework без Bitrix CMS? Как начать?

    gromdron
    @gromdron
    Работаю с Bitrix24
    TLDR: Никак.

    Давно читал что Битрикс CMS -- это продукт, построенный на Bitrix Framework. Как и Битрикс 24. И по идее, можно построить на нём свой собственный продукт. Использовать без CMS или любого готового решения или продукта.


    Да, есть Bitrix Framework, но это не фреймворк в общепринятом виде, а именно каркас проприетарной системы который непрерывно связан с CMS (точнее обмазан вокруг).

    Есть ядро продукта (которое состоит из модулей main, fileman, ui, rest и сайта-админки), так вот Framework это часть модуля main который обеспечивает работоспособность системы.
    Ответ написан
    Комментировать
  • Как загрузить папку в Б24?

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


    Здесь вы уперлись в ваш собственный лимит и решили перейти на более "простой" как вам показалось вариант.
    Нет, лучше не использовать эластичные диски, а выделять квоту явно и прогнозировать ее рост.
    Сотни гб - это объем который пугает вашу организацию (или вас), но у нас на некоторых проектах расчет идет в ТБ.

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


    Здесь вы упираетесь в организацию файлов - любая ФС будет тормозить при большом количестве файлов в одной директории. Диск битрикса24 не исключение - каталогизируйте ваши данные. Старайтесь не допускать более 500 объектов в директории.

    - Третий, который так и не получилось реализовать, подключить как сетевой диск. В диске кликаю шестеренку - сетевой диск - копирую ссылку - вставляю в проводник - ввожу данные пользователя и хрен, неправильные имя пользователя и пароль (пользователь доменный, пробовал по разному), даже где-то нашел что надо включить nginx, но все бестолку..


    Если коробочный Битрикс24 находится у вас внутри сети, то скорее всего неправильный проброс.
    Неправильная конфигурация встречается очень редко, но если вы используете не bitrix env, то такое возможно.
    Ответ написан
    Комментировать
  • Как в Битрикс24 передавать кастомные поля заказа?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Штатно такой возможности нет. Интеграция Битрикс24 <-> БУС подразумевает что интегрируется стандартный Б24 и стандартный БУС без допилов.
    Ответ написан
    Комментировать
  • Как сделать pdf файл для скачивания из элемента битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    CFile::MakeFileArray

    MakeFileArray принимает параметром физический файл который будет, т.е. сначала вам нужно создать корректный pdf файл и положить его куда-нибудь в tmp директорию, а оттуда сохранить.

    А у вас судя по всему render() отрисовывается в контексте текущей страницы, где уже выведен хедер и от этого файл битый.
    Ответ написан
    Комментировать
  • ЧПУ на Битрикс через urlrewrite?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Вот прям вот так на стандартных компонентах вряд ли получиться.
    Дело в том что у вас конфликт с SEF. С одной стороны вы скорее всего в SEF указали что путь к детальной странице у вас выглядит как: #SECTION_CODE_PATH#/#ELEMENT_ID# и в таком случае ваша фраза "brands" воспринимается как символьный код одного из разделов.

    Я бы порекомендовал собрать свой комплексный компонент, который бы работал со следующими ЧПУ:
    /catalog/brands/#BRAND_CODE#/ - деталка конкретного бренда
    /catalog/brands/ - список брендов
    /catalog/item/#ELEMET_CODE#/ - деталка конкретного элемента
    /catalog/section/#SECTION_CODE_PATH#/ - отображение списка элементов в разделе
    /catalog/ - отображение списка разделов.

    А уже в качестве простых компонентов (в составе комплексного) использовать штатные компоненты битрикса.
    Ответ написан