Вход | Регистрация
 
1С:Предприятие :: 1С:Предприятие 7.7 и ранее

v7: Ошибка MFC42.DLL(память не может быть read)

v7: Ошибка MFC42.DLL(память не может быть read)
Я
   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
в реестре один параметр поправить
   sergei10006
 
2 - 03.02.20 - 12:35
"в реестре один параметр поправить"
А какая ветка и какой параметр? Можно по подробнее ?
   trad
 
3 - 03.02.20 - 12:38
(1) чито? O_O
   Kigo_Kigo
 
4 - 03.02.20 - 13:10
(3) Тут наверно должна прозвучать фраза (1) "Круасафчег памаги" Бгггг :)))
   Ёпрст
 
5 - 03.02.20 - 13:22
(3) не чито, спутал с открытием большого количества окон в терминале, там помогала правка параметра в реестре
   sergei10006
 
6 - 03.02.20 - 13:25
(5) Так какой параметр ? Может и в этой ситуации поможет)
   Garykom
 
7 - 03.02.20 - 13:25
(0) Возьми https://github.com/Garykom/mdlp и не страдай херней
   sergei10006
 
8 - 03.02.20 - 13:31
(7) Спасибо!!! Интересно, надо посмотреть),а как отправка осуществляется вызовом из 1С 7.7 ? а то если так то объект XMLHTTP то же вызывает аналогичную ошибку при отправке данных больше 500 кб если запуск из 1С XMLHTTP.Send(ТелоЗапроса) если ТелоЗапроса > 500 кб , то 1С 7.7 отваливается.
   sergei10006
 
9 - 03.02.20 - 13:38
(7) А stunnel можно пользоваться для отправки в МДЛП ? Это по закону нормально ?
   Garykom
 
10 - 03.02.20 - 13:39
(8) WinHTTP отправляет
(9) А как иначе ГОСТ 2012 сделаешь?
   sergei10006
 
11 - 03.02.20 - 13:43
(10) Ни знаю я просто не пользовался stunnel, слышал что это какая то полу легальная прога)
   sergei10006
 
12 - 03.02.20 - 13:46
(10) у меня вот так открывается https соединение "XMLHTTP.Open (Метод, "https://"+Ресурс+АдресЗапроса, -1)" + сертификаты загружены от МДЛП и от крипто про
   sergei10006
 
13 - 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
больше ставить не стОит, начинаются маловнятные, но неприятные глюки, вплоть до невозможности загрузиться."
   Garykom
 
15 - 03.02.20 - 13:59
(11) Это легальная прога от криптопро
   Garykom
 
16 - 03.02.20 - 14:01
(12) Боюсь нихрена там не откроется дальше кроме запроса токена без stunnel-msspi у тя
   Garykom
 
17 - 03.02.20 - 14:01
(14) ТС бы винду на нормальную x64 поменять из новых 7ку или 10ку
   sergei10006
 
18 - 03.02.20 - 14:05
(16) Ни знаю, я вроде во всю обмениваюсь по API с МДЛП, просто возник вопрос по документам больших объемов, тут вот и поймал полный затык)
Не фирма мало бюджетная)) еле концы с концами сводит.А если с сервера 2003 на новый переходить да или ПО новое покупать очень накладно будет)))
   sergei10006
 
19 - 03.02.20 - 14:06
(16) Если все сертификаты в порядки и стоит крипто про то все работает как надо)
   sergei10006
 
20 - 03.02.20 - 14:07
(14) Спасибо !!! попробую вдруг поможет
   Garykom
 
21 - 03.02.20 - 14:14
(18) Документы больших объемов надо по webdav
   trad
 
22 - 03.02.20 - 14:19
(20) не поможет. Это совсем другая песня
   Garykom
 
