Имя: Пароль:
1C
1С v8
ЕГАИС отправка чека
0 Stepinrn
 
26.08.19
16:44
Коллеги, добрый день. Помогите, пожалуйста, решить проблему, уже неделю бьюсь.

Формирую XML-файл для отправки данных в УТМ ЕГАИС данных о пробитом чеке (розничная торговля алкоголем). Файл формирую "по аналогии с типовыми", вот такой  

--55dd23378b854781be82060fdfc0e3c3
Content-Disposition: form-data; name="xml_file"; filename="Cheque.xml"
Content-Type: text/xml; charset=utf-8

?<?xml version="1.0" encoding="UTF-8"?>
<Cheque inn="5190028811" kpp="519045005" address="АдресОрганизации" name="НаименованиеОрганизации" kassa="00106705372702" shift="1" number="6332" datetime="2608191629">
    <Bottle barcode="22N00001CK39CGUCTEP3SZK805100270150340W5J3CU70BV916DP06QNR68DNRTKSQF" ean="8437004024145" price="550.00" volume="0.75"/>
</Cheque>

--55dd23378b854781be82060fdfc0e3c3--

В заголовках HTTP-запроса пишу так

Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary)

УТМ мне возвращает ошибку

<tc:Comments>org.xml.sax.SAXParseException; cvc-elt.1.a: Cannot find the declaration of element 'Cheque'.</tc:Comments>

В чем еще может быть ошибка в XML-файле? Или может быть запрос нужно по-другому составить
1 Garykom
 
гуру
26.08.19
16:46
Проверь свой XML на валидность
2 Garykom
 
гуру
26.08.19
16:47
Или ошибка в отправке кривой
3 Stepinrn
 
26.08.19
16:55
А как проверить на валидность?
4 Stepinrn
 
