IE 2017

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

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

Предлагаю вашему вниманию функции для использования в целях обмена данными с универсальным транспортным модулем ЕГАИС. При доработке учетной системы с целью интеграции с транспортным модулем ЕГАИС, я столкнулся с серьезной проблемой, связанной с тем, что внешняя компонента 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-ти дней со дня поступления денег на наш счет.

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

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

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

Наименование Файл Версия Размер
Обработка выгрузки накладной в ЕГАИС
.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
36
.pdf 1.1 3,45Mb 36 Скачать бесплатно
Функции для работы с транспортным модулем (УТМ) ЕГАИС + готовая конфигурация для ЕГАИС: Конфигурация 1С ТиС ЕГАИС
23.12.2015
4000 руб.

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

См. также

Вознаграждение за ответ
Показать полностью
Комментарии
1. Сергей Крымов (СергейК) 50 27.10.15 09:23 Сейчас в теме
Спасибо за пример!
Вопрос однако, в функции
function sendclientinfoquery(inn) export
    ...<qp:Name>ИНН</qp:Name>...

есть атрибут названный по русски "ИНН". Не увидел преобразования кодировки текста в UTF-8 ?
Кажется что по умолчанию кодировка строковой переменной будет Windows...
2. volk13 (volk13) 27.10.15 09:59 Сейчас в теме
3. Igor Berezhnov (igorberezhnov) 75 27.10.15 10:03 Сейчас в теме
(1) СергейК, Все правильно, кодировка устанавливается здесь:

objxml.Setrequestheader("Accept-Charset", "utf-8");

И к сведению, все строки, которые передаются в объекты OLE Automation, имеют кодировку Unicode, никак не ANSI.
4. Иван Демидов (ivanov_alex) 3 27.10.15 14:50 Сейчас в теме
Был бы рабочий код для отправки ТТН для розницы, может и купил бы
5. Igor Berezhnov (igorberezhnov) 75 27.10.15 14:53 Сейчас в теме
(4) ivanov_alex, не проблема, сейчас как раз работаю над отправкой ТТН, отправкой акта подтверждения/отказа/расхождения поставщику, а также загрузкой справок формы A и B. Пишите в личку, что Вам надо, договоримся:)
6. Igor Berezhnov (igorberezhnov) 75 27.10.15 14:57 Сейчас в теме
Кстати, заметил, что в тексте публикации не все функции, которые используются в обработках. Если кто-то уже скачал, извиняюсь за свой промах. Вечером выложу здесь файл с текстом глобального модуля в части, касающейся ЕГАИС.
7. Юрий Зайцев (Yury1001) 1433 28.10.15 11:13 Сейчас в теме
(6) igorberezhnov, а так же не описаны изменения в метаданных))
8. Igor Berezhnov (igorberezhnov) 75 28.10.15 13:01 Сейчас в теме
(7) Yury1001, Добавлена строковая константа FSRAR_ID для установки идентификатора торговой точки, добавлено перечисление QueryType со значениями:

ForManufacturerInfo
ForProductsInfo

и добавлен справочник для хранения запросов queryegais следующей структуры:
Код - (нет)
Наименование - строка(42)
QueryType - Перечисление.QueryType
Status - Число(1)
inn - строка(20)

Вот и все изменения!
9. Дмитрий Никс (aximo) 668 31.10.15 18:41 Сейчас в теме
(5) а зачем мы хотите получать справки А и Б?
Разве в первичных документах WAYBILL и REGB... не достаточно информации?

