Сделки¶
Запрос к внешнему сервису¶
Для взаимодействия с внешними сервисами используется операция «Запрос к внешнему сервису». Операция доступна как в сценариях сделки, так и в действиях перехода.
Данные отправляются POST-запросом, в формате JSON, в теле. Набор полей тот же, что и в карточке сделки.
{
    "class": "BumsTradeM_Deal",
    "id": 3,
    "data": {
        "deal": {
            "Id": "3",
            "GUID": "",
            "Name": "№1",
            "Description": "",
            "Contractor": {
                "Id": 1000000,
                "Name": "Тестов Тест"
            },
            ...
        }
    }
}
Если вы хотите обновить данные сделки, сервис должен вернуть данные в формате JSON. Набор полей, как в запросе на редактирование сделки. Если сервис вернёт некорректный JSON, то изменения не вступят в силу, а сообщение об ошибке будет записано в log.
{
    "Model": {
        "Description": "some new value"
    },
    "Positions": [
        {
            "Price": {
                "Value": 42,
                "CurrencyId": 1,
                "Rate": 1
            },
            "OfferId": 51
        },
        {
            "Price": {
                "Value": 43,
                "CurrencyId": 1,
                "Rate": 1
            },
            "OfferId": 52
        }
    ]
}
Задача для примера: При переходе сделки и состояния «Оформление заказ» в состояние «Предоплата», цены товаров должны обновляться из сторонней системы.
1. Добавляем схему «Продажа товаров» из готовых схем¶
Подробности создания схемы есть в справке Мегаплана.
 
2. Реализуем внешний сервис¶
Для имитации внешнего сервиса, будем использовать Google Apps Script в режиме Web-приложения. Скрипт получит данные от Мегаплана и возвратит позиции сделок с обновленными ценами. Данные придут в формате карточки сделки, а результат будет отправлен в формате запроса на редактирование сделки.
Скрипт пересоздает первую позицию с переданным товаром и новой ценой (остальные позиции удалятся).
function doPost(e) {
  if (typeof e !== 'undefined')
    return ContentService.createTextOutput(
      JSON.stringify(
        createAnswer(
          JSON.parse(e.postData.contents)
        )
      )
    );
}
function createAnswer(request) {
  return {
    "Positions": [
      {
        "OfferId": request.data.deal.Positions[0].Offer.Id,
        "Price": {
          "Value": 42
        }
      }
    ]
  };
}
3. Создаем действие¶
К переходу из состояния «Оформление заказ» в состояние «Предоплата», добавляем действие «Запрос к внешнему сервису». Адресом для запроса указываем адрес нашего google script. Например, https://script.google.com/macros/s/AKfycbzk8G5RrOJAHu21V4t7XXbDqoowsrgSkWWGPv1oodQkiB3kQO/exec
 
4. Создаем сделку¶
Создаем сделку с одной позицией и ценой, например, 110 руб.
 
5. Результат¶
Переводим сделку в состояние «Предоплата» и наблюдаем обновленную цену.
