Имя: Пароль:
1C
1С v8
Автообмен в UAT - РИБ
0 Adgjj
 
13.11.11
13:02
здравствуйте! В Периферийную бд нужно автоматом загрузить xml-файл выгруженный из центральной базы, Используя внешнюю обработку.
Выдается ошибка:
ОБМЕН: Ошибка при получении данных обмена: {ВнешняяОбработка.Obmen(125)}:
Ошибка при вызове метода контекста (ПрочитатьИзменения): Из главного узла распределенной информационной базы получены
изменения конфигурации.
Необходимо выполнить обновление конфигурации базы данных.
Обновление может быть выполнено в режиме Конфигуратор.

связанная с методом ПрочитатьИзменения.
Обойти этот метод в конфигурации можно было с помощью ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина; а во внешней обработке не катит.
В результате загружается только код, данные не загружаются.
Попытка
               ЧтениеXML = Новый ЧтениеXML();
               ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_KOR_KOT.xml"; //НАДО НА СЕРВЕРЕ
               ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения);
               ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
               ЧтениеСообщения.НачатьЧтение(ЧтениеXML,);
               //**ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина;
               //Кэш = ПараметрыСеанса.ОбщиеЗначения.Получить();
               //Если Не ПараметрыСеанса.ИспользованиеРИБ И Ссылка <> ПланыОбмена.уатПолный.ЭтотУзел() Тогда
               //    Сообщить("Для задействования механизма установки префиксов объектов необходимо перезапустить текущий сеанс работы 1С:Предприятия.");
               //КонецЕсли;
               //ПараметрыСеанса.ИспользованиеРИБ  = Истина; //тоже не прокатило

               ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);
               ЗаписьСообщения.ЗакончитьЧтение();
               ЧтениеXML.Закрыть();
               Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда
                   Сообщить("ОБМЕН: Данные обмена приняты",СтатусСообщения.Информация);
               КонецЕсли;
               Сообщить("2) ОБМЕН: Файл в базу Котласа принят");
           Исключение
               Сообщить("ОБМЕН: Ошибка при получении данных обмена: " + ОписаниеОшибки(),
               СтатусСообщения.ОченьВажное);
           КонецПопытки;
1 Живой Ископаемый
 
13.11.11
13:06
отличное наблюдение.. но с чег вы взяли что оно новое и кому-то интересное?
2 Adgjj
 
