Доброго времени суток,
У меня есть XML файл с данными от другой конфигурации, пытаюсь загрузить данные через SOAP.
Данные передаются без проблем, и отправляются также.
Проблема в том что когда данные получил, либо пытаюсь загрузить, при чтении XML файла 1С зависает намертво, ждал оч долго, но без результатно.
Пытался отладчиком найти проблему, но через отладчик ничего не зависает и все ок, но когда пытаюсь без точки останова, 1С умирает!!!
В чем может быть дело, подскажите плс....
(1) ugr_88, в отладчике ты полностью файл загружаешь или просто несколько строк кода проходишь? Возможно у тебя бесконечный цикл при чтении, либо загружаемый файл заблокирован другой программой, что 1с не может его прочитать. А файл большой?
(2) karpik666, Файл около 10мб
Мне весь цикл пройти уйдет большое кол часов.
Если я перед циклом ставлю точку остановки и захожу в цикл.
Но когда я в цикле ставлю точку остановки то 1С зависает...
(1) ugr_88, попробуй еще на другой платформе,
а то помнится мне, много проблем было при файловых операциях большого размера...может это тоже из той же серии глюк
СтрокаСообщения = Строка с данными
ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.УстановитьСтроку(СтрокаСообщения);
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеХМЛ);
Узел = ЧтениеСообщения.Отправитель;
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);
Пока ВозможностьЧтенияXML(ЧтениеХМЛ) Цикл
Данные = ПрочитатьXML(ЧтениеСообщения.ЧтениеXML);
Если Не Данные = Неопределено Тогда
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЕсли;
КонецЦикла;
ЧтениеСообщения.ЗакончитьЧтение();
Попробуй сохранить в файл и читать уже из него. Может быть проблема с памятью.
И пиши куда нибудь в тот же ЖР какие объекты загрузились и в Попытке. Вот загрузка из БП
Попытка
ЧтениеXML = Новый ЧтениеXML;
Если Не ПустаяСтрока(СообщениеОбмена) Тогда
ЧтениеXML.УстановитьСтроку(СообщениеОбмена);
Иначе
ЧтениеXML.ОткрытьФайл(ИмяФайла);
КонецЕсли;
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML, ДопустимыйНомерСообщения.Больший);
Исключение
ИнформацияОбОшибке = ИнформацияОбОшибке();
Если ЭтоОшибкаНомерСообщенияМеньшеИлиРавенНомеруРанееПринятогоСообщения(КраткоеПредставлениеОшибки(ИнформацияОбОшибке)) Тогда
РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Предупреждение_СообщениеОбменаБылоРанееПринято;
ЗаписьЖурналаРегистрации(КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Предупреждение,
УзелИнформационнойБазы.Метаданные(), УзелИнформационнойБазы, КраткоеПредставлениеОшибки(ИнформацияОбОшибке));
//
Иначе
РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка;
ЗаписьЖурналаРегистрации(КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка,
УзелИнформационнойБазы.Метаданные(), УзелИнформационнойБазы, ПодробноеПредставлениеОшибки(ИнформацияОбОшибке));
//
КонецЕсли;
Возврат;
КонецПопытки;
Показать
И сделай в транзакции
Попытка
Данные.Записать();
Исключение
РезультатВыполненияОбмена = Перечисления.РезультатыВыполненияОбмена.Ошибка;
ОписаниеОшибки = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ЗаписьЖурналаРегистрации(КлючСообщенияЖурналаРегистрации, УровеньЖурналаРегистрации.Ошибка,
Данные.Метаданные(), Строка(Данные), ОписаниеОшибки);
//
Прервать;
КонецПопытки;
КоличествоЗаписанныхОбъектов = КоличествоЗаписанныхОбъектов + 1;
Если ИспользоватьТранзакции
И КоличествоЭлементовВТранзакции > 0
И КоличествоЗаписанныхОбъектов = КоличествоЭлементовВТранзакции Тогда
// Промежуточную транзакцию закрываем и открываем новую.
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
КоличествоЗаписанныхОбъектов = 0;
КонецЕсли;
(13) karpik666, Дело в том что когда файл маленький он работает без проблем, но стоит файлу превысить свой размер(какой именно я еще не определил) он просто зависает и все, в данный момент файл весит 6 мб
(14) ugr_88, может он битым передается, или протокол обмена его режет, сравни текст файла xml до отправки и после. для сравнения можно воспользоваться самой 1с, я лично пользуюсь KDiff3
Пока ПрочитатьXML(ЧтениеСообщения.ЧтениеXML)<>Неопределено Цикл
Данные = ПрочитатьXML(ЧтениеСообщения.ЧтениеXML);
Если ВозможностьЧтенияXML(ЧтениеСообщения) Тогда
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЕсли;
КонецЦикла;
(21) ugr_88, тогда убери это условие, должно вроде и так работать, вся суть, что курсор должен сдвигаться с помощью метода прочитать, а в твоем первом варианте, он был на одном месте.
Такой код точно работает, попробуй сделать по аналогии
Попытка
Чтение = Новый ЧтениеXML;
Чтение.ОткрытьФайл(пФайл);
Исключение
Возврат Неопределено;
КонецПопытки;
//прочитаем начало xml файла
Чтение.ПерейтиКСодержимому();
//прочитаем начало корневого элемента
Чтение.Прочитать();
Пока Чтение.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл
//читаем очередной элемент справочника
Данные = СериализаторXDTO.ПрочитатьXML(Чтение);
КонецЦикла;
Попытка
ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.УстановитьСтроку(СтрокаСообщения);
Исключение
Возврат Неопределено;
КонецПопытки;
//прочитаем начало xml файла
ЧтениеХМЛ.ПерейтиКСодержимому();
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеХМЛ);
Узел = ЧтениеСообщения.Отправитель;
//прочитаем начало корневого элемента
ЧтениеХМЛ.Прочитать();
Пока ЧтениеХМЛ.ТипУзла<>ТипУзлаXML.КонецЭлемента Цикл
//читаем очередной элемент справочника
Данные = СериализаторXDTO.ПрочитатьXML(ЧтениеХМЛ); // ПрочитатьXML(ЧтениеХМЛ)
//Не работает
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЦикла;
(34) Serginio, А как может быть так???
что всего измененных объектов около 4000 тыс.
А при получении данных и их записи, счетчик показывает 15 миллионов???
ПутьКФайлу = "D:\1C\2С.txt";
Текст = Новый ТекстовыйДокумент;
Текст.УстановитьТекст(СтрокаСообщения);
Текст.Записать(ПутьКФайлу);
ЧтениеХМЛ = Новый ЧтениеXML;
ЧтениеХМЛ.ОткрытьФайл(ПутьКФайлу);
ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеХМЛ);
ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель, ЧтениеСообщения.НомерПринятого);
Узел = ЧтениеСообщения.Отправитель;
Пока ВозможностьЧтенияXML(ЧтениеХМЛ) Цикл
Данные = ПрочитатьXML(ЧтениеСообщения.ЧтениеXML);
Если Не Данные = Неопределено Тогда
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЕсли;
КонецЦикла;
ЧтениеСообщения.ЗакончитьЧтение();
Если делать обмен частями, то есть частями, перезагружать сервер при зависании, после пару перезагрузок все обновляется...
Что уже делать уже не знаю...
Я записал выгруженные данные в файл и загрузил его с помощью обработки, хотя код один и тот же, в обработке все загрузилось без проблем и без зависаний.
Че за мистика черт возьми, объясните мне плс...
(48) Смотри ошибки. Возможно какие то документы (при записи, передЗаписью, подписка на события) используют модули, у которых не стоит галка сервер.
Хотя
(49) Serginio,
я удалил весь код в модуле объекта и формы, везде пусто, нет подписок на события.
Выгруженный файл "D:\1C\2С.txt" я делаю с помощью отдельной обработки и все грузит, но когда это в модуле Вебсервиса все зависает, может дело не в 1С а настройках веб сервиса или еще где то???
(51) Serginio, есть ли ограничение по времени обработки, возможно по времени обрабатывать уходит больше чем указано где то, если да то где?
Ведь если мало объектов он обрабатывает нормально...и без зависаний и ошибок...
Картинка 1 Картинка 2
(56) Serginio, а насчет (55) что можно сказать?
Дело в том что
Все данные я записал в таблицу значений, и все записалось без проблем.
Но когда провожу документы из таб. значений, зависло...
Пока ВозможностьЧтенияXML(ЧтениеХМЛ) Цикл
Данные = ПрочитатьXML(ЧтениеСообщения.ЧтениеXML);
Если Не Данные = Неопределено Тогда
НоваяСтрока = ТабЗнач.Добавить();
НоваяСтрока.Заявка = Данные;
КонецЕсли;
КонецЦикла;
ЗафиксироватьТранзакцию();
НачатьТранзакцию();
Для каждого Строчка Из ТабЗнач Цикл
Данные = Строчка.Заявка;
Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель;
Данные.ОбменДанными.Загрузка = Истина;
Данные.Записать();
КонецЦикла;