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

    gromdron
    @gromdron
    Bitrix developer
    У блоке "Дополнительные условия" в подмножестве "Пользователи" выбрать пункт "Группа".
    Переключить режим из "состоит в группе(ах)" в "не состоит в группе(ах)".
    В списке групп отметить все, кроме "Все пользователи (в том числе неавторизованные) [2]".
    Неавторизированный пользователь будет состоять только в этой группе.
    Ответ написан
  • Как настроить чпу в Битрикс когда большая вложенность разделов?

    gromdron
    @gromdron
    Bitrix developer
    Вообще как уже сказал VicTHOR можете использовать такой параметр как SECTION_CODE_PATH (подробнее о ЧПУ вы можете почитать в документации)

    Что касается вашей структуры:
    Раздел1/Раздел2/Раздел3/Элемент


    Я бы не рекомендовал вам использовать данную структуру, так как при включении товара в несколько разделов у вас будет полный бардак с canonical-ссылками и дублями в каталоге.

    Используйте макет для разделов:
    /catalog/#SECTION_CODE_PATH#/
    И для элементов:
    /product/#ELEMENT_CODE#/

    Это позволит вам включать один товар в несколько разделов, но при этом не будет проблем ни с ЧПУ ни с canonical ни с поиском.
    Ответ написан
  • Как создать поле файл у сущности?

    gromdron
    @gromdron
    Bitrix developer
    Другой способ есть и он довольно простой: вы пишете что сущность работает с свойствами и добавляете UF_* свойство типа файл (или файл на диске) и битрикс делает все за вас. Единственное есть несколько ограничений:

    - Поле называется с UF_ префиксом
    - Валидация согласно настройкам поля
    - Добавлять uf нужно отдельно
    Ответ написан
  • Как посмотреть письмо перед отправкой в Bitrix?

    gromdron
    @gromdron
    Bitrix developer
    boris tyrepharm, к сожалению вы не можете посмотреть "будущие" письма, так как такая генерация очень сложна.
    Но вы можете посмотреть существующее письмо в новом дизайне. К тому же - вы можете увидеть только как будет выглядеть ваше письмо, если его вывести в браузере, но это не одно и то же, как если оно пройдет через MTA и будет отображаться в Outlook/Thundebird/OWA и т.п.

    Например я хочу посмотреть как приблизительно(*) будет выглядеть сообщение с ID 336020 (в таблице b_event), после изменения дизайна в существующем шаблоне.
    use Bitrix\Main\Mail;
    
    /**
     * Get from b_event table
     * @var integer Existed event id
     */
    $displayedEventId = 336020;
    
    /**
     * List of site ids, for event theme generation
     * must be replaced by current site id in public
     * @var array
     */
    $arSites = [
    	's1'
    ];
    
    try
    {
    	/**
    	 * First, try to find event
    	 */
    	$arEvent = Mail\Internal\EventTable::getRow([
    		'filter' => [
    			'=ID' => $displayedEventId,
    		]
    	]);
    
    	if ( !$arEvent )
    	{
    		throw new \Exception('Event not found');
    	}
    
    	$arEvent['FIELDS'] = $arEvent['C_FIELDS'];
    
    	/**
    	 * Try to find all message templates for 
    	 * sites. In event handler we send for one letter
    	 * per site.
    	 */
    	$arEventMessageFilter = [
    		'=ACTIVE' => 'Y',
    		'=EVENT_NAME' => $arEvent["EVENT_NAME"],
    		'=EVENT_MESSAGE_SITE.SITE_ID' => $arSites,
    	];
    
    	$messageDb = Mail\Internal\EventMessageTable::getList([
    		'select' => ['ID'],
    		'filter' => $arEventMessageFilter,
    		'group' => ['ID']
    	]);
    
    	foreach ($messageDb as $arMessage)
    	{
    		$eventMessage = Mail\Internal\EventMessageTable::getRowById($arMessage['ID']);
    
    		$eventMessage['FILES'] = array();
    		$attachmentDb = Mail\Internal\EventMessageAttachmentTable::getList(array(
    			'select' => array('FILE_ID'),
    			'filter' => array('=EVENT_MESSAGE_ID' => $arMessage['ID']),
    		));
    		while($arAttachmentDb = $attachmentDb->fetch())
    		{
    			$eventMessage['FILE'][] = $arAttachmentDb['FILE_ID'];
    		}
    
    		$arFields = $arEvent['FIELDS'];
    
    		// get message object for send mail
    		$arMessageParams = array(
    			'EVENT' => $arEvent,
    			'FIELDS' => $arFields,
    			'MESSAGE' => $eventMessage,
    			'SITE' => $arSites,
    			'CHARSET' => $charset,
    		);
    		$message = Mail\EventMessageCompiler::createInstance($arMessageParams);
    		$message->compile();
    		echo $message->getMailBody();
    	}
    }
    catch( \Exception $e )
    {
    	var_dump($e);
    }
    Ответ написан
  • Как через getlist вывести множественное свойство привязка к другим элементам инфоблока?

    gromdron
    @gromdron
    Bitrix developer
    Такое поведение встречается когда вы используете Инфоблоки вверсии 1 (хранение свойств в общей таблице) и запрашиваете множественное свойство.
    Чтобы исключить этот момент, можно изменить механику работы (первести их на версию 2), т.е. изменить расположение свойств в отдельной таблице.

    Это конечно накладывает определенные ограничения, но зато в getList'ах пропадут дубли элементов.
    См. документацию: https://dev.1c-bitrix.ru/learning/course/?COURSE_I...
    Ответ написан
  • Почему обработчик события не вызывается?

    gromdron
    @gromdron
    Bitrix developer
    Во первых, такие методы стоит помечать как static, чтобы не вызывать ошибки самого php.
    Во вторых, есть описание событий - https://dev.1c-bitrix.ru/api_d7/bitrix/sale/events... в которых сказано что обработчик события принимает 3 параметра.
    Ответ написан
  • Почему не загружается тип инфоблока?

    gromdron
    @gromdron
    Bitrix developer
    Выдает белый экран.


    Смотреть лог ошибок (error-log) веб-сервера
    Смотреть лог ошибок php
    Ответ написан
  • Как решить ошибку загрузки картинки на Bitrix?

    gromdron
    @gromdron
    Bitrix developer
    Проверьте значение константы BX_TEMPORARY_FILES_DIRECTORY - там содержится пусть к временному каталогу для хранения файлов.
    Он должен существовать и к нему должен (его владелец bitrix, группа bitrix, права 0775).
    Ответ написан
  • Как в Битрикс через SQL запрос, нескольким товарам записать свойство?

    gromdron
    @gromdron
    Bitrix developer
    TLDR; Делайте в цикле по элементам изменение свойства.

    не должно быть сложно!


    Вообще-то образно говоря - никак.
    Можно написать конкретное решение под вашу структуру, но уместить это в запрос нет (минимум процедура).

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

    В случае хранение в отдельной таблице алгоритм почти такой же, за исключением того что искать нужно не значение свойства, а запись элемента в таблице при учете что это не множественные свойства.
    Ответ написан
  • Можно ли работать с Bitrix CMS имея опыт работы только с другими фреймворками (Yii2, Lumen...)?

    gromdron
    @gromdron
    Bitrix developer
    Добрый день.

    С вашего позволения, начну по порядку отвечать на ваши вопросы
    Интересуют отличия CMS Bitrix и работы с ним, от работы с фреймворками

    Кардинальные различия.
    Начиная с архитектурного подхода (роутинг смешанный, основан на физических файлах + urlrewrite) и заканчивая парадигмой системы (она нацелена на конечного пользователя, а не на разработчика).

    Есть желание доработать сайт на Битрикс CMS, но никогда раньше с ним не работал.

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

    Отличия в плане архитектуры приложения, ограничений лицензии (он же платный), документации по API для плагинов с понятными примерами...

    Да платная, но 30 дней (а по факту ~45 дней), полностью для тебя все фишки продукта.
    Документация по большей части есть, но как только начинаешь копать глубже, то сразу она исчезает.
    Плагины сторонних разработчиков часто недокументированы и внятных примеров нет.
    По битриксу нормально описаны только инфоблоки и интернет-магазин, но не все аспекты.

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

    Да есть, но из-за наплыва пользователей он понижает скорость работы продукта.
    Лучше не использовать или использовать, но свой.

    Нужно ли получать жёлтый листок от 1C для работы с их CMS как фрилансер, или это только в 1C: Предприятие?

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

    gromdron
    @gromdron
    Bitrix developer
    Давайте разберем чуть подробнее ваш фрагмент кода и представим гипотетическую ситуацию: у вас на сайте создана 1 отгрузка, а после обмена из вашей системы прилетает 2 новые отгрузки, вместо 1 существовавшей.

    Начнем с того что в:
    // создаём отгрузки
    $shipmentCollection = $orderBx->getShipmentCollection();


    Вы получаете коллекцию отгрузок. Коллекция отгрузок представляет из себя набор, состоящий из системной отгрузки + созданных системой или пользователем.
    При обработке существующего заказа с одной отгрузкой вам вернется коллекция (объект) с содержимым в 2 отгрузки: системная + ваша.

    Далее, вы производите итерацию по пришедшим отгрузкам
    foreach (importJson['Shipments'] as $importOrderShipment)

    Т.е. получается вам пришло 2 отгрузки и соответственно вы 2 раза зайдете в ваш цикл.

    Фрагмент:
    $shipment = $shipmentCollection->createItem();
    Создаст еще одну отгрузку. Иными словами после выполнения фрагмента в коллекции отгрузок у вас будет уже 4 отгрузки: системная, исходная (которая была на сайте), а так же две новых отгрузки, которые вы создали при итерировании по импортируемым отгрузкам.

    В данном случае у вас есть несколько вариантов развития событий:
    1) Вы можете очищать коллекцию отгрузок и создавать новые. Событий на изменение заказа у вас будет большое количество, но тем не менее это даст вам больше прозрачности в вашем процессе (не говоря уже о простоте реализации).

    2) Добавить маркер и по нему обновлять существующие отгрузки - менять стоимость тип и т.п.
    Это будет сложнее, но при этом чище с точки зрения событий в системе.

    P.S. И насколько я помню, цена доставки PRICE_DELIVERY из order это вроде как сумма PRICE_DELIVERY (?CUSTOM_PRICE_DELIVERY) из всех не системных отгрузок, так что задавать его бесполезно.
    Ответ написан
  • Как избежать неправильной типизации данных при работе с ORM?

    gromdron
    @gromdron
    Bitrix developer
    Если сделать dump basketItem, то все поля будут типа string


    Правильно. Это ограничение вызванное не bitrix framework, а драйвером для работы с СУБД. В базе храняться реальные значения, а вот mysqli возвращает string-результаты.
    Т.е. в битрикс они такими уже приходят из СУБД.

    Объекты эту проблему решают приводя результаты к нужным типами, а raw-значения так и остаются string'ами.

    Если хотите, то можете в $rsBasketItems->fetch() передать класс-наследника \Bitrix\Main\Text\Converter и его может encode будет применен к каждому значению и вы получите сразу нужные вам поля, но если сделать это нужно в одном месте, то проще будет конечно же в цикле пробежаться и привести самостоятельно.
    Ответ написан
  • Как использовать D7 для работы с местоположениями?

    gromdron
    @gromdron
    Bitrix developer
    Как-то можно используя возможности D7 извлечь допданные сразу, в том же запросе, где извлекаются данные по локациям?


    Используя runtime-секцию, ты можешь обьявить вычисляемое поле типа reference и вытаскивать данные, но неизвестно как себя поведет при этом запрос (могут появиться дубли).

    Будет нечто выглядящее так:

    $res = \Bitrix\Sale\Location\LocationTable::getList([
    	'filter' => [
    		'=ID' => intval($id),
    		'=CHILDREN.NAME.LANGUAGE_ID' => 'ru',
    	],
    	'select' => [
    		'_ID' => 'CHILDREN.ID',
    		'CODE' => 'CHILDREN.CODE',
    		'DEPTH_LEVEL' => 'CHILDREN.DEPTH_LEVEL',
    		'LATITUDE' => 'CHILDREN.LATITUDE',
    		'LONGITUDE' => 'CHILDREN.LONGITUDE',
    		'NAME_RU' => 'CHILDREN.NAME.NAME',
    		'TYPE_CODE' => 'CHILDREN.TYPE.CODE',
    
    		'UF_XML_ID' => 'LOCODES.UF_XML_ID',
    		'UF_LOCATION_ID' => 'LOCODES.UF_LOCATION_ID',
    	],
    	'runtime' => [
    		new \Bitrix\Main\Entity\ReferenceField(
    			'LOCODES',
    			$this->locodes_data_class,
    			['=this.ID' => 'ref.UF_LOCATION_ID'],
    			['join_type' => 'LEFT']
    		)
    	],
    	'order' => [
    		'CHILDREN.NAME.NAME' => 'ASC'
    	]
    ]);
    Ответ написан
  • Меняется путь к изображению?

    gromdron
    @gromdron
    Bitrix developer
    Но спустя какое-то время (через пару часов/дней), все картинки 404, и в файлах их нет, пути меняются.


    Когда вы загружаете избражение, определяется его путь, каждый раз когда вы обновляете изображение, то его путь меняется.
    Например: выгружаете каталог из 1С со всей номенклатурой каждые 2 часа, значит каждые 2 часа путь к изображению будет меняться
    Ответ написан
  • Bitrix ORM: Как реализовать импорт в инфоблок нескольких тысяч элементов?

    gromdron
    @gromdron
    Bitrix developer
    Но ведь почему-то разработчики Битрикса решили от него отказаться?


    Они не "решили отказаться", они его архитектурно еще не сделали. Элементы инфоблоков это не только запись в таблице это еще и свойства, которые могут хранится в двух вариантах, так что это вовсе не так просто.

    Выходит нужно использовать старый CIBlockElement::Add() без вариантов?

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

    Есть какой-то аналог Batch Processing от Doctrine?

    Аналогов нет, но и операция не такая уж частая. Есть потребность в таких объемах - обычно либо это сторонние каталоги (цены, наличие, свойства и т.п.) и тут без CIblockElement::add не обойтись, либо своя таблица (а там уже что хочешь, хоть sql)
    Ответ написан
  • Правильно ли я пониманию, что архитектура "битрикс управление сайтом" несколько кривая?

    gromdron
    @gromdron
    Bitrix developer
    Если смотреть на вещи реальнее скорее это ошибка в документации. По сути архитектура битрикса это не MVC, это некий набор из конкретных архитектур и стоит рассматривать их независимо. Если говорить о Компонентах, Моделях и Шаблонах, то битрикс скорее это MVVM модель, где компонент - ViewModel, шаблон это View, а Model это фундаментальная часть данных без бизнес-логики.

    Означает ли это что данная архитектура кривая? Нет, вовсе не означает. Просто она реализует совершенно иной подход, который чужд многим разработчикам из мира фреймворков и моно-проекта.
    Ответ написан
  • Как сохранить картинку через CCrmDeal->update?

    gromdron
    @gromdron
    Bitrix developer
    ередаю id картинки, полученной через CFile->SaveFile

    Вам нужно передавать туда не id, а массив полученный через CFile::MakeFileArray, т.к. все методы работают именно с этим массивом.
    Ответ написан
  • Где лежат PDF-файлы формируемые стандартным генератором документов Битрикс?

    gromdron
    @gromdron
    Bitrix developer
    Можно ли дать доступ к папке с этими файлами, как к Сетевому диску и настроить права, чтоб скачивать и закачивать файлы обратно в Битрикс?


    Нет, так как можно подключить только логические диски пользователей и/или других сущностей.
    Физические пути вы никогда не получите.
    Ответ написан
  • Установка онлайн чата на cms 1c-Bitrix?

    gromdron
    @gromdron
    Bitrix developer
    Чат необходимо сделать как на платформе Twitch или Youtube

    Уверены что речь идет именно о чате, а не о системе комментариев? Потому как это две разные подсистемы.

    В купленном пакете Битрикс нет модуля чата, программисты советуют докупить (оно и понятно, им так проще)

    Вы конечно можете написать свой. Все зависит от квалификации программистов и от прямоты их рук.
    Есть на этот счет два аргумента:
    - Если задача уже решена в системе, то зачем изобретать велосипед? Уже за вас люди подумали и реализовали множество вещей, начиная от socket/long polling и заканчивая обменом сообщений между пользователями
    - С другой стороны это не заточено под ваши нужды, так что все равно придется дорабатывать и если не знаешь что и как, то это обернется в кошмар и проще написать свой.

    но денег нет

    А платить все равно придется: либо за редакцию, либо за труд разработчиков, либо за сторонний сервис.
    Бесплатно только сыр в мышеловке.

    Как вариант можно ли установить AJAX Chat в код сайта на 1С-битрикс?

    Да, это возможно.
    Ответ написан
  • Как исправить проблему с отключением стилей шаблона компонента?

    gromdron
    @gromdron
    Bitrix developer
    Проблему в целом можно решить перенеся CSS в основной файл, но не хотелось бы в лишний раз нагружать основной CSS. Есть какие-то способы как это можно исправить?


    Конечно есть!
    Вы можете создать свой css файл для нишевого отображения и в result_modifier.php подключать его к стилям страницы через тот же addCss.
    Получается что вы в одном месте его правите, а во всех остальных он меняется автоматически.

    Что касается:
    Собственно именно этот CSS и отваливается.

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