При реализации в распределенной информационной базе автоматического обмена данными, возникает проблема при приеме сообщения, содержащего изменение метаданных. Так как в этом случае, необходим запуск конфигуратора и обновление конфигурации информационной базы. Реализацию автоматического приема такого сообщения можно разделить на следующие этапы: При чтении сообщения, определить, что получены изменения конфигурации. Выполнить обновление конфигурации базы данных. "Дочитать" сообщение обмена. Что бы определить факт получения изменений в метаданных можно воспользоваться методом глобального контекста КонфигурацияИзменена() или, выполняя чтение сообщения обмена в конструкции Попытка, проанализировать ОписаниеОшибки(). Например:
Попытка ЧтениеXML=Новый ЧтениеXML; ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения); ЧтениеСообщения=ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеXML); ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения); ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); Исключение СтрОписания="Обновление может быть выполнено в режиме Конфигуратор."; Если Прав(ОписаниеОшибки(),СтрДлина(СтрОписания))=СтрОписания Тогда ОбновитьКонфигурацию(); // процедура обновления конфигурации Иначе Сообщить(ОписаниеОшибки()); КонецЕсли; КонецПопытки;
Для выполнения обновления конфигурации информационной базы, необходимым условием является монопольный режим, т.е. отсутствие в базе других активных пользователей. Таким образом, предварительно необходимо «выгнать» из базы работающих пользователей. В типовых конфигурациях это можно сделать, установив константу РежимЗавершенияРаботыПользователей. Исходя из этого, наша процедура обновления конфигурации выглядит следующим образом:
Процедура ОбновитьКонфигурацию() ОтключитьОбработчикОжидания("АвтообменДанными"); // отключим наш обработчик, в котором происходит обмен сообщениями Константы.РежимЗавершенияРаботыПользователей.Установить(Перечисления.РежимыЗавершенияРаботыПользователей. ЗавершитьПослеОжиданияПодтвержденияПользователя); ПодключитьОбработчикОжидания("ОбновлениеКонфигурацииИБ",10); КонецПроцедуры
Обработчик ожидания "ОбновлениеКонфигурацииИБ", предназначен для того, что бы с установленным интервалом (в данном случае 10 сек.), проверять вышли ли все пользователи из базы и если да, то запускать обновление конфигурации информационной базы. Само обновление конфигурации реализовано с помощью внешнего скрипта. Ниже приведен программный код этого обработчика:
Процедура ОбновлениеКонфигурацииИБ() Экспорт МассивСоединений=ПолучитьСоединенияИнформационнойБазы(); Если МассивСоединений.Количество()>1 Тогда Возврат; // ждем дальше... КонецЕсли; СтрокаСоединения=СтрокаСоединенияИнформационнойБазы(); ПутьКСкрипту=КаталогВременныхФайлов()+"exchange.vbs"; Скрипт=Новый ЗаписьТекста(ПутьКСкрипту,КодировкаТекста.ANSI); Скрипт.ЗаписатьСтроку("WScript.Sleep 5000"); // на всякий случай Скрипт.ЗаписатьСтроку("Set WshShell=CreateObject(""WScript.Shell"")"); Команда=""""""+КаталогПрограммы()+"1CV8.EXE"""" CONFIG"+?(НСтр(СтрокаСоединения,"File")<>""," /F "+НСтр(СтрокаСоединения,"File")," /S "+НСтр(СтрокаСоединения,"Srvr")+"\"+НСтр(СтрокаСоединения,"Ref"))+" /N Exchange /P Exchange /UpdateDBCfg"; Скрипт.ЗаписатьСтроку("ReturnCode=WshShell.Run("""+Команда+""",1,1)"); Скрипт.ЗаписатьСтроку("If ReturnCode=0 Then"); // если обновились удачно, то пытаемся дочитать сообщение Команда=""""""+КаталогПрограммы()+"1CV8.EXE"""" ENTERPRISE"+?(НСтр(СтрокаСоединения,"File")<>""," /F "+НСтр(СтрокаСоединения,"File")," /S "+НСтр(СтрокаСоединения,"Srvr")+"\"+НСтр(СтрокаСоединения,"Ref"))+" /N Exchange /P Exchange"; Скрипт.ЗаписатьСтроку("WshShell.Run """+Команда+""",1,0"); Скрипт.ЗаписатьСтроку("End If"); Скрипт.ЗаписатьСтроку("Set FSO=CreateObject(""Scripting.FileSystemObject"")"); Скрипт.ЗаписатьСтроку("Set File=FSO.GetFile(WScript.ScriptFullName)"); Скрипт.ЗаписатьСтроку("File.Delete"); Скрипт.Закрыть(); ЗапуститьПриложение(ПутьКСкрипту); ЗавершитьРаботуСистемы(Ложь); КонецПроцедуры
Сформированный в результате скрипт, запускает обновление конфигурации базы данных, затем базу в режиме Предприятия и после этого сам себя удаляет. Подразумевается, что при старте системы, происходит подключение обработчика ожидания, в котором выполняется авто обмен данными с установленной частотой. Так же, важно не забывать при этом «выключать» РежимЗавершенияРаботыПользователей. Ниже приведен пример реализации подключения авто обмена:
Процедура ПриНачалеРаботыСистемы() // Инициализация авто обмена Если РольДоступна("АвтоОбмен") Тогда // Если нами был включен запрет для обновления конфигурации ИБ Если Константы.РежимЗавершенияРаботыПользователей.Получить()<>Перечисления.РежимыЗавершенияРаботыПользователей.РазрешитьРаботу Тогда Константы.РежимЗавершенияРаботыПользователей.Установить(Перечисления.РежимыЗавершенияРаботыПользователей.РазрешитьРаботу); КонецЕсли; ЧастотаОбмена=Константы.ЧастотаАвтоОбменаДанными.Получить(); Если ЧастотаОбмена<>0 Тогда ПодключитьОбработчикОжидания("АвтообменДанными",ЧастотаОбмена); Иначе Сообщить("Не задана частота авто обмена, подключение не возможно.",СтатусСообщения.Внимание); КонецЕсли; КонецЕсли; КонецПроцедуры
Оригинальный текст: http://www.coder1cv8.narod.ru/Publication2.html
|