Почему не используете КУРЛ? - это должно упростить разработку системы обмена....
10. Igor Berezhnov (igorberezhnov) 75 31.10.15 19:47 Сейчас в теме
(9) aximo, 1. REGB - это и есть справка Б
2. Требуется установка Curl, требуется формирование файла на диске, неудобно и избыточно, для работы моего кода не требуется установка дополнительных компонентов.
11. rougudz rougudz (rougudz) 06.11.15 11:00 Сейчас в теме
12. Igor Berezhnov (igorberezhnov) 75 06.11.15 11:08 Сейчас в теме
13. rougudz rougudz (rougudz) 06.11.15 11:13 Сейчас в теме
я пробовал и так и так. ничего не меняется :(
Ошибка отправки запроса POST: msxml3.dll: Синтаксическая ошибка
14. Igor Berezhnov (igorberezhnov) 75 06.11.15 11:19 Сейчас в теме
(13) rougudz, У Вас ошибка в XML-файле запроса, он у Вас неправильно сформирован. Возьмите мой вариант за основу, у меня все правильно сформировано. Например, что это за строка:
<ns:Document> (5.1)
Это точно не мой код. И делимитер для формы у меня формируется из случайных символов. Это не я писал.
15. rougudz rougudz (rougudz) 06.11.15 11:26 Сейчас в теме
сперва я пробовал ваш вариант, потом вариант из pdf ЕГАИСопт, 5.1 это от туда случайно влезло после копипаста.

вот ваш вариант, таже песня:
--qqqqqqqqqqqqqqqqqqqqqqqqqqqqqq
Content-Disposition: form-data; name="xml_file"; filename="client.xml"
Content-Type: text/xml; charset=utf-8

<?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>030000050400</ns:FSRAR_ID></ns:Owner>
<ns:Document><ns:QueryAP><qp:Parameters><qp:Parameter><qp:Name>ИНН</qp:Name>
<qp:Value>7729101200</qp:Value></qp:Parameter></qp:Parameters></ns:QueryAP>
</ns:Document></ns:Documents>
--qqqqqqqqqqqqqqqqqqqqqqqqqqqqqq--
Ошибка отправки запроса POST: msxml3.dll: Синтаксическая ошибка
...Показать Скрыть
16. Igor Berezhnov (igorberezhnov) 75 06.11.15 11:31 Сейчас в теме
(15) rougudz, ну какой же мой? А откуда --qqqqqqqqqqqqqqqqqqqqqqqqqqqqq ????
17. rougudz rougudz (rougudz) 06.11.15 11:33 Сейчас в теме
(16) igorberezhnov,
на моей машине почету-то так отрабатывает getrandomstring
это я еще не разбирался.
своего я тут ничего не выдумывал, пробую ваше.
вот никак немогу понять в чем ошибка в запросе :(
18. Igor Berezhnov (igorberezhnov) 75 06.11.15 11:35 Сейчас в теме
(15) rougudz, Где у Вас в файле вот это: xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef" ?
19. Igor Berezhnov (igorberezhnov) 75 06.11.15 11:37 Сейчас в теме
(17) rougudz, У меня почему то есть, а у Вас само-собой пропало? Используйте мой код, в нем все работает, если вносите свои изменения, зачем ко мне претензии?
20. Igor Berezhnov (igorberezhnov) 75 06.11.15 11:43 Сейчас в теме
(17) rougudz, Прошу прощения, уже вижу, что запрос формировался по продукции, не заметил сразу, этой строки и не должно быть в запросе. Значит еще где-то ошибка.
21. Igor Berezhnov (igorberezhnov) 75 06.11.15 11:46 Сейчас в теме
Для какой платформы и конфигурации пытаетесь адаптировать?
22. Igor Berezhnov (igorberezhnov) 75 06.11.15 11:49 Сейчас в теме
(17) rougudz, getrandomstring не отрабатывает, потому что в функцию "ПриНачалеРаботыСистемы" надо добавить:
	somedigit = _getperformancecounter()*_getperformancecounter();
23. rougudz rougudz (rougudz) 06.11.15 11:49 Сейчас в теме
(19) igorberezhnov, НИКАКИХ претензий! боже упаси, сорри если мои слова воспринялись как претензии.
если посмотреть выше на список процедур (Запрос номенклатурного справочника производителя) то там нет такой строки "xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef""
вот потому у меня ее и нету :)
а использую я ваш код это однозначно, все правки которые я делал в начале я убрал.
единственно пришлось таки поменять адрес на /opt/in/QueryPartner
потому что он видимо изменился со дня публикации...

добавил эту строку...
итоговый код запроса, а ошибка таже..
--PPPPKKKKKKKKKKKMMMMMMMMMM88888
Content-Disposition: form-data; name="xml_file"; filename="client.xml"
Content-Type: text/xml; charset=utf-8

<?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>030000050400</ns:FSRAR_ID></ns:Owner>
<ns:Document><ns:QueryAP><qp:Parameters><qp:Parameter><qp:Name>ИНН</qp:Name>
<qp:Value>7729101200</qp:Value></qp:Parameter></qp:Parameters></ns:QueryAP>
</ns:Document></ns:Documents>
--PPPPKKKKKKKKKKKMMMMMMMMMM88888--
Ошибка отправки запроса POST: msxml3.dll: Синтаксическая ошибка
...Показать Скрыть

спасибо за ответы. у меня этот вариант не работает, буду пробовать чтото другое.
24. Igor Berezhnov (igorberezhnov) 75 06.11.15 11:53 Сейчас в теме
(17) rougudz, В Вашем варианте в HTTP-заголовке для POST нет обязательных полей:
Content-Length
Content-Type (обязательно указывать поле boundary)

Возьмите мой код целиком, и все заработает! Скачайте функции глобального модуля, и вставьте в свой глобальный модуль, ничего не меняя в низкоуровневых функциях.
25. rougudz rougudz (rougudz) 06.11.15 11:59 Сейчас в теме
я приводил пример того что передается в objxml.send(dataforsend); т.е. саму строку в dataforsend

все остальное передается
objxml.setrequestheader("Content-Type", "multipart/form-data; boundary=" + boundary);
    objxml.setrequestheader("Content-Length", string(СтрДлина(querydata)));

и т.д.
ваша процедура, единственное поменял команды на руские вариенты, мне так проще, привычнее, суть не поменялась
Функция sendpostquery(objxml, querydata, address) export
    boundary = ПолучитьСтрСлучСимволов(30);
    objxml.open("POST", UTM_SERVER + address, 0);
    objxml.setrequestheader("Content-Type", "multipart/form-data; boundary=" + boundary);
    objxml.setrequestheader("Content-Length", string(СтрДлина(querydata)));
    objxml.setrequestheader("Если-ModЕслиied-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 + РазделительСтрок +
            "Content-Disposition: form-data; name=""xml_file""; filename=""client.xml""" + РазделительСтрок +
            "Content-Type: text/xml; charset=utf-8" + РазделительСтрок + РазделительСтрок + querydata +
            РазделительСтрок + "--" + boundary + "--";
    
	
	
	Попытка 
        objxml.send(dataforsend);
        resultstr = objxml.responsetext;
	Исключение
		Сообщить(dataforsend);		
        message("Ошибка отправки запроса POST: "+сокрлп(описаниеошибки()),"!");        
        resultstr = "";
    КонецПопытки;
    Возврат resultstr;
КонецФункции
...Показать Скрыть


я приводил текст dataforsend
26. rougudz rougudz (rougudz) 06.11.15 12:02 Сейчас в теме
спасибо. попробую когда разбогатею :)
у меня 0,98 на счете :)
и я собственно юзал процедуры из публикации а не вложенных файлов.
27. Igor Berezhnov (igorberezhnov) 75 06.11.15 12:04 Сейчас в теме
(25) rougudz, Чет вообще ничего непонятно, какой-то мусор в Вашем коде
28. Igor Berezhnov (igorberezhnov) 75 06.11.15 12:05 Сейчас в теме
(26) rougudz, давайте Вашу почту в личке, я скину
29. Дмитрий Шкекин (dm1860) 11.11.15 17:06 Сейчас в теме
Прикрутил функции... работают.
Но по некоторым производителям при попытке забрать ответ на запрос с их продукцией, 1С-ина вылетает и при этом сохраняется пустой файл *.qry в папке КаталогИБ\queries\ Не знаете из-за чего это может быть?
30. Igor Berezhnov (igorberezhnov) 75 11.11.15 17:38 Сейчас в теме
(29) dm1860, увы, уже знаю. 1С вылетает при попытке передать/считать строку в COM-объект больше приблизительно 100 Кб, а также при работе со строками неограниченной длины в базе больше 100Кб. Вылетает в крэш. Пришлось поправить функции, сделать все таки загрузку из файлов, разрезать строку на кусочки по 80Кб при сохранении, использовать другой COM-объект для записи/считывания данных в кодировке UTF. Исправленные функции и модули сейчас выложу.
31. Victor Nespyatin (victuan) 1552 20.11.15 07:56 Сейчас в теме
(30) Увы, для большего объема данных подойдет только Curl. Вот цитата из соседней разработки:
При скачивании файлов >570 Кб используется cUrl (в настройках можно форсировать использование cUrl на постоянной основе)
http://infostart.ru/public/409028/
32. Igor Berezhnov (igorberezhnov) 75 20.11.15 09:23 Сейчас в теме
(31) victuan, ничего подобного, я без проблем загружаю файлы 11-12 Мб (справочники продукции) - без всякого CURL. Просто нужны прямые руки:) Скачайте глобальный модуль - и убедитесь.
33. влади мир (ya.vladi.mir) 24.11.15 11:37 Сейчас в теме
Игорь, можно вопрос по поводу подтверждение акта разногласия
- мне через УТМ пришло два уведомления: первое что акт принят и второе что накладная проведена
а где же подтверждение от поставщика, что он согласен на уменьшение количества согласно акта?
как у вас реализовано?????
спасибо
34. Igor Berezhnov (igorberezhnov) 75 24.11.15 21:13 Сейчас в теме
(33) ya.vladi.mir, По поводу подтверждения сам еще не в курсе, нигде не нашел такой информации. 2..12.2015 будет семинар в москве по ЕГАИС, там надеюсь получить ответ на этот вопрос. Пока решили просто отклонять полностью накладную, и получать переделанную от поставщика.
35. влади мир (ya.vladi.mir) 25.11.15 11:37 Сейчас в теме
(34) igorberezhnov, да - полностью согласен, решение в данном случае самое верное,
однако хотелось бы правды ))) узнать
36. Андрей Фролов (Андрей77RX) 25.11.15 23:16 Сейчас в теме
Кто занимается автоматизацией магазинов, подскажите, устанавливали ли АТОЛ УТМ HUB-19, как он в работе ? http://pos-tech.ru/egais/utm-atol/utm-atol-hub
37. влади мир (ya.vladi.mir) 26.11.15 08:04 Сейчас в теме
(34) igorberezhnov, Игорь, брось свои координаты мне на ya.vladi.mir@yandex.ru
38. Евгений Иванов (sf002) 4 26.11.15 13:36 Сейчас в теме
igorberezhnov, скажите при выгрузке накладной, где выгружается PDF417 считанный с бутылки или я что-то напутал?
39. Igor Berezhnov (igorberezhnov) 75 26.11.15 14:00 Сейчас в теме
(38) sf002, Нигде, максимум что Вы можете получить - это диапазоны серийных номеров марок, которыми маркирована продукция (это маленькие коды DataMatrix) для всей выпущенной партии производителя. Согласно официальной схеме, они должны быть включены в справку А ЕГАИС, но по факту ни в одной полученной справке я их не видел. Но это код марок, а не штрихкод PDF-417. Так что придется штрихкодировать каждую бутылку как при получении, так и при отгрузке.
40. Евгений Иванов (sf002) 4 28.11.15 10:48 Сейчас в теме
(39) igorberezhnov, штриховать придется рознице или опту? я так понял что оптовик отправляет только то что получил в приходной накладной. и идентифицировать бутылку никак нельзя. в табличной части там только рег.номер справки А + рег.номер справки Б + код ЕГАИС бутылки + код ЕГАИС производителя.
это значит штрихкодированием будет заниматься только розница? ведь только они должны печатать спец.чек и отпускать товар по 2-м кодам EAN(свой) и PDF417(с акц.марки). то есть оптовке не нужно ничего штрихкодировать? в справке А есть диапазоны марок и оптовик по приходу проверяет на соответствие каждой бутылки - этой справке А. и также при отгрузке указывает конкретную справку А и справку Б.
41. Евгений Иванов (sf002) 4 28.11.15 11:06 Сейчас в теме
сам отвечу.
получается оптовик отправляет данные в розницу лишь диапазоном марок (указанный в справке А) - все как раньше на бумажках
розница отпускает продукцию считанную по PDF417 (наименование, код ЕГАИС, крепость, емкость, производитель, дата розлива) с точностью до конкретного номера марки считанного с DataMatrix.
зачем тогда обязательная маркировка EAN? или бывают повторения в комбинации PDF417+DataMatrix?
42. Igor Berezhnov (igorberezhnov) 75 28.11.15 14:27 Сейчас в теме
(40) sf002, как в оптовой торговле без кодирования, как партии товаров различать, которые поступили от производителя/поставщика? Или держать их на разных полках? Предположим, мы от фонаря отгрузили в розницу бутылку водки из другой партии, при продаже информация о бутылке поступит в ЕГАИС, а там сведения, что эта бутылка продана ИП Пупкину. Значит в этом магазине торгуют контрафактом!
43. Igor Berezhnov (igorberezhnov) 75 28.11.15 14:32 Сейчас в теме
(41) sf002,
> зачем тогда обязательная маркировка EAN? или бывают повторения в комбинации PDF417+DataMatrix?
Так в розничных учетных системах нет возможности идентификации товара по алкогольному штрихкоду. Во первых, в существующих учетных системах нет информации о коде ЕГАИС номенклатуры конкретного товара. Во вторых, не так то просто извлечь код товара из штрихкода, он там зашифрован в 36-разрядной системе. В третьих, один и тот же товар разных производителей имеет разный штрих-код, а это неудобно при назначении дисконта или наценки на конкретный товар.
44. Евгений Иванов (sf002) 4 28.11.15 15:24 Сейчас в теме
(42) igorberezhnov,
как в оптовой торговле без кодирования, как партии товаров различать, которые поступили от производителя/поставщика?

