8 (800) 302-62-68
+7 (499) 348-29-58
sale@rbs-crm.ru

Документация разработчика

Интеграция API (XML)

Встроенное API позволяет обмениваться данными Системы с любым сторонним приложением в формате XML.

Например, с помощью API можно сделать интеграцию с:

  • Мобильным приложением (iPhone, Android),
  • Сайтом
  • Интернет-магазином
  • АТС
  • Биллингом
  • Программой «1С»
  • Личным кабинетом клиентов или партнера
  • Телеграм-ботом
  • И т.д.

Подключение к API

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

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

API интерфейс работает по адресу:

https://client__.rbs360.ru/api/xml/

Все запросы к API отправляются в POST.

Структура запроса отражает структуру данных объектов в «Конфигурации» кроме служебных объектов.

Для работы с API можно использовать вспомогательный класс на PHP. Подробное описание класса см. ниже.

Методы для работы с данными

  • Чтение
  • Редактирование
  • Добавление
  • Удаление
  • Стирание
  • Вспомогательные методы

Общий синтаксис запросов

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

Каждый запрос представлен тегом. Тег всегда должен иметь параметр type (list, edit и т. д.), в котором необходимо передать корректный тип запроса.

Также можно передать в качестве атрибута тега параметр «uid», несущий в себе уникальный идентификатор запроса. В это случае, при ответе системы этот идентификатор будет возвращен (это удобно для внутреннего различения запросов внутри системы). Если идентификатор не передан, он будет сгенерирован автоматически.

Пример запроса:

<?xml version="1.0" encoding="utf8" ?>
<request>
<action type="edit" uid="80085">
  …
</action>
</request>

Сессия и авторизация

Авторизация в системе производится запросом типа «auth». При этом, если указаны верные данные, система сгенерирует и вернет 64-символьный идентификатор сессии. Этот идентификатор необходимо в передавать системе в последующих запросах в заголовке в виде Cookie с названием «sess_id».

Запрос на авторизацию:

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="auth" uid="80085">
        <login>my_login</login>
        <password>my_password</password>
    </action>
</request>

Ответ системы:

<?xml version="1.0" encoding="utf8" ?>
<response>
    <action type="auth" uid="80085">
        <sess_id>
            646C57622DA4C91D027624F0426CC18478795291E1574F1A6C20BDC185D8B749
        </sess_id>
    </action>
</response>

Возможные ошибки авторизации:

  • 1 — AUTH_SUCCESS
  • 2 — AUTH_ALREADY_AUTHORIZED
  • 3 — AUTH_INCORRECT_PARAMS
  • 4 — AUTH_INCORRECT_LOGIN
  • 5 — AUTH_INCORRECT_PASSWORD
  • 6 — AUTH_REQUIRE_CAPTCHA
  • 7 — AUTH_INCORRECT_CAPTCHA
  • 8 — AUTH_LOGIN_BLOCKED
  • 9 — AUTH_SAAS_USER_LIMIT
  • 10 — AUTH_INCORRECT_ONLY_LOWER

Чтение данных

Чтение данных имеет тип «list». Каждая запрашиваемая структура должна быть обернута в тег с параметрами:

  • «name» — названием структуры
  • «id» (необязательно) — уникальный идентификатор запрашиваемой структуры (указание равносильно фильтрации по ключевому полю, см. ниже).

Пример:

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="list" uid="80085">
        <structure name="references.companies">
            ...
        </structure>
    </action>
</request>

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

Чтение определенных полей объекта

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

Пример:

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="list" uid="80085">
        <structure name="references.companies">
            <fields>
                <id />
                <name />
                <date />
            </fields>
        </structure>
    </action>
</request>

Ответ системы:

<?xml version="1.0" encoding="utf8" ?>
<response>
    <action type="list" uid="80085">
        <structure name="references.companies" id="1">
            <fields>
                <id>1</id>
                <name>ООО "Apple"</name>
                <date>01.04.1976</date>
            </fields>
        </structure>
        ...
    </action>
</response>

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

