Bitrix бланк заказа

На летней конференции bitrix day 2016 были представлены новые возможности кастомизации формы заказа в админке. эти изменения появились в версии

На летней конференции Bitrix Day 2016 были представлены новые возможности кастомизации формы заказа в админке. Эти изменения появились в версии 16.0.33 модуля sale.

Появилась возможность добавлять свои блоки и свои вкладки на форму заказа, а также добавлять свои параметры в жёлтую информационную панель сверху с помощью событий.

Добавление параметров в информационную панель

saleform-panel.png

Используем событие onSaleAdminOrderInfoBlockShow, в событии нам доступны ORDER — объект заказа и ORDER_BASKET — объект корзины. Обработчик должен вернуть объект EventResult с массивом нужных параметров. Доступны ключи: TITLE — название параметра, VALUE — значение и необязательный ID — ID элемента в информационной панели со значением нового параметра. VALUE выводится без экранирования, т.е. можно использовать HTML. Добавим местоположение пользователя, как на скриншоте выше:

$eventManager = BitrixMainEventManager::getInstance();
$eventManager->addEventHandler('sale', 'onSaleAdminOrderInfoBlockShow', 'onSaleAdminOrderInfoBlockShow');

function onSaleAdminOrderInfoBlockShow(BitrixMainEvent $event)
{
    $order = $event->getParameter("ORDER");
    //$basket = $event->getParameter("ORDER_BASKET");

    $propertyCollection = $order->getPropertyCollection();
    $location = BitrixSaleLocationAdminLocationHelper::getLocationStringByCode($propertyCollection->getDeliveryLocation()->getValue());

    return new BitrixMainEventResult(
        BitrixMainEventResult::SUCCESS,
        array(
            array(
                'TITLE' => 'Местоположение:',
                'VALUE' => $location,
                'ID' => 'location'
            ),
        )
    );
}

Добавление вкладок

Для добавления вкладок нужно создать класс и повесить метод класса на событие OnAdminSaleOrderXXXXXXX (событие модуля main!):

  • OnAdminSaleOrderCreate — для формы создания заказа
  • OnAdminSaleOrderEdit- для формы редактирования заказа
  • OnAdminSaleOrderView — для формы просмотра заказа.

Пока я не придумал реального способа применения этой возможности, выведем на новую вкладку формы просмотра заказа котика:

saleform-tab.png

$eventManager = BitrixMainEventManager::getInstance();
$eventManager->addEventHandler("main", "OnAdminSaleOrderView", array("MyAdminOrderFormTabs", "onInit"));

class MyAdminOrderFormTabs
{
    function onInit()
    {
        return array(
            "TABSET" => "MyTabs",
            "GetTabs" => array("MyAdminOrderFormTabs", "getTabs"),
            "ShowTab" => array("MyAdminOrderFormTabs", "showTabs"),
            "Action" => array("MyAdminOrderFormTabs", "onSave"),
            "Check" => array("MyAdminOrderFormTabs", "onBeforeSave"),
        );
    }

    /*
    Возвращает массив вкладок
    */
    function getTabs($args)
    {
        return array(
            array(
                "DIV" => "myTab1", 
                "TAB" => "Важная информация", 
                "TITLE" => "Все любят котят",
                "SORT" => 1
            )
        );
    }

    /*
    Выводит вкладку
    */
    function showTabs($tabName, $args, $varsFromForm)
    {
        if ($tabName == "myTab1") {
            echo "<img style='width: 100%' src='/upload/kotenok_mashet_lapkoj.jpg' />";
        }
    }

    /*
    Вызывается перед onSave
    Для формы просмотра бесполезно, написано для примера
    */
    function onBeforeSave($args)
    {
        return true;
    }

    /*
    Вызывается после onBeforeSave при отправке формы
    Для формы просмотра бесполезно, написано для примера
    */
    function onSave($args)
    {
        return true;
    }
}

В методах можно выбрасывать исключение, чтобы остановить сохранение, с помощью CMain::ThrowException. Аргумент $args содержит массив get-параметров. Не очень понятно, почему не post-параметры и зачем вообще нужен аргумент в этих функциях, ведь можно получить эти массивы и самому. Логичнее было бы передавать объект Request.

Продолжение следует…

Создание заказов нескольким поставщикам на основании заказа клиента

11 Июня 2015
Недавно обнаружил такую удобную возможность, как создание сразу несколько Заказов поставщику на основании одного Заказа клиента. Странно но раньше я такого функционала не замечал или его не было, не знаю. И конечно поспешил поделится с читателями этого сайта.

Имеем Заказ клиента в котором несколько позиций, которые нужно закупать от разных поставщиков. Я в таких случаях всегда понимал, что нужно создать вручную несколько заказов клиента и указать в них от какого поставщика будет закупаться товар. Но оказывается 1С уже продумала такую необходимость и предложила автоматическое деление Заказа клиента на Заказы поставщикам.

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

Вот так просто. Кстати, поставщика и количество можно поменять и откорректировать перед созданием Заказов поставщикам.
Главный же вопрос, это на основании каких данных заполняется Поставщик?
По факту получается, что если номенклатура закупалась два или более последних раза у одного поставщика, то он будет заполнен в таблице.

Справка 1С Управление торговлей 11 нам говорит следующее:Если в трех последних документах поставки два раза был указан один и тот же поставщик, то информация о нем заполняется. Если все поставки происходили от разных поставщиков, то информация о поставщике не заполняется и пользователь должен указать эту информацию вручную. Если же нужно заполнить в ручную одного поставщика для нескольких товаров воспользуйтесь кнопкой Заполнить поставщика в выбранных строках.
И после нажатия кнопки Создать заказы поставщикам внизу окна будут созданы не проведённые заказы по одному на каждого поставщика.

Тут. если обратите внимание не заполнена сумма заказа. Да и в самом заказе не будет ни цен, ни суммы. Чтобы автоматически заполнилась цена в Заказа поставщику, нужно чтобы были установлены Цены поставщиков.

Ну а на этом все, коротко в этот раз. Подписывайтесь, ждите новых статей.

ut11-bitrix.ru

Об Управлении заказами на новой платформе «1С-Битрикс»

«Управление заказами» — важная часть жизни интернет-магазина. Наши пользователи проводят в этом разделе немалую часть рабочего времени, контролируя заказы, корректируя и отслеживая отгрузки и оплаты, изменяя статусы. Поэтому мы переработали и улучшили раздел «Управление заказами» с учетом пожеланий пользователей. И здесь мы хотим рассказать о сделанных изменениях и нововведениях.

Логика работы форм

Общие принципы логики работы новых форм сохраняют преемственность с предыдущей версией раздела «Управление заказами».

В формах всегда присутствовало два состояния заказа:

  • Просмотр заказа: панель управления, в которой можно было изменить любой статус, проконтролировать ход работы по заказу, быстро посмотреть данные по клиенту. При это содержимое самого заказа поменять нельзя. В новой форме просмотра заказа появились новые возможности по управлению отгрузкой и оплатой. Также в форме просмотра теперь можно быстро создать, удалить или изменить данные в отгрузках и оплатах.
  • Редактирование заказа: здесь можно изменить сам заказ, и в новых формах расширились возможности по управлению скидками.

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

Шапка формы управления заказами

  • Изменился вывод заголовка заказа. Теперь в нем отображает ID, номер, время и дата создания заказа, который может быть сформирован по своей схеме отображения.
  • Навигационное меню представляет собой достаточно большую форму, которую не всегда хочется пролистывать. Поэтому теперь различные секции можно закреплять с помощью булавок (показаны красными стрелками), они всегда будут отображаться в шапке и быстро перемещаться по форме.
  • Чтобы не приходило листать блок информации по заказу, мы вынесли самые важные данные в шапку. Она отличается по цвету и сразу привлекает к себе внимание. Блок, как и навигационное меню, можно приколоть булавкой, и он всегда будет сверху. В блок выводится информация по статусу заказа, контактные данные клиента, стоимость заказа и доставки. В правой стороне блока находятся иконки всех служб доставок и систем оплаты, которые используются в заказе, а статус заказ отображается в виде цветового индикатора. Красный цвет — заказ еще не отгружен или не доставлен, зеленый — отправка/доставка в финальной стадии.

Вкладка «Анализ заказа»

Здесь вы найдете:

  • Сводку по товарам в заказе, сколько уже отгружено и сколько осталось отгрузить по заказу.
  • Список всех связанных документов по заказу. Мы можем легко перейти к любому документу и открыть его, здесь отображаются номера и статусы документов. При переходе в другой документ, вы также увидите вкладку «Анализ заказа», где также будет отображаться сводная информация.

