├── .gitattributes ├── .gitignore ├── LICENSE ├── README.md ├── assets ├── bitrix24-logo-social.png └── bitrix24-logo.png ├── composer.json └── src └── App └── Bitrix24 ├── Activity.php ├── Bitrix24API.php ├── Bitrix24APIException.php ├── Catalog.php ├── Company.php ├── Contact.php ├── Deal.php ├── Disk.php ├── Lead.php ├── Product.php ├── ProductRow.php ├── ProductSection.php ├── Task.php └── User.php /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea/ 2 | examples/ 3 | logs/ 4 | 5 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2019-2022 andrey-tech 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Bitrix24 API PHP Wrapper 2 | 3 | ![Bitrix24 logo](assets/bitrix24-logo.png) 4 | 5 | [![Latest Stable Version](https://poser.pugx.org/andrey-tech/bitrix24-api-php/v)](https://packagist.org/packages/andrey-tech/bitrix24-api-php) 6 | [![Total Downloads](https://poser.pugx.org/andrey-tech/bitrix24-api-php/downloads)](https://packagist.org/packages/andrey-tech/bitrix24-api-php) 7 | [![GitHub stars](https://img.shields.io/github/stars/andrey-tech/bitrix24-api-php)](https://github.com/andrey-tech/bitrix24-api-php/stargazers) 8 | [![GitHub forks](https://img.shields.io/github/forks/andrey-tech/bitrix24-api-php)](https://github.com/andrey-tech/bitrix24-api-php/network) 9 | [![GitHub watchers](https://img.shields.io/github/watchers/andrey-tech/bitrix24-api-php)](https://github.com/andrey-tech/bitrix24-api-php/watchers) 10 | [![License](https://poser.pugx.org/andrey-tech/bitrix24-api-php/license)](https://packagist.org/packages/andrey-tech/bitrix24-api-php) 11 | 12 | Обертка на PHP7+ для работы с [REST API Битрикс24](https://dev.1c-bitrix.ru/rest_help/) с использованием механизма [входящих вебхуков](https://dev.1c-bitrix.ru/learning/course/index.php?COURSE_ID=99&LESSON_ID=8581), 13 | троттлингом запросов и логированием в файл. 14 | 15 | Разработчики на JavaScript могут воспользоваться классом-оберткой [andrey-tech/bx24-wrapper-js](https://github.com/andrey-tech/bx24-wrapper-js). 16 | 17 | # Содержание 18 | 19 | 20 | 21 | - [Требования](#%D0%A2%D1%80%D0%B5%D0%B1%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F) 22 | - [Установка](#%D0%A3%D1%81%D1%82%D0%B0%D0%BD%D0%BE%D0%B2%D0%BA%D0%B0) 23 | - [Класс `Bitrix24API`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-bitrix24api) 24 | - [Базовые методы класса](#%D0%91%D0%B0%D0%B7%D0%BE%D0%B2%D1%8B%D0%B5-%D0%BC%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0) 25 | - [Дополнительные параметры](#%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B) 26 | - [Методы для работы с сущностями Битрикс24](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%81%D1%83%D1%89%D0%BD%D0%BE%D1%81%D1%82%D1%8F%D0%BC%D0%B8-%D0%91%D0%B8%D1%82%D1%80%D0%B8%D0%BA%D1%8124) 27 | - [Методы работы со сделками](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%BA%D0%B0%D0%BC%D0%B8) 28 | - [Методы для работы с контактами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D0%B0%D0%BC%D0%B8) 29 | - [Методы для работы с компаниями](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8) 30 | - [Методы для работы с каталогами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%D0%BC%D0%B8) 31 | - [Методы для работы с товарами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D0%BC%D0%B8) 32 | - [Методы работы с разделами товаров](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2) 33 | - [Методы работы с товарными позициями](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BD%D1%8B%D0%BC%D0%B8-%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F%D0%BC%D0%B8) 34 | - [Методы для работы с пользователями](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8) 35 | - [Методы работы с задачами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC%D0%B8) 36 | - [Методы для работы с делами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B4%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8) 37 | - [Методы для работы с диском](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%BC) 38 | - [Методы для работы с лидами](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BB%D0%B8%D0%B4%D0%B0%D0%BC%D0%B8) 39 | - [Вспомогательные классы](#%D0%92%D1%81%D0%BF%D0%BE%D0%BC%D0%BE%D0%B3%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D1%8B) 40 | - [Класс `HTTP`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-http) 41 | - [Дополнительные параметры](#%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-1) 42 | - [Примеры](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B) 43 | - [Класс `DebugLogger`](#%D0%9A%D0%BB%D0%B0%D1%81%D1%81-debuglogger) 44 | - [Методы класса](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%BA%D0%BB%D0%B0%D1%81%D1%81%D0%B0) 45 | - [Дополнительные параметры](#%D0%94%D0%BE%D0%BF%D0%BE%D0%BB%D0%BD%D0%B8%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D1%8B%D0%B5-%D0%BF%D0%B0%D1%80%D0%B0%D0%BC%D0%B5%D1%82%D1%80%D1%8B-2) 46 | - [Примеры](#%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D1%8B-1) 47 | - [Формат заголовков лога](#%D0%A4%D0%BE%D1%80%D0%BC%D0%B0%D1%82-%D0%B7%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BA%D0%BE%D0%B2-%D0%BB%D0%BE%D0%B3%D0%B0) 48 | - [Автор](#%D0%90%D0%B2%D1%82%D0%BE%D1%80) 49 | - [Лицензия](#%D0%9B%D0%B8%D1%86%D0%B5%D0%BD%D0%B7%D0%B8%D1%8F) 50 | 51 | 52 | 53 | 54 | ## Требования 55 | 56 | - PHP >= 7.0; 57 | - класс [`HTTP`](https://github.com/andrey-tech/http-client-php) >= 3.0 - НТТР(S) клиент с троттлингом запросов, поддержкой маркера BOM в теле сообщения формата JSON и выводом отладочной информации о запросах и ответах в STDOUT; 58 | - класс [`DebugLogger`](https://github.com/andrey-tech/debug-logger-php) >= 2.0 - логгер, сохраняющий отладочную информацию в файл вместе с данными об объеме используемой оперативной памяти и прошедшем времени; 59 | - произвольный автозагрузчик классов, реализующий стандарт [PSR-4](https://www.php-fig.org/psr/psr-4/), необходимый в том случае, если не используется Composer. 60 | 61 | 62 | 63 | ## Установка 64 | 65 | Установка через composer: 66 | ``` 67 | $ composer require andrey-tech/bitrix24-api-php:"^1.6" 68 | ``` 69 | 70 | или добавить 71 | 72 | ``` 73 | "andrey-tech/bitrix24-api-php": "^1.6" 74 | ``` 75 | 76 | в секцию require файла composer.json. 77 | 78 | 79 | ## Класс `Bitrix24API` 80 | 81 | Для работы с REST API Битрикс24 используется класс `\App\Bitrix24\Bitrix24API`. 82 | При возникновении ошибок выбрасывается исключение класса `\App\Bitrix24\Bitrix24APIException`. 83 | В настоящее время в классе реализованы методы для работы со следующими сущностями Битрикс24: 84 | 85 | - [Сделки](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81%D0%BE-%D1%81%D0%B4%D0%B5%D0%BB%D0%BA%D0%B0%D0%BC%D0%B8) 86 | - [Контакты](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BD%D1%82%D0%B0%D0%BA%D1%82%D0%B0%D0%BC%D0%B8) 87 | - [Компании](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%BE%D0%BC%D0%BF%D0%B0%D0%BD%D0%B8%D1%8F%D0%BC%D0%B8) 88 | - [Каталоги товаров](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BA%D0%B0%D1%82%D0%B0%D0%BB%D0%BE%D0%B3%D0%B0%D0%BC%D0%B8) 89 | - [Товары](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%B0%D0%BC%D0%B8) 90 | - [Разделы товаров](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%80%D0%B0%D0%B7%D0%B4%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BE%D0%B2) 91 | - [Товарные позиции](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D1%82%D0%BE%D0%B2%D0%B0%D1%80%D0%BD%D1%8B%D0%BC%D0%B8-%D0%BF%D0%BE%D0%B7%D0%B8%D1%86%D0%B8%D1%8F%D0%BC%D0%B8) 92 | - [Задачи](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B7%D0%B0%D0%B4%D0%B0%D1%87%D0%B0%D0%BC%D0%B8) 93 | - [Дела](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B4%D0%B5%D0%BB%D0%B0%D0%BC%D0%B8) 94 | - [Пользователи](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8F%D0%BC%D0%B8) 95 | - [Диск](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%B4%D0%B8%D1%81%D0%BA%D0%BE%D0%BC) 96 | - [Лиды](#%D0%9C%D0%B5%D1%82%D0%BE%D0%B4%D1%8B-%D0%B4%D0%BB%D1%8F-%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B-%D1%81-%D0%BB%D0%B8%D0%B4%D0%B0%D0%BC%D0%B8) 97 | 98 | 99 | ### Базовые методы класса 100 | 101 | Базовые методы находятся в классе `\App\Bitrix24\Bitrix24API`: 102 | 103 | - `__construct(string $webhookURL)` Конструктор класса. 104 | - `request(string $function, array $params = []) :?array` Отправляет запрос в API. 105 | - `getList(string $function, array $params = []) :\Generator` Загружает все сущности заданного типа. 106 | - `fetchList(string $function, array $params = []) :\Generator` Загружает все сущности [быстрым методом](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php). 107 | - `batchRequest(array $commands, $halt = true) :array` Отправляет пакет запросов в API. 108 | - `buildCommands(string $function, array $items) :array` Создает массив команд для пакетного запроса. 109 | - `buildCommand(string $function, array $params) :string` Возвращает команду для пакетного запроса. 110 | - `getLastResponse() :?array` Возвращает последний ответ от API. 111 | - `setLogger($logger)` Устанавливает объект класса, выполняющего логирование отладочной информации в файл. 112 | 113 | Параметры методов: 114 | 115 | + `$webhookURL` - URL входящего вебхука; 116 | + `$function` - имя метода (функции) запроса; 117 | + `$params` - параметры запроса; 118 | + `$commands` - пакет команд; 119 | + `$items` - массив полей запросов; 120 | + `$halt` - прерывать последовательность запросов в случае ошибки; 121 | + `$logger` - объект класса, реализующего интерфейс `\App\DebugLogger\DebugLoggerInterface`. 122 | 123 | 124 | ### Дополнительные параметры 125 | 126 | Дополнительные параметры настройки доступны через публичные статические и нестатические свойства класса `\App\Bitrix24\Bitrix24API`: 127 | 128 | Нестатическое свойство | По умолчанию | Описание 129 | ----------------------- | ------------------ | -------- 130 | `$batchSize` | 50 | Устанавливает количество команд в одном пакете запросов (batch) 131 | `$logger` | null | Хранит объект класса `\App\DebugLogger\DebugLogger`, выполняющего логирование запросов и ответов к API в файл. Если null, то логирование не выполняется. 132 | `$http` | `\App\HTTP\HTTP` | Хранит объект класса `\App\HTTP\HTTP`, отправляющего запросы к API 133 | 134 | Статическое свойство | По умолчанию | Описание 135 | ----------------------- | -------------------- | -------- 136 | `$WITH_CONTACTS` | 'CONTACTS' | Имя поля для массива возвращаемых связанных сущностей типа контакт 137 | `$WITH_COMPANIES` | 'COMPANIES' | Имя поля для массива возвращаемых связанных сущностей типа компания 138 | `$WITH_PRODUCTS` | 'PRODUCTS' | Имя поля для массива возвращаемых связанных сущностей типа товар 139 | 140 | 141 | ## Методы для работы с сущностями Битрикс24 142 | 143 | 144 | ### Методы работы со сделками 145 | 146 | Методы для работы со сделками находятся в трейте `\App\Bitrix24\Deal`: 147 | 148 | - `getDeal($dealId, array $with = []) :array` Возвращает сделку по ее ID. 149 | - `addDeal(array $fields = [], array $params = []) :int` Добавляет сделку и возвращает ее ID. 150 | - `updateDeal($dealId, array $fields = [], array $params = []) :int` Обновляет сделку и возвращает ее ID. 151 | - `deleteDeal($dealId) :int` Удаляет сделку и возвращает ее ID. 152 | - `getDealList(array $filter = [], array $select = [], array $order = []) :\Generator` 153 | Загружает все сделки с возможностью фильтрации, сортировки и выборки полей. 154 | - `fetchDealList(array $filter = [], array $select = [], array $order = []) :\Generator` 155 | Загружает все сделки с возможностью фильтрации, сортировки и выборки полей. 156 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных. 157 | - `addDeals(array $deals = [], array $params = []) :array` 158 | Пакетно добавляет сделки со связанными товарными позициями, возвращает массив ID сделок. 159 | - `updateDeals(array $deals = [], array $params = []) :array` 160 | Пакетно обновляет сделки со связанными товарными позициями, возвращает массив ID сделок. 161 | - `deleteDeals(array $dealIds = []) :array` Пакетно удаляет сделки, возвращает массив ID сделок. 162 | - `setDealFile($dealId, $userFieldId, string $fileName, string $fileContent, bool $isBase64FileData = true) :int` 163 | Устанавливает файл в НЕ множественное пользовательское поле типа файл (файл нельзя удалить) и возвращает ID сделки. 164 | - `setDealFiles($dealId, $userFieldId, array $files = [], bool $isBase64FileData = true) :int` 165 | Устанавливает файлы во множественное пользовательское поле типа файл (файлы можно удалить) и возвращает ID сделки. 166 | - `getDealContactItems($dealId) :array` Возвращает массив параметров контактов, связанных со сделкой. 167 | - `setDealContactItems($dealId, array $contacts) :array` Устанавливает контакты, связанные со сделкой. 168 | - `setDealProductRows($dealId, array $products) :array` Устанавливает товарные позиции, связанные со сделкой. 169 | - `getDealProductRows($dealId) :array` Возвращает массив параметров товарных позиций, связанных со сделкой. 170 | - `getDealFields() :array` Возвращает описание полей сделки, в том числе пользовательских. 171 | 172 | Параметры методов: 173 | 174 | + `$dealId` - ID сделки; 175 | + `$dealIds` - массив ID сделок; 176 | + `$with` - имена связанных сущностей, возвращаемых вместе со сделкой: 177 | * `\App\Bitrix24\Bitrix24API::$WITH_CONTACTS` - контакты (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$WITH_CONTACTS`); 178 | * `\App\Bitrix24\Bitrix24API::$WITH_PRODUCTS` - товарные позиции (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$PRODUCTS`); 179 | - `$fields` - набор полей сделки; 180 | - `$params` - набор параметров сделки; 181 | - `$filter` - параметры фильтрации; 182 | - `$order` - параметры сортировки; 183 | - `$select` - параметры выборки полей; 184 | - `$userFieldId` ID НЕ множественного пользовательского поля в сделке ('UF_CRM_XXXXXXXXXX'); 185 | - `$files` - массив параметров файлов ([ [ < Имя файла >, < RAW данные файла > ], ... ]) (пустой массив для удаления всех файлов); 186 | - `$isBase64FileData` - RAW данные файла закодированы в BASE64?; 187 | - `$contacts` - массив параметров контактов; 188 | - `$products` - массив параметров товарных позиций. 189 | 190 | ```php 191 | use App\Bitrix24\Bitrix24API; 192 | use App\Bitrix24\Bitrix24APIException; 193 | 194 | try { 195 | 196 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 197 | $bx24 = new Bitrix24API($webhookURL); 198 | 199 | // Добавляем новую сделку 200 | $dealId = $bx24->addDeal([ 201 | 'TITLE' => 'Новая сделка №1', 202 | 'COMPANY_ID' => 6, 203 | 'CONTACT_ID' => 312 204 | ]); 205 | print_r($dealId); 206 | 207 | // Устанавливаем набор связанных контактов 208 | $bx24->setDealContactItems($dealId, [ 209 | [ 'CONTACT_ID' => 313 ], 210 | [ 'CONTACT_ID' => 454 ] 211 | ]); 212 | 213 | // Устанавливаем набор связанных товарных позиций 214 | $bx24->setDealProductRows($dealId, [ 215 | [ 'PRODUCT_ID' => 1689, 'PRICE' => 1500.00, 'QUANTITY' => 2 ], 216 | [ 'PRODUCT_ID' => 1860, 'PRICE' => 500.00, 'QUANTITY' => 15 ] 217 | ]); 218 | 219 | // Обновляем существующую сделку 220 | $bx24->updateDeal($dealId, [ 221 | 'TITLE' => 'Новая сделка №12' 222 | ]); 223 | 224 | 225 | // При необходимости, изменяем значение по умолчанию 'PRODUCTS' на '_PRODUCTS' для имени поля 226 | // со списком товарных позиций, возвращаемых вместе со сделкой 227 | Bitrix24API::$WITH_PRODUCTS = '_PRODUCTS'; 228 | 229 | // Загружаем сделку по ID вместе со связанными товарами и контактами одним запросом 230 | $deal = $bx24->getDeal($dealId, [ Bitrix24API::$WITH_PRODUCTS, Bitrix24API::$WITH_CONTACTS ]); 231 | print_r($deal); 232 | 233 | // Удаляем существующую сделку 234 | $bx24->deleteDeal($dealId); 235 | 236 | // Загружаем все сделки используя быстрый метод при работе с большими объемами данных 237 | $generator = $bx24->fetchDealList(); 238 | foreach ($generator as $deals) { 239 | foreach($deals as $deal) { 240 | print_r($deal); 241 | } 242 | } 243 | 244 | // Пакетно добавляем сделки вместе с товарными позициями 245 | $dealIds = $bx24->addDeals([ 246 | [ 247 | 'TITLE' => 'Новая сделка №1121', 248 | 'COMPANY_ID' => 6, 249 | 'CONTACT_ID' => 312, 250 | 'PRODUCTS' => [ 251 | [ "PRODUCT_ID" => 27, "PRICE" => 100.00, "QUANTITY" => 11 ], 252 | ] 253 | 254 | ], 255 | [ 256 | 'TITLE' => 'Новая сделка №1122', 257 | 'COMPANY_ID' => 6, 258 | 'PRODUCTS' => [ 259 | [ "PRODUCT_ID" => 28, "PRICE" => 200.00, "QUANTITY" => 22 ], 260 | [ "PRODUCT_ID" => 27, "PRICE" => 200.00, "QUANTITY" => 11 ], 261 | ] 262 | ] 263 | ]); 264 | print_r($dealIds); 265 | 266 | // Пакетно удаляем сделки 267 | $bx24->deleteDeals($dealIds); 268 | 269 | } catch (Bitrix24APIException $e) { 270 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 271 | } catch (Exception $e) { 272 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 273 | } 274 | ``` 275 | 276 | 277 | ### Методы для работы с контактами 278 | 279 | Методы для работы с контактами находятся в трейте `\App\Bitrix24\Contact`: 280 | 281 | - `getContact($contactId, array $with = []) :array` Возвращает контакт по его ID. 282 | - `addContact(array $fields = [], array $params = []) :int` Добавляет контакт и возвращает его ID. 283 | - `updateContact($contactId, array $fields = [], array $params = []) :int` Обновляет контакт и возвращает его ID. 284 | - `deleteContact($contactId) :int` Удаляет контакт и возвращает его ID. 285 | - `getContactList(array $filter = [], array $select = [], array $order = []) :\Generator` 286 | Загружает все контакты с возможностью фильтрации, сортировки и выборки полей. 287 | - `fetchContactList(array $filter = [], array $select = [], array $order = []) :\Generator` 288 | Загружает все контакты с возможностью фильтрации, сортировки и выборки полей. 289 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных. 290 | - `getContactsByPhone(int|string $phone, $select = []) :array` Возвращает контакты по номеру телефона. 291 | - `addContacts(array $contacts = [], array $params = []) :array` Пакетно добавляет контакты. 292 | - `updateContacts(array $contacts = [], array $params = []) :array` Пакетно обновляет контакты. 293 | - `deleteContacts(array $contactIds = []) :array` Пакетно удаляет контакты. 294 | - `getContactCompanyItems($contactId) :array` Возвращает компании, связанные с контактом по ID. 295 | - `setContactCompanyItems($contactId, array $companies) :array` Устанавливает компании, связанные с контактом по ID. 296 | - `getContactFields() :array` Возвращает описание полей контакта. 297 | 298 | Параметры методов: 299 | 300 | + `$contaxctId` - ID контакта; 301 | + `$contactIds` - массив ID сделок; 302 | + `$phone` - номер телефона; 303 | + `$with` - имена связанных сущностей, возвращаемых вместе с контактом: 304 | * `\App\Bitrix24\Bitrix24API::$WITH_COMPANIES` - компании (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$WITH_COMPANIES`); 305 | - `$fields` - набор полей сделки; 306 | - `$params` - набор параметров сделки; 307 | - `$filter` - параметры фильтрации; 308 | - `$order` - параметры сортировки; 309 | - `$select` - параметры выборки полей; 310 | - `$contacts` - массив параметров контактов; 311 | - `$companies` - массив параметров компаний. 312 | 313 | ```php 314 | use App\Bitrix24\Bitrix24API; 315 | use App\Bitrix24\Bitrix24APIException; 316 | 317 | try { 318 | 319 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 320 | $bx24 = new Bitrix24API($webhookURL); 321 | 322 | // Добавляем новый контакт 323 | $contactId = $bx24->addContact([ 324 | 'NAME' => 'Иван', 325 | 'COMPANY_ID' => 332, 326 | 'SECOND_NAME' => 'Васильевич', 327 | 'LAST_NAME' => 'Петров' 328 | ]); 329 | print_r($contactId); 330 | 331 | // Устанавливаем набор связанных компаний 332 | $bx24->setContactCompanyItems($contactId, [ 333 | [ 'COMPANY_ID' => 8483 ], 334 | [ 'CONPANY_ID' => 4094 ] 335 | ]); 336 | 337 | // Обновляем существующий контакт 338 | $bx24->updateContact($contactId, [ 339 | 'NAME' => 'Фёдор' 340 | ]); 341 | 342 | // Загружаем контакт по ID вместе со связанными компаниями 343 | $contact = $bx24->getContact($contactId, [ Bitrix24API::$WITH_COMPANIES ]); 344 | print_r($contact); 345 | 346 | // Удаляем существующий контакт 347 | $bx24->deleteContact($contactId); 348 | 349 | // Загружаем все контакты используя быстрый метод при работе с большими объемами данных 350 | $generator = $bx24->fetchContactList(); 351 | foreach ($generator as $contacts) { 352 | foreach($contacts as $contact) { 353 | print_r($contact); 354 | } 355 | } 356 | 357 | // Пакетно добавляем контакты 358 | $contactIds = $bx24->addContacts([ 359 | [ 360 | 'NAME' => 'Владимир', 361 | 'COMPANY_ID' => 3322, 362 | 'SECOND_NAME' => 'Вадимович', 363 | 'LAST_NAME' => 'Владимиров' 364 | ], 365 | [ 366 | 'NAME' => 'Андрей', 367 | 'COMPANY_ID' => 1332, 368 | 'SECOND_NAME' => 'Васильевич', 369 | 'LAST_NAME' => 'Иванов' 370 | ] 371 | ]); 372 | print_r($contactIds); 373 | 374 | // Пакетно удаляем контакты 375 | $bx24->deleteContacts($contactIds); 376 | 377 | } catch (Bitrix24APIException $e) { 378 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 379 | } catch (Exception $e) { 380 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 381 | } 382 | ``` 383 | 384 | 385 | ### Методы для работы с компаниями 386 | 387 | Методы для работы с компаниями находятся в трейте `\App\Bitrix24\Company`: 388 | 389 | - `getCompany($companyId, array $with = [])` Возвращает компанию по ID. 390 | - `addCompany(array $fields = [], array $params = []) :int` Добавляет компанию и возвращает ее ID. 391 | - `updateCompany($companyId, array $fields = [], array $params = []) :int` Обновляет компанию и возвращает ее ID. 392 | - `deleteCompany($companyId) :int` Удаляет компанию и возвращает ее ID. 393 | - `getCompanyList(array $filter = [], array $select = [], array $order = []) :\Generator` 394 | Загружает все компании с возможностью фильтрации, сортировки и выборки полей. 395 | - `fetchCompanyList(array $filter = [], array $select = [], array $order = []) :\Generator` 396 | Загружает все компании с возможностью фильтрации, сортировки и выборки полей. 397 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных. 398 | - `addCompanies(array $companies = [], array $params = []) :array` Пакетно добавляет компании. 399 | - `updateCompanies(array $companies = [], array $params = []) :array` Пакетно обновляет компании. 400 | - `deleteCompanies(array $companyIds = []) :array` Пакетно удаляет компании. 401 | - `getCompanyContactItems($companyId) :array` Возвращает контакты, связанные с компанией. 402 | - `setCompanyContactItems($companyId, array $contacts) :array` Устанавливает контакты, связанные с компанией. 403 | 404 | Параметры методов: 405 | 406 | - `$companyId` - ID компании; 407 | - `$companyIds` - массив ID компаний; 408 | + `$with` - имена связанных сущностей, возвращаемых вместе с компанией: 409 | * `\App\Bitrix24\Bitrix24API::$WITH_CONTACTS` - контакты (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$WITH_CONTACTS`); 410 | + `$filter` - параметры фильтрации; 411 | + `$order` - параметры сортировки; 412 | + `$select` - параметры выборки полей; 413 | - `$contacts` - массив параметров контактов; 414 | - `$companies` - массив параметров компаний. 415 | 416 | ```php 417 | use App\Bitrix24\Bitrix24API; 418 | use App\Bitrix24\Bitrix24APIException; 419 | 420 | try { 421 | 422 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 423 | $bx24 = new Bitrix24API($webhookURL); 424 | 425 | // Добавляем новую компанию 426 | $companyId = $bx24->addCompany([ 427 | 'TITLE' => 'OOO Рога и Копыта' 428 | ]); 429 | print_r($companyId); 430 | 431 | // Устанавливаем набор связанных контактов 432 | $bx24->setCompanyContactItems($companyId, [ 433 | [ 'CONTACT_ID' => 4838 ], 434 | [ 'CONTACT_ID' => 8583 ] 435 | ]); 436 | 437 | // Обновляем существующую компанию 438 | $bx24->updateCompany($companyId, [ 439 | 'TITLE' => 'ИП Рога и Копыта' 440 | ]); 441 | 442 | // Загружаем компанию по ID вместе со связанными контактами 443 | $company = $bx24->getCompany($companyId, [ Bitrix24API::$WITH_CONTACTS ]); 444 | print_r($company); 445 | 446 | // Удаляем существующую компанию 447 | $bx24->deleteCompany($companyId); 448 | 449 | // Загружаем все компании используя быстрый метод при работе с большими объемами данных 450 | $generator = $bx24->fetchCompanyList(); 451 | foreach ($generator as $companies) { 452 | foreach($companies as $company) { 453 | print_r($company); 454 | } 455 | } 456 | 457 | // Пакетно добавляем компании 458 | $companyIds = $bx24->addCompanies([ 459 | [ 'TITLE' => 'ПАО Абракадабра' ], 460 | [ 'TITLE' => 'ЗАО Моя компания' ] 461 | ]); 462 | print_r($companyIds); 463 | 464 | // Пакетно удаляем компании 465 | $bx24->deleteCompanies($companyIds); 466 | 467 | } catch (Bitrix24APIException $e) { 468 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 469 | } catch (Exception $e) { 470 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 471 | } 472 | ``` 473 | 474 | 475 | ### Методы для работы с каталогами 476 | 477 | Методы для работы с товарными каталогами находятся в трейте `\App\Bitrix24\Catalog`: 478 | 479 | - `getCatalogList(array $filter = [], array $select = [], array $order = []) :\Generator` 480 | Загружает все каталоги с возможностью фильтрации, сортировки и выборки полей. 481 | - `fetchCatalogList(array $filter = [], array $select = [], array $order = []) :\Generator` 482 | Загружает все каталоги с возможностью фильтрации, сортировки и выборки полей. 483 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных. 484 | - `getCatalogFields() :array` Возвращает описание полей каталога товаров. 485 | 486 | Параметры методов: 487 | 488 | + `$filter` - параметры фильтрации; 489 | + `$order` - параметры сортировки; 490 | + `$select` - параметры выборки полей. 491 | 492 | ```php 493 | use App\Bitrix24\Bitrix24API; 494 | use App\Bitrix24\Bitrix24APIException; 495 | 496 | try { 497 | 498 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 499 | $bx24 = new Bitrix24API($webhookURL); 500 | 501 | // Загружаем все товарные каталоги используя быстрый метод при работе с большими объемами данных 502 | $generator = $bx24->fetchCatalogList(); 503 | foreach ($generator as $catalogs) { 504 | foreach($catalogs as $catalog) { 505 | print_r($catalog); 506 | } 507 | } 508 | 509 | } catch (Bitrix24APIException $e) { 510 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 511 | } catch (Exception $e) { 512 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 513 | } 514 | ``` 515 | 516 | 517 | ### Методы для работы с товарами 518 | 519 | Методы для работы с товарами находятся в трейте `\App\Bitrix24\Product`: 520 | 521 | - `getProduct($productId) :array` Возвращает товар по ID. 522 | - `addProduct(array $fields = []) :int` Добавляет товар и возвращает его ID. 523 | - `updateProduct($productId, array $fields = []) :int` Обовляет товар и возвращает его ID. 524 | - `deleteProduct($productId) :int` Удаляет товар и возвращает его ID. 525 | - `getProductList(array $filter = [], array $select = [ '*', 'PROPERTY_*' ], array $order = []) :\Generator` 526 | Загружает все товары с возможностью фильтрации, сортировки и выборки полей. 527 | - `fetchProductList(array $filter = [], array $select = [ '*', 'PROPERTY_*' ], array $order = []) :\Generator` 528 | Загружает все товары с возможностью фильтрации, сортировки и выборки полей. 529 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных. 530 | - `addProducts(array $products = []) :array` Пакетно добавляет товары. 531 | - `updateProducts(array $products = []) :array` Пакетно обновляет товары. 532 | - `deleteProducts(array $productIds = []) :array` Пакетно удаляет товары. 533 | - `getProductFields() :array` Возвращает описание полей товара, в том числе пользовательских. 534 | 535 | Параметры методов: 536 | 537 | + `$productId` - ID товара. 538 | + `$productIds` - массив ID товаров. 539 | + `$fields` - набор полей товара. 540 | + `$filter` - параметры фильтрации; 541 | + `$select` - параметры выборки полей; 542 | + `$order` - параметры сортировки. 543 | + `$products` - массив наборов полей товара. 544 | 545 | ```php 546 | use App\Bitrix24\Bitrix24API; 547 | use App\Bitrix24\Bitrix24APIException; 548 | 549 | try { 550 | 551 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 552 | $bx24 = new Bitrix24API($webhookURL); 553 | 554 | // Получаем товар по его ID 555 | $product = $bx24->getProduct(2396); 556 | print_r($product); 557 | 558 | // Обновляем товар 559 | $bx24->updateProduct(2396, [ 560 | "PRICE" => 4900 561 | ]); 562 | 563 | // Удаляем товар 564 | $bx24->deleteProduct(2396); 565 | 566 | // Загружаем все товары c фильтрацией по полю SECTION_ID 567 | $generator = $bx24->fetchProductList([ 'SECTION_ID' => 13 ]); 568 | foreach ($generator as $users) { 569 | foreach($users as $user) { 570 | print_r($user); 571 | } 572 | } 573 | 574 | // Пакетно обновляем товары 575 | $bx24->updateProducts([ 576 | [ 577 | "ID" => 27, 578 | "NAME" => "Тестовый товар 11", 579 | "CURRENCY_ID" => "RUB", 580 | "PRICE" => 4900, 581 | "SORT" => 500, 582 | "SECTION_ID" => 13 583 | ], 584 | [ 585 | "ID" => 28, 586 | "NAME" => "Тестовый товар 12", 587 | "CURRENCY_ID" => "RUB", 588 | "PRICE" => 900, 589 | "SORT" => 100, 590 | "SECTION_ID" => 13 591 | ], 592 | [ 593 | "ID" => 29, 594 | "NAME" => "Тестовый товар 13", 595 | "CURRENCY_ID" => "RUB", 596 | "PRICE" => 2900, 597 | "SORT" => 300, 598 | "SECTION_ID" => 13 599 | ] 600 | ]); 601 | 602 | } catch (Bitrix24APIException $e) { 603 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 604 | } catch (Exception $e) { 605 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 606 | } 607 | ``` 608 | 609 | 610 | ### Методы работы с разделами товаров 611 | 612 | Методы для работы с разделами товаров находятся в трейте `\App\Bitrix24\ProductSection`: 613 | 614 | - `getProductSection($productSectionId) :array` Возвращает раздел товаров по ID. 615 | - `addProductSection(array $fields = []) :int` Добавляет раздел товаров и возвращает его ID. 616 | - `updateProductSection($productSectionId, array $fields = []): int` Обновляет раздел товаров и возвращает его ID. 617 | - `deleteProductSection($productSectionId) :int` Удаляет раздел товаров и возвращает его ID. 618 | - `getProductSectionList(array $filter = [], array $select = [], array $order = []) :\Generator` 619 | Загружает все разделы товаров с возможностью фильтрации, сортировки и выборки полей. 620 | - `fetchProductSectionList(array $filter = [], array $select = [], array $order = []) :\Generator` 621 | Загружает все разделы товаров с возможностью фильтрации, сортировки и выборки полей. 622 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных. 623 | - `addProductSections(array $productSections = []) :array` Пакетно добавляет разделы товаров. 624 | - `updateProductSections(array $productSections = []) :array` Пакетно обновляет разделы товаров. 625 | - `deleteProducts(array $productSectionIds = []) :array` Пакетно удаляет разделы товаров. 626 | - `getProductSectionFields() :array` Возвращает описание полей раздела товара. 627 | 628 | Параметры методов: 629 | 630 | + `$productSectionId` - ID раздела товаров; 631 | + `$productSectionIds` - массив ID разделов товаров; 632 | + `$fields` - набор полей раздела товаров; 633 | + `$filter` - параметры фильтрации; 634 | + `$select` - параметры выборки полей; 635 | + `$order` - параметры сортировки. 636 | 637 | ```php 638 | use App\Bitrix24\Bitrix24API; 639 | use App\Bitrix24\Bitrix24APIException; 640 | 641 | try { 642 | 643 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 644 | $bx24 = new Bitrix24API($webhookURL); 645 | 646 | // Получаем раздел товаров по его ID 647 | $productSection = $bx24->getProductSection(16); 648 | print_r($productSection); 649 | 650 | // Обновляем раздел товаров 651 | $bx24->updateProductSection(16, [ 652 | 'NAME' => 'Раздел товаров 1' 653 | ]); 654 | 655 | // Удаляем раздел товаров 656 | $bx24->deleteProductSection(16); 657 | 658 | // Загружаем все разделы товаров c фильтрацией по полю CATALOG_ID 659 | $generator = $bx24->fetchProductSectionList([ 'CATALOG_ID' => 2 ]); 660 | foreach ($generator as $productSections) { 661 | foreach($productSections as $productSection) { 662 | print_r($productSection); 663 | } 664 | } 665 | 666 | // Пакетно добавляем разделы товаров 667 | $productSectionIds = $bx24->addProductSections([ 668 | [ 669 | "NAME" => "Раздел товаров 3", 670 | 'CATALOG_ID' => 2 671 | ], 672 | [ 673 | "NAME" => "Раздел товаров 4", 674 | 'CATALOG_ID' => 2 675 | ] 676 | ]); 677 | 678 | } catch (Bitrix24APIException $e) { 679 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 680 | } catch (Exception $e) { 681 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 682 | } 683 | ``` 684 | 685 | 686 | ### Методы работы с товарными позициями 687 | 688 | Методы для работы с товарными позициями находятся в трейте `\App\Bitrix24\ProductRow`: 689 | 690 | - `getProductRowFields() :array` Возвращает описание полей товарных позиций. 691 | 692 | 693 | 694 | ### Методы для работы с пользователями 695 | 696 | Методы для работы с пользователями находятся в трейте `\App\Bitrix24\User`: 697 | 698 | - `getUser($userId) ?:array` Возвращает пользователя по ID. 699 | - `getUsers(array $filter = [], string $order = 'ASC', string $sort = '', bool $adminMode = false) :\Generator` 700 | Загружает всех пользователей с возможностью фильтрации, сортировки и выборки полей. 701 | - `getUserFields() :array` Возвращает описание полей пользователя. 702 | 703 | Параметры методов: 704 | 705 | + `$userId` - ID пользователя; 706 | + `$filter` - параметры фильтрации; 707 | + `$order` - направление сортировки (ASC|DESC); 708 | + `$sort` - поле, по которому сортируются результаты; 709 | + `$select` - параметры выборки полей; 710 | + `$adminMode` - включает режим администратора для получения данных о любых пользователях. 711 | 712 | ```php 713 | use App\Bitrix24\Bitrix24API; 714 | use App\Bitrix24\Bitrix24APIException; 715 | 716 | try { 717 | 718 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 719 | $bx24 = new Bitrix24API($webhookURL); 720 | 721 | // Получаем пользователя по ID 722 | $user = $bx24->getUser(34782); 723 | print_r($user); 724 | 725 | // Получаем всех пользователей типа сотрудник с сортировкой по имени 726 | $generator = $bx24->getUsers( 727 | [ 'USER_TYPE' => 'employee' ], 728 | $order = 'ASC', 729 | $sort = 'NAME' 730 | ); 731 | foreach ($generator as $users) { 732 | foreach($users as $user) { 733 | print_r($user); 734 | } 735 | } 736 | 737 | } catch (Bitrix24APIException $e) { 738 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 739 | } catch (Exception $e) { 740 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 741 | } 742 | ``` 743 | 744 | 745 | ### Методы работы с задачами 746 | 747 | Методы для работы с задачами находятся в трейте `\App\Bitrix24\Task`: 748 | 749 | - `getTask($taskId, array $select = []) :?array` Возвращает задачу по ID. 750 | - `getTaskList(array $filter = [], array $select = [], array $order = []): Generator` Возвращает все задачи. 751 | - `addTask(array $fields = []) :int` Добавляет новую задачу. 752 | - `addTasks(array $tasks = []) :array` Пакетно добавляет задачи. 753 | - `getTaskFields() :array` Возвращает описание полей задачи. 754 | 755 | Параметры методов: 756 | 757 | + `$taskId` - ID задачи; 758 | + `$filter` - параметры фильтрации; 759 | + `$select` - параметры выборки полей; 760 | + `$order` - параметры сортировки; 761 | + `$fields` - набор полей задачи; 762 | + `$tasks` - массив наборов полей задач. 763 | 764 | ```php 765 | use App\Bitrix24\Bitrix24API; 766 | use App\Bitrix24\Bitrix24APIException; 767 | 768 | try { 769 | 770 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 771 | $bx24 = new Bitrix24API($webhookURL); 772 | 773 | // Получаем задачу по ID 774 | $task = $bx24->getTask(4325); 775 | print_r($task); 776 | 777 | // Получаем все задачи 778 | $generator = $bx24->getTaskList(); 779 | foreach ($generator as $result) { 780 | print_r($result); 781 | } 782 | 783 | // Создаем новую задачу 784 | $taskId = $bx24->addTask([ 785 | 'TITLE' => 'Новая задача №123', // Название задачи 786 | 'DESCRIPTION' => 'Описание задачи', // Описание задачи 787 | 'RESPONSIBLE_ID' => 43242, // ID ответственного пользователя 788 | 'UF_CRM_TASK' => [ 'D_' . 38492 ], // Привязка задачи к сделке ('D_' - сущность сделка, 38492 - ID сделки) 789 | 'START_DATE_PLAN' => '09.08.2005', // Плановая дата начала. 790 | 'END_DATE_PLAN' => '09.09.2005', // Плановая дата завершения 791 | 'DEADLINE' => '2005-09-09T18:31:42+03:30' // Крайний срок 792 | ]); 793 | print_r($taskId); 794 | 795 | } catch (Bitrix24APIException $e) { 796 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 797 | } catch (Exception $e) { 798 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 799 | } 800 | ``` 801 | 802 | 803 | ### Методы для работы с делами 804 | 805 | Методы для работы с делами (активностями) находятся в трейте `\App\Bitrix24\Activity`: 806 | 807 | - `getActivity($activityId) :?array` Возвращает дело по ID. 808 | - `addActivity(array $fields = []) :int` Создает новое дело и возвращает его ID. 809 | - `addActivities(array $activities = []) :array` Пакетно создает дела. 810 | - `getActivityFields() :array` Возвращает описание полей дела. 811 | 812 | Параметры методов: 813 | 814 | + `$activityId` - ID дела; 815 | + `$fields` - набор полей дела; 816 | + `$activities` - массив наборов полей дел. 817 | 818 | ```php 819 | use App\Bitrix24\Bitrix24API; 820 | use App\Bitrix24\Bitrix24APIException; 821 | 822 | try { 823 | 824 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 825 | $bx24 = new Bitrix24API($webhookURL); 826 | 827 | // Добавляем новое дело типа письмо 828 | $activityId = $bx24->addActivity([ 829 | 'SUBJECT' => 'Заголовок письма', // Email subject 830 | 'DESCRIPTION' => 'Описание активности', // Email body 831 | 'DESCRIPTION_TYPE' => 2, // Тип тела email: 1- Plain text, 2 - bbCode, 3 - HTML (crm.enum.contenttype) 832 | 'COMPLETED' => 'N', // Флаг немедленной отправки: Y|N 833 | 'DIRECTION' => 2, // Направление: 1 - входящее, 2 - исходящее (crm.enum.activitydirection) 834 | 'OWNER_TYPE_ID' => 2, // Тип сущности: 2 - Сделка, 3 - контакт, 4 - Компания,... (crm.enum.ownertype) 835 | 'OWNER_ID' => 39293, // ID сущности (сделки) 836 | 'TYPE_ID' => 4, // Тип активности: 4 - Письмо (crm.enum.activitytype) 837 | 'RESPONSIBLE_ID' => 4852, // ID ответственного пользователя 838 | 'START_TIME' => '2005-08-09T18:31:42+03:30', // Время начала 839 | 'END_TIME' => '2005-09-10T18:31:42+03:30', // Время окончания 840 | 'COMMUNICATIONS' => [ // Параметры получателей письма 841 | [ 842 | 'VALUE' => 'test@example.com', // Email компании 843 | 'ENTITY_ID' => 58938, // ID компании 844 | 'ENTITY_TYPE_ID' => 4 // Тип сущности: 4 - Компания ('crm.enum.ownertype'); 845 | ] 846 | ], 847 | 'SETTINGS' => [ 848 | 'MESSAGE_FROM' => 'from@example.com' 849 | ] 850 | ]); 851 | print_r($activityId); 852 | 853 | // Получаем дело по ID 854 | $activity = $bx24->getActivity($activityId); 855 | print_r($activity); 856 | 857 | } catch (Bitrix24APIException $e) { 858 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 859 | } catch (Exception $e) { 860 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 861 | } 862 | ``` 863 | 864 | 865 | ### Методы для работы с диском 866 | 867 | Методы для работы с Диском находятся в трейте `\App\Bitrix24\Disk`: 868 | 869 | - `getDiskStorageList(array $filter = []) :\Generator` 870 | Загружает список доступных хранилищ с возможностью фильтрации. 871 | - `getDiskStorageChildren($storageId, array $filter = []) :array` 872 | Возвращает список файлов и папок, которые находятся непосредственно в корне хранилища с возможностью фильтрации. 873 | - `uploadfileDiskFolder($folderId, string $fileContent, array $data, bool $isBase64FileData = true) :array` 874 | Загружает новый файл в указанную папку на Диск. 875 | 876 | Параметры методов: 877 | 878 | + `$filter` - параметры фильтрации; 879 | + `$storageId` - ID хранилища; 880 | + `$filter` - параметры фильтрации; 881 | + `$folderId` - ID папки; 882 | + `$fileContent` - RAW данные файла; 883 | + `$data` - набор параметров, описывающих файл (обязательное поле NAME - имя нового файла); 884 | + `$isBase64FileData` - RAW данные файла закодированы в BASE64? 885 | 886 | ```php 887 | use App\Bitrix24\Bitrix24API; 888 | use App\Bitrix24\Bitrix24APIException; 889 | 890 | try { 891 | 892 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 893 | $bx24 = new Bitrix24API($webhookURL); 894 | 895 | // Загружаем список доступных хранилищ 896 | $generator = $bx24->getDiskStorageList(); 897 | foreach ($generator as $storages) { 898 | foreach ($storages as $storage) { 899 | print_r($storage); 900 | } 901 | } 902 | 903 | // Загружаем список файлов и папок, которые находятся непосредственно в корне хранилища 904 | $files = $bx24->getDiskStorageChildren($storageId = 2); 905 | foreach ($files as $file) { 906 | print_r($file); 907 | } 908 | 909 | // Загружаем файл в указанную папку на Диск 910 | $bx24->uploadfileDiskFolder( 911 | $filderId = 4709, 912 | $rawFile = file_get_contents('./schet.pdf'), 913 | [ 'NAME' => 'schet.pdf' ], 914 | $isBase64FileData = false 915 | ); 916 | 917 | } catch (Bitrix24APIException $e) { 918 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 919 | } catch (Exception $e) { 920 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 921 | } 922 | ``` 923 | 924 | 925 | ### Методы для работы с лидами 926 | 927 | Методы для работы с лидами находятся в трейте `\App\Bitrix24\Lead`: 928 | 929 | - `getLeadFields() :array` Возвращает описание полей лида, в том числе пользовательских. 930 | - `getLead($leadId, array $with = []) :array` Возвращает лид по его ID. 931 | - `addLead(array $fields = [], array $params = []) :int` Добавляет лид и возвращает его ID. 932 | - `updateLead($leadId, array $fields = [], array $params = []) :int` Обновляет лид и возвращает его ID. 933 | - `deleteLead($leadId) :int` Удаляет лид по его ID. 934 | - `getLeadList(array $filter = [], array $select = [], array $order = []): Generator` 935 | Загружает все лиды с возможностью фильтрации, сортировки и выборки полей. 936 | - `fetchLeadList(array $filter = [], array $select = [], array $order = []): Generator` 937 | Загружает все лиды с возможностью фильтрации, сортировки и выборки полей. 938 | Реализует [быстрый метод](https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php) загрузки при работе с большими объемами данных. 939 | - `getLeadProductRows($leadId) :array` Возвращает массив параметров товарных позиций, связанных с лидом. 940 | - `setLeadProductRows($leadId, array $products) :array` Устанавливает товарные позиции, связанные с лидом. 941 | 942 | Параметры методов: 943 | 944 | + `$leadId` - ID лида; 945 | + `$with` - имена связанных сущностей, возвращаемых вместе с лидом: 946 | * `\App\Bitrix24\Bitrix24API::$WITH_PRODUCTS` - товарные позиции (возвращаются в виде массива в поле с именем, заданным публичным статическим свойством `Bitrix24API::$PRODUCTS`); 947 | - `$fields` - набор полей лида; 948 | - `$params` - набор параметров лида; 949 | - `$filter` - параметры фильтрации; 950 | - `$order` - параметры сортировки; 951 | - `$select` - параметры выборки полей; 952 | - `$products` - массив параметров товарных позиций. 953 | 954 | ```php 955 | use App\Bitrix24\Bitrix24API; 956 | use App\Bitrix24\Bitrix24APIException; 957 | 958 | try { 959 | 960 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 961 | $bx24 = new Bitrix24API($webhookURL); 962 | 963 | // Добавляем новый лид 964 | $leadId = $bx24->addLead([ 965 | 'TITLE' => 'Новый лид №1' 966 | ]); 967 | print_r($leadId); 968 | 969 | // Устанавливаем набор связанных товарных позиций 970 | $bx24->setLeadProductRows($leadId, [ 971 | [ 'PRODUCT_ID' => 1689, 'PRICE' => 1500.00, 'QUANTITY' => 2 ], 972 | [ 'PRODUCT_ID' => 1860, 'PRICE' => 500.00, 'QUANTITY' => 15 ] 973 | ]); 974 | 975 | // Обновляем существующий лид 976 | $bx24->updateLead($leadId [ 977 | 'TITLE' => 'Новый лид №12' 978 | ]); 979 | 980 | // При необходимости, изменяем значение по умолчанию 'PRODUCTS' на '_PRODUCTS' для имени поля 981 | // со списком товарных позиций, возвращаемых вместе с лидом 982 | Bitrix24API::$WITH_PRODUCTS = '_PRODUCTS'; 983 | 984 | // Загружаем лид по ID вместе со связанными товарными позициями 985 | $lead = $bx24->getLead($leadId, [ Bitrix24API::$WITH_PRODUCTS ]); 986 | print_r($lead); 987 | 988 | // Удаляем существующий лид 989 | $bx24->deleteLead($leadId); 990 | 991 | // Загружаем все лиды используя быстрый метод при работе с большими объемами данных 992 | $generator = $bx24->fetchLeadList(); 993 | foreach ($generator as $leads) { 994 | foreach($leads as $lead) { 995 | print_r($lead); 996 | } 997 | } 998 | 999 | } catch (Bitrix24APIException $e) { 1000 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 1001 | } catch (Exception $e) { 1002 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 1003 | } 1004 | ``` 1005 | 1006 | 1007 | ## Вспомогательные классы 1008 | 1009 | 1010 | ### Класс `HTTP` 1011 | 1012 | Класс [`\App\HTTP\НТТР`](https://github.com/andrey-tech/http-client-php) обеспечивает: 1013 | 1014 | - формирование POST запросов к API Битрикс 24 по протоколу HTTPS; 1015 | - троттлинг запросов к API на требуемом уровне - [не более 2-х запросов в секунду](https://dev.1c-bitrix.ru/rest_help/rest_sum/index.php); 1016 | - вывод отладочной информации о запросах к API в STDOUT. 1017 | 1018 | При возникновении ошибок выбрасывается исключение класса `\App\HTTP\HTTPException`. 1019 | 1020 | 1021 | #### Дополнительные параметры 1022 | 1023 | Дополнительные параметры устанавливаются через публичные свойства объекта класса `\App\HTTP\HTTP`: 1024 | 1025 | Свойство | По умолчанию | Описание 1026 | ----------------------- | ----------------------- | -------- 1027 | `$debugLevel` | `\App\HTTP\HTTP::DEBUG_NONE` | Устанавливает уровень вывода отладочной информации о запросах в STDOUT (битовая маска, составляемая из значений DEBUG_NONE, DEBUG_URL, DEBUG_HEADERS, DEBUG_CONTENT) 1028 | `$throttle` | 0 | Максимальное число HTTP запросов в секунду (0 - троттлинг отключен) 1029 | `$addBOM` | false | Добавлять [маркер ВОМ](https://ru.wikipedia.org/wiki/%D0%9C%D0%B0%D1%80%D0%BA%D0%B5%D1%80_%D0%BF%D0%BE%D1%81%D0%BB%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%BE%D1%81%D1%82%D0%B8_%D0%B1%D0%B0%D0%B9%D1%82%D0%BE%D0%B2) UTF-8 (EFBBBF) к запросам в формате JSON 1030 | `$useCookies` | false | Использовать cookies в запросах 1031 | `$cookieFile` | 'temp/cookies.txt' | Путь к файлу для хранения cookies 1032 | `$verifySSLCertificate` | true | Включить проверку SSL/TLS-сертификата сервера 1033 | `$SSLCertificateFile` | 'cacert.pem' | Устанавливает файл SSL/TLS-сертификатов X.509 корневых удостоверяющих центров (CA) в формате РЕМ (установка в null означает использовать файл, указанный в параметре [curl.cainfo](https://www.php.net/manual/ru/curl.configuration.php) файла php.ini) 1034 | `$userAgent` | 'HTTP-client/3.x.x' | Устанавливает НТТР заголовок UserAgent в запросах 1035 | `$curlConnectTimeout` | 60 | Устанавливает таймаут соединения, секунды 1036 | `$curlTimeout` | 60 | Устанавливает таймаут обмена данными, секунды 1037 | `$successStatusCodes` | [ 200 ] | Коды статуса НТТР, соответствующие успешному выполнению запроса 1038 | 1039 | 1040 | 1041 | #### Примеры 1042 | 1043 | ```php 1044 | use App\Bitrix24\Bitrix24API; 1045 | use App\Bitrix24\Bitrix24APIException; 1046 | use App\HTTP\HTTP; 1047 | 1048 | try { 1049 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 1050 | $bx24 = new Bitrix24API($webhookURL); 1051 | 1052 | // Устанавливаем максимальный уровень вывода отладочных сообщений в STDOUT 1053 | $bx24->http->debugLevel = HTTP::DEBUG_URL | HTTP::DEBUG_HEADERS | HTTP::DEBUG_CONTENT; 1054 | 1055 | // ИЛИ 1056 | // убираем вывод отладочных сообщений в случае необходимости. 1057 | // Раскомментируем строчку нижи И закоментируем рабочую строчку выше 1058 | // $bx24->http->debugLevel = HTTP::DEBUG_NONE; 1059 | 1060 | // Устанавливаем троттлинг запросов на уровне не более 1 запроса в 2 секунды 1061 | $bx24->http->throttle = 0.5; 1062 | 1063 | // Устанавливаем таймаут обмена данными в 30 секунд 1064 | $bx24->http->curlTimeout = 30; 1065 | 1066 | // Получаем компанию по ID 1067 | $results = $bx24->getCompany(20); 1068 | 1069 | } catch (Bitrix24APIException $e) { 1070 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 1071 | } catch (Exception $e) { 1072 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 1073 | } 1074 | ``` 1075 | 1076 | Примеры отладочных сообщений: 1077 | ``` 1078 | [1] ===> POST https://www.example.com/rest/1/u7ngxagzrhpuj31a/crm.company.get.json 1079 | POST rest/1/u7ngxagzrhpuj31a/crm.company.get.json HTTP/1.1 1080 | Host: www.example.com 1081 | User-Agent: HTTP-client/2.x.x 1082 | Accept: */* 1083 | Content-Length: 5 1084 | Content-Type: application/x-www-form-urlencoded 1085 | 1086 | id=20 1087 | 1088 | [1] <=== RESPONSE 0.5348s (200) 1089 | HTTP/1.1 200 OK 1090 | Server: nginx/1.16.1 1091 | Date: Mon, 15 Jun 2020 13:11:33 GMT 1092 | Content-Type: application/json; charset=utf-8 1093 | Transfer-Encoding: chunked 1094 | Connection: keep-alive 1095 | P3P: policyref="/bitrix/p3p.xml", CP="NON DSP COR CUR ADM DEV PSA PSD OUR UNR BUS UNI COM NAV INT DEM STA" 1096 | X-Powered-CMS: Bitrix Site Manager (bc2cad9153cb418bb2dfd5602c3c3754) 1097 | Set-Cookie: PHPSESSID=uSBxTO1tiaVfYPd7I7BhvjPLc2H2RhuD; path=/; secure; HttpOnly 1098 | Expires: Thu, 19 Nov 1981 08:52:00 GMT 1099 | Cache-Control: no-store, no-cache, must-revalidate 1100 | Pragma: no-cache 1101 | Set-Cookie: qmb=.; path=/ 1102 | Access-Control-Allow-Origin: * 1103 | Access-Control-Allow-Headers: origin, content-type, accept 1104 | X-Content-Type-Options: nosniff 1105 | X-Bitrix-Rest-Time: 0.0098488331 1106 | X-Bitrix-Rest-User-Time: 0.0042990000 1107 | X-Bitrix-Rest-System-Time: 0.0000030000 1108 | Set-Cookie: BITRIX_SM_SALE_UID=4; expires=Thu, 10-Jun-2021 13:11:33 GMT; Max-Age=31104000; path=/ 1109 | X-Frame-Options: SAMEORIGIN 1110 | X-Content-Type-Options: nosniff 1111 | Strict-Transport-Security: max-age=31536000; includeSubdomains 1112 | X-Bitrix-Times: 0.104/0.104/0.000 1113 | X-Bitrix-TCP: 32250/6750/20/14480 1114 | X-Bitrix-RI: 3b51dd618cb995cfc06d2016cc4c0c94 1115 | X-Bitrix-LB: lb-ru-04 1116 | 1117 | {"result":{"ID":"20","COMPANY_TYPE":"CUSTOMER","LOGO":null,"LEAD_ID":null,"HAS_PHONE":"N","HAS_EMAIL":"Y"}} 1118 | ``` 1119 | 1120 | 1121 | ### Класс `DebugLogger` 1122 | 1123 | Класс [`\App\DebugLogger\DebugLogger`](https://github.com/andrey-tech/debug-logger-php) обеспечивает логирование запросов и ответов к API Битрикс24 в файл. 1124 | При возникновении ошибок выбрасывается исключение класса `\App\DebugLogger\DebugLoggerException`. 1125 | 1126 | 1127 | #### Методы класса 1128 | 1129 | - `static instance(string $logFileName = 'debug.log') :self` 1130 | Возвращает единственный объект данного класса **для заданного лог-файла** `$logFileName`. 1131 | + `$logFileName` - имя лог-файла. 1132 | - `save(mixed $info, object $object = null, string $header = null) :void` Сохраняет подлежащую логированию информацию в файл. 1133 | + `$info` - строка, массив или объект для логирования; 1134 | + `$object` - ссылка на объект класса в котором выполняется логирование; 1135 | + `$header` - строка заголовка для сохраняемой в лог файл информации. 1136 | 1137 | 1138 | #### Дополнительные параметры 1139 | 1140 | Дополнительные параметры устанавливаются через публичные свойства класса `\App\DebugLogger\DebugLogger`: 1141 | 1142 | Нестатическое свойство | По умолчанию | Описание 1143 | ----------------------- | ------------- | -------- 1144 | `$isActive` | false | Включает или выключает логирование для конкретного файла, задаваемого параметром `$logFileName` метода `instance()` 1145 | 1146 | Статическое свойство | По умолчанию | Описание 1147 | ----------------------- | ------------- | -------- 1148 | `$logFileDir` | `temp/` | Устанавливает каталог, в котором сохраняются лог-файлы 1149 | `mkdirMode` | 0755 | Устанавливает режим доступа для создаваемых каталогов для хранения лог файлов в виде восьмеричного числа 1150 | `$uniqIdLength` | 7 | Длина уникального буквенно-цифрового [a-z0-9]+ идентификатора объекта класса `DebugLogger` для сохранения в лог файле, позволяющего находить записи, созданные одним и тем же процессом 1151 | 1152 | 1153 | 1154 | #### Примеры 1155 | 1156 | ```php 1157 | use App\Bitrix24\Bitrix24API; 1158 | use App\Bitrix24\Bitrix24APIException; 1159 | use App\DebugLogger\DebugLogger; 1160 | 1161 | try { 1162 | $webhookURL = 'https://www.example.com/rest/1/u7ngxagzrhpuj31a/'; 1163 | $bx24 = new Bitrix24API($webhookURL); 1164 | 1165 | // Устанавливаем каталог для сохранения лог файлов 1166 | DebugLogger::$logFileDir = 'logs/'; 1167 | 1168 | // Создаем объект класса логгера 1169 | $logFileName = 'debug_bitrix24api.log'; 1170 | $logger = DebugLogger::instance($logFileName); 1171 | 1172 | // Включаем логирование 1173 | $logger->isActive = true; 1174 | 1175 | // Устанавливаем логгер 1176 | $bx24->setLogger($logger); 1177 | 1178 | // Загружаем все компании 1179 | $bx24->fetchCompanyList(); 1180 | 1181 | } catch (Bitrix24APIException $e) { 1182 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 1183 | } catch (Exception $e) { 1184 | printf('Ошибка (%d): %s' . PHP_EOL, $e->getCode(), $e->getMessage()); 1185 | } 1186 | ``` 1187 | 1188 | Пример результатов логирования: 1189 | 1190 | ``` 1191 | *** 92qshr5 [2020-06-14 13:32:44.993285 +00:00 Δ0.012308 s, 0.70/2.00 MiB] ******************** 1192 | * Class: App\Bitrix24\Bitrix24API 1193 | ЗАПРОС: crm.company.list.json 1194 | { 1195 | "order": { 1196 | "ID": "ASC" 1197 | }, 1198 | "filter": { 1199 | ">ID": 0 1200 | }, 1201 | "select": [], 1202 | "start": -1 1203 | } 1204 | 1205 | 1206 | *** 92qshr5 [2020-06-14 13:32:46.900518 +00:00 Δ1.907233 s, 1.14/2.00 MiB] ******************** 1207 | ОТВЕТ: crm.company.list.json 1208 | { 1209 | "result": [ 1210 | { 1211 | "ID": "2", 1212 | "COMPANY_TYPE": "PARTNER", 1213 | "TITLE": "ООО", 1214 | "LOGO": { 1215 | "id": 112, 1216 | "showUrl": "\/bitrix\/components\/bitrix\/crm.company.show\/show_file.php?ownerId=2", 1217 | "downloadUrl": "\/bitrix\/components\/bitrix\/crm.company.show\/show_file.php?auth=&ownerId=2" 1218 | } 1219 | } 1220 | } 1221 | } 1222 | 1223 | *** 92qshr5 [2020-06-14 13:32:46.902085 +00:00 Δ0.001567 s, 1.30/2.00 MiB] ******************** 1224 | * Class: App\Bitrix24\Bitrix24API 1225 | По запросу (fetchList) crm.company.list получено сущностей: 50, всего получено: 50 1226 | ``` 1227 | 1228 | 1229 | ##### Формат заголовков лога 1230 | 1231 | ``` 1232 | *** 92qshr5 [2020-06-14 13:32:46.902085 +00:00 Δ0.001567 s, 1.30/2.00 MiB] ******************** 1233 | * Class: App\Bitrix24\Bitrix24API 1234 | ``` 1235 | 1236 | - `92qshr5` - уникальный буквенно-цифровой [a-z0-9]+ идентификатор объекта класса `DebugLogger`, позволяющий находить в лог файле записи, созданные одним и тем же процессом; 1237 | - `2020-06-14 13:32:46.902085` - дата и время сохранения информации с точностью до микросекунд; 1238 | - `Δ0.001567 s` - время, прошедшее с момента предыдущего сохранения информации в секундах и микросекундах; 1239 | - `1.30/2.00 MiB` - данные об используемой оперативной памяти в единицах количества информации с [двоичными приставками](https://ru.wikipedia.org/wiki/%D0%94%D0%B2%D0%BE%D0%B8%D1%87%D0%BD%D1%8B%D0%B5_%D0%BF%D1%80%D0%B8%D1%81%D1%82%D0%B0%D0%B2%D0%BA%D0%B8): 1240 | + `1.30` - максимальный объем памяти, который был выделен PHP-скрипту системой; 1241 | + `2.00` - реальный объем памяти, выделенный PHP-скрипту системой; 1242 | - 'Class: App\Bitrix24\Bitrix24API' - полное имя класса из которого сделано сохранение в лог файл. 1243 | 1244 | 1245 | ## Автор 1246 | 1247 | © 2019-2022 andrey-tech 1248 | 1249 | 1250 | ## Лицензия 1251 | 1252 | Данная библиотека распространяется на условиях лицензии [MIT](./LICENSE). 1253 | -------------------------------------------------------------------------------- /assets/bitrix24-logo-social.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrey-tech/bitrix24-api-php/d43f5839509751b72e02e14f4aed5731f8bae0e4/assets/bitrix24-logo-social.png -------------------------------------------------------------------------------- /assets/bitrix24-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/andrey-tech/bitrix24-api-php/d43f5839509751b72e02e14f4aed5731f8bae0e4/assets/bitrix24-logo.png -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "andrey-tech/bitrix24-api-php", 3 | "description": "Обертка на PHP7+ для работы с API Битрикс24 с использованием механизма входящих вебхуков, троттлингом запросов и логированием в файл", 4 | "keywords": [ "bitrix", "bitrix24", "api", "api-wrapper", "throttling", "logging", "webhook" ], 5 | "homepage": "https://github.com/andrey-tech/bitrix24-api-php", 6 | "minimum-stability": "stable", 7 | "license": "MIT", 8 | "authors": [ 9 | { 10 | "name": "andrey-tech", 11 | "homepage": "https://github.com/andrey-tech/", 12 | "role": "Developer" 13 | } 14 | ], 15 | "require": { 16 | "php": ">=7.0", 17 | "ext-json": "*", 18 | "andrey-tech/http-client-php": "^3.0", 19 | "andrey-tech/debug-logger-php": "^2.0" 20 | }, 21 | "autoload": { 22 | "psr-4": { 23 | "App\\Bitrix24\\": "src/App/Bitrix24" 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Activity.php: -------------------------------------------------------------------------------- 1 | request('crm.activity.fields'); 31 | } 32 | 33 | /** 34 | * Возвращает активность по ID 35 | * 36 | * @param int|string $activityId ID активности 37 | * @return array|null 38 | */ 39 | public function getActivity($activityId) 40 | { 41 | $activity = $this->request( 42 | 'crm.activity.get', 43 | [ 44 | 'id' => $activityId 45 | ] 46 | ); 47 | 48 | return $activity; 49 | } 50 | 51 | /** 52 | * Добавляет активность 53 | * 54 | * @param array $fields Список полей активности 55 | * @return int 56 | */ 57 | public function addActivity(array $fields = []) 58 | { 59 | $result = $this->request( 60 | 'crm.activity.add', 61 | [ 62 | 'fields' => $fields 63 | ] 64 | ); 65 | 66 | return $result; 67 | } 68 | 69 | // ------------------------------------------------------------------------ 70 | 71 | /** 72 | * Пакетно добавляет активности 73 | * 74 | * @param array $activities Массив параметров активностей 75 | * @return array Массив id активностей 76 | */ 77 | public function addActivities(array $activities = []): array 78 | { 79 | // Id добавленных активностей 80 | $activityResults = []; 81 | 82 | while ($activitiesChunk = array_splice($activities, 0, $this->batchSize)) { 83 | // Формируем массив команд на добавление активностей 84 | $commandParams = []; 85 | foreach ($activitiesChunk as $index => $activity) { 86 | $commandParams[ $index ] = [ 87 | 'fields' => $activity 88 | ]; 89 | } 90 | $commands = $this->buildCommands('crm.activity.add', $commandParams); 91 | $activityResult = $this->batchRequest($commands); 92 | 93 | // Сравниваем число команд и число id в ответе 94 | $sent = count($commandParams); 95 | $received = count($activityResult); 96 | if ($received != $sent) { 97 | $jsonResponse = $this->toJSON($this->lastResponse); 98 | throw new Bitrix24APIException( 99 | "Невозможно пакетно добавить активности ({$sent}/{$received}): {$jsonResponse}" 100 | ); 101 | } 102 | 103 | $activityResults = array_merge($activityResults, $activityResult); 104 | } 105 | 106 | return $activityResults; 107 | } 108 | } 109 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Bitrix24API.php: -------------------------------------------------------------------------------- 1 | webhookUrl = rtrim($webhookUrl, '/'); 115 | 116 | $this->http = new HTTP(); 117 | // Не более 2-х запросов в секунду (https://dev.1c-bitrix.ru/rest_help/rest_sum/index.php) 118 | $this->http->throttle = 2; 119 | $this->http->useCookies = false; 120 | } 121 | 122 | /** 123 | * Устанавливает объект класса, выполняющего логирование 124 | * @param \App\DebugLogger\DebugLoggerInterface $logger 125 | */ 126 | public function setLogger($logger) 127 | { 128 | if (!($logger instanceof \App\DebugLogger\DebugLoggerInterface)) { 129 | throw new Bitrix24APIException( 130 | "Объект класса логгера должен реализовывать интерфейс \App\DebugLogger\DebugLoggerInterface" 131 | ); 132 | } 133 | $this->logger = $logger; 134 | } 135 | 136 | /** 137 | * Возвращает последний ответ от API Битрикс24 138 | * 139 | * @return mixed 140 | */ 141 | public function getLastResponse() 142 | { 143 | return $this->lastResponse; 144 | } 145 | 146 | /** 147 | * Отправляет запрос в API системы Битрикс24 148 | * 149 | * @param string $function Имя метода (функции) запроса 150 | * @param array $params Параметры запроса 151 | * @return array|null 152 | */ 153 | public function request(string $function, array $params = []) 154 | { 155 | $function .= '.json'; 156 | $url = $this->webhookUrl . '/' . $function; 157 | 158 | // Логирование запроса 159 | if (isset($this->logger)) { 160 | $jsonParams = urldecode($this->toJSON($params, true)); 161 | $this->logger->save("ЗАПРОС: {$function}" . PHP_EOL . $jsonParams, $this); 162 | } 163 | 164 | // POST запрос 165 | $this->lastResponse = $this->http->request($url, 'POST', $params, [ 'Connection: close' ]); 166 | 167 | // Логирование ответа 168 | if (isset($this->logger)) { 169 | $jsonResponse = $this->toJSON($this->lastResponse, true); 170 | $this->logger->save("ОТВЕТ: {$function}" . PHP_EOL . $jsonResponse, $this); 171 | } 172 | 173 | // Проверка кода состояния HTTP 174 | if (! $this->http->isSuccess()) { 175 | $httpCode = $this->http->getHTTPCode(); 176 | $jsonParams = $this->toJSON($params); 177 | $jsonResponse = $this->toJSON($this->lastResponse); 178 | throw new Bitrix24APIException( 179 | "Ошибка: HTTP код {$httpCode} при запросе '{$function}' ({$jsonParams}): {$jsonResponse}" 180 | ); 181 | } 182 | 183 | // Проверка наличия ошибок в ответе 184 | if (! empty($this->lastResponse['error']) || ! empty($this->lastResponse['error_description'])) { 185 | $jsonParams = $this->toJSON($params); 186 | $jsonResponse = $this->toJSON($this->lastResponse); 187 | throw new Bitrix24APIException("Ошибка при запросе '{$function}' ({$jsonParams}): {$jsonResponse}"); 188 | } 189 | 190 | return $this->lastResponse['result']; 191 | } 192 | 193 | /** 194 | * Возвращает список всех сущностей 195 | * 196 | * @param string $function Имя метода (функции) запроса 197 | * @param array $params Параметры 198 | * запроса 199 | * @return Generator 200 | * @see https://dev.1c-bitrix.ru/rest_help/general/lists.php 201 | */ 202 | public function getList(string $function, array $params = []): Generator 203 | { 204 | do { 205 | // До 50 штук на 1 запрос 206 | $result = $this->request( 207 | $function, 208 | $params 209 | ); 210 | 211 | $start = $params['start'] ?? 0; 212 | if ($this->logger) { 213 | $this->logger->save( 214 | "По запросу (getList) {$function} (start: {$start}) получено сущностей: " . count($result) . 215 | ", всего существует: " . $this->lastResponse['total'], 216 | $this 217 | ); 218 | } 219 | 220 | yield $result; 221 | 222 | if (empty($this->lastResponse['next'])) { 223 | break; 224 | } 225 | 226 | $params['start'] = $this->lastResponse['next']; 227 | } while (true); 228 | } 229 | 230 | /** 231 | * Возвращает список всех сущностей используя быстрый метод 232 | * 233 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php 234 | * @param string $function Имя метода (функции) запроса 235 | * @param array $params Параметры 236 | * запроса 237 | * @return Generator 238 | * @see https://dev.1c-bitrix.ru/rest_help/general/lists.php 239 | */ 240 | public function fetchList(string $function, array $params = []): Generator 241 | { 242 | $params['order']['ID'] = 'ASC'; 243 | $params['filter']['>ID'] = 0; 244 | $params['start'] = -1; 245 | 246 | $totalCounter = 0; 247 | 248 | do { 249 | // До 50 штук на 1 запрос 250 | $result = $this->request( 251 | $function, 252 | $params 253 | ); 254 | 255 | $resultCounter = count($result); 256 | $totalCounter += $resultCounter; 257 | if ($this->logger) { 258 | $this->logger->save( 259 | "По запросу (fetchList) {$function} получено сущностей: {$resultCounter}, " . 260 | "всего получено: {$totalCounter}", 261 | $this 262 | ); 263 | } 264 | 265 | yield $result; 266 | 267 | if ($resultCounter < 50) { 268 | break; 269 | } 270 | 271 | $params['filter']['>ID'] = $result[ $resultCounter - 1 ]['ID']; 272 | } while (true); 273 | } 274 | 275 | /** 276 | * Отправляет пакет запросов в API системы Битрикс24 277 | * 278 | * @param array $commands Пакет 279 | * команд 280 | * @param bool $halt Определяет прерывать 281 | * ли последовательность 282 | * запросов в случае 283 | * ошибки (0|1, true|false) 284 | * @return array|null 285 | * @see https://dev.1c-bitrix.ru/rest_help/general/batch.php 286 | */ 287 | public function batchRequest(array $commands, $halt = true) 288 | { 289 | // До 50 штук на 1 запрос 290 | $result = $this->request( 291 | 'batch', 292 | [ 293 | 'halt' => (int) $halt, 294 | 'cmd' => $commands 295 | ] 296 | ); 297 | 298 | // Проверка наличия ошибок в ответе от запроса batch 299 | if (! empty($result['result_error'])) { 300 | $jsonCommands = $this->toJSON($commands); 301 | $jsonResponse = $this->toJSON($this->lastResponse); 302 | throw new Bitrix24APIException("Ошибка при запросе batch ({$jsonCommands}): {$jsonResponse}"); 303 | } 304 | 305 | return $result['result']; 306 | } 307 | 308 | /** 309 | * Формирует массив одинаковых команд для метода пакетных запросов batchRequest() 310 | * 311 | * @param string $function Имя метода (функции) запроса 312 | * @param array $items Массив 313 | * полей 314 | * запросов 315 | * @return array 316 | */ 317 | public function buildCommands(string $function, array $items): array 318 | { 319 | $commands = []; 320 | foreach ($items as $fields) { 321 | $commands[] = $this->buildCommand($function, $fields); 322 | } 323 | 324 | return $commands; 325 | } 326 | 327 | /** 328 | * Формирует строку одной команды для пакета запросов 329 | * 330 | * @param string $function Имя метода (функции) запроса 331 | * @param array $params Массив 332 | * параметров 333 | * команды 334 | * @return string 335 | * @see https://dev.1c-bitrix.ru/rest_help/general/batch.php 336 | */ 337 | public function buildCommand(string $function, array $params): string 338 | { 339 | return $function . '?' . http_build_query($params); 340 | } 341 | 342 | /** 343 | * Создает и возвращает результат со связанными сущностями 344 | * 345 | * @param array $result Результат 346 | * @param string $base Имя базовой сущности 347 | * @param array $with Имена связанных сущностей 348 | * @return array 349 | */ 350 | protected function createResultWith(array $result, string $base, array $with): array 351 | { 352 | $resultWith = $result[ $base ]; 353 | foreach ($with as $name) { 354 | $resultWith[ $name ] = $result[ $name ]; 355 | } 356 | return $resultWith; 357 | } 358 | 359 | /** 360 | * Преобразует данные в строку JSON для сообщений об ошибке или лога 361 | * 362 | * @param mixed $data Данные для 363 | * преобразования 364 | * @param bool $prettyPrint Включает pretty print 365 | * для JSON 366 | * @return string 367 | */ 368 | protected function toJSON($data, bool $prettyPrint = false): string 369 | { 370 | $encodeOptions = JSON_UNESCAPED_UNICODE | JSON_PARTIAL_OUTPUT_ON_ERROR; 371 | 372 | if ($prettyPrint) { 373 | $encodeOptions |= JSON_PRETTY_PRINT; 374 | } 375 | 376 | $jsonParams = json_encode($data, $encodeOptions); 377 | if ($jsonParams === false) { 378 | $jsonParams = print_r($data, true); 379 | } 380 | 381 | return $jsonParams; 382 | } 383 | } 384 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Bitrix24APIException.php: -------------------------------------------------------------------------------- 1 | request('crm.catalog.fields'); 35 | } 36 | 37 | /** 38 | * Возвращает все товарные каталоги 39 | * 40 | * @param array $filter Параметры фильтрации 41 | * @param array $order Параметры 42 | * сортировки 43 | * @param array $select Параметры выборки 44 | * @return Generator 45 | * @see https://dev.1c-bitrix.ru/rest_help/crm/catalog/crm_catalog_list.php 46 | */ 47 | public function getCatalogList(array $filter = [], array $select = [], array $order = []): Generator 48 | { 49 | $params = [ 50 | 'order' => $order, 51 | 'filter' => $filter, 52 | 'select' => $select 53 | ]; 54 | 55 | return $this->getList('crm.catalog.list', $params); 56 | } 57 | 58 | /** 59 | * Возвращает все товарные каталоги используя быстрый метод 60 | * 61 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php 62 | * @param array $filter Параметры фильтрации 63 | * @param array $order Параметры 64 | * сортировки 65 | * @param array $select Параметры выборки 66 | * @return Generator 67 | * @see https://dev.1c-bitrix.ru/rest_help/crm/catalog/crm_catalog_list.php 68 | */ 69 | public function fetchCatalogList(array $filter = [], array $select = [], array $order = []): Generator 70 | { 71 | $params = [ 72 | 'order' => $order, 73 | 'filter' => $filter, 74 | 'select' => $select 75 | ]; 76 | 77 | return $this->fetchList('crm.catalog.list', $params); 78 | } 79 | } 80 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Company.php: -------------------------------------------------------------------------------- 1 | request('crm.company.fields'); 35 | } 36 | 37 | /** 38 | * Возвращает компанию по ID 39 | * @param int|string $companyId ID компании 40 | * @param array $with Список связанных сущностей, 41 | * возвращаемых вместе с компанией [ self::$WITH_CONTACTS ] 42 | * @return array 43 | */ 44 | public function getCompany($companyId, array $with = []) 45 | { 46 | $with = array_map('strtoupper', $with); 47 | 48 | if (empty($with)) { 49 | return $this->request( 50 | 'crm.company.get', 51 | [ 'id' => $companyId ] 52 | ); 53 | } 54 | 55 | $commands = [ 56 | 'COMPANY' => $this->buildCommand('crm.company.get', [ 'id' => $companyId ]) 57 | ]; 58 | 59 | // Связанные контакты 60 | if (in_array(self::$WITH_CONTACTS, $with)) { 61 | $commands[self::$WITH_CONTACTS] = $this->buildCommand( 62 | 'crm.company.contact.items.get', 63 | [ 'id' => $companyId ] 64 | ); 65 | } 66 | 67 | $result = $this->batchRequest($commands, true); 68 | 69 | return $this->createResultWith($result, 'COMPANY', $with); 70 | } 71 | 72 | /** 73 | * Добавляет компанию 74 | * 75 | * @param array $fields Список полей компании 76 | * @param array $params Параметры для компании 77 | * @return int 78 | */ 79 | public function addCompany(array $fields = [], array $params = []) 80 | { 81 | $result = $this->request( 82 | 'crm.company.add', 83 | [ 84 | 'fields' => $fields, 85 | 'params' => $params 86 | ] 87 | ); 88 | 89 | return $result; 90 | } 91 | 92 | /** 93 | * Обновляет компанию 94 | * 95 | * @param int|string $companyId ID компании 96 | * @param array $fields Список 97 | * полей 98 | * компании 99 | * @param array $params Параметры 100 | * для 101 | * компании 102 | * @return int 103 | */ 104 | public function updateCompany($companyId, array $fields = [], array $params = []) 105 | { 106 | $result = $this->request( 107 | 'crm.company.update', 108 | [ 109 | 'id' => $companyId, 110 | 'fields' => $fields, 111 | 'params' => $params 112 | ] 113 | ); 114 | 115 | return $result; 116 | } 117 | 118 | /** 119 | * Удаляет компанию по ID 120 | * 121 | * @param int|string $companyId ID компании 122 | * @return int 123 | */ 124 | public function deleteCompany($companyId) 125 | { 126 | $result = $this->request( 127 | 'crm.company.delete', 128 | [ 'id' => $companyId ] 129 | ); 130 | 131 | return $result; 132 | } 133 | 134 | /** 135 | * Возвращает все компании 136 | * 137 | * @param array $filter Параметры фильтрации 138 | * @param array $order Параметры 139 | * сортировки 140 | * @param array $select Параметры выборки 141 | * @return Generator 142 | * @see https://dev.1c-bitrix.ru/rest_help/crm/company/crm_company_list.php 143 | */ 144 | public function getCompanyList(array $filter = [], array $select = [], array $order = []): Generator 145 | { 146 | $params = [ 147 | 'order' => $order, 148 | 'filter' => $filter, 149 | 'select' => $select 150 | ]; 151 | 152 | return $this->getList('crm.company.list', $params); 153 | } 154 | 155 | /** 156 | * Возвращает все компании используя быстрый метод 157 | * 158 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php 159 | * @param array $filter Параметры фильтрации 160 | * @param array $order Параметры 161 | * сортировки 162 | * @param array $select Параметры выборки 163 | * @return Generator 164 | * @see https://dev.1c-bitrix.ru/rest_help/crm/company/crm_company_list.php 165 | */ 166 | public function fetchCompanyList(array $filter = [], array $select = [], array $order = []): Generator 167 | { 168 | $params = [ 169 | 'order' => $order, 170 | 'filter' => $filter, 171 | 'select' => $select 172 | ]; 173 | 174 | return $this->fetchList('crm.company.list', $params); 175 | } 176 | 177 | // ------------------------------------------------------------------------ 178 | 179 | /** 180 | * Возвращает контакты, связанные с компанией по ID компании 181 | * 182 | * @param int|string $companyId ID компании 183 | * @return array 184 | */ 185 | public function getCompanyContactItems($companyId) 186 | { 187 | $result = $this->request( 188 | 'crm.company.contact.items.get', 189 | [ 'id' => $companyId ] 190 | ); 191 | 192 | return $result; 193 | } 194 | 195 | /** 196 | * Устанавливает контакты, связанные с компанией по ID компании 197 | * 198 | * @param int|string $companyId ID компании 199 | * @param array $contacts Массив 200 | * контактов 201 | * @return array 202 | */ 203 | public function setCompanyContactItems($companyId, array $contacts) 204 | { 205 | $result = $this->request( 206 | 'crm.company.contact.items.set', 207 | [ 208 | 'id' => $companyId, 209 | 'items' => $contacts 210 | ] 211 | ); 212 | 213 | return $result; 214 | } 215 | 216 | // ------------------------------------------------------------------------ 217 | 218 | /** 219 | * Пакетно добавляет компании 220 | * 221 | * @param array $companies Массив компаний 222 | * @param array $params Параметры 223 | * для 224 | * компаний 225 | * @return array Массив id компаний 226 | */ 227 | public function addCompanies(array $companies = [], array $params = []): array 228 | { 229 | // Id добавленных компаний 230 | $companyResults = []; 231 | 232 | while ($companiesChunk = array_splice($companies, 0, $this->batchSize)) { 233 | // Формируем массив команд на добавление компаний 234 | $commandParams = []; 235 | foreach ($companiesChunk as $index => $company) { 236 | $commandParams[ $index ] = [ 237 | 'fields' => $company, 238 | 'params' => $params 239 | ]; 240 | } 241 | $commands = $this->buildCommands('crm.company.add', $commandParams); 242 | $companyResult = $this->batchRequest($commands); 243 | 244 | // Сравниваем число команд и число id в ответе 245 | $sent = count($commandParams); 246 | $received = count($companyResult); 247 | if ($received != $sent) { 248 | $jsonResponse = $this->toJSON($this->lastResponse); 249 | throw new Bitrix24APIException( 250 | "Невозможно пакетно добавить компании ({$sent}/{$received}): {$jsonResponse}" 251 | ); 252 | } 253 | 254 | $companyResults = array_merge($companyResults, $companyResult); 255 | } 256 | 257 | return $companyResults; 258 | } 259 | 260 | /** 261 | * Пакетно обновляет компании 262 | * 263 | * @param array $companies Массив компаний 264 | * @param array $params Параметры 265 | * для 266 | * компаний 267 | * @return array Массив id компаний 268 | */ 269 | public function updateCompanies(array $companies = [], array $params = []): array 270 | { 271 | // Id обновленных компаний 272 | $companyResults = []; 273 | 274 | while ($companiesChunk = array_splice($companies, 0, $this->batchSize)) { 275 | $commandParams = []; 276 | foreach ($companiesChunk as $index => $company) { 277 | // Проверка наличия поля ID в компании на обновление 278 | $companyId = $company['ID'] ?? null; 279 | if (empty($companyId)) { 280 | $jsonCompany = $this->toJSON($company); 281 | throw new Bitrix24APIException( 282 | "Поле 'ID' в компании (index {$index}) на обновление отсутствует или пустое: '{$jsonCompany}'" 283 | ); 284 | } 285 | $companyResults[] = $companyId; 286 | 287 | $commandParams[ $index ] = [ 288 | 'id' => $companyId, 289 | 'fields' => $company, 290 | 'params' => $params 291 | ]; 292 | } 293 | $commands = $this->buildCommands('crm.company.update', $commandParams); 294 | $result = $this->batchRequest($commands); 295 | 296 | // Сравниваем число команд и число статусов в ответе 297 | $sent = count($commandParams); 298 | $received = count($result); 299 | if ($received != $sent) { 300 | $jsonResponse = $this->toJSON($this->lastResponse); 301 | throw new Bitrix24APIException( 302 | "Невозможно пакетно обновить компании ({$sent}/{$received}): {$jsonResponse}" 303 | ); 304 | } 305 | } 306 | 307 | return $companyResults; 308 | } 309 | 310 | /** 311 | * Пакетно удаляет компании 312 | * 313 | * @param array $companyIds Массив id компаний 314 | * @return array Массив id компаний 315 | */ 316 | public function deleteCompanies(array $companyIds = []): array 317 | { 318 | // Id удаленных компаний 319 | $companyResults = []; 320 | 321 | while ($companiesChunk = array_splice($companyIds, 0, $this->batchSize)) { 322 | // Формируем массив команд на удаление компаний 323 | $commandParams = []; 324 | foreach ($companiesChunk as $index => $companyId) { 325 | $commandParams[ $index ] = [ 'id' => $companyId ]; 326 | $companyResults[] = $companyId; 327 | } 328 | 329 | $commands = $this->buildCommands('crm.company.delete', $commandParams); 330 | $companyResult = $this->batchRequest($commands); 331 | 332 | // Сравниваем число команд и число статусов в ответе 333 | $sent = count($commandParams); 334 | $received = count($companyResult); 335 | if ($received != $sent) { 336 | $jsonResponse = $this->toJSON($this->lastResponse); 337 | throw new Bitrix24APIException( 338 | "Невозможно пакетно удалить компании ({$sent}/{$received}): {$jsonResponse}" 339 | ); 340 | } 341 | } 342 | 343 | return $companyResults; 344 | } 345 | } 346 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Contact.php: -------------------------------------------------------------------------------- 1 | request('crm.contact.fields'); 36 | } 37 | 38 | /** 39 | * Возвращает контакт по ID 40 | * 41 | * @param int|string $contactId ID контакта 42 | * @param array $with Список связанных сущностей, 43 | * возвращаемых вместе с контактом [ self::$WITH_COMPANIES ] 44 | * @return array 45 | */ 46 | public function getContact($contactId, array $with = []) 47 | { 48 | $with = array_map('strtoupper', $with); 49 | 50 | if (empty($with)) { 51 | return $this->request( 52 | 'crm.contact.get', 53 | [ 'id' => $contactId ] 54 | ); 55 | } 56 | 57 | $commands = [ 58 | 'CONTACT' => $this->buildCommand('crm.contact.get', [ 'id' => $contactId ]) 59 | ]; 60 | 61 | // Связанные компании 62 | if (in_array(self::$WITH_COMPANIES, $with)) { 63 | $commands[self::$WITH_COMPANIES] = $this->buildCommand( 64 | 'crm.contact.company.items.get', 65 | [ 'id' => $contactId ] 66 | ); 67 | } 68 | 69 | $result = $this->batchRequest($commands, true); 70 | 71 | return $this->createResultWith($result, 'CONTACT', $with); 72 | } 73 | 74 | /** 75 | * Возвращает контакты по номеру телефона 76 | * 77 | * @param int|string $phone Номер телефона 78 | * @param array $select Параметры выборки 79 | * @return array 80 | */ 81 | public function getContactsByPhone($phone, $select = []) 82 | { 83 | return $this->request( 84 | 'crm.contact.list', 85 | [ 86 | 'filter' => [ 'PHONE' => $phone ], 87 | 'select' => $select 88 | ] 89 | ); 90 | } 91 | 92 | /** 93 | * Добавляет контакт 94 | * 95 | * @param array $fields Список полей контакта 96 | * @param array $params Параметры для контакта 97 | * @return int 98 | */ 99 | public function addContact(array $fields = [], array $params = []) 100 | { 101 | $result = $this->request( 102 | 'crm.contact.add', 103 | [ 104 | 'fields' => $fields, 105 | 'params' => $params 106 | ] 107 | ); 108 | 109 | return $result; 110 | } 111 | 112 | /** 113 | * Обновляет контакт 114 | * 115 | * @param string|int $contactId ID контакта 116 | * @param array $fields Список 117 | * полей 118 | * контакта 119 | * @param array $params Список 120 | * параметров 121 | * контакта 122 | * @return int 123 | */ 124 | public function updateContact($contactId, array $fields = [], array $params = []) 125 | { 126 | $result = $this->request( 127 | 'crm.contact.update', 128 | [ 129 | 'id' => $contactId, 130 | 'fields' => $fields, 131 | 'params' => $params 132 | ] 133 | ); 134 | 135 | return $result; 136 | } 137 | 138 | /** 139 | * Удаляет контакт по ID 140 | * 141 | * @param int|string $contactId ID контакта 142 | * @return int 143 | */ 144 | public function deleteContact($contactId) 145 | { 146 | $result = $this->request( 147 | 'crm.contact.delete', 148 | [ 'id' => $contactId ] 149 | ); 150 | 151 | return $result; 152 | } 153 | 154 | /** 155 | * Возвращает все контакты 156 | * 157 | * @param array $filter Параметры фильтрации 158 | * @param array $order Параметры 159 | * сортировки 160 | * @param array $select Параметры выборки 161 | * @return Generator 162 | */ 163 | public function getContactList(array $filter = [], array $select = [], array $order = []): Generator 164 | { 165 | $params = [ 166 | 'order' => $order, 167 | 'filter' => $filter, 168 | 'select' => $select 169 | ]; 170 | 171 | return $this->getList('crm.contact.list', $params); 172 | } 173 | 174 | /** 175 | * Возвращает все контакты используя быстрый метод 176 | * 177 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php 178 | * @param array $filter Параметры фильтрации 179 | * @param array $order Параметры 180 | * сортировки 181 | * @param array $select Параметры выборки 182 | * @return Generator 183 | */ 184 | public function fetchContactList(array $filter = [], array $select = [], array $order = []): Generator 185 | { 186 | $params = [ 187 | 'order' => $order, 188 | 'filter' => $filter, 189 | 'select' => $select 190 | ]; 191 | 192 | return $this->fetchList('crm.contact.list', $params); 193 | } 194 | 195 | // ------------------------------------------------------------------------ 196 | 197 | /** 198 | * Возвращает компании, связанные с контактом по ID контакта 199 | * 200 | * @param int|string $contactId ID контакта 201 | * @return array 202 | */ 203 | public function getContactCompanyItems($contactId) 204 | { 205 | $result = $this->request( 206 | 'crm.contact.company.items.get', 207 | [ 'id' => $contactId ] 208 | ); 209 | 210 | return $result; 211 | } 212 | 213 | /** 214 | * Устанавливает компании, связанные с контактом по ID контакта 215 | * 216 | * @param int|string $contactId ID контакта 217 | * @param array $companies Массив 218 | * компаний 219 | * @return array 220 | */ 221 | public function setContactCompanyItems($contactId, array $companies) 222 | { 223 | $result = $this->request( 224 | 'crm.contact.company.items.set', 225 | [ 226 | 'id' => $contactId, 227 | 'items' => $companies 228 | ] 229 | ); 230 | 231 | return $result; 232 | } 233 | 234 | // ------------------------------------------------------------------------ 235 | 236 | /** 237 | * Пакетно добавляет контакты 238 | * 239 | * @param array $contacts Массив контактов (поля связанных сущностей [ 'COMPANY_ID' ]) 240 | * @param array $params Параметры 241 | * для 242 | * контактов 243 | * @return array Массив Id контактов 244 | */ 245 | public function addContacts(array $contacts = [], array $params = []): array 246 | { 247 | // Id добавленных контактов 248 | $contactResults = []; 249 | 250 | while ($contactsChunk = array_splice($contacts, 0, $this->batchSize)) { 251 | $commandParams = []; 252 | foreach ($contactsChunk as $index => $contact) { 253 | $commandParams[ $index ] = [ 254 | 'fields' => $contact, 255 | 'params' => $params 256 | ]; 257 | } 258 | $commands = $this->buildCommands('crm.contact.add', $commandParams); 259 | $result = $this->batchRequest($commands); 260 | 261 | // Сравниваем число команд и число id в ответе 262 | $sent = count($commandParams); 263 | $received = count($result); 264 | if ($received != $sent) { 265 | $jsonResponse = $this->toJSON($this->lastResponse); 266 | throw new Bitrix24APIException( 267 | "Невозможно пакетно добавить контакты ({$sent}/{$received}): {$jsonResponse}" 268 | ); 269 | } 270 | 271 | $contactResults = array_merge($contactResults, $result); 272 | } 273 | 274 | return $contactResults; 275 | } 276 | 277 | /** 278 | * Пакетно обновляет контакты 279 | * 280 | * @param array $contacts Массив контактов (поля связанных сущностей [ 'COMPANY_ID' ]) 281 | * @param array $params Параметры 282 | * для 283 | * контактов 284 | * @return array Массив Id контактов 285 | */ 286 | public function updateContacts(array $contacts = [], array $params = []): array 287 | { 288 | // Id обновленных контактов 289 | $contactResults = []; 290 | 291 | while ($contactsChunk = array_splice($contacts, 0, $this->batchSize)) { 292 | $commandParams = []; 293 | foreach ($contactsChunk as $index => $contact) { 294 | // Проверка наличия поля ID в контакте на обновление 295 | $contactId = $contact['ID'] ?? null; 296 | if (empty($contactId)) { 297 | $jsonContact = $this->toJSON($contact); 298 | throw new Bitrix24APIException( 299 | "Поле 'ID' в контакте (index {$index}) на обновление отсутствует или пустое: '{$jsonContact}'" 300 | ); 301 | } 302 | $contactResults[] = $contactId; 303 | 304 | $commandParams[ $index ] = [ 305 | 'id' => $contactId, 306 | 'fields' => $contact, 307 | 'params' => $params 308 | ]; 309 | } 310 | $commands = $this->buildCommands('crm.contact.update', $commandParams); 311 | $result = $this->batchRequest($commands); 312 | 313 | // Сравниваем число команд и число статусов в ответе 314 | $sent = count($commandParams); 315 | $received = count($result); 316 | if ($received != $sent) { 317 | $jsonResponse = $this->toJSON($this->lastResponse); 318 | throw new Bitrix24APIException( 319 | "Невозможно пакетно обновить контакты ({$sent}/{$received}): {$jsonResponse}" 320 | ); 321 | } 322 | } 323 | 324 | return $contactResults; 325 | } 326 | 327 | /** 328 | * Пакетно удаляет контакты 329 | * 330 | * @param array $contactIds Массив Id контактов 331 | * @return array Массив Id контактов 332 | */ 333 | public function deleteContacts(array $contactIds = []): array 334 | { 335 | // Id удаленных контактов 336 | $contactResults = []; 337 | 338 | while ($contactsChunk = array_splice($contactIds, 0, $this->batchSize)) { 339 | $commandParams = []; 340 | foreach ($contactsChunk as $index => $contactId) { 341 | $commandParams[ $index ] = [ 'id' => $contactId ]; 342 | $contactResults[] = $contactId; 343 | } 344 | $commands = $this->buildCommands('crm.contact.delete', $commandParams); 345 | $result = $this->batchRequest($commands); 346 | 347 | // Сравниваем число команд и число статусов в ответе 348 | $sent = count($commandParams); 349 | $received = count($result); 350 | if ($received != $sent) { 351 | $jsonResponse = $this->toJSON($this->lastResponse); 352 | throw new Bitrix24APIException( 353 | "Невозможно пакетно удалить контакты ({$sent}/{$received}): {$jsonResponse}" 354 | ); 355 | } 356 | } 357 | 358 | return $contactResults; 359 | } 360 | } 361 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Deal.php: -------------------------------------------------------------------------------- 1 | request('crm.deal.fields'); 36 | } 37 | 38 | /** 39 | * Возвращает сделку по ID 40 | * 41 | * @param int|string $dealId ID сделки 42 | * @param array $with Список связанных сущностей, 43 | * возвращаемых вместе со сделкой [ self::$WITH_CONTACTS, self::$WITH_PRODUCTS ] 44 | * @return array 45 | */ 46 | public function getDeal($dealId, array $with = []) 47 | { 48 | $with = array_map('strtoupper', $with); 49 | 50 | if (empty($with)) { 51 | return $this->request( 52 | 'crm.deal.get', 53 | [ 'id' => $dealId ] 54 | ); 55 | } 56 | 57 | $commands = [ 58 | 'DEAL' => $this->buildCommand('crm.deal.get', [ 'id' => $dealId ]) 59 | ]; 60 | 61 | // Связанные товары 62 | if (in_array(self::$WITH_PRODUCTS, $with)) { 63 | $commands[self::$WITH_PRODUCTS] = $this->buildCommand('crm.deal.productrows.get', [ 'id' => $dealId ]); 64 | } 65 | 66 | // Связанные контакты 67 | if (in_array(self::$WITH_CONTACTS, $with)) { 68 | $commands[self::$WITH_CONTACTS] = $this->buildCommand('crm.deal.contact.items.get', [ 'id' => $dealId ]); 69 | } 70 | 71 | $result = $this->batchRequest($commands, true); 72 | 73 | return $this->createResultWith($result, 'DEAL', $with); 74 | } 75 | 76 | /** 77 | * Добавляет сделку 78 | * 79 | * @param array $fields Список полей сделки 80 | * @param array $params Параметры для сделки 81 | * @return int 82 | */ 83 | public function addDeal(array $fields = [], array $params = []) 84 | { 85 | $result = $this->request( 86 | 'crm.deal.add', 87 | [ 88 | 'fields' => $fields, 89 | 'params' => $params 90 | ] 91 | ); 92 | return $result; 93 | } 94 | 95 | /** 96 | * Обновляет сделку 97 | * 98 | * @param int|string $dealId ID сделки 99 | * @param array $fields Список полей сделки 100 | * @param array $params Параметры для сделки 101 | * @return int 102 | */ 103 | public function updateDeal($dealId, array $fields = [], array $params = []) 104 | { 105 | $result = $this->request( 106 | 'crm.deal.update', 107 | [ 108 | 'id' => $dealId, 109 | 'fields' => $fields, 110 | 'params' => $params 111 | ] 112 | ); 113 | return $result; 114 | } 115 | 116 | /** 117 | * Удаляет сделку по ID 118 | * 119 | * @param int|string $dealId ID сделки 120 | * @return int 121 | */ 122 | public function deleteDeal($dealId) 123 | { 124 | $result = $this->request( 125 | 'crm.deal.delete', 126 | [ 'id' => $dealId ] 127 | ); 128 | return $result; 129 | } 130 | 131 | /** 132 | * Возвращает все сделки 133 | * 134 | * @param array $filter Параметры фильтрации 135 | * @param array $order Параметры 136 | * сортировки 137 | * @param array $select Параметры выборки 138 | * @return Generator 139 | * @see https://dev.1c-bitrix.ru/rest_help/crm/cdeals/crm_deal_list.php 140 | */ 141 | public function getDealList(array $filter = [], array $select = [], array $order = []): Generator 142 | { 143 | $params = [ 144 | 'order' => $order, 145 | 'filter' => $filter, 146 | 'select' => $select 147 | ]; 148 | 149 | return $this->getList('crm.deal.list', $params); 150 | } 151 | 152 | /** 153 | * Возвращает все сделки используя быстрый метод 154 | * 155 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php 156 | * @param array $filter Параметры фильтрации 157 | * @param array $order Параметры 158 | * сортировки 159 | * @param array $select Параметры выборки 160 | * @return Generator 161 | * @see https://dev.1c-bitrix.ru/rest_help/crm/cdeals/crm_deal_list.php 162 | */ 163 | public function fetchDealList(array $filter = [], array $select = [], array $order = []): Generator 164 | { 165 | $params = [ 166 | 'order' => $order, 167 | 'filter' => $filter, 168 | 'select' => $select 169 | ]; 170 | 171 | return $this->fetchList('crm.deal.list', $params); 172 | } 173 | 174 | // ------------------------------------------------------------------------ 175 | 176 | /** 177 | * Возвращает контакты, связанные со сделкой по ID сделки 178 | * 179 | * @param int|string $dealId ID сделки 180 | * @return array 181 | */ 182 | public function getDealContactItems($dealId) 183 | { 184 | $result = $this->request( 185 | 'crm.deal.contact.items.get', 186 | [ 'id' => $dealId ] 187 | ); 188 | 189 | return $result; 190 | } 191 | 192 | /** 193 | * Устанавливает контакты, связанные со сделкой по ID сделки 194 | * 195 | * @param int|string $dealId ID сделки 196 | * @param array $contacts Массив контактов 197 | * @return array 198 | */ 199 | public function setDealContactItems($dealId, array $contacts) 200 | { 201 | $result = $this->request( 202 | 'crm.deal.contact.items.set', 203 | [ 204 | 'id' => $dealId, 205 | 'items' => $contacts 206 | ] 207 | ); 208 | return $result; 209 | } 210 | 211 | // ------------------------------------------------------------------------ 212 | 213 | /** 214 | * Возвращает товарные позиции, связанные со сделкой по ID сделки 215 | * 216 | * @param int|string $dealId ID сделки 217 | * @return array 218 | */ 219 | public function getDealProductRows($dealId) 220 | { 221 | $result = $this->request( 222 | 'crm.deal.productrows.get', 223 | [ 'id' => $dealId ] 224 | ); 225 | 226 | return $result; 227 | } 228 | 229 | /** 230 | * Устанавливает товарные позиции, связанные со сделкой по ID сделки 231 | * 232 | * @param int|string $dealId ID сделки 233 | * @param array $products Массив товаров 234 | * @return array 235 | */ 236 | public function setDealProductRows($dealId, array $products) 237 | { 238 | $result = $this->request( 239 | 'crm.deal.productrows.set', 240 | [ 241 | 'id' => $dealId, 242 | 'rows' => $products 243 | ] 244 | ); 245 | 246 | return $result; 247 | } 248 | 249 | // ------------------------------------------------------------------------ 250 | 251 | /** 252 | * Пакетно добавляет сделки c товарными позициями 253 | * 254 | * @param array $deals Массив сделок (поля связанных сущностей [ 'COMPANY_ID', 'CONTACT_ID', 'PRODUCTS' ]) 255 | * @param array $params Параметры сделок 256 | * @return array Массив id сделок 257 | */ 258 | public function addDeals(array $deals = [], array $params = []): array 259 | { 260 | // Id созданных сделок 261 | $dealResults = []; 262 | 263 | while ($dealsChunk = array_splice($deals, 0, $this->batchSize)) { 264 | // Формируем массив команд на добавление сделок 265 | $commandParams = []; 266 | foreach ($dealsChunk as $index => $deal) { 267 | $commandParams[ $index ] = [ 268 | 'fields' => $deal, 269 | 'params' => $params 270 | ]; 271 | } 272 | $commands = $this->buildCommands('crm.deal.add', $commandParams); 273 | $dealResult = $this->batchRequest($commands); 274 | 275 | // Сравниваем число команд и число Id созданных сделок в ответе 276 | $sent = count($commandParams); 277 | $received = count($dealResult); 278 | if ($received != $sent) { 279 | $jsonResponse = $this->toJSON($this->lastResponse); 280 | throw new Bitrix24APIException( 281 | "Невозможно пакетно добавить сделки ({$sent}/{$received}): {$jsonResponse}" 282 | ); 283 | } 284 | 285 | // Формируем массив команд на добавление товаров к сделкам 286 | $commandParams = []; 287 | foreach ($dealsChunk as $index => $deal) { 288 | // Пропускаем сделки без поля PRODUCTS или без товаров 289 | if ( 290 | ! isset($deal['PRODUCTS']) 291 | || ! is_array($deal['PRODUCTS']) 292 | || count($deal['PRODUCTS']) == 0 293 | ) { 294 | continue; 295 | } 296 | 297 | $commandParams[ $index ] = [ 298 | 'id' => $dealResult[ $index ], 299 | 'rows' => $deal['PRODUCTS'] 300 | ]; 301 | } 302 | $commands = $this->buildCommands('crm.deal.productrows.set', $commandParams); 303 | $productResult = $this->batchRequest($commands); 304 | 305 | // Сравниваем число команд и число статусов в ответе 306 | $sent = count($commandParams); 307 | $received = count($productResult); 308 | if ($received != $sent) { 309 | $jsonResponse = $this->toJSON($this->lastResponse); 310 | throw new Bitrix24APIException( 311 | "Невозможно пакетно добавить товары к сделкам ({$sent}/{$received}): {$jsonResponse}" 312 | ); 313 | } 314 | 315 | // Сохраняем Id созданных сделок 316 | $dealResults = array_merge($dealResults, $dealResult); 317 | } 318 | 319 | return $dealResults; 320 | } 321 | 322 | /** 323 | * Пакетно обновляет сделки c товарными позициями 324 | * 325 | * @param array $deals Массив сделок (поля связанных сущностей [ 326 | * 'COMPANY_ID', 'CONTACT_ID', 'PRODUCTS' ]) 327 | * Если в сделке много 328 | * контактов, а в запросе на обновление сделки 329 | * передано поле CONTACT_ID, то после обновления в 330 | * сделке остается только 1 контакт или 0 331 | * контактов, если CONTACT_ID пуст. 332 | * 333 | * @param array $params Параметры сделок 334 | * @return array Массив id сделок 335 | */ 336 | public function updateDeals(array $deals = [], array $params = []): array 337 | { 338 | // Id обновленных сделок 339 | $dealResults = []; 340 | 341 | while ($dealsChunk = array_splice($deals, 0, $this->batchSize)) { 342 | // Формируем массив команд на обновление сделок 343 | $commandParams = []; 344 | foreach ($dealsChunk as $index => $deal) { 345 | // Проверка наличия поля ID в сделке на обновление 346 | $dealId = $deal['ID'] ?? null; 347 | if (empty($dealId)) { 348 | $jsonDeal = $this->toJSON($deal); 349 | throw new Bitrix24APIException( 350 | "Поле 'ID' в сделке (index {$index}) на обновление отсутствует или пустое: '{$jsonDeal}'" 351 | ); 352 | } 353 | $dealResults[] = $dealId; 354 | 355 | $commandParams[ $index ] = [ 356 | 'id' => $dealId, 357 | 'fields' => $deal, 358 | 'params' => $params 359 | ]; 360 | } 361 | $commands = $this->buildCommands('crm.deal.update', $commandParams); 362 | $dealResult = $this->batchRequest($commands); 363 | 364 | // Сравниваем число команд и число успешных статусов в ответе 365 | $sent = count($commandParams); 366 | $received = count($dealResult); 367 | if ($received != $sent) { 368 | $jsonResponse = $this->toJSON($this->lastResponse); 369 | throw new Bitrix24APIException( 370 | "Невозможно пакетно обновить сделки ({$sent}/{$received}): {$jsonResponse}" 371 | ); 372 | } 373 | 374 | // Формируем массив команд на обновление товаров в сделках 375 | $commandParams = []; 376 | foreach ($dealsChunk as $index => $deal) { 377 | // Пропускаем сделки без поля PRODUCTS 378 | if ( 379 | ! isset($deal['PRODUCTS']) 380 | || ! is_array($deal['PRODUCTS']) 381 | ) { 382 | continue; 383 | } 384 | 385 | // Если сделка без товаров, удаляем товары в существующей сделке 386 | $products = count($deal['PRODUCTS']) ? $deal['PRODUCTS'] : []; 387 | 388 | $commandParams[ $index ] = [ 389 | 'id' => $deal['ID'], 390 | 'rows' => $products 391 | ]; 392 | } 393 | $commands = $this->buildCommands('crm.deal.productrows.set', $commandParams); 394 | $productResult = $this->batchRequest($commands); 395 | 396 | // Сравниваем число команд и число статусов в ответе 397 | $sent = count($commandParams); 398 | $received = count($productResult); 399 | if ($received != $sent) { 400 | $jsonResponse = $this->toJSON($this->lastResponse); 401 | throw new Bitrix24APIException( 402 | "Невозможно пакетно обновить товары в сделках ({$sent}/{$received}): {$jsonResponse}" 403 | ); 404 | } 405 | } 406 | 407 | return $dealResults; 408 | } 409 | 410 | /** 411 | * Пакетно удаляет сделки 412 | * 413 | * @param array $dealIds Массив id сделок 414 | * @return array Массив id сделок 415 | */ 416 | public function deleteDeals(array $dealIds = []): array 417 | { 418 | // Id удаленных сделок 419 | $dealResults = []; 420 | 421 | while ($dealsChunk = array_splice($dealIds, 0, $this->batchSize)) { 422 | // Формируем массив команд на удаление сделок 423 | $commandParams = []; 424 | foreach ($dealsChunk as $index => $dealId) { 425 | $commandParams[ $index ] = [ 'id' => $dealId ]; 426 | $dealResults[] = $dealId; 427 | } 428 | 429 | $commands = $this->buildCommands('crm.deal.delete', $commandParams); 430 | $dealResult = $this->batchRequest($commands); 431 | 432 | // Сравниваем число команд и число успешных статусов в ответе 433 | $sent = count($commandParams); 434 | $received = count($dealResult); 435 | if ($received != $sent) { 436 | $jsonResponse = $this->toJSON($this->lastResponse); 437 | throw new Bitrix24APIException( 438 | "Невозможно пакетно удалить сделки ({$sent}/{$received}): {$jsonResponse}" 439 | ); 440 | } 441 | } 442 | 443 | return $dealResults; 444 | } 445 | 446 | // ------------------------------------------------------------------------ 447 | 448 | /** 449 | * Устанавливает файл в НЕ множественное пользовательское поле типа файл (файл нельзя удалить) 450 | * 451 | * @param int|string $dealId Id cделки 452 | * @param int|string $userFieldId Id НЕ множественного пользовательского поля в сделке ('UF_CRM_XXXXXXXXXX') 453 | * @param string $fileName Имя файла 454 | * @param string $fileContent Raw данные файла 455 | * @param bool $isBase64FileData Raw данные файла закодированы base64? 456 | * @return int 457 | * @see https://dev.1c-bitrix.ru/rest_help/crm/cases/edit/form_lead_with_files.php 458 | */ 459 | public function setDealFile( 460 | $dealId, 461 | $userFieldId, 462 | string $fileName, 463 | string $fileContent, 464 | bool $isBase64FileData = true 465 | ) { 466 | 467 | if (! $isBase64FileData) { 468 | $fileContent = base64_encode($fileContent); 469 | } 470 | 471 | $fields = [ 472 | $userFieldId => [ 'fileData' => [ $fileName, $fileContent ] ] 473 | ]; 474 | 475 | $result = $this->updateDeal($dealId, $fields); 476 | 477 | return $result; 478 | } 479 | 480 | /** 481 | * Устанавливает файлы во множественное пользовательское поле типа файл (файлы можно удалить) 482 | * 483 | * @param int|string $dealId Id cделки 484 | * @param int|string $userFieldId Id множественного пользовательского поля в сделке ('UF_CRM_XXXXXXXXXX') 485 | * @param array $files Массив параметров файлов ([ [ <Имя файла>, ], ... ]) 486 | * (пустой массив для удаления всех файлов). 487 | * @param bool $isBase64FileData Raw данные файла закодированы base64? 488 | * @return int 489 | * @see https://dev.1c-bitrix.ru/rest_help/crm/cases/edit/form_lead_with_files.php 490 | */ 491 | public function setDealFiles( 492 | $dealId, 493 | $userFieldId, 494 | array $files = [], 495 | bool $isBase64FileData = true 496 | ) { 497 | 498 | $userFieldValue = []; 499 | foreach ($files as $file) { 500 | if (! $isBase64FileData) { 501 | $file[1] = base64_encode($file[1]); 502 | } 503 | $userFieldValue[] = [ 504 | 'fileData' => $file 505 | ]; 506 | } 507 | 508 | // Если удаление всех файлов 509 | if (! count($userFieldValue)) { 510 | $userFieldValue = ''; 511 | } 512 | 513 | $fields = [ 514 | $userFieldId => $userFieldValue 515 | ]; 516 | 517 | $result = $this->updateDeal($dealId, $fields); 518 | 519 | return $result; 520 | } 521 | } 522 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Disk.php: -------------------------------------------------------------------------------- 1 | $filter 37 | ]; 38 | 39 | return $this->getList('disk.storage.getlist', $params); 40 | } 41 | 42 | /** 43 | * Возвращает список файлов и папок, которые находятся непосредственно в корне хранилища 44 | * 45 | * @param int|string $storageId Id хранилища 46 | * @param array $filter Параметры 47 | * фильтрации 48 | * @return array 49 | */ 50 | public function getDiskStorageChildren($storageId, array $filter = []) 51 | { 52 | $result = $this->request( 53 | 'disk.storage.getchildren', 54 | [ 55 | 'id' => $storageId, 56 | 'filter' => $filter 57 | ] 58 | ); 59 | 60 | return $result; 61 | } 62 | 63 | /** 64 | * Загружает новый файл в указанную папку на Диск 65 | * 66 | * @param int|string $folderId Id 67 | * папки 68 | * @param string $fileContent Raw 69 | * данные 70 | * файла 71 | * @param array $data Массив параметров, 72 | * описывающих файл 73 | * (обязательное поле 74 | * NAME - имя нового 75 | * файла) 76 | * @param bool $isBase64FileData Raw данные файла 77 | * закодированы base64? 78 | * @return array 79 | * @see https://dev.1c-bitrix.ru/rest_help/disk/folder/disk_folder_uploadfile.php 80 | */ 81 | public function uploadfileDiskFolder( 82 | $folderId, 83 | string $fileContent, 84 | array $data, 85 | bool $isBase64FileData = true 86 | ) { 87 | 88 | if (! $isBase64FileData) { 89 | $fileContent = base64_encode($fileContent); 90 | } 91 | 92 | $result = $this->request( 93 | 'disk.folder.uploadfile', 94 | [ 95 | 'id' => $folderId, 96 | 'fileContent' => $fileContent, 97 | 'data' => $data 98 | ] 99 | ); 100 | 101 | return $result; 102 | } 103 | } 104 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Lead.php: -------------------------------------------------------------------------------- 1 | request('crm.lead.fields'); 34 | } 35 | 36 | /** 37 | * Возвращает лид по ID 38 | * @param int|string $leadId ID лида 39 | * @param array $with Список связанных сущностей, 40 | * возвращаемых вместе с лидом [ self::$WITH_PRODUCTS ] 41 | * @return array 42 | */ 43 | public function getLead($leadId, array $with = []) 44 | { 45 | $with = array_map('strtoupper', $with); 46 | 47 | if (empty($with)) { 48 | return $this->request( 49 | 'crm.lead.get', 50 | [ 'id' => $leadId ] 51 | ); 52 | } 53 | 54 | $commands = [ 55 | 'LEAD' => $this->buildCommand('crm.lead.get', [ 'id' => $leadId ]) 56 | ]; 57 | 58 | // Связанные товары 59 | if (in_array(self::$WITH_PRODUCTS, $with)) { 60 | $commands[self::$WITH_PRODUCTS] = $this->buildCommand( 61 | 'crm.lead.productrows.get', 62 | [ 'id' => $leadId ] 63 | ); 64 | } 65 | 66 | $result = $this->batchRequest($commands, true); 67 | 68 | return $this->createResultWith($result, 'LEAD', $with); 69 | } 70 | 71 | /** 72 | * Добавляет лид 73 | * 74 | * @param array $fields Список полей лида 75 | * @param array $params Параметры для лида 76 | * @return int 77 | */ 78 | public function addLead(array $fields = [], array $params = []) 79 | { 80 | $result = $this->request( 81 | 'crm.lead.add', 82 | [ 83 | 'fields' => $fields, 84 | 'params' => $params 85 | ] 86 | ); 87 | return $result; 88 | } 89 | 90 | /** 91 | * Обновляет лид 92 | * 93 | * @param int|string $leadId ID лида 94 | * @param array $fields Список 95 | * полей 96 | * лида 97 | * @param array $params Параметры 98 | * для лида 99 | * @return int 100 | */ 101 | public function updateLead($leadId, array $fields = [], array $params = []) 102 | { 103 | $result = $this->request( 104 | 'crm.lead.update', 105 | [ 106 | 'id' => $leadId, 107 | 'fields' => $fields, 108 | 'params' => $params 109 | ] 110 | ); 111 | return $result; 112 | } 113 | 114 | /** 115 | * Удаляет лид по ID 116 | * 117 | * @param int|string $leadId ID лида 118 | * @return int 119 | */ 120 | public function deleteLead($leadId) 121 | { 122 | $result = $this->request( 123 | 'crm.lead.delete', 124 | [ 'id' => $leadId ] 125 | ); 126 | return $result; 127 | } 128 | 129 | /** 130 | * Возвращает все лиды 131 | * 132 | * @param array $filter Параметры фильтрации 133 | * @param array $order Параметры 134 | * сортировки 135 | * @param array $select Параметры выборки 136 | * @return Generator 137 | * @see https://dev.1c-bitrix.ru/rest_help/crm/leads/crm_lead_list.php 138 | */ 139 | public function getLeadList(array $filter = [], array $select = [], array $order = []): Generator 140 | { 141 | $params = [ 142 | 'order' => $order, 143 | 'filter' => $filter, 144 | 'select' => $select 145 | ]; 146 | 147 | return $this->getList('crm.lead.list', $params); 148 | } 149 | 150 | /** 151 | * Возвращает все лиды используя быстрый метод 152 | * 153 | * @param array $filter Параметры фильтрации 154 | * @param array $order Параметры 155 | * сортировки 156 | * @param array $select Параметры выборки 157 | * @return Generator 158 | * @see https://dev.1c-bitrix.ru/rest_help/crm/leads/crm_lead_list.php 159 | */ 160 | public function fetchLeadList(array $filter = [], array $select = [], array $order = []): Generator 161 | { 162 | $params = [ 163 | 'order' => $order, 164 | 'filter' => $filter, 165 | 'select' => $select 166 | ]; 167 | 168 | return $this->fetchList('crm.lead.list', $params); 169 | } 170 | 171 | // ------------------------------------------------------------------------ 172 | 173 | /** 174 | * Возвращает товарные позиции, связанные с лидом по ID лида 175 | * 176 | * @param int|string $leadId ID лида 177 | * @return array 178 | */ 179 | public function getLeadProductRows($leadId) 180 | { 181 | $result = $this->request( 182 | 'crm.lead.productrows.get', 183 | [ 'id' => $leadId ] 184 | ); 185 | return $result; 186 | } 187 | 188 | /** 189 | * Устанавливает товарные позиции, связанные с лидом по ID лида 190 | * 191 | * @param int|string $leadId ID лида 192 | * @param array $products Массив товаров 193 | * @return array 194 | */ 195 | public function setLeadProductRows($leadId, array $products) 196 | { 197 | $result = $this->request( 198 | 'crm.lead.productrows.set', 199 | [ 200 | 'id' => $leadId, 201 | 'rows' => $products 202 | ] 203 | ); 204 | return $result; 205 | } 206 | } 207 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Product.php: -------------------------------------------------------------------------------- 1 | request('crm.product.fields'); 36 | } 37 | 38 | /** 39 | * Возвращает товар по ID 40 | * 41 | * @param int|string $productId ID товара 42 | * @return array 43 | */ 44 | public function getProduct($productId) 45 | { 46 | $product = $this->request( 47 | 'crm.product.get', 48 | [ 'id' => $productId ] 49 | ); 50 | 51 | return $product; 52 | } 53 | 54 | /** 55 | * Добавляет товар 56 | * 57 | * @param array $fields Список полей товара 58 | * @return int 59 | */ 60 | public function addProduct(array $fields = []) 61 | { 62 | $result = $this->request( 63 | 'crm.product.add', 64 | [ 65 | 'fields' => $fields 66 | ] 67 | ); 68 | 69 | return $result; 70 | } 71 | 72 | /** 73 | * Обновляет товар 74 | * 75 | * @param int|string $productId ID товара 76 | * @param array $fields Список 77 | * полей 78 | * товара 79 | * @return int 80 | */ 81 | public function updateProduct($productId, array $fields = []) 82 | { 83 | $result = $this->request( 84 | 'crm.product.update', 85 | [ 86 | 'id' => $productId, 87 | 'fields' => $fields 88 | ] 89 | ); 90 | 91 | return $result; 92 | } 93 | 94 | /** 95 | * Удаляет товар по ID 96 | * 97 | * @param string|int $productId ID товара 98 | * @return array 99 | */ 100 | public function deleteProduct($productId) 101 | { 102 | $result = $this->request( 103 | 'crm.product.delete', 104 | [ 'id' => $productId ] 105 | ); 106 | 107 | return $result; 108 | } 109 | 110 | /** 111 | * Возвращает все товары 112 | * 113 | * @param array $filter Параметры фильтрации 114 | * @param array $order Параметры 115 | * сортировки 116 | * @param array $select Параметры выборки 117 | * @return Generator 118 | */ 119 | public function getProductList( 120 | array $filter = [], 121 | array $select = [ '*', 'PROPERTY_*' ], 122 | array $order = [] 123 | ): Generator { 124 | $params = [ 125 | 'order' => $order, 126 | 'filter' => $filter, 127 | 'select' => $select 128 | ]; 129 | 130 | return $this->getList('crm.product.list', $params); 131 | } 132 | 133 | /** 134 | * Возвращает все товары используя быстрый метод 135 | * 136 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php 137 | * @param array $filter Параметры фильтрации 138 | * @param array $order Параметры 139 | * сортировки 140 | * @param array $select Параметры выборки 141 | * @return Generator 142 | */ 143 | public function fetchProductList( 144 | array $filter = [], 145 | array $select = [ '*', 'PROPERTY_*' ], 146 | array $order = [] 147 | ): Generator { 148 | $params = [ 149 | 'order' => $order, 150 | 'filter' => $filter, 151 | 'select' => $select 152 | ]; 153 | 154 | return $this->fetchList('crm.product.list', $params); 155 | } 156 | 157 | 158 | // ------------------------------------------------------------------------ 159 | 160 | /** 161 | * Пакетно добавляет товары 162 | * 163 | * @param array $products Массив товаров 164 | * Секция товаров 'SECTION_ID' 165 | * @return array Массив Id товаров 166 | */ 167 | public function addProducts(array $products = []): array 168 | { 169 | // Id добавленных товаров 170 | $productResults = []; 171 | 172 | while ($productsChunk = array_splice($products, 0, $this->batchSize)) { 173 | $commandParams = []; 174 | foreach ($productsChunk as $index => $product) { 175 | $commandParams[] = [ 'fields' => $product ]; 176 | } 177 | $commands = $this->buildCommands('crm.product.add', $commandParams); 178 | $result = $this->batchRequest($commands); 179 | 180 | $sent = count($commandParams); 181 | $received = count($result); 182 | 183 | if ($received != $sent) { 184 | $jsonResponse = $this->toJSON($this->lastResponse); 185 | throw new Bitrix24APIException( 186 | "Невозможно пакетно добавить товары ({$sent}/{$received}): {$jsonResponse}" 187 | ); 188 | } 189 | 190 | $productResults = array_merge($productResults, $result); 191 | } 192 | 193 | return $productResults; 194 | } 195 | 196 | /** 197 | * Пакетно обновляет товары 198 | * 199 | * @param array $products Массив товаров 200 | * @return array Массив Id товаров 201 | */ 202 | public function updateProducts(array $products = []): array 203 | { 204 | // Id обновленных товаров 205 | $productResults = []; 206 | 207 | while ($productsChunk = array_splice($products, 0, $this->batchSize)) { 208 | $commandParams = []; 209 | foreach ($productsChunk as $index => $product) { 210 | // Проверка наличия поля ID в товаре на добавление 211 | $productId = $product['ID'] ?? null; 212 | if (empty($productId)) { 213 | $jsonProduct = $this->toJSON($product); 214 | throw new Bitrix24APIException( 215 | "Поле 'ID' в товаре (index {$index}) на обновление отсутствует или пустое: '{$jsonProduct}'" 216 | ); 217 | } 218 | $productResults[] = $productId; 219 | 220 | $commandParams[] = [ 221 | 'id' => $productId, 222 | 'fields' => $product 223 | ]; 224 | } 225 | $commands = $this->buildCommands('crm.product.update', $commandParams); 226 | $result = $this->batchRequest($commands); 227 | 228 | $sent = count($commandParams); 229 | $received = count($result); 230 | 231 | if ($received != $sent) { 232 | $jsonResponse = $this->toJSON($this->lastResponse); 233 | throw new Bitrix24APIException( 234 | "Невозможно пакетно обновить товары ({$sent}/{$received}): {$jsonResponse}" 235 | ); 236 | } 237 | } 238 | 239 | return $productResults; 240 | } 241 | 242 | /** 243 | * Пакетно удаляет товары 244 | * 245 | * @param array $productIds Массив Id товаров 246 | * @return array Массив Id товаров 247 | */ 248 | public function deleteProducts(array $productIds = []): array 249 | { 250 | // Id удаленных товаров 251 | $productResults = []; 252 | 253 | while ($productsChunk = array_splice($productIds, 0, $this->batchSize)) { 254 | $commandParams = []; 255 | foreach ($productsChunk as $index => $productId) { 256 | $commandParams[] = [ 'id' => $productId ]; 257 | $productResults[] = $productId; 258 | } 259 | $commands = $this->buildCommands('crm.product.delete', $commandParams); 260 | $result = $this->batchRequest($commands); 261 | 262 | $sent = count($commandParams); 263 | $received = count($result); 264 | 265 | if ($received != $sent) { 266 | $jsonResponse = $this->toJSON($this->lastResponse); 267 | throw new Bitrix24APIException( 268 | "Невозможно пакетно удалить товары ({$sent}/{$received}): {$jsonResponse}" 269 | ); 270 | } 271 | } 272 | 273 | return $productResults; 274 | } 275 | } 276 | -------------------------------------------------------------------------------- /src/App/Bitrix24/ProductRow.php: -------------------------------------------------------------------------------- 1 | request('crm.productrow.fields'); 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/App/Bitrix24/ProductSection.php: -------------------------------------------------------------------------------- 1 | request('crm.productsection.fields'); 35 | } 36 | 37 | /** 38 | * Возвращает раздел товаров по ID 39 | * 40 | * @param int|string $productSectionId ID раздела товаров 41 | * @return array 42 | */ 43 | public function getProductSection($productSectionId) 44 | { 45 | $productSection = $this->request( 46 | 'crm.productsection.get', 47 | [ 'id' => $productSectionId ] 48 | ); 49 | 50 | return $productSection; 51 | } 52 | 53 | /** 54 | * Добавляет раздел товаров 55 | * 56 | * @param array $fields Список полей раздела товаров 57 | * @return int 58 | */ 59 | public function addProductSection(array $fields = []) 60 | { 61 | $result = $this->request( 62 | 'crm.productsection.add', 63 | [ 64 | 'fields' => $fields 65 | ] 66 | ); 67 | 68 | return $result; 69 | } 70 | 71 | /** 72 | * Обновляет раздел товаров 73 | * 74 | * @param int|string $productSectionId ID раздела товаров 75 | * @param array $fields Список 76 | * полей 77 | * раздела 78 | * товаров 79 | * @return int 80 | */ 81 | public function updateProductSection($productSectionId, array $fields = []) 82 | { 83 | $result = $this->request( 84 | 'crm.productsection.update', 85 | [ 86 | 'id' => $productSectionId, 87 | 'fields' => $fields 88 | ] 89 | ); 90 | 91 | return $result; 92 | } 93 | 94 | /** 95 | * Удаляет раздел товаров по ID 96 | * 97 | * @param int|string $productSectionId ID раздела товаров 98 | * @return int 99 | */ 100 | public function deleteProductSection($productSectionId) 101 | { 102 | $result = $this->request( 103 | 'crm.product.delete', 104 | [ 'id' => $productSectionId ] 105 | ); 106 | 107 | return $result; 108 | } 109 | 110 | /** 111 | * Возвращает все разделы товары 112 | * 113 | * @param array $order Параметры 114 | * сортировки 115 | * @param array $filter Параметры фильтрации 116 | * @param array $select Параметры выборки 117 | * @return Generator 118 | */ 119 | public function getProductSectionList(array $filter = [], array $select = [], array $order = []): Generator 120 | { 121 | $params = [ 122 | 'order' => $order, 123 | 'filter' => $filter, 124 | 'select' => $select 125 | ]; 126 | 127 | return $this->getList('crm.productsection.list', $params); 128 | } 129 | 130 | /** 131 | * Возвращает все разделы товары используя быстрый метод 132 | * 133 | * @see https://dev.1c-bitrix.ru/rest_help/rest_sum/start.php 134 | * @param array $order Параметры 135 | * сортировки 136 | * @param array $filter Параметры фильтрации 137 | * @param array $select Параметры выборки 138 | * @return Generator 139 | */ 140 | public function fetchProductSectionList(array $filter = [], array $select = [], array $order = []): Generator 141 | { 142 | $params = [ 143 | 'order' => $order, 144 | 'filter' => $filter, 145 | 'select' => $select 146 | ]; 147 | 148 | return $this->fetchList('crm.productsection.list', $params); 149 | } 150 | 151 | // ------------------------------------------------------------------------ 152 | 153 | /** 154 | * Пакетно добавляет разделы товары 155 | * 156 | * @param array $productSections Массив разделов товаров 157 | * @return array Массив Id разделов товаров 158 | */ 159 | public function addProductSections(array $productSections = []): array 160 | { 161 | // Id добавленных разделов товаров 162 | $productSectionResults = []; 163 | 164 | while ($productSectionsChunk = array_splice($productSections, 0, $this->batchSize)) { 165 | $commandParams = []; 166 | foreach ($productSectionsChunk as $index => $productSection) { 167 | $commandParams[] = [ 'fields' => $productSection ]; 168 | } 169 | $commands = $this->buildCommands('crm.productsection.add', $commandParams); 170 | $result = $this->batchRequest($commands); 171 | 172 | $sent = count($commandParams); 173 | $received = count($result); 174 | 175 | if ($received != $sent) { 176 | $jsonResponse = $this->toJSON($this->lastResponse); 177 | throw new Bitrix24APIException( 178 | "Невозможно пакетно добавить разделы товаров ({$sent}/{$received}): {$jsonResponse}" 179 | ); 180 | } 181 | 182 | $productSectionResults = array_merge($productSectionResults, $result); 183 | } 184 | 185 | return $productSectionResults; 186 | } 187 | 188 | /** 189 | * Пакетно обновляет разделы товаров 190 | * 191 | * @param array $productSections Массив разделов товаров 192 | * @return array Массив Id разделов товаров 193 | */ 194 | public function updateProductSections(array $productSections = []): array 195 | { 196 | // Id обновленных разделов товаров 197 | $productSectionResults = []; 198 | 199 | while ($productSectionsChunk = array_splice($productSections, 0, $this->batchSize)) { 200 | $commandParams = []; 201 | foreach ($productSectionsChunk as $index => $productSection) { 202 | // Проверка наличия поля ID в товаре на добавление 203 | $productSectionId = $productSection['ID'] ?? null; 204 | if (empty($productSectionId)) { 205 | $jsonProductSection = $this->toJSON($productSection); 206 | throw new Bitrix24APIException( 207 | "Поле 'ID' в разделе товаров (index {$index}) на обновление " . 208 | "отсутствует или пустое: '{$jsonProductSection}'" 209 | ); 210 | } 211 | $productSectionResults[] = $productSectionId; 212 | 213 | $commandParams[] = [ 214 | 'id' => $productSectionId, 215 | 'fields' => $productSection 216 | ]; 217 | } 218 | $commands = $this->buildCommands('crm.productsection.update', $commandParams); 219 | $result = $this->batchRequest($commands); 220 | 221 | $sent = count($commandParams); 222 | $received = count($result); 223 | 224 | if ($received != $sent) { 225 | $jsonResponse = $this->toJSON($this->lastResponse); 226 | throw new Bitrix24APIException( 227 | "Невозможно пакетно обновить раздел товаров ({$sent}/{$received}): {$jsonResponse}" 228 | ); 229 | } 230 | } 231 | 232 | return $productSectionResults; 233 | } 234 | 235 | /** 236 | * Пакетно удаляет разделы товаров 237 | * 238 | * @param array $productSectionIds Массив Id разделов товаров 239 | * @return array Массив Id разделов товаров 240 | */ 241 | public function deleteProductSections(array $productSectionIds = []): array 242 | { 243 | // Id удаленных разделов товаров 244 | $productSectionResults = []; 245 | 246 | while ($productSectionsChunk = array_splice($productSectionIds, 0, $this->batchSize)) { 247 | $commandParams = []; 248 | foreach ($productSectionsChunk as $index => $productSectionId) { 249 | $commandParams[] = [ 'id' => $productSectionId ]; 250 | $productSectionResults[] = $productSectionId; 251 | } 252 | $commands = $this->buildCommands('crm.productsection.delete', $commandParams); 253 | $result = $this->batchRequest($commands); 254 | 255 | $sent = count($commandParams); 256 | $received = count($result); 257 | 258 | if ($received != $sent) { 259 | $jsonResponse = $this->toJSON($this->lastResponse); 260 | throw new Bitrix24APIException( 261 | "Невозможно пакетно удалить разделы товаров ({$sent}/{$received}): {$jsonResponse}" 262 | ); 263 | } 264 | } 265 | 266 | return $productSectionResults; 267 | } 268 | } 269 | -------------------------------------------------------------------------------- /src/App/Bitrix24/Task.php: -------------------------------------------------------------------------------- 1 | request('tasks.task.getFields'); 34 | } 35 | 36 | /** 37 | * Возвращает задачу по ID 38 | * 39 | * @param int|string $taskId ID задачи 40 | * @param array $select Параметры 41 | * выборки 42 | * @return array|null 43 | */ 44 | public function getTask($taskId, array $select = []) 45 | { 46 | $task = $this->request( 47 | 'tasks.task.get', 48 | [ 49 | 'taskId' => $taskId, 50 | 'select' => $select 51 | ] 52 | ); 53 | 54 | return $task; 55 | } 56 | 57 | /** 58 | * Возвращает все задачи 59 | * 60 | * @param array $filter Параметры фильтрации 61 | * @param array $order Параметры 62 | * сортировки 63 | * @param array $select Параметры выборки 64 | * @return Generator 65 | * @see https://dev.1c-bitrix.ru/rest_help/tasks/task/tasks/tasks_task_list.php 66 | */ 67 | public function getTaskList(array $filter = [], array $select = [], array $order = []): Generator 68 | { 69 | $params = [ 70 | 'order' => $order, 71 | 'filter' => $filter, 72 | 'select' => $select 73 | ]; 74 | 75 | return $this->getList('tasks.task.list', $params); 76 | } 77 | 78 | /** 79 | * Добавляет задачу 80 | * 81 | * @param array $fields Список полей задачи 82 | * @return int 83 | */ 84 | public function addTask(array $fields = []) 85 | { 86 | $result = $this->request( 87 | 'tasks.task.add', 88 | [ 89 | 'fields' => $fields 90 | ] 91 | ); 92 | 93 | return $result; 94 | } 95 | 96 | // ------------------------------------------------------------------------ 97 | 98 | /** 99 | * Пакетно добавляет задачи 100 | * 101 | * @param array $companies Массив параметров задач 102 | * @return array Массив id активностей 103 | */ 104 | public function addTasks(array $tasks = []): array 105 | { 106 | // Id добавленных задач 107 | $taskResults = []; 108 | 109 | while ($tasksChunk = array_splice($tasks, 0, $this->batchSize)) { 110 | // Формируем массив команд на добавление задач 111 | $commandParams = []; 112 | foreach ($tasksChunk as $index => $task) { 113 | $commandParams[ $index ] = [ 114 | 'fields' => $task 115 | ]; 116 | } 117 | $commands = $this->buildCommands('tasks.task.add', $commandParams); 118 | $taskResult = $this->batchRequest($commands); 119 | 120 | // Сравниваем число команд и число id в ответе 121 | $sent = count($commandParams); 122 | $received = count($taskResult); 123 | if ($received != $sent) { 124 | $jsonResponse = $this->toJSON($this->lastResponse); 125 | throw new Bitrix24APIException( 126 | "Невозможно пакетно добавить задачи ({$sent}/{$received}): {$jsonResponse}" 127 | ); 128 | } 129 | 130 | $taskResults = array_merge($taskResults, $taskResult); 131 | } 132 | 133 | return $taskResults; 134 | } 135 | } 136 | -------------------------------------------------------------------------------- /src/App/Bitrix24/User.php: -------------------------------------------------------------------------------- 1 | request('user.fields'); 36 | } 37 | 38 | /** 39 | * Возвращает пользователя по ID 40 | * 41 | * @param int|string $userId ID пользователя 42 | * @return array|null 43 | */ 44 | public function getUser($userId) 45 | { 46 | $result = $this->request('user.get', [ 'ID' => $userId ]); 47 | $user = array_shift($result); 48 | 49 | return $user; 50 | } 51 | 52 | /** 53 | * Возвращает всех пользователей 54 | * 55 | * @param array $filter Параметры 56 | * фильтрации 57 | * @param string $order Направление 58 | * сортировки 59 | * @param string $sort Поле, по которому 60 | * сортируются 61 | * результаты 62 | * @param bool $adminMode Ключ работы в 63 | * режиме 64 | * администратора 65 | * @return Generator 66 | */ 67 | public function getUsers( 68 | array $filter = [], 69 | string $order = 'ASC', 70 | string $sort = '', 71 | bool $adminMode = false 72 | ): Generator { 73 | 74 | $params = [ 75 | 'FILTER' => $filter, 76 | 'order' => $order, 77 | 'sort' => $sort, 78 | 'ADMIN_MODE' => $adminMode 79 | ]; 80 | 81 | return $this->getList('user.get', $params); 82 | } 83 | } 84 | --------------------------------------------------------------------------------