Имя: Пароль:
1C
 
Работа с ЭДО через API...
0 MWWRuza
 
13.06.23
21:53
Добрый день!
А кто-либо имел дело с API ЭДО - ?
В смысле, не с типовыми конфигурациями, а с чем-то своим, самописным?

Конкретнее:
Делаю ЭДО для нетиповой конфы 7.7, только входящие, розничный магазин. То, что это 7.7, по существу вопроса не важно, поэтому и не стал писать в секцию 7.7, вопрос общий(только не нужно мне петь про "переходите на восьмерку, там это все есть в готовом виде").
ЭДО - ЭДО Лайт от Честного знака. Думаю, по существу - это тоже не особо важно, скорее всего, у всех примерно одинаково устроено.

На данном этапе, сделано:
Авторизуюсь, получаю токен.
Получаю список входящих документов на сервере.
Получаю нужный документ в XML по его ID из этого списка.
При желании, получаю его печатную форму в PDF.
Обрабатываю его - это было у меня сделано ранее, все сопоставления/создания новыз товаров/контрагентов и т.п., просто раньше грузил файлы скачанные из ЛК вручную, теперь работает и автоматически.

Осталась одна проблема - подписать УПД...
Не могу пока понять принцип, как это работает - уж больно убогое описание API у ЦРПТ...
Ясно одно - на основании полученного XML УПД, формируется файл "Информация покупателя", тоже XML, в теле которого содержится открепленная ЭЦП отправителя исходного полученного файла в формате Base64.

Где ее взять???
Никаких методов ее получить, я в описании не нахожу...

Далее, все понятно, этот файл подписывается своей ЭЦП, так-же открепленной, и отправляется на сервер запросом, в его теле, вместе со своей открепленной ЭЦП(с этим проблем нет, ее я спокойно формирую). После этого, файл УПД считается подписанным.

Понятно все, кроме одного - где брать открепленную ЭЦП отправителя-???
Ни одного документа, содержащего ее в удобоваримом виде, на сервере нет...
Есть только в полном архиве документооборота, но, она там не в Base64 - строкой, а в бинарнике "p7s"... Есть так-же какие-то квитанции с ней, она там в нужном формате, но..
Неужели, для того, что-бы подписать документ, нужно скачивать весь архив документооборота, извлекать из него нужную квитанцию, и вытаскивать из нее ЭЦП - ???
Сложно как-то, может я перемудрил чего-то... Подскажите пожалуйста, кто сталкивался  с чем-то подобным...
1 NorthWind
 
13.06.23
22:12
(0) вообще, если мне склероз не изменяет, там не только завершающий титул формируется покупателем. Есть еще извещение о получении УПД, которое тоже формируется покупателем. И еще 4 квитанции, которые формируются оператором. Может быть отдельный случай, когда вместо информации покупателя покупатель формирует запрос уточнения (если во входящем УПД ему что-то не нравится).
2 NorthWind
 
13.06.23
22:14
что касается подписей - мой оператор мне их ссыпает вместе с файлами документов и квитанций. То есть строго говоря, там файлы по одному не ходят, всегда есть сама XMLка и рядом файл подписи к ней. Поэтому необязательно расковыривать квитанции.
3 NorthWind
 
13.06.23
22:17
вы когда список входящих получаете и печатных форм - там случайно тем же макаром подписи получать нельзя? Должно быть можно имхо.
4 MWWRuza
 
13.06.23
22:22
(2),(3) Да, все так и есть. Рядом с самим файлом XML лежит файл открепленной ЭЦП(в архиве ДО). Только он не в требуемом Base64, а в бинарнике "p7s". И даже, если предположить, что можно взять его, и потом конвертировать в строку- то как? Есть метод получения XML, есть метод получения PDF, есть метод "скачать весь документооборот в архиве", но нет метода скачать файл ЭЦП... Или он не описан в описании API...
5 NorthWind
 
13.06.23
22:23
(4) так а чем скачивание всего ДО в архиве плохо?
6 NorthWind
 
13.06.23
22:28
вот с p7s, конечно, некоторая засада. У меня ЭП приходит в виде файлов .bin, которые в реальности никакие не bin, а содержат текст ЭП в MIME64...
7 NorthWind
 
13.06.23
22:29
если дербанить эти p7s нечем или сложно, то, возможно, действительно более разумным окажется вытянуть это добро из квитанций
8 MWWRuza
 
13.06.23
22:30
(5) Можно. Но, как-то криво... Ну, скачал, ну, разорхивировал во временную папку... А дальше? Конвертить ЭЦП из файла с совпадающим именем из бинарника в текст? Не уверен, что это можно средствами CADESCOM... Или, перебирать квитанции XML, и искать в них строку ЭЦП с привязкой к ID документа? Ну, можно конечно, вполне реально... Но, что-то не верится, что так и должно быть, как-то сложно... Может я перемудрил чего, и как-то проще все делается?
9 NorthWind
 
13.06.23
22:34
(8) нет, плюс-минус все так и есть. Только если нужен полноценный регламент, то следует учесть (1). То есть вам нужно как минимум два квитка от себя отправить, а не одну только информацию покупателя.
10 NorthWind
 
13.06.23
22:36
А если в упд ошибка, то будет еще третий вид квитка вместо информации покупателя - запрос уточнения.
11 NorthWind
 
13.06.23
23:05
Я бы, правда, не стал бы все это костылить на семерке, а написал бы обмен файлами и подписание на каком-нибудь современном языке вроде пайтона, и реализовал бы его как регулярно запускаемое задание - скажем, раз в 20 минут. Можно где-нибудь на постоянно включенной машине. В пайтоне без проблем присобачивается CADESCOM через win32com, есть работа с зипом, с xml и с любыми вариантами API, и не нужно мучиться с 1Сными ограничениями. А для отображения в 1С взял бы какую-нибудь промежуточную базенку или даже XML файл и выкладывал бы туда в процессе обмена ровно то, что требуется показывать пользователю. У пользюка окно 1С с доками открылось, это добро легонько за доли секунды зачиталось - пользователь все видит. Нужно что-то сделать - пользователь делает - формируются квитанции - складываются в папку - бот их при следующем запуске подпишет и отправит.
12 MWWRuza
 
13.06.23
23:55
(11) :-)
Мне такое не сделать, в разумное время :-)  Я застарелый клюшечник, и "ограничения семерки" меня не пугают. Глвное понять принцип, чего и как делать.
13 Aleksey
 
14.06.23
00:31
(12) ну почему берем 1с-ЭДО. она умеет работать с ЭДО от 1С, останется тупо грузить документы а дальше уже конфига сама всё сделает
14 MWWRuza
 
14.06.23
00:48
(13) Я хочу сам... Зачем мне непонятные прокладки, которые еще и покупать надо.
Тем более, все работает, пока кроме подписи. А с этим, думаю, как-нибудь справлюсь. На крайняк, в "переходный период", на сайте в ЛК подпишут, не проблема.
15 Aleksey
 
14.06.23
00:51
(14) конфига бесплатная в рамках подписки на ИТС
16 Aleksey
 
14.06.23
00:54
17 NorthWind
 
14.06.23
07:20
(12) ну дело хозяйское. Я раз в жизни увидел, как на семерке вызовы тогда еще не CADES, а CAPICOM оборачиваются в VBS, чтобы параметры нормально передать... ужаснулся... и сразу как-то решил - нафиг-нафиг. Есть нормальные языки, где есть нормальная поддержка всех типов данных, включая BLOBы, куча библиотек на все случаи жизни, вот на них и надо делать. Нехрен старушку мучить, пусть делает, что умеет.
18 MWWRuza
 
14.06.23
07:39
(15) Ага. И платформа то-же? :-)

(17) Не знаю... С этим то как раз проблем нет. Само подписание файлов через CADESCOM из 7.7 у меня работает уже давно(несколько лет) и успешно. Тут, в ЭДО ничего нового нет.

Проблема в понимании алгоритма самой работы.
Тут не принципиально, на каом языке писать - все одно, нужно понимать как это должно происходить, что откуда берется.
19 MWWRuza
 
14.06.23
08:05
+(0) Вот чего "нагородил":

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-505.jpg

И это работает, абсолютно нормально.
Осталось подписание сделать.
То, что на скриншоте документы в статусе "подписаны", это из WEB-интерфейса ЛК сделано.
20 MWWRuza
 
14.06.23
08:15
(9) (8) нет, плюс-минус все так и есть. Только если нужен полноценный регламент, то следует учесть (1). То есть вам нужно как минимум два квитка от себя отправить, а не одну только информацию покупателя.

Вот здесь, Вы не совсем правы. Да, нужно, но не вручную - оператор сам формирует эту квитанцию.
Цитата из описания API ЭДО Лайт:

"Вызов метода /api/v1/incoming-documents/{doc_id}/content автоматически создаёт неподписанную квитанцию «Извещение о получении УПД» (DP_IZVPOL)."

т.е., это извещение создается автоматом при первой загрузке XML-файла УПД.
21 NorthWind
 
14.06.23
08:16
(19) да формочки нарисовать дело не особо сложное, это мы все тоже умеем, и не первый год.
Вот регламент ЭДО - реально муторный. Квитанция на квитанции и квитанцией погоняет, да еще и подписывать все.
Перебирать тысячи файлов (для сколько-то приличного оборота).
Раскапывать эти подписи и присобачивать в квитанции, плюс подписания.
Хлопотно. И долго.
22 NorthWind
 
14.06.23
08:20
там, скорее всего, желательно будет завести дополнительный справочник или базу, в котором хранить эти цепочки имен файлов в привязке к GUID исходного документа. Тогда хоть проще файлы искать будет.
23 NorthWind
 
14.06.23
08:22
(20) Цитата из описания API ЭДО Лайт:

"Вызов метода /api/v1/incoming-documents/{doc_id}/content автоматически создаёт неподписанную квитанцию «Извещение о получении УПД» (DP_IZVPOL)."

ну что ж, спасибо им. Хотя ее все равно нужно будет как-то стянуть, подписать и отдать назад подпись...
24 vladmenleo
 
14.06.23
08:23
(20) может вот эти ссылки помогут
https://infostart.ru/1c/tools/1571233/
https://infostart.ru/1c/articles/1506206/
Мы работаем с эдо через СБИС, у них есть классная вещь называется сбис-коннект. установили ее на машину, где стоит крипто-про, и формируем так называемый файл-конверт с указанием ид входящего документа и   инн организации с сертификатом, а уж сам сбис-коннект это понимает и утверждает в личном кабинете сбис. Если-б у честного знака похожее было, то сильно упростило-бы задачу
25 MWWRuza
 
14.06.23
08:25
(21) Перебирать тысячи файлов (для сколько-то приличного оборота).

Ну, тут, оборот скромный до неприличия.
Выбор файлов в запросе ограничивается периодом.
А вот квитанций, я и не вижу. Только сами УПД. Квитанции только в архиве всего ДО.
Были бы квитанции доступны - небыло бы вопроса сабжа.

Метод "3.14. Получение списка квитанций для подписания" почему-то пустой список возвращает.

(22) GUID исходного документа храню в загруженной накладной.
А цепочка? Ну, как я понимаю, она нужна только на момент подписания. А дальше, если когда-то понадобится для какого-то "разбора полетов", можно скачивать весь архив ДО по этому ID исходного дока, там все есть.

(24) Посмотрю, спасибо.
26 NorthWind
 
14.06.23
08:30
(25) ну, значит, архив надо качать. У меня все еще проще - есть доступная по FTP папка, и там лежит абсолютно все - доки, квитанции и подписи. Благо имена у файлов никогда не совпадают из-за гуидов. Только качай и разбирай. У меня этим как раз бот занимается.
27 NorthWind
 
14.06.23
08:33
сейчас вот опять придется все это корячить из-за МЧД
28 MWWRuza
 
14.06.23
08:53
(26) ну, значит, архив надо качать.

Возможно...
А может, нужно еще метод: "Метод "3.14. Получение списка квитанций для подписания" поковырять, и добиться, что-бы квитанции прилетали.
Сейчас то их реально нет неподписанных - документы все подписаны и ДО завершен.
А вот когда новый прилетит - надо смотреть, должны же они как-то получаться. При первом получении XML, должна сформироваться неподписанная квитанция о просмотре, в ней то как раз и есть то, что нужно для дальнейшего формирования "информации покупателя". Проблема только в том, что теперь они все подписаны, а с "неприличным ДО" можно неделю ждать следующего документа :-)

(27) А что там в связи с этим с точки зрения ДО поменяется? Ну, может одно поле, номер этой самой МЧД добавится максимум... В одном документе.
29 NorthWind
 
14.06.23
09:04
(28) да я бы не сказал... У моего оператора нужно будет прикладывать к УПД отдельный XML-файл с описанием доверенности, а дальше они уже по этим данным ее извлекут, верифицируют и т.д.
Что касается полей - то это уже изменение формата УПД, а это дело серьезное. Нужно чтобы утвердили новую версиию и чтобы все участники ДО ее поддержали. Думаю, это не раньше чем через год. Пока будут обходиться примочками сбоку.
30 NorthWind
 
14.06.23
09:05
+ ну по апи честного знака я не помогу, у меня его (слава Богу!) пока нет, я работаю через обычных операторов EDI/ЭДО.
31 MWWRuza
 
14.06.23
09:15
Ясно...

Сейчас запрос списка квитанций возвращает: "{"items":[]}", т.е. список пустой.

В общем, нужно ждать следующую накладную, и тогда внимательнее смотреть, не должен он пустым быть, еслм УПД получена, просмотрена но не подписана - должна быть как минимум одна квитанция с нужной инфой.
32 MWWRuza
 
14.06.23
09:32
(30) я работаю через обычных операторов EDI/ЭДО.

С обычными - тоже засада... По крайней мере, с Контур-Диадок. Мало того, что у них доступ к API платный, еще и стоит как чугунный мост ~13000 в год, что само по себе много для мелких магазинчиков, так их менеджеры вообще оборзели - начали обзванивать клиентов и пытаться им впарить еще какой-то сервис за 10 К в год! :-( под угрозой того, что не будут передавать маркировку в ЧЗ, если не подключат! Типа, раньше работало, кргда на одной из сторон была подключена услуга передачи КМ в ЧЗ(обычно - это поставщики, им это не так накладно с их оборотами), а теперь, с 01.06.2023 обязательно должно быть на двух сторонах подкючено. Правда, пока это только угрозы - все и так работает, но... Х.з., вдруг и правда воплотят угрозы в жизнь :-(
А менеджеры у них похоже на проценте от продаж сидят - поэтому и пытаются втюхать какой-то не нужный сервис за 10 косарей... Я бы еще понял, если-бы требовали подключить услугу по передаче инфы в ЧЗ, стоимостью 3500, но так... У меня там олегон.ру тема есть, в маркировке, я даже запись разговора по телефону с таким менеджером выкладывал.
Поэтому, и появилось желание уйти от всех коммерческих операторов ЭДО на ЭДО Лайт - а раз уж ЭДО Лайт, то грех не привязать API, тем более что API самого ЦРПТ уже давно прикручено и работает, а они не сильно разнятся.
33 NorthWind
 
14.06.23
09:59
(32) любые рукоятки всегда платные, я за FTP тоже плачу не помню то ли 5, то ли 7 тыс в год.
34 NorthWind
 
14.06.23
09:59
причем так было всегда, и в лохматые годы тоже
35 NorthWind
 
14.06.23
09:59
а не хошь платить - вот сайт и колоти туда ручками
36 MWWRuza
 
14.06.23
10:05
(24) (20) может вот эти ссылки помогут

Спасибо. Там в одном из комментариев:

"23.  bobylev1980 19 05.05.22 07:34
(22) Вы загружаете титул покупателя? Не правильно сформировано тело запроса. Нет параметра filename=, и параметра Content-type: application/xml и уберите =@ после "content". Имя файла должно быть без расширения. Скачайте обработку, посмотрите, отправка титула идет так же как упд, только добавлено несколько дополнительных параметров.
"
очень интересно... Я тоже в черновике обработки "=@" как в описании API сделал. И путь к файлу - с расширением. Но, это следующий этап отладки, я до этого еще не добрался.

(33)(34)(35) Это понятно. Но, зачем впаривать какой-то левый сервис, за кучу рублей, с которым клиент все равно не работает? А доступ к API у ЧЗ бесплатный. Как впрочем и у Вашего СБИС тоже. Но, на СБИС у меня работают всего пара клиентов, остальные на Диадоке. И 100% клиентов подключены к Честному знаку. Отсюда напрашивается вывод - чей ЭДО интегрировать в их учетные системы.
37 NorthWind
 
14.06.23
10:09
(36) у меня не СБИС, вернее, он у меня тоже есть, но используется для другого. То о чем идет речь - это оператор Докробот (Э-КОМ).
38 MWWRuza
 
14.06.23
10:12
(37) Я такого и не видел. А у них доступ к API в рамках текущего тарифа, или как у Контура нужно отдельно покупать?
39 Aleksey
 
14.06.23
10:15
(38) бесплатный доступ
40 NorthWind
 
14.06.23
10:16
> Но, зачем впаривать какой-то левый сервис, за кучу рублей, с которым клиент все равно не работает?

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

(38) За обмен по FTP отдельный счет и отдельная оплата раз в год. API они стали предлагать относительно недавно, и как с ним обстоят дела - я не знаю, у меня с 2012 года реализован обмен через FTP и это достаточно удобно. У нас довольно большой документооборот и в сравнении с оплатой ежегодного трафика это маленькая сумма. А раньше был раз в 10 больше чем сейчас, там даже и говорить не о чем было, вообще копейки.
41 MWWRuza
 
14.06.23
10:32
(40) (38) За обмен по FTP отдельный счет и отдельная оплата раз в год. API они стали предлагать относительно недавно

Аааа... Понял, это их FTP, у них такой способ обмена. Я сначала просто не понял, думал, это просто сторонний ресурс и Вы на нем храните весь ДО параллельно, а с оператором ЭДО по API работаете... А тут, вон-оно что :-)
42 big
 
14.06.23
11:13
А как вы подписываете откреплённой подписью? С прикреплённой оно понятно, а вот с откреплённой что-то не получилось у меня... ((
Подписанные данные валидны в ЧЗ? Получается, что на получение данных тоже надо запрос откреплённой подписью подписывать?

з.ы. я уже запамятовал детали, но вопрос очень мне интересен, т.к. потенциально решать его надо.
43 АгентБезопасной Нацио
 
14.06.23
11:16
(32) контур охамел, конечно. Он с тарифа EDI списывает деньги за ЭДО (диадок) с клиентами, с которыми мы по EDI не работаем, но зато они (клиенты) работают по EDI через Контур.
Уходим от этих хамов - пока на СБИС. Отправку сделал (уж больно она угрёбищная в типовой сбисовской обработке), приемку и всё остальное пока делают в веб-морде
44 MWWRuza
 
14.06.23
11:16
СтрКода="function SignFile(FileName,Cert,OutFileName)
            |{
            |   InStream=new ActiveXObject(""ADODB.Stream"");
            |   InStream.Type=1; // binary data
            |   InStream.Mode=3; // read/write
            |   InStream.Open();
            |   InStream.LoadFromFile(FileName);
            |   InData=InStream.Read(-1);
            |
            |   Signer=new ActiveXObject(""CAdESCOM.CpSigner"");
            |   Signer.Certificate=Cert;
            |   Signer.Options=2; // CAPICOM_CERTIFICATE_INCLUDE_END_ENTITY_ONLY
            |   SignedData=new ActiveXObject(""CAdESCOM.CadesSignedData"");
            |
            |
            |   SignedData.Content=InData;
            |   OutSignedData=SignedData.SignCades(Signer,1,1,0); // параметр 3 - открепленная/прикрепленная(1 - открепленная), пар 4 - кодировка(0 - Base64)
            |   OutStream=new ActiveXObject(""ADODB.Stream"");
            |   OutStream.Type=2; // text data
            |   OutStream.CharSet=""US-ASCII"";
            |   OutStream.Mode=3; // read/write
            |   OutStream.Open();
            |   OutStream.WriteText(OutSignedData);
            |   OutStream.SaveToFile(OutFileName,2);
            |   OutStream.Close();
            |
            | return(0);
            |}
            |";
// параметр 3 - открепленная/прикрепленная(0 - прикрепленная, 1 - открепленная)
45 MWWRuza
 
14.06.23
11:20
Предыдущая месага к (42)

(43) Ну, у меня с точностью до наоборот - отправка мне пока не нужна, нужно только получение. Если потребуется сделать какой-то единичный возврат - то отправят через Веб-морду. Сам XML для этого у меня в программе формируется, уже давно... Только я не помню, что-бы этим кто-то хоть раз воспользовался.
46 MWWRuza
 
14.06.23
11:23
(42) Подписанные данные валидны в ЧЗ? Получается, что на получение данных тоже надо запрос откреплённой подписью подписывать?

Валидны. Иначе даже списка документов не увидеть.
47 АгентБезопасной Нацио
 
14.06.23
11:26
(40) Естественно, деньги нужны - они себе неплохой офис отстроили.
"Офис разработки на Широкой Речке попал в список девяти лучших IT-пространств по версии Office Snapshots. СКБ Контур обогнал больше 600 компаний и занял место рядом с офисом Dropbox в Сиднее и штаб-квартирой Airbnb в Сан-Франциско."
48 АгентБезопасной Нацио
 
14.06.23
11:27
(45) то, что с мая формат служебных документов менялся - в доке по АПИ уже учтено? Приказ ФНС России от 21.02.2023 № ЕД-7-26/133@
49 MWWRuza
 
14.06.23
11:32
50 АгентБезопасной Нацио
 
14.06.23
11:41
(49) ну смотри. я предупредил! в базе то-ли контура, то-ли сбиса есть и новая xsd
51 vladmenleo
 
14.06.23
12:04
(49) У сбиса обновлен формат
https://formats.sbis.ru/edo?section=service
но только почему-то указано Действующий формат (с 23.03.23)
52 big
 
14.06.23
12:08
(44) Спасибо большое!

А вы посылали подписанные этой функцией документы в ЧЗ? Они там валидны, принимаются? ИМХО нет.
53 АгентБезопасной Нацио
 
14.06.23
12:09
(51) ну да, он действует с 23.05.2023.
54 big
 
14.06.23
12:12
(52) Упс... не увидел (46)
55 vladmenleo
 
14.06.23
12:16
(53) Меня это и смутило март и май
56 АгентБезопасной Нацио
 
14.06.23
12:33
(55) я тупанул, не заметил март. ну, ошиблись циферкой.
57 MWWRuza
 
14.06.23
13:06
(52) Они там валидны, принимаются? ИМХО нет.

Может к этому и не относится, но я сам попал - два часа убил, пока понял в чем дело :-)
Беру док поставщика, беру его ЭЦП, проверяю в каком-то ОнЛайнСервисе(вроде от Контура) - все валидно.
Получаю док из списка, читаю его по ID через MSXML парсер, DOM сохраняю во временную папку в виде XML...
Проверяю подпись(в данном случае - это подпись отправителя, немного не Ваш случай, но, может причина похожая) - фиг вам, невалидна...
А оказыфвается, не знаю, чем поставщик свою XML собирал, но его рога навставляла туда пустых строк. И соответственно его исходный файл отличался от того, что я методом получить XML и сохранением его в файл получал - у меня никаких лишних пустых строк MS-парсер не вставлял :-)  Соответственно ЭЦП и неподходила :-)  Сделал по другому - копированием исходного файла "как есть" и стало проверяться нормально. Проверьте может у Вас что-то на подобии.
58 MWWRuza
 