Пример: выберем номер счета и его табличную часть (название номенклатуры и количество)

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="list" uid="80085">
        <structure name="documents.orders">
            <fields>
                <number />
                <products>
                    <structure>
                        <fields>
                            <name />
                            <number />
                        </fields>
                    </structure>
                </products>
            </fields>
        </structure>
    </action>
</request>
Фильтрация вывода данных

Для фильтрации (отбора) объекта используется  тег «filters». Т.к. к выборке объектов можно применить сразу несколько фильтров (выполняется условие «И»), то используется вложенный тег «filter».

Состав тега:

  • field — название поля
  • operation — вид условия (>, =, <, like и т. д.)
  • value — значение

Пример: вывести счета с суммой больше 10000

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="list" uid="80085">
        <structure name="documents.orders">
            <fields>
                <number />
            </fields>
            <filters>
                <filter>
                    <field>total</field>
                    <operation>></operation>
                    <value>10000</value>
                </filter>
            </filters>
        </structure>
    </action>
</request>

Пример: вывести счета с суммой больше 10000 и с номерами больше 10

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="list" uid="80085">
        <structure name="documents.orders">
            <fields>
                <number />
            </fields>
            <filters>
                <filter>
                    <field>total</field>
                    <operation>></operation>
                    <value>10000</value>
                </filter>
                <filter>
                    <field>number</field>
                    <operation>></operation>
                    <value>10</value>
                </filter>
            </filters>
        </structure>
    </action>
</request>

При фильтрации по полю типа «указатель» (pointer), например по «Контрагенту», в поле value указывается значение id «Контрагента»:

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="list" uid="80085">
        <structure name="documents.orders">
            <fields>
                <number />
            </fields>
            <filters>
                <filter>
                    <field>owner</field>
                    <operation>=</operation>
                    <value>777</value>
                </filter>
            </filters>
        </structure>
    </action>
</request>

Условие «ИЛИ» применить между фильтрами нельзя.

Упорядочивание вывода данных

Чтобы отсортировать вывод по определенному «полю» используйте тег «order».

Состав тега:

  • field — названия поля
  • type — тип упорядочивания

Типа упорядочивания:

  • ASC — по возрастанию
  • DESC — по убыванию.

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

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="list" uid="80085">
        <structure name="references.companies">
            <fields>
                <name />
            </fields>
            <orders>
                <order>
                    <field>date</field>
                    <type>DESC</type>
                </order>
            </orders>
        </structure>
    </action>
</request>
Ограничение вывода данных

Для ограничения количества вывода записей используется тег «limits». Тег обычно используется для по страничного выводу данных.

Состав тега:

  • first — смещение относительно начала, то есть сколько объектов нужно пропустить
  • number — количество извлекаемых объектов

Пример: вывести не более 100 контрагентов, начиная с первого (нулевого) элемента

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="list" uid="80085">
        <structure name="references.companies">
            <fields>
                <name />
            </fields>
            <limit>
                <first>0</first>
                <number>100</number>
            </limit>
        </structure>
    </action>
</request>

Редактирование

Для редактирования объектов используется синтаксис чтения (описанный выше) и передавайте внутри наследников тега необходимые значения.

Пример: поменять поле «Должность» у «Сотрудника» с id=25 на «Генеральный директор»

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="edit" uid="80085">
        <structure name="references.employees" id="25">
            <fields>
                <position>Генеральный директор</position>
            </fields>
        </structure>
    </action>
</request>

При успешном выполнении запроса система вернет:

<?xml version="1.0" encoding="utf8" ?>
<response>
    <action type="edit" uid="80085">
        <result>true</result>
    </action>
</response>

В случае ошибки при выполнении запроса в ответе от Системы будет описание ошибки в теге «error».

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

Пример: в «Номенклатуре» с id=100 установим страну, найденную по имени. Важно, чтобы фильтр страны по имени вернул только 1 объект (нужно использовать тег «limit»)

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="edit">
        <structure name="references.products" id="100">
            <fields>
                <country>
                    <structure name="references.countries">
                        <filters>
                            <filter>
                                <field>name</field>
                                <operation>=</operation>
                                <value>Китай</value>
                            </filter>
                        </filters>
                    </structure>
                </country>
            </fields>
        </structure>
    </action>
