Функции для работы с транспортным модулем (УТМ) ЕГАИС + готовая конфигурация для ЕГАИС

Обработки - Обработка справочников

29
Предлагаю вашему вниманию функции для использования в целях обмена данными с универсальным транспортным модулем ЕГАИС. При доработке учетной системы с целью интеграции с транспортным модулем ЕГАИС, я столкнулся с серьезной проблемой, связанной с тем, что внешняя компонента V7Plus, предназначенная для работы по протоколу HTTP, а также для разбора XML-файлов, поддерживает только команду GET протокола HTTP, в то время как для работы с УТМ требуется поддержка команд GET, POST и DELETE.
P.S. Обновлены все функции и обработки для поддержки XML-ответов больше 100Кб (теперь длина неограничена). Также добавлена обработка выгрузки расходной накладной. Добавлена загрузка приходной накладной, а также диапазона марок из справки А.
Внимание! добавлена полностью готовая к работе конфигурация для работы в ЕГАИС оптовых поставщиков. Реализованы следующие функции: автоматическая загрузка накладных и доп. форм из ЕГАИС, отправка актов подтверждения/отклонения/расхождения, загрузка справок А и Б, загрузка сведений о поставщике/производителе, загрузка справочников номенклатуры по ИНН производителя, постановка на баланс учтенного/не учтенного в ЕГАИС товара, штрихкодирование поступления/инвентаризации/реализации/постановки на учет (DataMatrix и PDF417), формирование партий на складе а также электронная выгрузка деклараций по формам 5,6,7,11,12.
В дальнейшем могу оказывать сопровождение

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

1. Отправка запроса по протоколу POST

function getrandomnumber() export
	m35=34359738368;
	m36=68719476736;
	m37=137438953472;
	somedigit = 5 * somedigit;
	if (somedigit >= m37) then somedigit = somedigit - m37 endif;
	if (somedigit >= m36) then somedigit = somedigit - m36 endif;
	if (somedigit >= m35) then somedigit = somedigit - m35 endif;
	return int(somedigit / m35 * 101);
endfunction

function randomnumber(limit) export
	return getrandomnumber()%(limit-1)+1;
endfunction

function getrandomstring(numchar) export
  charmap = "qwertzuiopasdfghjklyxcvbnmQWERTZUIOPASDFGHJKLYXCVBNM1234567890";
  maxchar = strlen(charmap) - 1;
  resstr = "";
  for i = 1 to numchar do
      resstr = resstr + mid(charmap, randomnumber(maxchar), 1);
  enddo;
  return resstr;
endfunction

function sendpostquery(objxml, querydata, address) export
	boundary = getrandomstring(30);
	objxml.open("POST", UTM_SERVER + address, 0);
	objxml.setrequestheader("Content-Type", "multipart/form-data; boundary=" + boundary);
	objxml.setrequestheader("Content-Length", string(strlen(querydata)));
	objxml.setrequestheader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
	objxml.setrequestheader("Pragma", "no-cache");
	objxml.setrequestheader("Cache-Control", "no-cache");
	objxml.setrequestheader("Accept-Charset", "utf-8");

	dataforsend = "--" + boundary + linebreak +
    		"Content-Disposition: form-data; name=""xml_file""; filename=""client.xml""" + linebreak +
    		"Content-Type: text/xml; charset=utf-8" + linebreak + linebreak + querydata +
    		linebreak + "--" + boundary + "--";
	try 
		objxml.send(dataforsend);
		resultstr = objxml.responsetext;
	except
		message("Ошибка отправки запроса POST: "+сокрлп(описаниеошибки()),"!");		
		resultstr = "";
	endtry;
	return resultstr;
endfunction

2. Отправка запроса по протоколу GET

function sendgetquery(objxml, address) export
	objxml.open("GET", address, 0);
	objxml.setrequestheader("Content-Type", "text/xml");
	objxml.setrequestheader("If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT");
	objxml.setrequestheader("Pragma", "no-cache");
	objxml.setrequestheader("Cache-Control", "no-cache");
	objxml.Setrequestheader("Accept-Charset", "utf-8");
	try
		objxml.send();
		resultstr = objxml.responsetext;
	except
		message("Ошибка отправки запроса GET: "+сокрлп(описаниеошибки()),"!");
		resultstr = "";
	endtry;
	return resultstr;
endfunction

3. Отправка запроса по протоколу DELETE

function senddeletequery(objxml, address) export
	objxml.open("DELETE", address, 0);
	try
		objxml.send();
		result = 0;
	except
		message("Ошибка отправки запроса DELETE: "+сокрлп(описаниеошибки()),"!");		
		result = -1;
	endtry;
	return result;
endfunction

4. Получение URL документа  с указанным ID запроса