14.06.23
13:14
+(57) рога = прога :-)
59 NorthWind
 
14.06.23
14:08
(57) так это ежу понятно, что разные парсеры могут сохранить с отличиями между собой за счет незначащих для XML символов. Никаких пересохранений подписанного файла быть не должно ни в каком виде, только посимвольное копирование, иначе очень велика вероятность, что проверку файл не пройдет. Единственный лишний перенос строки - и все, приехали.
60 АгентБезопасной Нацио
 
14.06.23
14:27
(59) ну для этого придумана канонизация xml, но в реальности действительно лучше копировать.
61 MWWRuza
 
15.06.23
08:27
(31) В общем, нужно ждать следующую накладную, и тогда внимательнее смотреть, не должен он пустым быть, еслм УПД получена, просмотрена но не подписана - должна быть как минимум одна квитанция с нужной инфой.

Дождался! Все так и есть. Захожу сейчас в свою обработку, вижу, что появился еще один УПД. Запрашиваю список квитанций - пусто. Загружаю УПД в обработку. Запрашиваю опять список квитанций - есть, одна квитанция появилась(оператор создал ее автоматом, как инфу о том, что док просмотрен).
Теперь, нужно ее получить и в ней будет скорее всего ЭЦП отправителя в нужном формате.
В общем, буду дальше разбираться.
62 big
 
15.06.23
09:15
(61) Несколько раз перечитал и так не смог понять - а для чего вам ЭЦП отправителя? Что с ней делать?

з.ы. в Диадоке тоже приходит Sign вместе с документом, наверное оно нужно для чего-то, но... для чего? ;) ))
63 АгентБезопасной Нацио
 
15.06.23
09:34
(62) по ней можно узнать действительность подписи вроде бы..
64 NorthWind
 
15.06.23
09:48
(62) если он сам генерирует квитки в соответствии с регламентом ЭДО, то, насколько я помню, ее надо вставлять в качестве поля в квиток.
65 NorthWind
 
15.06.23
09:49
у него получается, что первый квиток (подтверждение покупателя) генерирует сам Честный знак, ему надо только подписать.
Но вот второй окончательный квиток (титул покупателя) ему нужно делать самому.
66 NorthWind
 
15.06.23
09:52
ну и да, если уж делать все совсем по фэн-шую, то получатель обязан верифицировать все входящие доки по подписи и слать нахрен если чет не так :)
В реальности не знаю, делает ли это кто-нибудь, кто пишет самопальное ЭДО.
67 MWWRuza
 
15.06.23
11:22
В общем, рассказываю...
В (64) если он сам генерирует квитки в соответствии с регламентом ЭДО, то, насколько я помню, ее надо вставлять в качестве поля в квиток.
Все верно написано. Именно так.

Пока док не подписан, но просмотрен - возвращается список квитанций. В том числе, в нем есть нужная мне(она там на этом этапе единственная).
Дальше, я должен получить ее XML, что-бы из него вытащить ЭЦП отправителя для вставки в документ "титул покупателя".
А от тут, что-то не получается - ее ID я получаю, но по нему получить содержимое документ не выходит... На все запросы сервер возвращает 404... Похоже, не от туда я ее получать пытаюсь.
Пробовал:
/api/v1/outgoing-documents/{doc_id}/content Для исходящих документов
/api/v1/incoming-documents/{doc_id}/content Для входящих документов

/api/v1/outgoing-documents/unsigned-events получение квитанций, которые относятся к
исходящим документам
/api/v1/incoming-documents/unsigned-events получение квитанций, которые относятся к
входящим документам  

Только в конец УРЛ добавлял /{doc_id}/content

Все одно, 404...