</request>

Если необходимо взять из справочника другое поле (не id), например поле «code» из справочника «Страна»:

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="edit">
        <structure name="references.products" id="100">
            <fields>
                <country>
                    <structure name="references.countries">
                        <field>code</field>
                        <filters>
                            <filter>
                                <field>name</field>
                                <operation>=</operation>
                                <value>Китай</value>
                            </filter>
                        </filters>
                    </structure>
                </country>
            </fields>
        </structure>
    </action>
</request>
Редактирование табличных частей

Пример: все «Номенклатуры» в табличной части «Счета» (с id=100) с названием «Молоко» изменят название на «Хлеб».

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="edit">
        <structure name="documents.orders" id="100">
            <fields>
                <products>
                    <structure name="products">
                        <fields>
                            <name>Хлеб</name>
                        </fields>
                        <filters>
                            <filter>
                                <field>name</field>
                                <operation>=</operation>
                                <value>Молоко</value>
                            </filter>
                        </filters>
                    </structure>
                </products>
            </fields>
        </structure>
    </action>
</request>
Добавление в табличную часть

Пример: в табличную часть «Номенклатура» документа «Счет» добавить позицию «Морковь»

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="edit">
        <structure name="documents.orders" id="100">
            <fields>
                <products>
                    <structure name="products" type="add">
                        <fields>
                            <name>Морковь</name>
                        </fields> 
                    </structure>
                </products>
            </fields>
        </structure>
    </action>
</request>
Стирание табличной части

(уточняется)

Добавление объекта

Для добавления используется метод «add».

Чтобы созданный объект бы не помечен на удаление (серым), поле visible надо присваивать значение «1».

Важно: для добавления по API объекта типа «Документ» (documents) необходимо в запросе в самом начале списка полей указывать поля «number» и «date», иначе возникнет ошибка.

Пример: добавить «Счет» с номером «2 » и одной позицией в табличной части «Номенклатура» с названием «Капуста»

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="add">
        <structure name="documents.orders">
            <fields>
                <number>2</number>
                <visible>1</visible>
                <products>
                    <structure name="products">
                        <fields>
                            <name>Капуста</name>
                        </fields> 
                    </structure>
                </products>
            </fields>
        </structure>
    </action>
</request>

Пример: добавить новую «папку» в справочнике «Номенклатура»

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="add">
        <structure name="references.products">
            <fields>
                <is_group>1</is_group>
                <name>Тестовая папка</name>
                <visible>1</visible>
                <parent>0</parent>
            </fields>
        </structure>
    </action>
</request>

Для добавления сразу нескольких объектов в одном запрос необходимо использовать вложенность структуры (structure).

Пример: добавим 2 контрагента за один запрос

<?xml version="1.0" encoding="utf8"?> 
<request>
    <action type="add">
        <structure name="references.companies">
            <fields>
                <name>Петр</name>
                <visible>1</visible>
            </fields>
        </structure>	
        <structure name="references.companies">
            <fields>
                <name>Иван</name>
                <visible>1</visible>
            </fields>
        </structure>
    </action>
</request>

Ответ системы:

<response>
    <action type="add" uid="64d75d54200ca">
        <structure>
            <status>true</status>
            <id>1</id>
        </structure>
        <structure>
            <status>true</status>
            <id>2</id>
        </structure>
    </action>
</response>

Где «id» = ID нового созданного объекта.

Удаление объекта (помещение в корзину, пометка на удаление объекта)

Для удаления объекта используйте синтаксис ниже. Обязательно нужно указывать ID объекта. Можно удалить сразу несколько объектов.

Пример: удалить сотрудника с id=25

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="del" uid="80085">
        <structure name="references.companies" id="3">
        </structure>
        <structure name="references.companies" id="25">
        </structure>
    </action>
</request>

Помеченный объект на удаление можно восстановить, поменяв у  объекта поле visible на «1».

Важно:

Стирание объекта (полное удаление из корзины)

Для стирания используйте синтаксис ниже. Обязательно нужно указывать ID объекта. Можно стереть сразу несколько объектов.