23 - 03.02.20 - 14:19
(19) Хрень пишешь ибо
"Обратите внимание: После процедур аутентификации и авторизации все методы API должны
вызываться с использованием HTTPS протокола. Для взаимодействия по https используется ГОСТ
сертификат (ГОСТ Р 34.10-2012 сертификат)."

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

(19)Я для транспорта использую объект msxml2.serverxmlhttp.6.0 он 100% работает с https каналом,можешь почитать в интернете. Если хочешь могу процедуру отправки скинуть).Там вроде только сертификаты в личные и доверенные надо устанавливать! Но я тебе точно говорю прога написана и я по всем схемам 201,416,417,701,210,439 и.т.д.  обмениваюсь с тестовым контуром МДЛП.
   sergei10006
 
25 - 03.02.20 - 14:38
(23) "Каким местом ты заставил свои ком/оле стандартные понимать гост2012 ?"
Это место "msxml2.serverxmlhttp.6.0" ))))
   trad
 
26 - 03.02.20 - 14:40
   Garykom
 
27 - 03.02.20 - 14:45
(24) Тестовый контур подразумеваешь тестовый или песочницу?
   sergei10006
 
28 - 03.02.20 - 14:46
(27) Песочница
   sergei10006
 
29 - 03.02.20 - 14:48
(26) Спасибо сейчас попробую!
   sergei10006
 
30 - 03.02.20 - 15:03
(27) А ты пробовал отправлять данные больше 2 Гб ? ошибку WinHttp не выдает ?
 
 Рекламное место пустует
   sergei10006
 
31 - 03.02.20 - 15:04
(30) Сори больше 2 Мб )
   sergei10006
 
32 - 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", ТелоЗапроса);
   trad
 
33 - 03.02.20 - 15:52
(32) ТелоЗапроса - тут что? xml,json?
   Garykom
 
34 - 03.02.20 - 15:54
(30) (31) У меня пока не сделаны большие, надо заняться, но у меня с промежуточным сервером нет проблем кусками из 1С отправлять
   sergei10006
 
35 - 03.02.20 - 18:11
(33) Тело запроса это JSON( 
                                        СтрокиВJSON = СоздатьОбъект("Структура");
                     СтрокиВJSON.Вставить("document",ДокументBase64);
                     СтрокиВJSON.Вставить("sign",ПодписьBase64);
                     СтрокиВJSON.Вставить("request_id",СокрЛП(GUID));
                                        
                                        ТелоЗапроса = ЗаписьJSON(СтрокиВJSON,1);)
   А заголовки присваиваются так XMLHTTP.SetRequestHeader(Представление,Значение);
   sergei10006
 
36 - 03.02.20 - 18:17
(34) А как такое возможно,скажем один документ в 40 000 тыс строк кусками отправить? подпись сертификата должна ведь быть одна на отправляемый объем данных, она каждый раз меняется.Если два набора данных отправить то это и есть два разных документа, просто с одним номером, но в МДЛП это разные документы.
   sergei10006
 
37 - 03.02.20 - 18:25
(34) Я например просто попробовал отправить до 2 мб(но это все равно очень много), и получил в ответ такую ошибку.Так что дело не в webdav, а просто платформа 1с 7.7 не хочет загружать через com объекты большие объемы данных, это касается как WinHTTP так и msxml2.
   Garykom
 
38 - 03.02.20 - 18:31
(36) У меня подписывает не 1С а промежуточный сервер наваянный мной на golang.
Короче 1С формирует файл и передает (как угодно в т.ч. кусками) его "mdlp.exe" который подписывает и отправляет в честный знак
   Garykom
 
39 - 03.02.20 - 18:33
(38)+ Все что надо 1С это уметь XML, JSON и HTTP.
Точнее не только 1С а что угодно что это умеет.

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

oSignedData.ContentEncoding = 1;
oSignedData.Content = СтрокуВBase64(ТекстДляПодписи); 

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


Список тем форума
Рекламное место пустует  Рекламное место пустует
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование.
Фредерик Брукс-младший
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.