Перелопатил еще раз описание API - нет там ничего на эту тему :-(

Дальше - больше :-(

Скачал весь ДО по этому документу в ZIP архиве, хотел посмотреть, что и как.
Все есть, все ОК! Но, там квитанции уже все подписанные.
После этого, список пустой формируется - ну правильно, список то не подписанных квитанций, а она теперь подписана...
Проверяю ее ЭЦП - и удивляюсь, подпись моя...
Получается, при скачке архива, он молча подписывает все неподписанные квитанции, и уже они не доступны. Поэтому, раньше я их и не мог получить.

В общем - доиградся... Не получится теперь подписать документ из 1С. Подпишу на сайте, и буду ждать следующего, для продолжения экспериментов.
68 АгентБезопасной Нацио
 
15.06.23
11:30
(67) т.е. при ПОЛУЧЕНИИ документа провайдер автоматически выполнил ПОДПИСАНИЕ?
69 NorthWind
 
15.06.23
11:34
(68) Большая часть квитанций по современному регламенту от июня 2021 года действительно подписывается подписью оператора. Но не все.
За покупателя оператор подписывать не может и не будет.
70 NorthWind
 
15.06.23
11:35
До 2021 года операторских квитанций было мало, в основном все были продавца и покупателя.
71 NorthWind
 
15.06.23
11:39
(67) > Получается, при скачке архива, он молча подписывает все неподписанные квитанции, и уже они не доступны. Поэтому, раньше я их и не мог получить.
Что-то здесь не то. Это физически невозможно. Код, который подписывает квитанцию вашей подписью, должен выполняться на вашем устройстве. Вызов удаленного апи выполняется на удаленной машине, откуда там может взяться ваш сертификат, да еще и с закрытой частью?
72 MWWRuza
 
15.06.23
11:40
(68) АГА!!! Поэтому в (67) и написал: Проверяю ее ЭЦП - и удивляюсь, подпись моя...
По идее, там должна быть подпись оператора, почему там моя??? Как? Она же у меня на компе, на РуТокене...
Как он мог подписать?
73 MWWRuza
 
15.06.23
11:40
(71) Вот! и я о том!
Но, так почему-то и есть. Как - загадка...
74 NorthWind
 
15.06.23
11:42
(73) что-то здесь не то. Это невозможно, если вы не передавали сертификат в ЧЗ. Скорее всего, подпись не ваша, а ЧЗ как оператора ЭДО.
75 MWWRuza
 
15.06.23
11:50
(74) Да я сам в шоке, но вот:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-507.jpg

(74) если вы не передавали сертификат в ЧЗ.

Это тоже не возможно - он у меня на Рутокен ЭЦП-2.0, и вставлен в данный момент в комп :-)

Вообще ничего не понимаю... Рушатся все каноны моего представления об ЭЦП и как это работает...
76 NorthWind
 
15.06.23
11:54
(75) возможно, я просто недостаточно знаю о ЧЗ и его софте.
Там случайно ничего на комп от них не ставится? Ну по типу УТМ от ЕГАИСа?
77 MWWRuza
 
15.06.23
11:58
(76) Нет. Только плагин, в зависимости от вида носителя - либо КриптоПро ЭЦП браузер плагин, либо, как в моем случае РуТокен плагин...
Хотя, и в моем случае, работает через КриптоПро 5.0 и его плагин...
78 MWWRuza
 
15.06.23
12:01
Через РуТокен плагин я могу войти в ЛК ЧЗ, и выполнять там любые действия с ЭЦП, но, в 1С я все равно через CADESCOM и КриптоПро 5 с ЭЦП работаю.
79 АгентБезопасной Нацио
 
15.06.23
12:09
(72) ну я потому и переспросил, что это должно быть невозможно...
а статус документа, на который квитанция - он сейчас в ЭДО какой?
80 MWWRuza
 
15.06.23
12:10
(74) Это невозможно, если вы не передавали сертификат в ЧЗ.

В ЧЗ естественно передан мой сертификат и ОТКРЫТЫЙ ключ при регистрации.
Но, этого не достаточно для подписания...
По сути, утрированно - у них "ларец с замочной скважиной", но ключ от него у меня(закрытая часть клюяа ЭЦП) на носителе с которого он не извлекаем...

Как облазуется моя ЭЦП квитанции - загадка...
81 АгентБезопасной Нацио
 
15.06.23
12:11
(80) а если после подписания запроса, но перед его отправкой тормознуть отладчиком, извлечь токен, и продолжить?
82 MWWRuza
 
15.06.23
12:16
(79) Статус - Просмотрен, требуется подпись, вот:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-508.jpg

(81) Интересная мысль... Но, это теперь, когда следующий документ прилетит...
83 MWWRuza
 
15.06.23
12:21
Может как-то через токен авторизации(который получается при авторизации и живет 12 часов) это делается? Но, это из области фантастики... И если это действительно так, то это дыра в безопастности :-(
84 АгентБезопасной Нацио
 
15.06.23
12:26
(83) через токен - вроде как и может, но учитывая (71)(75) и т.д., т.е. принципа подписывания - не должно. Надо еще раз перечитать про подпись..
85 MWWRuza
 
15.06.23
12:34
(84) не должно. Надо еще раз перечитать про подпись..

Не должно... Но, похоже так и есть. Других вариантов я не вижу.
А перечитать? Где? И так уже все до дыр зачитано. Может есть еще какая-то инфа на эту тему? Поделитесь...

Думаю сейчас, пока, до получения следующего дока, забить на получение содержимого квитанции - она есть в архиве, извлечь вручную из нее ЭЦП отправителя и сформировать титул покупателя, подсунув ее туда вручную из файла. А далее, по алгоритму подписи из описания API... Пока нет возможности отладить получение квитанции, дальше продолжить, "перепрыгнув" этот шаг.
86 АгентБезопасной Нацио
 
15.06.23
12:38
(85) ну давай я тебе чего-нибудь отправлю... неформализованный документ какой-нибудь. картинку с котиком.
87 NorthWind
 
15.06.23
12:40
(86) по ним регламент другой
88 MWWRuza
 
15.06.23
12:43
(86) Попробовать можно, но, учитывая (87) - думаю, бесполезно...
89 NorthWind
 
15.06.23
12:43
(75) обратите внимание, что подпись создана в 10:55 - за час назад до того, как вы отправили пост сюда. Это довольно длительное время. Может, все же подпись была создана каким-то естественным путем?
90 MWWRuza
 
15.06.23
12:48
(89) Интересно... Но, никаким "естественным путем" я ее не создавал...

(86) Скорее всего, такой документ не придет или не отправится, так, как в описании API нет неформализованных документов:

4.2. Справочник "Типы документов"
Название документа Цифров
ое
обознач
ение
Уведомление об уточнении (DP_UVUTOCH) 110
Квитанция подтверждения даты получения (DP_PDPOL) 111
Квитанция подтверждения даты отправки (DP_PDOTPR) 112
Квитанция извещение о получении файла продавцом (DP_IZVPOL) 113
126
Название документа Цифров
ое
обознач
ение
Квитанция предложения об аннулировании документа (DP_PRANNUL) 114
Квитанция извещение о получении файла покупателем (DP_IZVPOL) 115
УКД с функцией ДИС (корректировка накладной) 200
УКД с функцией ДИС информация покупателя (корректировка накладной) 201
УКД с функцией КСЧФ (корректировка счет-фактуры) 202
УКД с функцией КСЧФДИС (корректировка счет-фактуры+накладная) 204
УКД с функцией КСЧФДИС информация покупателя (корректировка счет-
фактуры+накладная)
205
УКД(и) с функцией ДИС (Накладная) 400
УПД с функцией ДОП (Накладная) 500
УПД с функцией ДОП информация покупателя (Накладная) 501
УПД с функцией СЧФ (Счёт-фактура) 502
УПД с функцией СЧФДОП (Счёт-фактура+Накладная) 504
УПД с функцией СЧФДОП информация покупателя (Счёт-фактура+Накладная) 505
УКД ДИС (Накладная) 600
УКД КСЧФ (Корректировочный счёт-фактура) 602
УКД КСФДИС (Корректировочный счёт-фактура+Документ об изменении стоимости) 604
УКД(и) ДИС (Накладная) 700
УКД(и) КСЧФ (Корректировочный счёт-фактура) 702
УКД(и) КСФДИС (Корректировочный счёт-фактура+Документ об изменении
стоимости)
704
УПД(и) с функцией ДОП (Накладная исправленная) 800
УПД(и) с функцией ДОП информация покупателя (Накладная исправленная) 801
УПД(и) с функцией СЧФ (Счёт-фактура) 802
УПД(и) с функцией СЧФДОП (Счёт-фактура исправленный + Накладная) 804
УПД(и) с функцией СЧФДОП информация покупателя (Счёт-фактура исправленный +
Накладная) 805

Вот, весь справочник типов документов.
91 MWWRuza
 
15.06.23
12:53
(89) Ну, вообще, разрыв во времени между постом (67) и (75) - почти 30 минут.
Получив "облом", описанный в (67), я мог еще 30 минут "репу чесать" и полученный архив изучать. Так, что, с натяжкой - но час сдвига реален, может так и есть.
92 АгентБезопасной Нацио
 
15.06.23
12:56
(90) когда я отправляю - я же не знаю, сможешь ты принять док, или нет.  поэтому либо роуминг должен отлуп дать, либо уже конечный пров. Тоже, кстати, интересный вопрос...
93 MWWRuza
 
15.06.23
13:02
Попробуйте. Попытка не пытка. ID В принципе, ничего страшного в этом нет.
Просто - ЭДО Лайт, видимо по тому и "Лайт", что не полноценный ДО... У нормальных операторов неформализованные документы ходят, а тут скорее всего будет облом...
94 MWWRuza
 
15.06.23
13:03
+(93) ИД там в принципе, на скриншотах выше есть, но, вот, на всякий случай:
Данные контрагента в ЭДО-Лайт "Честного Знака"    
ИНН Контрагента:    5075031407
ID Контрагента в ЭДО-Лайт:     2LT-11000120731
Наименование:    ООО "ВЕГА"
95 АгентБезопасной Нацио
 
15.06.23
13:46
(94) ушло
96 АгентБезопасной Нацио
 
15.06.23
13:59
"ошибка доставки" Тип файла 7047b702475924ba8f8044b5b5ca56ba.jpeg не поддерживается в ЭДО лайт
97 MWWRuza
 
15.06.23
14:16
(96) Ну, как я и предположил в (93), на то он и лайт :-(
98 MWWRuza
 
15.06.23
14:17
Не придется мне на котика полюбоваться :-)
99 MWWRuza
 
15.06.23
14:23
Блин... При отправке титула, в который вставлена ЭЦП отправителя вручную, получаю пресловутую "404"...
Без пояснений, что именно не найдено и где...

Может потому, что уже квитанции подписаны? Или путь к файлу не правильно передаю...
Но, не похоже - там в описании API целая таблица ошибок, и все они "400". В том числе и когда путь к файлу не правильный.
Тут-же 404 :-(
100 MWWRuza
 
15.06.23
14:40
(99) Все, понял, просто заработался...
Вместо "POST", отправлял "GET"... Поэтомц и 404 была.
Поправил, теперь - 400, "Плохой запрос", ну это уже похоже на правду, буду дальше разбираться.
101 NorthWind
 
15.06.23
16:38
Все же очень интересно, почему квиток оказался подписан... Вы если разгадаете загадку, напишите, пожалуйста.
102 MWWRuza
 
15.06.23
17:10
Хорошо.

Пока не получается отправить файл титула на сервер... Все время 400 плохой запрос...
Пробовал и с "@/", и без нее, и с расширением xml и без него, и с "file:///", все равно результат один, 400...
В описании API вот что про это написано:

Параметры тела запроса:
Параметр Тип Обяз. Описание Комментарий
content file + Ссылка на XML документ
Пример ссылки:
content=@/C:/Users/ON_NSCHFDOPPOK_2LT-50_2LT-354_20200218_cc716325-e5b9-43b8-813d-8e70e7912272.xml

Параметр Тип Обяз. Описание Комментарий
doc_id string + Идентификатор документа файла информации продавца
signature string + Откреплённая УКЭП XML документа в формате base64

Пример запроса:
curl --location --request POST '<URL стенда>/api/v1/incoming-documents/xml/upd/title'
\
--header 'Authorization: Bearer <Токен>' \
--form 'content=@"/C:/Users//Desktop/ON.xml"' \
--form 'doc_id="ec798fcb-efae-45e4-9e18-a166b281d7a0"' \
--form 'signature="<signature> "'

Что-то ни фига :-(
103 MWWRuza
 
15.06.23
17:15
Вроде, все так и делаю...
Остается одно - подписать этот док на сайте, скачать архив ДО, и сравнить хмл-ки титула, который я сам формирую, и который при подписании в ЛК автоматом формируется...
Может я в нем чего-то накосячил, х.з..
104 MWWRuza
 
15.06.23
18:54
(103) Может я в нем чего-то накосячил, х.з..

Нет. Совпадает все до символа, отличие только время подписания разное, и строка "ИдФайл", так, как в нем GUID...
Все остальное - бука в букву.

Так, что - причина в чем-то другом :-(
105 MWWRuza
 
15.06.23
19:28
Да, по ссылке из (24) разжевано... Бесполезно с именем ссылки играть, 1С не умеет этого делать. Нужно текстом XML файла титула передавать... Причем, в кодировке Windows-1251.
Завтра займусь, сегодня уже глаза квадратные :-(
106 MWWRuza
 
15.06.23
22:44
+(105) Не утерпел, сделал.
Подписываю не файл, а строку его содержимого. Эту-же строку передаю в тедо запроса, вместо ссылки, и ее сигнатуру.
Остается дождаться нового входящего документа, и проверить.
107 MWWRuza
 
16.06.23
09:52
(96) Сегодня заглянул в ЛК ЧЗ, и вижу, что в профиле, в списке роуминговых партнеров, новая компания добавилась - ООО "РИ**". Явно не наш поставщик, так, как с другой стороны России. Это Ваша компания добавилась в процессе эксперимента с "котиком" - ? :-)
108 АгентБезопасной Нацио
 
16.06.23
09:53
(107) я это. Ты ж сам принял приглашение
109 MWWRuza
 
16.06.23
09:58
(108) Ты ж сам принял приглашение

Я??? Я ничего такого не делал.
Похоже, опять ЭДО Лайт "автоматизирует процессы", больше чем другие, как с подписанием квитанций, приглашение принялось автоматом :-)
На том-же Диадоке оно бы висело в списке приглашений, пока вручную не примешь...
110 NorthWind
 
16.06.23
10:04
Ух ты, как хорошо ЧЗ работает. На ходу подметки рвет...
Но это-то понятно, что они чего-то там за контрагента решили и приняли приглашение.
Вот как сука они документ подписали клиентской подписью? Расскажите мне, старому и глупому...
111 NorthWind
 
16.06.23
10:07
в тему призывается Гость из Мариуполя - как большой спец по ГИСам и используемым в них извращениям...
112 АгентБезопасной Нацио
 
16.06.23
10:11
(109) принято было минут через 20 после отправки. иначе как бы я  отправлял-то?
113 Aleksey
 
16.06.23
10:11
(109) в сбисе тоже автоматом приглашение принимается.
114 MWWRuza
 
16.06.23
12:30
Полезно иногда не спеша всю тему перечитать...

(67) /api/v1/incoming-documents/unsigned-events получение квитанций, которые относятся к
входящим документам  

Только в конец УРЛ добавлял /{doc_id}/content

Все одно, 404...

Вот сейчас подумал:
Может нужно не в конец контент добавлять, а вместо контента событие-неподписанная квитанция?

Вот так: /api/v1/incoming-documents/{doc_id}/unsigned-events

В описании API ничего про это нет...
Пока новых документов нет, прилетит что-то, попробую.
115 MWWRuza
 
17.06.23
18:42
(114) Пока новых документов нет, прилетит что-то, попробую.

Прилетела :-)
Все не так. Нужно:
URL: /api/v1/incoming-documents/{doc_id}/events/{event_id}/content
где: "event_id" - это ИД квитанции в списке...
В общем с этим разобрался XML титула формирую, вместе с ЭЦП отправителя с этим все нормально.

А вот дальше похоже мне просто опыта работы с XmlHttp не хватает...
Что-бы я не делал:

Функция СформироватьТелоЗапросаИнфПок(content, doc_id, signature)
    ВремГраница = СтрЗаменить(СформироватьGUID(), "-", "");

    СтрЗапроса = "--" + ВремГраница + "
//    |Content-Disposition: form-data; name=""xml_file""
//    |Content-Disposition: form-data
//    |Content-Disposition: inline
//    |Accept-Charset: ""cp-1251""
    |Content-type: application/xml
    |
    |content: "     + content + "
    |doc_id: "         + doc_id + "
    |signature: "     + signature + "
    |--" + ВремГраница + "--"
    ;

    Тхт = СоздатьОбъект("Текст");
    Тхт.ДобавитьСтроку(СтрЗапроса);
    Тхт.Записать("C:\Temp\Тело.txt");
    Возврат СтрЗапроса;    
КонецФункции

Все равно запрос возвращает:
Ошибка {"errors":[{"error_message":"DOC-0014: \"В теле запроса отсутсвует файл\""}]}

Почему файл??? Я же ему строку подсовываю? Что-то с формированием тела запроса не так :-(
116 MWWRuza
 
17.06.23
18:59
Так:
|Content-type: text/html

Тоже не работает, ошибка та-же :-(
117 MWWRuza
 
18.06.23
11:15
Переделал "тело" запроса, теперь оно такое:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-509.jpg

В заголовок передаю:

КонтТип    = "multipart/form-data;" + "boundary=" + ВремГраница;
сзЗаголовки.ДобавитьЗначение(КонтТип, "Content-type");

ВремГраница - естественно соответствует той, что в теле.

Так, на отсутствие файла не ругается, но говорит, что "заголовок превышает допустимую длину":

Ошибка {"errors":[{"error_message":"Header length exceeded maximum header size of 4096"}]}

Почему? При чем тут "Header", если я в тело запроса длинную строку пихаю? Она естественно более 4096, но, там таких ограничений вроде нет...
118 MWWRuza
 
18.06.23
11:18
+(117) Принцип формирования тела взял отсюда: 1С: POST-запрос с типом multipart/form-data , сообщение (20) от Ёпрст...
119 MWWRuza
 
18.06.23
11:48
Вот так:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-510.jpg

На длину заголовка не ругается, но, опять файл хочет:

Ошибка {"errors":[{"error_message":"DOC-0014: \"В теле запроса отсутсвует файл\""}]}

Что я не так делаю?
120 MWWRuza
 
18.06.23
12:00
121 Djelf
 
18.06.23
13:04
(120) Ты бы хоть про multipart почитал... https://ru.wikipedia.org/wiki/Multipart/form-data
У тебя на скрине сколько boundary? 2! А сколько должно быть?

На вот, попробуй: https://cloud.mail.ru/public/1cUy/spm8Y6Jwj
Там ридми и тесты вложены, работает давно, используется не только у меня, но и у Виктуриана
У тебя как-то вот так должно быть:

    Карлик= Карлик_Создать();
    Карлик.УстановитьПараметр("URL",url);
    Карлик.УстановитьПараметр("CUSTOMREQUEST","POST"); // иначе отправляет через PUT
        //+остальные необходимые хидеры
    
    Запрос=Карлик.СоздатьЗапрос();
    //Запрос.Добавить(name,filename,type,data)
    //добавляет часть к составному запросу
    //если какое то поле пропущено, то оно не будет добавлено в заголовок составного сообщения
        //если будет ругаться на filename, то добавь его

    Запрос.Добавить("content",,,content);
    Запрос.Добавить("doc_id",,,doc_id);
    Запрос.Добавить("signature",,,signature);

    КодОшибки = Карлик.Выполнить();
    //Карлик_ПолучитьЗаголовки();
    Если ОбработатьКодОшибки(КодОшибки)=0 Тогда
        ТекстОтвета=Карлик.Приемник.Данные;
        Возврат ТекстОтвета;
    КонецЕсли;
122 MWWRuza
 
18.06.23
13:32
Спасибо!
Буду разбираться...
123 MWWRuza
 
18.06.23
13:53
Хм... Очень интересная ВК, спасибо, попробую.

Но, все равно не понятно, почему не работает напрямую:

(121) У тебя на скрине сколько boundary? 2! А сколько должно быть?

У меня их там 4 :

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-512.jpg
124 Djelf
 
18.06.23
14:00
(123) На этом скрине вроде нормально.
А from-datа не надо в base64 заворачивать?
Возмозжно нужно передавать и name и filename одновременно.
125 MWWRuza
 
18.06.23
14:22
(124) А from-datа не надо в base64 заворачивать?
А вот х.з...
В описании API только пример под curl:
curl --location --request POST '<URL стенда>/api/v1/incoming-documents/xml/upd/title'
\
--header 'Authorization: Bearer <Токен>' \
--form 'content=@"/C:/Users//Desktop/ON.xml"' \
--form 'doc_id="ec798fcb-efae-45e4-9e18-a166b281d7a0"' \
--form 'signature="<signature> "'

То, что можно передавать вместо пути к файлу его содержимое, я взял из ссылки в посте (24) https://infostart.ru/1c/tools/1571233/ ...
В оригинальном описании API, про это нет ни слова...
126 Djelf
 
18.06.23
14:34
(125) Попробуй кодом что выше дал, только засунь в тестовую обработку на отдельную вкладку - будет удобнее, т.к. там все нужные галочки для отладки есть.
Обычно, если указывается файл, то он появляется в тэге filename, т.е. он нужен.
В моей ВК, да и вообще всегда можно и без filename, но иногда он обязателен.
127 MWWRuza
 
18.06.23
14:35
Ок
128 MWWRuza
 
18.06.23
16:47
Хм...
Сделал:

Функция ОтправитьТитул()
    ПроверитьПолучитьТокен();
    
    Карлик= Карлик_Создать();
    Карлик.УстановитьПараметр("URL",URLдляТитула);
    Карлик.УстановитьПараметр("CUSTOMREQUEST","POST");// иначе отправляет через PUT
    
    Авторизация  = "Authorization: Bearer " + ТекТокен;
    
    Карлик.УстановитьПараметр("HTTPHEADER", Авторизация);

    Запрос=Карлик.СоздатьЗапрос();

    Запрос.Добавить("content",,,СокрЛП(ПутьКФайлуТиула));
    Запрос.Добавить("doc_id",,,СокрЛП(ИдУПД));
    Тхт = СоздатьОбъект("Текст");
    Тхт.Открыть(СокрЛП(ПутьКФайлуЭЦП));
    signature = Тхт.ПолучитьСтроку(1);
    Запрос.Добавить("signature",,,signature);

    КодОшибки = Карлик.Выполнить();
    //Карлик_ПолучитьЗаголовки();

    Если ОбработатьКодОшибки(КодОшибки)=0 Тогда
        ТекстОтвета=Карлик.Приемник.Данные;
        Возврат ТекстОтвета;
    КонецЕсли;    
КонецФункции

Естественно, переменные необходимые добавил, и функции их инициализации тоже.

Получаю:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-513.jpg

Видимо, ему еще чего-то нужно...
129 MWWRuza
 
18.06.23
16:53
Вот, с "отладочными" галочками:

CcURL Constructor    
CurlMime Constructor    
CurlMime Constructor done    
CcURL Constructor done    
CcURL Destructor    
CurlMime Destructor    
CurlMime Destructor done    
CcURL Destructor done    
CcURL::easy_perform Send Multipart data    
== Info, Closing connection -1
    
КодОшибки = Карлик.Выполнить();
{C:\USERS\MWW\DESKTOP\ЭДО-ЛАЙТ\КАРЛИК\TEST_CURL1C.ERT(1378)}: Ошибка получения данных 3 0
130 MWWRuza
 
18.06.23
16:56
Это я путь к файлу контента в запрос передаю. Может попробовать содержимое передавать? Или тут в чем-то другом проблема?
131 MWWRuza
 
18.06.23
17:43
(124) А from-datа не надо в base64 заворачивать?

В кмментарии к посту https://infostart.ru/1c/tools/1571233/ на ИнфоСтарте, написано:
11.  bobylev1980 19 03.02.22 06:10
(9) в п.3.9 пример идет для curl, при отправке эта утилита фактически помещает тело файла в запрос, поэтому при формировании тела запроса для 1с нужно указывать не ссылку на файл, а сам текст файла титула покупателя. Текст xml должен быть в кодировке windows-1251, а заголовок должен иметь вид Content-type: application/xml. Оформление тела запроса multipart/form-data аналогично, как и при отправке УПД покупателя.

Так, что, похоже в Base64 не нужно, надо cp-1251...
Но, вот это не понятно: "а заголовок должен иметь вид Content-type: application/xml" - ?
Какой заголовок имеется в виду? Заголовок самого запроса?
Пробовал, пишет ошибку, что отсутствует заголовок multipart/form-data...
132 MWWRuza
 
18.06.23
17:45
Или заголовок Content-type: application/xml нужно куда-тов тело запроса пихать, а в самом запросе multipart/form-data - ???
133 MWWRuza
 
18.06.23
18:11
Нет, строкой:

Функция СформироватьGUID()
    Инфо    = СоздатьОбъект("AddIn.V7SysInfo");
    GUID    = Инфо.СоздатьGUID();
    Возврат GUID;
КонецФункции

Функция СформироватьТелоЗапросаИнфПок(content, doc_id, signature)
    ВремГраница = СтрЗаменить(СформироватьGUID(), "-", "");
    СтрЗапроса     = "--" + ВремГраница
    + Симв(13) + Симв(10)
    + Симв(13) + Симв(10) + "Content-Disposition: form-data; filename=" + content
    + Симв(13) + Симв(10)
    + "Content-type: application/xml"
    + Симв(13) + Симв(10)
    + "--" + ВремГраница
    + Симв(13) + Симв(10)
    + "Content-type: text/html"    
    + Симв(13) + Симв(10) + "Content-Disposition: form-data; name=""doc_id"""
    + Симв(13) + Симв(10)
    + Симв(13) + Симв(10)
    + "doc_id: "    + doc_id
    + Симв(13) + Симв(10)
    + "--" + ВремГраница
    + Симв(13) + Симв(10)
    + "Content-type: text/html"    
    + Симв(13) + Симв(10) + "Content-Disposition: form-data; name=""signature"""
    + Симв(13) + Симв(10)
    + Симв(13) + Симв(10)
    + "signature: "    + signature
    + Симв(13) + Симв(10)
    + "--" + ВремГраница + "--";
    Возврат СтрЗапроса;    
КонецФункции

Функция ОтправитьТитул()
    ПроверитьПолучитьТокен();
    
    Карлик= Карлик_Создать();
    Карлик.УстановитьПараметр("URL",URLдляТитула);
    Карлик.УстановитьПараметр("CUSTOMREQUEST","POST");// иначе отправляет через PUT
    
    Авторизация  = "Authorization: Bearer " + ТекТокен;
    
    Карлик.УстановитьПараметр("HTTPHEADER", Авторизация);

    Запрос=Карлик.СоздатьЗапрос();
    
    Если ПерТитСтрокой = 0 Тогда
        Запрос.Добавить("content",,,СокрЛП(ПутьКФайлуТиула));
        Запрос.Добавить("doc_id",,,СокрЛП(ИдУПД));
        Тхт = СоздатьОбъект("Текст");
        Тхт.Открыть(СокрЛП(ПутьКФайлуЭЦП));
        signature = Тхт.ПолучитьСтроку(1);
        Запрос.Добавить("signature",,,signature);        
    Иначе    
        Тхт = СоздатьОбъект("Текст");
        Тхт.Открыть(СокрЛП(ПутьКФайлуТиула));
        СтрТитула = Тхт.ПолучитьСтроку(1);
        
        Тхт2 = СоздатьОбъект("Текст");
        Тхт2.Открыть(СокрЛП(ПутьКФайлуЭЦП));
        signature = Тхт2.ПолучитьСтроку(1);        
        Запрос.Добавить("content",,,СформироватьТелоЗапросаИнфПок(СтрТитула, СокрЛП(ИдУПД), signature));
    КонецЕсли;

    КодОшибки = Карлик.Выполнить();
    //Карлик_ПолучитьЗаголовки();

    Если ОбработатьКодОшибки(КодОшибки)=0 Тогда
        ТекстОтвета=Карлик.Приемник.Данные;
        Возврат ТекстОтвета;
    КонецЕсли;    
КонецФункции

Тоже такую ощибку дает:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-514.jpg
134 MWWRuza
 
18.06.23
18:42
(133) А, вот тут тоже нужно переделать для содержимого:
+ Симв(13) + Симв(10) + "Content-Disposition: form-data; filename=" + content
Ща попробую...
135 MWWRuza
 
18.06.23
20:10
(126)Обычно, если указывается файл, то он появляется в тэге filename, т.е. он нужен.
В моей ВК, да и вообще всегда можно и без filename, но иногда он обязателен.

Да, проблема была в "filename", поэтому он и не видел в теле файл.

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-515.jpg

Так, похоже видит содержимое файла.
Теперь, на "doc_id' почему-то ругается...
Вот:
Ошибка {"errors":[{"error_message":"неверный формат параметра запроса 'doc_id': UUID string too large"}]}
Нудно наверное для этой и последующей части тела запросв назначить тип текст, а то он похоже от первой части думает, что XML будет...
136 MWWRuza
 
18.06.23
20:19
+(136) Хотя, "UUID string too large" - дословно: "Слишком большая строка UUID", не понятно...
UUID как UUID, ни какой он не большой: 35a46927-c41d-4a13-a661-3937a973b448
Не понятно, чего ему не нравится.
137 MWWRuza
 
18.06.23
21:09
+(136) Понял чего...
В строках контента не нужно имя параметра с двоеточием, так:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-516.jpg

Теперь, что-то с кодировкой:
Ошибка {"errors":[{"error_message":"Element type \"Р\" must be followed by either attribute specifications, \">\" or \"/>\"."}]}

По ссылке на ИнфоСтарте что-то уже писали про именно такую ошибку. Буду дальше разбираться...
138 MWWRuza
 
18.06.23
21:32
Похоже, просто эти символы - \">\" or \"/>\"." в документе XML нужно экранировать...
Не проблема, надо только понять, на каком этапе - до подписания файла, или после...
Если экранировать "до", то какая-то "кривая" XML-ка получится, а если после, непосредственно перед помещением файла в тело запроса - то ЭЦП не будет соответствовать.
Пока не пойму, как правильно.
Кодировка у файла "windows-1251", тут, вроде все нормально.
139 Djelf
 
18.06.23
22:02
(135) Поздравляю. Прогресс пошел. Осталось еще чуток, но тут я не помошник, с ЕДО-Лайт не работал.
140 NorthWind
 
18.06.23
22:17
А мож его в base64 надо?
141 MWWRuza
 
18.06.23
22:41
(140) Хз... Везде написано, что сам файл XML обязательно в "windows-1251", а открепленная ЭЦП в Base64...
Можно конечно попробовать, но, как-то странно это.
Ну, теперь уже следующий УПД подожду... Этот, сейчас в ЛК подпишу, сколько можно его мучить :-)
142 NorthWind
 
18.06.23
22:47
(141) вообще очень странно что они нигде не приводят примеров запросов. Так можно очень долго тыкаться...
143 MWWRuza
 
18.06.23
22:58
Ну, да. Только под CuRL примеры.
144 Djelf
 
19.06.23
00:17
(133) У меня вся отсылка из строк идет, файлы не поддерживаваются. Можно допилить, но таких ообъемов сложно достичь чтобы через файлы данные гонять.
145 Djelf
 
19.06.23
00:23
+(144) URLдляТитула какой? Насколько помню 3 0 это ошибка в url.
146 MWWRuza
 
19.06.23
08:15
(144) Ах, вон оно что... Я то изначально подумал, что если на основе курла, то и это как в нем, поэтому в первом варианте пытался именно ссылку на файл передавать, как в примере от ЦРПТ для курла.
Потом, переделал, добавил по "галочке" формирование тела строкой(правда, не совсем правильно - на том момент не знал, что имя файла нужно передавать(хоть оно и не всегда нужно, но для ЭДО Лайт похоже нужно) и имена параметров с двоеточиями в строках не нужны)...

(145) А URL - ? Он на скриншоте виден, вот: "https://edo-gismt.crpt.ru/api/v1/incoming-documents/xml/upd/title"
Передаю так: Карлик.УстановитьПараметр("URL",URLдляТитула);
Хотя, не знаю как внутри ВК сделана, возможно там trim нет, и надо СокрЛП для URL добавить, так: Карлик.УстановитьПараметр("URL",СокрЛП(URLдляТитула)); , так, как длина поля на форме явно больше, чем строка URL.
Может отсюда и ошибка 3.0

(137)(138)(139)(140) По теме сабжа...
Подозреваю, что это 1с7.7 косячит при считывании файла и превращении его в строку. Или при формировании/записи файла, х.з.... Может заголовок файла windows-1251, а содержимое UTF-8, или что-то в этом роде. Поэтому и ошибка такая. Это не ошибка ЭДО Лайт, это ошибка передачи содержимого тела в запрос. :-(
147 big
 
19.06.23
08:22
(146) к пункту №3. В NP++ не смотрели какой кодировки данные? Вполне вероятно, что есть некий "перекос".
148 MWWRuza
 
19.06.23
08:30
Покой нам только снится :-)
Думал, отдохну сегодня, но, нет, очередной УПД прилетел:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-517.jpg

(147) Смотрел конечно, вот:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-518.jpg

Но, это свойства файла, а что в строку 1С прочитала, х.з... Может "извратила" кодировку, или в файле заголовок не соответствует содержимому, в части кодировки.
149 Djelf
 
19.06.23
08:43
+(145) Все правильно вспомнил: https://journalhelp.ru/technologies/spisok-kodov-oschibok-kotorie-mozhet-vernyt-curl.html
Эти коды еще в тестовую обработку не добавлял.
(146) Да, точно, СокрЛП не встроил, я как-то по стойкой привычке все url на всякий склучай в 1С СокрЛП`шу. Запишу в ToDo.
150 Djelf
 
19.06.23
08:55
(137) > Ошибка {"errors":[{"error_message":"Element type \"Р\" must be followed by either attribute specifications, \">\" or \"/>\"."}]}
Где-то тэг не закрывается, проверь каким-то валидатором xml.
151 MWWRuza
 
19.06.23
08:56
(149) я как-то по стойкой привычке все url на всякий склучай в 1С СокрЛП`шу

Да я обычно тоже. А тут, как-то бес попутал, заработался наверное :-)
Для проверки, сейчас добавлю СокрЛП, и попробую на старых данных. Ошибка будет по любому - от ошибки API, что файл уже подписан, до любой другой, типа длина строки ИД файла(формирование тела в тестовой лбработке пока не правил), но, как минимум, увидим, что ошибка не 3.0 стала.
152 MWWRuza
 
19.06.23
09:05
(150) По тексту ошибки - да, именно так.
Но, такого быть не может - я же не сам в XML тэги пишу руками, я через MSXMLDOM формирую XML-ки...
Там он сам отслеживает, что-бы структура была верная - сколько тегов открывается, столько и закрывается автоматом.

Вот файл вчерашний: https://cloud.mail.ru/public/7h1D/fBJ63Wai1

А вот парсер сайта ЦРПТ, возможно наткнувшись на символ в непойми-какой кодировке, чего-то не понимает и возвращает такую ошибку...
153 MWWRuza
 
19.06.23
09:12
(151) Для проверки, сейчас добавлю СокрЛП, и попробую на старых данных. Ошибка будет по любому - от ошибки API, что файл уже подписан, до любой другой, типа длина строки ИД файла(формирование тела в тестовой лбработке пока не правил), но, как минимум, увидим, что ошибка не 3.0 стала.

Ну, да, все именно так, как я и думал, добавил СокрЛП в адрес, и карлик заработал:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-519.jpg
154 MWWRuza
 
19.06.23
09:21
(150) Где-то тэг не закрывается, проверь каким-то валидатором xml.

Да, валидатор не может проверить файл... Ято-то с кодировкой не то:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-520.jpg

Хотя, если не открывать файл XML самим валидатором, а вставить копи/пастом содержимое, скопировав его из открытого в Нотепад++ файла, то все валидно, проверка проходит, и "кракозябров"  в окошке нет...
155 MWWRuza
 
19.06.23
09:30
+(154) Кстати, НП++ с плагином для XML при открытии этого файла тоже ошибку дает:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-521.jpg

Но, потом открывает нормально и при просмотре кодировки, все как на скриншоте в (148)...
Но, это не нормально по любому.
Надо смотреть свойства парсера MSXMLDOM, которым создаю файл... может там надо как-то явно кодировку указывать при создании, а не только строку в начале файла.
156 Djelf
 
19.06.23
09:48
157 Djelf
 
19.06.23
09:49
+(156) Или так и надо?
158 Djelf
 
19.06.23
09:52
Вот, возьми https://cloud.mail.ru/public/CWXq/TiVJL7fa9 лучше ничего для просмотра xml не находил.
159 MWWRuza
 
19.06.23
09:53
(157) Мне тоже это не понравилось, но, я не сам это придумал - сначала подписал первый раз док на сайте, в ЛК, скачал весь архив ДО, и там, в аналогичной кваитанции так и было... Плюнул, и у себя сделал так-же.
160 MWWRuza
 
19.06.23
09:54
(159) Согласен полностью! Я только им и пользуюсь, уже давно.
Он эти XML открывает без ошибок, ему похоже плевать на кодировку...
161 Djelf
 
19.06.23
10:00
(160) Там 1251, ошибок в кодировке нет.
162 MWWRuza
 
19.06.23
10:10
Есть.
Там именно заголовок 1251, а внутри UTF-8 похоже.

Вот, была у меня давно функция:

// Процедура Transform(doc,path) Функция записывает XML_DOM в файл, с правильным форматированием("лесенкой")
// параметры: doc - XML_DOM, path - путь, куда писать.
Процедура Transform(doc,path) Экспорт
    
    text = " <xsl:output method=""xml"" encoding=""UTF-8"" indent=""no""/>";
    
    text = "<?xml version=""1.0""?>    
    |<!-- http://x443.wordpress.com/2011/page/34/ -->
    |<xsl:stylesheet xmlns:xsl=""http://www.w3.org/1999/XSL/Transform"" version=""1.0"">
    |  <xsl:output method=""xml"" encoding=""UTF-8""/>
    |  <xsl:template match=""@*"">
    |    <xsl:copy/>
    |  </xsl:template>
    |  <xsl:template match=""text()"">
    |    <xsl:value-of select=""normalize-space(.)"" />
    |  </xsl:template>
    |  <xsl:template match=""*"">
    |    <xsl:param name=""indent"" select=""''""/>
    |    <xsl:text>&#xa;</xsl:text>
    |    <xsl:value-of select=""$indent"" />
    |    <xsl:copy>
    |      <xsl:apply-templates select=""@*|*|text()"">
    |        <xsl:with-param name=""indent"" select=""concat($indent, '  ')""/>
    |      </xsl:apply-templates>
    |    </xsl:copy>
    |    <xsl:if test=""count(../*)>0 and ../*[last()]=."">
    |      <xsl:text>&#xa;</xsl:text>
    |      <xsl:value-of select=""substring($indent,3)"" />
    |    </xsl:if>
    |  </xsl:template>
    |</xsl:stylesheet>";
    
    dest = СоздатьОбъект("MSXML2.DOMDocument.6.0");
    
    xsl = СоздатьОбъект("MSXML2.DOMDocument.6.0");
    xsl.LoadXML(text);

    doc.transformNodeToObject(xsl,dest);
    dest.Save(path);
КонецПроцедуры

Если файл сохраняю ею, а не методом Save(), то заголовок у файла становится UTF-8, как и содержимое, и НП++ открывает его без ошибки, сразу.
А при Save(), похоже заголовок 1251 а содержимое UTF-8, поэтому и ошибка и в НП++ и в валидаторе...

Надо тоеперь в этой функции кодировку поменять на 1251, и попробовать, что получится.
163 MWWRuza
 
19.06.23
10:37
+(162) Поменял в процедуре трансформ:

//    |  <xsl:output method=""xml"" encoding=""UTF-8""/>
    |  <xsl:output method=""xml"" encoding=""windows-1251""/>

Файл формируется, НП++ открывает, ошибку все равно пишет, правда теперь не на строку 1, а на строку 5 почему-то :-)
Значит что-то в файле поменялось. Фоксе как и ранее открывает нормально.
Сейчас онлайн валидатором проверю...
164 Djelf
 
19.06.23
10:39
Лучше на https://www.diadoc.ru/docs/forms/validation-xml проверяй
165 MWWRuza
 
19.06.23
10:47
(154) Да тут говорит, что все хорошо:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-522.jpg

Но, у ЦРПТ, видимо свое мнение на этот счет, как и у валидатора, которым я проверял. Он ту-же ошибку выдает, даже после трансформа.
166 MWWRuza
 
19.06.23
11:16
Кстати, если из файла вручную удалить первую строку, заголовок файла, то:
Фоксе открывает так:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-523.jpg

Типа, кодировка UTF-8...

А Нотепад++, все равно windows-1251 показывает:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/i-524.jpg

Вот что-то тут не так... А что, пока не понимаю :-(
167 MWWRuza
 
19.06.23
11:19
(166) Фоксе открывает так:
Типа, кодировка UTF-8...

Видимо он, все-таки более узко-специализировано на XML заточен, и кодировку из строки заголовка XML берет, и при ее отсутствии, считает, что UTF-8, типа по умолчанию...
168 MWWRuza
 
19.06.23
11:32
(166) Кстати, если из файла вручную удалить первую строку, заголовок файла, то:

Все это, в (166) и (167) справедливо, если открываю файл НП++, удаляю строку и сохраняю файл из него.
Если я то-же самое делаю из фоксе, то он открывает потом сохраненный файл без кракозябр и пишет, что кодировка UTF-8...
169 Djelf
 
19.06.23
12:34
(168) Он не так пишет, он пишет: 1251 len 333 to utf-8 len 666
У меня подозрение что формируешь то ты файл в 1251, а отсылаешь как utf-8
Попробуй с этим: Карлик.УстановитьПараметр("HTTPHEADER","Content-Type: text/xml; charset=windows-1251");
170 MWWRuza
 
19.06.23
13:31
(169) Попробую...

Пока не могу, вдруг отправится? :-)
А база то "боевая", реальной накладной нет еще, поставщик еще не привез...

Пока, решил убрать "тонкое место", которое мне не нравилось - открытие файла для преобразования его в строку для отправки через 1С...
Было:

ТхтИнфПок        = СоздатьОбъект("Текст");
ТхтИнфПок.КодоваяСтраница(0);
ТхтИнфПок.Открыть(ИмяФайлаИнфПок);
СтрТитула        = ТхтИнфПок.ПолучитьСтроку(1) + ТхтИнфПок.ПолучитьСтроку(2);

Сделал:

ИмФайлИнфПокТхт    = СтрЗаменить(ИмяФайлаИнфПок, ".xml", ".txt");
ФС.ПереименоватьФайл(ИмяФайлаИнфПок, ИмФайлИнфПокТхт, 1);
СтрТитула        = СокрЛП(УбратьПереносыСтрок(ИмФайлИнфПокТхт, 1));

Где функция:

//******************************************************************************
// УбратьПереносыСтрок(ПутьКСертификату)
//
// Параметры:
//  ПутьКСертификату - путь к файлу или текст сертификата КЭП
//
// Возвращаемое значение:
//  public_cert,signature
//
// Описание:
//  убирает переносы строк и возвращает содержимое в виде строки
//
Функция УбратьПереносыСтрок(ПутьКСертификату, Кодировка = 0)    Экспорт
    
    ВозврPublic_cert = "";
    Если (Прав(ПутьКСертификату,4) = ".cer") ИЛИ (Прав(ПутьКСертификату,4) = ".txt") Тогда
        Если ФС.СуществуетФайл(ПутьКСертификату) = 0 Тогда
            Сообщить("Файл сертификата "+СокрЛП(ПутьКСертификату)+" не найден");
            Возврат "";
        КонецЕсли;
        АдоДБСтрим = СоздатьОбъект("ADODB.Stream");
        АдоДБСтрим.Mode = 3;
        АдоДБСтрим.Type = 2;//текст
        Если Кодировка = 0 Тогда
            АдоДБСтрим.charset="utf-8";
        Иначе
            АдоДБСтрим.charset="windows-1251";    
        КонецЕсли;
        АдоДБСтрим.Open();
        АдоДБСтрим.LoadFromFile(ПутьКСертификату);
        АдоДБСтрим.Position = 0;
        ТекстСертификата = АдоДБСтрим.ReadText(-1);
        АдоДБСтрим.Close();
        Для СчСтрок = 1 По СтрКоличествоСтрок(ТекстСертификата) Цикл
            ТекСтрока = СтрПолучитьСтроку(ТекстСертификата,СчСтрок);
            Если Лев(ТекСтрока,4) = "----" Тогда
                Продолжить;
            КонецЕсли;
            ТекСтрока = СтрЗаменить(ТекСтрока,РазделительСтрок,"");
            ВозврPublic_cert = ВозврPublic_cert + ТекСтрока;
        КонецЦикла;
    Иначе
        Для СчСтрок = 1 По СтрКоличествоСтрок(ПутьКСертификату) Цикл
            ТекСтрока = СтрПолучитьСтроку(ПутьКСертификату,СчСтрок);
            Если Лев(ТекСтрока,4) = "----" Тогда
                Продолжить;
            КонецЕсли;
            ТекСтрока = СтрЗаменить(ТекСтрока,РазделительСтрок,"");
            ВозврPublic_cert = ВозврPublic_cert + ТекСтрока;
        КонецЦикла;
    КонецЕсли;

    Возврат ВозврPublic_cert;
    
КонецФункции // УбратьПереносыСтрок()

Читает файл по указанному пути скриптом, через поток, и возвращает строку, за одно убирая из нее переводы строк, одной строкой...
Функция была сделана раньше, что-бы убирать переносы строк из строки ЭЦП в Base64, после подписания. Только добавил в нем задание кодировки.
171 Serginio1
 
19.06.23
13:44
Наверняка есть API на C#
Для примера
https://infostart.ru/1c/articles/466052/
172 MWWRuza
 
19.06.23
13:52
(171) Я далек от C#
Что мне это даст?

(170) Это ничего не дало...
Ошибка та-же: Ошибка {"errors":[{"error_message":"Element type \"Р\" must be followed by either attribute specifications, \">\" or \"/>\"."}]}

Сейчас в карлике внесу необходимые изменения, и попробую...
173 Djelf
 
19.06.23
14:10
(172) Ну ты хоть в Сообщить() засунь текст который отправляешь, чтобы убедиться что он в 1251...
174 MWWRuza
 
19.06.23
14:26
(169) Вот, ошибка та-же, синтаксис не нравится...
Со всеми галочками в табло "многоБукФФ", поэтому в архиве текстовик: https://cloud.mail.ru/public/j7Fw/Nf3Xy9LVz

(173) Зачем Сообщить(), когда я почти везде отладочные сохранения в текстовые файлы добавил... При необходимости раскомментирую нужное, и изучаю спокойно файл.
175 Djelf
 
19.06.23
14:36
(174) Так тут такая штука может быть: я с Диадок при отладке сначала делаю СтрокаUTF8=Карлик.ToUTF8(Строка1251), а потом сохраняю СтрокаUTF8 в файл, так мне удобнее, чтобы через VSCode смотреть.
Тут могут быть разные варианты, а с Сообщить перед самой отправкой вариантов как бы и нет.
176 Serginio1
 
19.06.23
14:44
(172) Если есть апи к твоему EDI то просто работаешь через методы API. Моя компонента позволяет вызвать любой метод любого класса нетовской библиотеки.
И не трахаться с кучей мелочей для рукопашного кода
177 MWWRuza
 
19.06.23
14:46
(175) А что мы в Сообщить увидим? Огрызок от строки? Табло 1С все равно только кусок покажет :-(

(176) Спасибо, посмотрю...
178 Serginio1
 
19.06.23
14:49
179 Djelf
 
19.06.23
14:51
(174) Посмотрел.
Авторизация передается 2 раза почему-то. "Authorization: Bearer ...", а она в хидере, вот у тебя и переполнение хидера.
Дальше "== Info, Mark bundle as not supporting multiuse"
Хм... с егаис у меня так ("uploaded and fine" у тебя не вижу)

0270: </ns:Document></ns:Documents>    
028f: --------------------------1147c9dbc515dcdb--    
== Info, We are completely uploaded and fine
== Info, Mark bundle as not supporting multiuse
<= Recv header, 15 bytes (0xf)

Далее "4434: Content-Length: 53398" вроде нормально, но возможно из-за хидера далее
Ошибка: 0008: <head><title>400 Bad Request</title></head>

(177) Это решает метод 1с++

Перехватчик=СоздатьОбъект("Перехватчик");
Перехватчик.ВключитьРазбиениеДлинныхСтрокДляМетодаСообщить();
180 Djelf
 
19.06.23
15:02
(178) До сертификата еще добраться надо и это будет другая ошибка, у (0) проблема еще до этого...
181 MWWRuza
 
19.06.23
15:16
(179)
Перехватчик=СоздатьОбъект("Перехватчик");
Перехватчик.ВключитьРазбиениеДлинныхСтрокДляМетодаСообщить();

Или у меня 1с++ старая, или что-то не так делаю:

Перехватчик.ВключитьРазбиениеДлинныхСтрокДляМетодаСообщить();
{Обработка.СпДоковЭДОЛайт.Форма.Модуль(622)}: CDllMethodWrapper::Swap failed: m_pFunc == NULL

Саму компоненту гружу при начале работы системы, свойства ее вот:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-525.jpg
182 Djelf
 
19.06.23
15:18
(181) Еще один фикс перед этим "УправлениеНастройками.Включить("ПерехватитьСобытияГК");"
183 MWWRuza
 
19.06.23
15:39
УправлениеНастройками - это что?
К чему относится?
184 MWWRuza
 
19.06.23
15:42
В этой ВК, что у меня, нет такого...
185 Djelf
 
19.06.23
15:59
На твоей версии должно быть: "УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");" // после загрузки 1с++ естестевнно
186 MWWRuza
 
19.06.23
16:24
Ух ты! Круто! :-)

Много букфф, поэтому в архиве: https://cloud.mail.ru/public/QefJ/dXpmZEnFg

Только не очень понимаю, как в строках в табло понять, какая кодировка...
187 MWWRuza
 
19.06.23
16:42
Копи/пастить после этого содержимое табо в валидатор - безсмысленно, так, как там переводы строк расставлены как попало(ка 1с надо)...

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-526.jpg
188 MWWRuza
 
19.06.23
23:07
Попробовал через "WinHttp.WinHttpRequest.5.1" отправить запрос, хоть он мне и меньше, чем "msxml2.serverxmlhttp.6.0" нравится, но почему не попробовать, что-бы исключить косяки работы с самим "xmlhttp" - ?
Результат один в один... Что-то ему в закрывающих тегах XML не нравится, ошибка та-же :-(
189 MWWRuza
 
20.06.23
09:01
Тупик какой-то :-(
Вчерашний УПД подписал на сайте, скачал архив ДО. Там есть такая-же хмл-ка титула.
Один в один с моей, кроме гуида и времени...
И тоже валидацию не проходит, но документ обработан!

Не знаю что и делать. Сегодня очередной УПД прилетел, так, что, есть с чем "играться", но, даде мыслей нет, куда копать...

Разве что, написать батник используя пример из документации под курл, для отправки файла... Чисто проверить, сама XML-ка пролезет или нет.
190 Djelf
 
20.06.23
09:14
(186) В этом сообщении у тебя filename без ковычки справа, но ругается не на это.
Вот что интересно, берем твой файл, сохраняем как utf-8 и смотрим
<?xml version="1.0" encoding="windows-1251"?>
<Файл
Похоже вот он твой тэг "<Р" на который идет ругань, т.е. ты видимо все таки в utf-8 кидаешь.
191 SiMBa_R38
 
20.06.23
09:41
Посмотрел как у меня сделан обмен со сбисом и
[code]
Функция ПолучитьXMLПоСтруктуре(Док)
    
    XMLАнализатор = СоздатьОбъект("AddIn.XMLParser");
    
    ХМЛФайлДанных    =    XMLАнализатор.СоздатьДокумент();
    ХМЛФайлДанных.Кодировка = "windows-1251";
    ЗаписатьСтруктуруВXML(ХМЛФайлДанных, Док);
    СтрXML = ХМЛФайлДанных.ПредставлениеXML;
    
    Файл_Формат = "";

    ХМЛФайлДанных.Записать(КаталогВременныхФайлов() + Файл_Формат + "_origin.xml");
    
    СтрXML = "<?xml version=""1.0"" encoding=""windows-1251"" standalone=""no""?>" + СтрXML;
    
    Возврат СтрXML;
КонецФункции

Инфо = СоздатьОбъект("AddIn.V7SysInfo");
КонвертФайл = СоздатьОбъект("Текст");
КонвертФайл.ВставитьСтроку(1, ШаблонXML);
ИдФайла = НРег(Инфо.СоздатьGUID());
ИмяФайла = "KONVERT" + "__" + Формат(ТекущаяДата(),"ГГГГММДД") + "_" + Строка(ИдФайла) + ".native.xml";
ПолноеИмяФайла = КаталогОтправкиИмя + ИмяФайла;
КонвертФайл.КодоваяСтраница(0);
КонвертФайл.Записать(ПолноеИмяФайла);

[/code]
Док Это Структура от 1С++
Остальное вроде штатное.
Насколько помню тоже был трабл с кодировкой.

Ну и вообще в целом сериализатор десериализатор на структурах понятней, могу поделиться. Но это после того как вы основную проблему победите.
По поводу подтверждений у обычных операторов, за это отвечает сама прослойка, статусные сообщения не нужно генерировать, в вашем случае скорее всего придется, хотя я видел что от кого-то приходили титулы без подтверждения получений.
192 MWWRuza
 
20.06.23
09:55
(191) По поводу подтверждений у обычных операторов, за это отвечает сама прослойка, статусные сообщения не нужно генерировать, в вашем случае скорее всего придется, хотя я видел что от кого-то приходили титулы без подтверждения получений

Нет, тут тоже само генерится. При первой загрузке ХМЛ входящего документа, создается извещение о просмотре, автоматом. Или я не понял, о чем реч.

(190) Да, очень похоже на это...
193 MWWRuza
 
20.06.23
10:03
(190) Похоже вот он твой тэг "<Р" на который идет ругань, т.е. ты видимо все таки в utf-8 кидаешь.

Скорее всего, так и есть...
Вот только не пойму - всетаки XML-ка в не верной кодировке в строку считывается, или сам запрос при отправке кодировку тела меняет на utf-8 - ?
194 MWWRuza
 
20.06.23
10:07
Я уж тут:

сзЗаголовки     = СоздатьОбъект("СписокЗначений");
сзЗаголовки.ДобавитьЗначение("windows-1251", "Accept-Charset");

КонтТип    = "multipart/form-data;" + "boundary=" + ВремГраница + ";charset=windows-1251";
        
сзЗаголовки.ДобавитьЗначение(КонтТип, "Content-type");

Еще в одном месте кодировку добавил, в заголовке типа контекста...
Все равно то-же самое.
195 MWWRuza
 
20.06.23
10:09
По тому, что, как я понимаю(возможно ошибаюсь), вот этот заголовок:

сзЗаголовки.ДобавитьЗначение("windows-1251", "Accept-Charset");

На кодировку ответа влияет.

А на кодировку отправляемого контента именно "Content-type"...

Правильно?
196 MWWRuza
 
20.06.23
10:15
(191) Ну, наверное просить показать как устроено формирование запроса у Вас - безполезно, так, как в СБИСе этим своя ВК занимается, это внутри нее происходит, и вряд-ли там обычный запрос...
197 АгентБезопасной Нацио
 
20.06.23
10:26
(196) нет, в сбисе можно без всякой ВК, чисто по АПИ работать. ИМХО, удобнее.
198 Djelf
 
20.06.23
10:28
(195) Этого недостаточно, victuan1 сказал что им так и не удалось победить winhttp и работа с эдо лайт реализована через мой curl1c.
Но вроде вот так должно сработать.

WinHttp=СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
WinHttp.Option(2,"Windows-1251");
199 MWWRuza
 
20.06.23
10:44
(198) в (188) Писал, что пробовал через WinHTTP, правда кодировку не через "Option" задавал, а через заголовки, как в XmlHttp...
Так не сработало, попробую через "Option"...
200 SiMBa_R38
 
20.06.23
11:04
У меня обмен с ЕГАИС через MSXML2.ServerXMLHTTP.6.0.
как портянку прятать под кат?
Функция SendRequest(Metod, Знач Request, XMLstr="")
    
    Request = СтрЗаменить(Request, Service, "");
    
    Если ПустаяСтрока(XMLstr) = 0 Тогда
        Boundary = "Boundary"+СтрЗаменить(ТекущееВремя(),":","");
        Body = "--"+Boundary+РазделительСтрок
                +"Content-Disposition: form-data; name=""xml_file""; filename=""file.xml"""+РазделительСтрок
                +"Content-Type: text/xml; charset=utf-8"+РазделительСтрок+РазделительСтрок
                +XMLstr+РазделительСтрок
                +"--"+Boundary+"--";
            
    КонецЕсли;
    
    Попытка
        Http = CreateObject("MSXML2.ServerXMLHTTP.6.0");    
    Исключение  
        Сообщить(ОписаниеОшибки(),"!");
        Возврат 0;
    КонецПопытки;

    Http.Open (Metod, Service+Request, -1); //синхронный запрос
    Http.SetRequestHeader("Host", ServiceIP);

    Попытка
        Если ПустаяСтрока(XMLstr) = 0 Тогда
            Http.SetRequestHeader("Content-Type","multipart/form-data; boundary="+Boundary);
            Http.SetRequestHeader("Content-Length", СтрДлина(Body));
            Http.Send(Body);
        Иначе
            Http.Send();
        КонецЕсли;
    Исключение  
        Сообщить(Request + РазделительСтрок + ОписаниеОшибки(),"!");

        Возврат 0;
    КонецПопытки;
    
    Состояние("Ожидание ответа на запрос...");
    ВремяОжидания = 0;
    Пока Http.ReadyState <> 4 Цикл
        Попытка
            Если Http.waitForResponse(1) = 0 Тогда //превышено время ожидания ответа =1s
                Если ВремяОжидания >= 60 Тогда //
                    //Состояние("");
                    Сообщить("Превышен интервал ожидания запроса сервера "+ServiceIP,"!");
                    Возврат 0;
                КонецЕсли;
                ВремяОжидания = ВремяОжидания + 1; //1s
                Состояние("Ожидание ответа на запрос... "+Строка(ВремяОжидания)+"s");
            КонецЕсли;
        Исключение  
            Сообщить(Request + РазделительСтрок + ОписаниеОшибки(),"!");

            Возврат 0;
        КонецПопытки;    
    КонецЦикла;          
    Состояние("");
    
    Если Http.Status = 200 Тогда
    Иначе
        Сообщить("HTTP status: "+Http.Status+" "+Http.StatusText+", ошибка!","!");
        Возврат 0;
    КонецЕсли;
    
    Response = Http.ResponseXML;
    АдресФайла = КаталогВременныхФайлов() + "\" + ИмяПользователя() + "_xml.xml";
    Если ПустоеЗначение(Response.XML) = 1 Тогда
        //XML в ответе нет, есть только текст
        Response = Http.ResponseText;
        Текст = СоздатьОбъект("Текст");
        Текст.ДобавитьСтроку(Response);
        Текст.Записать(АдресФайла);
    Иначе //объект типа MSXML2.DOMDocument.<MSXMLver>.0    
        Response.Save(АдресФайла);
    КонецЕсли;
    
    //Response = АдресФайла;
    
    Возврат АдресФайла;
    
КонецФункции    // SendRequest
201 SiMBa_R38
 
20.06.23
11:28
(200) Сюда я кстати передаю через
    Дом2 = СоздатьОбъект("MSXML2.DOMDocument");
    pi = Дом2.createProcessingInstruction("xml", "version=""1.0"" encoding=""UTF-8""");
    Дом2.appendChild(pi);
    Респ = SendRequest("POST", "/opt/in/" + ОтправитьВ,Дом2.xml);

(197) Мне проще было через COM настроить. Правда со всякими CreateSimpleObject заморочки, но это не тема данного треда.
202 MWWRuza
 
20.06.23
11:34
Спасибо....
Вижу несколько отличий, буду разбираться...

Тут, кодировка у Вас utf-8:

    Если ПустаяСтрока(XMLstr) = 0 Тогда
        Boundary = "Boundary"+СтрЗаменить(ТекущееВремя(),":","");
        Body = "--"+Boundary+РазделительСтрок
                +"Content-Disposition: form-data; name=""xml_file""; filename=""file.xml"""+РазделительСтрок
                +"Content-Type: text/xml; charset=utf-8"+РазделительСтрок+РазделительСтрок
                +XMLstr+РазделительСтрок
                +"--"+Boundary+"--";
            
    КонецЕсли;

И этого заголовка у меня нет:

Http.SetRequestHeader("Content-Length", СтрДлина(Body));

Последнее, я думаю, не сильно критично, но кодировка, это похоже как раз моя проблема...
203 MWWRuza
 
20.06.23
11:35
(201) Это, похоже из ЕГАИС...
204 MWWRuza
 
20.06.23
11:43
+(203) В ЕГАИС я тоже так передаю.

+(202) Вот только, это API СБИС.... Не получилось бы, что в ЭДО Лайт ЧЗ извратились, и все-таки кодировку windows-1251 хотят...

Но, это пробовать нужно. Не попробую, не узнаем. Отпишусь потом.
205 Djelf
 
20.06.23
12:11
(204) Ну ты даешь, совсем заработался! "Не получилось бы, что в ЭДО Лайт ЧЗ извратились, и все-таки кодировку windows-1251 хотят..."
Документ в какой кодировке? В windows-1251!
Как ты себе представляешь передачу документа в кодировке utf-8, если сам документ в windows-1251?
Так это не работает...

Разве что в Диадок, у них передача в utf-8 json, а сам документ windows-1251 завернут в base64.
Но тут не тот случай.
206 SiMBa_R38
 
20.06.23
12:19
(204) да, это кусок ЕГАИС, сбис после записи на диск, подгружает в структуру компоненты, там в плане отправки ничего нет.
По кодировке ЭДО Лайт... у меня только опыт с crpt.ismotp.ru там charset=utf-8 через power shell завернут, и с отправкой файла я там так и не справился, похожая проблема. 400 и всё тут.
207 MWWRuza
 
20.06.23
12:19
Ага... Я не то, что-бы заработался, уже всякая "фантастика" в голову лезет, так как других мыслей нет :-(

Но, вот это: +"Content-Type: text/xml; charset=utf-8"+РазделительСтрок+РазделительСтрок

Интересно...
Попробовал у себя:
    + Симв(13) + Симв(10)
//    + "Content-type: text/xml"
//    + "Content-type: text/xml;charset=utf-8"
    + "Content-type: text/xml;charset=windows-1251"
    + Симв(13) + Симв(10)
    + Симв(13) + Симв(10)
Ругается: Ошибка {"errors":[{"error_message":"DOC-0016: \"Неверный тип загружаемого файла: Content-Type: text/xml;charset=windows-1251\""}]}
Не нравится ему такой тип контента :-(
Может кодировка должна быть не "windows-1251", а "ANSI", или что-то в этом роде?
208 princepersei
 
20.06.23
12:22
Доброго дня. Проходили с ЭДО Лайт эту проблему, победили сначала с помощью утилиты curl.exe, ну а потом через Карлик, спасибо Djelf.
209 MWWRuza
 
20.06.23
12:23
(206) у меня только опыт с crpt.ismotp.ru там charset=utf-8
А у меня с обычными запросами к ЦРПТ получилось... Списание весовой молочки и еще что-то работает давно...
Если интересно, могу показать код. Но, там через JSON тело запроса отправляется...
210 SiMBa_R38
 
20.06.23
12:31
(208) Поделитесь рецептом.
(209) Буду благодарен, я на powershell обвязку делаю, списание кстати тоже работает... не работает получение всех КИЗ по организации, и с GTIN и с ИНН пытался, отваливается.
211 princepersei
 
20.06.23
12:32
C ГИСМТ и СУЗ проблем нет, так же нормально работают запросы получения списка документов с ЭДО Лайт, а вот с отправкой XML в HTML-форме на сервер ЭДО Лайт, тут проблема судя по прокси Fiddler, в запрос уходят кракозябры.
212 princepersei
 
20.06.23
12:41
(210) По умолчанию для всех запросов идет WinHTTP, если ОС Windows 7 и выше. По поводу получения КИЗ, не думаю, что получиться получить, так же как у вас обрывается, частично победили проблему сделав таймаут между запросами 4 секунды.
213 SiMBa_R38
 
20.06.23
12:54
(212) я так понимаю первичный то запрос на формирование отчета проходит? я даже его сформировать не могу, а страницы то это понятно что падингом потом загружать по чуть-чуть.
214 princepersei
 
20.06.23
13:19
ТЗ True API 5.1.1. Метод получения информации о списке КИ по заданным фильтрам

Запрос
POST https://markirovka.sandbox.crptech.ru/api/v4/true-api/cises/search HTTP/1.1
Connection: Keep-Alive
Content-Type: application/json; Charset=UTF-8
Accept: */*
Authorization: Bearer Токен
Content-Length: 104
Host: markirovka.sandbox.crptech.ru

{"filter":{"productGroups":["tires"]}, "pagination":{"perPage":1000, "lastEmissionDate":"", "sgtin":""}}
215 MWWRuza
 
20.06.23
13:30
(210) Списание так делаю:

    СтрДжейсон                          = Сервис.DecodeToUTF8(ЗначениеВJSON(СзЗаг));
    Кодировка                             = "base64";
    Стр                                 = Кодировать(СтрДжейсон, Кодировка);
    Тхт                                    = СоздатьОбъект("Текст");
    Тхт.ДобавитьСтроку(СтрДжейсон);
    ИсхФайл                                = ВремКат + "DocJSON.json";    
    Тхт.Записать(ИсхФайл);
    Стр                                 = СтрЗаменить(Стр, Симв(10), "");
    СтрДок64                            = СтрЗаменить(Стр, Симв(13), "");
    ПодпФайл                            = ВремКат + "DocJSON.json.sig";    
    Серт                                 = ПолучитьСертификатПоОтпечатку(СокрЛП(ЮрЛицо.ЭЦП.Отпечаток));
    ПодписатьФайл(ИсхФайл, Серт, ПодпФайл, 1);
    Тхт2                                = СоздатьОбъект("Текст");
    Тхт2.Открыть(ПодпФайл);
    СтрЭЦП                                = "";
    Сч                                     = 0;
    Для Сч = 1 По Тхт2.КоличествоСтрок() Цикл
        СтрЭЦП                            = СтрЭЦП + СокрЛП(Тхт2.ПолучитьСтроку(Сч));    
    КонецЦикла;
    сзJSONЗапрос                        = СоздатьОбъект("СписокЗначений");
    сзJSONЗапрос.ДобавитьЗначение("MANUAL",                 "document_format");
    сзJSONЗапрос.ДобавитьЗначение(СтрДок64,                 "product_document");
    сзJSONЗапрос.ДобавитьЗначение(СтрЭЦП,                     "signature");
    Если Причвыб = Перечисление.ПричВыбМарки.Развес Тогда
        сзJSONЗапрос.ДобавитьЗначение("LK_RECEIPT",         "type");
    Иначе
        Если СпосУч = Перечисление.СпособУчета.Поэкземплярный Тогда
            сзJSONЗапрос.ДобавитьЗначение("LK_RECEIPT",         "type");    
        Иначе    
            сзJSONЗапрос.ДобавитьЗначение("LK_GTIN_RECEIPT",    "type");
        КонецЕсли;
    КонецЕсли;
    
    сзЗаголовки                         = СоздатьОбъект("СписокЗначений");
    сзЗаголовки.ДобавитьЗначение("no-cache",             "cache-control");
    сзЗаголовки.ДобавитьЗначение("application/json",     "Accept");
    СтрОшибка                            = "";
    Url                                    = АдресСервераМОТП + "/" + ПрефиксВерсии + "/lk/documents/create?pg=milk";    
    Ответ                                 = глHTPP_ВыполнитьЗапрос("POST", Url, сзJSONЗапрос, Токен, сзЗаголовки, СтрОшибка);
    УинДокаЦРПТ                            = СокрЛП(Ответ);
    Записать();
    Если СокрЛП(Ответ) <> "" Тогда
        Пока Вопрос("Ожидание проверки статуса документа(~10 сек)......."+РазделительСтрок + "ОК - Проверить статус, Отмена - Прервать", 1,10) <> 2 Цикл
            ПроверитьСтатус();
            Если СокрЛП(Статус) <> "" Тогда
                Провести();
                Прервать;
            КонецЕсли;
        КонецЦикла;    
    КонецЕсли;
216 Djelf
 
20.06.23
14:00
Смешались в кучу кони, люди...
217 MWWRuza
 
20.06.23
14:08
Ага...

Возвращаясь к теме:

Не могу понять, почему у SiMBa_R38 работает такая конструкция:

+"Content-Type: text/xml; charset=utf-8"+РазделительСтрок+РазделительСтрок

указание кодовой странице в типе контента через ";", а у меня:

+ "Content-type: text/xml;charset=windows-1251"

Ошибку: Ошибка {"errors":[{"error_message":"DOC-0016: \"Неверный тип загружаемого файла: Content-Type: text/xml;charset=windows-1251\""}]}

Выдает???
218 MWWRuza
 
20.06.23
14:22
На хабре: https://habr.com/ru/articles/17640/
Цитата:

И что потом… А он (объект класса XMLHttpRequest) переводит эту строку в UTF-8, в какой бы кодировке она не была. Так написано в документации W3C. И он реально это делает.

Выводы:

1. Напрямую через XMLHttpRequest можно передавать только строки в кодировке UTF-8.

2. Можно передавать строки как бы «в любых других кодировках», если нелатинские символы
при этом за-escape-ены

И в конце:

А для того, чтобы сервер отдавал яваскрипту JSON (или что там у вас) в правильной кодировке (т.е. в такой же кодировке, в которой отдаются все xhtml страницы) просто в начале вашего ajax.php пропишите заголовок:

header('Content-type: text/html; charset=windows-1251');

И всё будет ок.

Нифига у меня не ОК :-(
219 MWWRuza
 
20.06.23
16:21
(198) Сделал через WinHttp:

Функция ПробныйЗапросWinHHHTP(Тип, Знач Url, jSon, ТекТокен, сзЗаголовки, СтрОшибка, Файл, Тело)
    WinHttp.Option(2,"Windows-1251");
    WinHttp.Open(Тип, СокрЛП(Url), 0);
    КонтТип    = "multipart/form-data;" + "boundary=" + ВремГраница + ";charset=windows-1251";
    WinHttp.SetRequestHeader("Content-type", КонтТип);
    WinHttp.SetRequestHeader("Authorization", "Bearer " + СокрЛП(ТекТокен));
    WinHttp.SetRequestHeader("Accept", "application/xml");  
    WinHttp.SetRequestHeader("Charset", "Windows-1251");
    WinHttp.Send(Тело);
    Стат    = WinHttp.Status;
    Если Стат <> 200 Тогда
        Сообщить("Ошибка: (" + WinHttp.Status + ") " + WinHttp.StatusText, "!!");
    КонецЕсли;
    Возврат WinHttp.ResponseText;
КонецФункции

Ничего не поменялось, ошибка та-же :-(
220 MWWRuza
 
20.06.23
19:33
Все, надоело...
За три дня, не продвинулся ни на шаг...
Буду пытаться карликом, раз у других работает... Не хотел еще одну ВК использовать, ну да ладно :-)

Пока, начал только, запрос пока пустой:

Функция ПробныйЗапросКарлик(Тип, Знач Url, jSon, ТекТокен, сзЗаголовки, СтрОшибка, Файл, Тело)
    ЗагрузкаВК();
    Карлик = Карлик_Создать();
    Авторизация  = "Authorization: Bearer " + ТекТокен;
    Карлик.УстановитьПараметр("HTTPHEADER", Авторизация);
    
    КонтТип    = "multipart/form-data;" + "boundary=" + ВремГраница + ";charset=windows-1251";
    
    Карлик.УстановитьПараметр("HTTPHEADER","Content-Type: " + КонтТип);
    Карлик.УстановитьПараметр("URL", СокрЛП(url));
    Карлик.УстановитьПараметр("CUSTOMREQUEST", "POST");// иначе отправляет через PUT

    Запрос = Карлик.СоздатьЗапрос();
    
    //Запрос.Добавить(name,filename,type,data)

    //добавляет часть к составному запросу

    //если какое то поле пропущено, то оно не будет добавлено в заголовок составного сообщения

        //если будет ругаться на filename, то добавь его

    //Запрос.Добавить("content",,,content);
    //Запрос.Добавить("doc_id",,,doc_id);
    //Запрос.Добавить("signature",,,signature);
    
    //Запрос.Добавить("content",,, Тело);    

    КодОшибки = Карлик.Выполнить();
    //Карлик_ПолучитьЗаголовки();

    Если ОбработатьКодОшибки(КодОшибки)=0 Тогда
        ТекстОтвета = Карлик.Приемник.Данные;
        Возврат ТекстОтвета;
    КонецЕсли;
КонецФункции

Падает 1С при Выполнить()... что-то не так, или потому, что в запрос ничего не передано?
221 MWWRuza
 
20.06.23
20:09
Функция ПробныйЗапросКарлик(Тип, Знач Url, jSon, ТекТокен, сзЗаголовки, СтрОшибка, Файл, Тело, СзКарл)
//    ЗагрузкаВК();
    
    ИмяФайла    = СзКарл.Получить("ИмяФайлаИнфПок");
    content        = СзКарл.Получить("СтрТитула");
    doc_id        = СзКарл.Получить("ИД");
    signature    = СзКарл.Получить("СигнДокаИнфПок");
    
    Карлик = Карлик_Создать();
    Авторизация  = "Authorization: Bearer " + ТекТокен;
    Карлик.УстановитьПараметр("HTTPHEADER", Авторизация);
    
    КонтТип    = "multipart/form-data;" + "boundary=" + ВремГраница + ";charset=windows-1251";
    
    Карлик.УстановитьПараметр("HTTPHEADER","Content-Type: " + КонтТип);
    Карлик.УстановитьПараметр("URL", СокрЛП(url));
    Карлик.УстановитьПараметр("CUSTOMREQUEST", "POST");// иначе отправляет через PUT

    Запрос = Карлик.СоздатьЗапрос();
    
    //Запрос.Добавить(name,filename,type,data)
    Запрос.Добавить("name",,,"content");
    
    КратИмяФайла    = СтрЗаменить(ИмяФайла, ".xml", "");
    КратИмяФайла    = Сред(КратИмяФайла, Найти(КратИмяФайла, "ON_NSCHFDOPPOKMARK"));
    Запрос.Добавить("filename",,,КратИмяФайла);

    //добавляет часть к составному запросу

    //если какое то поле пропущено, то оно не будет добавлено в заголовок составного сообщения

        //если будет ругаться на filename, то добавь его

    Запрос.Добавить("content",,,content);
    Запрос.Добавить("doc_id",,,doc_id);
    Запрос.Добавить("signature",,,signature);
    
    //Запрос.Добавить("content",,, Тело);    
    Попытка
        КодОшибки = Карлик.Выполнить();
    Исключение
        Сообщить("Ошибка!");
    КонецПопытки;    
    //Карлик_ПолучитьЗаголовки();

    Если ОбработатьКодОшибки(КодОшибки)=0 Тогда
        ТекстОтвета = Карлик.Приемник.Данные;
        Возврат ТекстОтвета;
    КонецЕсли;
КонецФункции

Один черт, 1Ска падает, и попытка не спасает...
222 MWWRuza
 
20.06.23
20:15
223 MWWRuza
 
20.06.23
20:22
С авторизацией что-то не так?

Если комментирую: Карлик.УстановитьПараметр("HTTPHEADER", Авторизация);

То не падает. Естественно выдает 401 - Неавторизованный запрос/Unauthorized

Как только убираю комментарий, опять крашится :-(
Что я не так сделал?
224 MWWRuza
 
20.06.23
23:45
Из тестовой обработки. Тоже крашится "через раз", нестабильно. От чего зависит - пока не понял :-(
Ну, вот в один из разов, когда не крашанулась, содержимое табло, со всеми галочками: https://cloud.mail.ru/public/gmXk/cUEnH8EUa
Ошибка другая, но похоже тоже с кодировкой связана. В логе я не вижу русских букв :-(
225 Djelf
 
21.06.23
06:51
За все время использования крэши были единичными, обычно на промежуточных версиях, на последнем билде вообще ни разу.
Три дня непрерывно запрашивал марки в егаис - не упало.
Крашится перед отправкой или в момент отправки?

Вот это ты зачем делаешь? Бондари должно автоматоматом ставится, но судя по логу кастомное воткнулось...

КонтТип    = "multipart/form-data;" + "boundary=" + ВремГраница + ";charset=windows-1251";
Карлик.УстановитьПараметр("HTTPHEADER","Content-Type: " + КонтТип);



    //добавляет часть к составному запросу
    //если какое то поле пропущено, то оно не будет добавлено в заголовок составного сообщения
    //Запрос.Добавить(name,filename,type,data) // *** я давал описание ***
    //если будет ругаться на filename, то добавь его

    Запрос.Добавить("content",,,content); // *** сюда filename ***
    Запрос.Добавить("doc_id",,,doc_id);
    Запрос.Добавить("signature",,,signature);


content - нормально в 1251, doc_id вроде тоже, в signature у тебя не подпись, а опять content.

Символы >127 в логе подавляются, т.к. там может быть utf-8, кодировка неизвестна, можно и выводить крякозяблины.
Судя по количеству точек в тэгах, например "</..>" это 1251
226 MWWRuza
 
21.06.23
08:29
(225) Вот это ты зачем делаешь? Бондари должно автоматоматом ставится, но судя по логу кастомное воткнулось...

Так? Лишнее закомментировал.

    КонтТип    = "multipart/form-data"; // + "boundary=" + ВремГраница + ";charset=windows-1251";
    
    Карлик.УстановитьПараметр("HTTPHEADER","Content-Type: " + КонтТип);

(225) Падало в момент отправки.
Но, судя по всему, вчера вечером, у ЧЗ были какие-то проблемы. И через XmlHttp ответы через раз приходили(но, там не падало, просто пустой ответ от сервера был), и ЛК из рук вон плохо работал, все время их красные месаги вылетали. А вот почему карлик при этом падал, а не говорил, что-то типа 404 или еще чего-то наподобии, или просто "пустой ответ" - я х.з...

(225) в signature у тебя не подпись, а опять content.

Хм... Заработался наверное, проверю :-)
227 MWWRuza
 
21.06.23
08:56
(226) Хм... Заработался наверное, проверю :-)

Да нет, в коде обработки все верно.
Просто при тестировании не тот файл ЭЦП выбирал, устал, видимо:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-529.jpg

Должно быть так:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-528.jpg

Ща дождусь, когда товар привезут, и попробую...
228 Djelf
 
21.06.23
10:11
(226) Попробуй https://cloud.mail.ru/public/htRa/D4qspqwUk
Разлочил символы 1251 русской части и еще кое-что, возможно от падения поможет, но выглядит не очень...
И поставь Карлик.УстановитьПараметр("TIMEOUT",10); подберешь сколько там надо секунд, если сервер тупит.
229 MWWRuza
 
21.06.23
10:26
(228) Порпробую, спасибо.

А пока, вот: https://cloud.mail.ru/public/bW6v/pBzNLbbTi

Понять, что тут:

0000: {"errors":[{"error_message":"................ 'owner_id:11000120731:dir:Incoming:doc_id:dcf9549b-62e5-40b3-bbd8-ec4dcf819176' ..    
0080:  .............. '61' .. .......... 504 .... .......... ........ ................"}]}

Похоже, на текущей сборке не получается...
Должно быть, что-то типа:

400 Документ уже подписан Документ в статусе 4
400 Документ [doc_id] в статусе [статус]
с типом [тип документа] не может
быть подписан
Документ находится в статусе
отличном от 3 или 13

Так, как это вчерашний УПД который уже подписан в ЛК...
Новый, только сегодня после обеда привезут товар, тогда можно будет с ним играться...

А выводит в результат:

Запрос вернул код ошибки 400Неверный запрос/Bad RequestЗапрос не может быть понят сервером из-за некорректного синтаксиса.

А сейчас пока попробую сборку из (228), может сообщение понятнее станет.
230 MWWRuza
 
21.06.23
10:41
+(229) Нет...
В логе, в самом запросе отображает кирилицу, все норм, а в ответе кракозябры:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-530.jpg

Не понятно, в какой кодировке он ответ вернул...
Попробовать вот с этим параметром:

Карлик.Приемник.Кодировка = 1 перекодировки не происходит

поиграть?

Лог: https://cloud.mail.ru/public/r9Tj/ejWPPL2Ur
231 MWWRuza
 
21.06.23
10:45
Нет, параметр "Карлик.Приемник.Кодировка" на кодировку ОТВЕТА не влияет, хоть 0, хоть 1, все равно в ответе кракозябры...
232 MWWRuza
 
21.06.23
10:47
Кстати, падений сейчас нет - ни на новой сборке, ни на старой. Видимо у ЧЗ сегодня сервера нормально работают.
233 Djelf
 
21.06.23
11:11
(231) Это utf-8, результат запроса в окне результата сообщения.
А то что в логе раскродировать можно блокнотом
0000: {"errors":[{"error_message":"документ 'owner_id:11000120731:dir:Incoming:doc_id:dcf9549b-62e5-40b3-bbd8-ec4dcf819176' в    
0080:  статусе '61' с типом 504 не может быть подписан"}]}
234 Djelf
 
21.06.23
11:13
Хотя это и есть ответ, на новой версии вроде бы должно в результат попасть.
В окне результату у тебя видимо старое сообщение...
235 MWWRuza
 
21.06.23
11:53
Ну, да, сделал так:

    КодОшибки = Карлик.Выполнить();

    Если ОбработатьКодОшибки(КодОшибки) = 0 Тогда
        Сообщить("Ошибка обработки запроса, код " + КодОшибки);
    Иначе    
        ТекстОтвета    = Карлик.Приемник.Данные;
    КонецЕсли;
    
    Возврат ТекстОтвета;

Теперь, в ответ на форму читаемо выводит:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-531.jpg

А в лог, все равно кракозябры пишет. Но, это не принципиально для "боевой" задачи, а для теста... Ну, тут может я что-то не верно в обработке сделал, х.з...
236 MWWRuza
 
21.06.23
12:00
(234) В окне результату у тебя видимо старое сообщение...

Нет, это твоя функция:

Функция   ОбработатьКодОшибки(Знач КодОшибки)
    КодОшибки=Строка(КодОшибки);    
    Если КодОшибки="200" Тогда
        Возврат 0;
    Иначе
        Если КодыОшибок.НайтиСтроку("КодОшибки",КодОшибки,,1)=0 Тогда
            ТекстОтвета="Неизвестная ошибка HTTP "+КодОшибки;
        Иначе
            ТекстОтвета="Запрос вернул код ошибки "+КодОшибки
            +КодыОшибок.Ошибка
            +КодыОшибок.Описание;
        КонецЕсли;
    КонецЕсли;
    Возврат 1;
КонецФункции

Возвращала... У ЦРПТ свое мнение на счет того, что должно по коду 400 возвращаться :-)
237 MWWRuza
 
21.06.23
12:06
+(236) и оно не совпадает с тем, что у тебя в таблице кодов/значений ошибок :-)

У них там на все 400 :

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-532.jpg

Видимо, они считают, что 400 это и не ошибка вовсе, а вариант ответа...
Они вообще странные ребята :-)
238 MWWRuza
 
21.06.23
12:09
Ну, в общем, можно считать, что запрос через карлика работает нормально.
Остается товар дождаться, и пробовать подписывать реальную накладную.
239 Djelf
 
21.06.23
13:33
(237) Ладно, но ты бы проверил ТекстОтвета=Карлик.Приемник.Данные; несмотря на код возврата 400.
Это заполняется незваисимо от кода возврата.
240 Djelf
 
21.06.23
15:02
Уууу... так там tls1.2, значит mshttp на хрюше без патчей работать не будет, а на 2003м сервере tls1.2 вроде никому еще не удалось включить.
В мою ВК зашит внутрь openssl и все остальное, ей начхать на все это, она работает даже под wine на linux, где это все шифрование вообще не работает...
Она для этого и создавалась.
В 12й версии будет и tls1.3 - надо думать о будующем...
241 MWWRuza
 
21.06.23
15:05
(239) ы проверил ТекстОтвета=Карлик.Приемник.Данные; несмотря на код возврата 400.

Дак у меня вроде так и есть:

    КодОшибки = Карлик.Выполнить();

Если ОбработатьКодОшибки(КодОшибки) = 0 Тогда
Сообщить("Ошибка обработки запроса, код " + КодОшибки);
Иначе    
ТекстОтвета    = Карлик.Приемник.Данные;
КонецЕсли;
    
Возврат ТекстОтвета;
242 MWWRuza
 
21.06.23
15:06
(240) Ну, супер!
Спасибо.
243 MWWRuza
 
21.06.23
15:12
А, не, надо:

Если ОбработатьКодОшибки(КодОшибки) = 0 Тогда
Сообщить("Все хорошо, код " + КодОшибки);
ТекстОтвета    = Карлик.Приемник.Данные;
Иначе    
ТекстОтвета    = Карлик.Приемник.Данные;
КонецЕсли;

А то при 200 он не выведет текст ответа...
Ну, 200 у меня еще не было, я от 400 пока уйти не могу :-)
244 MWWRuza
 
21.06.23
15:14
+(243) Ну, или вообще это: ТекстОтвета    = Карлик.Приемник.Данные; за условие вынести.
В боевой я так и сделал.
Накладной ещн не было...
245 Djelf
 
21.06.23
15:19
(241) Код 400 считается ошибкой HTTP, он зарегистрирован в ошибках HTTP, поэтому тело возрата не обрабатывается.
Ошибки конкретного сервера, вроде должны начинатся с 500, но тут это видимо не работает, "мы же сами с усами".
Значит надо составлять таблицу ошибок ЭДО и обрабатывать ее перед ошибками HTTP или вместе с ними.
246 MWWRuza
 
21.06.23
16:14
Ага...

Пришла накладная, все по ней нормально.

Попробовал подписать из боевой обработки.
Вылетела 1С.
Захожу в ЛК через браузер - документ подписан и отправлен в ГИСМ...
Странно. Значит запрос отработал, прежде чем упасть.
Но, что могло потом случиться?
247 victuan1
 
21.06.23
16:19
(246) Попробуй через отладчик пошагово, чтобы поймать на чем вылет.
Или в лог пиши везде через шаг.
248 Djelf
 
21.06.23
16:32
(247) Это, увы, бесполезно. Судя по всему вылетает после выполнения запроса внутри curl1c из 1с это бесполезно смотреть.
Но у тебя же не вылетает! Как так?

(246) DEP выключен? Точно выключен? 1С+ВК не любят DEP.

Могу натыкать трассировок, можно даже с задержкой, чтобы поймать, но ситуация странная.
249 Djelf
 
21.06.23
16:35
Где тут вылетать то? Разве что тут: https://gyazo.com/04eea8194b27adddd247554d04798794
250 Djelf
 
21.06.23
16:43
Пробуем curl1c_1.0.0.12.draft2.7z https://cloud.mail.ru/public/6ZK6/mCKKcm99v
Чуть не посидел еще сильнее, пока обновлял, и собирал сопутствующие библиотеки, это чертова магия, а не нормальная работа...
Сейчас так: libcurl/8.1.2, OpenSSL/1.1.1u, libz/1.2.11, brotli/1.0.9, libssh2/1.11.0
251 MWWRuza
 
21.06.23
17:03
(250) Попробую... Но, теперь только с ошибкой 400 будет. Неподписанных нет... А на 400 оно и так сегодня не вылетало.

(246) DEP выключен? Точно выключен? 1С+ВК не любят DEP.

Вот так:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-533.jpg

В самый низ передвинуть?
252 victuan1
 
21.06.23
17:03
(248) Но если уверенность, что упала 1С в момент выполнения запроса, то да - отладчик не поможет.
У нас были вылеты, но не при выполнении запроса, поэтому отладчик нашел узкие места.
DEP думаю не причем, т.к. на разных клиентах проверяли.
253 MWWRuza
 
21.06.23
17:06
(252) упала 1С в момент выполнения запроса

Судя по всему, в момент получения ответа, так, как сам запрос отработал - документ в итоге подписался...
254 Djelf
 
21.06.23
17:09
В (249) код где и падает, сейчас не парился сам, спросил у сами знаете кого и зашунтировал то что он нашел.
Если и сейчас не получится буду втыкать отладку с задержкой, после вывода сообщения.
Другого варианта как бы и нет.
255 Djelf
 
21.06.23
17:16
(251) как-то вот так dep вырубается https://sky-rzn.ru/blog/interesnoe/1c-x64/
иногда это помогает, иногда требуется его полностью вырубать, от чего это зависит я не знаю и не понимаю, это тайна покрытая мраком...
256 MWWRuza
 
21.06.23
17:24
https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-534.jpg :-(

Тут то так стоит:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-535.jpg

т.е., как я понимаю выключен совсем...
257 Djelf
 
21.06.23
17:26
(256) Видимо да. Мне проверить не на чем, надежда только на тебя.
258 MWWRuza
 
21.06.23
17:27
Может у меня уже глаза замылились, и чего-то в коде 1С не вижу:

Функция ПробныйЗапросКарлик(Тип, Знач Url, jSon, ТекТокен, сзЗаголовки, СтрОшибка, Файл, Тело, СзКарл)
    ИмяФайла        = СзКарл.Получить("ИмяФайлаИнфПок");
    content            = СзКарл.Получить("СтрТитула");
    doc_id            = СзКарл.Получить("ИД");
    signature        = СзКарл.Получить("СигнДокаИнфПок");
    
    Карлик             = Карлик_Создать();
    Авторизация     = "Authorization: Bearer " + ТекТокен;
    Карлик.УстановитьПараметр("HTTPHEADER", Авторизация);
    
    КонтТип            = "multipart/form-data"; // + "boundary=" + ВремГраница + ";charset=windows-1251";
    
    Карлик.УстановитьПараметр("HTTPHEADER","Content-Type: " + КонтТип);
    Карлик.УстановитьПараметр("URL", СокрЛП(url));
    Карлик.УстановитьПараметр("CUSTOMREQUEST", Тип);// иначе отправляет через PUT
    Карлик.УстановитьПараметр("TIMEOUT",10);
    Карлик.Источник.Кодировка = 1;
        
    Запрос             = Карлик.СоздатьЗапрос();
    
    КратИмяФайла    = СтрЗаменить(ИмяФайла, ".xml", "");
    КратИмяФайла    = Сред(КратИмяФайла, Найти(КратИмяФайла, "ON_NSCHFDOPPOKMARK"));

    Запрос.Добавить("content", КратИмяФайла, "text/xml", content);
    Запрос.Добавить("doc_id",, "text/plain", doc_id);
    Запрос.Добавить("signature",, "text/plain", signature);
    
    КодОшибки         = Карлик.Выполнить();
    
    СтрОшибка        = КодОшибки;
    
    Сообщить("Ошибка:" + КодОшибки);
        
    ТекстОтвета        = Карлик.Приемник.Данные;

    Возврат ТекстОтвета;
КонецФункции
259 MWWRuza
 
21.06.23
17:32
Вот эти параметры:

jSon, сзЗаголовки, Файл, Тело

оставлены пока для совместимости с предыдущими вариантами запросов, я их уберу потом, в принципе, все данные для запроса есть в списке СзКарл...

Раньше они не нужны были, так, как тело формировалось отдельной функцией и в готовом виде в запросы подсовывалось...
260 Djelf
 
21.06.23
17:35
Это не работает, мы же multipart кидаем, а он кидается as is но и не мешает.
  Карлик.Источник.Кодировка = 1;
Это видимо правильно, добавить тип файла
  Запрос.Добавить("doc_id",, "text/plain", doc_id);
Все остально в норме.
261 MWWRuza
 
21.06.23
17:45
(260) Причесал код, убрал лишнее...
Таймаут увеличил до 30.
В отладчике посмотрел, вылетает на Выполнить()
И 30 секунд не ждет, вылетает через пару секунд от шага в отладчике :-(
262 MWWRuza
 
21.06.23
17:49
А... Винда семерка, 32 бита, если это важно. Относительно свежая, примерно год назад ставил.
263 MWWRuza
 
21.06.23
17:58
Может что-то инициализирую не верно?

В начале модуля объявлена переменная:

Перем Карлик;

В процедуре ПриОткрытии()

    Попытка
        СоздатьОбъект("Карлик");
    Исключение
        Если ЗагрузитьВнешнююКомпоненту("curl1c.dll") = 0 Тогда
            Сообщить("Компонента curl1c.dll не загружена", "!");
            Возврат;
        КонецЕсли;
    КонецПопытки;

Перед запросом такая функция:

Функция   Карлик_Создать()
    ТекстОтвета="";
    Если ПустоеЗначение(Карлик) = 1 Тогда
        Попытка
            Карлик = СоздатьОбъект("Карлик");    
        Исключение
            Сообщить("Не получается создание объекта curl1c, по причине "+ОписаниеОшибки(),"!");
            Возврат 0;
        КонецПопытки;
    КонецЕсли;    
    Возврат Карлик;
КонецФункции

И сам запрос потом:

Функция ПробныйЗапросКарлик(Тип, Знач Url, ТекТокен, СтрОшибка, СзКарл)
    ИмяФайла        = СзКарл.Получить("ИмяФайлаИнфПок");
    content            = СзКарл.Получить("СтрТитула");
    doc_id            = СзКарл.Получить("ИД");
    signature        = СзКарл.Получить("СигнДокаИнфПок");
    Карлик             = Карлик_Создать();
    Авторизация     = "Authorization: Bearer " + ТекТокен;
    Карлик.УстановитьПараметр("HTTPHEADER", Авторизация);
    КонтТип            = "multipart/form-data";
    Карлик.УстановитьПараметр("HTTPHEADER","Content-Type: " + КонтТип);
    Карлик.УстановитьПараметр("URL", СокрЛП(url));
    Карлик.УстановитьПараметр("CUSTOMREQUEST", Тип);
    Карлик.УстановитьПараметр("TIMEOUT",30);
    Запрос             = Карлик.СоздатьЗапрос();
    КратИмяФайла    = СтрЗаменить(ИмяФайла, ".xml", "");
    КратИмяФайла    = Сред(КратИмяФайла, Найти(КратИмяФайла, "ON_NSCHFDOPPOKMARK"));
    Запрос.Добавить("content", КратИмяФайла, "text/xml", content);
    Запрос.Добавить("doc_id",, "text/plain", doc_id);
    Запрос.Добавить("signature",, "text/plain", signature);
    КодОшибки         = Карлик.Выполнить();
    СтрОшибка        = КодОшибки;
    Сообщить("Ошибка:" + КодОшибки);
    ТекстОтвета        = Карлик.Приемник.Данные;
    Возврат ТекстОтвета;
КонецФункции
264 MWWRuza
 
21.06.23
18:01
Это, ничего не даст:

Сигнатура проблемы:
  Имя события проблемы:    APPCRASH
  Имя приложения:    1cv7.exe
  Версия приложения:    7.70.0.27
  Отметка времени приложения:    4573fcb7
  Имя модуля с ошибкой:    StackHash_54b3
  Версия модуля с ошибкой:    6.1.7601.24545
  Отметка времени модуля с ошибкой:    5e0eb7a5
  Код исключения:    c0000374
  Смещение исключения:    000c3c77
  Версия ОС:    6.1.7601.2.1.0.256.1
  Код языка:    1049
  Дополнительные сведения 1:    54b3
  Дополнительные сведения 2:    54b3b02d7afac7c441179bb4d730301b
  Дополнительные сведения 3:    e52a
  Дополнительные сведения 4:    e52aaf46f2af42cb0ea9f938f8dcbcdc

Ознакомьтесь с заявлением о конфиденциальности в Интернете:
  http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0419

Если заявление о конфиденциальности в Интернете недоступно, ознакомьтесь с его локальным вариантом:
  C:\Windows\system32\ru-RU\erofflps.txt
265 Djelf
 
21.06.23
22:20
Дурная и непонятная штука. Если бы оно так всегда висло то Вик не смог бы это использовать, но он это использует, и не на одном компе, как я, и не на одном компе или сервере, какое общее количество компов в работает без таких сбоев мне не известно.
Давай список ВК в своей базе и порядок их загрузки.
Я конечно натыкаю трассировку в этой области, но если падение будет сразу после "res = curl_easy_perform(m_curl);" то это финиш.
266 MWWRuza
 
21.06.23
22:40
Хм...

В коде 1С точно нет ошибок?

А так, в конце процедуры ПриНачале работы системы()

То, что я добавлял:

    // Влад инициализация DOM для ЕГАИС
    Если Константа.ИспЕГАИС = 1 Тогда
        Попытка
            XML_DOM    = CreateObject("MSXML2.DOMDocument.6.0");
        Исключение
            Сообщить("Для работы с ЕГАИС, пожалуйста, установите Microsoft XML Core Services -
            | http://www.microsoft.com/en-us/download/details.aspx?id=19662");
            СтатусВозврата(0);
            Возврат;
        КонецПопытки;
        RegExp = CreateObject("VBScript.RegExp");        
    КонецЕсли;
// *********************
    
    // Влад загрузим внешнюю компоненту для принтера ШтрихКода
    Если Константа.ИспBZB2 = 1 Тогда
        Если ЗагрузитьВнешнююКомпоненту("GodexESC.dll") <> 0 Тогда
        // создаем объект
            ПринтерЭтикеток = СоздатьОбъект("AddIn.GodexESC");
        Иначе
            Сообщить("Не удалось загрузить компоненту GodexESC.dll");
        КонецЕсли;
    КонецЕсли;

    Попытка
        к = СоздатьОбъект("Структура"); // Объект ВК
    Исключение
        Если ЗагрузитьВнешнююКомпоненту("1CPP.dll") = 0 Тогда
            Сообщить("Ошибка загрузки ВК 1С++");
        КонецЕсли;
        Попытка
            к = СоздатьОбъект("Структура"); // Объект ВК
        Исключение
            Сообщить("Ошибка загрузки ВК 1С++");
        КонецПопытки;
        к = 0;
    КонецПопытки;
    
    Попытка
        к = СоздатьОбъект("Сервис"); // Объект ВК
        к.ВключитьРаскраскуТаблиц();
    Исключение
        Если ЗагрузитьВнешнююКомпоненту("FormEx.dll") = 0 Тогда
            Сообщить("Ошибка загрузки ВК FormEx");
        Иначе
            к = СоздатьОбъект("Сервис"); // Объект ВК
            к.ВключитьРаскраскуТаблиц();
        КонецЕсли;
        к = 0;
    КонецПопытки;

    // Йоксель
    Попытка
        Если Найти (КаталогИБ (), "SpreadSheetTests") = 0 Тогда
            глОсновнойКаталог = КаталогИБ ();
            ЗагрузитьВнешнююКомпоненту ("SpreadSheet.dll");
            глТестовыйСтенд = 0;
        Иначе
            глОсновнойКаталог = КаталогИБ () + "../SpreadSheet/";
            ЗагрузитьВнешнююКомпоненту ("SpreadSheetTests.dll");
            глТестовыйСтенд = 1;
        КонецЕсли;
    Исключение
        Предупреждение ("Не удалось загрузить компоненту SpreadSheet.dll");
        СтатусВозврата (0);
        Возврат;
    КонецПопытки;
    
    Попытка
        WinHttp = СоздатьОбъект("WinHttp.WinHttpRequest.5.1");
    Исключение
    КонецПопытки;    
    
    глКаталогФайлов = глОсновнойКаталог + "Файлы/";
    // Конец Йоксель
    Если Константа.Ексель2007 = 1 Тогда
        Попытка
            ПодключитьВнешнююКомпоненту("AddIn.Moxel.Converter"); // компонента для в меню возможности сохранения как Эксель-2007
        Исключение
            Сообщить("Ошибка подключения ВК Moxel");
            // Тут можно проругаться, только смысл?
        КонецПопытки;        
    КонецЕсли;

Собственно, и все... Ну, v7Plus еще грузится при первом обращении к ней.

Я чего так настаиваю проверить код 1С, в месаге выше - из Вашей тестовой обработки вроде меньше падает. Может что-то не так я загружаю/инициализирую - ???
267 MWWRuza
 
21.06.23
23:09
А, забыл. Еще ScanOpos подгружается, дальше, при подключении оборудования.
Больше, вроде ничего...
268 MWWRuza
 
21.06.23
23:21
Вот не бывает чудес... Три раза подряд из моей боевой обработки падало(благо, база маленькая, переиндекируется быстро), и три раза подряд из твоей тестовой обработки нормально, на сколько позволяют данные:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-536.jpg

Может, кроме самого Карлика, нужно еще какие-то объекты создавать при инициализации, которые явно не используются в коде 1С(по крайней мере у меня в боевой), но нужны для правильной работы Карлика?

В общем, не знаю... Завтра с утра, на трезвую(пардон, свежую :-) ) голову буду еще раз сравнивать, что в тестовой обработке происходит, и что в моей...
269 MWWRuza
 
21.06.23
23:31
(268) нужно еще какие-то объекты создавать при инициализации, которые явно не используются в коде 1С(по крайней мере у меня в боевой)
Я вот про что:

Система=СоздатьОбъект("Система");
КодыОшибок=СоздатьОбъект("ИндексированнаяТаблица");
БуферОбмена=СоздатьОбъект("БуферОбмена");
Информатор = СоздатьОбъект("Информатор");
270 MWWRuza
 
21.06.23
23:33
Этого ни чего у меня не создается... Может что-то из этого нужно?
Почему-то же твоя не падает.
271 Djelf
 
21.06.23
23:36
У тебя правильная последовательность загрузки 1с++, formex, йоксель.
Перехваты в 1с делают все 3, но карлик перехватов не делает, т.е. не пересекается.
Пересоздание объекта cirl1c/карлик, это важно! В переменную формы лучше не засовавать, могут быть такие казусы.
Я засунул чтобы выловить и обойти... Кстати, может это и предотвращает вылеты.
Коллекции у libcurl дурные, они по факту одноразовые, добавить то можно, а вот удалить нельзя.

(269) Не должно влиять на вылеты.
272 MWWRuza
 
22.06.23
00:07
(271) (269) Не должно влиять на вылеты.

И не влияет, проверил...

Остается еще один момент - в тестовой оьработке контент и ЭЦП читаются из файлов в строку - методами 1С, а в боевой строку контента получаю от скрипта, строкой, и ЭЦП тоже.
По идее - не должно влиять, строка она и есть строка, но х.з... Завтра проверю, заменю в боевой нормальное получение данных на чтение из тех-же файлов, что в тестовой(они, кстати, получены из тех-же строк, в процессе работы боевой обработки, сохранением в файлы).
273 princepersei
 
22.06.23
04:59
Примерно так у нас.

    Карлик = СоздатьОбъект("Карлик");
    Карлик.Инит();//Для работы на старых версиях нужна эта загрузка переменных
    Карлик.УстановитьПараметр("TIMEOUT"                ,60);
    Карлик.УстановитьПараметр("URL"                    ,СокрЛП(Сервер));
    Карлик.УстановитьПараметр("CUSTOMREQUEST"        ,Метод);
    Карлик.УстановитьПараметр("FOLLOWLOCATION"        ,1);
    Карлик.УстановитьПараметр("HTTPHEADER","Authorization: "+"Bearer "+ТокенЭДО);
    Карлик.УстановитьПараметр("HTTPHEADER","Content-Type: multipart/form-data");
    Запрос = Карлик.СоздатьЗапрос();
    Запрос.Добавить("content",ПутьИмяФайлаХМЛ,"application/xml",ПрочитатьДанныеСФайла(ПутьИмяФайлаХМЛ));
    Запрос.Добавить("signature",,,ПрочитатьДанныеСФайла(ПутьИмяФайлаТхт));
    Запрос.Добавить("doc_id",,,Значение);
    КодВозврата = Число(Карлик.Выполнить());
    ТелоОтвет    = Карлик.Приемник.Данные;
274 princepersei
 
22.06.23
05:07
ЭП в Титуле надо указывать продавца, это на всякий случай.

https://cloud.mail.ru/public/MUXp/qGBa9FbMu

https://www.diadoc.ru/docs/forms/upd/structure/8#on_nschfdoppok
275 MWWRuza
 
22.06.23
07:17
(273) Примерно так у нас.

Примерно так и у меня... Двумя месагами выше, я приводил ткст запроса.
Нет только этого:

Карлик.Инит();//Для работы на старых версиях нужна эта загрузка переменных

И этого:

Карлик.УстановитьПараметр("FOLLOWLOCATION"        ,1);

Уж не знаю, насколько это критично, но сегодня попробую.
Спасибо!

(274) ЭП в Титуле надо указывать продавца, это на всякий случай.

Это понятно :-)
Но, с этим тоже есть определенные проблемы... Когда у огрганизации несколько ЭЦП(в моем случае их 3 - одна, основная налоговская у генДира дома, вторая у одного из сотров для работы УТМ в магазе, и третья у меня - что-бы "на кошках тренироваться(С)" :-) Вторую и третью делал я сам, через Калугу-Астрал.
Так вот, "извещение просмотра документа покупателем", из которого можно извлечь ЭЦП продавца, для дальнейшего формирования титула, формируется от имени того сотра, кто первый загрузил ХМЛ входящего дока. Подписант берется из его ЭЦП, под которой он входил(токен доступа формировал).
И потом, если дальнейший ДО совершает другой сотрудник, с другой ЭЦП, эта квитанция остается висеть не подписанная, так, как "фамилия в ЭЦП не совпадает с фамилией пытающегося подписать документ". Я вчера с этим столкнулся.
И все-бы ничего, висит эта квитанция неподписанная, и ладно... Но, тут похоже на глюк ЭТО Лайт - если висит такая квитанция, отдельно, "оторванная от всего"(документ, о просмотре которого она была сформирована - уже нормально подписан и ДО по нему завершен), то новая квтанция, при первом просмотре следующего документа не формируется!
И "запрос списка неподписанных квитанций" только ее ИД возвращает :-(
Где в таком случае брать ЭЦП отправителя для нового документа? Мне вчера пришлось скачивать весь ДО нового дока, брать от туда одну из квитанций, и вытаскивать вручную оттуда ЭЦП отправителя для титула, сохранять ее в файл, и скармливать обработке в функцию формирования ХМЛ титула...
После подписания текущего дока, эта квитанция(от предыдущего дока) так и осталась висеть в списке неподписанных.
Пришлось зайти по удаленке, и подписать ее ЭЦП того сотра, от имени которого она сформировалась.
И только тогда она исчезла из списка.
Думаю, дальше должно быть все нормально, квитанции о просмотре будут формироваться штатно, но пока проверить не на чем - сегодня нет пока входящих новых.
276 MWWRuza
 
22.06.23
08:32
+(275) так, как "фамилия в ЭЦП не совпадает с фамилией пытающегося подписать документ".
Не верно сформулировал, а правки своих сообщений на Мисте нет...
Должно быть:

так, как фамилия подписанта в XML файле квитанции, не совпадает с фамилией владельца ЭЦП, пытающегося подписать эту квитанцию
277 MWWRuza
 
22.06.23
08:46
(275) Уж не знаю, насколько это критично, но сегодня попробую.

Попробовал.
Все равно упало...
278 MWWRuza
 
22.06.23
09:25
В отладчике:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-537.jpg

Следующий шаг(F8), думает 1-2 секунды и крашится...

У меня уже мысль, может глупая - ну в тестовой обработке то работает! А там отличие, в том, что он в табло "МногоБукФФ" выводит...
Может в процессе этого происходят где-то какие-то задержки, из-за которых он не падает???
279 big
 
22.06.23
10:07
Задам банальный вопрос - а в content нет ли недопустимых символов? Может "пиграться" контентом на предмет подсунуть хоть что-то лишь-бы не упало, а уже потом разбираться досконально?
280 MWWRuza
 
22.06.23
10:11
(279) Этот-же контент, сохраняется в файл в Temp(временно, для отладки), из которого я его подсовываю в тестовую обработку. Как и сигнатура тоже. И там, не падает, на тех-же файлах.
281 АгентБезопасной Нацио
 
22.06.23
10:13
(280) повтори еще раз для тупых - где падает, где не падает?
282 MWWRuza
 
22.06.23
10:14
Я уже вот так для отладки сделал, что-бы исключить влияние строки сожданной скриптом или прочитанной методом 1С.

        // Отладка
        Если Отл = 1 Тогда
            Тхт = СоздатьОбъект("Текст");
            Тхт.ДобавитьСтроку(СтрТитула);
            Тхт.Записать("C:\Temp\NewTitulScript.txt");            
        КонецЕсли;
        
        ВыхФайл         = ПодписатьТекст(СтрТитула, СокрЛП(ЮрЛицо.ЭЦП.Отпечаток));
        СигнДокаИнфПок     = СокрЛП(УбратьПереносыСтрок(ВыхФайл));
        
        // Отладка
        Если Отл = 1 Тогда
            Тхт = СоздатьОбъект("Текст");
            Тхт.ДобавитьСтроку(СигнДокаИнфПок);
            Тхт.Записать("C:\Temp\NewTitulScriptSign.txt");            
        КонецЕсли;
        
        // Данные для карлика
        СзКарл            = СоздатьОбъект("СписокЗначений");
        
        // Отладка, танцы с бубном
        Если Отл = 1 Тогда
            Тхт         = СоздатьОбъект("Текст");
            Тхт.Открыть("C:\Temp\NewTitulScript.txt");
            СтрТитула     = СокрЛП(Тхт.ПолучитьСтроку(1));
        КонецЕсли;
        
        // Отладка, танцы с бубном
        Если Отл = 1 Тогда
            Тхт             = СоздатьОбъект("Текст");
            Тхт.Открыть("C:\Temp\NewTitulScriptSign.txt");
            СигнДокаИнфПок     = СокрЛП(Тхт.ПолучитьСтроку(1));
        КонецЕсли;
283 MWWRuza
 
22.06.23
10:18
(281)
Падает у меня в конфе, во встроенной обработке, текст полный несклькими сообщениями выше.

Не падает в тестовой обработке от Джефа, которая вместе с длл идет... Там я только дописал передачу своих данных из файлов.
Но, там, видимо где-то инициализируется какая-то отладочная функция, что она в табло всю трассировку выводит. У меня, в боевой, этого нет. Так-же, как нет, как я понял и у Виктуана...
284 Djelf
 
22.06.23
10:43
Это обычно не требуется, когда уже работает. имхо не должно влиять. Разве что Карлик.ВыводитьСостояние(1) довольно полезно на больших файлах.
Карлик.Отладка(1/0) // выводит сообщения отправки/приемки в окно сообщений
Карлик.Трассировка(1/0) // служебный метод, используется для отладки curl1c.dll, может помочь при внезапных падениях
Карлик.ВыводитьСостояние(0/1) // выводит при выполнении в строку состояния данные по текущей загрузке/отправке
285 MWWRuza
 
22.06.23
11:11
(284) Добавил:

    Карлик.Отладка(1); // выводит сообщения отправки/приемки в окно сообщений
    Карлик.Трассировка(1); // служебный метод, используется для отладки curl1c.dll, может помочь при внезапных падениях
    Карлик.ВыводитьСостояние(1); // выводит при выполнении в строку состояния данные по текущей загрузке/отправке

Много букфф в табло вывело, точно как в тесте, запрос отработал, по сообщению видно, и в конце упало...

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-538.jpg
286 MWWRuza
 
22.06.23
11:18
Еще одна мысль, по различиям в тесте и у меня...
В тест я подсовываю готовые файлы контента и ЭЦП, сформированные ранее, этой-же моей обработкой.
А тут, я формирую их "на лету", в этой-же процедуре.
ХМЛ формирую через DOM, по идее не должно ни с чем конфликтовать...
ЭЦП черех CADESCOM, тоже не должно...
НО!!! Перед тем, как сформировать XML, я формирую ее имя, а в нем GUID... Его я получаю из v7Plus, через метод информации о системе...
Может тут конфликт с v7Plus - ???
287 big
 
22.06.23
11:20
(286) С такими танцами уже на всё думать приходится (((
288 MWWRuza
 
22.06.23
11:39
Закомменитовал вообще все, оставил только:

        // Данные для карлика
        СзКарл            = СоздатьОбъект("СписокЗначений");
        
        // Отладка, танцы с бубном
        Если Отл = 1 Тогда
            Тхт         = СоздатьОбъект("Текст");
            Тхт.Открыть("C:\Temp\NewTitulScript.txt");
            СтрТитула     = СокрЛП(Тхт.ПолучитьСтроку(1));
        КонецЕсли;
        
        // Отладка, танцы с бубном
        Если Отл = 1 Тогда
            Тхт             = СоздатьОбъект("Текст");
            Тхт.Открыть("C:\Temp\NewTitulScriptSign.txt");
            СигнДокаИнфПок     = СокрЛП(Тхт.ПолучитьСтроку(1));
        КонецЕсли;
        
        СзКарл.ДобавитьЗначение(СтрТитула, "СтрТитула");
        СзКарл.ДобавитьЗначение(ИД, "ИД");
        СзКарл.ДобавитьЗначение(СигнДокаИнфПок, "СигнДокаИнфПок");
        
        // Отладка
        ИмяФайлаИнфПок = "ON_NSCHFDOPPOKMARK_2BM-7730168552-2012052808325375862630000000000_2LT-11000120731_20230622_ADF41E4F-0B6D-4852-83A6-B6663CFC650A";
        
        СзКарл.ДобавитьЗначение(ИмяФайлаИнфПок, "ИмяФайлаИнфПок");

Не упало!!! :_)

Теперь, буду понемногу возвращать все обратно, и смотреть, с чем конфликт...
289 MWWRuza
 
22.06.23
11:57
Да вот оно, искать долго и не пришлось...
Как только раскомментирую эту строку:

XMLDOM             = ЗагрузитьDOMизФайла(ПутьКДоку);

Сразу краш :-(
290 MWWRuza
 
22.06.23
12:05
Нет, если непонятно написал - крашится не на создании ДОМ, крашится сам Карлик, если перед этим создан XMLDOM и загружены в него данные из файла...

Это, перед вызовом запроса Карлика:

XMLDOM             = 0;

не помогает...
291 MWWRuza
 
22.06.23
12:07
Вынести этот кусок из контекста обработки в отдельную функцию? Можно даже в ГМ... Или смысла в этом нет?
292 MWWRuza
 
22.06.23
12:22
Не помогает...
Так:

В обработке:
СзРеквПодпДДока    = ПолучитьДанныеДокаДляПодписания(ПутьКДоку);

В глобальном модуле:

Функция ПолучитьДанныеДокаДляПодписания(ПутьКДоку) Экспорт
    XMLDOM             = ЗагрузитьDOMизФайла(ПутьКДоку);    
КонецФункции

Все равно крашится...
XMLDOM - переменная глобальная, создается и инициализируется при старте системы... Больше ни на что не влияла никогда.
Да и тут не влияет, пока файл не откроешь.
293 MWWRuza
 
22.06.23
13:16
И еще, заметил одну особенность, не знаю, насколько это важно, но возможно разные ветки алгоритма:

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

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-539.jpg

А когда раскоментировано, и крашится, то вот так:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-540.jpg

Точки вместо результата...
294 MWWRuza
 
22.06.23
13:19
А, нет... Он просто не успевает вывести эту строку с человекочитаемым результатом... Крашится перед ней.
Когда не падает, эта строка тоже есть, выше.
295 MWWRuza
 
22.06.23
15:19
Но, из этого ясно одно - падает в самом конце, перед выводом результата.
296 MWWRuza
 
22.06.23
16:25
Сейчас попробовал не читать файл квитанции, а просто фейковые данные пихнуть в функцию создания документа через тот-же DOM. Документ создался, карлик не падает.
Значит, тут проблема не с самим DOM, а с тем, что открывается файд методом XML_DOM.load(путькфайлу).
Попробовать получать содержимое исходного документа другим способом? Например, через анализатор XML компоненты v7plus - ??? Не люблю я его, ну да ладно...
297 MWWRuza
 
22.06.23
18:58
(296) Попробовать получать содержимое исходного документа другим способом? Например, через анализатор XML компоненты v7plus - ??? Не люблю я его, ну да ладно...

Сделал. Вроде нормально работает, ничего не падает.
Права, у меня нет сегодня входящих доков, поэтому подписываю уже подписанный документ и получаю соответствующую ошибку. Но, это сейчас не важно, главное не крашится :-)

Правда там наверное придется еще в одном месте переделывать, там, где я ЭЦП отправителя из квитанции получаю, она там тоже через DOM читается, но, пока проверить не могу - нет дока входящего и соответственно нет квитанции. Сейчас я ему для отладки ЭЦП дока отправителя в готовом виде подсовываю, из файла текстового.
Но, теперь, причина понятна - не проблема переделать одну функцию :-)
298 MWWRuza
 
22.06.23
20:32
(297) Правда там наверное придется еще в одном месте переделывать, там, где я ЭЦП отправителя из квитанции получаю, она там тоже через DOM читается, но, пока проверить не могу - нет дока входящего и соответственно нет квитанции.

Не утерпел, проверил... Так-же вылетает, надо на v7Plus разбор XML квитанции переделывать.
299 princepersei
 
23.06.23
05:35
Не нашел код функции ЗагрузитьDOMизФайла()

XML_DOM бывали падения при создании xml документа, но там проблема была в другом, при смене кодировки для глобальной переменной XML_DOM.
Header = XML_DOM.createProcessingInstruction("xml", "version=""1.0"" encoding="""+Кодировка+""" standalone=""yes""" );
300 princepersei
 
23.06.23
05:45
(275) для ЭДО Лайт закачиваем архив с документооборотом и берем файлы .xml и ЭП .p7s

    Команда = "/api/v1/"+ ?(флВходящие = 1,"incoming","outgoing")+"-documents/"+СокрЛП(ИдентификаторДокумента);
    
    СпЗаголовки = СоздатьОбъект("СписокЗначений");
    СпЗаголовки.ДобавитьЗначение("Authorization", "Bearer "+ТокенЭДО);
    СпЗаголовки.ДобавитьЗначение("Accept", "application/zip");
    
    ПарамВыход     = СоздатьОбъект("СписокЗначений");
    
    ПарамВход = СоздатьОбъект("СписокЗначений");
    ПарамВход.Установить("Метод"        ,"GET");
    ПарамВход.Установить("Сервер"        ,СокрЛП(Сервер) + Команда);
    ПарамВход.Установить("СпЗаголовки"    ,СпЗаголовки);
301 big
 
23.06.23
05:48
(296) А можно этот файл посмотреть?
302 MWWRuza
 
23.06.23
11:28
(300) для ЭДО Лайт закачиваем архив с документооборотом и берем файлы .xml и ЭП .p7s

Не, я нашел(на ОлегОне подсказали) способ проще, не описанный в документации к API(вообще, жутко безобразная штука :-( )

"нужно получить титул продавца DP_PDOTPR, в нём ЭЦП находится

по этому адресу я получаю имя файла и eventId
/api/v1/incoming-documents/{0}/events/{1}

{0} - идентификатор документа
(1) - 112003"

Действительно работает, и не нужно из бинарной ЭЦП текстовую делать, в этом доке она готовой строкой в Base64 есть :-)

Блин, в описании ни слова про то, что можно получить список квитанций по типу... Там только получение списка неподписанных описано :-(

(301) Какой именно файл? ХМЛ-ку титула, или входящего дока?

Я сейчас переделал в процедуре подписания оба разбора XML, и входящего дока, и квитанции с ЭЦП отправителя, с DOM на v7Plus, работает, карлик не крашит 1С.
Сегодня УПД есть входящая, попробую подписать из программы уже полноценно, как товар привезут...
303 big
 
23.06.23
11:41
(302) Файл, на котором DOM рушится. Хочется взглянуть )
304 MWWRuza
 
23.06.23
12:09
(303) Хм... Да он на любом рушится, пофик.
Вот например УПД: https://cloud.mail.ru/public/zUTb/KB7hDeEyb

А потом, что значит DOM рушится? Почему именно DOM - ???
Рушится 1С, когда в DOM загружен файл, после отработки запроса карликом...
Само чтение ХМЛ с помощью DOM работает у меня в конфе несколько лет, и ни разу не рушилось.
Карлик, без загруженного в DOM файла - тоже работает стабильно.
Как только вместе - так падение. При чем, сам запрос отрабатывает(действие совершается, у меня так даже один док подписался и 1с после этого рухнула, зашел следующий раз - статус дока поменялся на "подписан и отправлен в гис"), падает в конце - при выводе результата.

Что они там между собой по ресурсам не поделили - мне на моем уровне не видно... Джеф, если захочет, разберется.
305 big
 
23.06.23
12:14
(304) Значит это я недопонял. Зачастую теряется нить обсуждения на таких длинных ветках ;)
306 Djelf
 
23.06.23
13:37
(304) Попробуй изолировать через МояФункция(Знач ИзDOM_Текст)
В карлик поступет копия данных, возможно что DOM портит внутреннюю структуру CString (это внутри 77), такое вроде неоднократно отмечалось, но не помню как найти, многогие ссылки уже умерли.
Пока ничего для обхода ситуации ответить не могу.
307 MWWRuza
 
23.06.23
16:54
(304) Попробуй изолировать через МояФункция(Знач ИзDOM_Текст)

Я пробовал. Но, я то не из DOM карлику значение пихаю... Я вначале строки получаю, парся ХМЛ через DOM, потом много чего с ними еще делаю для формирования титула(опять-же, формирую окончательно XML-ку титула так-же DOMом, НО, ЭТУ ХМЛ КАРЛИК СЪЕДАЕТ И НЕ ПАДАЕТ), а падает только тогда, когда я перед выполнением запроса карликом, но в этой-же процедуре, открываю файл DOMом... Даже просто так, не передавая этот открытый DOMом ХМЛ, или стоки из него в запрос. Так, что изолировать бесполезно. Куда уж тут изолированнее, если просто не используется.
И кроме того, если-бы карлику не нравились полученные данные, он бы падал в начале, или в процессе работы, а тут, он падает в конце, когда запрос успешно отработал, и нужно только результат вывести. Такое ощущение, что он пытается передать результат своей работы в область памяти, занятую DOMом...

Рабочую уже переделывать не буду, там все функционирует идеально, когда парсинг входных ХМЛ на v7Pus сделал(XML титула по прежнему формирую DOMом), а в тестовую обработку, для экспериментов, добавлю загрузку одного из файлов в DOM, сразу будет все понятно...
308 MWWRuza
 
23.06.23
17:00
А ведь работает, зараза :-)

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-541.jpg

Сколько времени и нервов отняло, но получилось...
Осталось сделать подписание квитанций о просмотре, при первой загрузке документа(а то они сейчас так и висят в списке не подписанных), и все.
Ну, с отказами, уточнениями и прочей лабудой, буду позже разбираться.
309 Djelf
 
23.06.23
21:48
Эх... Это уже шаманизм...

...
Если этого ужа,
Приготовив два ножа...
Впрочем, он, наверно, сдохнет...
Но идея хороша!..
310 MWWRuza
 
24.06.23
17:49
(309) Ну, ежи, ужи, ножи - это хорошо.
Но, далеко от темы сабжа.
Доделал, навел сделал автоматическое подписание квитанций о просмотре, "красивости" навел, подкрасил статусы в цвета web-ЛК ЭДО Лайт, пусть работает.

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-542.jpg

А с карликом... Если Джеф не против, создам новую ветку, в 7.7. Написал обработку для теста, и вместе с необходимыми файлами выложу.
Там в комплекте, текстовые файлы - файл титула, файл ЭЦП для него, и XML-ка(вообще - пофик, можно любую взять, без разницы).
ЭЦП для работы не нужна, нужен только токен авторизации.

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-543.jpg

Так, как это "боевой" контур реального клиента, в общий доступ еговыкладывать не буду - отправлю Джефу на почту, из редмишки к карлику.
Живет он 12 часов, соответственно, буду высылать "по первому требованию" :-) , не проблема, у меня он одной кнопкой формируется.

Там в обработке "галочка", грузить/не грузить DOM. С галочкой - крашится, без нее - нет, просто выводит ошибку, что док уже подписан(это так и есть).
311 MWWRuza
 
24.06.23
18:29
+(0) Должно быть вот так:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-543.jpg

Имя файла и ИД документа из текста мудуля подставляются автоматом, пути к файлам токена, титула и его ЭЦП надо выбрать к файлам из архива.

XML тестовая - есть в комплекте, но, вообще, может быть произвольная, не принципиально, в обработке данные из нее не испольхуются, только в DOM загружаются, при установленной "галочке".

Я думаю, для теста и поиска бага - самое то...
312 MWWRuza
 
24.06.23
18:29
Блин, не туда запостил :-(
313 MWWRuza
 
25.06.23
17:04
(300) для ЭДО Лайт закачиваем архив с документооборотом и берем файлы .xml и ЭП .p7s

    Команда = "/api/v1/"+ ?(флВходящие = 1,"incoming","outgoing")+"-documents/"+СокрЛП(ИдентификаторДокумента);

Да вот как-бы не пришлось переделывать, и тоже так делать...
Сегодня, у дугого клиента поймал проблему - в документе DP_PDOTPR нет тега ЭПОтпрФайл... Зато, есть в нем тег ЭЦППолФайл, и в нем подпись оператора, самого ЦРПТ... С чего-бы это?
Непонятно, где ЭЦП отправителя брать в таких случаях. Ранее, во всех доках, которые я видел, в нем была, в теге ЭПОтпрФайл в готовом виде.

А архив ДО скачать не проблема, и ихвлечь из него файл ЭФП дока тоже не проблема. Но, там он бинарный, в формате p7s, и с таким-же расширением...
Как Вы из него получаете ЭЦП текстом в Base64, для вставки в титул?
314 MWWRuza
 
25.06.23
18:36
Отвечу сам себе...
Тут, как оказалось, нет ничего сложного - просто этот файл надо закодировать в Base64...
Гиморой конечно, с получением ЭЦП из квитанции отправителя проще, но зато надежнее - файл эцп самого документа в бинарном формате есть всегда, а с квитанциями, как мы видим, разные чудеса случаются :-(
315 big
 
25.06.23
19:26
Какой-то цирк с конями это ЭДО-НЕДОлайт ((((
316 NorthWind
 
25.06.23
22:50
(313) > Сегодня, у дугого клиента поймал проблему - в документе DP_PDOTPR нет тега ЭПОтпрФайл... Зато, есть в нем тег ЭЦППолФайл, и в нем подпись оператора, самого ЦРПТ... С чего-бы это?

Версии квитанций в начале месяца должны были поменяться, там как раз названия этих тегов зачем-то поменяли. Но все ли участники  поменяли версии квитанций на данный момент - вопрос. Вы это учли?
317 MWWRuza
 
25.06.23
23:09
Я решил забить на квитанции, раз там такой "зоопарк"... Да и проблема то не в именах тегов а в содержимом - нафик мне ЭЦП оператора, когда мне нужна ЭЦП отправителя?
Переделал на скачку архива, извлечение из него файлов по маске(формирую из ID документа), там получаются два файла с одним именем - один XML, и второй ЭЦП к нему. Его кодирую в Base64, и полученную строку использую для формирования титула. В этой схеме, мне квитанции как-бы и не нужны.
318 MWWRuza
 
26.06.23
10:02
+(317)
Единственное, что мне не очень нравится в этой схеме, это то, что 1с77 не умеет сама работать с архивами, и для этого приходится использовать очередную внешнюю компоненту...
Из всех имеющихся, умеющих это делать, мне больше всего понравилсь "DialMail.dll". Ранее, в конфе нигде не использовалась, но, из-за архивов пришлось прицепить ее...
Вроде работает, стабильно, ни с чем не конфликтует... Но, после борьбы с "карликом", который конфликтовал с XmlHttp DOM, у меня какое-то чувство настороженности.
Я когда переписал обработку, уже так при первом тестировании и ждал - рухнет или нет
Вроде нет, работает стабильно.
Но, все равно, при первой возможности, переделаю на шел из винды с помошью скрипта -
в винде есть встроенные средства работы с ZIP архивами, логично их задействовать, а не использовать внешние костыли(внешние компоненты).

Ни у кого нет примеров готовых скриптов под 7.7. для работы с ZIP-архивами - ?
Нужно - получить список имен файлов из архива, и извлечь из него файлы по маске(маску формирую как "*" + <ИдДокумента> + ".*").
DialMail.dll прекрасно с этим справляется, но, хочется уйти от лишней ВК...
319 big
 
26.06.23
10:17
(318) Если используется 1СРР, можно её архиватором пользоваться
320 MWWRuza
 
26.06.23
10:21
Она есть, и грузится, но, толком нигде не используется. Плотно используется везде только FormEx, но, в нем вроде нет такого.
А из 1СРР - я не нашел вменяемого описания методов и свойств работы с архивами. Может плохо искал :-)
321 MWWRuza
 
26.06.23
10:24
С ДиалМайл все очень просто получается:

Функция УстановитьКомпоненту()    
    Если ЗагрузитьВнешнююКомпоненту("DialMail.dll") = 0 Тогда
        Сообщить("Не удалось обнаружить компоненту DialMail.dll!");
        Возврат 0;
    КонецЕсли;
    Попытка
        ZIP = СоздатьОбъект("AddIn.ZIP");  
    Исключение
        Сообщить("Не удалось создать объекты из компоненты DialMail.dll!");
        Возврат 0;
    КонецПопытки;
    Возврат 1;
КонецФункции

Функция ИзалечИзАрхива(ИдДока, ПутьКАрхиву)
    УстановитьКомпоненту();
    ZIP.КаталогИзвлечения = КаталогВременныхФайлов();
    КолФайлов     =     ZIP.Извлечь(,"*" + Врег(ИдДока) + ".*", ПутьКАрхиву);
    Если ZIP.КодОшибки = 0 Тогда
        СЗ      = СоздатьОбъект("СписокЗначений");
        Сч         = 0;
        Для Сч = 1 По ZIP.КоличествоФайлов() Цикл
            ИмФвАрх    = ZIP.ПолучитьИмяФайла(Сч);
            Если Найти(ВРег(ИмФвАрх), ВРег(ИдДока)) > 0 Тогда
                 СЗ.ДобавитьЗначение(ИмФвАрх);  
            КонецЕсли;
        КонецЦикла;
        Возврат СЗ;
    Иначе                                                
        Сообщить("Ошибка работы с архивами: код " + ZIP.КодОшибки + ": " + ZIP.КодОшибкиСтр);
        Возврат 0;
    КонецЕсли;
КонецФункции
322 big
 
26.06.23
10:28
(320) Класс BinaryData.

pkZip
Синтаксис: pkZip(Команда)

Параметры:
Команда - тип Строка. Командная строка архиватору. Формат командной строки:

[-s[пароль]] имя_и_путь_создаваемого_архива имя_и_путь_архивируемого_файла(ов)
Описание: сжимает файлы внутренним архиватором. Метод не влияет на состояние и на данные объекта.

pkUnzip
Синтаксис: pkUnzip(Команда)

Параметры:
Команда - тип Строка. Командная строка архиватору. Формат командной строки:

[-s[пароль]] имя_и_путь_архива путь_к_каталогу_назначения
Описание: разжимает файлы внутренним архиватором. Метод не влияет на состояние и на данные объекта.
323 MWWRuza
 
26.06.23
10:58
(322) Спасибо. Но, это я видел. Как-то бедненько...
Нет похоже метода извлечения файлов по маске... И списка имен тоже нет. А их там, в каждом архиве "100-500" :-)
Если их каждый раз все извлекать, то через месяц работы, место на диске кончится :-)  
Или придумывать какую-то схему "чистки мусора" за собой, после отработки дока...
Опять-же в какое время? По какому принципу? По маске тут не пойдет - там не все файлы содержат ИД документа, там и другие есть...
По маске удалять файлы - я могу только сами архивы и извлеченные из них XML и ЭЦП(p7s) этого XML, там это прокатит.
Правда, пока не придумал в какой момент и чем инициировать эту очистку...
После подписания? Ну, можно, но, вдруг подпишут раньше, чем загрузят файл в 1С, сразу после просмотра(до просмотра кнопка "подписать" у меня не доступна) - ?
В принципе, все равно загрузится, но, это пара лишних секунд - опять получение файла XML заново. Не страшно, может так и сделаю.
324 MWWRuza
 
26.06.23
11:02
Можно конечно внутри КаталогаВременныхФайлов создавать подкаталог с именем по ИД Документа, помещать все в него, и потом прибивать его целиком. Тогда это решает проблему удаления файлов по маске - оно просто не нужно становится.
Подумаю...
325 MWWRuza
 
26.06.23
11:38
(317) Да и проблема то не в именах тегов а в содержимом - нафик мне ЭЦП оператора, когда мне нужна ЭЦП отправителя?

Ошибся я... Видимо заработался. Все-таки, там эцп отправителя, видимо, из-за не совпадающего имени тега, откуда-то не от туда подтянул ЭЦП:

https://storage.olegon.ru/supermag/1С/Markirovka/ПровЭЦП.jpg

Посыпаю голову пеплом... Бывает, не ошибается только тот, кто ничего не делает :-)
С этим ЭДО Лайт, уже ни чему не удивляюсь.
Извиняюсь, что ввел в заблуждение...
326 MWWRuza
 
26.06.23
11:40
327 АгентБезопасной Нацио
 
26.06.23
13:53
(323) в калатоге временных файлов - временный каталог. вы ж не на сервере обрабатываете, а локально. значит, при перезагрузке машины он почистится.
328 MWWRuza
 
26.06.23
14:31
Сейчас посмотрел у клиента... А там - их милЬЁн, почти три гига... Удивлся, а потом понял,система хоть и не сервер, а обычная семерка проф, но, комп там не выключают и не перезагружают неделями - там алкашка, а значит УТМ, а время торговли алкоголем не мовпадает со временем работы оператора, который имеет доступ к этому компу... Поэтому, там временный каталог пухнет как на дрозжах. Надо будет им планировщик настроить на ночную перезагрузку, хотя-бы раз в неделю.
329 Djelf
 
26.06.23
15:40
Ну... в sqlite есть для этого расширение, оно все это умеет, но это опять еще одна ВК и еще одно расширение к ней ;)
Не прокатит, нужно же без ВК, без расширений и чтобы из 7.7 работало нативно.
Так? В принципе можно, через shell.explorer вроде как можно.
330 АгентБезопасной Нацио
 
26.06.23
15:48
(328) три гига - не так уж и много. а если планировщик - то можно и  на принудительное удаление, если уж настраивать. тем более, в клюшках - хоть подключение и асинхронное, процессы все равно синхронные, можно и чистить за собой. Хороший тон...
331 Djelf
 
26.06.23
15:53
(330) Да, это небольшие объемы, по сравнению с парой киношек.
Я, например и не парюсь, все что проходит через егаис пихаю в базу sqlite и чистить даже не собираюсь.
Разве что марок у меня нет... Но это тоже решаемо, сжатие таблиц никто отменить не сможет.
332 АгентБезопасной Нацио
 
26.06.23
15:55
(331) просто воспитание такое: лишний килобайт оперативы - порка, а за лишние  100 байтов в канал - расстрел.
333 Djelf
 
26.06.23
16:25
(332) Я тоже экономлю, но я экономлю экономичнее!

В sqlite можно очень много чего запихать, от чего клюшки треснут и взорвутся.
Накладные расходы? Да я вас умаляю... меньше метра занимает 1sqlite со всеми приблудами, с match, c fts5, c json и т.д. и т.п.
И при этом работает значительно быстрее ключшек с базами, которые туда вообще никак не влезут.
Я не спорю что MSSQL лучше, ну да лучше, но он как-то и побольше одного метра sqlite...
Забудь уже про "640 КБ должно хватить всем". И кстати! sqlite, хотя и вышел за этот запрет, но за пределы 1 метра он он еще не готов выйти.

1scurl, да, он пухлый, 2 метра сейчас, но туда напихахано чёрт знает что.
Но должен работать вообще со всеми протоколами, не уверен что я должен решать какие протоколы стоит вырезать.
334 АгентБезопасной Нацио
 
26.06.23
17:34
(333) >>Забудь уже про "640 КБ должно хватить всем".
Просто это слишком долго забывалось... в ущерб работе, увы.
335 big
 
27.06.23
04:37
(328) Если 7.7 не выключается, то временные файлы она "держит", их не удалишь. Буквально 2 недели назад столкнулись с этим, когда два робота ВетИс-Меркурия (из двух разных баз!!!) гадили в одну Temp-папку. Из-за этого у них иногда пересекались имена временных фалов DBF от результата запроса. А выяснилось как - в одном роботе добавили ещё одно поле в запрос и начались обвалы системы с "Не найдено поле N". Пришлось разнести базы по разным папкам Temp, есть в такая опция при запуске 7.7

з.ы. и пока из 7.7 не выйдешь, эту кучу DBF от запросов не удалишь - файл занят другим процессом.
336 MWWRuza
 
27.06.23
08:27
(327) в калатоге временных файлов - временный каталог. вы ж не на сервере обрабатываете, а локально. значит, при перезагрузке машины он почистится.

Да вот, не особо то он и чистится... Сегодня включил свой комп(на ночь был выключен), не открывая 1С заглянул в КаталогВременныхФайлов, и вот:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-545.jpg

То, с чем "игрался" вчера.
Так, что похоже придется чистить мусор самостоятельно.
337 MWWRuza
 
27.06.23
08:33
(335) з.ы. и пока из 7.7 не выйдешь, эту кучу DBF от запросов не удалишь - файл занят другим процессом.

Ну, это файлы, создаваемые самой 1С. Так и должно быть. Они удаляются по большей части при корректном выходе из 1С, автоматом.
О моих-же файлах, 1С ничего не знает. Соответственно - не удаляет. И не держит, они спокойно удаляются инерактивно, при запущеной и просто свернутой 1С. Проверил :-)
338 NorthWind
 
27.06.23
08:50
(337) начиная с Win10 можно настроить, чтобы винда автоматически удаляла ненужные файлы, в том числе из темпов. Но совершенно необязательно что она это сделает при перезагрузке именно с теми файлами, про которые вы думаете. Как я понимаю, там просто слежение за свободным местом, поэтому она может удалить совершенно другие файлы, или вообще ничего не удалить, если решит, что сейчас это не надо. И по умолчанию, по-моему, это дело для темпов отключено, его еще включить надо где-то там в "хранилищах" надо.
339 MWWRuza
 
27.06.23
09:58
Хм... Да что там голову морочить особенностями разных ОС и их "тонкими" настройками :-)

Сделал у себя, по принципу - в процедуре подписания документа, смотрю, что он загружен в базу 1С, и есть ПоступлениеТМЦРозница соответствующее этому УПД, и если подписание удачное - статус дока в ЭДО поменялся, то удаляю каталог.
Аналогично, если загружаю док в базу, то потом, при закрытии дока ПоступлениеТМЦРозница, генерю внешнее событие и в обработке ЭДО Лайт ловлю его и смотрю, если док в статусе подписан - удаляю временный каталог.
Так оно спокойнее будет.
Есть там конечно нюансы - например, загрузили док, и закрыли обработку ЭДО Лайт, до закрытия загруженного документа, в таком случае некому будет удалять, но, это частные случаи, ничего страшного(можно конечно это удаление и в доке ПоступлениеТМЦРозница делать, но, как-то лениво).
340 MWWRuza
 
27.06.23
10:05
+(339) А вообще, сейчас пришла в голову идея - проще и правильнее, наверное, это делать при обновлении списка документов в обработке(при открытии, при выполнении каких-то действий, или по кнопке) - если статус подписан, и документ загружен, то и каталог можно удалить.
341 MWWRuza
 
27.06.23
10:13
+(340) Этим, кстати, мы обойдем еще одну проблему - статус дока на сервере, может поменяться не мгновенно, а через несколько секунд, когда процедура подписания уже отработала. В этом случае чистки не будет.
А при обновлении списка, которое будет рано или поздно(при следующем открытии или пользователь на кнопочку "Обновит список" жмакнет) - все равно почистится.
342 MWWRuza
 
30.06.23
12:43
Все, финиш:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-548.jpg

Работает на продуктиве, все ОК.
Больше не знаю, что еще добавить :-)
343 Djelf
 
30.06.23
14:30
(342) Как это не знеешь? оО
1. Например счетчик документов едо за год, чтобы внезапно все не сломалось.
2. Переписать тз на тп (1с++), это и сортировки, и фильтры по клику на заголовке, и динамические фильтры по быстрому поиску строки, и много его чего придумать можно.
Да, такие "подвиги" не оценят, но тут весь "подвиг" в освоении этого достаточно простого навыка, это займет время, но не так много.
Имхо стоит освоить, я уже как-то с тп уже совсем сжился, мне сейчас раз в 10-1000 проще на тп что-то ваять, чем на тз.
Потыкай пример: https://cloud.mail.ru/public/iEgz/owsfxgduj это очень просто...
344 АгентБезопасной Нацио
 
30.06.23
14:39
(343) подтверждаю! освоив прямые запросы, табличное поле - делать на них становится гораздо проще и эффективнее.
зы. можно вместо ТП сразу использовать ПоставщикДанных
345 Djelf
 
30.06.23
14:47
(344) В ПоставщикДанных есть шероховатости на новых движках, патчи я постил, но кто ж из найдет.
Но на dbf-версиях 1sqlite невероятно крут, это же возможность использовать и соединять внешние таблицы sqlite одновременно со внутренними таблицами 1С 7.7
Может ли осилить такое ваша 8ка? Не уверен...
346 Djelf
 
30.06.23
14:51
Мне все равно придется на 8ку, затраты шеф уже не простит ;)
Казалось что пиво и вода будут значительно жестче, но тут я не угадал, это для опта сейчас супер лайт-версия.
347 АгентБезопасной Нацио
 
30.06.23
14:56
(346) имея опыт с нормальными запросами и нормальными ТП, не только с ТЗ - на снеговика переползать гораздо проще, чем можно подумать. а из радикальных преимуществ - пожалуй, только СКД
348 MWWRuza
 
30.06.23
17:14
(343) Да делал я когда-то на ТП, вот, этот документ, как раз на ТП сделан:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-549.jpg

Только, в данном случае, когда доков 1-2 в день-через день, это излишне...
По той-же причине, счетчик, так-же излишен - эта несчастная 1000 доков в год ограничение ЭДО Лайт, как я понял, в нем только для исходящих доков, входящие не ограничены.
А их, если и будут - то и десятка не наберется(редкие возвраты если только? Я их все равно пока не делал через API, тестировать не на чем)... Поэтому, смысла нет считать доки.
Да даже если и не так, и считаются в эту 1000 и входящие - то никто не запрещал грузить доки из файлов скачаных из ЛК. Эту возможность я не блокировал, просто обработку работы с документом нужно грузить не из этой обработки, а из журната приходных документов.
349 big
 
30.06.23
19:36
(348) 1000 документов в год - это исходящие подписанные через API. Если же их загружать неподписанные, то ограничений нет. В ЭДО-лайт будут загружены как черновики, потом их в WEB-интерфейсе можно интерактивно подписывать. Это есть у них в документации, кстати. А на входящие ограничений нет.
350 АгентБезопасной Нацио
 
30.06.23
19:44
(348) просто имеет смысл все делать "хоть безобразно, но однообразно".
(349) несколько дней назад родилась мыслЯ™ - а если сделать заполнение через веб-морду, но скриптом? :-) так сказать, "обмануть систему"...
351 big
 
30.06.23
20:04
(350) п.2   Там перед операцией с ЭЦП появляется окошко с вопросом а-ля "можно ли произвести операцию с ключом бла-бла-бла..."  Скрипт сможет кнопку ОК нажать?   А перед этим, кстати, из выпадающего списка нужный ключ выбрать? ЧЗ выкатывает ооочень большой список - даже тех ключей, которые уже удалены давно.
352 MWWRuza
 
30.06.23
20:31
(350) а если сделать заполнение через веб-морду, но скриптом? :-) так сказать, "обмануть систему"...

А смысл этого? Работает и через API, вообще без проблем, быстро, удобно, список заполняется с кучей отборов, постранично, страницы можно листать, в программу доки загружаются, все подписывается.
А кому нужно больше 1000 исходящих в год, ну, например каким-то оптовикам или производителям, те не будут связываться с ЭДО Лайт, а подключат полноценного оператора, того-же "Диадок" или "СБИС".

(350) "хоть безобразно, но однообразно". :-)

В моем случае, это без ТП. Тот док, который в предыдущей моей месаге, так и остался не востребованным. Я его делал больше из "спортивного интереса", с ТП поиграться.
У меня у всех работает отчет "Алкогольная декларация", давно, с 2012 года, вполне успешно. Документ был задуман как альтернатива отчету, для возможности ручного заполнения/правки данных и хранения их в документах, а не получения "на лету" из итогов. Но, как-то особо никому не потребовался, все сдают как есть, по данным учета, а скоро ее совсем отменят, когда маркировку на пиво введут, как уже отменили для маркируемого алкоголя.
Так, что, скоро станет совсем не нужным.
А больше, на ТП у меня в конфе и нет ничего, как-то не было необходимости, не те задачи.
353 MWWRuza
 
30.06.23
20:57
(351) ЧЗ выкатывает ооочень большой список - даже тех ключей, которые уже удалены давно.

Это не ЧЗ выкатывает(где он их возьмет? :-) ), а это сертификаты от этих ЭЦП присутствуют у Вас в системном хранилище.
Просто Вы удалили контейнеры с сертификатами и ключами, а копии сертификатов(без ключей) в хранилище остались.
Если таким сертификатом попробовать авторизоваться в ЧЗ или еще где-либо, или подписать что-то, КриптоПро запросит доступ к носителю с контейнером ключей.
354 Djelf
 
01.07.23
04:26
(348) Не обманешь, это не ТП, это Йоксель ;)
355 MWWRuza
 