Пример: стереть (удалить) сотрудника с id=25

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="wipe" uid="80085">
        <structure name="references.employees" id="25">
        </structure>
    </action>
</request>

Важно:

  • При вызове этого метода Система не проверяет зависимости объектов
  • Если вы хотите пометить объект на удаление (сделать его серым в списке), то нужно полю visible присвоить значение «0» (ноль) или воспользоваться методом del.

Вспомогательные методы

Получение списка всех объектов системы

Пример:

<?xml version='1.0' encoding='utf8'?>
<request>
    <action type='getAllStructures' uid='80085'>
    </action>
</request>

Результат:

<?xml version='1.0' encoding='utf8' ?>
<response>
    <action type='getAllStructures' uid='80085'>
        <structures>
            <structure name='documents.business_trip' en='' ru='Командировки'>
            </structure>
            <structure name='positions.table_43' type='set' en='' ru='Билеты'>
            </structure>
            ...
        </structures>
    </action>
</response>
Получить структуру объектов системы

Вывод происходит с учетом вложенные табличных частей «Объекта».

Пример:

<?xml version='1.0' encoding='utf8'?>
<request>
    <action type='getStructure' uid='80085'>
        <structures>
            <name>documents.orders</name>
        </structures>
    </action>
</request>

Результат:

<?xml version='1.0' encoding='utf8' ?>
<response>
  <action type='getStructure' uid='80085'>
    <structures>
      <structure name='documents.orders' en='' ru='Счета'>
        <fields>
            <date type='date' en='' ru='Дата'>
            </date>
            <id type='numeric' en='' ru='id'>
            </id>
            ...
            <products type='set'>
              <structure name='positions.table_1' en='Products' ru='Номенклатура'>
                <fields>
                    <name type='varchar' en='' ru='Наименование'>
                    </name>
                    <id type='numeric' en='' ru=''>
                    </id>
                    <visible type='boolean' en='' ru=''>
                    </visible>
                    <owner type='delayed' object='documents.orders' en='' ru='Счет'>
                    </owner>
                    <product type='pointer' object='references.products' en='' ru='Номенклатура'>
                    </product>
                    ...
                </fields>
              </structure>
            </products>
            ...
        </fields>
      </structure>
    </structures>
  </action>
</response>
Получение изображения

Изображение возвращается в base64.

Для получения изображения поле в «Объекте» должно быть типа «Указатель» (Pointer) на объект «References.images».

Пример: получить имя и фотографию сотрудников

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="list" uid="80085">
        <structure name="references.employees">
            <fields>
                <name />
                <photo/>
            </fields>
        </structure>
    </action>
</request>

Результат:

<response>
    <action type="list" uid="80085">
        <structure name="references.employees" key="2">
            <fields>
                <name>Дмитрий И.</name>
                <photo>LzlqLzRBQVFTa1pKUmdBQkFRRUEzQURjQUFELzJ3QkRBQWdHQ...</photo>
            </fields>
        </structure>
    </action>
</response>
Запросить время на сервере

Пример:

<?xml version='1.0' encoding='utf8' ?>
<request>
    <action type='getDatetime' uid='80085'>
        <format>d.m.Y H:i:s</format>
    </action>
</request>

Результат:

<?xml version='1.0' encoding='utf8' ?>
<response>
  <action type='getDatetime' uid='80085'>
    <result>2022-09-02 14:03:15</result>
  </action>
</response>
Прикрепление файла

Прикрепление файла к определенному объекту.

Пример: прикрепить файл с именем «file.txt» c содержанием «Text file» в документ «Ремонт» с id=1

<?xml version='1.0' encoding='utf8' ?>
<request>
    <action type='fileAdd' uid='80085'>
        <structure name='documents.repair' id='1'>
            <fields>
                <name>file.txt</name>
                <content>Text file</content>
            </fields>
        </structure>
    </action>
</request>
Прикрепление изображения

Для добавления изображения к «Объекту» необходимо выбрать доступный «Тип изображения» (../settings/references/image_types), а также указать полное название объекта, его ID и поле с типом references.images (например: photo). Само изображение должно передаваться в base64.

