• Как исправить ошибку в Битрикс 1с Управление после обновления PHP?

    @anton99zel Куратор тега 1С-Битрикс
    29а класс средней школы №7
    php понизить до 7.3 или 7.1
    Или в третьей строки указанного файла замените break на return
    Ответ написан
    1 комментарий
  • Как задать фиксированное значение в своем алгоритме при синхронизации 1С:УТ и Битрикс через модуль обмена Битрикс?

    @brokendevice
    Добрый день. Тоже мучался с данным вопросом, но разобрался, вдруг кому поможет.

    Мне нужно было исходя из комментария к заказу заполнять реквизит Организация и некоторые другие параметры в документе "Заказ Клиента":
    НаименованиеОрг = [Документ].Комментарий;
    [Результат] = Справочники.Организации.НайтиПоНаименованию(НаименованиеОрг);

    *Это только пример.
    ** Нужно не забывать о том в каком порядке заполняются реквизиты документа, то есть в моём случае сначала заполнялся комментарий "Из документа XML", а уже потом заполнялась организация.

    На всякий случай оставлю здесь ещё пример работы с "основанием". Заполнение реквизита "Организация" в документе оплаты "Эквайринговая операция".
    ЗаказОснование = Документы.ЗаказКлиента.ПустаяСсылка();
    ЗаказОснование = ПолучитьОснование([ДокументXML], Тип("ДокументСсылка.ЗаказКлиента"));
    [Результат] = ЗаказОснование.Организация;
    Ответ написан
    Комментировать
  • Как посмотреть письмо перед отправкой в Bitrix?

    gromdron
    @gromdron
    Работаю с Bitrix24
    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);
    }
    Ответ написан
    Комментировать
  • Каким образом в Битриксе назначать стоимость доставок при синхронизации?

    gromdron
    @gromdron
    Работаю с Bitrix24
    Давайте разберем чуть подробнее ваш фрагмент кода и представим гипотетическую ситуацию: у вас на сайте создана 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) из всех не системных отгрузок, так что задавать его бесполезно.
    Ответ написан
    1 комментарий
  • Какой task manager вы используете?

    dixam
    @dixam
    virtual consultant
    Большинство этих сервисов перекрывает Notion.so
    Попробуйте.
    Ответ написан
    Комментировать
  • Как в Битриксе обновить свойства заказа и сменить тип плательщика?

    Попробуйте такое

    $eventManager = \Bitrix\Main\EventManager::getInstance();
    
    $eventManager->addEventHandler('sale', 'OnSaleOrderBeforeSaved', 'orderModify');
    
    function orderModify(Bitrix\Main\Event $event)
    {
        global $USER;
    
        /** @var \Bitrix\Sale\Order $order */
        $order = $event->getParameter('ENTITY');
    
        $personTypeId = 3;
    
        $profileId = CSaleOrderUserProps::DoSaveUserProfile($USER->GetID(), null, 'Профиль ' . random_int(0, 500), $personTypeId,
            // код свойства и его значение
            [
                20 => random_int(100, 900),
                21 => random_int(500, 599)
            ], $errors);
    
        // Получаем текущую коллекцию свойств заказа и удаляем все свойства
        /** @var \Bitrix\Sale\PropertyValueCollection $orderProperties */
        $orderProperties = $order->getPropertyCollection();
        /** @var \Bitrix\Sale\PropertyValue $orderProperty */
        foreach ($orderProperties as $orderProperty) {
            $orderProperty->delete();
        }
    
        // Меняем тип плательщика
        $order->setPersonTypeId($personTypeId);
    
        // Далее взято из \Bitrix\Sale\PropertyValueCollection::load()
        // Т.к. на объекте заказа уже была получена коллекция, то при вызове $order->getPropertyCollection(),
        // коллекция не будет заполнена свойствами под новый тип плательщика.
        // Поэтому нужно добавлять свойства вручную
    
        // Получаем список свойств нового плательщика
        $props = \Bitrix\Sale\PropertyValue::loadForOrder($order);
    
        // Добавляем свойства к коллекции
        /** @var \Bitrix\Sale\PropertyValue $prop */
        foreach ($props as $prop) {
            $prop->setCollection($orderProperties);
            $orderProperties->addItem($prop);
    
            // В своём коде напямую этого сделать не можем, т.к. метод и свойство имеют приватный доступ
            // Но можно сделать обходным путём
    //        $orderProperties->setAttributes($prop);
    //        $orderProperties->propertyGroupMap[$prop->getGroupId() > 0 && isset($groups[$personTypeId][$prop->getGroupId()]) ? $prop->getGroupId() : 0][] = $prop;
        }
    
        // Получаем значения профиля
        $profileProperties = \Bitrix\Sale\OrderUserProperties::getProfileValues($profileId);
    
        // Записываем к заказу
        $orderProperties->setValuesFromPost(array('PROPERTIES' => $profileProperties), array());
    }


    Обратите внимание, сохранять сущности самостоятельно не нужно, они сохранятся позже в методе save() заказа. Преждевременное сохранение может дать неожиданный результат.
    Ответ написан
    1 комментарий