можно обклеить ящики текстовой информацией о партии: (номер партии, диапазон марок), затем при отгрузке в розницу - подбирать по этим 2-м параметрам. а номера регистрации справок А и Б брать из номера партии. конечно если обклеить ящики/бутылки штрихкодами - то все будет быстрее. меня просто интересует алгоритм. я верно прикинул?
45. Евгений Иванов (sf002) 4 28.11.15 15:25 Сейчас в теме
да про розницу понял, спасибо за разъяснения. там без штрихкодирования необойтись.
46. Игорь Маловичко (ital) 30.11.15 09:26 Сейчас в теме
Скачал все ваши обработки,заточил под себя все отлично, а вот с обработкой "Выгрузка расходной накладной в ЕГАИС", затык, отладил все ошибки в наших данных, и теперь зашел в тупик при отправке выдает одну и ту же "обезличенную" ошибку.

<A><error>org.xml.sax.SAXParseException; cvc-pattern-valid: Value '' is not facet-valid with respect to pattern '\S+(.*\S+)*' for type 'NoEmptyString50'.</error><ver>2</ver></A>

А какое именно поле пустое не могу понять уже все поля в готовом файлике xml запроса проверил на 10 рядов + добавил транспортный раздел. Так же по схеме попытался найти какие поля типа "NoEmptyString50" там судя по схеме их всего 3 шт это "NUMBER" (номер ТТН), "Pack_ID" (упаковка), "Party" (партия), все эти поля еще раз перепроверил, все заполнены. Подскажите пожалуйста в каком направлении копать.
47. Igor Berezhnov (igorberezhnov) 75 30.11.15 11:03 Сейчас в теме
(46) ital, Это поля адреса производителя/поставщика. Если адрес не соответствует требованиям МНС, в файле выгрузки появляются пустые поля (город, код страны, улица и т.д.), которые должны содержать как минимум один символ, как максимум 50. Я для себя решил эту проблему тем, что завел в карточке контрагента все дополнительные поля, как они есть в схеме ЕГАИС (все части адреса отдельно, плюс поле description, плюс полное и краткое наименование ЕГАИС).
48. Александр Новиков (Novicad) 2 10.12.15 13:54 Сейчас в теме
Можешь перезалить свежие варики обработок, и может что то еще наработал тоже выкладывай!? спасибо
49. Igor Berezhnov (igorberezhnov) 75 11.12.15 11:05 Сейчас в теме
(48) Novicad, Добавил обработку выгрузки акта постановки на баланс, и обработку штрихкодирования прихода по накладной. Выложил готовую и протестированную конфигурацию для платформы 1С 7.7.
50. Павел Меркулов (Palmer1976) 66 18.12.15 17:17 Сейчас в теме
Функция loadxml() объекта Msxml.DOMDocument крэшится при попытке загрузить из строки очень большой длины (к примеру ответ на запрос справочника алкогольной продукции производителя по его ИНН). Как вы обошли эту проблему?
51. Igor Berezhnov (igorberezhnov) 75 18.12.15 22:01 Сейчас в теме
(50) Palmer1976, считываю порциями по 80Кб:
function loadreply(queryid) export
	fso = createobject("Scripting.FileSystemObject");
	reply = "";
	path = КаталогИБ()+"\queries\"+сокрлп(queryid)+".qry";
	if (fso.fileexists(path) <> 0) then
	    txtfile = fso.opentextfile(path, 1);
		пока txtfile.AtEndOfStream=0 цикл
	    	reply = reply + txtfile.read(80000);
		конеццикла;
	    txtfile.close();
	endif;
	return reply;
