Имя: Пароль:
1C
1C 7.7
v7: Ошибка MFC42.DLL(память не может быть read)
,
0 sergei10006
 
03.02.20
12:12
Здравствуйте уважаемые друзья! Срочно нужна помощь,помогите плиз. Пишу обмен с МДЛП на 1С 7.7 платформа(027). При загрузки данных сравнительно не большого объема(от 500 килобайт) в любой com объект возникает
ошибка
"Ошибка MFC42.DLL
исключение unknown software exception 0x800000fb в приложении по адресу 0x.......
инструкция по адресу 0x....... обратилась к памяти по адресу 0x....... Память не может быть read"
При чем такая ошибка возникает как на сервере так и на локальных ПК и под разными версиями ОС. Как можно обойти этот глюк платформы? Или это не глюк платформы? Но почему он возникает на совершенно разных машинах?
Вот пример:
   CDO=СоздатьОбъект("CDO.Message");
   БодиПарт=CDO.BodyPart;
   Поля=БодиПарт.Fields;
   Поле=Поля.Item("urn:schemas:mailheader:content-type");
   Поле.Value="text/plain; charset=""windows-1251""";
   Поля.Update();
   Stream = БодиПарт.GetDecodedContentStream();
   Stream.charset = "windows-1251";
   Stream.WriteText(Стр);//Вот тут, если текст больше 500 кб то система отваливается.
   Stream.Flush();
   БодиПарт.ContentTransferEncoding = Кодировка;
   Stream=БодиПарт.GetEncodedContentStream();
   Возврат Stream.ReadText();
Пробовал запускать этот код и из под 8.3, там все ок.
Вот сижу и думаю писать внешние dll или все таки можно найти решение.
Пробовал отключать службу DEP, добавлять память в файл подкачки,копировать mfc42.dll в корень 1С 7.7 ни чего не помогло(
1 Ёпрст
 
03.02.20
12:26
в реестре один параметр поправить
2 sergei10006
 
03.02.20
12:35
"в реестре один параметр поправить"
А какая ветка и какой параметр? Можно по подробнее ?
3 trad
 
03.02.20
12:38
(1) чито? O_O
4 Kigo_Kigo
 
03.02.20
13:10
(3) Тут наверно должна прозвучать фраза (1) "Круасафчег памаги" Бгггг :)))
5 Ёпрст
 
03.02.20
13:22
(3) не чито, спутал с открытием большого количества окон в терминале, там помогала правка параметра в реестре
6 sergei10006
 
03.02.20
13:25
(5) Так какой параметр ? Может и в этой ситуации поможет)
7 Garykom
 
гуру
03.02.20
13:25
(0) Возьми https://github.com/Garykom/mdlp и не страдай херней
8 sergei10006
 
03.02.20
13:31
(7) Спасибо!!! Интересно, надо посмотреть),а как отправка осуществляется вызовом из 1С 7.7 ? а то если так то объект XMLHTTP то же вызывает аналогичную ошибку при отправке данных больше 500 кб если запуск из 1С XMLHTTP.Send(ТелоЗапроса) если ТелоЗапроса > 500 кб , то 1С 7.7 отваливается.
9 sergei10006
 
03.02.20
13:38
(7) А stunnel можно пользоваться для отправки в МДЛП ? Это по закону нормально ?
10 Garykom
 
гуру
03.02.20
13:39
(8) WinHTTP отправляет
(9) А как иначе ГОСТ 2012 сделаешь?
11 sergei10006
 
03.02.20
13:43
(10) Ни знаю я просто не пользовался stunnel, слышал что это какая то полу легальная прога)
12 sergei10006
 
03.02.20
13:46
(10) у меня вот так открывается https соединение "XMLHTTP.Open (Метод, "https://"+Ресурс+АдресЗапроса, -1)" + сертификаты загружены от МДЛП и от крипто про
13 sergei10006
 
03.02.20
13:47
(7) Спасибо еще раз!!! буду разбираться.
14 Ёпрст
 
