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