Как подружить Ежа с Ужом или отправить с сайта заявку в 1С
Наступил час Х, директор вызвал меня и объявил, что хочет, что бы заказы с сайта падали в 1С. Деваться некуда пришлось браться за столь весёлую и увлекательную задачу. Так как 1С я видел только из далека на компьютере главного бухгалтера, первая моя мысль была поймать нашего 1С-ника работающего на удалёнке и объяснить ему задачу. Поймал, объяснил, что хочу мол в 1С POST запросы отправлять для формирования заявки. 1Сник очень удивился, сказал: "Моя твоя не понимать", но обещал подумать. Через пару часов позвонил и сказал, что в 1С есть уже готовая система для приёма заявок с сайта. Но как она работает он не знает, так что разбирайся сам. Приехали.
Что делать, пришлось сесть и читать про CommerceML 2. При первом знакомстве с документацией на сайте 1С, чтение сего мануала вызывало боль, отвращение и мысли о суициде. Такой охуенной документации я давно не читал. После первого прочтения решил позвонить в одну известную в нашем городе 1С контору и спросить, сколько будет стоить сопряжение нашего сайта с 1С, менеджеры долго совещались и через сутки вынесли вердикт 30 000 рублей.
Ох уж эти 1С-ники, им только денег дай. Можно было конечно у директора попросить денег, он бы дал, но тут видимо во мне взыграли амбиции и решил я таки разобраться сам.
Первое, что было необходимо сделать это поднять web сервер на сервере 1С и настроить 1С-ку что бы она общалась через этот web сервер, надо отдать должное описание сего процесса есть на многих сайтах и форумах и занимает не более получаса.
А что дальше? Проверяем как работает веб сервер и отправляем ему запрос в браузере:
http://xxx.xxx.xxx.xxx/'Имя сервиса'/ws/SiteExchange?wsdl
Получаем XML-ную партянку, охуеваем и от количества параметров. Где наша не пропадала? Лезем читать мануалы и тут нас ждёт горькое разочарование. Нет никакой информации, какие параметры обязательны для отправления, как будет привязываться товар к справочнику номеклатуры. Как это всё работает в целом?
Попытки отправить XML запрос вызывали ошибки на стороне 1С, она ругалась не понятными словами. А дальше пару дней я просто читал всё что связанно с оформлением заявок с сайта в 1С.
Ничего дельного я не нашёл. Но пару раз меня выкидывало на форум 1С, но там нужна была регистрация, а регистрироваться в этой богадельне мне не хотелось, но на конец второго дня я понял, что видимо придётся. Регистрация давалась на 7 дней, если ты не являешься клиентом ))).
Регистрация пройдена и о чудо в одной из веток я обнаружил обсуждение данного вопроса и там то я и подсмотрел как правильно формировать XML запрос.
Выкладываю его сюда может ещё кому пригодится:
function Connect1C(){
if (!function_exists('is_soap_fault')){
print 'Не настроен web сервер. Не найден модуль php-soap.';
return false;
}
try {
$client1C = new SoapClient('http://xxx.xxx.xxx.xxx/'Имя веб-сервиса'/ws/SiteExchange?wsdl',
array('login' => 'woodman02',
'password' => 'password',
'soap_version' => SOAP_1_2,
'cache_wsdl' => WSDL_CACHE_NONE, //WSDL_CACHE_MEMORY, //, WSDL_CACHE_NONE, WSDL_CACHE_DISK or WSDL_CACHE_BOTH
'exceptions' => true,
'trace' => 1));
}catch(SoapFault $e) {
trigger_error('Ошибка подключения или внутренняя ошибка сервера. Не удалось связаться с базой 1С.', E_ERROR);
}
if (is_soap_fault($client1C)){
trigger_error('Ошибка подключения или внутренняя ошибка сервера. Не удалось связаться с базой 1С.', E_ERROR);
return false;
}
return client1C;
}
function GetData($idc, $param){
if (is_object($idc)){
try {
$ret1c = $idc->LoadOrders($param);
} catch (SoapFault $e) {
echo "Ошибка</br>";
var_dump($e);
var_dump($ret1c);
}
}
else{
echo 'Не удалось подключиться к 1С<br>';
}
return $ret1c;
}
$OrdersData = Array(
"ВерсияСхемы" => "2.05",
"ДатаФормирования" => "2020-05-29T11:56:10",
"Документ" => Array(
"Ид" => null,
"Номер" => null,
"Дата" => "2020-05-29",
"ХозОперация" => "ЗаказНаПродажу",
"Валюта" => "руб",
"Курс" => "1",
"Сумма" => "6945",
"Контрагенты" => Array(
"Контрагент" => Array(
"Ид" => null,
"Наименование" => "Иванов",
"ПолноеНаименование" => "Иван",
"Роль" => "Покупатели",
"Адрес" => Array(
"Представление" => "Тест",
"Комментарий" => "Тест"
)
)
),
"Время" => "15:30:15",
"СрокПлатежа" => "0001-01-01",
"Комментарий" => "Заказ с сайта",
"Налоги" => Array(
"Налог" => Array(
"Наименование" => "НДС",
"УчтеноВСумме" => "false",
"Сумма" => "0"
)
),
"Товары" => Array(
"Товар" => Array(
"Ид" => null,
"Артикул" => null,
"Наименование" => "Грабля электронная",
"БазоваяЕдиница" => Array(
"Код" => "796",
"НаименованиеПолное" => "Штука",
"МеждународноеСокращение" => "PCE"
),
"СтавкиНалогов" => Array(
"СтавкаНалога" => Array(
"Наименование" => "НДС",
"Ставка" => "0",
)
),
"ЗначенияРеквизитов" => Array
(
"ЗначениеРеквизита" => Array
(
"0" => Array
(
"Наименование" => "ВидНоменклатуры",
"Значение" => "Товар"
),
"1" => Array
(
"Наименование" => "ТипНоменклатуры",
"Значение" => "Запас"
)
)
),
"ЦенаЗаЕдиницу" => "6945",
"Количество" => "1",
"Резерв" => "1",
"Сумма" => "6945",
"Единица" => "шт",
"Коэффициент" => "1"
)
),
"ЗначенияРеквизитов" => Array
(
"ЗначениеРеквизита" => Array
(
"0" => Array
(
"Наименование" => "Организация",
"Значение" => "ИП Чоршамбе Нет Отчества"
),
"1" => Array
(
"Наименование" => "Вид цен",
"Значение" => "1-2 Единая оптовая"
),
"2" => Array
(
"Наименование" => "Склад",
"Значение" => "Склад №1 для торговли"
),
"4" => Array
(
"Наименование" => "Дата отгрузки",
"Значение" => "2020-05-29"
),
"5" => Array
(
"Наименование" => "Статус заказа",
"Значение" => "Подготовка КП"
),
)
),
)
);
$params = Array();
$params["OrdersData"] = $OrdersData;
// Загружаем заказ с сайта.
//$result = $client->LoadOrders($params);
$idc = Connect1C();
$ret1c = GetData($idc,$params);
var_dump($ret1c->return);
Сразу отвечу на один вопрос, который занимал меня. Как 1С будет привязывать к своей номенклатуре мою заявку. Это потрясающее решение от компании 1С, мне такое даже в голову не могло прийти. При получении заявки 1С смотрит по названию (по названию Карл!??, не по Id, не по штрихкоду, а по названию) есть у неё в номенклатуре такой товар или нет, если нет, она тупо его создаёт, 1С-ники умеют поражать. Так что будьте внимательны названия в заявке должно строго соответствовать названию в 1С, иначе наплодите товаров в номенклатуре.
Ура! Пол дела было сделано. Далее я настроил проброс портов на нашем Mikrotik-е, что бы к 1С серверу можно было обратиться только с IP адреса Web-сервера и определенного порта (не скажу какого).
Дописал скрипты и вот наш интернет магазин сделанный на Joomla + Seblod отправляет заявки в 1С. Всё теперь я то же могу брать 30 т.р. за подключение сайт к 1С ))))