gifts2017

Формирование и отправка данных в SPOT 2D для 1С: 7.7

Опубликовал Халед (Khaled) в раздел Обмен - Обмен с другими системами

Для тех, кто еще не написал сам - не претендующая на профессионализм обработка, но вполне рабочая. Будет неплохим примером с некоторыми подсказками...

Несправедливо так! Для платформы 8.2 есть две публикации, а для 7.7 - ни одной ! Так вот: Данная обработка, сделанная на быструю руку, может стать неплохой подсказкой для тех, кто собирается все это реализовать у себя. В данной обработке учтены особенности учета в моей фирме, поэтому обязательно выдаст ошибки, если попытаться просто запускать в среде 1С: Торговля 7.7 для Украины.

Описания форматов файлов и вообще о чем речь идет можно найти на страницах аналогичных обработок для 8.2:

http://infostart.ru/public/439115/

http://infostart.ru/public/452606/

Мне будет очень приятно, если данная обработка окажется полезной хотя бы для одного коллеги.

Скачать файлы

Наименование Файл Версия Размер Кол. Скачив.
Выгрузка для SPOT2D.ert
.ert 33,50Kb
04.09.16
1
.ert 33,50Kb 1 Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

2. rougudz rougudz (rougudz) 13.10.16 16:36
Передача в SPOT2D идет через post запросы. сдесь сие реализовано? я никак не могу дать с ними толку. ответ от сервера приходит что мол: 200 т.е. все ОК. а они утверждают что ничего к ним не приходило.... не сталкивались?
3. Халед (Khaled) 14.10.16 16:36
Нет, я передачу реализовал с помощью внешнего bat-файла, который запускается обработкой по окончания формирования файлов выгрузок:
В процедуре Сформировать: (И еще один момент: Возможно параметр __did оставлен без внимание, аон должен содержать "код дистрибьютора в SPOT 2D")
=== Начало ===
// Процедуры формирования файлов выгрузок
.
.
.
Если ФлагОтладки = 0 Тогда	
      КомандаСистемы("SendAllWithSSL.bat"); // Команда запуска передачи файлов
КонецЕсли;
=== Конец ===

Содержание файла SendAllWithSSL.bat // изменено слегка
=== Начало ===
@Echo off
FOR %%I IN (Send\*.*) DO call SendFileWithSSL.bat %%~dI %%~pI %%~nI protocol.log
=== Конец ===

Содержание файла SendFileWithSSL.bat // изменено слегка
=== Начало ===
@Echo off
set Path2cvs=%1%2
set FileType=%3
set LogFile=%4
echo Date %date%  Time %time% >> protocol.log
echo. Send %Path2cvs%%FileType%.cvs ...  >> %LogFile%
curlssl.exe -v -F "ufile=@%Path2cvs%%FileType%.csv;type=text/plain;filename=%FileType%" -F "__login=ْْْْXXXXXXXX" -F "__password=XXXXXXXX" -F "__did=XXXXXXXX" http://XXXXXXXX.spot2d.com/dinfo/auto-upload.phtml  >> %LogFile%
=== Конец ===
...Показать Скрыть