01.07.23
07:18
(354) Вот ни сколько не собирался :-)
Похоже, просто сам забыл, с чем работал(давно это было), так, как у Йокселя тоже есть свой табличный документ(а не таблисное поле, как у 1cpp).

Вот, это на форме:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-551.jpg

А это в модуле:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-550.jpg

Действительно Йоксель :-)
356 big
 
03.07.23
04:50
(353) Список к показу готовит именно ЧЗ. И критерии включения в этот список заложены мозголомами из ЧЗ. Удаляя ключи средствами КриптоПро и если там остаются некие "хвосты" и недействующие ключи, то на фейхоа их показывать пользователю? Похоже вываливают всё, что болтается в Личном хранилище. Считаю это крайне непрофессиональным подходом.
357 victuan1
 
03.07.23
08:38
(356) Да, вываливает что в Личном хранилище. Просто через certmgr.msc удаляю лишнее, и оно не светится в списке выбора при входе в ЛК ГИСМТ.
358 MWWRuza
 
03.07.23
08:46
(356) Ну, да, чудес не бывает - но, тут они явно чего-то намудрили...
Основную часть списка, подтягивают из системного хранилища, но, дополняют его сертификатами, которыз давно нет на компе в хранилище, но по которым вход когда-либо осуществлялся с этого компьютера.
Странно звучит, но факт. По какому признаку они их у себя отбирают и как сопоставляют с текущим рабочим местом - загадка...