26.08.19
16:56
Boundary = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
                    ИмяФайлаДляЗагрузки = ПолучитьИмяВременногоФайла("xml");
                    ИмяФайлаОтвета      = ПолучитьИмяВременногоФайла("xml");
                    ИмяФайлаОтправки    = ПолучитьИмяВременногоФайла("txt");
                    ЗаписьФайл = Новый ЗаписьXML();
                    ЗаписьФайл.ОткрытьФайл(ИмяФайлаДляЗагрузки);
                    ЗаписьФайл.ЗаписатьОбъявлениеXML();
                    ЗаписьФайл.ЗаписатьНачалоЭлемента("Cheque");
                    ЗаписьФайл.ЗаписатьСоответствиеПространстваИмен("xs", "http://www.w3.org/2001/XMLSchema";);
                        ЗаписьФайл.ЗаписатьАтрибут("inn"     , Пользователи.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация", ПараметрыСеанса.ТекущийПользователь).ИНН);
                        ЗаписьФайл.ЗаписатьАтрибут("kpp"     , КассаККМ.УзелРозничногоМагазина.КПП);
                        ЗаписьФайл.ЗаписатьАтрибут("address" , КассаККМ.УзелРозничногоМагазина.АдресТТ);
                        ЗаписьФайл.ЗаписатьАтрибут("name"    , КассаККМ.УзелРозничногоМагазина.НаименованиеМагазина);
                        ЗаписьФайл.ЗаписатьАтрибут("kassa"   , КассаККМ.УзелРозничногоМагазина.ЗаводскойНомерККМ);
                        ЗаписьФайл.ЗаписатьАтрибут("shift"   , XMLСтрока(1));
                        ЗаписьФайл.ЗаписатьАтрибут("number"  , НомерДокумента);
                        ЗаписьФайл.ЗаписатьАтрибут("datetime", Формат(ТекущаяДата(),"ДФ=ddMMyyHHmm"));
                        
                        Для Каждого Стр Из ТаблицаКрепкийАлкоголь Цикл
                            ЗаписьФайл.ЗаписатьНачалоЭлемента("Bottle");
                                ЗаписьФайл.ЗаписатьАтрибут("barcode", Стр.АкцизнаяМарка);
                                ЗаписьФайл.ЗаписатьАтрибут("ean"    , Стр.Штрихкод);
                                ЗаписьФайл.ЗаписатьАтрибут("price"  , Формат(Стр.Цена,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧГ=0"));
                                ЗаписьФайл.ЗаписатьАтрибут("volume" , XMLСтрока(Стр.Объем));
                            ЗаписьФайл.ЗаписатьКонецЭлемента();
                        КонецЦикла;
                    ЗаписьФайл.ЗаписатьКонецЭлемента();
                    ЗаписьФайл.Закрыть();
                    
                    МассивФайловДляОбъединения = Новый Массив;
    
                    //Формируем начальный фрагмент файла POST-запроса
                    ИмяФайлаОтправкиНачало = ПолучитьИмяВременногоФайла("txt");
                    ФайлОтправкиНачало = Новый ЗаписьТекста(ИмяФайлаОтправкиНачало, КодировкаТекста.ANSI, Символы.ПС, Ложь);
                    ФайлОтправкиНачало.ЗаписатьСтроку("--" + Boundary);
                    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Disposition: form-data; name=""xml_file""; filename=""" + "Cheque.xml" + """");
                    ФайлОтправкиНачало.ЗаписатьСтроку("Content-Type: text/xml; charset=utf-8");
                    ФайлОтправкиНачало.ЗаписатьСтроку("");
                    ФайлОтправкиНачало.Закрыть();
                    
                    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиНачало);
                    МассивФайловДляОбъединения.Добавить(ИмяФайлаДляЗагрузки);
                    
                    ИмяФайлаОтправкиКонец = ПолучитьИмяВременногоФайла("txt");
                    ФайлОтправкиКонец = Новый ЗаписьТекста(ИмяФайлаОтправкиКонец, КодировкаТекста.ANSI, Символы.ПС, Ложь);
                    ФайлОтправкиКонец.ЗаписатьСтроку(Символы.ПС);
                    ФайлОтправкиКонец.ЗаписатьСтроку("--" + Boundary + "--");
                    ФайлОтправкиКонец.Закрыть();
                    
                    МассивФайловДляОбъединения.Добавить(ИмяФайлаОтправкиКонец);
                    ОбъединитьФайлы(МассивФайловДляОбъединения, ИмяФайлаОтправки);
                    
                    ЗаголовокHTTP = Новый Соответствие();
                    ЗаголовокHTTP.Вставить("Content-Type", "multipart/form-data; boundary=" + Boundary);
                    
                    Соединение = Новый HTTPСоединение(ПараметрыОбмена.АдресСервера, ПараметрыОбмена.ПортСервера);
                    ЗапросHTTP = Новый HTTPЗапрос("opt/in/" + "Cheque", ЗаголовокHTTP);
                    ЗапросHTTP.УстановитьИмяФайлаТела(ИмяФайлаОтправки);
                    
                    ОтветHTTP = Соединение.ОтправитьДляОбработки(ЗапросHTTP, ИмяФайлаОтвета);
                    Результат = ОтветHTTP.ПолучитьИмяФайлаТела();
5 Stepinrn
 
26.08.19
16:56
Вот выше сообщением скинул полный код, с отправкой
6 Ёпрст
 
26.08.19
17:06
ну так хотя бы:

    ЗаписьФайл.ЗаписатьНачалоЭлемента("Cheque");
       ЗаписьФайл.ЗаписатьАтрибут("xmlns:xs","http://www.w3.org/2001/XMLSchema";);
       ЗаписьФайл.ЗаписатьАтрибут("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance";);
7 Stepinrn
 
26.08.19
17:42
<?xml version="1.0" encoding="UTF-8"?>
<Cheque inn="5190028811" datetime="2608191716" kpp="519045005" kassa="00106705372702" address="Адрес" name="Юность" number="6332" shift="1">
  <Bottle barcode="22N00001CK39CGUCTEP3SZK805100270150340W5J3CU70BV916DP06QNR68DNRTKSQF" ean="8437004024145" price="550.00" volume="0.75"/>
</Cheque>
8 Stepinrn
 
26.08.19
17:43
Подскажите, ну вот где тут ошибка? Валидатор тоже говорит что ошибка "Не найдено описание для элемента "Cheque". Возможно неверно указан корневой элемент."
9 Stepinrn
 
26.08.19
17:43
Но в инструкции к УТМ именно такой формат
10 Ёпрст
 
26.08.19
18:00
(7) всё просто, у тебя в </Cheque> одна из букв русская.
11 Ёпрст
 
26.08.19
18:00
а не..норм, ну укажи как в (6) да проверь curl-ом
12 Garykom
 
гуру
26.08.19
18:13
(7) Нет ошибки это валидатор от яндекса кривой.
И поэтому и УТМ упал и не принимает который на его основе вероятно сделан ))
13 Garykom
 
