Ответы пользователя по тегу 1С-Битрикс
  • Битрикс: http стили грузятся, https - нет, почему?

    gromdron
    @gromdron
    Работаю с Bitrix24
    На самом деле все просто как 2х2: у Вас сайт работает и по http и по httpS, а CDN работает ЛИБО для http ЛИБО для httpS.

    На странице: /bitrix/admin/bitrixcloud_cdn.php?lang=ru
    На вкладке дополнительно, нужно отметить опцию "Сайт использует https".

    Дело в том, что все ресурсы отдаются грузятся с Вашего сайта, но отдаются с другого домена.
    Если Вы посмотрите на строку, то они грузятся с "//brima.ru.opt-css.1c-bitrix-cdn.ru/", а при активации ссылка примет вид: "//opt-******.ssl.1c-bitrix-cdn.ru/", где ****** это будет Ваш уникальный ID (все будет автоматически после активации галочки).
    Ответ написан
    Комментировать
  • Как правильно переименовать папки сайтов в VM Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для выполнения данной операции, Вам не нужно переименовывать папки - Вам нужно поправить файл hosts (чтобы с site1.ru был переход на site1.loc), потому что иначе, без зарегистрированного домена все будет очень плохо.
    А чтобы site1.ru открывался Вам нужно отредактировать конфигурацию nginx.

    Собственно название папок это скорее для Вас чтобы не запутались. Папки могут называться хоть www.supertest.batch.main, а открываться по www.site1.ru, хоть по site1.io
    Ответ написан
    Комментировать
  • Как записать данные в базу при установке модуля?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ну окей, погнали.

    (file_exists($f = dirname(__FILE__).'/db/mysql/install.sql'))

    1) Как вообще получилась такая адовая конструкцию? Она же не читается, да и не нужна она (см. ниже)

    2) Файл dirname(__FILE__).'/db/mysql/install.sql') всегда присутствует в директории модуля.
    За свою практику, я еще не встречал шибко-умных-парней, которые бы лезли в чужой модуль и удаляли файлы, поэтому если он есть в модуле, то он есть всегда.
    Хочешь проверить дополнительно? Проверяй, только если он не найден - хотя бы ошибку выводи, а то сейчас все в холостую - нет файла -> нет события -> непонятно почему не работает

    3) Хочешь выполнить батч? Ну так и делайте это как битрикс. Посмотри хотя бы на модуль торгового каталога:

    if(!$DB->Query("SELECT 'x' FROM b_catalog_group", true))
        $errors = $DB->RunSQLBatch($_SERVER['DOCUMENT_ROOT']."/bitrix/modules/catalog/install/db/".strtolower($DB->type)."/install.sql");


    Обрати внимание на: strtolower($DB->type), если планируешь делать модуль оставь хотя бы лазейку, чтобы потом не переделывать.

    4) Переходи уже на d7!
    В папке модуля в include.php оставь пустой комментарий с тегами php

    И в /lib/demodata.php пропиши:

    namespace Partner\Demosite;
    
    class DemoData


    Тогда тебе не нужно будет править автолоадер при появлении нового класса и геморроя будет меньше

    5) После п.4 смотри на новый лоадер (и раз уж пишешь по-старинке, вот старый код, новый можешь в том же модуле торгового каталога посмотреть):

    RegisterModuleDependences('main', 'OnPageStart', $this->MODULE_ID, '\Partner\Demosite\DemoData', 'AddDemoDataOptions');


    P.S. Я надеюсь в uninstall ты удаляешь подписки на события.

    А теперь ответ на вопрос: если хочешь загрузить какие-нибудь данные в БД - делай это в методе DoInstall() в самом конце после успешной регистрации модуля, а не на событиях. Если их слишком много - выдели несколько шагов.
    Ответ написан
    2 комментария
  • Битрикс Корпоративный портал бизнес процесс, как добавить триггер времени?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Прямо как Вы описали нет, НО!
    Если БП со статусами, то Вы можете сделать отдельный статус для подтверждения.
    Поставить тайм-аут на событие в 30 минут, и в другом статусе проверить были ли они выполнены. При невыполнении - вернуть заново на тот же статус.

    Реализация похуже, но кейс решает.
    Ответ написан
    Комментировать
  • Как вывести данные в админке?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ну есть один вариант:
    - Создаете пользовательское поле типа "число" без права редактирования пользователем
    - Пишете код, который при добавлении/удалении/обновлении элемента устанавливает значение поля в соответствующее значение, если дата баллов не истекла
    - Пишете агента, который каждый день получает элементы инфоблока баллов, которые кончились вчера и обновляет данные о пользователе на текущую дату
    Ответ написан
    Комментировать
  • Кто нибудь может накидать вариантов почему такие разрывы в коде?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Окей, почему такие большие разрывы в коде?

    1) Возможно ошибка в самом файле шаблона. Нужно проверить все шаблоны на предмет символов в цикле.
    Можно попробовать заменить свой шаблон меню, стандартным шаблоном битрикса. Помогло? Ошибка в шаблоне. Нет? Ошибка в другом месте.

    2) Возможно ошибка кроется в result_modifier.php шаблона.
    Файла нет или ошибки в нем нет? Ошибка в другом месте.

    3) Возможно кто-то вынес меню в local или изменил файл в ядре (/bitrix/components/bitrix/menu).
    Ядро не менялось и компонента в local нет? Ошибка в другом месте.

    4) Возможно используется расширенное меню и ошибка в нем.
    Если расширенное меню не используется или в нем нет ошибки, то ошибка в другом месте

    5) Возможно ошибка при формировании меню.
    Например пункты меню формируются php кодом или внутри происходит какой-то include/require

    Ошибка по-прежнему не найдена?
    Поздравляю - Вы попали на очень хороший дебаг и может стоит обратиться в техническую поддержку?
    Ответ написан
    Комментировать
  • Как создать агента в своём модуле?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А в чем собственно вопрос? Делайте как по документации

    1) При установки модуля добавляем агент:
    \CAgent::AddAgent( "\\Your\\Module\\SuperClass::superAgent();", "your.module", "N", 10 * 24 * 3600, "", "Y");

    где
    "\\Your\\Module\\SuperClass::superAgent();" - код php который должен выполняться (точка с запятой в конце строго!!!)
    "your.module" - название вашего модуля
    "N" - периодичность
    10 * 24 * 3600 = периодичность запуска
    '' - первая дата проверки (оставлять пустой)
    "Y" - активность агента

    2) При удалении - очищаем агенты
    \CAgent::RemoveModuleAgents("your.module");
    3) Если файлы располагаются по канонам d7 ( /your.module/lib/superclass.php ), то ничего больше делать не нужно, если старый - то нужно прописать в include.php автолоадер для вашего класса с агентом
    Ответ написан
    2 комментария
  • В ORM Битрикса есть сеттеры и геттеры?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Очень интересная задача.

    Если Вам нужно оперировать только после получения данных, то Вам отлично подойдет механизм "Форматирования значений" из документации по ORM.
    При этом можете использовать сериализацию или json на ваше усмотрение (рекомендую сериализацию - нативнее и есть шанс что в модуле производительности заработает).

    Если у Вас MySQL выше 5,7 версии, можно добавить несколько Expression полей и доставать из JSON ключи так же как и поля. Пока не пробовали данный вариант - руки не доходили.
    Ответ написан
    Комментировать
  • Как изменить значение php_value mbstring.func_overload для определенного сайта на локальном сервере?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Правильно вам коллеги советовали, но я расскажу еще один путь:

    1) Открываем меню в трее: Дополнительно -> Конфигурация -> Apache 2.* (у меня 2.4) (выбираем пункт)
    2) У вас откроется редактор с примерно таким кодом:
    #-----------------------------------------------#
    # Начало блока конфигурации HTTP хоста
    #-----------------------------------------------#
    
    <VirtualHost *:%httpport%>
    
        DocumentRoot    "%hostdir%"
        ServerName      "%host%"
        ServerAlias     "%host%" %aliases%
        ScriptAlias     /cgi-bin/ "%hostdir%/cgi-bin/"
    
    </VirtualHost>

    У меня OpenServer находится на диске E, соответственно путь до папки с битриксом получается такой: E:/OpenServer/OpenServer/domains/dev

    Вписываем волшебный кусочек кода:
    <Directory "E:/OpenServer/OpenServer/domains/dev">
    	AllowOverride All
    	php_admin_value mbstring.func_overload 0
    </Directory>

    Чтобы получилось на подобии этого:
    #-----------------------------------------------#
    # Начало блока конфигурации HTTP хоста
    #-----------------------------------------------#
    
    <VirtualHost *:%httpport%>
    
        DocumentRoot    "%hostdir%"
        ServerName      "%host%"
        ServerAlias     "%host%" %aliases%
        ScriptAlias     /cgi-bin/ "%hostdir%/cgi-bin/"
    	
    	<Directory "e:\openserver\openserver\domains\cli">
    		AllowOverride All
    		php_admin_value mbstring.func_overload 0
    	</Directory>
    	
    	<Directory "E:/OpenServer/OpenServer/domains/dev">
    		AllowOverride All
    		php_admin_value mbstring.func_overload 0
    	</Directory>
    
    </VirtualHost>

    Сохраняем файл

    3) Перезагружаем OpenServer (желтый флажок)

    Примечание: метод работает только в web окружении, в консоли вы будете по-прежнему со значениями из Вашего php.ini файла
    Ответ написан
    5 комментариев
  • Страница без админки не открывается bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    1) Проверяем сервер скриптом bitrix_server_test
    2) Проверяем сервер через встроенную проверку сайта
    3) Отключаем модуль компрессии, если таковой установлен
    Ответ написан
    Комментировать
  • Сортировка getList битрикс. Стоит ли применять фильтр?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если в инфоблоке несколько тысяч записей, какой запрос CIBlock::getList отработает быстрее, с применением arFilter или выборка всех записей?


    Если брать исходную постановку запроса: для CIBlock::getList без разницы сколько записей в самом инфоблоке, потому как Вы выбираете не элементы, а сами инфоблоки.
    Если речь идет о CIblockElement::getList(), то запрос не корректный.

    1) Для начала нужно понять что Вы делаете с записями. Время запроса сильно не изменится, а вот время обработки результата может "гулять" значительно.
    То есть, если Вы выводите на экран 1 тысячу значений и 1 миллион значений, то время будет существенным.

    2) Затем нужно понять, используете Вы сложный фильтр или простой.
    Например в инфоблоке у Вас 1 тысяча записей. Скажите, проще будет достать все? Или достать все, у которых этот параметр такой, такой или такой, а вот это параметр такой и такой, но только если дата в диапазоне от такого-то до такого-то и сегодня четверг.
    При небольших объемах, выбрать все элементы будет быстрее чем использовать фильтр по элементу, особенно если там есть логические операторы AND/OR, при этом с LIKE, да еще и множественными свойствами по инфоблоку 1.0
    Ответ написан
    Комментировать
  • Где лежат данные для функции showhead в bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Файл: /bitrix/modules/main/classes/general/main.php
    Строки: ~837 - ~847
    Выдержка кода:
    public function ShowHead($bXhtmlStyle=true)
    	{
    		echo '<meta http-equiv="Content-Type" content="text/html; charset='.LANG_CHARSET.'"'.($bXhtmlStyle? ' /':'').'>'."\n";
    		$this->ShowMeta("robots", false, $bXhtmlStyle);
    		$this->ShowMeta("keywords", false, $bXhtmlStyle);
    		$this->ShowMeta("description", false, $bXhtmlStyle);
    		$this->ShowLink("canonical", null, $bXhtmlStyle);
    		$this->ShowCSS(true, $bXhtmlStyle);
    		$this->ShowHeadStrings();
    		$this->ShowHeadScripts();
    	}


    P.S. Худо-бедно путешествовать по ядру битрикса можно и через онлайн-документацию по ссылке: bxapi.ru/src/?id=166792
    Ответ написан
    6 комментариев
  • Как автоматизировать очистку кэша битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Увы, очищать папку через cron не лучшая идея. По факту Вы боретесь не с проблемой, а с симптомом.
    Почему разрастается папка кеша?
    1) У Вас очень большой и сложный сайт.
    Например при 10 тысячах товаров в одной категории, если Вы будете пытаться кешировать каждую страницу, то размер будет большой. Предположим на страницу с 10 товарами уходит 10КБ кеша (на самом деле, все зависит от верстки и может достигать и бОльшего размера), тогда общий кеш каталога будет 10КБ * 10 000 = ~100МБ (учетных, на самом деле около 90МБ).
    Теперь посчитаем, что может быть 2 вида отображения: списком или плиткой. Соответственно уже 180МБ. А если товаров не 10 тысяч, а 100 ? А если есть еще и фильтр и его результаты могут быть кешированы? И это мы посчитали только каталог и довольно малый размер кеша.

    Решение: подобрать время кеширования и увеличить дисковое пространство

    2) Неправильно определено время кеширования.
    Например: у Вас ttl кеша стоит 3 месяца. И даже если за 3 месяца на него никто не зашел, он все-равно хранится. Например у Вас очень объемный кеш (что очень плохо), который занимае 500КБ (а иной раз и 1 МБ), получается что этот 1МБ будет хранится на протяжении длительного времени, даже если к нему нет обращения.

    Решение: подобрать время кеширования (возможно где-то стоит уменьшить) и параметры компонентов (возможно что-то не стоит кешировать)

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

    Решение: нужно проверить параметры кеширования в компонентах. Возможно в своих компонентах переписать или посмотреть на основании чего он формируется

    4) Ошибка с механизмом очищения кеша.
    Например, когда кеш не успевает удаляться, и накапливается. Таким образом происходит дублирование одного и того же кеша в разных компонентах.
    Ответ написан
    Комментировать
  • Какой компонент Битрикс подойдет для отправки заявки в личном кабинете?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Здесь дело не в компоненте, а в способе реализации, которая в свою очередь зависит от редакции.
    Например для Битрикс24 их много. Навскидку варианты следующие:
    1) Универсальный список с бизнес-процессом на нем
    2) Элемент инфоблока с бизнес-процессом на нем (есть и в БУС)
    3) Веб-формы и этапы прохождения (есть и в БУС)
    4) Собственная реализация на инфоблоках
    5) Релаизация на основе собственного кода

    Например если взять вариант 1, то там вообще делать ничего не нужно. Только права правильно настроить и бизнес-процесс описать.
    А вот, например в форме 4 - bitrix:iblock.element.add и собственный код согласования.
    Ответ написан
    Комментировать
  • Как сгруппировать элементы по разделам в Битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    А не пробовали воспользоваться штатной возможностью группировки: arGroupBy (3 параметр в getList, который у вас в значении false)

    Массив полей для группировки элемента. Если поля указаны, то выборка по ним группируется (при этом параметр arSelectFields будет проигнорирован), а в результат добавляется поле CNT - количество сгруппированных элементов. Если указать в качестве arGroupBy пустой массив, то метод вернет количество элементов CNT по фильтру. Группировать можно по полям элемента, а также по значениям его свойств. Для этого в качестве одного из полей группировки необходимо указать PROPERTY_, где PROPERTY_CODE - ID или символьный код свойства.
    Необязательное. По умолчанию false - записи не группируются.


    Группировать по ID секции.
    Ответ написан
    Комментировать
  • Как реализовать настраиваемые виджеты на сайте?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Навскидку, Вы упустили самый интересный вариант:Реализация на базе включаемых областей для страниц.
    Плюсы:
    + Реализация требований на основе стандартной функциональности продукта
    + Гибкие возможности по расширению (вы можете использовать любые компоненты на любых страницах с любыми параметрами)
    + Используете только необходимый минимум без прослоек в виде инфоблоков и бд
    + Простое и понятное управления для разработчика

    Минусы:
    - Без соответствующего интерфейса решение для простых контент редакторов превращается в АД. Если Вы будете сами это все поддерживать, то проблем не возникнет, а вот для других потребуется разработать интерфейс создания включаемой области.
    Ответ написан
    Комментировать
  • Не выполняются агенты на событиях в битрикс 1С?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Для начала:
    1) Выполнялись ли агенты на хитах или на кроне? Может быть кто-то начал перенос агентов на крон и не закончил перенос.
    2) Определены ли константы: BX_CRONTAB_SUPPORT и BX_CRONTAB ? Может быть агенты были на хитах и кто-то определил константы и не перенес на крон. Или наоборот определил константы, без параметров ниже.
    3) Какие значения заданы у agents_use_crontab и check_agents ?
    Ответ написан
    Комментировать
  • Как подключить глобальную переменную $DB в битрикс в отдельном файле?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Покажите код вашего файла.
    Возможно Вы не подключили prolog_before - служебную часть битрикса.
    Делается это следующим образом: в начале скрипта прописывается:
    require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php";
    Ответ написан
  • Как реализовать голосование за отдельный элемент с помощью инфоблоков в битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Штатный механизм голосования за элемент инфоблоков не подразумевают запись времени и ip, только факт голосования. Если Вы хотите делать сделать такое голосование, Вам нужно либо создавать опросы, либо использовать свою таблицу.

    Давайте разберемся с Вашей ситуацией:
    создала отдельный файл voting.php в шаблоне компонента

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

    <?
    require $_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_before.php";
    
    /**
     * Тут можете проверить, что все переменные пришли
     * Я для себя буду использовать переменные:
     * - ELEMENT_ID 
     * - USER_ID
     * 
     * Просто писать факт голосования.
     * В таблицу project_element_vote ( ID, ELEMENT_ID, USER_ID )
     */
    
    global $USER;
    
    /* @var object Объект приложения */
    $oApplication = \Bitrix\Main\Application::getInstance();
    
    /* @var object Объект соединения с БД */
    $oConnection = $oApplication->getConnection();
    
    /* @var object Хелпер для безопасной записи в БД*/
    $oHelper = $oConnection->getSqlHelper();
    
    /* @var object Объект для работы с входящими переменными */
    $oRequest = $oApplication->getContext()->getRequest();
    
    
    if ( $oRequest->isAjaxRequest() && !empty( $oRequest->get('ELEMENT_ID') ) )
    {
    	$iUser    = $USER->GetId();
    	$iElement = $oHelper->forSql( $oRequest->get('ELEMENT_ID') );
    
    	$sql = "INSERT INTO project_element_vote('ELEMENT_ID','USER_ID') VALUES ('{$iElement}','{$iUser}')";
    	$res = $oConnection->query($sql);
    
    	if ( $res )
    	{
    		echo 'ok';
    		die();
    	}
    }
    echo 'bad';
    Ответ написан
    Комментировать
  • Как в свойстве привязка к пользователю во всплывающем окне были пользователи из определенной группы,?

    gromdron
    @gromdron
    Работаю с Bitrix24
    1) Выносите /bitrix/admin/user_search.php (исходный код, а не ссылку), куда-нибудь в /local/tools/
    2) Делаете класс-наследник от CIBlockPropertyUserID ( /bitrix/modules/main/tools/prop_userid.php )
    3) Перекрываете методы GetUserTypeDescription и (GetPropertyFieldHtml или FindUserIDNew)
    4) Правите в новом файле из п.1 Вашу группу

    Это вариант fix.
    В идеале: в своем наследнике CIBlockPropertyUserID добавить параметром группу пользователей, все запросы дополняете этой группой, а в своем файле user_search.php делаете доп. проверку. Так получается уже отличное свойство.
    Ответ написан
    Комментировать