endfunction
...Показать Скрыть


function loadreply(queryid) export
fso = createobject("Scripting.FileSystemObject");
reply = "";
path = КаталогИБ()+"\queries\"+сокрлп(queryid)+".qry";
if (fso.fileexists(path) <> 0) then
txtfile = fso.opentextfile(path, 1);
пока txtfile.AtEndOfStream=0 цикл
reply = reply + txtfile.read(80000);
конеццикла;
txtfile.close();
endif;
return reply;
endfunction
52. Павел Меркулов (Palmer1976) 66 19.12.15 23:05 Сейчас в теме
(51) igorberezhnov, сами создаете себе трудности, чтобы потом их успешно преодолевать? даю наводку ;) раз уж используете MSXML, то вовсе нет нужды гонять данные через текстовую строку туда-сюда responsetext -> loadxml()
когда есть ResponseXML
53. Igor Berezhnov (igorberezhnov) 75 20.12.15 10:21 Сейчас в теме
(52) Palmer1976, Я вообще то в курсе, как работает MSXML, учить меня не надо. Вы спросили, как решить проблему обмена длинными строками в 1С - я вам объяснил. Или чего хотели?
54. Igor Berezhnov (igorberezhnov) 75 20.12.15 10:34 Сейчас в теме
(52) Palmer1976, У меня все файлы ответов хранятся на диске, чтобы всегда можно было посмотреть ответ/список ответов в карточке запроса, для последующей обработки. Чтобы с диска файлы считывать тоже ResponseXML предлагаете?
55. Станислав Пруцков (Stan) 31 21.12.15 12:09 Сейчас в теме
Есть вопросы по конфигурации. Написал в личку.
56. Николай Николай (beard1) 14.01.16 22:05 Сейчас в теме
Доброго времени суток, в конфигурацию входят все функции? сканер как подключаем?
сопоставление контрагентов и номенклатуры реализовано?
57. Igor Berezhnov (igorberezhnov) 75 15.01.16 08:30 Сейчас в теме
(56) beard1,
в конфигурацию входят все функции?