Вот, изначальный список сертификатов для входа, на моем компе на сегодня - их там "мульЁн", видно по маленькому движку линейки прокрутки.

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-552.jpg

Вот, хранилище, после этого, удалил все лишние.

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-553.jpg

А вот, после удаления. Движок линейки прокрутки стал шире, в несколько раз, их там сильно поубавилось, но, если прокрутить список ниже, то там присутствуют сертификаты, которых нет в хранилище, соответственно я не могу их удалить, но, когда-то я под ними заходил в ЛК ЧЗ.

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-554.jpg

Как-то странно, но так.
359 MWWRuza
 
03.07.23
08:53
(357) Просто через certmgr.msc удаляю лишнее

А кстати, да. Через браузер не все виды, и соответственно не все можно удалить, а через утилиту - все.
После удадения утилитой, лишние исчезли из списка выбора ЧЗ.
360 MWWRuza
 
03.07.23
09:08
+(357)(359) Встроенное в осла(IE) средство управления сертификатами, через меню "Содержание", как-то не совсем полноценно работает. В нем, в списке "другие пользователи", увидел старый сертификат одного из моих клиентов - там ему точно делать нечего, видимо когда-то добавил по ошибке, случайно. Хотел удалить - а кнопка удаления не активна. Через утилиту удалился нормально, и оттуда исчез тоже.
361 MWWRuza
 