03.02.20
13:52
(6)
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\SubSystems\Windows
по дефолту параметр SharedSection=1024,3072,512
рекомендации лучших собаководов: 5120,6400,5120
больше ставить не стОит, начинаются маловнятные, но неприятные глюки, вплоть до невозможности загрузиться."
15 Garykom
 
гуру
03.02.20
13:59
(11) Это легальная прога от криптопро
16 Garykom
 
гуру
03.02.20
14:01
(12) Боюсь нихрена там не откроется дальше кроме запроса токена без stunnel-msspi у тя
17 Garykom
 
гуру
03.02.20
14:01
(14) ТС бы винду на нормальную x64 поменять из новых 7ку или 10ку
18 sergei10006
 
03.02.20
14:05
(16) Ни знаю, я вроде во всю обмениваюсь по API с МДЛП, просто возник вопрос по документам больших объемов, тут вот и поймал полный затык)
Не фирма мало бюджетная)) еле концы с концами сводит.А если с сервера 2003 на новый переходить да или ПО новое покупать очень накладно будет)))
19 sergei10006
 
03.02.20
14:06
(16) Если все сертификаты в порядки и стоит крипто про то все работает как надо)
20 sergei10006
 
03.02.20
14:07
(14) Спасибо !!! попробую вдруг поможет
21 Garykom
 
гуру
03.02.20
14:14
(18) Документы больших объемов надо по webdav
22 trad
 
03.02.20
14:19
(20) не поможет. Это совсем другая песня
23 Garykom
 
гуру
03.02.20
14:19
(19) Хрень пишешь ибо

"Обратите внимание: После процедур аутентификации и авторизации все методы API должны
вызываться с использованием HTTPS протокола. Для взаимодействия по https используется ГОСТ
сертификат (ГОСТ Р 34.10-2012 сертификат)."

Каким местом ты заставил свои ком/оле стандартные понимать гост2012 ?
24 sergei10006
 
03.02.20
14:36
(21) Как отправляются доки большого объема я знаю, я говорил что при отправки из 1С 7.7, 1С отваливается по этому я и обратился на форум, что ошибка лезет когда загружаю данные в com объект.

(19)Я для транспорта использую объект msxml2.serverxmlhttp.6.0 он 100% работает с https каналом,можешь почитать в интернете. Если хочешь могу процедуру отправки скинуть).Там вроде только сертификаты в личные и доверенные надо устанавливать! Но я тебе точно говорю прога написана и я по всем схемам 201,416,417,701,210,439 и.т.д.  обмениваюсь с тестовым контуром МДЛП.
25 sergei10006
 
03.02.20
14:38
(23) "Каким местом ты заставил свои ком/оле стандартные понимать гост2012 ?"
Это место "msxml2.serverxmlhttp.6.0" ))))
26 trad
 
03.02.20
14:40
27 Garykom
 
гуру
03.02.20
14:45
(24) Тестовый контур подразумеваешь тестовый или песочницу?
28 sergei10006
 
03.02.20
14:46
(27) Песочница
29 sergei10006
 
03.02.20
14:48
(26) Спасибо сейчас попробую!
30 sergei10006
 
03.02.20
15:03
(27) А ты пробовал отправлять данные больше 2 Гб ? ошибку WinHttp не выдает ?
31 sergei10006
 
03.02.20
15:04
(30) Сори больше 2 Мб )
32 sergei10006
 
03.02.20
15:31
О чудо!!! Работает этот костыль OleExSup.dll. Огромное спасибо "trad" и разработчикам OleExSup

    CDO=СоздатьОбъект("CDO.Message");
    БодиПарт=CDO.BodyPart;
    Поля=БодиПарт.Fields;
    Поле=Поля.Item("urn:schemas:mailheader:content-type");
    Поле.Value="text/plain; charset=""windows-1251""";
    Поля.Update();
    Stream = БодиПарт.GetDecodedContentStream();
    Stream.charset = "windows-1251";
                
                
    ЗагрузитьВнешнююКомпоненту("OleExSup.dll");
    OleExSup = СоздатьОбъект("OLEExSup");
    OleExSup.InvokeOLEMethod(Stream, "WriteText", стр);
                
    Stream.Flush();
    БодиПарт.ContentTransferEncoding = Кодировка;
    Stream=БодиПарт.GetEncodedContentStream();
    Возврат Stream.ReadText();

        //а вот отправка в МДЛП
    ЗагрузитьВнешнююКомпоненту("OleExSup.dll");
    OleExSup = СоздатьОбъект("OLEExSup");
    OleExSup.InvokeOLEMethod(XMLHTTP, "Send", ТелоЗапроса);
