Имя: Пароль:
1C
1С v8
Открыть из одной базы другую
,
0 Adgjj
 
12.11.11
11:39
Скажите, пжл, как программно из конф одной базы открыть другую (обе базы пока локальные на 1 компе)
Это нужно для обмена в РБД: батником запускается центр. база, из к-рой выгружается xml-файл обмена. Дальше в конфе центр. базы хотелось бы прописать запуск периферийной базы и загрузку туда выгруженного файла.
1 IamAlexy
 
12.11.11
11:40
ыыыыыыыыыы

батником...
ыыыы
2 Нуф-Нуф
 
12.11.11
11:41
кури пакетный режим. яндекс спасет
3 Mikhail Volkov
 
12.11.11
12:23
Можно так:
   Если ФлажокЗапуститьБазуПриемник Тогда
       // Запускаем базу приемник УТ11 для загрузки
//        КомандаСистемы("""c:\Program Files\1cv82\8.2.14.528\bin\1cv8.exe"" ENTERPRISE /Fc:\Work\1Cv82\KrsTrade_11_0 /NРобот /Pпароль /C" + ФайлВыгрузки); // в офисе файловый (отладка)
//        КомандаСистемы("""c:\Program Files\1cv82\8.2.14.528\bin\1cv8.exe"" ENTERPRISE /Ssrv1c\1c_ut_krs /NРобот /Pпароль /C" + ФайлВыгрузки);              // в офисе серверный (отладка)
//        КомандаСистемы("""c:\Program Files\1cv82\8.2.14.528\bin\1cv8.exe"" ENTERPRISE /Sserver1c\1c_ut_krs /NРобот /Pпароль /C" + ФайлВыгрузки);          // на базе №1
       КомандаСистемы("""c:\Program Files\1cv82\8.2.14.528\bin\1cv8.exe"" ENTERPRISE /Fi:\1Cv82\KrsTrade_11_0_6_9 /NРобот /Pпароль /C" + ФайлВыгрузки); // дома файловый (отладка)
   КонецЕсли;
4 Adgjj
 
12.11.11
15:44
(3) спасибо большое
5 Adgjj
 
12.11.11
15:58
КомандаСистемы("""C:\Program Files\1cv81\bin\1cv8.exe"" ENTERPRISE /Fi:\UAT8_baza" /N"obmen" /P"obmen" /C" + ИмяФайлаСообщения);
синтаксис не идет
/N"obmen" /P"obmen" /C - эти 3 слеша красные
всяко пробую пока не получилось
6 Mikhail Volkov
 
13.11.11
12:58
(5) Путь "C:\Program Files\1cv81\bin\1cv8.exe" заключен в ковычки (двойные), потому что есть пробел. Ключи /N (пользователь), /P (пароль) и /C (строка параметров) заключать в ковычки не требуется. Если имя пользователя, или значение пароля содержит пробелы, тогда их надо в ковычки - но только сами значения (не ключи).
7 Adgjj
 
13.11.11
13:04
спасибо!
8 Mikhail Volkov
 
13.11.11
13:06
Еще, при использовании КомандаСистемы программа будет ждать запущщенной программы (будет весеть DOS окно Командная строка). Есть более гибкая ЗапуститьПриложение(<СтрокаКоманды>, <ТекущийКаталог>, <ДождатьсяЗавершения>), но для СтрокаКоманды bat-файл придется писать.
9 Adgjj
 
13.11.11
13:07
спасибо, поробую обязательно, но чуть позже, пока с другой ошибкой бьюсь. Спасибо!
10 Adgjj
 