03.07.23
09:25
Хоть руки дошли почистить мусор :-)

Сейчас там только три, два моих - один мой личный, как ИП, выданный в ФНС, второй, тоже мой, на меня, как сотрудника - "Администратора" "ВЕГА", и третий тестовый ФСРАР для работы тестового контура УТМ от той-же "ВЕГИ":

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-555.jpg

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-556.jpg

Правда, второй и третий, там повторяются дважды - видимо, плагин один раз подтягивает их из хранилища, а второй, с аппаратного ключа(он сейчас вставлен). Входит по любому - и по тому, который в хранилище, и по второму. Но, естественно, только при вставленом ключе.
362 MWWRuza
 
03.07.23
23:49
Добавил запрос уточнения и запрос анулирования.
Правда, пока не проверял, не на чем, но теоретически - должны работать :-)
363 MWWRuza
 
05.07.23
17:24
Вот тебе и "приехали", гладко было на бумаге, да забыли про овраги:

https://content.foto.my.mail.ru/mail/m_w_w/_mypagephoto/h-557.jpg

Уперлось в ограничение длины строки в 1с77... УПД - большой, более 40 строк документа.
Строка здесь, это контент ХМЛ подписываемого УПД, который не умеет передавать карлик в теле мульттипарт запроса в виде файла(ссылки на файл), а может только строкой...
На небольших УПД, порядка 10-15 строк, это прокатывало. А на 40 строках - встряло, ХМЛ переведенный в одну строку, похоже превысил допустимую длину :-(

Djelf в (144) писал: (133) У меня вся отсылка из строк идет, файлы не поддерживаваются. Можно допилить, но таких ообъемов сложно достичь чтобы через файлы данные гонять.

Похоже, оказалось не очень сложно.
Это реально? Или проще забить на использование карлика, и переделать на чистый curl из командной строки?
Не хочется, уж больно карлик понравился :-)
364 MWWRuza
 