Все сделано по их инструкции. запустилось с пол-пинка, и сейчас работает в автоматическом режиме.
4. rougudz rougudz (rougudz) 15.10.16 11:01
(3) Khaled, спасибо. но интересует имеено POST запрос. нелюблю бантики.
5. rougudz rougudz (rougudz) 26.10.16 18:00
если кому интересно то передача post запроса реализовал так.
// XMLstr текст csv файла отправки.
Функция ОтправкаPOSTзапросом(XMLstr="",ИмяФайла)
	
	MSXMLver = "6";
	Попытка
		Http = CreateObject("MSXML2.ServerXMLHTTP."+MSXMLver+".0");
	Исключение 
		Попытка
			MSXMLver = "4";
			Http = CreateObject("MSXML2.ServerXMLHTTP."+MSXMLver+".0"); 
		Исключение 
			Сообщить(ОписаниеОшибки(),"!");
			Сообщить("Для работы модуля обмена необходима библиотека MSXML не ниже 4.0","!");
			Возврат "Для работы модуля обмена необходима библиотека MSXML не ниже 4.0";
		КонецПопытки;
	КонецПопытки;
	
	
	login = "**";
	passw = "**";
	DistrID = "**";
	
	Если ПустаяСтрока(XMLstr) = 0 Тогда
		Boundary = СтрЗаменить(ТекущееВремя(),":","");
		//формируем тело запроса
		
		Body = +"--"+Boundary+РазделительСтрок
		+"Content-Disposition: form-data; name=""ufile""; filename="""+СтрЗаменить(ИмяФайла,".csv","")+""""+РазделительСтрок
		+"Content-Type: text/plain"+РазделительСтрок+РазделительСтрок
		+XMLstr+РазделительСтрок+РазделительСтрок
		+"--"+Boundary+РазделительСтрок
		+"Content-Disposition: form-data; name=""__login"""+РазделительСтрок+РазделительСтрок
		+login+РазделительСтрок
		+"--"+Boundary+РазделительСтрок
		+"Content-Disposition: form-data; name=""__password"""+РазделительСтрок+РазделительСтрок
		+passw+РазделительСтрок
		+"--"+Boundary+РазделительСтрок
		+"Content-Disposition: form-data; name=""__did"""+РазделительСтрок+РазделительСтрок
		+DistrID+РазделительСтрок
		+"--"+Boundary;
		
	КонецЕсли;
	
	ServiceRequest = "http://aqualife.spot2d.com/dinfo/auto-upload.phtml";
	ServiceIP = "aqualife.spot2d.com";
	
	Http.Open ("POST", ServiceRequest, -1); //асинхронный запрос
	Http.SetRequestHeader("Content-Type","multipart/form-data; boundary="+Boundary);
	
	//ЗначениеВФайл(КаталогИБ()+ИмяФайла,Body,0);
	
	Http.Send(Body);
	
	Состояние("Ожидание ответа на запрос...");
	ВремяОжидания = 0;
	Пока Http.ReadyState <> 4 Цикл
		Попытка
			Если Http.waitForResponse(1) = 0 Тогда //превышено время ожидания ответа =1s
				Если ВремяОжидания >= 60 Тогда //60s
					Состояние("");
					Сообщить("Превышен интервал ожидания запроса сервера "+ServiceIP,"!");
					Возврат 0; 
				КонецЕсли;
				ВремяОжидания = ВремяОжидания + 1; //1s
				Состояние("Ожидание ответа на запрос... "+Строка(ВремяОжидания)+"s");
			КонецЕсли;
		Исключение 
			Сообщить(ОписаниеОшибки(),"!");
			Возврат 0;
		КонецПопытки; 
	КонецЦикла; 
	
	//Состояние("");
	
	Response = Http.ResponseXML;
	Заголовки = Http.getAllResponseHeaders();
	Сообщить("Заголовки: "+СпС(Лев(СпС(Заголовки),255)));
	
	ОтветСервера = Http.responseText; 
	Сообщить("Response: "+СпС(Лев(СпС(Response),255)));
	Сообщить("ОтветСервера: "+СпС(Лев(СпС(ОтветСервера),255)));
	текст = СоздатьОбъект("Текст");
	текст.ДобавитьСтроку(ОтветСервера);
	текст.Записать(КаталогВременныхФайлов()+"AquaОтвет.xml");
	
	Если Http.Status = 200 Тогда
		Сообщить("HTTP status: "+Http.Status+" "+Http.StatusText+", время ожидания "+?(ВремяОжидания=0,"<1",Строка(ВремяОжидания))+"s");
		Возврат "HTTP status: "+Http.Status+" "+Http.StatusText+", "+ОтветСервера+", время ожидания "+?(ВремяОжидания=0,"<1",Строка(ВремяОжидания))+"s";
	Иначе
		Сообщить("HTTP status: "+Http.Status+" "+Http.StatusText+", ошибка!","!");
		Возврат "HTTP status: "+Http.Status+", "+Http.StatusText+", "+ОтветСервера+", ошибка!";
	КонецЕсли;
	
	
КонецФункции // SendHTTPRequest
...Показать Скрыть
6. Халед (Khaled) 27.10.16 10:24
(5) rougudz, Весьма иньтересно, брольшое спасибо, НО: имеются непонятные моменты.

1 - Первое, что бросается в глаза - строка, проверяющая не превышен ли интервал времени ответа:

Если Http.waitForResponse(1) = 0 Тогда //превышено время ожидания ответа =1s

На языке 1С, строка в таком виде вызовет кучу ошибок.

2 - Функция СпС - что именно делает ??
7. rougudz rougudz (rougudz) 27.10.16 11:08
(6) сорри по спс это я для своего удобства делаю всегда
кнвертит все что угодно в строку и обрезает пробелы, лень писать СокрЛП(строка(чтото))
пишу спс(чтото)

Функция СпС(что) Экспорт
    Возврат СокрЛП(Строка(что))
КонецФункции //СпС()


по поводу Если Http.waitForResponse(1) = 0 Тогда
все нормально работает.
Http это не объект 1с, а MSXML2.ServerXMLHTTP.х.0
8. Халед (Khaled) 27.10.16 16:49
(7) rougudz, Я хотел сказать, что строка:
Если Http.waitForResponse(1) = 0 Тогда //превышено время ожидания ответа =1s

в таком виде, как тут изображена не выполнится в среде 1с.
9. rougudz rougudz (rougudz) 27.10.16 17:11
(8)чегойто не то с копипастом видимо
косяки со вставкой кода...
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа