Просто сохранил код библиотеки который писался для работы с резевами товаров на складе для SugarCRM. Содержит в себе код на php который используется для связи с 1с по SOAP(WSDL). "логин",//логин пользователя к базе 1С "password" => "пароль",//пароль пользователя к базе 1С "soap_version" => SOAP_1_2,//версия SOAP "cache_wsdl" => WSDL_CACHE_NONE, "trace" => true, "features" => SOAP_USE_XSI_ARRAY_TYPE, "connection_timeout" => 300 ); public static $haveMultiplicityStatus = 0;//Флаг указывающий наличие и отсутствие статуса "Подбор кратности" по сделке в аудите. Может принимать значения: 0 - если наличие статуса ещё не выяснено, false - статус отсутствует, true - статус присутствует public static $probablyHaveReservation = false;//Флаг указывающий возможное существование резерва по данной сделке(применительно к кратным позициям). Если флаг false то такого резевра точно нет. true не обязательно обозначает наличие резерва, а лишь то что когда то по данной сделке резерв точно был и мог быть снят public static $haveReservation = false;//Флаг означающий что резервация товара по этой сделке точно есть public static $productReserveAr = array();//Массив товаров которые находятся в резерве по данной сделке, имеет формат ключ массива - это Id-товара, значение - количество зарезервированного товара public static $productIdReserveAr = array();//массив Id-товаров которые находятся в резерве по данной сделке. Массив хранит только Id такого товара и ни каких других данных //Вспомогательный метод, выясняет по Id сделки был ли по сделке в аудите статус "Кратность подобрана", возвращает true если сделка найдена и статус был в остальных случаях false public static function checkMultiplicityStatusInOpportunitiesById($opportunitiesId=false) { if ($opportunitiesId !== false) { if ((self::$haveMultiplicityStatus !== false) and (self::$haveMultiplicityStatus !== true)) { $nikolaevevgeSql = "SELECT * FROM `opportunities_audit` WHERE ((`before_value_string` = 'Confirm multiplicity') OR (`after_value_string` = 'Confirm multiplicity')) AND (`field_name` = 'sales_stage') and (`parent_id` = '$opportunitiesId') LIMIT 1;"; if (count(dbGetArray($nikolaevevgeSql))) { self::$haveMultiplicityStatus = true; } else { self::$haveMultiplicityStatus = false; } } return self::$haveMultiplicityStatus; } return false; } //Следующий метод выясняет есть ли резервирование товара(к этому резерву не относится резерв создаваемый для спецзаказа) public static function check($opportunities=false,$request_num=false,$previousStage=false,$newStage=false) { if (($opportunities !== false) and ($request_num !== false) and ($previousStage !== false)) { //[НАЧАЛО]Проверяем был ли или есть по данной сделке статус кратность подобрана, если есть count в результате выполнения запроса ниже > 0 $nikolaevevgeSql = "SELECT * FROM `opportunities_audit` WHERE ((`before_value_string` = 'Confirm multiplicity') OR (`after_value_string` = 'Confirm multiplicity')) AND (`field_name` = 'sales_stage') and (`parent_id` = '$opportunities') LIMIT 1;"; if (count(dbGetArray($nikolaevevgeSql))) { self::$probablyHaveReservation = true;//Предположение о существовании резерва устанавливается в истину } //[КОНЕЦ]Проверяем был ли или есть по данной сделке статус кратность подобрана //[НАЧАЛО]Выполняем запрос к 1с чтобы проверить наличие резерва по сделке и формируем массивы по товарам в резерве если резерв есть if (self::$probablyHaveReservation) { //Настройки соединения с сервисом 1с //SOAP-клиент $client = new SoapClient("http://172.16.0.21/1c_moskow_new/ws/ExchangeCRM.1cws?wsdl",self::$soapSettings); //Текст запроса 1с $query = 'ВЫБРАТЬ Я_ТоварыВРезервеОстатки.Номенклатура.ID КАК ID, СУММА(Я_ТоварыВРезервеОстатки.КоличествоОстаток) КАК Count ИЗ РегистрНакопления.Я_ТоварыВРезерве.Остатки( , НомерЗаявки = &Request_num И ДокументРезерва ССЫЛКА Документ.Я_ПодборКратности) КАК Я_ТоварыВРезервеОстатки СГРУППИРОВАТЬ ПО Я_ТоварыВРезервеОстатки.Номенклатура.ID'; //Кодируем запрос к 1с и параметры для этого запроса в JSON нужного формата $params1C = array(); $params1C['TextQuery'] = json_encode(array('Text'=>$query),JSON_UNESCAPED_UNICODE); $params1C['ParameterQuery'] = json_encode(array("Request_num"=>$request_num),JSON_UNESCAPED_UNICODE); //Выполняем запрос, получаем результат, декодируем результат из JSON $result = $client->Query($params1C); $jsResult = $result->return; $dataResult = json_decode($jsResult,true); //var_dump результата в случаи если резерв есть выглядит следующим образом array(5) { [0]=> array(2) { ["ID"]=> string(36) "79850a88-2d90-2c83-80d8-5121cacc6a63" ["Count"]=> string(1) "3" } [1]=> array(2) { ["ID"]=> string(36) "52145689-1302-c5e1-7627-5ce3a7a95b8c" ["Count"]=> string(3) "147" } [2]=> array(2) { ["ID"]=> string(36) "580d6387-d5d4-c327-8a31-5f103e48116f" ["Count"]=> string(4) "55.2" } [3]=> array(2) { ["ID"]=> string(36) "9cb2c1cb-9e82-c792-592c-5fc78ae83700" ["Count"]=> string(2) "25" } [4]=> array(2) { ["ID"]=> string(36) "194366d0-7102-2ce6-1090-5fe3262349ce" ["Count"]=> string(1) "5" } } self::$productReserveAr = array(); self::$productIdReserveAr = array(); foreach ($dataResult as $item) { if (isset($item["ID"]) and isset($item["Count"]) and $item["ID"] and ($item["Count"] > 0)) { self::$productReserveAr[$item["ID"]] = $item["Count"] * 1; self::$productIdReserveAr[] = $item["ID"]; self::$haveReservation = true; } } return self::$haveReservation; } //[КОНЕЦ]Выполняем запрос к 1с чтобы проверить наличие резерва по сделке и формируем массивы по товарам в резерве если резерв есть } return false; } //Следующий метод удаляет резерв подбора кратности по регистрационному номеру сделки(Request_num). Метод возвращает true если резерв по Request_num найден и успешно удалён, во всех остальных случаях метод возвращает false public static function deleteByRequestNum($request_num=false) { if ($request_num !== false) { $client = new SoapClient("http://172.16.0.21/1c_moskow_new/ws/ExchangeCRM.1cws?wsdl",self::$soapSettings); $result = $client->DeleteReserve(array("Request_num"=>$request_num."00"));//Ожидается что result объект с единственным свойством - return if (isset($result->return)) { $return = $result->return;//Если $return содержит значение 2 - значит резерв с таким Request_num не найден, если 1 - то резевр по Request_num найден и успешно удалён, 0 - резевр найден но по какой то причине не удалён, не знаю как такое может быть, но вроде как 1с может даже и такое вернуть if ($return == 1) {//Единственный случай когда метод возвращает true //Если возвращён ответ от 1с о успешном удалении резерва: обнуляем переменные и возвращаем true self::$probablyHaveReservation = false; self::$haveReservation = false; self::$productReserveAr = array(); self::$productIdReserveAr = array(); return true; } } } return false; } }