05.07.23
17:37
Хотя, сейчас посмотрел, не должны размеры документа влиять на длину подписываемой, и передаваемой на сервер строки... Там, в титуле не передается контент документа, только его ЭЦП. Буду смореть, похоже еще где-то узкое место.
365 MWWRuza
 
05.07.23
19:09
Все оказалось проще - эти клиенты ранее подписывали серез сайт, и ничего мне об этом не говорили, как так и надо...
А оказывается, там бухгалтер, на которого ЭЦП оформлена, не был зарегистрирован в справочнике "ФизЛица".
А при формировании титула, я брал ФИО подписанта по ЭЦП, но из справочника ФзЛица. Он там не находил его, и отправлял титул с пустыми полями Фамилия, Имя, Отчество.
На что сервер ЭДО выводил свою любимую ошибку "400", и длинную строку комментария этой ошибки, которую я выводил в табло 1С, когда статус ответа не 200 или 201.
Соответственно, такая строка не лезла в табло, выводила ошибку... И так, как в табло ошибка не выводилась, то и не понятно было, почему...
Хорошо, я хоть сразу, когда делал, предусмотрел запись этой строки в файл, перед выводом в табло...
Просмотрев этот файл, понял, в чем дело, добавил подписанта в справочник ФмзЛиц, и все полетело :-)