гуру
26.08.19
18:14
УТМ обнови
14 Stepinrn
 
26.08.19
18:18
А как проверить curl-ом? Я делаю батник

C:\curl64\curl64.exe curl -F "xml_file=@C:\Mistral\cheque.xml" http://172.30.10.155:8080

И выдает "Could not resolve host curl"
15 Stepinrn
 
26.08.19
18:18
(13) у меня версия 3.0.8, по-моему выше пока некуда обновлять )
16 Garykom
 
гуру
26.08.19
18:22
(15) Значит откатить наоборот попробуй.
17 Djelf
 
26.08.19
18:34
(14) Что вот это такое? "curl64.exe curl"
А в документацию заглянуть пробовал? Там чуток по другому написано:
> Пример команды отправки чека (check.xml) в транспортный модуль:
> curl -F "[email protected]" http://localhost:8080/xml
18 Stepinrn
 
26.08.19
18:38
(17) curl64.exe это пусть до самого curl
19 Djelf
 
26.08.19
18:42
(18) А "curl64.exe curl" это отправка запроса на сервер "curl".
20 Stepinrn
 
26.08.19
18:44
(19) подскажи как в итоге правильно? отправлять нужно именно с машины, где установлен УТМ? Или можно указать IP?
21 Djelf
 
26.08.19
19:04
(20) В цитате из руководства (17) указано правильно.
Разве что "curl" нужно заменить на "curl.exe"

У curl такая фишка: первый кто попался не после ключа будет хостом для совершения операции.
22 Сияющий в темноте
 
26.08.19
23:11
у тебя в xml в начале BOM стоит,и он все портит.
и потом,пространства имен где?
23 Stepinrn
 
27.08.19
09:53
(22) Пространство имен я устанавливал, но ошибка та же. Какое должно быть пространство в данном случае? Я нашел только http://fsrar.ru/WEGAIS/Cheque
24 Ёпрст
 
27.08.19
10:53
(20) откуда угодно, просто прописываешь путь
25 Stepinrn
 