Все, описанные в технических требованиях по опту, за исключением акта списания, в ближайшее время собираюсь доработать.
сканер как подключаем?

Сканер подключаем к COM-порту, или через USB - с эмуляцией COM-порта, главное - чтобы поддерживалось внешнее событие 1С
сопоставление контрагентов и номенклатуры реализовано?

Что имеется ввиду? Идентификация номенклатуры и контрагента производится по уникальному идентификатору ЕГАИС.
58. Николай Николай (beard1) 15.01.16 22:28 Сейчас в теме
(57) igorberezhnov,

Что имеется ввиду? Идентификация номенклатуры и контрагента производится по уникальному идентификатору ЕГАИС


я спрашивал про первичное сопоставление, например, получили номенклатуру поставщика из ЕГАИС, естественно надо сопоставить со своей, вот эта функция реализована?
59. Igor Berezhnov (igorberezhnov) 75 17.01.16 11:47 Сейчас в теме
(58) beard1, Конечно, в обработке загрузки номенклатуры можно сопоставить загруженную номенклатуру со своей вручную, если элемент не найден в справочнике либо по коду ЕГАИС, либо по наименованию.
60. Дмитрий Шкекин (dm1860) 20.01.16 11:39 Сейчас в теме
Еще один момент... акт постановки на баланс, (в который сканируются марки) создает xml более 600 kb (около 8 тысяч марок в одном документе) и при попытке отправки в ЕГАИС вашими функциями завершает работу 1С... :( с такой проблемой не боролись?
61. Igor Berezhnov (igorberezhnov) 75 20.01.16 16:05 Сейчас в теме
(60) dm1860, В теме уже отвечал (51) - если передавать во внешний COM-объект очень длинные строки - 1С вылетает по ошибке. Сохраняйте строку в файл и из неё загружайте.
62. Ангам Ахметзянов (Askaneli) 02.02.16 16:26 Сейчас в теме
Идея просто великолепна.
С некоторыми модификациями использовал для реализации всего что касается ЕГАИС.
Спасибо огромное.
63. Лузер Обрезумов (Лузер) 2 28.04.17 15:56 Сейчас в теме
Егор а можно заказать внедрение?
64. Igor Berezhnov (igorberezhnov) 75 02.05.17 10:32 Сейчас в теме
Вообще то Игорь. Конечно могу помочь с внедрением.
Оставьте свое сообщение