PS Добавлю проверку на наличие подписанта в справочнике, и при отсутствии его там, соответствующее предупреждение и прерывание процедуры, как не имеющей смысла при таких условиях.
366 MWWRuza
 
05.07.23
19:14
(363) Похоже, оказалось не очень сложно.
Всетаки, наверное действительно сложно.
Вопрос снят, табло и просто длина строковой переменной, это совершенно разные вещи...
367 MWWRuza
 
05.07.23
19:43
+(365) и длинную строку комментария этой ошибки, которую я выводил в табло 1С, когда статус ответа не 200 или 201.

А вообще, эта строка - это JSON. Можно его прочитать в список значений, и в "удобоваримом" виде вывести в табло, для понимания в чем ошибка.

Вопрос - можно как-то из ответа карлика, понять тип возвращаемого значения, что это обычная текстовая строка или JSON - ? Или только по первым/последним символам ответа анализировать?
368 Aleksey
 
05.07.23
21:58
(367) прjсто перед выводом обрезать выводимую строку, либо через сред() выводить порционно, типа
Ответ=ТвояДлиннаяСтрокаОтвета;    
Пока ПустоеЗначение(Ответ)=0 Цикл
   Сообщить(Лев(Ответ,200));
   Ответ = Сред(Ответ,201);
КонецЦикла;
369 MWWRuza
 
05.07.23
22:25
(368) Да я уже вот так сделал:

                ОписОш        = "Ошибка " + СокрЛП(СтрОшибка) + " " +  СокрЛП(Ответ);
                Тхт            = СоздатьОбъект("Текст");
                Тхт.ДобавитьСтроку(ОписОш);
                Попытка
                    Тхт.Записать("C:\Temp\ОшОтпр" + ИД + ".txt");    
                Исключение
                КонецПопытки;
                Если (Лев(Ответ, 2) = "[{") И (Прав(Ответ, 2) = "}]") Тогда
                     СзОтв    = глРазборJSON(Ответ);
                     Сч = 0;
                     Для Сч = 1 По СзОтв.РазмерСписка() Цикл
                         Предст = "";
                         Зн    = СзОтв.ПолучитьЗначение(Сч, Предст);
                         Сообщить("Ошибка " + Зн.Получить("err_type") + " " + Зн.Получить("err_message"));
                     КонецЦикла;
                Иначе    
                    Сообщить(ОписОш);    
                КонецЕсли;

Просто думал вот это: "Если (Лев(Ответ, 2) = "[{") И (Прав(Ответ, 2) = "}]") Тогда" - определение, что вернулся JSON, более красиво разрулить.
370 MWWRuza
 
05.07.23
22:36
Тут, в отличии от ЕГАИС, разработчики API ЦРПТ не поскупились на расшифпровки ошибок, на каждый не верный тег или атрибут XML своя строка в ответе.
Это там получив скупое описание ошибки, гадаешь, "что-бы это значило". Здесь, сразу все понятно.
Единственное, он номера строк файла XML выводит на каждую ошибку, но так, как XML передан одной строкой - везде 1.
Но, тут ничего не поделать. Все равно лучше так чем никак :-)
371 Aleksey
 
05.07.23
23:12
(369) и опять оставил потенциально опасное место, если стрдлина(ОписОш) будет > 250 и это не json, то опять будет таже самая ошибка
372 Djelf
 
05.07.23
23:30
Да, елы палы... Опять 25!
Перехватчик.ВключитьРазбиениеДлинныхСтрокДляМетодаСообщить();
GPT вам это не сообщит. Это же тайные знания 1с++ для 1с 7.7!

    ЗагрузитьВнешнююКомпоненту("1cpp.dll");
    УправлениеНастройками = СоздатьОбъект("УправлениеНастройками");
    УправлениеНастройками.Включить("ПерехватитьСобытияГК");
    Перехватчик=СоздатьОбъект("Перехватчик");
    Перехватчик.ВключитьРазбиениеДлинныхСтрокДляМетодаСообщить();
373 MWWRuza
 
06.07.23
09:40
(371) Я сейчас посмотрел, а там только два варианта - или пусто, если статус 200 или 201(если пусто - я сам пишу: "Документ успешно подписан!"), или, если ошибка, то строка JSON...
Других вариантов то и нет.

(372) Да, мы это проходили с тобой, когда работу с карликом я отлаживал. Мне понравилось, действительно построчно выводит.
Но тут, я просто не ожидал, что это при обычной работе понадобится.

А так, парсинг JSON в этом месте более правильный вариант...
Зачем юзверю любоваться на все эти "фигурные, квадратные и прочие скобочки" синтаксиса JSON :-) , когда можно получить строки ошибок в удобочитаемом виде?
374 MWWRuza
 
06.07.23
09:48
+(373) или, если ошибка, то строка JSON...

Просто до этого, у меня все ошибки были "короткие", которые были естественны в "стадии экспериментов", ну, типа "Документ вида 504 в статусе 61 не может быть подписан", это тоже был JSON, но, я на это просто не обратил внимание и выводил в табло так, без разбора. Строка короткая, пролазила. А тут, строка оказалась длинная - там два тега ФИО, и в каждом по 3 поля - фамилия, имя, отчество. Итого, 8 строк. Соответственно в JSON эта строка очень длинная, и в табло естественно не полезла.