function getdocumenturl(objxml, queryid) export
	resulturl = "";
	docxml = sendgetquery(objxml, UTM_SERVER + "/opt/out?refresh=true");
	xmldoc = createobject("Msxml.DOMDocument");
	xmldoc.loadxml(docxml);
   	objnodea = xmldoc.selectsinglenode("A");
	for i = 0 to objnodea.childnodes.length - 1 do
		nodeans = objnodea.childnodes.item(i);
		if nodeans.nodename = "url" then
		    replyid = nodeans.getattribute("replyId");
			if replyid = queryid then
			    resulturl = nodeans.text;
				break;
			endif;
		endif;
	enddo;
	return resulturl;
endfunction

5. Получение списка всех входящих документов

function getalldocuments(objxml, addrstr) export
	docslist = createobject("ValueTable");
	docslist.newcolumn("id","string");
	docslist.newcolumn("url","string");
	
	docxml = sendgetquery(objxml, UTM_SERVER + addrstr);
	xmldoc = createobject("Msxml.DOMDocument");
	xmldoc.loadxml(docxml);
   	objnodea = xmldoc.selectsinglenode("A");
	for i = 0 to objnodea.childnodes.length - 1 do
		nodeans = objnodea.childnodes.item(i);
		if nodeans.nodename = "url" then
			docslist.newline();
			docslist.id  = nodeans.getattribute("replyId");
			docslist.url = nodeans.text;
		endif;
	enddo;
	return docslist;
endfunction

И реализация высокоуровневых функций. Запрос информации о производителе:

function sendclientinfoquery(inn) export
	queryclientstring = "<?xml version=""1.0"" encoding=""utf-8""?>
	|<ns:Documents Version=""1.0"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
	|xmlns:ns=""http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01""
	|xmlns:oref=""http://fsrar.ru/WEGAIS/ClientRef""
	|xmlns:qp=""http://fsrar.ru/WEGAIS/QueryParameters"">
	|<ns:Owner><ns:FSRAR_ID>[%FSRAR_ID%]</ns:FSRAR_ID></ns:Owner>
	|<ns:Document><ns:QueryClients><qp:Parameters><qp:Parameter><qp:Name>ИНН</qp:Name>
	|<qp:Value>[%ИНН%]</qp:Value></qp:Parameter></qp:Parameters></ns:QueryClients>
	|</ns:Document></ns:Documents>";

	objxml = createobject("Microsoft.XmlHttp");
	queryid = "";
	querystring = strreplace(queryclientstring, "[%FSRAR_ID%]", FSRAR_ID);
	querystring = strreplace(querystring, "[%ИНН%]", INN);
	docxml = sendpostquery(objxml, querystring, "/opt/in/QueryPartner");

	if (strlen(docxml) > 0) then
		xmldoc = createobject("Msxml.DOMDocument");	
		xmldoc.loadxml(docxml);
		objnodea = xmldoc.selectsinglenode("A");
		if (emptyvalue(objnodea) = 0) then
			objnodeurl= objnodea.selectsinglenode("url");
			if (emptyvalue(objnodeurl) = 0) then
				queryid = objnodeurl.text;
			endif;
		endif;
	endif;
	return queryid;
endfunction

Запрос номенклатурного справочника производителя

function sendgoodsinfoquery(inn) export
	querygoodsstring = "<?xml version=""1.0"" encoding=""utf-8""?>
	|<ns:Documents Version=""1.0"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance""
	|xmlns:ns=""http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01""
	|xmlns:qp=""http://fsrar.ru/WEGAIS/QueryParameters"">
	|<ns:Owner><ns:FSRAR_ID>[%FSRAR_ID%]</ns:FSRAR_ID></ns:Owner>
	|<ns:Document><ns:QueryAP><qp:Parameters><qp:Parameter><qp:Name>ИНН</qp:Name>
	|<qp:Value>[%ИНН%]</qp:Value></qp:Parameter></qp:Parameters></ns:QueryAP>
	|</ns:Document></ns:Documents>";

	objxml = createobject("Microsoft.XmlHttp");
	queryid = "";
	querystring = strreplace(querygoodsstring, "[%FSRAR_ID%]", FSRAR_ID);
	querystring = strreplace(querystring, "[%ИНН%]", INN);
	docxml = sendpostquery(objxml, querystring, "/opt/in/QueryAP");

	if (strlen(docxml) > 0) then
		xmldoc = createobject("Msxml.DOMDocument");	
		xmldoc.loadxml(docxml);
		objnodea = xmldoc.selectsinglenode("A");
		if (emptyvalue(objnodea) = 0) then
			objnodeurl= objnodea.selectsinglenode("url");
			if (emptyvalue(objnodeurl) = 0) then
				queryid = objnodeurl.text;
			endif;
		endif;
	endif;
	return queryid;
endfunction

