Ответы пользователя по тегу 1С-Битрикс
  • Как изменить значение Активность с помощью API?

    Тут всего два варианта:
    1 Неверное условие и $enum_fields['XML_ID'] никогда не равно 'true' (было бы странно если бы было равно).
    2 Условие верное и товар с XML_ID== 'true' есть, но на событии АфтеАпдейт, стоит обработчик который меняет значение на N, деактивируя товар.
    Ответ написан
    Комментировать
  • Как писать api на битриксе для работы с node.js фронтендом\мобильным api?

    Ну наверное можно предложить 2 подхода:

    1 Юзать новый ajax компонентов, т.е. писать свои компоненты, в которых реализовывать бизнес-логику и использовать встроенный механизм для обращения к ним с фронта. Вот статья кратенькая: https://verstaem.com/ajax/new-bitrix-ajax/

    2 Тупо, в лоб писать скрипты api. Просто скрипты которые просто используют внутренний API проекта, а уже всю логику реализовывать в этом внутреннем API.
    Сами скрипты получаются примерно такие, какие-то:
    <?
    require('.prolog.php');
    // добавляем в избранное
    	$favorites = \Model\Favorites::getInstance();
    if ($_REQUEST['add']) {
    	
    	$favorites->add2Fav(intval($_REQUEST['add']));
    } elseif ($_REQUEST['remove']) {
    	$favorites->remove2Fav(intval($_REQUEST['remove']));
    } elseif (strlen(trim($_REQUEST['note'])) && $_REQUEST['fav']) {
    	$favorites->note2Fav(intval($_REQUEST['fav']),trim($_REQUEST['note']));
    }
    
    $arResult['appdata']['user'] = \Model\User::getInstance()->getData();
    
    require('.epilog.php');


    Первый подход стильный, модный, молодежный, но и во втором нет ничего криминального, как мне кажется.

    В конце концов хочу получить 2 репы, которые ничего друг о друге не знают и общаются через api, сгенерированное тем же Swagger

    Классно когда на такие штуки есть бюджет.
    Ответ написан
    Комментировать
  • Присвоить div'у класс если открыта главная страница Bitrix?

    Ужасный способ - никогда так не делайте.
    Таким подходом вы превращаете систему управления контентом в систему управления страницами.

    Какая разница по какому URL открыта ваша страница? Страница должна открываться корректно в независимости от url.

    Если ваши div внутри этой страницы - просто пропишите им классы.

    Если ваши div внутри какого-то компонента который вызывается из скрипта страницы и из других мест - просто добавьте в компонента параметр в котором передавайте дополнительный класс.

    Если ваши div лежат за пределами скрипта страницы (я так подозреваю что это скорее всего ваш случай) используйте отложенные функции:

    <div id="one" class="someClass <?=$APPLICATION->ShowProperty('color_class')?>">


    И в странице:
    <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/header.php");
    $APPLICATION->SetPageProperty('color_class', 'green');
    ?>
    Ответ написан
    Комментировать
  • Композитный сайт и $frame->beginStub()?

    Вангую что проблема вовсе не в композите, а в js слушателях которые традиционно навешиваются по событию готовности страницы.
    В итоге у вас сначала грузится статическая часть кэшированная композитом, потом срабатывают скрипты. Потом подргужается блок с кнопкой. Но так как скрипты уже отработали когда кнопки не было, то и никакой слушатель за нее не зацепился. А когда кнопка появилась в странице, поезд со слушателями уже давно ушел.

    js не должен полагаться на готовность DOM который не создается им самим, как за многие годы многих приучил делать jQuery.
    Если события назначаются элементам DOM это должен делать тот кто создают html. Если, в данном случае, html создается на сервере с помощью PHP, то и события пусть назначаются на сервере прямо в этом html.
    Ответ написан
    2 комментария
  • Как переместить значения из result modifier?

    Список новостей разместил в result modifier

    Так делать нельзя - в result modifier не должно быть никакого вывода, так как в случае отображения из кэша он не выполняется.

    подскажите как мне вывести массив новостей со свойствами в разметку компонента Элементы раздела?

    Переместить список новостей в template.php, в нужное место в разметке.
    Ответ написан
    Комментировать
  • Как связать приложение в битрикс через push and pull?

    Вот как у меня:

    Пользователь подписыается на события связанные с объектом $dctList['UUID']:
    \CPullWatch::Add($UserID, $dctList['UUID']);

    Отправляем уведомление всем пользователям при событии связанным с объектом с индентификатором $list_uuid
    \CPullWatch::AddToStack($list_uuid,
    				Array(
    					'module_id' => 'list',
    					'command' => 'exchange',
    					'params' => [
    							'provocative' => $dctData['head']['UID'],
    							'list_uuid'=> $list_uuid
    						]
    				)
    			);


    загрузка модуля:
    BX.loadScript('/bitrix/js/pull/protobuf/protobuf.js', ()=>{
    					BX.loadScript('/bitrix/js/pull/protobuf/model.js', ()=>{
    							BX.loadScript('/bitrix/js/rest/client/rest.client.js', ()=>{
    									BX.loadScript('/bitrix/js/pull/client/pull.client.js',()=>{APP.bitrixreinit._pullinit()});
    								});
    						});
    				});


    Подписка на события в методе _pullinit:
    // подписываемся на события P&P
    		BX.addCustomEvent("onPullEvent", function(module_id,command,params) {
    			
    			if (APP.getConfigParam('uid') == params.provocative) {
    				//if ('production' != APP.getConfigParam('mode')) console.log('собственное событие пропущено');
    				return;
    			}
    			if ('exchange' == command) {
    				APP.exchange({basis: 'pull', context: params});
    			}
    		});
    
    		BX.addCustomEvent("onPullStatus", function(status) {
    			if ('online' != APP.$store.state.status.push_and_pull
    					&& 'online' == status) {
    				// не онлайн сменился на онлайн
    				//let last_sync_time = APP.$store.state.db.sync.last.time.client || 0
    				//let now_time = Date.now()/1000
    				//if (now_time - last_sync_time < 30) {
    				//	
    				//} else {
    				//	
    				//}
    				APP.exchange({basis: 'reconnect'});
    			}
    			APP.$store.commit("updateStatus",{key:'push_and_pull',data:status})
    		});
    		
    		BX.PULL.start();
    Ответ написан
    Комментировать
  • Как создать дополнительную страницу для товара?

    В urlrewrite добавляете правило:
    array (
        'CONDITION' => '#^/catalog/([0-9a-zA-Z_-]+)/question([\\?\\#].*)?$#',
        'RULE' => 'ELEMENT_CODE=$1',
        'ID' => '',
        'PATH' => '/faq/detail.php',
        'SORT' => 100,
      ),

    В файле /faq/detail.php размещаете (в зависимости от того как храните вопросы):
    1 компонент bitrix:news.detail который по коду элемента каталога показывается вопросы сохраненные в этом элементе.
    2 компонент bitrix:news.list который по фильтру отбирает вопросы из инфоблока вопросов, привязанные к элементу каталога с этим кодом.
    Ответ написан
    Комментировать
  • Как использовать vue.js в битрикс?

    Битрикс это фреймворк и CMS - короче бэкенд. Какое отношение он вообще имеет к фронту? Делайте его на Vue, на React, на чем хотите и используйте как хотите.

    То что битрикс поддерживает Vue означает лишь то, что в набор библиотек js для битрикс добавлена Vue и теперь подключить ее к странице можно через API.
    Кроме того встроенная библа помещена в объект BX и обращаться вы к ней должны так - BX.Vue + к ней добавлено несколько плюшек.

    Но насколько я знаю в штатных шаблонах она нигде не используется и ее там никак использовать нельзя, так как все они оперируют с DOM, т.е. по сути несовместимы с реактивными библиотеками.

    Полная дока по использованию тут: https://dev.1c-bitrix.ru/learning/course/index.php...

    Но я бы не стал это использовать.

    Вообще говоря есть некоторый конфликт Битрикс и Vue - с одной стороны шаблоны современных компонентов битрикс полностью заточены по функционалу и идеологии под реактивный фреймворк, с другой стороны их совершенно невозможно на них переписать, так как для них необходим серверный рендеринг ( что по крайней мере пока никак на битрикс не прикрутить) иначе вы останетесь без индексации, а какой-нибудь пререндер 80% пользователей Битрикс не осилит.

    В итоге остается только мечтать о Vue в будущем, а пока в штатных компонентах рендерить на сервере HTML, а потом манипулировать DOM на клиенте, превращая в ад, кастомизацию штатных шаблонов.

    Одним словом хотите использовать Vue с Bitrix - используйте, но забудьте о штатных шаблонах вообще. Да и Vue используйте свой, а не встроенный.
    Ответ написан
    3 комментария
  • Как в битриксе вывести свойства инфоблока на страницу результатов поиска?

    Никак - стандартный компонент поиска выводит элементы поиска а не элементы инфоблока - не будет там никакого ['PROPERTIES']['NAME']['VALUE']

    Варианта два:
    1 получать id элементов инфоблока из элементов поиска и подавать их в виде фильтра на вход news.list им уже выводить элементы.
    2 в result_modifier.php шаблона компонента поиска, вынимать недостающие данные.

    Я бы выбрал второе.
    Ответ написан
    Комментировать
  • Как сделать в Битриксе выдачу результатов поиска на этой же странице, непосредственно под формой поиска?

    Вам вообще не нужен поиск. Делаете компонент вывода вашего документа.

    В компонент передаете фильтр по полю номера документа.

    Номер документа берете из GET запроса, если это поле пустое, то не выводите ничего. На странице размещаете форму с одним полем отправляющим GET на эту же страницу.

    Все.
    Спрашивайте какой шаг не понятен.
    Ответ написан
    4 комментария
  • Как в 1С-Битрикс сделать рандомную сортировку в каталоге?

    Делаем обычную сортировку по SORT, а дальше:

    1 в шаблоне выводим только элементы с сортировкой меньше 23, остальные вываливаем в виде данных и рендерим на на странице js'ом (тупой вариант: выводить в тег script с невыполняемым type, и оттуда добавлять js'ом в страницу), страницы по набору элементов будут одинаковые, но порядок каждый раз будет разным. Кэш работает.

    2 Добавляем 2-4 дополнительных свойства скажем SORT1, SORT2 и т.д. зафигачиваем эти свойства случайными числами и делаем вторую сортировку по одному из них. При этом выбираем по какому именно рандомно. Получаем 4 кэша с разными страницами по составу.

    3 Раз в сутки ночью, агентом переписываем эти допсвойства на другие случайные значения.

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

    UPD:
    Про решение с двумя компонентами - да просто во втором компоненте на первой странице скройте 22 элемента первые и все. Естественно страница должна быть больше 22 элементов.
    Возможно вы сразу возразите, что тогда посетитель в постраничной выборке не увидит эти 22 элемента, поэтому сразу отвечу - вас это вообще не должно волновать, так как у вас посетитель вообще не увидит почти половину каталога (так на вскидку 40-45%) при случайной выборке + пагинации. Вообще пагинация при настоящей случайной выборке полностью лишена смысла.
    Рабочее решение близкое к вашим требованиям я выше привел.
    Если хотите избавится в нем от того что часть элементов каталога будет невидна при пагинации - передавайте в свойствах пагинации еще и свойство сортировки случайно выставленное на первой стартовой странице.
    Ответ написан
    Комментировать
  • Битрикс страница 404?

    В сторону urlrewrite.
    Судя по тому что иногда 404 отрабатывает с ней самой все нормально.

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

    Какой код у этой белой страницы - 404, 200, 500?
    Ответ написан
  • Почему после переноса на VDS перестала работать выгрузка из 1с?

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

    Я делаю общий шаблон .default, а в остальных шаблонах в хедере:
    <?if(!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die();?>
    <?include(S_P_LAYOUT.'/header.php');?>
    <div class="page">
    	<!-- HEADER :: START-->
    	<header class="header">
    		<div class="container">
    			<div class="header__wrapper">
    				<a class="header__logo" href="#"><img src="<?=P_IMAGES?>/logotype.svg" alt=""></a>
    				
    				<?include(S_P_INCLUDES.'/menu-top.php');?>
    				
    				<div class="header__links">
    					<?include(S_P_INCLUDES.'/menu-links.php');?>
    				</div>
    				
    				<button class="hamburger hamburger--spin" type="button" js-hamburger><span class="hamburger-box"><span class="hamburger-inner"></span></span></button>
    			</div>
    		</div>
    	</header>
    	<!-- HEADER :: END-->
    	<div class="page__content">
    		<?$APPLICATION->ShowPanel()?>

    и аналогично в футере:
    какой-то отличающийся код
    <?include(S_P_LAYOUT.'/footer.php');?>

    Соотвественно S_P_LAYOUT - это константа с абсолютным путем к папке шаблона .default

    Это вариант номер один (и вобще говоря вы можете вложить так сколько угодно шаблонов).

    Второй вариант - использовать общие включаемые области во всех шаблонах.
    Ответ написан
    Комментировать
  • Как ускорить сайт на Битрикс для pagespeed?

    но эти стили и скрипты нужны для нормальной работы сайта, часть из них часть из них стили и скрипты шаблона сайта, другие это системные JS скрипты которые загружает сам Битрикс.

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

    В настройках для главного модуля указал, чтобы JS подключались в нижний части страницы но скорость только немного подросла

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

    Для ускорения загрузки страницы pagespeed предлагает использовать атрибут link rel=preload при подключении CSS.

    Вообще-то шрифтов.

    Пробовал следовать рекомендации pagespeed и подключать CSS стили такой конструкцией

    Вы не правильно распарсили рекомендацию.
    Если вы хотите добавить предзагрузку стилей вы должны добавить метатег прелойда:
    <link rel="preload" href="/local/templates/.default/css/style.min.css">

    А не заменить им загрузку стилей.

    Eliminate render-blocking resources - здесь сервис рекомендует убрать блокирующие рендеринг страницы ресурсы, в моем случае он почему то таким ресурсом результирующий CSS файл сайта, куда Битрикс объединил CSS файл стилей шаблона сайта, CSS файлы шаблонов компонентов и системные файлы

    Что значит "почему-то"? Потому что это блокирующий ресурс. Вынесете стили страницы и хедера в отдельный файл который вставляйте инлайном в html для пользователей заходящих на сайт впервые в head, и подключайте в конце страницы два файла css - этот (да стили будут дважды загружены) и общий.
    А для пользователей заходящих повторно, подключайте только файлы, но уже в начале страницы.

    Remove unused CSS - здесь сервис указывает системные CSS и стили шаблона сайта как неиспользуемые, почему так происходит, ведь эти файлы используются в проекте?

    Возможно что не используются на этой странице которую вы тестируете - тут уж надо выбирать - как вы хотите грузить проект - все стили целиком, или только нужные на текущей странице - что вам важнее и как пользователи перемещаются по вашему сайту.
    Ответ написан
    2 комментария
  • Где лежат настройки параметра компонента bitrix?

    Конечно.
    У вас даже в ошибке написано где: /index.php
    Зайдите в админку. Настройки, контент, структура сайта, файлы и папки.
    5fc9eb5395592370696887.png
    Откройте файл как PHP и исправьте код.

    И вообще менять параметры компонента лучше меняя код и желательно редактором.
    Ответ написан
  • Приемлемо ли использовать base64+mod_gzip для передачи и отображения картинок из 1С в Битрикс?

    1. Нет ли ошибки?)

    Ошибки в чем?

    2. Браузер не сможет кэшировать такие картинки?

    Дело не в том что не сможет - не будет, поскольку это бессмысленно.
    Представим что все эти картинки в dataurl браузер закэшировал... и что? Теперь они магическим образом исчезнут из страницы которую вы передаете браузеру? Нет. Сервер все так же встраивает их в страницу и браузер ее все так же скачивает целиком. А зачем он их тогда кэшировал?

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

    Преимущество dataurl - картинки отображаются гораздо раньше так как загружены вместе со страницей или стилями.
    Недостаток - они скачиваются всякий раз когда нужно загрузить страницу.

    Таким образом хорошо это или плохо зависит от сценария использования вашего сайта.
    Если клиент только один раз загрузит страницу с товарами, посмотрит на цены и в ужасе закроет вкладку, то потери и правда будут в районе нескольких процентов. Если несколько раз... ну давайте посчитаем.
    Пусть размер страницы 200Кб и на ней еще 2Мб изображений. Тогда в классической ситуации первая загрузка страницы будет ~2200Кб, а все последующие 200Кб. В вашем случае все загрузки будут по 2200Кб.

    Таким образом если клиент посещает страницу один раз - разницы нет. Если два - то доп расходы составят 83%, если 4 раза - 215% лишнего трафика сверху.

    Но все зависит от повторных просмотров и размеров ваших картинок и отношению этого размера к размеру страницы.
    Ответ написан
    Комментировать
  • Почему скидки присвоенные определенной группе пользователей не доступны пользователям которые в эту группу попали через API Bitrix?

    Если нажимаю на кнопку «Выйти», а потом обратно авторизовываюсь, скидки появляются.

    Это и есть ответ. Грубо говоря группы у пользователя всегда те, в которых он находился при входе (кстати так сделано почти везде где есть группы).
    В вашем случае проще всего после добавления перелогинить пользователя.
    Ответ написан
  • Как найти где переопределяется title?

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

    Нет, нельзя - только по предвычесленному свойству.
    Но лучше его обновлять не по крону, а по событию. Впрочем на крон можно поставить агент, который будет выполнять выборочную проверку консистетности, а в случае нарушения её, запускать полную провеку.
    Ответ написан