13.11.11
14:19
С учетом http://infostart.ru/public/16993/ внесла изменения:
Попытка
               ЧтениеXML = Новый ЧтениеXML();
               ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_KOR_KOT.xml"; //НАДО НА СЕРВЕРЕ
               ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения);
               ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
               ЧтениеСообщения.НачатьЧтение(ЧтениеXML,);
               //ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина;
               ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);
               ЗаписьСообщения.ЗакончитьЧтение();
               ЧтениеXML.Закрыть();
               Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда
                   Сообщить("ОБМЕН: Данные обмена приняты",СтатусСообщения.Информация);
               КонецЕсли;
               Сообщить("2) ОБМЕН: Файл в базу принят");
           Исключение
               СтрОписания="Обновление может быть выполнено в режиме Конфигуратор.";
               Если Прав(ОписаниеОшибки(),СтрДлина(СтрОписания))=СтрОписания Тогда
                   ОбновитьКонфигурацию();  // процедура обновления конфигурации  
               Иначе
                   Сообщить("ОБМЕН: Ошибка при получении данных обмена: " + ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
               КонецЕсли;
           КонецПопытки;
Теперь ошибок не выдает, сначала заходит в предприятие, потом в конфигуратор и из него в предприятие, но новые данные так и не загружаются. Почему?
3 Adgjj
 
13.11.11
14:19
Процедура ОбновитьКонфигурацию() Экспорт
   МассивСоединений=ПолучитьСоединенияИнформационнойБазы();
   Если МассивСоединений.Количество()>1 Тогда
       Возврат;  // ждем дальше...    
   КонецЕсли;
     СтрокаСоединения=СтрокаСоединенияИнформационнойБазы();
   ПутьКСкрипту=КаталогВременныхФайлов()+"obmen.vbs";  //exchange
     Скрипт=Новый ЗаписьТекста(ПутьКСкрипту,КодировкаТекста.ANSI);
     Скрипт.ЗаписатьСтроку("WScript.Sleep 5000"); // на всякий случай
     Скрипт.ЗаписатьСтроку("Set WshShell=CreateObject(""WScript.Shell"")");                                                                                                                                //" /N Exchange /P Exchange /
     Команда=""""""+КаталогПрограммы()+"1CV8.EXE"""" CONFIG"+?(НСтр(СтрокаСоединения,"File")<>""," /F "+НСтр(СтрокаСоединения,"File")," /S "+НСтр(СтрокаСоединения,"Srvr")+"\"+НСтр(СтрокаСоединения,"Ref"))+" /N Obmen /P Obmen /UpdateDBCfg";
     Скрипт.ЗаписатьСтроку("ReturnCode=WshShell.Run("""+Команда+""",1,1)");
     Скрипт.ЗаписатьСтроку("If ReturnCode=0 Then"); // если обновились удачно, то пытаемся дочитать сообщение                                                                                                    //" /N Exchange /P Exchange"
     Команда=""""""+КаталогПрограммы()+"1CV8.EXE"""" ENTERPRISE"+?(НСтр(СтрокаСоединения,"File")<>""," /F "+НСтр(СтрокаСоединения,"File")," /S "+НСтр(СтрокаСоединения,"Srvr")+"\"+НСтр(СтрокаСоединения,"Ref"))+" /N Obmen /P Obmen";
     Скрипт.ЗаписатьСтроку("WshShell.Run """+Команда+""",1,0");
     Скрипт.ЗаписатьСтроку("End If");
     Скрипт.ЗаписатьСтроку("Set FSO=CreateObject(""Scripting.FileSystemObject"")");
     Скрипт.ЗаписатьСтроку("Set File=FSO.GetFile(WScript.ScriptFullName)");
     Скрипт.ЗаписатьСтроку("File.Delete");
     Скрипт.Закрыть();
     ЗапуститьПриложение(ПутьКСкрипту);
     ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры
4 Adgjj
 
13.11.11
14:51
Может, кто подскажет, как остановиться в отладчике во внешней обработке, в к-рой написан обмен?
5 Adgjj
 
13.11.11
15:17
СО ВТОРОГО РАЗА РАБОТАЕТ НАВЕРНО ИЗ-ЗИ СБИТОГО НОМЕРА СООБЩЕНИЯ
6 Живой Ископаемый
 
13.11.11
18:46
2(5) нет. не из-за него...
а из-за того что при первом обмене база приемник видит что изменилась конфа.. и подгружает изменения.. сразу за этим данные она отвергает - потому как - кто знает - вдруг пришли данные для которых изменены метаданные.. Поэтому специально просит зайти в конфигуратор и принять изменения. После принятия - все что нужно - еще раз запустить обмен, прочитав ТО ЖЕ самое сообщение.. И уже тогда загрузятся даннные.

Это написано во всех букварях по обменам.. во всех типовых есть код который позволяет автоматически принимать изменения.
7 Adgjj
 
14.11.11
09:22
Спасибо, при повторном чтении выдает ошибку
http://s017.radikal.ru/i416/1111/64/c7bcd1da8067.jpg
а в скриптах я не понимаю
8 Adgjj
 
14.11.11
09:23
(5) это я вручную пробовала читать
9 Живой Ископаемый
 
14.11.11
09:23
если не понимаете, то зачем их используете?
10 Живой Ископаемый
 
14.11.11
09:24
хотя... вы и в кавычках ничего не понимаете, но куда ж без них...
11 Adgjj
 
14.11.11
09:30
в скрипте раскомментировала
МассивСоединений=ПолучитьСоединенияИнформационнойБазы();
   Если МассивСоединений.Количество()>1 Тогда
       Возврат;  // ждем дальше...    
   КонецЕсли;
ошибки не выдает но все равно не загружаются данные даже с 3 раза
12 Adgjj
 
14.11.11
09:37
при повторном обмене все равно попадаю в исключение (я так думаю, как в отладчике остановиться не знаю)
Попытка
               ЧтениеXML = Новый ЧтениеXML();
               ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_KOR_KOT.xml"; //НАДО НА СЕРВЕРЕ
               ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения);
               ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
               ЧтениеСообщения.НачатьЧтение(ЧтениеXML,);
               //ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина;
               ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);
               ЗаписьСообщения.ЗакончитьЧтение();
               ЧтениеXML.Закрыть();
               Сообщить("2) ОБМЕН: ДАННЫЕ ОБМЕНА в базу Котласа приняты");
               //ЗавершитьРаботуСистемы(Ложь); //КОГДА 2 РАЗА
           Исключение
               СтрОписания="Обновление может быть выполнено в режиме Конфигуратор.";
               Если Прав(ОписаниеОшибки(),СтрДлина(СтрОписания))=СтрОписания Тогда
                   ОбновитьКонфигурацию();  // процедура обновления конфигурации  
               Иначе
                   Сообщить("ОБМЕН: Ошибка при получении данных обмена: " + ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
               КонецЕсли;
           КонецПопытки;
13 Adgjj
 
14.11.11
13:42
скрипт отсюда http://infostart.ru/public/16993/
Основная теорема систематики: Новые системы плодят новые проблемы.