Ответы пользователя по тегу 1С-Битрикс
  • Где ошибка в выводе элементов каталога через catalog.section и catalog.element?

    gromdron
    @gromdron
    Работаю с Bitrix24
    bitrix:catalog.element - выводит карточку товара
    bitrix:catalog.section - содержимое раздела.

    Соответственно, у Вас должно быть два правила в urlrewrite.php
    // Для элемента
    array(
    	"CONDITION" => "#^/podobrat-dver/([a-z0-9\-]+)/([^/\?]*)(.*)$#",
    	"RULE" => "SECION_CODE=\$1&ELEMENT_CODE=\$2&$3",
    	"PATH" => "/podobrat-dver/detail.php",
    )
    // Для раздела
    array(
    	"CONDITION" => "#^/podobrat-dver/([a-z0-9\-]+)/(.*)$#",
    	"RULE" => "SECION_CODE=$1&$2",
    	"PATH" => "/podobrat-dver/section.php",
    )


    Соответственно на странице detail.php у вас должен быть вызов одного компонента:
    <?$APPLICATION->IncludeComponent(
      "bitrix:catalog.element", 
      "detail",
      array(
        .....
        "IBLOCK_ID" => "30",
        "ELEMENT_ID" => "",
        "ELEMENT_CODE" => $_REQUEST["ELEMENT_CODE"],
        "SECTION_ID" => "",
        "SECTION_CODE" => $_REQUEST["SECION_CODE"],
        "SECTION_URL" => "",
        "DETAIL_URL" => "/podobrat-dver/#ELEMENT_CODE#/",
        "SECTION_ID_VARIABLE" => "ELEMENT_CODE",
        "SECTION_CODE_PATH" => ""
                     .....
      ),
      false
    );?>


    А на странице section.php у вас должен быть вызов одного компонента:
    <?$APPLICATION->IncludeComponent(
      "bitrix:catalog.section", 
      "catalog_list", 
      array(
                     ....
        "DETAIL_URL" => "/podobrat-dver/#ELEMENT_CODE#/",
        "SECTION_CODE" => $_REQUEST["SECTION_CODE"],
        "SECTION_ID" => "",
        "SECTION_URL" => "",
        "SHOW_ALL_WO_SECTION" => "Y",
                     ....
      ),
      false
    );?>


    За регулярки не ручаюсь (писал навскидку, без тестирования)
    Ответ написан
    Комментировать
  • Как задать сортировку в catalog.section.list по id в прямом или обратном порядке?

    gromdron
    @gromdron
    Работаю с Bitrix24
    $arSort - это ассоциативный массив, для сортировки значения, в формате "Код поля" => "Порядок".
    Причем порядок может быть только ASC (по возрастанию) или DESC (по убыванию)
    В Вашем случае должно быть так:

    $arSort = array(
    	"LEFT_MARGIN" => "ASC",
    );
    Ответ написан
    Комментировать
  • Как получить количество элементов?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Во-первых, прекратите совокуплять мертвецов. Для каждой задачи есть отдельный инструмент, со строго определенными канонами. То что вы делаете в result_modifier.php делается через расширение меню и компонент bitrix:menu.sections.

    Во-вторых, количество активных элементов получается через доп. операции внутри итерирования. См. справочную литературу: coder-diary.ru/programming/bitrix-kolichestvo-akti...
    Ответ написан
  • Групповая смена ответственного из сделки в контакте и компании в CRM Битрикс, коробочная версия?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вы правильно нашли, за это отвечает компонент bitrix:crm.deal.list, который лежит в /bitrix/components/bitrix/crm.deal.list/component.php.
    Код несколько запутанный, но работает следующим образом:

    На ~614 сроке ( ~ 614 - 679 ) находится код, который парсит полученные данные и собирает их в массив $actionData
    //region Try to extract user action data
    // We have to extract them before call of CGridOptions::GetFilter() or the custom filter will be corrupted.
    $actionData = array(
    	'METHOD' => $_SERVER['REQUEST_METHOD'],
    	'ACTIVE' => false
    );
    
    if(check_bitrix_sessid())
    {
    	$postAction = 'action_button_'.$arResult['GRID_ID'];
    	$getAction = 'action_'.$arResult['GRID_ID'];
    	//We need to check grid 'controls'
    	$controls = isset($_POST['controls']) && is_array($_POST['controls']) ? $_POST['controls'] : array();
    	if ($actionData['METHOD'] == 'POST' && (isset($controls[$postAction]) || isset($_POST[$postAction])))
    	{
    		CUtil::JSPostUnescape();
    
    		$actionData['ACTIVE'] = true;
    
    		if(isset($controls[$postAction]))
    		{
    			$actionData['NAME'] = $controls[$postAction];
    		}
    		else
    		{
    			$actionData['NAME'] = $_POST[$postAction];
    			unset($_POST[$postAction], $_REQUEST[$postAction]);
    		}
    	...
    	...
    	...
    		$actionData['AJAX_CALL'] = $arResult['IS_AJAX_CALL'];
    	}
    }
    //endregion


    А с ~915 строки начинается непосредственная обработка ( ~915 - 1457):

    // POST & GET actions processing -->
    if($actionData['ACTIVE'])
    {
    	if ($actionData['METHOD'] == 'POST')
    	{
    		if($actionData['NAME'] == 'delete')
    		{
    		...
    		elseif($actionData['NAME'] == 'assign_to')
    		{
    			if(isset($actionData['ASSIGNED_BY_ID']))
    			{
    				$arIDs = array();
    				if ($actionData['ALL_ROWS'])
    				{
    					$arActionFilter = $arFilter;
    					$arActionFilter['CHECK_PERMISSIONS'] = 'N'; // Ignore 'WRITE' permission - we will check it before update.
    					$dbRes = CCrmDeal::GetListEx(array(), $arActionFilter, false, false, array('ID'));
    					while($arDeal = $dbRes->Fetch())
    					{
    						$arIDs[] = $arDeal['ID'];
    					}
    				}
    				elseif (isset($actionData['ID']) && is_array($actionData['ID']))
    				{
    					$arIDs = $actionData['ID'];
    				}
    
    				foreach($arIDs as $ID)
    				{
    					if (!CCrmDeal::CheckUpdatePermission($ID, $userPermissions))
    					{
    						continue;
    					}
    
    					$DB->StartTransaction();
    
    					$arUpdateData = array(
    						'ASSIGNED_BY_ID' => $actionData['ASSIGNED_BY_ID']
    					);
    
    					if($CCrmDeal->Update($ID, $arUpdateData, true, true, array('DISABLE_USER_FIELD_CHECK' => true)))
    					{
    						$DB->Commit();
    
    						$arErrors = array();
    						CCrmBizProcHelper::AutoStartWorkflows(
    							CCrmOwnerType::Deal,
    							$ID,
    							CCrmBizProcEventType::Edit,
    							$arErrors
    						);
    					}
    					else
    					{
    						$DB->Rollback();
    					}
    				}
    			}
    		}
    		...
    	}
    }
    // <-- POST & GET actions processing


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

    gromdron
    @gromdron
    Работаю с Bitrix24
    Так как JSON кодируется символами Юникода, то наилучшим вариантом является UTF-8 кодировка.
    Как практикующий разработчик на 1С-Битрикс строго рекомендую Вам переводить проекты на UTF-8.

    P.S. У вас неймпсейс
    use Bitrix\TestPartner\TestPartnerModule\TestPartnerModuleListTable;

    А должен быть:
    use TestPartner\TestPartnerModule\TestPartnerModuleListTable;

    Так как Вы не Bitrix и не нужно никого вводить в заблуждение :)
    Ответ написан
    Комментировать
  • Как вывести товары, если нет категорий?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Все круто, но куда он должен их вывести? У каталога есть иерархия Список разделов -> уточнение(*) -> Список элементов.
    Когда я последний раз с ним работал, он не умел выводить mixed content (когда и разделы и элементы выводились вместе).

    Но вы можете использовать не комплексный компонент, а отдельно catalog.section и выводить там
    Ответ написан
    Комментировать
  • Как массово загрузить и вставить на страницу много файлов?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Можно ли это сделать встроенными средствами битрикса?


    Относительно. Вы можете использовать инфоблок и news.list для вывода с доп. свойством, но это не будет лучшим решением.

    Может есть готовые дополнения?


    Это нишевая задача и вряд ли есть готовые решения.

    Что касается исходной задачи, то есть масса способов это сделать:
    1) Положить в папку и выводить простым скриптом (в лоб, но может быть долго и из админки не поправить)
    2) Загрузить из в битрикс и доставать через CFile - уже лучше, но если их много, может не выдержать сервер и браузер
    3) Разработать свое решение.
    Ответ написан
    Комментировать
  • Битрикс CRM Получить ID контакта?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Есть как минимум 2 варианта (без прямых запросов в базу) как это сделать:

    1) Высокоуровневый (работает всегда). Метод с поддержкой обратной совместимости: CCrmContact::GetList (bxapi.ru/src/?id=183244)

    Применение (за основу взял код описанный Артем):

    /* @var array Список контактов */
    $arContacts = array();
    
    if ( \Bitrix\Main\Loader::IncludeModule('crm') )
    {
    	/* @var array Сортировка полученного списка контактов */
    	$arOrder  = array('ID' => 'DESC');
    
    	/* @var array Условия получаемого списка контактов */
    	$arFilter = array(
    		"NAME"      => "Имя",
    		"LAST_NAME" => "Фамилия",
    		'CHECK_PERMISSIONS' => 'N' // Данный ключ необходим для того чтобы получить всех пользоватей,
    								   // иначе, будет найден только если ответственным за него является тот,
    								   // под кем запускается скрипт в битриксе
    	);
    
    	/* @var array Получаемые поля для списка контактов */
    	$arSelect = array(
    		'ID'
    	);
    
    	// NOTE: Запрашивайте только необходимые поля
    	$res = CCrmContact::GetList( $arOrder, $arFilter, $arSelect );
    
    	while( $arContact = $res->fetch() )
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    }
    
    // Тут в $arContacts либо пустой массив, либо массив с ID контактами, которые соответствуют условию поиска


    2) Низкоуровневый DataMapper (новый подход d7)

    use \Bitrix\Main\Loader;
    use \Bitrix\Crm;
    
    /* @var array Список контактов */
    $arContacts = array();
    
    if ( Loader::IncludeModule('crm') )
    {
    
    	$resContacts = Crm\ContactTable::getList(array(
    		'select' => array('ID'),
    		'filter' => array(
    			"NAME"      => "Имя",
    			"LAST_NAME" => "Фамилия",
    		),
    		'order' => array('ID' => 'DESC')
    	));
    
    	while( $arContact = $resContacts->fetch() )
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    
    	/*
    	Начиная с 17 версии (вроде бы), можно делать так:
    	foreach( $resContacts as $arContact)
    	{
    		$arContacts[ $arContact['ID'] ] = $arContact['ID'];
    	}
    	вместо while цикла
    	*/
    }


    Преимущество первого подхода:
    - Работает всегда, как для новых, так и для старых проектов
    - Можно использовать уровни доступа

    Преимущество нового подхода:
    - Технологически универсален за счет d7 (можно в runtime прибавлять связи, доставать связанные сущности и т.п.)
    - В DataMapper есть технология кеширования, т.е. можно закешировать результат просто добавив в массив getList еще один ключик
    - Субъективно код легче воспринимается
    Ответ написан
    3 комментария
  • Как при создании таблицы поставить полю значение null?

    gromdron
    @gromdron
    Работаю с Bitrix24
    За создание таблицы в MySQL отвечает метод MysqlCommonConnection::createTable(), где в не зависимости от ситуации включается - NOT NULL
    Ответ написан
    2 комментария
  • Как сделать так чтобы бала активная ссылка?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Я так понял, у вас есть какое-то меню, например:

    /top/index.php
    /root/index.php
    /test/index.php

    И в /root/ есть пункт меню (вложенного) меню, в котором есть ссылка на /catalog/index.php
    И вы хотите, чтобы при заходе на /catalog/index.php пункт меню /root/index.php выделялся??

    Если да, то в 3 параметр меню у /root/index.php укажите ссылку /catalog/index.php

    См. комментарий Пётр Невенчанный
    https://dev.1c-bitrix.ru/api_help/main/reference/c...
    Ответ написан
    Комментировать
  • Где битрикс хранит данные из корзины?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Содержимое корзины Битрикс записывает в базу данных, но напрямую доставать из нее не советую - лучше используйте API.

    Если интересует прямо таблица с товарами, то b_sale_basket и b_sale_basket_props. Они вяжутся в sale_user из таблицы b_sale_fuser
    Ответ написан
  • Как найти ошибку в битрикс?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Наилучшим решением служит обращение в техническую поддержку Битрикса, но только после того как перенесете/развернете сайт штатными средствами битрикса.
    Ответ написан
    1 комментарий
  • Каким способом изучать API Битрикса?

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

    Давайте начнем с того, что названия переменных значения не играют. Т.е. Вы можете поменять в коде местами $arSelect и $arFilter и результат от этого не изменится (если Вы все сделали правильно). Что касается их названий - они помогают лично Вам понять что в них находятся и работают по принципу венгерской нотации, с типами и camelCase. То есть в переменной $arFilter находится массив полей, по которому производится фильтрация, а в $arSelect - массив полей, который нужно получить.

    Что касается документации - вранье, она обширная и разжевана до мелочей. Если Вы хотите получить план по развитию, то:
    1) Пройдите всю цепочку битрикса от "Контент-менеджера" до "Администратора" (все 3) и поймите как это работает в админке
    2) Пройдите курс Bitrix Framework и поймите как с этим работать с точки зрения разработчика
    3) Активно читайте справочную литературу - https://dev.1c-bitrix.ru/api_help/ и https://dev.1c-bitrix.ru/api_d7/
    4) Смотрите на официальные курсы по битриксу https://academy.1c-bitrix.ru/training/course/
    5) Сдавайте официальные экзамены (там примеры заданий и четкие решения) https://academy.1c-bitrix.ru/certification/exams.php

    Я Вас уверяю, при сдаче и первого и второго экзамена, Вы уже будете понимать все что нужно для уровня Junior-Middle
    Ответ написан
    6 комментариев
  • Битрикс CRM Где находиться форма смена ответственного из сделки?

    gromdron
    @gromdron Куратор тега Битрикс24
    Работаю с Bitrix24
    Вам не нужно для этого изменять внешний вид сделки и crm.entity.quickpanelview Вам тоже трогать не нужно.

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

    P.S. Я как практикующий Битрикс24 разработчик, могу с уверенностью сказать, что из-за решения которое Вы хотели реализовать (через crm.entity.quickpanelview) битрикс и не любят. Т.е. кто-то кастомит компонент, а другим потом разбираться.
    Ответ написан
    2 комментария
  • Как сделать безопасный запрос к БД?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Смотря что именно Вы хотите сделать.
    Если Вас интересует как правильно это делать, то смотрите сообщение от Ильдар Гизетдинов, там подробно описано
    Если Вас интересует как исправить Ваш запрос, то перед вставкой значений в запрос, нужно использовать метод ForSql()
    Ответ написан
    Комментировать
  • Urlrewrite битрикс. Как написать правило исключающее из url символьный код элемента?

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

    Шаг 1.
    1) Создайте страницу /catalog/index.php, на этой странице выведите $_REQUEST
    2) Создайте правило (взял из примера выше, у пользователя Артём Лучников )

    array(
        "CONDITION" => "#^/([a-zA-Z0-9_-]*)/catalog/.*#",
        "RULE" => "city_code=\$1",
        "PATH" => "/catalog/index.php",
    )


    3) Проверьте, что при заходе, например на /moscow/catalog/, открывается страница и в выведенном массиве есть city_code=moscow

    Шаг 2.
    1) Скопируйте в свое пространство компонент catalog (комплексный) [например custom:catalog], вынесите его на страницу /catalog/index.php
    2) Добавьте в component.php еще одну разделяемую переменную в arComponentVariables - назовите ее, например CITY_CODE, напишите обработчики в тело комплексного компонента, которые будут "переваривать" введенный текст и будут перенаправлять на нужные страницы. В шаблоне sections.php сделайте вывод $_REQUEST
    3) Проверьте, что при заходе, например на /moscow/catalog/, открывается страница и в выведенном массиве есть city_code=moscow

    Шаг 3.
    1) В вынесенном компоненте (из примера выше это custom:catalog), сделайте обработчик указанной переменной city_code, которая и определяет, есть ли указанный город в инфоблоке
    2) Проверьте что все работает корректно

    Ну и вишенка на торте, что если бы вы сделали выбор инфоблока, откуда берутся города в переменные компонента.
    Ответ написан
    Комментировать
  • Как вывести цену товара?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Например, если вывод у Вас через CIblockElement::GetList происходит, а тип базовой цены имеет идентификатор 1, то можно в select параметр добавить: CATALOG_PRICE_1 - и он достанет цену.
    Вообще есть достаточно много материалов на эту тему. Если немного поискать, то сразу всплывает:
    https://dev.1c-bitrix.ru/support/forum/forum6/topi...
    Ответ написан
    Комментировать
  • Как настроить тип цен?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Компоненты новостей ( news* ) не выводят дополнительных параметров, особенно из других модулей. Для вывода цены, Вам следует обратиться к компонентам catalog* или eshop*
    Ответ написан
    Комментировать
  • Какие библиотеки или приемы можно использовать для выгрузки из csv файла больше 150000 товаров в ИМ на Bitrix чтобы не лег сайт за это время?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Вы в любом случае положите сайт, вопрос только на какое время.
    Можно положить его условно на 2 часа и загрузить все товары сразу, а можно положить его на 1-2 секунды каждые 5 минут, но тогда импорт будет пару дней.
    Ответ написан
    Комментировать