Имя: Пароль:
1C
1С v8
v82.Application - Обновление РИБ
,
0 Night_Wolf
 
23.09.13
11:29
Подскажите пожалуйста. Есть код:
Попытка
        ЧтениеXML = Соединение.NewObject("ЧтениеXML");
    ЧтениеXML.ОткрытьФайл(ФайлОбмена.ПолноеИмя);
    ЧтениеСообщения = Соединение.ПланыОбмена.СоздатьЧтениеСообщения();
            ЧтениеСообщения.НачатьЧтение(ЧтениеXML,Соединение.ДопустимыйНомерСообщения.Больший);
            Надпись="Чтение сообщения номер "+ЧтениеСообщения.НомерПринятого+" из файла "+ФайлОбмена.ИмяБезРасширения;
            Соединение.ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);            
            ЧтениеСообщения.ЗакончитьЧтение();
            Надпись="Чтение сообщения из файла "+ФайлОбмена.ИмяБезРасширения+" завершено";
            ЧтениеXML.Закрыть();
            Запись.Открыть("d:\test.txt",КодировкаТекста.ANSI,,Истина);
            Запись.ЗаписатьСтроку("Дошло до ЗакрытияФайла");
            Запись.Закрыть();
        Исключение
            Запись.Открыть("d:\test.txt",КодировкаТекста.ANSI,,Истина);
            Запись.ЗаписатьСтроку("Попали в исключение");
            Запись.Закрыть();
            ЧтениеXML.Закрыть();
            Надпись=ОписаниеОшибки();
            Если Найти(ОписаниеОшибки(),"Необходимо выполнить обновление конфигурации базы данных") Тогда
                Попытка
                    Соединение.ЗавершитьРаботуСистемы(Ложь);                    
                    Запись.Открыть("d:\test.txt",КодировкаТекста.ANSI,,Истина);
                    Запись.ЗаписатьСтроку("Дошло до Завершить работу системы");
                    Запись.Закрыть();
                Исключение
                    Соединение = Неопределено;
                    Запись.Открыть("d:\test.txt",КодировкаТекста.ANSI,,Истина);
                    Запись.ЗаписатьСтроку("Дошло до Неопределено 2");
                    Запись.Закрыть();
                КонецПопытки;    
                
                ///Вызываем Конфигуратор и обновляем базу
                Текст=СтрЗаменить(ИмяБазы,";",Символы.ВК);
                СтрСервер="";
                СтрБаза="";
                Для Н=1 По СтрЧислоСтрок(Текст) Цикл
                    Пункт=СтрЗаменить(СокрЛП(СтрПолучитьСтроку(Текст,Н)),"=",Символы.ВК);
                    Имя=СокрЛП(СтрПолучитьСтроку(Пункт,1));
                    Значение=СтрЗаменить(СокрЛП(СтрПолучитьСтроку(Пункт,2)),"""","");
                    Если Имя ="Srvr" Тогда
                        СтрСервер=Значение;
                    ИначеЕсли Имя ="Ref" Тогда
                        СтрБаза=Значение;
                    КонецЕсли;    
                КонецЦикла;                
                
                СтрКоманда="DESIGNER /DisableStartupMessages /UpdateDBCfg -WarningsAsErrors /S """+СтрСервер+"\"+СтрБаза+"""";
                
                Запись.Открыть("d:\test.txt",КодировкаТекста.ANSI,,Истина);
                Запись.ЗаписатьСтроку("Дошло до запуска Конфигуратора");
                Запись.Закрыть();
                
                ЗапуститьСистему(СтрКоманда,Истина);
                
                Запись.Открыть("d:\test.txt",КодировкаТекста.ANSI,,Истина);
                Запись.ЗаписатьСтроку("Дошло до Продолжить");
                Запись.Закрыть();
                
                Продолжить;
            ИначеЕсли Найти(ОписаниеОшибки(),"Номер сообщения меньше или равен") Тогда
                Если Не ВыполнятьОбменПриОтсутствииНовыхДанных Тогда
                    ВызватьИсключение(ОписаниеОшибки());
                КонецЕсли;
            КонецЕсли;    
            Запись.Открыть("d:\test.txt",КодировкаТекста.ANSI,,Истина);
            Запись.ЗаписатьСтроку("Дошло до ЗакрытияФайла в Исключении");
            Запись.Закрыть();
        КонецПопытки;

Проблема такая. Когда идет обмен, прилетает ошибка "Изменения в конфигурации", я завершаю работу системы, всё отлично - окно закрывается, соединение остается висеть. Но при запуске конфигуратора для обновления ИБ - вылетает  сама 1С главный узел - из которого идет запуск. Самое интересное, что если я смотрю этот код в конфигураторе главного узла - ничего не вылетает. Подскажите в чем может быть проблема?
1 Maxus43
 
23.09.13
11:33
что за                    
Запись.Открыть("d:\test.txt",КодировкаТекста.ANSI,,Истина);
                    Запись.ЗаписатьСтроку("Дошло до Неопределено 2");

?
Юзай ЖР.
>>я смотрю этот код в конфигураторе главного узла - ничего не вылетает
на клиенте смотришь небось, а вот сервер не факт что может сам сделать эту запись например
2 Галахад
 
гуру
23.09.13
11:38
Наверное, когда отладка не включена "Application" просто напросто не успевает закрыться.
3 Night_Wolf
 
23.09.13
11:40
(1) - это я тестирую на какой строке вылетало - просто пишу текстовый файлик. В этом нет проблемы. А при чем тут сервер? Я открываю базу - главный узел - и конфигуратор для отладки и 1С:Предприятие. В предприятии запускаю обработку, в которой этот код написан. Суть кода простая: сделать обмен с локальной распределенной базой. Вылетает именно на строке "ЗапуститьСистему(СтрКоманда,Истина);". Т.е. вылетает - закрывается 1С:Предприятие-главный узел. При этом конфигуратор подчиненного узла на обновление запускается, конфа обновляется. Крайне неудобно потом переоткрывать базу-главный узел и "дочитывать" файл обмена. Вопрос - почему вылетает? Ведь я закрываю приложение через "ЗавершитьРаботуСистемы(Ложь)". P/S: Этот код прекрасно работал на платформе 8.1.
(2) - Application закрывается - я специально проверял. Но Соединение в обработке остается висеть - т.е. оно не "Неопределено", а COMObject.
4 Галахад
 
гуру
23.09.13
11:44
(3) Все же попробуй паузу поставить на пару минут.
5 Night_Wolf
 
23.09.13
11:47
(3) - хорошо, воткну цикл до 1000. Только не совсем понятно чем это поможет - вылетает то главный узал. Причем вылетает только если конфигуратор главного узла не открыт. Иначе - не вылетает.
6 Галахад
 
гуру
23.09.13
11:50
(5) Цикл не надо, проще предупреждение.
7 Night_Wolf
 
23.09.13
12:08
Вопрос так и остается не закрытым. Предупреждение не помогло. Какие есть ещё варианты?
8 Maxus43
 
23.09.13
12:28
Что значит вылетает? как тут советовать? Переставь платформу, почисти кэш.
9 Night_Wolf
 
23.09.13
12:30
Вылетает - это значит закрывается 1С:Предприятие главного узла, с сообщением "Подождите, идет запись дампа" - ошибка такая не хорошая, но всем знакомая должна быть. Когда сбой в программе бывает. Её невозможно поймать принт-скрином - она очень быстрая. И 1С закрывается.
10 Maxus43
 
23.09.13
12:33
>>ошибка такая не хорошая, но всем знакомая должна быть
знакомая, но влиять на неё никто не может, "переставьте платформу" - это одно из решений простых, для очистки совести
11 Night_Wolf
 
23.09.13
12:35
(10) - Ясно, сейчас попробую. Спасибо!
12 Maxus43
 
23.09.13
12:37
к таким же решениям относится "отключите аппаратное ускорение видеокарты". Спросишь зачем? Просто сделай...
Проблемы невозможно решaть нa том же уровне компетентности, нa котором они возникaют. Альберт Эйнштейн