Подстройка формы под ваши нужды

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

По умолчанию разные формы отображаются немного по разному:

  • Оформление заказа (создание заказа). Когда клиент звонит по телефону и размещает заказ, то обычно сначала уточняет ассортимент товара, наличие и т.п., а затем сообщает данные по доставке и оплате. По этой же схеме построена и форма оформления заказа: сверху мы показываем блок по товару, далее идет информация по клиенту, и ниже — по доставке и оплате.
  • Просмотр и изменение заказа. Вначале выводится информация о клиенте и блоки доставок и оплат, а общий список товаров заказа уходит в самый низ.

Также мы сделали небольшой ролик, демонстрирующий гибкость процесса настройки формы:

Работа со скидками в «Управлении заказами»

В рамках управления заказами появилась возможность отображения всех скидок, которые применились к заказу: скидки на товары и общую корзину, скидки на доставку и оплату.

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

Давайте посмотрим в видеоролике, как это работает:

Обратите внимание, что в этом примере скидка никак не меняется, если изменить ее название или условия (скидка хранится в рамках конкретного заказа). И только при выборе другого товара, к которому относится измененная скидка, она будет добавлена уже как новая. Поэтому, даже если условия скидки уже не действуют, или старая скидка удалена, вы увидите все скидки, которые повлияли на заказ.

Разделение заказа, новые документы «Отгрузка» и «Оплата»

Главным нововведением в форме управления заказами стало выделение в отдельные документы цепочек отгрузок и оплат, что дало возможность создать множество отгрузок и оплат.

В каких ситуациях полезна новая структура форм?

  • Клиент сделал заказ, его собрали и упаковали. И тут клиент просит добавить еще товары. Благодаря новой структуре формы заказа вы быстро добавляете новые позиции и делаете отдельную отгрузку.
  • Клиент оформил заказ и тут выясняется, что у него не хватает денег для оплаты выбранным способом. Он просит сделать оплату частично через Яндекс.Деньги, и частично банковской картой. Вы просто разделяете оплату на две части и назначаете им соответствующие способы, после чего клиент проводит оплату через личный кабинет.
  • Клиент оформил заказ на 5 штук одного товара, а у вас на складе есть только 3. Вы созваниваетесь с клиентом, договариваетесь о разделении заказа и отгружаете первые 3 товара отдельным документом, а потом формируете вторую отгрузку еще на два экземпляра.

И т.д. и т.п. Ситуаций, когда заказ пошел по «нестандартному пути», можно придумать множество.

Так выглядит созданный заказ в блоке отгрузки и оплаты:

После того, как клиент оформил заказ, мы можем просмотреть его содержимое, где уже будут автоматически созданы отгрузка и оплата.

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

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

Над оплатами размещен сводный блок, в котором можно посмотреть общую стоимость заказа, сколько уже оплачено и сколько осталось оплатить.

Так выглядит развернутый документ доставки:

Здесь мы видим:

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

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

Ниже показан развернутый вид документа оплаты. Здесь указывается способ оплаты, выбранный клиентом или указанный менеджером, сумма оплаты (она может быть меньше, чем сумма заказа) и статус оплаты.

Подробнее о способах использования новых форм узнать, просмотрев вебинар, который мы подготовили для вас с Алексеем Кирсановым, ведущим разработчиком новой системы управления заказами:

habr.com

Закрытие заказов

