Ответы пользователя по тегу 1С-Битрикс
  • Как будет выглядеть функция на D7?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Немного официальной документации (беднее чем у mr.cappuccino, но зато в доке):
    Ответ написан
    Комментировать
  • Как сделать разные ядра битрикса на одном домене?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Нормально это не будет работать никак.

    Для того, чтобы это хоть как-то работало нужно соблюсти ряд условий и ограничений:
    1) Вы должны хорошо разбираться в nginx, чтобы развести root path в зависимости от адреса домена. Вы же не подумали, какая админка должна открываться по /bitrix/ ? Это уже не типовая конфигурация, которую Вам, к слову, еще и поддерживать.
    2) Вы забудете об авторизации, то есть пользователь одного сайта это не пользователь другого сайта и переходя между страницами Вы потеряете авторизацию, ровно как и часть действий будет недоступна (например с сайта 1 вы не сможете редактировать статью У если она не на сайте 1, а на сайте 2, соответственно сайт 1 не будет видеть статей сайта 2 и наоборот). То есть - вся динамическая информация (записи инфоблоков и т.п.) должна переносится сразу (а не по 1-2 элемента)
    3) Помимо этого еще и системные скрипты будут некорректно работать. Если на сайте нет авторизации, и только гости, то проблем вообще не будет, а если Вы таким образом захотите обновить интернет магазин, то займет это у Вас и времени и сил больше, чем написать с 0 новый и разработать скрипт миграции данных.

    ИМХО, Ваша затея имеет место быть но в оочень редком случае (меньше 0.01%), а неудобств и ограничений Вы получите существенно больше.
    Поверьте, я знаю о чем говорю - мы обслуживали 2 портала Битиркс24 (коробочная версия), на одном из которых Была 15 версия с CRM, а на другом 17 с остальной частью портала.
    Ответ написан
  • Bitrix своя цена для товара в корзине CUSTOM_PRICE?

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Подскажите как применить класс ко всем страницам раздела.


    1) А не открывали ли Вы страницы ранее? Т.е. не закешировались ли предыдущие страницы? Пробовали сбрасывать кеш?
    2) Как именно вы подключаете свой стиль? Через inline, подключением файла или как-то по другому?
    3) Вы применяете к однотипным страницам? Или к разным?
    Ответ написан
    Комментировать
  • Как найти дубликат скрипта в bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Собственно битрикс к этому вопросу имеет весьма посредственное отношение и вопрос тут гораздо глубже: как вообще находить дублирование информации на сайте.
    Почитайте про grep
    Ответ написан
  • Как создать ajax фильтр по свойствам инфоблока bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Буду признателен за помощь, ибо сам попаду в этот фильтр :))


    1) Читаем про Ajax в прицнипе. (На форуме есть отдельный топик про Bitrix и Ajax)
    2) Читаем в Битриксе по $APPLICATION->RestartBuffer() (тут на форуме небольшой топик)
    3) Читаем по FILTER_NAME у компонента bitrix:news.list
    4) Делаем скрипт, который проверяет на странице что запрос пришел из Ajax - при помощи RestartBuffer сбрасывает все что было до него, подключает компонент и убивает выполнение страницы.

    В целом и сопутствующие статьи могут помочь. Например тут написано про ajax подгрузку новостей (технология та же)
    Ответ написан
    1 комментарий
  • Возможно ли разделить информацию по филиалам в Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Есть несколько вариантов решения данной ситуации:

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

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

    3) Если планируется более глобальное разделение - т.е. у каких-то филиалов могут быть интернет-магазин, а других новости или блог, то следует создать отдельные файлы под филиалы. Но это уже больше к большим и крупным компаниям.
    Ответ написан
    Комментировать
  • Слетает контент при восстановлении битрикса?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Если у Вас Битрикс старше 16 версии:
    1) Проверьте новый сервер через bitrix_server_test.php
    2) Закройте публичную часть сайта
    3) Проверьте сайт на ошибки (проверка системы)
    4) Сделайте бекап проекта в в папку на сервере, а не в облако
    5) Скачайте бекап на локальный компьютер
    6) Загрузите архивы вместе с restore.php на новый сервер
    7) Восстановите сайт из загруженного архива

    Если младше 16 версии:
    1) Проверьте новый сервер через bitrix_server_test.php
    2) Закройте публичную часть сайта
    3) Вручную сделайте бекап файлов проекта (лучше всего походит tar)
    4) Вручную сделайте бекап базы данных
    5) Загрузите файлы и базу на новый сервер
    6) В /bitrix/.settings.php, /bitrix/.settings.extra.php и /bitrix/php_interface/dbconn.php поменяйте данные доступа
    7) На распакованном сайте в административном разделе правьте все отсылки к старому сайту

    В обоих случаях после восстановления очистить папки /bitrix/cache/, /bitrix/managed_cache/ и /bitrix/stack_cache/.
    Если каких либо папок нет, не переживать и продолжать дальше.
    Ответ написан
    Комментировать
  • Как вывести свойства товаров в корзине?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Это можно сделать при помощи API в result_modifer.php.
    Конкретных кусков кода не подскажу, тут сильно много вариантов есть.
    Ответ написан
    6 комментариев
  • Как снять ограничения на кол-во символов в Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Создайте свое собственное свойство, наследуя CIBlockPropertyHTML и переопределяя соответствующий метод. Альтернативных вариантов, чтобы и работало все и проблем не было, я не вижу.
    Ответ написан
    1 комментарий
  • Как сделать вывод связанных highload блоков?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Я Вам уже на форуме Битрикса отвечал, но попробую и тут дать ответ.

    Все дело в том, что Вы не понимаете как Битрикс это хранит и интерпретирует.
    По факту он не обрабатывает, а просто достает это из базы данных как есть.
    Можно достать связанные поля, но по правилам реляции ORM (а highloadblock это по факту ORM), при наличии Вашего кейса Вам вернется не 1 элемент с 3 вложенными структурами, а 3 элемента, каждый из которых будет содержать по 1 элементу.

    Логика повторяющая поведение "Инфоблоки 1.0".
    Ответ написан
  • Почему не снимается галочка активности для второго сайта на Битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Нужно проверять по очереди:
    - Кеширование
    - Обработчики события
    - Баги (на не обновленном сайте такое возможно или при установке бета-версий)

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Файлы сайтов лежат в директориях s1 и s2.
    При обращении к site.ru

    Это очень плохая многосайтовость - сделана криво.

    Нужно сделать как минимум так:
    /home/bitrix/www/.top.menu.php
    /home/bitrix/www/about/index.php
    /home/bitrix/www/s2/.top.menu.php
    /home/bitrix/www/s2/about/index.php

    И тогда первый сайт открывайте по site.ru (SITRE_DIR = /)
    А в old.site.ru сделайте SITE_DIR = /s2/

    Либо вообще по разным папкам разнесите:
    /home/bitrix/www/* - первый сайт
    /home/bitrix/ext_www/s2/* - второй сайт

    То что Вы сделали, может быть для dev'а подойдет, но никак не для production - вам сеошники палками в темную забьют
    Ответ написан
    Комментировать
  • Порядок подключения скриптов bitrix в админке?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Не завязывайтесь на глобальную область и порядок выполнения страницы.
    Вы пытаетесь сделать полносвязанные вещи: переменную и скрипт который с ней работает, при этом скрипт вынести в расширения.

    Если уж Вы хотите работать с расширением, то тогда используйте другую парадигму: в js-файле расширения храните классы, а на странице инициализируйте объекты с уже готовыми параметрами.

    Хотите узнать больше? Посмотрите компоненты sale.order.ajax или sale.basket.basket
    Ответ написан
    Комментировать
  • Почему детальная страница периодически ломается?

    gromdron
    @gromdron
    Работаю с Bitrix24
    При первом осмотре в глаза бросается система кеширования и плохо настроенная многосайтовость.

    На эталонной странице (где все норм. отображается) есть вызов к spead'у сайта error440.ru
    При этом если сравнить эталонную страницу и ту же страницу, но с непрогруженными данными получается что не грузится бОльшая часть контента контент. Я нашел расхождение в 40+ строчках.
    То есть один из компонентов (который собственно показывает карточку) не прогружается.
    Ответ написан
  • Как добавить в JOIN подзапрос?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Насколько мне известно, подобный запрос в 1 в битриксе не завернуть (минимум 2 независимых запроса).
    Дело в том, что Битрикс работает с entities, и у него нет queryBuilder'а, соответственно он может строить запросы только к известным сущностям.
    А далее начинается пляска, потому как часть запроса с IFNULL является ExpressionField, а join является ReferenceField и выражение expression нельзя применить для результата reference.

    У Вас будет ошибка:
    Expected ScalarField or ExpressionField in `*` build_from, but `Bitrix\Main\Entity\ReferenceField:*` was given. (0)
    Ответ написан
  • Как правильно собрать статистику кликов по ссылке?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Как по мне - так решение с +1 в элементе и ajax отправка не лучшая идея.
    Я бы подключил какую-нибудь Яндекс.Метрику, настроил цель на нажатие ссылки и получал бы через API в админке отчеты. Если очень уж принципиально хранить у себя, то можно раз в сутки забирать информацию.
    Ответ написан
    Комментировать
  • Как получить все разделы инфоблока, с подразделами всех уровней вложенности?

    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 комментарий
  • Как сделать добавление товаров в корзину только из одной родительской категории?

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

    Москва (id: 1)
    Приборы (id: 2)
    Инструменты (id: 5)
    Санкт-Петербург (id: 3)
    Инструменты (id: 4)

    Если товар принадлежит к категории 5, то он точно из Москвы и соответственно при добавлении товара из id:2 он должен добавиться.
    А если товар у тебя есть одновременно и там и там? Ну скажем, товар был добавлен и в id:4 и в id:5 - ситуация может быть и такой. В твоем коде, если товар так был занесен, то при добавлении родительский раздел может быть как СПБ, так и Москва, тогда в одном из городов твоя логика работать не будет, а это неправильно.

    Я тут набросал пару примеров и сделал пару допущений:
    1) Какой-то товар уже в корзине
    2) Ты уже знаешь ID города, товар из которого добавлен в корзину

    Весь код (без магии), отвечающий за проверку возможности добавлять товар:
    /**
     * @var integer Идентификатор товара из CITY_PRODUCTS_IBLOCK_ID, добавляемого в корзину
     */
    $iProductId = 650;
    
    /**
     * @var integer Идентификатор города, товар которого уже добавлен в корзину
     */
    $iCityId = 91;
    
    if ( canAddByCity($iProductId, $iCityId) )
    {
    	echo "Можно добавить";
    }
    else
    {
    	echo "Нельзя добавить";
    }


    Как видишь, в этом коде нет ничего интересного. Вся магия начинается в функции canAddByCity (да-да, написано не оптимально, нужно оптимизировать и т.п. и т.д. но для пояснения сойдет):

    /**
     * @var int Уровень вложенности, где находятся города (у меня 2)
     */
    define('CITY_DEPTH_LEVEL', 2);
    
    /**
     * @var integer Идентификатор инфоблока, где ищем товары
     */
    define('CITY_PRODUCTS_IBLOCK_ID', 5);
    
    /**
     * Возвращает true, если товар $product можно добавить в корзину
     * @param integer $product 
     * @param integer $city 
     * @return boolean
     */
    function canAddByCity( $product, $city = 0 )
    {
    	if ( empty($city) )
    	{
    		return true;
    	}
    
    	if ( !\Bitrix\Main\Loader::IncludeModule('iblock') )
    	{
    		return false;
    	}
    
    	/**
    	 * @var array Список категорий верхнего уровня для сравнения
    	 */
    	$arRootGroups = [];
    
    	/**
    	 * @var CDBResult
    	 * @see https://dev.1c-bitrix.ru/api_help/iblock/classes/ciblockelement/getelementgroups.php
    	 */
    	$resGroups = \CIBlockElement::GetElementGroups($product, true);
    
    	while( $arGroup = $resGroups->fetch() )
    	{
    		/**
    		 * А вдруг товар без категории и сразу добавлен в город
    		 * т.е. без привязки?
    		 */
    		if ( $arGroup['DEPTH_LEVEL'] == \CITY_DEPTH_LEVEL )
    		{
    			$arRootGroups[] = $arGroup['ID'];
    			continue;
    		}
    
    		/**
    		 * @todo Запросы в цикле это очень плохо. 
    		 * Лучше запомнить где-то разделы и лишние уровни и дополнительным
    		 * циклом пройтись после - запросов будет меньше и будет быстрее работать
    		 */
    		$iRootSectionId = getSectionIdByDepthLevel($arGroup['ID']);
    
    		if ( !empty($iRootSectionId) )
    		{
    			$arRootGroups[] = $iRootSectionId;
    			continue;
    		}
    	}
    
    	// Какие корневые группы имеет этот товар
    	// можно посмотреть через код
    	//var_dump($arRootGroups);
    
    	return in_array($city, $arRootGroups);
    
    }
    
    /**
     * Возвращает код родительского раздела $section из инфоблока $iblockId
     * на уровне CITY_DEPTH_LEVEL. В случае отсутствия возвращает 0
     * @param integer $section 
     * @param integer $iblockId 
     * @return integer
     */
    function getSectionIdByDepthLevel( $section, $iblockId = \CITY_PRODUCTS_IBLOCK_ID )
    {
    	$section = intval($section);
    
    	if ( empty($section) )
    	{
    		return 0;
    	}
    
    	if ( empty($iblockId) )
    	{
    		return 0;
    	}
    
    	if ( !\Bitrix\Main\Loader::IncludeModule('iblock') )
    	{
    		return 0;
    	}
    
    	$resChain = \CIBlockSection::GetNavChain($iblockId, $section, ['ID','DEPTH_LEVEL','IBLOCK_SECTION_ID']); 
    
    	while( $arSection = $resChain->fetch() )
    	{
    		if ( $arSection['DEPTH_LEVEL'] == \CITY_DEPTH_LEVEL)
    		{
    			return $arSection['ID'];
    		}
    	}
    
    	return 0;
    }
    Ответ написан
    Комментировать
  • Битрикс для организаций обязаловка?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Добрый день Станислав,

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

    Тут играет роль 2 фактора:

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

    2) А далее уже встает вопрос в маркетинге - битрикс очень хорошо распиарен и на нем сделано уж очень много сайтов, в том числе и для гос. учреждений.
    Вот посудите сами: Вы ген.директор МосГорЧтоТоТам и Вам нужен сайт. Какую компанию при прочих равных (для упрощения считаем так) вы выберете:
    - Богатырь, с портфолиом: МинЮст, МинСтрой, МинКомСвязь, МинСельХоз, ФАС, МинОбрНауки.
    - Иванушка, с портфолиом: Интернет-магазин Мёда, Личный сайт Пети Петина и т.п.

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