33 trad
 
03.02.20
15:52
(32) ТелоЗапроса - тут что? xml,json?
34 Garykom
 
гуру
03.02.20
15:54
(30) (31) У меня пока не сделаны большие, надо заняться, но у меня с промежуточным сервером нет проблем кусками из 1С отправлять
35 sergei10006
 
03.02.20
18:11
(33) Тело запроса это JSON(
                                        СтрокиВJSON = СоздатьОбъект("Структура");
                     СтрокиВJSON.Вставить("document",ДокументBase64);
                     СтрокиВJSON.Вставить("sign",ПодписьBase64);
                     СтрокиВJSON.Вставить("request_id",СокрЛП(GUID));
                                        
                                        ТелоЗапроса = ЗаписьJSON(СтрокиВJSON,1);)
   А заголовки присваиваются так XMLHTTP.SetRequestHeader(Представление,Значение);
36 sergei10006
 
03.02.20
18:17
(34) А как такое возможно,скажем один документ в 40 000 тыс строк кусками отправить? подпись сертификата должна ведь быть одна на отправляемый объем данных, она каждый раз меняется.Если два набора данных отправить то это и есть два разных документа, просто с одним номером, но в МДЛП это разные документы.
37 sergei10006
 
03.02.20
18:25
(34) Я например просто попробовал отправить до 2 мб(но это все равно очень много), и получил в ответ такую ошибку.Так что дело не в webdav, а просто платформа 1с 7.7 не хочет загружать через com объекты большие объемы данных, это касается как WinHTTP так и msxml2.
38 Garykom
 
гуру
03.02.20
18:31
(36) У меня подписывает не 1С а промежуточный сервер наваянный мной на golang.
Короче 1С формирует файл и передает (как угодно в т.ч. кусками) его "mdlp.exe" который подписывает и отправляет в честный знак
39 Garykom
 
гуру
03.02.20
18:33
(38)+ Все что надо 1С это уметь XML, JSON и HTTP.
Точнее не только 1С а что угодно что это умеет.

Никаких криптографий из 1С не надо и даже если ЦПРТ поменяет протокол из 1С можно будет по прежнему.
40 Garykom
 
гуру
03.02.20
18:34
(38)+ Плюс что один промежуточный сервер может быть поднять для множества рабочих мест в т.ч. удаленных.
Короче КриптоПро и сертификаты УКЭП не надо на все рабочие места ставить и можно держать отдельно на отдельном компе/сервер.
41 Сияющий в темноте
 
03.02.20
18:47
ну не мучайте вы 1с
пишите в файл и этот файл и отправляйте,тогда к размеру претензий не будет.
1с хорошо умеет запустить приложение,к если с плюшками,то Wscript.Run
42 victuan1
 
04.02.20
05:48
(8) Например у msxml2.serverxmlhttp.6.0 нет такого ограничения.
Вот смотрю на файл размером в 9 Мб, отправленный им из 1С 7.7
43 sergei10006
 
04.02.20
07:49
(42) Да ограничений на отправку фалов не, но как это воспримет МДЛП, попробую отпишусь. А как быть с остальными com объектами например вот:
oSignedData = СоздатьОбъект("CAdESCOM.CadesSignedData"); // свойства и методы для работы с усовершенствованной подписью.
oSignedData.ContentEncoding = 1;
oSignedData.Content = СтрокуВBase64(ТекстДляПодписи);

как загрузить в "oSignedData.Content =  """ текст в 2 Мб и больше?
44 sergei10006
 
04.02.20
09:44
(43) Фаил отправить можно, только его МДЛП не воспринимает возвращается ответ от сервера 400(Запрос не может быть исполнен). Так что остается пока один вариант использовать "OleExSup.dll"