Важно: При отправке запроса «imagesUploads» в header запроса необходимо передавать все cookies, получение при запросе авторизации в API.

Пример:

<?xml version='1.0' encoding='utf8' ?>
<request>
    <action type='imagesUploads' uid='80085'>
        <structure name='references.products' id='7'>
            <field>photo</field>
            <type>products</type>
            <content>iVBORw0KGgoAAAANSUhEUgAAAIwAAAAvCAYAAAAxSCJ+AAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAA2ZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuMy1jMDExIDY2LjE0NTY2MSwgMjAxMi8wMi8wNi0xNDo1NjoyNyAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD0ieG1wLmRpZDozQzE4QzdBODdDNDRFODExOUI4N0Y0OTQzOTgyQTE0RiIgeG1wTU06RG9jdW1lbnRJRD0ieG1wLmRpZDpGODE2MzZGMjQ0N0UxMUU4QTM0NEM2RUYzNzlBNEE4NCIgeG1wTU06SW5zdGFuY2VJRD0ieG1wLmlpZDpGODE2MzZGMTQ0N0UxMUU4QTM0NEM2RUYzNzlBNEE4NCIgeG1wOkNyZWF0b3JUb29sPSJBZG9iZSBQaG90b3Nob3AgQ1M2IChXaW5kb3dzKSI+IDx4bXBNTTpEZXJpdmVkRnJvbSBzdFJlZjppbnN0YW5jZUlEPSJ4bXAuaWlkOjNDMThDN0E4N0M0NEU4MTE5Qjg3RjQ5NDM5ODJBMTRGIiBzdFJlZjpkb2N1bWVudElEPSJ4bXAuZGlkOjNDMThDN0E4N0M0NEU4MTE5Qjg3RjQ5NDM5ODJBMTRGIi8+IDwvcmRmOkRlc2NyaXB0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</content>
        </structure>
    </action>
</request>

Результат:

<response>
    <action type="imagesUploads" uid="80085">
        <structure>
            <status>1</status>
        </structure>
    </action>
</response>
Запрос цены и остатка товара

Пример:

<?xml version="1.0" encoding="utf8" ?>
<request>
    <action type="getProductPriceStock" uid="80085">
        <prod_id>777</prod_id>
        <prod_price_id>1</prod_price_id>
        <prod_stock_id>2</prod_stock_id>
    </action>
</request>

Где:

  • prod_id — id «Номенклатуры» (товара)
  • prod_price_id — id «Типа цены»
  • prod_stock_id — id «Склада»

Результат:

<action type="getProductPriceStock" uid="80085">
    <price>100</price>
    <stock>10</stock>
</action>
</response>

Где:

  • price — цена «Номенклатуры» (товара) в рублях, соответствующая запрошенному «Типу цен»
  • stock — остаток «Номенклатуры» (товара) на запрошенном «Складе»

Экранирование специальных символов

Для экранирования специальных символов типа «<» и «>» необходимо обернуть вышеперечисленные символы в конструкцию:

<![CDATA[что-то]]>

Пример: Отобрать документы «Счета» с «Датой» больше (>) 01.01.2022

<request>
    <action type="list" uid="80085">
        <structure name="documents.orders">
            <fields>
                <number />
            </fields>
            <filters>
                <filter>
                    <field>date</field>
                    <operation><![CDATA[>]]></operation>
                    <value>2022-01-01</value>
                </filter>
            </filters>
        </structure>
    </action>
</request>

Универсальный класс на PHP для доступа к API

Класс доступен по ссылке.

Авторизация

Для начала работы с классом необходимо создать подключение к Системе.

Пример:

$api = new Xml_api(string $url, string $login, string $password);

Где:

  • url — Полный путь к API. Например: «https://mycrm.ru/api/xml»
  • login — логин пользователя в программе
  • password — пароль пользователя в программе
Выборка данных
select(string $structure [array $fields = array()], [array $filters = array()]);

Где:

  • structure — название структуры
  • fields — массив полей, для выборки полей используется следующий синтаксис:
    array("id", "name", "surname")
  • filters — массив фильтров, для фильтрации результатов, используется следующий синтаксис:
    array(array("field"=>"id", "operation"=>"=", "value"=>"1"))
