Имя: Пароль:
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"
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший