• Слетает контент при восстановлении битрикса?

    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".
    Ответ написан
  • На чем делать простую CRM?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Прежде всего стоит задать вопрос: насколько это актуально для 2х человек? Насколько именно все это им нужно.

    Возможно, именно для Вас подошел бы Битрикс24.

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

    2) Есть мобильное приложение и для iOS и для Android, причем к ним можно на javascript разрабатывать приложения. Получается что Вы можете открыть приложение в приложении и уже оно найдет Ваши координаты и может сопоставить их с хранимыми. Без разработки приложения увы не обойтись.

    По-поводу стека технологий для Битрикс24: html, css, javascript (все остальное сделает сам б24).
    При этом можно пользоваться облачной версией (и хз насчет прайста, возможно даже бесплатный вариант может подойти)
    Ответ написан
  • Почему не снимается галочка активности для второго сайта на Битрикс?

    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 Куратор тега Битрикс24
    Работаю с Bitrix24
    Алгоритм простой:

    1) Создаем бизнес-процесс на лиде который запускается при создании
    2) Ставим условие на источник
    3) Изменяем поля документов через соответствующее действие

    У Битрикса есть целый курс по работе с БП. А так же вебинары. Все это в помощь
    Ответ написан
  • Какой способ получения IP лучше?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Ну хз, на мой взгляд это не равноценные примеры: субьективно читать первый не проще, я бы отдал предпочтение функции get_ip(), с другой стороны второй пример не делает того же, что делает первый (например валидацию не проводит).

    /**
     * Return client ip if find, or null
     * @return string|null
     */
    function getUserIp()
    {
        static $ip;
    
        if ( !is_null($ip) )
        {
            return $ip;
        }
    
        $candidates = [
            @$_SERVER['HTTP_CLIENT_IP'],
            @$_SERVER['HTTP_X_FORWARDED_FOR'],
            @$_SERVER['REMOTE_ADDR']
        ];
    
        foreach ($candidates as $candidate)
        {
            if ( \filter_var($candidate, \FILTER_VALIDATE_IP) )
            {
                $ip = $candidate;
                break;
            }
        }
    
        return $ip;
    }
    
    var_dump(getUserIp());
    Ответ написан
    Комментировать
  • Почему детальная страница периодически ломается?

    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 в админке отчеты. Если очень уж принципиально хранить у себя, то можно раз в сутки забирать информацию.
    Ответ написан
    Комментировать
  • Как интегрировать в Битрикс 24 Открытые линии сторонний месенджер?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    1) Придумываем коннектору уникальный slug
    2) На примере imconnector.baseconnector разарбатываем собственный компонент коннектора
    3) В \Bitrix\ImConnector\CustomConnectors смотри события на вызовы кастомного коннектора и что именно они должны вернуть

    Документации по этому счастью особо нет (пока, но не известно будет ли), поэтому ковыряние :(
    Ответ написан
    Комментировать
  • Как получить все разделы инфоблока, с подразделами всех уровней вложенности?

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

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

    gromdron
    @gromdron
    Работаю с Bitrix24
    В редакция Эксперт, Малый Бизнес и Бизнес есть модуль Push'n'pull

    Модуль Push and Pull позволяет организовать транспорт для отправки мгновенных команд. Реализация данного функционала в виде отдельного модуля позволяет любому другому модулю (в том числе и модулям сторонних разработчиков) используя API отправлять мгновенные нотификации и сообщения клиентам.
    Ответ написан
    Комментировать
  • Как правильно сделать фильтр со сложной логикой?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Скорее всего такую логику Битрикс уже не осилит и Вам нужно обращаться в SQL и формировать уже прямой запрос в БД. Либо, можно сделать промежуточную таблицу/инфоблок/хайлоадблок и уже искать там.
    Ответ написан
    Комментировать
  • Как генерировать orders.xml в битриксе?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Я выяснил, что файл orders.xml генерируется только при запросе со стороны 1С.

    Файл не генерируется при запросе, он формируется в 1С и отправляется в Битрикс.
    Алгоритм выгрузки данных на сайт указан в документации.
    Дополнительно можно почитать, например и у Дениса
    Можно ли самостоятельно создавать этот файл в какой-либо директории сайта?

    Самостоятельно создать можно, но для загрузки необходимо вручную пройти по шагам импорта.
    По крайней мере первые 3 шага пройти придется, а дальше вручную можно положить файл в /upload/1c_exchange/ (ну или в зависимости от того что загружаете)
    Ответ написан
    7 комментариев