16.11.11
14:16
Возвращаюсь к этой теме, никак не могу сделать сама.
Процедура ОбновитьКонфигурацию() Экспорт
       МассивСоединений=ПолучитьСоединенияИнформационнойБазы();
       Если МассивСоединений.Количество()>1 Тогда
           Возврат;  // ждем дальше...    
       КонецЕсли;
       СтрокаСоединения=СтрокаСоединенияИнформационнойБазы();
       ПутьКСкрипту=КаталогВременныхФайлов()+"obmen.vbs";  
       Скрипт=Новый ЗаписьТекста(ПутьКСкрипту,КодировкаТекста.ANSI);
       Скрипт.ЗаписатьСтроку("WScript.Sleep 5000"); // на всякий случай
       
       Скрипт.ЗаписатьСтроку("Set WshShell=CreateObject(""WScript.Shell"")");                                                                                                                                
       Команда=""""""+КаталогПрограммы()+"1CV8.EXE"""" CONFIG"+?(НСтр(СтрокаСоединения,"File")<>""," /F "+НСтр(СтрокаСоединения,"File")," /S "+НСтр(СтрокаСоединения,"Srvr")+"\"+НСтр(СтрокаСоединения,"Ref"))+" /N Obmen /P Obmen /UpdateDBCfg";
       Скрипт.ЗаписатьСтроку("ReturnCode=WshShell.Run("""+Команда+""",1,1)"); //открыть конфигуратор
       
       Скрипт.ЗаписатьСтроку("If ReturnCode=0 Then"); // если обновились удачно, то пытаемся дочитать сообщение  
           Скрипт.ЗаписатьСтроку("WshShell.Run """+Команда+""",1,0");
           //Скрипт.ЗаписатьСтроку("WshShell.Run """+Команда+""",1,1");
           //Скрипт.ЗаписатьСтроку("WScript.Sleep 5000");
           //WshShell.Run(cmd, [windowStyle], [waitOnReturn])
           //Параметр waitOnReturn представляет собой булево значение, которое указывает должен ли сценарий ждать перед выполнением следующий команды.
       Скрипт.ЗаписатьСтроку("End If");
       
       Скрипт.ЗаписатьСтроку("Set FSO=CreateObject(""Scripting.FileSystemObject"")");
       Скрипт.ЗаписатьСтроку("Set File=FSO.GetFile(WScript.ScriptFullName)");
       Скрипт.ЗаписатьСтроку("File.Delete");  //скрипт сам себя удаляет
       Скрипт.Закрыть();
               
       ЗапуститьПриложение(ПутьКСкрипту); //запустить скрипт, записанный выше
       //ЗапуститьПриложение(ПутьКСкрипту,,Истина); //скрипт открывает предпр (подождите)
               сообщить("1сПредприятие запустилось");
       ЗавершитьРаботуСистемы(Ложь);        
   КонецПроцедуры
Скажите, пжл, почему при выполнении кода
ЗапуститьПриложение(ПутьКСкрипту,,Истина);
сообщить("1сПредприятие запустилось");
ЗавершитьРаботуСистемы(Ложь);

команда 1сПредприятие запускается после появления сообщения "1сПредприятие запустилось"?
11 Adgjj
 
16.11.11
15:14
кто-нибудь, пжл, помогите!
12 zladenuw
 
16.11.11
15:16
почему после. отправила команду и сообщила тебе
13 Fragster
 
гуру
16.11.11
15:16
(11) так ведь фотки в личной карточке нет
14 Adgjj
 
16.11.11
15:20
(12) а как дождаться, чтоб запустилось сначала 1Спредприятие, я ведь поставила третьим параметром истина7
15 zladenuw
 
16.11.11
15:21
проверку что приложение запустилось. смотри процесс. а зачем ты запускаешь сеанс ? через ком нельзя разве ?
16 zladenuw
 
16.11.11
15:22
entConn = new ActiveXObject("v82.comconnector");
conn = entConn.connect("Srvr=1c8:1541; Ref=baza; Usr=admin; Pwd=131072");
conn.st_export();
17 hhhh
 
16.11.11
15:23
(14) так bat файл уже завершился. Она тебе честно об этом сказала.
18 Adgjj
 
16.11.11
15:25
пытаюсь сделать автообмен в 8.1 UAT (управление автотранспортом)
Чтение xml-файла в периферийную базу
запускаю первый батник(обновление конфы), после него как раз остается открытой конфа, надо ее закрыть, а потом запустить 2 батник (обновление данных)
19 zladenuw
 
16.11.11
15:27
(18) ну а сразу закрывать после обновление. не проще ли сделать в самой конфе. и после ее закрытия запускать 2
20 Adgjj
 
16.11.11
15:28
(15) у меня обновление конф периф-ной базы реализовано через скрипт, отсюда взяла http://infostart.ru/public/16993/
21 Adgjj
 
16.11.11
15:28
(16) я в этом не понимаю, это предлагаете вместо скрипта?
22 Adgjj
 
16.11.11
15:29
код обмена пишу во внешней обработке
23 Adgjj
 
16.11.11
15:31
потому что если писать в конфе, то как этот код из центральной попадет в периферийную конфу, периф ведь не доступна для прямого редактирования, только через сообщение обмена
24 Adgjj
 
16.11.11
15:31
пока не поняла, что нужно сделать
25 zladenuw
 
16.11.11
15:33
20()
   ЗавершитьРаботуСистемы(Ложь);
КонецПроцедуры

ну так там же есть завершение работы. почему тогда у вас она остается открытой пусть уже цо запускает второй батник и завершает свою работу.
26 Adgjj
 
16.11.11
15:36
как я поняла, остается открытой, т.к. эта команда выполняется раньше, чем 1с успела запуститься
нужно будет делать обмен ночью на сервере, пока пытаюсь сделать у себя локально на компе
вручную запускаю батник - остается открытой 1сПредпр, вручную закрываю ее и запускаю второй батник
мучаюсь давно ничего не получается
27 zladenuw
 
16.11.11
15:36
(25) не то. в примере у тебя без параметра ожидать запуск, а сразу. да и не забывай что ожидать может процесс. что он ее запустил. процесс появился и 1с тебе сообшила
28 Adgjj
 
16.11.11
15:38
если я ставлю параметр истина, то 1С вообще не запускается 0_0
29 hhhh
 
16.11.11
15:38
(26) надо с иваном бездомным тебе связаться, он уже накопил огромный опыт по автоматическому обновлению баз.
30 Adgjj
 
16.11.11
15:38
(27) да, сообщила и закрытие не сработало((
31 Adgjj
 
16.11.11
15:39
(29) не до шуток..
32 zladenuw
 
16.11.11
15:40
а если без запуска скрипта, завершается.
33 zladenuw
 
16.11.11
15:40
может попробуешь вынести все в 1 скрипт и после отработки в 1 базе. запускать 2
34 Adgjj
 
16.11.11
15:52
батник для загрузки xml-файла в периф. базу: (из центр. базы уже выгрузила файл на диск и теперь им пользуюсь)
"C:\Program Files\1cv81\bin\1cv8.exe" ENTERPRISE /F"C:\UAT8_les_KOT" /N"obmen" /P"obmen" /DisableStartupMessages/Execute Obmen.epf
Запускаю этот батник 2 раза
Почему-то если пишу в этом батнике 2 строки, чтоб запустить 1 раз, то данные не загружаются.

А если запускаю этот батник 2 раза (первый раз выполнился, затем запускаю второй раз), то все загружается.Причем предприятие, оставшееся открытым после первого батника, можно закрыть и в конце.
35 Adgjj
 
16.11.11
15:54
сейчас выложу внешнюю обработку
36 Adgjj
 
16.11.11
16:06
Процедура ОбновитьКонфигурацию() Экспорт
       МассивСоединений=ПолучитьСоединенияИнформационнойБазы();
       Если МассивСоединений.Количество()>1 Тогда  
           Возврат;  // ждем дальше...      //возврат туда, откуда ОбновитьКонфигурацию() вызвана
       КонецЕсли;
       СтрокаСоединения=СтрокаСоединенияИнформационнойБазы(); //Пример: File="C:\1cv8\Base".
       ПутьКСкрипту=КаталогВременныхФайлов()+"obmen.vbs";  
       Скрипт=Новый ЗаписьТекста(ПутьКСкрипту,КодировкаТекста.ANSI);
       Скрипт.ЗаписатьСтроку("WScript.Sleep 5000"); ///5 секунд
       
       Скрипт.ЗаписатьСтроку("Set WshShell=CreateObject(""WScript.Shell"")");                                                                                                                                
       Команда=""""""+КаталогПрограммы()+"1CV8.EXE"""" CONFIG"+?(НСтр(СтрокаСоединения,"File")<>""," /F "+НСтр(СтрокаСоединения,"File")," /S "+НСтр(СтрокаСоединения,"Srvr")+"\"+НСтр(СтрокаСоединения,"Ref"))+" /N Obmen /P Obmen /UpdateDBCfg";
       Скрипт.ЗаписатьСтроку("ReturnCode=WshShell.Run("""+Команда+""",1,1)"); //открыть конфигуратор
       
       Скрипт.ЗаписатьСтроку("If ReturnCode=0 Then"); // если обновились удачно, то пытаемся дочитать сообщение  
           Скрипт.ЗаписатьСтроку("WshShell.Run """+Команда+""",1,0");
           //Скрипт.ЗаписатьСтроку("WshShell.Run """+Команда+""",1,1");
           //Скрипт.ЗаписатьСтроку("WScript.Sleep 5000");
           //WshShell.Run(cmd, [windowStyle], [waitOnReturn])
           //Параметр waitOnReturn представляет собой булево значение, которое указывает должен ли сценарий ждать перед выполнением следующий команды.
       Скрипт.ЗаписатьСтроку("End If");
       
       Скрипт.ЗаписатьСтроку("Set FSO=CreateObject(""Scripting.FileSystemObject"")");
       Скрипт.ЗаписатьСтроку("Set File=FSO.GetFile(WScript.ScriptFullName)");
       Скрипт.ЗаписатьСтроку("File.Delete");  
       Скрипт.Закрыть();
               
       ЗапуститьПриложение(ПутьКСкрипту); //запустить скрипт, записанный выше
       //ЗапуститьПриложение(ПутьКСкрипту,,Истина); //скрипт открывает предпр (подождите)
       ЗавершитьРаботуСистемы(Ложь);        
   КонецПроцедуры
   
       
   Пользователь = ИмяПользователя();      ЭтотУзел = ПланыОбмена.уатПолный.ЭтотУзел();
   Если СокрЛП(ЭтотУзел.Код) = "KOR" Тогда
       ЦентрБаза = 1;
       ПерифБаза = 0;
       КодУзлаЗагрузки = "KOT";
               
   ИначеЕсли СокрЛП(ЭтотУзел.Код) = "KOT" Тогда
       ЦентрБаза = 0;
       ПерифБаза = 1;
       КодУзлаЗагрузки = "KOR";
   КонецЕсли;
   
   ТекущийЧас = Сред(Строка(ТекущаяДата()),12,2); //11.11.2011 13:42:48
   Если СокрЛП(Пользователь) = "Obmen" Тогда //!!!  и  "01"<ТекущийЧас  и  ТекущийЧас<"05"
       
       //ПРЕДВАРИТЕЛЬНО СОЗДАТЬ АРХИВЫ БАЗ
       ДатаИзмФайлаXMLПериф = "";            
       УзелЗагрузки = ПланыОбмена.уатПолный.НайтиПоКоду(КодУзлаЗагрузки);  
       
       Если ЦентрБаза = 1 тогда  
           //ЗАПИСЬ xml-файла из центр. базы
           Если ДатаИзмФайлаXMLПериф <> Лев(ТекущаяДата(),10) Тогда //СЕГОДНЯ из Периф ЕЩЕ НЕ записали файл обмена, сначала запишем из центр
               ЗаписьXML = Новый ЗаписьXML();
               ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_KOR_KOT.xml";
               ЗаписьXML.ОткрытьФайл(ИмяФайлаСообщения);
               ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
               ЗаписьСообщения.НачатьЗапись(ЗаписьXML,УзелЗагрузки);
               ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);
               ЗаписьСообщения.ЗакончитьЗапись();
               ЗаписьXML.Закрыть();
               Сообщить("1) ОБМЕН: Файл из центр базы записан");
               ЗавершитьРаботуСистемы(Ложь);
               //КомандаСистемы("""C:\Program Files\1cv81\bin\1cv8.exe"" ENTERPRISE /Fi:\UAT8_les_KOT" /N"obmen" /P"obmen" /C" + ИмяФайлаСообщения);
               //КомандаСистемы("""C:\Program Files\1cv81\bin\1cv8.exe"" ENTERPRISE /Fi:\UAT8_les_KOT" +"/N"obmen" /P"obmen" "/C" + ИмяФайлаСообщения);
               // /F"C:\UAT8_les_KOT
               //***конецесли;
               
           Иначе //СЕГОДНЯ из Периф базы выгрузили файл обмена -> ОБМЕН ДЕЛАТЬ ПОСЛЕ ПОЛУНОЧИ, ЧТ. ФАЙЛ ОБМЕНА Message_KOT_KOR БЫЛ НА ТЕКУЩУЮ ДАТУ
               //ЧТЕНИЕ xml-файла центр базы
               Попытка
                   ЧтениеXML = Новый ЧтениеXML();
                   ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_KOT_KOR.xml"; //НАДО НА СЕРВЕРЕ
                   ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения);
                   ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
                   ЧтениеСообщения.НачатьЧтение(ЧтениеXML,); //
                   //ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина;
                   ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);
                   ЧтениеСообщения.ЗакончитьЧтение();  
                   ЧтениеXML.Закрыть();  
                   Если Константы.ВыводитьСообщенияОбмена.Получить() Тогда
                       Сообщить("ОБМЕН: Данные обмена приняты",СтатусСообщения.Информация);
                   КонецЕсли;
                   Сообщить("4) ОБМЕН: Файл из базы Периф базы принят");
               Исключение
                   Сообщить("ОБМЕН: Ошибка при получении данных обмена: " + ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
               КонецПопытки;
               //После того, как чтение данных обмена закончено, возвращаем
               //параметру сеанса ИдетОбменРаспределеннойБазы значение Ложь.
               //ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Ложь;
               
           КонецЕсли;
           
           //ЗАПУСК периф БАЗЫ
           //!!!выполняется сл. строка батника: запуск 1СПредприятия UAT8_les_KOT
           
           //ЗапуститьПриложение(,,);
           //ИмяБатФайла = "" + Каталог + "UAT8_les_OBMEN.bat";
           //КомандаСистемы(""""+ ИмяБатФайла + """");
           
           
           
           
       Иначе //Если ПерифБаза = 1 тогда  //Периферийная база
           //ЧТЕНИЕ xml-файла центр базы
           Попытка
               Состояние("Считываем файл центр базы");
               ЧтениеXML = Новый ЧтениеXML();
               ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_KOR_KOT.xml";
               ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения);
               ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения();
               ЧтениеСообщения.НачатьЧтение(ЧтениеXML,);
               //ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Истина;
               ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);
               предупреждение("Ура: ДАННЫЕ из центр базы загрузились.");
               ЧтениеСообщения.ЗакончитьЧтение();
               ЧтениеXML.Закрыть();
               Сообщить("2) ОБМЕН: ДАННЫЕ ОБМЕНА в базу Перифа приняты");
               //ЗавершитьРаботуСистемы(Ложь); //КОГДА 2 РАЗА
           Исключение
               СтрОписания="Обновление может быть выполнено в режиме Конфигуратор.";
               Если Прав(ОписаниеОшибки(),СтрДлина(СтрОписания))=СтрОписания Тогда
                   ОбновитьКонфигурацию();  // процедура обновления конфигурации КонфигурацияИзменена()
                   
                   //открыть конфигуратор
                   //КомандаСистемы(""""""+КаталогПрограммы()+"1CV8.EXE"""" CONFIG /F ""C:\UAT8_les_KOT"" /N Obmen /P Obmen /UpdateDBCfg");
                   //КомандаСистемы(""""""+КаталогПрограммы()+"1CV8.EXE"""" ENTERPRISE /F ""C:\UAT8_les_KOT"" /N obmen /P obmen/wait");
                   //ЗавершитьРаботуСистемы(Ложь);    
                   
                   //предупреждение("вышли из скрипта"); //а 1C  из скрипта еще не запустилась
                   //ЗавершитьРаботуСистемы(Ложь);
               Иначе
                   Сообщить("ОБМЕН: Ошибка при получении данных обмена: " + ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
               КонецЕсли;
           КонецПопытки;
           //ПараметрыСеанса.ИдетОбменРаспределеннойБазы = Ложь;
           
           
           //ЗАПИСЬ xml-файла периф базы
           //ЗаписьXML = Новый ЗаписьXML();
           //ИмяФайлаСообщения = КаталогВременныхФайлов() + "Message_KOT_KOR.xml";  
           //ЗаписьXML.ОткрытьФайл(ИмяФайлаСообщения);
           //ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения();
           //ЗаписьСообщения.НачатьЗапись(ЗаписьXML,УзелЗагрузки);
           //ПланыОбмена.ЗаписатьИзменения(ЗаписьСообщения);
           //ЗаписьСообщения.ЗакончитьЗапись();
           //ЗаписьXML.Закрыть();
           //Файл = Новый Файл(ИмяФайлаСообщения);
           //Если Файл.Существует() Тогда
           //    ДатаИзмФайлаXMLПериф = Лев(Строка(Файл.ПолучитьВремяИзменения()),10); //Пример: 11.11.2011 13:42:48
           //КонецЕсли;
           //Сообщить("3) ОБМЕН: Файл из Периф базы записан");
           
           //предупреждение("ЗавершитьРаботуСистемы");
           ЗавершитьРаботуСистемы(Ложь); //Периф базы
           
           //Открывается батником 2-й раз центр база
           //КомандаСистемы("""C:\Program Files\1cv81\bin\1cv8.exe"" ENTERPRISE /Fi:\UAT8_les" /N"obmen" /P"obmen" /C" + ИмяФайлаСообщения);
       КонецЕсли;
   КонецЕсли;
37 zladenuw
 
16.11.11
16:08
так у тебя ведь   ЗапуститьПриложение(ПутьКСкрипту); //запустить скрипт, записанный выше
без ожидание завершение запуска
38 Adgjj
 
16.11.11
16:08
из http://infostart.ru/public/16993/
не использую, т.к. у меня в типовой таких констант и ролей нет
Процедура ПриНачалеРаботыСистемы()
   // Инициализация авто обмена
   Если РольДоступна("АвтоОбмен") Тогда
         // Если нами был включен запрет для обновления конфигурации ИБ
       Если  Константы.РежимЗавершенияРаботыПользователей.Получить()<>Перечисления.РежимыЗавершенияРаботыПользователей.РазрешитьРаботу Тогда
           Константы.РежимЗавершенияРаботыПользователей.Установить(Перечисления.РежимыЗавершенияРаботыПользователей.РазрешитьРаботу);
       КонецЕсли;
       ЧастотаОбмена=Константы.ЧастотаАвтоОбменаДанными.Получить();
       Если ЧастотаОбмена<>0 Тогда
           ПодключитьОбработчикОжидания("АвтообменДанными",ЧастотаОбмена);
       Иначе
           Сообщить("Не задана частота авто обмена, подключение не возможно.",СтатусСообщения.Внимание);
       КонецЕсли;
   КонецЕсли;
КонецПроцедуры
39 Adgjj
 
16.11.11
16:10
(37) я уже писала, что если пишу ЗапуститьПриложение(ПутьКСкрипту,,Истина); то задача совсем не работает - загрузки данных не происходит
выложен вариант обработки, к-рый работает хоть и 1 раз 1СПредпр надо вручную закрыть - с другими попытками не работало совсем
40 Adgjj
 
16.11.11
16:15
к (39) в случае если пишу истина, 1с в режмие польз не открывается
После первого выполнения батника открыла конф периф базы: код занесен, то у конф стоит "!"
41 Adgjj
 
16.11.11
16:15
но
Пользователь не знает, чего он хочет, пока не увидит то, что он получил. Эдвард Йодан