Главная Статьи Разработки Обратная связь

РИБ на v8: Автоматический прием сообщения обмена, содержащего изменения в конфигурации.

При реализации в распределенной информационной базе автоматического обмена данными, возникает проблема при приеме сообщения, содержащего изменение метаданных. Так как в этом случае, необходим запуск конфигуратора и обновление конфигурации информационной базы. Реализацию автоматического приема такого сообщения можно разделить на следующие этапы:

  1. При чтении сообщения, определить, что получены изменения конфигурации.
  2. Выполнить обновление конфигурации базы данных.
  3. "Дочитать" сообщение обмена.

Что бы определить факт получения изменений в метаданных можно воспользоваться методом глобального контекста КонфигурацияИзменена() или, выполняя чтение сообщения обмена в конструкции Попытка, проанализировать ОписаниеОшибки(). Например:

 Попытка
   Чтение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 Тогда
       ПодключитьОбработчикОжидания("АвтообменДанными",ЧастотаОбмена);
     Иначе
       Сообщить("Не задана частота авто обмена, подключение не возможно.",СтатусСообщения.Внимание);
     КонецЕсли;
   КонецЕсли;
 КонецПроцедуры
Назад
Copyright © coder1cv8 2008 г. Все права защищены
Сайт создан в системе uCoz