Разбор результирующей строки в формате XML производится следующим образом (пример):

функция РазобратьНакладную(СтрокаXML) экспорт
	xmldoc = createobject("Msxml.DOMDocument");	
	xmldoc.loadxml(СтрокаXML);
    

	Node1 = xmlDoc.selectSingleNode("ns:Documents");
	Owner = Node1.selectSingleNode("ns:Owner");
	FsRarID = СокрЛП(Owner.selectSingleNode("ns:FSRAR_ID").text);
	Node2 = Node1.selectSingleNode("ns:Document");
	SprName  = Node2.childNodes(0).nodeName;
	
	if SprName = "ns:WayBill" then
		WayBill = Node2.selectSingleNode("ns:WayBill");
		Header  = WayBill.selectSingleNode("wb:Header");
		НомерДокВходящий = СокрЛП(Header.selectSingleNode("wb:NUMBER").text);
		ДатаДок  = preparedate(Header.selectSingleNode("wb:Date").text);

		ДатаОтгр = preparedate(Header.selectSingleNode("wb:ShippingDate").text);
		Отпр	 = Header.selectSingleNode("wb:Shipper");
		КПП		 = СокрЛП(Отпр.selectSingleNode("oref:KPP").text);
		ИНН		 = СокрЛП(Отпр.selectSingleNode("oref:INN").text);
		ClientRegID = СокрЛП(Отпр.selectSingleNode("oref:ClientRegId").text);

		Content = WayBill.selectSingleNode("wb:Content");
		for i = 0 to Content.childNodes.length - 1 do
			Position = Content.childNodes.item(i);
			Product = Position.selectSingleNode("wb:Product");
			Price   = Число(Position.selectSingleNode("wb:Price").text);
			AlcCode = СокрЛП(Product.selectSingleNode("pref:AlcCode").text);
		enddo;
	endif;
	Возврат "";
конецфункции

Преимущество данных функций перед другими, опубликованными на этом сайте:

1. Не используется вызов внешних программ, не требуется установка дополнительного ПО;

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

Также доступны для скачивания файлы следующих обработок:

  • Обработка для загрузки информации о производителе (торговых точек, зарегистрированных в ЕГАИС) - при помощи данной обработки возможно отправить запрос на получение информации о производителе в ЕГАИС, и получив ответ на него, обработать его и сформировать список зарегистрированных торговых точек производителя с их реквизитами (КПП, регистрационный код ЕГАИС);
  • Обработка для загрузки списка товаров выбранного производителя. При помощи данной обработки можно установить коды ФСРАР существующим в справочнике номенклатурным позициям, а также автоматически создать отсутствующие в справочнике позиции.

Если Вам требуется помощь в доработке учетной системы (1С 7.7, 1С 8.2 или любая другая платформа) для работы в системе ЕГАИС ФСРАР, я готов возмездно помочь за соответствующее вознаграждение по договоренности.

Гарантия возврата денег

ООО "Инфостарт" гарантирует Вам 100% возврат оплаты, если программа не соответствует заявленному функционалу из описания. Деньги можно вернуть в полном объеме, если вы заявите об этом течение 14-ти дней со дня поступления денег на наш счет.

Программа настолько проверена в работе, что мы с полной уверенностью можем дать такую гарантию. Мы хотим, чтобы все наши покупатели оставались довольны покупкой.

Для возврата оплаты просто свяжитесь с нами.

29

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

Наименование Файл Версия Размер
Обработка выгрузки накладной в ЕГАИС
.ert 35,50Kb
11.12.15
10
.ert 1.0 35,50Kb 10 Скачать
Обработка загрузки информации о производителе (1С торговля 9.2)
.ert 33,50Kb
11.12.15
52
.ert 1.1 33,50Kb 52 Скачать
Обработка загрузки списка номенклатуры производителя
.ert 191,00Kb
11.12.15
51
.ert 1.1 191,00Kb 51 Скачать
Процедуры и функции глобального модуля
.zip 7,95Kb
11.12.15
68
.zip 1.1 7,95Kb 68 Скачать
Выгрузка расходной накладной в ЕГАИС
.ert 33,50Kb
11.12.15
45
.ert 1.0 33,50Kb 45 Скачать
Выгрузка акта постановки в ЕГАИС
.ert 35,50Kb
11.12.15
14
.ert 1.1 35,50Kb 14 Скачать
Штрих-кодирование прихода
.ert 191,00Kb
11.12.15
7
.ert 1.1 191,00Kb 7 Скачать
Инструкция по работе с конфигурацией ЕГАИС
.pdf 3,45Mb
11.12.15
39
.pdf 1.1 3,45Mb 39 Скачать бесплатно
23.12.2015
4 4000 руб.

Моментальная
доставка



Новый вопрос

E-mail*
Тема (вопрос)*

См. также