19 Мая 2015

    Часто у пользователей возникает проблема с закрытием заказов клиента в 1C Управление торговлей 11. Давайте в этой статье разберемся как же это работает. И ответим на вопросы:

    1. Какие бывают состояние у заказов клиента?
    2. Как происходит закрытие заказа технически?
    3. Почему заказ клиента может не закрыться автоматически?
    4. Что делать если заказ клиента не закрылся?
    5. Что дает установка флажков Не закрывать частично отгруженные заказы и заявки и Не закрывать частично оплаченные заказы я заявки?

      Обратим внимание на настройки Администрирование – CRM и продажи, в подразделе Использование заказов.

        Важным здесь являются флажки Не закрывать частично отгруженные заказы и заявки и Не закрывать частично оплаченные заказы и заявки. Если прочитать внимательное содержание флажков и описание под ними, то складывается впечатление, что если эти флажки не указаны, то заказы будут закрывается не контролируя ни оплаты, ни отгрузки. А на самом деле все совсем не так. Толи я смысл не очень понимаю, толи описание в 1С УТ11 не соответствует действительности. Ну давайте разбираться со всем этим.

        Сначала флажки ставить не будет и посмотрим, как работает закрытие заказов.

        Создадим заказ клиента. После проведения заказ примет состояние Готов к отгрузки.

        Обратите внимание, что Текущее состояние может быть и выделено красным цветом. Это происходит тогда, когда срок выполнения ниже текущей даты. Таким образом 1С Управление торговлей информирует пользователя о просроченных заказах.

        Ну а теперь посмотрим, какие вобще есть состояния у Заказов клиента?

        Кстати, я уже упоминал про состояния заказов в одной из статей по резервированию. Ну продолжим.

        1. Ожидается согласование — состояние устанавливается, когда заказ в статусе На согласовании.

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

        3. Готов к отгрузке — как в нашем случае, оплата после отгрузки, заказ готов к отгрузки.

        4. Ожидается отгрузка — этот статус появится, если включены статусы у документов Реализация и установлен статус в реализации К отгрузке.

        5. Ожидается оплата после отгрузки — была произведена оплата по предоплатой системе.

        6. Готов к закрытию — статус будет если установлены флажки Не закрывать частично отгруженные заказы и заявки и Не закрывать частично оплаченные заказы и заявки в настройках.

        7. Закрыт — заказ закрыт, автоматически или в ручную.

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

        Вот так выглядит регистр Состояние заказов клиентов. Открыть его можно только через Все функции.

        Давайте рассмотрим, частичное выполнение заказа. Тут возможно 2 ситуации: заказ оплачен не полностью, заказ отгружен не полностью.

        Рассмотрим не полную отгрузку заказа.

        Создадим реализацию, в которой не будет кресел и будет меньшее количество стульев.

        А оплату создадим на полную сумму. Заказ получит статус Готов к отгрузки.

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

        Строки товара которых не было в реализации будут отменены полностью, а строки где реализовано не все количество будут разбиты на две строки.

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

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

        Откорректируем оплату заказа указав сумму меньше суммы заказа всего на одну копейку.

        Заказ, как и следовало ожидать не закрылся.

        И тут уже все намного сложнее. Если поменять сумму в заказе, то он перейдет в статус Готов к отгрузки. Это из за того, что реализация и заказ стали различаться по сумме. По этому, чтобы окончательно закрыть заказ потребуется также перезаполнить строки в документе реализация по заказу. Для этого в табличной части документа реализации есть специальная команда Заполнить по заказам. И только после этого заказ закроется.

        А вот если это невозможно, например уже выписана счет-фактура и отдана клиенту, а проблемы с одной копейкой возникли из-за округлений при расчете скидок или ещё каких-то нюансов. То тогда выход только один — это отвязывать Реализацию от Заказа клиента, заказ помечать на удаление. Груба, но других вариантов не корректируя документов нет, да и быть не может, ибо закрывать не полностью оплаченный заказ некорректно. Скажете корректно. Но мы посмотрим тогда движения по заказу, которые я описывал в статье по взаиморасчетам:

        Анализируя движения становится ясно, что если закрыть заказ (каким-либо образом, то не произойдет закрытие регистра Расчеты с клиентами. Этого 1С УТ11 допустить конечно не может.

        Отвлеклись вернемся к нашим проблемам.

        Ну вот мы рассмотрели оба случая при которых заказ не будет закрыт автоматически.

        Не закрывать частично отгруженные заказы и заявки и Не закрывать частично оплаченные заказы я заявки

        А теперь рассмотрим, что нам даст установка этих флажков.

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

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

        Проведем такой же эксперимент и с частичной оплатой.

        И снова получим ошибку о невозможности закрыть частично оплаченный заказ.

        Так что же дает нам установка данных флажков?

        А дает нам всего на всего отмену автоматического закрытия заказов. Т.е. теперь, чтобы закрыть заказ, необходимо пользователю вручную поставить статус Закрыт. Это может потребоваться для большего контроля заказов со стороны менеджеров, например. А все механизмы контролирующие закрытие заказов по прежнему продолжают работать.

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

        До встречи и не забудьте подписаться на новые статьи. Они обязательно будут.

        ut11-bitrix.ru

        Автоматическая выгрузка заказов из 1С.Битрикс поставщику — Огонь

        Последовательность действий при получении заказа.

        Первое, что нужно сделать — это подтвердить заказ у покупателя.

        Далее в системе администрирования заходим в подтвержденный заказ и выставляем статус «Подтвержден, отправить поставщику» и нажимаем кнопку «Сохранить».

        zakaz-1

        В течении 15 минут ваш заказ выгрузится в систему заказов поставщика.

        При успешном размещении заказа у поставщика в системе администрирования вашего сайта появится идентификатор заказа «ID заказа в p5s«, а сам заказ будет автоматически переведен в статус «Принят«.

        2016-08-22_11-54-11

        Дальнейшая обработка заказа с вашей стороны не требуется, заказ будет собран и доставлен покупателю поставщиком.

        По мере сбора и отправки заказа будут автоматически меняться его статусы. Возможные статусы заказа:

        1 — Принят;2 — Обработка на складе;3 — Ожидает подтверждения;4 — Товар забронирован;5 — Готов к отгрузке;6 — Выслан на почту;7 — Оплачен и доставлен;8 — Отказ;9 — Комплектация товара на складе;10 — Злонамеренный отказ;11 — Отправлен с курьером;12 — Отгружен. Ожидаем оплату;13 — Удален.

        В случае ошибочного размещения заказа поле «ID заказа в p5s» останется пустым, а в поле «Результат выгрузки в p5s» будет указан код ошибки.

        Полный перечень ошибок и инструкции для разработчиков «API — запрос информации о состоянии заказа» можно посмотреть на сайте поставщика.

        В случае, если клиент по телефону/e-mail сообщил, что сделал заказ ошибочно или хочет от него отказаться, либо если вы по каким-то причинам сами хотите отменить заказ после его отправки поставщику, как можно скорее свяжитесь с менеджерами поставщика по e-mail или по телефону. Изменение вами статуса на «Отказ» не отобразится в базе данных поставщика!

        fire.p5s.ru

        Оформление заказа через «админку» Битрикса. — Огонь

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

        Как правило, в интернет-магазинах заказы создают пользователи из публичной части, но в некоторых случаях заказ приходится создавать администратору (менеджеру) магазина из административной части. Для этого в контекстной панели списка заказов (Рабочий стол > Магазин > Заказы) есть кнопка Добавить заказ, по нажатию которой открывается форма создания заказа:

        order_create1

        Остановимся на паре моментов заполнения формы создания заказа:

        По умолчанию первой секцией является секция Заказ, в которой указываются входящие в состав заказа товары. Вы можете добавить в заказ уже имеющийся товар, нажав на кнопку Добавить товар, либо добавить новый товар (кнопка Новый товар…), который после указания всех необходимых параметров останется в системе.

        При клике на кнопку «Добавить товар» откроется форма поиска и добавления товара. Нужный товар проще всего искать по полю «Внешний код», который соответствует ID товара на карточке.

        oformlenie-2

        Находим нужный товар, кликаем по названию и добавляем товар к заказу.

        oformlenie-3

        Если у вас есть купоны на скидки на данный товар, то вы можете ввести их в поле Промокод и нажать Добавить, после чего цена заказа будет обновлена с учетом скидок:

        order_create_discount

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

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

        Для добавления нового покупателя следует самостоятельно заполнить поля личных данных и данных для доставки:

        order_create_user

        Обратите внимание! Если доставка будет осуществляться службой PickPoint, то сперва необходимо найти идентификатор пункта самовывоза (это можно сделать на вашем сайте при оформлении заказа или на сайте http://pickpoint.ru/postamats/​) и заполнить соответствующее поле.

        oformlenie-5

        oformlenie-4

        В секции Отгрузка выберите необходимую службу доставки. Стоимость доставки подставится автоматически. При необходимости измените на нужное вам значение:

        order_create_del

        Сохраняем заказ.

        Отправка заказа поставщику описана в статье «Автоматическая выгрузка заказов из 1С.Битрикс поставщику».

        fire.p5s.ru

        Бизнес процесс для отдела закупок в Битрикс24

        Битрикс24. Бизнес процесс для отдела снабжения.

        В данной статье рассматриваются вопросы автоматизации бизнес-процессов закупок с использованием системы Битрикс24.

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

        Обыкновенная схема взаимодействия. Отдел закупок обладает некоторыми сакральными знаниями и опытом, которые позволяют сотрудникам приблизительно понимать, что, сколько, когда и у кого необходимо закупать для обеспечения производства и плана реализации (если таковой вообще имеется).
        Используется телефон, E-mail, Skype и мало ли что ещё подобное.

        В результате работ по наведению порядка компания должна получить внедрённый в системе автоматизированный бизнес-процесс, обеспечивающий эффективную работу отдела закупок.

         2 Схематизация бизнес-процесса

        В процессе зафиксированы следующие роли.

        • Заказчик.
        • Менеджер по продажам.
        • Менеджер по закупкам.
        • Бухгалтер.
        • Водитель-Экспедитор.
        • Поставщик.

        Пользователями системы не будут являться роли Заказчик и Поставщик. Теперь я формирую схему бизнес-процесса в нотации BPMN без привязки к архитектуре. На схеме также не показаны формируемые документы и их движение.

         2.1 Создание и описание исходной схемы бизнес-процесса

        Схема Бизнес процесса приведена ниже (Рисунок 1). Как обычно, я использую нотацию BPMN. Итак, глядя на схему, читаем бизнес-процесс. По Запросу Клиента Менеджер по продажам выполняет ряд активностей.

        • Фиксирует запрос Клиента.
        • Создает и согласует Коммерческое предложение.
        • Заключает Договор.
        • Формирует счет. 
        • Резервирует товар на складе.
        • Формирует Закупку.

        Менеджер по полученной Закупке формирует и отправляет счета через Бухгалтера Клиенту. После подтверждения оплаты Счетов Бухгалтер уведомляет Менеджера по закупкам о данном факте.

        Менеджер по закупкам, после подтверждения Поставщика о готовности отгрузить товары формирует для Водителя-экспедитора Наряд на доставку и Доверенность на получение товара.

        Рисунок 1. Схема бизнес-процесса без привязки к системе.

        После получения и доставки товара на склад Менеджер по закупкам приходует его и резервирует до того момента, когда Менеджер по продажам сформирует Отгрузку по Договору с сопутствующими документами.

         2.2 Построение схем бизнес-процесса, ассоциированного с системой

        Приняв решение, что архитектурой нашего внедрения будет система Битрикс24, а также собрав необходимый набор артефактов (сущностей), я создаю ассоциированные с системой схемы бизнес-процессов в той же, любимой мной, нотации BPMN (Рисунок 2, Рисунок 3).

        Сущности CRM Битрикс24, применяемые в автоматизации бизнес-процесса, перечислены ниже. 

        • Лид.
        • Сделка.
        • Коммерческое предложение.
        • Счёт.

        Сущности «Списки» Битрикс24, применяемые и создаваемые мной в автоматизации бизнес-процесса, перечислены ниже.

        • Договор.
        • Закупка.
        • Счёт входящий.
        • Накладная.
        • Наряд на доставку.
        • Доверенность на получение товара.
        • Отгрузка.

        К части из перечисленных сущностей я строю бизнес-процессы, исполняемые системой Битрикс24.

        Для начала работы необходимо развернуть у себя в организации саму систему Битрикс24 в какой-либо редакции, включить поддержку бизнес-процессов и  модуль CRM . Если Вы еще не стали клиентами Битрикс24, то самое простое, это зарегистрировать бесплатную облачную версию на 12 пользователей.

        Далее, нужно пригласить пользователей в настроенную штатную структуру организации в системе и в группы, определяющие функциональность сотрудников, которые в такие группы входят. Иными словами, группы должны соответствовать тем группам, которые описаны в бизнес-процессе.

         3.1.1 Установка модуля для отправки sms из бизнес-процесса

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

           Рисунок 2. Схема ассоциированного бизнес-процесса (первый лист)

           Рисунок 3. Схема ассоциированного бизнес-процесса (второй лист)

         3.1.2 Информация о модуле «sms4b-смс для бизнеса»

        Модуль предназначен для отправки одиночных СМС и массовых СМС рассылок сотрудникам компании, клиентам на произвольные номера.

        Основные возможности модуля.

        • Возможность выполнять рассылки как отделам, так и конкретным сотрудникам.
        • Поиск по отделу, фамилии и должности сотрудника.
        • При организации рассылки, есть возможность уведомить сотрудников, у которых не заполнен мобильный телефон с помощью мгновенного сообщения.
        • Поиск контактов из CRM по фамилии.
        • Возможность транслитерировать сообщение.
        • Возможность выполнить отложенную рассылку.
        • Возможность указать период, когда не стоит отправлять СМС (например, в ночное время).

        Установка.

        • Установите модуль из Маркетплейс «Битрикс24»
        • Зарегистрируйтесь на сайте  sms4b.ru, получите 10 СМС бесплатно для тестирования.
        • Закажите буквенные имена в личном кабинете в разделе «Заказать SMS-имя/номер».
        • В настройках модуля введите логин/пароль от личного кабинета на сайте sms4b.ru и выберите имя отправителя.
        • Начните рассылки СМС.

        Получить подробную информацию о модуле и скачать необходимую документацию можно на сайте sms4b.ru по ссылке sms4b.ru/programs/bitrixmodule.php.

         3.2 Создание шаблона последовательного бизнес-процесса

        Полное описание всех особенностей создания бизнес-процессов в Битрикс24 не является целью данной статьи.

        Имея перед глазами Техническое Задание с описанием бизнес-процессов, включая схемы, не так трудно сделать рабочий процесс в системе. Конструктор бизнес-процессов Битрикс24 имеет интуитивно понятный дружественный интерфейс.

        Бизнес-процесс строится с помощью функциональных блоков, которые добавляются в схему с помощью «drag-and-drop» из набора, расположенного слева на экране.

        Каждый функциональный блок отвечает за выполнение процессом определённой функции в процессе, что должно коррелировать с «человеческим» процессом, утверждённым бизнесом в Техническом Задании. Насколько подробно Вы опишете бизнес-процесс в документах, зависит от Ваших договорённостей с Заказчиком. Из собственного опыта разработки и внедрения бизнес-процессов, могу констатировать, что очень детальное описание процессов в Техническом Задании не нужно. Главная цель схем процессов в документации – не упустить ничего важного и заручиться поддержкой владельцев бизнес-процессов, что называется «по верхнему уровню», без глубокой декомпозиции. Не нужно, что называется, «лезть в шпонку».

        Уверен, что при создании и тестировании бизнес-процесса, имплементированного в Битрикс24, Вы не раз и не два будете его менять.

        Используя блоки «Обработка документа», «Конструкции», «Уведомления» и «Прочие» я строю заданный бизнес-процесс (Рисунок 4).

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

        • Запрос дополнительной информации.
        • Изменение документа.
        • Задача.
        • Уведомление пользователя.
        • Конструкции «Условие» и «Параллельное выполнение».

        При редактировании бизнес-процесса на забывайте нажимать на кнопку «Сохранить» внизу интерфейса, иначе изменения будут потеряны.

        Рисунок 4. Фрагмент имплементированного бизнес-процесса в редакторе Битрикс24.

         3.2.1 Блоки бизнес процесса

         3.2.1.1 Конструкции «Условие» и «Параллельное выполнение»

        Данные блоки позволяют организовать логическое ветвление в бизнес-процессе. Это может быть параллельное выполнение последующих блоков (логическое «И») или выбор одного из дальнейших путей процесса (логическое «ИЛИ»).  В нашем примере происходит параллельно постановка задачи трем ролям.

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

         3.2.1.2 Запрос дополнительной информации

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

        Мы видим, что в поле «Заполняют сотрудники» указаны значения переменных, позволяющие, вместо указания конкретных сотрудников использовать роли бизнес-процесса.

        Список «Поле» добавляет в задание запрашиваемые поля, значения которых укажет пользователь в интерфейсе диалога. Эти значения будут присвоены соответствующим переменным.

         3.2.1.3 Изменение документа

        Блок используется, как и следует из названия, для изменения документа в результате исполнения бизнес-процесса. На изображении показана настройка параметров действия для изменения стадии сделки – сущности CRM Битрикс24.

        Точно так же можно создавать блоки для изменения полей документов.

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

        Процесс на время выполнения (до закрытия) задачи останавливается. Началом выполнения назначается значение поля «Дата начала» из задачи, для которой процесс запущен. Крайним сроком устанавливается значение переменной, которой в предыдущем задании было присвоено значение даты окончания действия договора, то есть, сделки в системе.

        В описании задачи выводится как текст так и значения полей и переменных. Устанавливается высокий приоритет.

        Простой функционал, позволяющий в выполняемом бизнес-процессе отправлять уведомления пользователям портала через мессенджер или по электронной почте. Заполнение полей настройки функционального блока «Уведомление» аналогично заполнению полей для функционального блока «Задача».

        Точно так же в настойках используются переменные и значения полей сущности «задача».

        Отзывов пока никто не оставил. Вы будете первым.

        pinall.ru

        По многочисленным просьбам приведу пример, как все счастливые обладатели модуля TS Умная форма обратной связи
        могут сделать в каталоге товаров, как в списке, так и в детальной карточке, возможность Купить товар в 1 клик.

        Итак, предположим, что вы уже пользуетесь модулем, знаете Битрикс, все досконально я не расписываю.

        1) Нам потребуется один обработчик события в /bitrix/php_interface/init.php

        AddEventHandler("api.feedback", "OnBeforeEmailSend", "OnBeforeEmailSendHandler");

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

        Уникальный идентификатор формы задается в настройках компонента для каждой формы, вот здесь, автоматически, но можете сами вписать туда что-то типа form1

        Далее привожу готовый листинг кода, который необходимо добавить в файл init.php, в любое место, он взят вроде из модуля оформления заказа Яндекс.Маркета, делал очень давно, точно не помню.

        <?php

        //---------- Оформление заказа в 1 клик ----------//
        AddEventHandler("api.feedback", "OnBeforeEmailSend", "OnBeforeEmailSendHandler");
        function OnBeforeEmailSendHandler(&$event_name, &$site_id, &$arFields, &$message_id)
        {

            //Форма "Купить в 1 клик" оформит заказ в магазине
            if($arFields['FORM_ID'] == 'form1') {
                
            //Для тестирования формы подставить свой e-mail, чтобы не мешать менеджерам
                //$arFields['EMAIL_TO'] = "test@site.ru";

                if(CModule::IncludeModule('sale') && CModule::IncludeModule("iblock") && CModule::IncludeModule("catalog")) {
                    require_once($_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/sale/general/admin_tool.php");

                    function API_makeOrderProps($address, $buyer, $psId, $deliveryId, $locationId, $personTypeId)
                    {
                        $psId = intval($psId);

                        $arResult = array();

                        $arPropFilter = array(
                             "PERSON_TYPE_ID" => $personTypeId,
                             "ACTIVE"         => "Y",
                        );

                        if($psId != 0) {
                            $arPropFilter["RELATED"]["PAYSYSTEM_ID"] = $psId;
                            $arPropFilter["RELATED"]["TYPE"]         = "WITH_NOT_RELATED";
                        }

                        if(strlen($deliveryId) > 0) {
                            $arPropFilter["RELATED"]["DELIVERY_ID"] = $deliveryId;
                            $arPropFilter["RELATED"]["TYPE"]        = "WITH_NOT_RELATED";
                        }

                        $dbOrderProps = CSaleOrderProps::GetList(
                             array(),
                             $arPropFilter,
                             false,
                             false,
                             array("ID", "CODE")
                        );

                        while($arOrderProps = $dbOrderProps->Fetch()) {
                            if($arOrderProps["CODE"] == 'FIO' && !empty($buyer)) {
                                $fio = $buyer["firstName"];

                                if(isset($buyer["middleName"]))
                                    $fio .= ' ' . $buyer["middleName"];

                                if(isset($buyer["lastName"]))
                                    $fio .= ' ' . $buyer["lastName"];

                                $arResult[ $arOrderProps["ID"] ] = $fio;
                            }
                            elseif($arOrderProps["CODE"] == 'EMAIL' && isset($buyer["email"]))
                                $arResult[ $arOrderProps["ID"] ] = $buyer["email"];
                            elseif($arOrderProps["CODE"] == 'PHONE' && isset($buyer["phone"]))
                                $arResult[ $arOrderProps["ID"] ] = $buyer["phone"];
                            elseif($arOrderProps["CODE"] == 'ZIP' && isset($address["postcode"]))
                                $arResult[ $arOrderProps["ID"] ] = $address["postcode"];
                            elseif($arOrderProps["CODE"] == 'CITY' && isset($address["city"]))
                                $arResult[ $arOrderProps["ID"] ] = $address["city"];
                            elseif($arOrderProps["CODE"] == 'LOCATION' && isset($locationId))
                                $arResult[ $arOrderProps["ID"] ] = $locationId;
                            elseif($arOrderProps["CODE"] == 'ADDRESS') {
                                $strAddr = "";

                                if(isset($address["postcode"]))
                                    $strAddr .= $address["postcode"] . ", ";

                                if(isset($address["country"]) && isset($address["city"]))
                                    $strAddr .= $address["country"] . ", " . $address["city"] . ", ";

                                if(isset($address["street"]))
                                    $strAddr .= 'улица' . " " . $address["street"] . ", ";

                                if(isset($address["subway"]))
                                    $strAddr .= 'метро' . " " . $address["subway"] . ", ";

                                if(isset($address["house"]))
                                    $strAddr .= 'дом' . " " . $address["house"];

                                if(isset($address["block"]))
                                    $strAddr .= ", " . 'корпус/строение' . " " . $address["block"];

                                if(isset($address["entrance"]))
                                    $strAddr .= ", " . 'подъезд' . " " . $address["entrance"];

                                if(isset($address["entryphone"]))
                                    $strAddr .= ", " . 'домофон' . " " . $address["entryphone"];

                                if(isset($address["floor"]))
                                    $strAddr .= ", " . 'этаж' . " " . $address["floor"];

                                if(isset($address["apartment"]))
                                    $strAddr .= ", " . 'офис/квартира' . " " . $address["apartment"];

                                if(isset($address["recipient"]))
                                    $strAddr .= ", " . 'получатель' . " " . $address["recipient"];

                                if(isset($address["phone"]))
                                    $strAddr .= ", " . 'телефон' . " " . $address["phone"];

                                $arResult[ $arOrderProps["ID"] ] = $strAddr;
                            }
                        }

                        return $arResult;
                    }

                    /**
                     * Creates new anonymous user with e-mail 'anonymous_some_number@example.com' and returns his ID
                     * Used mainly in CRM
                     *
                     * @return int - new user ID or ID of already existing anonymous user, 0 if error
                     */
                    function API_GetAnonymousUserID()
                    {
                        $bUserExists = false;

                        $anonUserID = intval(COption::GetOptionInt("sale", "one_click_user_id", 0));

                        if($anonUserID > 0) {
                            $by     = "id";
                            $order  = "asc";
                            $dbUser = CUser::GetList($by, $order, array("ID_EQUAL_EXACT" => $anonUserID), array("FIELDS" => array("ID")));
                            if($arUser = $dbUser->Fetch())
                                $bUserExists = true;
                        }

                        if(!$bUserExists) {
                            $anonUserEmail = "one_click_" . randString(9) . "@example.com";
                            $arErrors      = array();
                            $anonUserID    = CSaleUser::DoAutoRegisterUser(
                                 $anonUserEmail,
                                 array("NAME" => "Купить в 1 клик"),
                                 SITE_ID,
                                 $arErrors,
                                 array("ACTIVE" => "N")
                            );

                            if($anonUserID > 0) {
                                COption::SetOptionInt("sale", "one_click_user_id", $anonUserID);
                            }
                            else {
                                $errorMessage = "";
                                if(!empty($arErrors)) {
                                    $errorMessage = " ";
                                    foreach($arErrors as $value) {
                                        $errorMessage .= $value["TEXT"] . "<br>";
                                    }
                                }

                                //Loc::getMessage("SU_ANONYMOUS_USER_CREATE", array("#ERROR#" => $errorMessage))
                                $GLOBALS["APPLICATION"]->ThrowException("Ошибка создания анонимного пользователя." . $errorMessage, "ANONYMOUS_USER_CREATE_ERROR");
                                return 0;
                            }
                        }

                        return $anonUserID;
                    }

                    $arErrors = $arWarnings = $arOptions = $arProducts = $arAdditionalFields = array();

                    $IBLOCK_ID = 1; //Каталог товаров
                    //$site_id = $site_id; //
                    $user_id          = API_GetAnonymousUserID(); //7220
                    $person_type_id   = 1; //Плательщик
                    $delivery_id      = 3; //Самовывоз
                    $pay_system_id    = 1; //Наличная оплата
                    $location_id      = 2691; //Москва
                    $user_description = trim($arFields['USER_DESCRIPTION']);
                    $quantity         = (intval($arFields['PRODUCT_COUNT']) > 0 ? intval($arFields['PRODUCT_COUNT']) : 1);

                    $arIblockFilter = array(
                         'IBLOCK_ID' => $IBLOCK_ID,
                         '=XML_ID'   => trim($arFields['PRODUCT_ID']),
                    );
                    $arElement      = CIBlockElement::GetList(array(), $arIblockFilter, false, false, array('ID', 'XML_ID', 'IBLOCK_EXTERNAL_ID'))->Fetch();

                    if($arElement['ID']) {
                        $arProduct = CCatalogProductProvider::GetProductData(array(
                             "PRODUCT_ID" => $arElement['ID'],
                             "RENEWAL"    => "N",
                             "QUANTITY"   => $quantity,
                             "SITE_ID"    => $site_id,
                        ));

                        $arProduct["PRODUCT_ID"]             = $arElement["ID"];
                        $arProduct["MODULE"]                 = "catalog";
                        $arProduct["PRODUCT_PROVIDER_CLASS"] = "CCatalogProductProvider";

                        if(strlen($arElement["XML_ID"]) > 0)
                            $arProduct["PRODUCT_XML_ID"] = $arElement["XML_ID"];

                        if(strlen($arElement["IBLOCK_EXTERNAL_ID"]) > 0)
                            $arProduct["CATALOG_XML_ID"] = $arElement["IBLOCK_EXTERNAL_ID"];

                        if($arProduct["CAN_BUY"] == "Y")
                            $arProducts[] = $arProduct;

                        $arOrderProductPrice = fGetUserShoppingCart($arProducts, $site_id, "N");

                        $arShoppingCart = CSaleBasket::DoGetUserShoppingCart(
                             $site_id,
                             $user_id,
                             $arOrderProductPrice,
                             $arErrors
                        );

                        $arErrors           = $arWarnings = array();
                        $arOptions          = array();
                        $arOrderPropsValues = API_makeOrderProps(
                             '',
                             array(
                                    'firstName' => $arFields['FIO'],
                                    'phone'     => $arFields['PHONE'],
                             ),
                             $pay_system_id,
                             $delivery_id,
                             $location_id,
                             $person_type_id
                        );

                        $CSaleOrder = new CSaleOrder();
                        $arOrder    = $CSaleOrder->DoCalculateOrder(
                             $site_id,
                             $user_id,
                             $arShoppingCart,
                             $person_type_id,
                             $arOrderPropsValues,
                             $delivery_id,
                             $pay_system_id,
                             $arOptions,
                             $arErrors,
                             $arWarnings
                        );

                        $arOrder["LID"] = $site_id;

                        if($user_description)
                            $arAdditionalFields["USER_DESCRIPTION"] = $user_description;

                        if($orderID = $CSaleOrder->DoSaveOrder($arOrder, $arAdditionalFields, 0, $arErrors)) {
                            $arOrderInfo = CSaleOrder::GetList(false, array('ID' => $orderID), false, false, array('ID', 'ACCOUNT_NUMBER'))->Fetch();

                            $arFields['SUBJECT'] .= ' №' . $arOrderInfo['ACCOUNT_NUMBER'];
                            $arFields['ORDER_URL'] = (CMain::IsHTTPS() ? 'https://' : 'http://') . 'site.ru/bitrix/admin/sale_order_detail.php?ID=' . $orderID . '&lang=ru';
                        }
                        else
                            $arFields['ORDER_URL'] = implode(' | ', $arErrors);
                        /*if($orderID)
                        {
                            echo "<pre>"; print_r($orderID);echo "</pre>";
                        }
                        else
                        {
                            echo "<pre>"; print_r($arErrors);echo "</pre>";
                        }*/
                    }
                }
            }
        }

        Что вам необходимо тут сделать в своем случае, да, у каждого из нас будут разные идентификатор формы, инфоблока, самовывоз, наличная оплата, плательщик, город и т.д.

        а) Проверить идентификатор формы, чтобы только указанную форму слушал обработчик.

        if($arFields['FORM_ID'] == 'form1')

        б) Подставить здесь свои идентификаторы, найти их надо в админке

        $IBLOCK_ID = 1; //Каталог товаров
        //$site_id = $site_id; //
        $user_id          = API_GetAnonymousUserID(); //7220
        $person_type_id   = 1; //Плательщик
        $delivery_id      = 3; //Самовывоз
        $pay_system_id    = 1; //Наличная оплата
        $location_id      = 2691; //Москва
        $user_description = trim($arFields['USER_DESCRIPTION']);
        $quantity         = (intval($arFields['PRODUCT_COUNT']) > 0 ? intval($arFields['PRODUCT_COUNT']) : 1);

        Комментарий к заказу прилетит из поля формы, о нем будет ниже

        $user_description = trim($arFields['USER_DESCRIPTION']);

        Количество товара также прилетит из поля формы, там счетчик можно включить

        $quantity = (intval($arFields['PRODUCT_COUNT']) > 0 ? intval($arFields['PRODUCT_COUNT']) : 1);

        в) Здесь тоже надо из полей формы подставить ФИО + Телефон, об этом будет ниже

        $arOrderPropsValues = API_makeOrderProps(
           '',
           array(
              'firstName' => $arFields['FIO'],
              'phone'     => $arFields['PHONE'],
           ),
           $pay_system_id,
           $delivery_id,
           $location_id,
           $person_type_id
        );

        г) Вот это уже после оформления заказа полетит на вашу почту Тема письма + Ссылка на заказ в админке.
        Но если отключить в форме отправку писем, то на почту ничего не полетит, будет только создаваться заказ в админке.

        $arFields['SUBJECT'] .= ' №' . $arOrderInfo['ACCOUNT_NUMBER'];
        $arFields['ORDER_URL'] = (CMain::IsHTTPS() ? 'https://' : 'http://') . 'site.ru/bitrix/admin/sale_order_detail.php?ID=' . $orderID . '&lang=ru';

        Здесь вроде все, переделывайте код под себя, если что-то не работает, думайте, экспериментируйте.

        2) Теперь сама форма, выглядеть она будет вот так:

        Код формы необходимо вставить в футере шаблона сайта, например в файле:
        /bitrix/templates/tpl2015/footer.php

        Код вызова компонента формы, вставьте где-нибудь в конце, ближе к закрывающему тэгу </body>

        <!--api:main.feedback-modal-->
        <?$APPLICATION->IncludeComponent(
            "api:main.feedback",
            "modal",
            array(
                "COMPONENT_TEMPLATE" => "modal",
                "IBLOCK_TYPE" => "info",
                "IBLOCK_ID" => "12",
                "INSTALL_IBLOCK" => "N",
                "IBLOCK_ELEMENT_ACTIVE" => "N",
                "DISABLE_SEND_MAIL" => "Y",
                "REPLACE_FIELD_FROM" => "Y",
                "HIDE_FORM_AFTER_SEND" => "Y",
                "UNIQUE_FORM_ID" => "form1",
                "OK_TEXT" => "Спасибо за заказ!<br>В ближайшее время наш менеджер свяжется с вами.",
                "OK_TEXT_AFTER" => "",
                "EMAIL_TO" => "info@site.ru",
                "REDIRECT_PAGE" => "",
                "DISPLAY_FIELDS" => array(
                ),
                "REQUIRED_FIELDS" => array(
                ),
                "CUSTOM_FIELDS" => array(
                    0 => "Ф.И.О@input@type=text@name=FIO@required@data-validation=[NOTEMPTY]@data-validation-label=Ваше имя",
                    1 => "Номер телефона@input@type=text@name=PHONE@required@data-validation=[NOTEMPTY]@data-validation-label=Номер телефона@placeholder=+7(___)___-__-__@data-inputmask='mask': '+7(999)999-99-99'",
                    2 => "Количество@input@type=stepper@name=PRODUCT_COUNT@value=1@class=stepper@data-type=int@data-limit=[1,null]@data-arrow-step=1",
                    3 => "Комментарий к заказу@textarea@name=USER_DESCRIPTION@cols=30@rows=5",
                    4 => "Наименование@input@type=hidden@name=PRODUCT_NAME",
                    5 => "Артикул@input@type=hidden@name=PRODUCT_ID",
                    6 => "Ссылка@input@type=hidden@name=PRODUCT_URL",
                    7 => "Заказ@input@type=hidden@name=ORDER_URL",
                ),
                "ADMIN_EVENT_MESSAGE_ID" => array(
                    0 => "179",
                ),
                "USER_EVENT_MESSAGE_ID" => array(
                ),
                "WRITE_MESS_DIV_STYLE" => "margin:0px 0px 20px 0px;",
                "WRITE_MESS_DIV_STYLE_NAME" => "font-weight:bold;",
                "WRITE_MESS_DIV_STYLE_VALUE" => "",
                "WRITE_MESS_FILDES_TABLE" => "N",
                "WRITE_MESS_TABLE_STYLE" => "border-collapse: collapse; border-spacing: 0;",
                "WRITE_MESS_TABLE_STYLE_NAME" => "max-width: 200px; color: #848484; vertical-align: middle; padding: 5px 30px 5px 0px; border-bottom: 1px solid #e0e0e0; border-top: 1px solid #e0e0e0;",
                "WRITE_MESS_TABLE_STYLE_VALUE" => "vertical-align: middle; padding: 5px 30px 5px 0px; border-bottom: 1px solid #e0e0e0; border-top: 1px solid #e0e0e0;",
                "FORM_CLASS" => "",
                "TITLE_DISPLAY" => "N",
                "FORM_TITLE" => "Заказ в 1 клик",
                "FORM_TITLE_LEVEL" => "2",
                "FIELD_ERROR_MESS" => "#FIELD_NAME# обязательное",
                "EMAIL_ERROR_MESS" => "Указанный E-mail некорректен",
                "DEFAULT_OPTION_TEXT" => "-- Выбрать --",
                "FORM_SUBMIT_CLASS" => "uk-button uk-button-primary uk-width-1-1",
                "FORM_SUBMIT_VALUE" => "Оформить заказ",
                "FORM_SUBMIT_STYLE" => "",
                "BUTTON_TEXT_BEFORE" => "",
                "FORM_TEXT_BEFORE" => "",
                "FORM_TEXT_AFTER" => "<small>Перед оформлением заказа уточняйте наличие товара у менеджеров</small>",
                "HIDE_FIELD_NAME" => "N",
                "HIDE_ASTERISK" => "N",
                "FORM_AUTOCOMPLETE" => "Y",
                "FIELD_BOX_SHADOW_ACTIVE" => "",
                "FIELD_BORDER_ACTIVE" => "",
                "FIELD_SIZE" => "default",
                "FIELD_NAME_POSITION" => "stacked",
                "FORM_LABEL_TEXT_ALIGN" => "left",
                "FORM_LABEL_WIDTH" => "200",
                "TEMPLATE_STYLE" => "uikit",
                "USE_HIDDEN_PROTECTION" => "Y",
                "USE_CAPTCHA" => "N",
                "INCLUDE_JQUERY" => "N",
                "INCLUDE_INPUTMASK" => "Y",
                "INCLUDE_PLACEHOLDER" => "N",
                "INCLUDE_AUTOSIZE" => "N",
                "SCROLL_TO_FORM_IF_MESSAGES" => "N",
                "SCROLL_TO_FORM_SPEED" => "1000",
                "INCLUDE_VALIDATION" => "Y",
                "INCLUDE_ICHECK" => "N",
                "BRANCH_ACTIVE" => "N",
                "SHOW_FILES" => "N",
                "UUID_LENGTH" => "10",
                "UUID_PREFIX" => "",
                "USE_YM_GOALS" => "Y",
                "AJAX_MODE" => "N",
                "AJAX_OPTION_JUMP" => "N",
                "AJAX_OPTION_STYLE" => "Y",
                "AJAX_OPTION_HISTORY" => "N",
                "AJAX_OPTION_ADDITIONAL" => "",
                "USER_AUTHOR_FIO" => "",
                "USER_AUTHOR_NAME" => "",
                "USER_AUTHOR_LAST_NAME" => "",
                "USER_AUTHOR_SECOND_NAME" => "",
                "USER_AUTHOR_EMAIL" => "",
                "USER_AUTHOR_PERSONAL_MOBILE" => "",
                "USER_AUTHOR_WORK_COMPANY" => "",
                "USER_AUTHOR_POSITION" => "",
                "USER_AUTHOR_PROFESSION" => "",
                "USER_AUTHOR_STATE" => "",
                "USER_AUTHOR_CITY" => "",
                "USER_AUTHOR_WORK_CITY" => "",
                "USER_AUTHOR_STREET" => "",
                "USER_AUTHOR_ADRESS" => "",
                "USER_AUTHOR_PERSONAL_PHONE" => "",
                "USER_AUTHOR_WORK_PHONE" => "",
                "USER_AUTHOR_FAX" => "",
                "USER_AUTHOR_MAILBOX" => "",
                "USER_AUTHOR_WORK_MAILBOX" => "",
                "USER_AUTHOR_SKYPE" => "",
                "USER_AUTHOR_ICQ" => "",
                "USER_AUTHOR_WWW" => "",
                "USER_AUTHOR_WORK_WWW" => "",
                "USER_AUTHOR_MESSAGE_THEME" => "",
                "USER_AUTHOR_MESSAGE" => "",
                "USER_AUTHOR_NOTES" => "",
                "INCLUDE_CSSMODAL" => "bootstrap3",
                "MODAL_BUTTON_HTML" => "",
                "MODAL_HEADER_HTML" => "Заказ в 1 клик",
                "MODAL_FOOTER_HTML" => "",
                "SHOW_CSS_MODAL_AFTER_SEND" => "N",
                "SUBJECT" => "Заказ в 1 клик",
                "PAGE_TITLE" => "",
                "PAGE_URI" => "",
                "PAGE_URL" => "",
                "DIR_URL" => "",
                "DATETIME" => "",
                "USE_AGREEMENT" => "N",
                "VALIDATION_MESSAGES" => array(
                    0 => "'default':'$ содержит ошибки.'",
                    1 => "'NOTEMPTY':'$ обязательно.'",
                    2 => "'INTEGER':'$ должно быть целым числом.'",
                    3 => "'NUMERIC':'$ должно быть числом.'",
                    4 => "'MIXED':'$ должно содержать буквы или цифры (без спец. символов).'",
                    5 => "'NAME':'$ обязательно и без спец.символов.'",
                    6 => "'NOSPACE':'$ не должно содержать пробелы.'",
                    7 => "'TRIM':'$ не должно начинаться или заканчиваться пробелом.'",
                    8 => "'DATE':'$ содержит недопустимый формат YYYY-MM-DD.'",
                    9 => "'EMAIL':'$ неверного формата.'",
                    10 => "'URL':'$ неверного формата.'",
                    11 => "'PHONE':'$ неверного формата.'",
                    12 => "'<':'$ должно быть меньше % символов.'",
                    13 => "'<=':'$ должно быть меньше или равно % символам.'",
                    14 => "'>':'$ должно быть больше % символов.'",
                    15 => "'>=':'$ должно быть больше или равно % символам.'",
                    16 => "'==':'$ должно быть равно % символам.'",
                    17 => "'!=':'$ должно быть не равно % символам.'",
                    18 => "",
                ),
                "BCC" => "",
                "FORM_FIELD_WIDTH" => "",
                "YM_COUNTER_ID" => "22413496",
                "YM_TARGET_NAME" => "ONE_CLICK_ORDER",
                "MODAL_WIDTH" => "",
                "MODAL_BUTTON_CLASS" => "uk-button uk-button-danger",
                "SERVER_VARS" => array(
                    0 => "",
                    1 => "",
                ),
                "REQUEST_VARS" => array(
                    0 => "",
                    1 => "",
                ),
                "INCLUDE_CHOSEN" => "N",
            ),
            false
        ); ?>
        <!--api:main.feedback-modal-->

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

        Обратите внимание!
        а) На айдишник формы из настроек компонента, мы его получаем в init.php

        "UNIQUE_FORM_ID" => "form1"

        б) На шаблон формы modal
        Форма открывается во встроенном модальном окне, но если переключить на дефолтный шаблон, то можно форму в любом своем плагине модального окна загрузить, в томже фэнсибоксе

        в) Ну и на список полей формы, часть из них скрыто передает данные о товаре в init.php

        "CUSTOM_FIELDS" => array(
          0 => "Ф.И.О@input@type=text@name=FIO@required@data-validation=[NOTEMPTY]@data-validation-label=Ваше имя",
          1 => "Номер телефона@input@type=text@name=PHONE@required@data-validation=[NOTEMPTY]@data-validation-label=Номер телефона@placeholder=+7(___)___-__-__@data-inputmask='mask': '+7(999)999-99-99'",
          2 => "Количество@input@type=stepper@name=PRODUCT_COUNT@value=1@class=stepper@data-type=int@data-limit=[1,null]@data-arrow-step=1",
          3 => "Комментарий к заказу@textarea@name=USER_DESCRIPTION@cols=30@rows=5",
          4 => "Наименование@input@type=hidden@name=PRODUCT_NAME",
          5 => "Артикул@input@type=hidden@name=PRODUCT_ID",
          6 => "Ссылка@input@type=hidden@name=PRODUCT_URL",
          7 => "Заказ@input@type=hidden@name=ORDER_URL",
        ),

        3) Остается сделать кнопки и js-код, который будет по клику открывать форму

        3.1 Пример кода кнопки в шаблоне компонента bitrix:catalog.element

        <?if($canBuy):?>
        <div class="one-click">
          <span data-target="#API-MF-MODAL-FORM1"
                data-toggle="modal"
                class="uk-button uk-width-1-1 uk-button-large"
                data-id="<?=trim($arResult["XML_ID"])?>"
                data-name="<?=CUtil::JSEscape($arResult["NAME"])?>"
                data-url="<?= ($APPLICATION->IsHTTPS() ? 'https://' : 'http://')?><?=$_SERVER['HTTP_HOST']?><?=$arResult["DETAIL_PAGE_URL"]?>"><?=GetMessage('CT_BCE_CATALOG_ONE_CLICK_BTN')?></span>
        </div>
        <?endif?>

        Т.к. форму запускает плагин Bootstrap3, то html-код кнопки будет таким, а если другой плагин открывает форму, то может отличаться, вам надо как-то сами узнать, как запустить модалку, по идентификатору формы в href или data-атрибуту, но если все как в статье, то должно работать.

        Обратите внимание, какой идентификатор обертки всей формы будет, в верхнем регистре в конце FORM1, если что, найти сможете в исходном коде страницы, когда там форму вставите.

        data-target="#API-MF-MODAL-FORM1"

        Тут я подставляю вместо ID товара его XML_ID

        data-id="<?=trim($arResult["XML_ID"])?>"

        Чтобы в init.php найти товар вот по такому фильтру

        $arIblockFilter = array(
           'IBLOCK_ID' => $IBLOCK_ID,
           '=XML_ID'   => trim($arFields['PRODUCT_ID']),
        );

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

        data-name="<?=CUtil::JSEscape($arResult["NAME"])?>"

        Ну и адрес товара

        data-url="<?= ($APPLICATION->IsHTTPS() ? 'https://' : 'http://')?><?=$_SERVER['HTTP_HOST']?><?=$arResult["DETAIL_PAGE_URL"]?>"><?=GetMessage('CT_BCE_CATALOG_ONE_CLICK_BTN')?></span>

        Вообще, Название и Адрес товара наверно можно и убрать, если уведомления на почту будут отключены, вроде только для почты они были нужны.

        3.2. Пример кода кнопки в шаблоне списка товаров bitrix:catalog.section

        <? if($arElement["CAN_BUY"]):?>
          <?if($arElement['CATALOG_QUANTITY'] > 0): ?>
              <a href="<?=$arElement["ADD_URL"]?>" rel="nofollow" class="uk-button uk-button-primary"><?echo GetMessage("CATALOG_BUY")?></a>
              <span class="one-click uk-button uk-button-link">
                  <span data-target="#API-MF-MODAL-FORM1"
                        data-toggle="modal"
                        data-id="<?=trim($arElement["XML_ID"])?>"
                        data-name="<?=CUtil::JSEscape($arElement["NAME"])?>"
                        data-url="<?= ($APPLICATION->IsHTTPS() ? 'https://' : 'http://')?><?=$_SERVER['HTTP_HOST']?><?=$arElement["DETAIL_PAGE_URL"]?>">Купить быстро</span>
              </span>
          <? else: ?>
            <div class="uk-button">Нет в наличии</div>
          <? endif; ?>
        <? endif; ?>

        Здесь тоже самое.

        Суть кнопок Купить в 1 клик такова:
        Главное кликнуть кнопку и открыть мадалку с формой, все остальное сделает jQuery, возьмет из атрибутов кнопки данные, подставит в скрытые поля формы, а при отправке формы нажатием Оформить заказ значения этих полей полетя в init.php в параметры события и там с ними делать можно все, что угодно, главное их туда отправить с формой.

        3.3. Пример jQuery-кода

        $(function(){

            // ---------------------------------------------------------
            //  one-click()
            // ---------------------------------------------------------
            $('.one-click span').click(function(){
                $('#API-MF-form1 input[name=PRODUCT_NAME]').val($(this).data('name'));
                $('#API-MF-form1 input[name=PRODUCT_URL]').val($(this).data('url'));
                $('#API-MF-form1 input[name=PRODUCT_ID]').val($(this).data('id'));
                $('#API-MF-form1 .uk-alert').removeClass('uk-alert-success').addClass('uk-alert-danger').html('Для повторного заказа обновите страницу.');
            });

        });

        Здесь обратите в внимание на айдишник самой формы #API-MF-form1 он отличается от обертки всей формы с айди  #API-MF-MODAL-FORM1
        Не запутайтесь, там много всяких айдишников и классов, да в разных регистрах, к чему можно привязываться, я это называю «Мега-гибкостью»))

        Ну вроде и все, с виду возможно покажется вам портянкой говнокода, но стоит пару раз так сделать и лучше будете понимать:
        — как запускать модальные окна в списке товаров и в детальном.
        — как передавать с помощью jQuery данные о товаре в форму, в скрытые поля
        — как передавать из формы с помощью скрытых полей данные в init.php
        — как обрабатывать события модуля в init.php


        И на десерт, все обладатели данного модуля TS Умная форма обратной связи могут совершенно бесплатно получить купон на мой новый модуль TS Купить в 1 клик , там уже попроще, но есть ограничения, читайте все в документации к модулю.
        Чтобы получить купон на новый модуль, пришлите на мою почту купон от формы обратной связи, неважно какой, действующий или нет, я вам в ответ отправлю купон от нового модуля.

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

        Вот как подключить интеграцию Jivo c формой приема заказов Bitrix:

        1. Зайдите в раздел “Настройки” в верхнем меню:

        Bitrix бланк заказа

        2. Перейдите в пункт меню “Настройки продукта” -> “Настройки модулей” -> “Интернет-магазин”:

        Bitrix бланк заказа

        3. В поле “E-mail отдела продаж” укажите почту обработки заказов из Jivo. Обратите внимание, что адресов в этом поле можно указать несколько, через запятую.

        Bitrix бланк заказа

        Если панель администрирования Bitrix для вашего сайта выгядит иначе, обратитесь к вебмастеру или компании, которая настраивала систему управления сайтом, они смогут выполнить эти настройки.

        После этого заказы из формы на сайте будут приходить в раздел “Входящие Диалоги” в приложении Jivo.

        Успешной работы!

        Речь пойдёт о новом сконвертированном магазине и новой форме просмотра/редактирования заказа в нём.

        Суть задачи в том, что фотографии товаров хранятся не в привычных свойствах битрикса, а в собственном CDN.

        Получается, что нам нужно как-то вмешаться в рендер таблицы товаров в форме заказа и подменить «Нет фото» на полученные фотографии из CDN.

        Первым делом я, конечно, написал техническую поддержку 1С-Битрикс с вопросом: есть ли такая возможноть. На что проследовал ответ:

        1С-Битрикс. Модифицирование таблицы товаров в форме заказа в админке

        На самом деле ответ был предсказуем. Тп не всегда компетентна в новом функционале.

        Что ж, можно забить и наговнокодить на том же jquery: при загрузке подменять ячейки таблицы с картинками на свои.

        Но я обычно надеюсь, что разработчики всё-таки предусматривают расширение функционала партнёрами и это просто не документировано. За подсказками сходим в код страницы формы заказа. Ура, такая возможность нашлась :) Выглядит она в виде метода BX.Sale.Admin.OrderEditPage.registerFieldsUpdaters()

        Нам остаётся написать и подвесить наш класс-обработчик на 2 события OnAdminSaleOrderView и OnAdminSaleOrderEdit. В нём мы получим адреса картинок и заменим их в объекте данных с товарами. Код обработчика ниже.

        Класс обработчика

        <?php
        ya@olegpro.ru
        namespace OlegproHandlerAdmin;
        use CatalogHelper;
        use BitrixSaleOrder;
        use BitrixMainLoader;
        use BitrixSaleBasketItem;
        use BitrixMainPageAsset;
        use BitrixMainPageAssetLocation;
        use BitrixMainWebJson;
        class OrderPage
        {
         @param 
        public static function onAdminSaleOrder($id)
        {
         @var 
        if (
        $id <= 0
        || !(Loader::includeModule('sale') && Loader::includeModule('iblock'))
        || ($order = Order::load($id)) === null
        ) {
        return;
        }
        $productsData = [];
         @var 
        foreach ($order->getBasket()->getBasketItems() as $basketItem) {
        $productsData[$basketItem->getProductId()] = [];
        }
        if (sizeof($productsData) <= 0) {
        return;
        }
        $elementIterator = CIBlockElement::GetList(
        [],
        [
        'ID' => array_keys($productsData),
        ],
        false,
        false,
        [
        'ID',
        'IBLOCK_ID',
        'PROPERTY_NOMCODE'
        ]
        );
        while ($element = $elementIterator->Fetch()) {
        $productsData[$element['ID']]['IMAGE'] = CatalogHelper::getProductPicture(
        $element['PROPERTY_NOMCODE_VALUE'],
        'h100',
        false, [
        'width' => 80,
        'height' => 80
        ]
        );
        }
        Asset::getInstance()->addString(
        "<script>
        BX.ready(function () {
        BX.Sale.Admin.OrderEditPage.registerFieldsUpdaters({
        'BASKET': function (basket) {
        if (!!basket.ITEMS) {
        var customDataProducts = " . Json::encode($productsData) . " || {};
        if (customDataProducts) {
        for(var i in basket.ITEMS) {
        if(basket.ITEMS.hasOwnProperty(i)) {
        if (
        !!customDataProducts[basket.ITEMS[i].PRODUCT_ID]
        && !!customDataProducts[basket.ITEMS[i].PRODUCT_ID].IMAGE
        && !!customDataProducts[basket.ITEMS[i].PRODUCT_ID].IMAGE.src
        ) {
        basket.ITEMS[i].PICTURE_URL = customDataProducts[basket.ITEMS[i].PRODUCT_ID].IMAGE.src;
        }
        }
        }
        }
        }
        }
        });
        });
        </script>",
        AssetLocation::AFTER_JS
        );
        }
        }

        Функция CatalogHelper::getProductPicture как раз и возвращаем нам адрес картинки из CDN по артикулу товара.

        Сохраняем класс-обработчика в файл /local/php_interface/classes/handler/admin/OrderPage.php

        Добавляем в /local/php_interface/init.php

        BitrixMainLoader::registerAutoLoadClasses(null, array(
        'OlegproHandlerAdminOrderPage' => '/local/php_interface/classes/handler/admin/OrderPage.php',
        ));
        $eventManager = BitrixMainEventManager::getInstance();
        $eventManager->addEventHandler(
        'main',
        'OnAdminSaleOrderView',
        ['OlegproHandlerAdminOrderPage', 'onAdminSaleOrder']
        );
        $eventManager->addEventHandler(
        'main',
        'OnAdminSaleOrderEdit',
        ['OlegproHandlerAdminOrderPage', 'onAdminSaleOrder']
        );

        Здесь мы добавляем класс в автозагрузку и начинаем слушать 2 события.

        Похожие записи

        1C-Битрикс. Кастомизация нового шаблона компонента sale.order.ajax

        С выходом нового шаблона компонента sale.order.ajax на форумах битрикса разгораются возмущения и недомения. Мол, теперь код всего шаблона на JavaScript и как его кастомизировать непонятно. На самом деле да, код js-скрипта составляет почти семь тысяч строк. Сходу в таком количестве кода, даже хорошо написанного (к сожалению, битрикс этим не балует), соблюдая паттерны программирования, будет непросто.

        В этой заметке я покажу способ, как можно кастомизировать основной скрипт логики шаблона оформления заказа (order_ajax.js), не прибегая к его правке. Что нам это даёт? Когда прилетят очередные обновления шаблона, мы просто заменим его и всё. Все наши кастомизации будут работать (в теории).

        Итак, поехали!

        1С-Битрикс. Пишем человеческий шаблон многоуровнего меню каталога

        Не буду писать про боль при интегации дефотного шаблона. Давайте просто напишем свой, с блекджеком и вот этим всем.

        В заметке будет (интересного):

        • построение древовидного массива без рекурсии (неограниченной вложенности)
        • анонимная рекурсивная функция
        • формирование урлов для секций супер-быстрым способом
        • поработаем с сущностями инфоблока через ORM D7

        Дальше много кода.

        Добавить комментарий


        Adblock
        detector