27.08.19
14:00
Да, curl`ом отправляет. Всем спасибо за помощь
26 Ёпрст
 
27.08.19
14:10
ну, если курлом отправляет, то и 1с-ина отправит
27 Ёпрст
 
27.08.19
14:11
код выгрузки взять с любой типовой(розница/ут/утап/катап/далион и т.д)
28 Stepinrn
 
27.08.19
16:50
(27) с типовой не могу взять, там черт ногу сломит. А у меня самописная конфигурация
29 Ёпрст
 
27.08.19
17:30
(28) на вот, пробуй:


    АдресУТМ = "127.0.0.1";
    АдресРесурса =  "opt/in/Cheque";
    ПортСервера=8080;
    ЗаписьXML = Новый ЗаписьXML;
    ЗаписьXML.УстановитьСтроку();
//    ЗаписьXML.ЗаписатьОбъявлениеXML();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Cheque");
//     ЗаписьXML.ЗаписатьАтрибут("xmlns:xs","http://www.w3.org/2001/XMLSchema";);
//     ЗаписьXML.ЗаписатьАтрибут("xmlns:xsi","http://www.w3.org/2001/XMLSchema-instance";);
    
    ЗаписьXML.ЗаписатьАтрибут("inn"     , Пользователи.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация", ПараметрыСеанса.ТекущийПользователь).ИНН);
    ЗаписьXML.ЗаписатьАтрибут("kpp"     , КассаККМ.УзелРозничногоМагазина.КПП);
    ЗаписьXML.ЗаписатьАтрибут("address" , КассаККМ.УзелРозничногоМагазина.АдресТТ);
    ЗаписьXML.ЗаписатьАтрибут("name"    , КассаККМ.УзелРозничногоМагазина.НаименованиеМагазина);
    ЗаписьXML.ЗаписатьАтрибут("kassa"   , КассаККМ.УзелРозничногоМагазина.ЗаводскойНомерККМ);
    ЗаписьXML.ЗаписатьАтрибут("shift"   , XMLСтрока(1));
    ЗаписьXML.ЗаписатьАтрибут("number"  , НомерДокумента);
    ЗаписьXML.ЗаписатьАтрибут("datetime", Формат(ТекущаяДата(),"ДФ=ddMMyyHHmm"));
    Для Каждого Стр Из ТаблицаКрепкийАлкоголь Цикл
           ЗаписьXML.ЗаписатьНачалоЭлемента("Bottle");
               ЗаписьXML.ЗаписатьАтрибут("barcode", Стр.АкцизнаяМарка);
               ЗаписьXML.ЗаписатьАтрибут("ean"    , Стр.Штрихкод);
               ЗаписьXML.ЗаписатьАтрибут("price"  , Формат(Стр.Цена,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧГ=0"));
               ЗаписьXML.ЗаписатьАтрибут("volume" , XMLСтрока(Стр.Объем));
           ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ТекстЗапроса = ЗаписьXML.Закрыть();    
    ВремГраница = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
    ТелоЗапроса = Новый ТекстовыйДокумент();
    ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница);
    ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""xml_file""");
    ТелоЗапроса.ДобавитьСтроку("Content-Type: text/xml; charset=utf-8");
    ТелоЗапроса.ДобавитьСтроку("");
    ТелоЗапроса.ДобавитьСтроку(ТекстЗапроса);
    ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница + "--");
    ТелоЗапросаСтрока = ТелоЗапроса.ПолучитьТекст();
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
    HTTPЗапрос.Заголовки["Content-Type"] = "multipart/form-data; boundary=" + ВремГраница;
    HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
    
    Соединение = Новый HTTPСоединение(АдресУТМ,ПортСервера);
    HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    ОтветМодуляЕГАИС = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);
    МассивМарок= Новый Массив;
    Если HTTPОтвет.КодСостояния = 200 Тогда
        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.УстановитьСтроку(ОтветМодуляЕГАИС);
        Пока ЧтениеXML.Прочитать() Цикл
            // чтение ответа в виде XML файла
            //бла-бла бла
        КонецЦикла;
        ЧтениеXML.Закрыть();
    Иначе //что-то пошло не так :(
    КонецЕсли;
30 Stepinrn
 
28.08.19
09:53
(29) Спасибо, попробую
31 Stepinrn
 
29.08.19
16:05
(29) Тоже не работает. УТМ возвращает Missing initial multi part boundary
32 Ёпрст
 
29.08.19
16:09
(31) та ладно ? это кусок с рабочей конфы, тока запрос другой.
33 Stepinrn
 
29.08.19
16:14
(32) Мне кажется проблема именно в том что "запрос другой". С любыми другими документами (ТТН, акты расхождений и пр.) все работает по этой схеме. А чек уходить не хочет. И документации нигде нормальной нет.

Причем самое интересное, что на egais.ru тупо нет xsd-схемы для чека )

Похоже придется костыли делать и отправлять через curl, запуская командную строку из 1С
34 Ёпрст
 
29.08.19
16:42
(33) да есть она везде, и в документации и в xsd схеме на дом странице
35 Stepinrn
 
29.08.19
16:47
(34) на дом.странице в XML-схемах есть, а в лк егаис в zip-файле с xsd-схемами нет
36 Ёпрст
 
29.08.19
16:50
(35) лк егаис есть документация - там все примеры, в том числе, отправка через курл
37 Ёпрст
 
29.08.19
17:01
в логах утм, чего хоть при отправке запроса ?

Марку, какую отправляешь на продажу, старую/новую ?
38 Ёпрст
 
29.08.19
17:01
Полностью свой код отправки выложи
39 Ёпрст
 
29.08.19
17:02
проверил код из (29) - работает и на чеке
40 Stepinrn
 
29.08.19
17:14
(37) новую
41 Stepinrn
 
29.08.19
17:15
(37) в логах УТМ вообще ничего, в ответе от УТМ пишет Missing initial part boundary
42 Stepinrn
 
29.08.19
17:15
АдресРесурса =  "opt/in/Cheque";
    
    ПараметрыОбмена = ПланыОбмена.Универсальный.ПолучитьПараметрыОбменаЕГАИС(КассаККМ.УзелРозничногоМагазина);
    
    ЗаписьXML = Новый ЗаписьXML;
    
    ЗаписьXML.УстановитьСтроку();
    ЗаписьXML.ЗаписатьНачалоЭлемента("Cheque");
    
    ЗаписьXML.ЗаписатьАтрибут("inn"     , Пользователи.ПолучитьЗначениеПоУмолчанию("ОсновнаяОрганизация", ПараметрыСеанса.ТекущийПользователь).ИНН);
    ЗаписьXML.ЗаписатьАтрибут("kpp"     , КассаККМ.УзелРозничногоМагазина.КПП);
    ЗаписьXML.ЗаписатьАтрибут("address" , КассаККМ.УзелРозничногоМагазина.АдресТТ);
    ЗаписьXML.ЗаписатьАтрибут("name"    , КассаККМ.УзелРозничногоМагазина.НаименованиеМагазина);
    ЗаписьXML.ЗаписатьАтрибут("kassa"   , КассаККМ.УзелРозничногоМагазина.ЗаводскойНомерККМ);
    ЗаписьXML.ЗаписатьАтрибут("shift"   , XMLСтрока(1));
    ЗаписьXML.ЗаписатьАтрибут("number"  , НомерДокумента);
    ЗаписьXML.ЗаписатьАтрибут("datetime", Формат(ТекущаяДата(),"ДФ=ddMMyyHHmm"));
    
    Для Каждого Стр Из ТаблицаКрепкийАлкоголь Цикл
        ЗаписьXML.ЗаписатьНачалоЭлемента("Bottle");

            ЗаписьXML.ЗаписатьАтрибут("barcode", Стр.АкцизнаяМарка);
            ЗаписьXML.ЗаписатьАтрибут("ean"    , Стр.Штрихкод);
            ЗаписьXML.ЗаписатьАтрибут("price"  , Формат(Стр.Цена,"ЧЦ=15; ЧДЦ=2; ЧРД=.; ЧГ=0"));
            ЗаписьXML.ЗаписатьАтрибут("volume" , XMLСтрока(Стр.Объем));
            
        ЗаписьXML.ЗаписатьКонецЭлемента();
    КонецЦикла;
    
    ЗаписьXML.ЗаписатьКонецЭлемента();
    ТекстЗапроса = ЗаписьXML.Закрыть();
    
    ВремГраница = СтрЗаменить(Строка(Новый УникальныйИдентификатор()), "-", "");
    
    ТелоЗапроса = Новый ТекстовыйДокумент();
    ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница);
    ТелоЗапроса.ДобавитьСтроку("Content-Disposition: form-data; name=""xml_file""");
    ТелоЗапроса.ДобавитьСтроку("Content-Type: text/xml; charset=utf-8");
    ТелоЗапроса.ДобавитьСтроку("");
    ТелоЗапроса.ДобавитьСтроку(ТекстЗапроса);
    ТелоЗапроса.ДобавитьСтроку("--" + ВремГраница + "--");
    ТелоЗапросаСтрока = ТелоЗапроса.ПолучитьТекст();
    
    HTTPЗапрос = Новый HTTPЗапрос(АдресРесурса);
    HTTPЗапрос.Заголовки["Content-Type"] = "multipart/form-data; boundary=" + ВремГраница;
    HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаСтрока, КодировкаТекста.UTF8);
    
    Соединение = Новый HTTPСоединение(ПараметрыОбмена.АдресСервера, ПараметрыОбмена.ПортСервера);

    HTTPОтвет = Соединение.ОтправитьДляОбработки(HTTPЗапрос);
    
    ОтветМодуляЕГАИС = HTTPОтвет.ПолучитьТелоКакСтроку(КодировкаТекста.UTF8);

    МассивМарок= Новый Массив;
    
    Если HTTPОтвет.КодСостояния = 200 Тогда

        ЧтениеXML = Новый ЧтениеXML;
        ЧтениеXML.УстановитьСтроку(ОтветМодуляЕГАИС);
        
        ОбъектXDTO = ФабрикаXDTO.ПрочитатьXML(ЧтениеXML);
        
        Если ОбъектXDTO.Свойства().Получить("url") <> Неопределено Тогда
            ИдентификаторЗапроса = ОбъектXDTO.url;
        ИначеЕсли ОбъектXDTO.Свойства().Получить("error") <> Неопределено Тогда
            Сообщить(ОбъектXDTO.error);
            Отказ = Истина;
        КонецЕсли;
        
        ЧтениеXML.Закрыть();
        
        РегистрАдресаСсылок = РегистрыСведений.АдресаСсылокЕГАИСПоЧекамРозничнойТорговли.СоздатьМенеджерЗаписи();
        РегистрАдресаСсылок.Период         = Дата;
        РегистрАдресаСсылок.Узел         = КассаККМ.УзелРозничногоМагазина;
        РегистрАдресаСсылок.Чек         = Ссылка;
        РегистрАдресаСсылок.АдресСсылки = ИдентификаторЗапроса;
                        
        РегистрАдресаСсылок.Записать(Ложь);
                    
        ОтправитьПисьмоРазработчику(ТаблицаКрепкийАлкоголь);
        
    Иначе
        
        Сообщить("Не удалось прочитать ответ от сервера ЕГАИС");
        
    КонецЕсли;
43 Ёпрст
 
29.08.19
17:22
(42)

  HTTPЗапрос.УстановитьТелоИзСтроки(ТелоЗапросаСтрока, КодировкаТекста.UTF8, ИспользованиеByteOrderMark.НеИспользовать);
44 Stepinrn
 
29.08.19
17:32
(43) При добавлении ИспользованиеByteOrderMark.НеИспользовать у меня сегодня ошибка вылетела. На платформе 8.3.8
45 Ёпрст
 
29.08.19
17:39
(44) обнови до 13 хотя бы.
46 Ёпрст
 
29.08.19
17:41
Или так лепи:


       ИмяФайла=ПолучитьИмяВременногоФайла("xml");
            ЗаписьВременногоФайла = Новый ЗаписьТекста(ИмяФайла,,, Истина, Символы.ПС);
            ЗаписьВременногоФайла.Записать(ТелоЗапросаСтрока);
            ЗаписьВременногоФайла.Закрыть();
            ДвоичныеДанныеВременногоФайла=Новый ДвоичныеДанные(ИмяФайла);
            HTTPЗапрос.УстановитьТелоИзДвоичныхДанных(ДвоичныеДанныеВременногоФайла);
47 Ёпрст
 
29.08.19
17:43
48 Ёпрст
 
29.08.19
17:44
там есть идля совсем древних релизов, 8.1, например
49 Stepinrn
 
29.08.19
17:54
(48) к сожалению ветка "404 not found"
50 Stepinrn
 
29.08.19
17:55
(48) нет, извиняюсь, не так скопировалась просто
51 Ёпрст
 
29.08.19
17:57
52 Stepinrn
 
29.08.19
18:35
(46) Получаю ошибку Cannot find the declaration of element 'Cheque'
53 MWWRuza
 
гуру
29.08.19
20:18
А вот это разве правильно: ЗапросHTTP = Новый HTTPЗапрос("opt/in/" + "Cheque", ЗаголовокHTTP); - ???
Я у себя корректировочные чеки из 1С 7.7 Вот так отправляю: RESULT_XML_DOM = ВыгрузитьDOM(XML_DOM, УТМ_URL + "xml");
"ВыгрузитьDOM" - Функция в ГМ, но, это в данном случае не важно, тут кто чем может, тем и отправляет, НО!!! Обратите внимание на адрес: "УТМ_URL + "xml""... Вы же пытаетесь отправлять в папку оптовых документов, в исходящие: "opt/in/" + "Cheque"... Для чеков, вроде другой путь нужен, как у меня... По крайней мере, так работает, корректировочные чеки уходят(чеки продажи формирует и отправляет у меня другая программа, фронт-офиса, мне как-то пофиг, что она и как там делает, я только с корректирующими заморачивался, из 1С).
54 MWWRuza
 
гуру
29.08.19
20:23
+(53) Вот в отладчике как путь отправки выглядит, при условии, что УТМ на ЛокалХост: "http://localhost:8080/xml";
55 Stepinrn
 
29.08.19
20:39
(53) А какой путь в вашем случае?
56 MWWRuza
 
гуру
29.08.19
22:42
(55)В смысле какой? в (54) же написано, в случае, если УТМ лежит на том-же компе, где программа, которая чеки пытается отправить...
В случае, если на другом будет, то соответственно: "http://IP-адресКомпьютера_сУТМ:8080/xml";...
Я имел в виду, что окончание адреса должно быть не "opt/in/Cheque", а "xml"...

Да, кстати, вот скопировал из PDF-описания к УТМ:
Отправить xml-файл чека АП в УТМ командой:
curl -F "[email protected]" http://localhost:8080/xml (4.1.2)

Откуда Вы свое: "opt/in/Cheque" взяли, вообще не понятно... Потому у Вас и все документы кроме чеков работают, что их действительно туда надо отправлять, а чеки - в "xml"...
57 Ёпрст
 
30.08.19
08:46
(52) см 505 пост в той ветке, там поправка
(53) да правильно
58 Stepinrn
 
30.08.19
12:21
(56) Спасибо большое. Вне изменения согласно Вашему замечанию. Продажи по розничной точке у нас нечастые, проверю когда будет следующая продажа )
59 Ёпрст
 
30.08.19
12:28
(56) точняк, xml :)) посмотрел в жуклолве
60 Ёпрст
 
30.08.19
12:29
(58) нафига ждать ? Запишите тестовый ключ rsa, поставьте тестовый УТМ, копию базы и проверяйте все запросы.
61 Stepinrn
 
30.08.19
12:35
(60) У меня не получилось сделать тестовый ключ. При попытке поставить тестовый ключ на ту же машину, на которой стоит реальный, реальный перестал работать
62 Ёпрст
 
30.08.19
12:36
(61):)))

если хочешь 2 ключа одновременно, то тут только ставить виртуалки под каждый ключ - это самое простое решение.
63 Ёпрст
 
30.08.19
12:37
подымаешь 2 виртуалки, в одной будет тестовый ключ и тестовый утм, во второй - реальный ключ и рабочий утм. Всё собственна
64 MWWRuza
 
гуру
30.08.19
13:00
(59) - "жуклолве" - чёйт такое, просвети???

(61) Да в чем проблема... У Вас есть ключ(я так понимаю, Рутокен ЭФП 2.0), на котором УЦ записан ГОСТ сертификат. Отлично.
Заходите в его утилиту, и удаляете сертификат PKI(не обязательно, можно этого и не делать, но так лучше), только не перепутайте, а то на пару косарей попадете, если случайно ГОСТ удалите. Далее, заходите в ЛК ЕГАИС, и записываете на ключ тестовый сертификат. Базу УТМ сохраняете, сносите его, ставите тестовый. Далее, играетесь, столько, сколько Вам нужно.
Когда наиграетесь - все точно так-же, только записываете "боевой" сертификат, и ставите "боевой" УТМ, сохраненную базу возвращаете на место. Так можно делать любое количество раз, и в любое время, учитывая, что "Продажи по розничной точке у нас нечастые"... Тем, у кого розничный магазин, с этим сложнее, торговлю маркируемым алкоголем придется приостановить на время "экспериментов". Весь остальной документооборот, скорее всего, может и подождать часок, ничего не случится :-)))

PS Только учтите, на "пустом" тестовом контуре Вы сможете протестировать только продажи "старых" марок(они спокойно продаются в минус), с новыми так не прокатит - надо, что-бы марки числились на регистре 1(и 3 соответственно), иначе при попытке продажи, УТМ будет возвращать ошибку "Продукция не поступала в организацию по помарочному учету"... Но, для Вашей задачи, это на самом деле все равно - даже если вернется такая ошибка, уже будет понятно, что отправка чека в УТМ работает :-)
65 MWWRuza
 
гуру
30.08.19
13:02
+(64)Ааааа туплю... "жуклолве", это баголовка, отладчик??? Сразу и не понял.

Вообще, это в документации на УТМ написано...
66 MWWRuza
 
гуру
30.08.19
13:04
+(65) "это", имеется в виду путь для отправки файлов чеков...
67 Stepinrn
 
30.08.19
14:23
(64) Спасибо, наверное попробую )
68 Stepinrn
 
02.09.19
20:40
(56) Помогите, пожалуйста. еще по этому же вопросу. Вот по Вашему совету поменял адрес и получаю ошибка следующего вида

<p>Problem accessing /http://172.30.10.155:8080/xml. Reason:
<pre>    Not Found</pre></p><hr><a href="http://eclipse.org/jetty">Powered by Jetty:// 9.3.5.v20151012</a><hr/>

IP и порт 100% доступны. Curl по тому же адресу отправляет без проблем.

Куда еще можно порыть? Спасибо
69 MWWRuza
 
гуру
02.09.19
22:12
Тут не помогу... Восьмерошников трясите, я "застарелый клюшечник", а тут, отправка внутренними методами 8.Х...
По любому, раз curl отправляет, значит адрес правильный. Я из 7.7 другими методами отправляю, с помощью VBScript... Если хотите - могу процедуры отправки выложить, но, Вам это вряд-ли поможет...
70 Stepinrn
 
03.09.19
15:32
(69) Выложите, плиз, или пришлите на email. А вдруг. Переделать код 7.7 на 8.3 не так сложно
71 MWWRuza
 
гуру
03.09.19
16:01
Ну... Не знаю...

Из того места, откуда отправляю:

RESULT_XML_DOM = ВыгрузитьDOM(XML_DOM, УТМ_URL + "xml");
XML_DOM - Сформированый XML Dom.

Сама функция выгрузки, в глобальном модуле, потому, что много откуда вызывается:

Функция ВыгрузитьDOM(XML_DOM, URL) Экспорт
//    СохранитьВРезервноеХранилище(XML_DOM, URL, "in", "in");
    Скрипт=СоздатьОбъект("MSScriptControl.ScriptControl");
    Скрипт.language="javascript";
    Это=Скрипт.Eval("this");
    BOUNDARY = "BOUNDRYxXxXxEGAISxXxXxBOUNDARY";
    POST_STRING =               "--"+BOUNDARY+РазделительСтрок;
    POST_STRING = POST_STRING + "Content-Disposition: form-data; name=""xml_file""; filename=""select.xml""" + РазделительСтрок;
    POST_STRING = POST_STRING + "Content-Type: text/xml; charset=utf-8" + РазделительСтрок + РазделительСтрок;
    POST_STRING = POST_STRING + XML_DOM.xml + РазделительСтрок + РазделительСтрок;
    POST_STRING = POST_STRING + "--" + BOUNDARY + "--" + РазделительСтрок;
    WinHttp=СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    Скрипт.AddObject("WinHttp",WinHttp);
    WinHttp.Open("POST", URL, 0);
    WinHttp.SetRequestHeader("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);
    WinHttp.SetRequestHeader("Content-Length", СтрДлина(POST_STRING));
    WinHttp.Send(POST_STRING);
    Если WinHTTP.Status<>200 Тогда
        Предупреждение("Не удалось выгрузить документ. Возможно служба УТМ не запущена.");
        Возврат "";
    КонецЕсли;
    Стрим = СоздатьОбъект("ADODB.Stream");
    Стрим.Mode = 3;
    Стрим.Type = 1;
    Стрим.Open();
    Скрипт.AddObject("Stream",Стрим);
    Скрипт.Eval("Stream.Write(WinHttp.responseBody)");
    Стрим.Position = 0;
    Стрим.Type = 2;
    Стрим.Charset = "utf-8";
    Ответ = Стрим.ReadText();
    Стрим.Close();
//    СохранитьВРезервноеХранилище(XML_DOM, URL, "in", "in");
    XML_DOM=CreateObject("MSXML2.DOMDocument.6.0");
    XML_DOM.LoadXML(Ответ);
    СохранитьВРезервноеХранилище(XML_DOM, URL, "in", "answer");
    Возврат XML_DOM;
КонецФункции

Как-то так... Но, это все потому, что 7.7 не умеет этого делать, приходится средствами Windows...
Вы же это делаете встроенными средствами восьмерки... Посмотрите в типовой "Рознице", как это сделано, Вам это больше поможет. Тем более,  Вы пишете, что другие документы отправляются нормально. Чеки тоже должны, никакой принципиальной разницы, кроме адреса отправки я не вижу...
PS А.... Нет, вру :-( У чеков нет "заголовка" типа того(взято из первого попавшегося документа):
<ns:Documents xmlns:tc="http://fsrar.ru/WEGAIS/Ticket"; xmlns:oref="http://fsrar.ru/WEGAIS/ClientRef"; xmlns:ns="http://fsrar.ru/WEGAIS/WB_DOC_SINGLE_01"; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; Version="1.0">
где объявляются пространства имен в XML.
<?xml version="1.0" encoding="UTF-8"?>

Вот XML чека, рабочая, только звездочками забиты настоящие данные:

-<Cheque datetime="2908191952" number="1" shift="1" name="ООО "ШарашМонтаж"" address="Московская обл., *****************,, лит. А, этаж 1, помещ. 5, на плане № 2, 3, магазин." kassa="1234567891234" kpp="507501001" inn="**********">

<Bottle volume="0.1000" price="100.00" ean="4620006996396" barcode="133200084658031018001NQFJXW55EZ7MGNBE5NB4LHBIOYVGDG4IDFE4DWOMKBLUXMPXICGDOFDKALEDZXSLC4YCT6WZ7CRV7WBG3JG3LUURP4G4QEIAU2JO56WGQXQZZ4JKXEQYTVVWXLQWHHSKQ"/>

</Cheque>
72 Ёпрст
 
03.09.19
21:57
172.30.10.155 ...да уж, так делать низззя.
73 Ёпрст
 
03.09.19
21:58
хотя бы проксей прикрыть
Компьютеры — это как велосипед. Только для нашего сознания. Стив Джобс