Добавление данных
add(string $structure, [array $fields]);

Где:

  • structure — название структуры
  • fields — массив полей, для добавления значения полей используется следующий синтаксис:
    array("name" => "Вася", "surname" => "Петров")

Важно: не рекомендуется задавать явно поле «id», поскольку это первичный ключ, система поддерживает работу с этим поле самостоятельно.

Редактирования данных
update(string $structure, [array $fields = array()], [array $filters = array()]);

Где:

  • structure — название структуры
  • fields — массив полей, для добавления значения полей используется следующий синтаксис:
    array("name"=>"Вася"', "surname"=>"Петров")
  • filters — массив фильтров, для фильтрации изменяемых полей, используется следующий синтаксис:
    array (array("field" => "id", "operation" => "=", "value" => "1"))

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

Пример создания сделки в системе с помощью вспомогательного класса

В примере используется готовый PHP-класс, доступный по ссылке.

<?php
    // Подключаем класс (https://github.com/rbs360/API-XML)
    require_once("xrm_xml_api.php");
    
    // Авторизация (Адрес системы, логин, пароль от пользователя системы у которого стоит флаг "Доступ по API")
    $xml_instance = new Xml_api("http://___URL___/api/xml", "___LOGIN___", "___PASSWORD___"); 
    
    // cоздание нового контрагента 
    $xrm_copmany = $xml_instance->add("references.companies", array(
    "date"             => date("Y-m-d",time()),
    "email"            => "info@rbs-crm.ru",
    "name"            => "Рога и копыта",
    "phone"            => "74997056975",
    "city"            => "Москва",
    "visible"         => 1,
    "responsible"    => 2,
    "type"            => 1)
    );
    
    // Получаем ID нового контрагента
    $xrm_company_id = $xrm_copmany->action->id;
    
    if($xrm_company_id > 0){
        // cоздание контакного лица
        $xrm_insert_contact = $xml_instance->add("references.contacts", array(
        "owner"          => $xrm_company_id,
        "name"           => "Иван Петров",
        "first_name"     => "Иван",
        "surname"        => "Петров",
        "position"       => "Менеджер",
        
        "phone"          => "74997056975",
        "email"          => "info@rbs-crm.ru",
        "responsible"    => 2, 
        "visible"        => 1)
        );
        
        // Получаем ID нового контактного лица
        $xrm_contact_id = $xrm_insert_contact->action->id;
        
        // Создание нового юр лица            
        $xrm_insert_details = $xml_instance->add("references.companies_details", array(
        "owner"        => $xrm_company_id,
        "name"         => "ООО Рога и копыта",
        "visible"      => 1)
        );
        
        // Создание новой сделки    
        $xrm_insert_deal = $xml_instance->add(
        "documents.deals",
        array(
        "owner"           => $xrm_company_id,
        "date"            => date("Y-m-d H:i:s", time()),
        "expected_date_close" => date("Y-m-d H:i:s", time()),
        "name"            => "Название сделки",
        "description"     => "Описание сделки",
        "funnel_sales"    => 1,
        "deals_result"    => 3,
        "total"           => 10000,
        
        "responsible"     => 2,
        "currency"        => 1,
        "stage"           => 2,
        
        "contact"         => $xrm_contact_id,
        "phone"           => "74997056975",
        "mobile"          => "79117056975",
        "email"           => "info@rbs-crm.ru",
        
        // UTM
        "utm_source"      => "yandex",
        "utm_campaign"    => "my",
        "utm_medium"      => "rbs1",
        "utm_term"        => "crm",
        
        "visible"        => 1)
        );
        
        echo "Сделка успешно создана!";
    }
?>

Результат:

При успешном выполнении кода в Системе создадутся «Контрагент», «Юридическое лицо», «Контактное лицо» и «Сделка. Все объекты будут связаны между собой.

Если необходима проверка на дубли «Контрагента», то для этого нужно сделать дополнительный запрос чтения Контрагентов по фильтру, например по полю «Наименование» или «Телефон».