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

24.07.07

Интеграция - Обмен между базами 1C

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

См. также

SALE! 10%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

Обмен между базами 1C Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Обработка позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию. Переносятся документы, а также начальные остатки и справочная информация. Есть фильтр по организации и множество других опциональных параметров выгрузки. Наши правила переноса в продаже с 2015 года, постоянно работаем над их развитием. Более 360 предприятий выполнили переход с использованием этого продукта. Оказываем техническую поддержку по всем вопросам проекта переноса данных из УПП 1.3.

50722 45650 руб.

04.08.2015    159273    363    266    

345

SALE! 10%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 руб.

12.06.2017    134604    718    291    

387

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.223.x) и БП 3.0 (3.0.149.x). Правила подходят для версии ПРОФ и КОРП.

28000 руб.

15.12.2021    20091    132    38    

90

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2

Обмен между базами 1C Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Переносятся документы за выбранный период, нормативно-справочная информация и остатки по счетам бухгалтерского учета из программы "1С:БП 3.0" в "1С:УТ 11" или "1С:КА. 2" или "1С:ERP Управление предприятием, ред. 2".

50722 45650 руб.

31.10.2014    231096    124    326    

295

SALE! 10%

Перенос данных из ERP 2 / КА 2 в ЗУП 3

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Обработка позволяет не только перенести все документы, справочную информацию и начальные остатки из ERP 2 или КА 2 в ЗУП 3, но и организовать регулярный перенос данных между программами 1С:ERP 2 / КА 2 и 1С:ЗУП 3. Вы можете выбрать период отбора данных и установить фильтр по организациям, чтобы выгружать только необходимую информацию. Более того, перенос оперативно обновляется при выходе новых релизов программы 1С, так что вы всегда будете иметь самую актуальную версию обработки.

48278 43450 руб.

03.12.2020    34034    80    57    

78

SALE! 10%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос позволяет настроить собственный обмен данными между указанными программами, альтернативный предлагаемому фирмой 1С. Перенос данных осуществляется из 1С:ERP 2 / 1С:КА 2 / 1С:УТ 11 в 1С:БП 3.0. Правила обмена оперативно обновляются при выходе новых релизов программы 1С, так что вы всегда будете иметь самую актуальную версию обработки.

38500 34650 руб.

15.04.2019    68196    176    136    

108

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9155    9    8    

10

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 руб.

23.07.2020    46020    194    64    

153
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Abadonna 3958 25.07.07 18:50 Сейчас в теме
Хоть и не программлю в 8-ке, подозреваю, что статья хорошая и полезная
+1
2. coder1cv8 3468 25.07.07 20:34 Сейчас в теме
(1) Спасибо, а то я уже не знаю как относиться к тому, что никто ни как не прокомментировал... )
ALL: Если статья плохая, то так и говорим не стесняемся... )
3. tormozit 7133 03.08.07 10:35 Сейчас в теме
Хорошая статья. У нас сделано похожим образом, но еще добавлена попытка динамического обновления и рассылки сообщений пользователям.
4. tormozit 7133 03.08.07 10:56 Сейчас в теме
Кстати, а поясни пожалуйста
Код
НСтр(СтрокаСоединения,"File")
Показать полностью
5. coder1cv8 3468 06.08.07 09:31 Сейчас в теме
(4) Как говорит Синтакс-помощник, НСтр - "получает строку на языке текущего пользователя или указанном языке из набора строк на разных языках конфигурации". А СтрокаСоединения - это как мы видим СтрокаСоединенияИнформационнойБазы(), которая представляет собой, вобщем-то, подобие набора строк на разных языках. Т.е., если для НСтр в качестве параметра <Код языка>, передать "File", то мы получим каталог информационной базы, для файлового режима. Для клиент-серверного режима, аналогично можно получить значения "Srvr" и "Ref" из строки соединения.
6. tormozit 7133 06.08.07 09:38 Сейчас в теме
Понял. Спасибо, берем на вооружение.
7. ILNIK 30 25.06.08 17:50 Сейчас в теме
хотелось бы ,что бы проверялось на попытку динамического обновления и если возможно, обновляла бы динамически
8. coder1cv8 3468 25.06.08 19:14 Сейчас в теме
(7) Ну это давно писалось, я тогда 8.1 ещё не видел... )
9. artbear 1447 12.02.09 09:48 Сейчас в теме
Вариант с динамическим обновлением еще не появился?
10. coder1cv8 3468 12.02.09 11:38 Сейчас в теме
(9) Нет. Сейчас эта тема для меня не актуальна, да и времени свободного совсем нет... (
11. stack_g 16.02.09 15:02 Сейчас в теме
Спасибо, то что нужно. Сейчас по этому примеру буду прописывать :)
12. NOX85 27.03.09 17:00 Сейчас в теме
Отличная вещь. Только возникла одна проблема, может кто подскажет как ее решить. Я немного доработал эту обработку и установил ее в качестве регламентного задания, т. е. когда в узел приходи письмо с обновлением, он в фоновом режиме выгоняет всех пользователей (Через сервер 1С). После чего обновляется. Вот только проблема в том что первый раз она обновляется нормально, а второй, в сервере 1С зависате, фоновое задание, и не как его удалить нельзя, даже если в SQL разорвать соединение, в сервере 1С оно всеравно висит, и соответственно обновление больше не делается, помогает только перезапуск службы "Агент сервер 1С".
13. Niko_ 04.06.09 17:21 Сейчас в теме
У меня серверный вариант,через регламентное задание выполняется динамическое задание,токо в задании прописал просто обмен, а при чтении сообщения вставил скрипт и всё ОК!
Только теперь надо сделать предупреждение пользователям, подождать определенное время, и перезапустить (обновить) конфу. Может кто чё подскажет?
14. gulchitai 06.10.09 05:39 Сейчас в теме
14. gulchitai 06.10.09 05:38 Сейчас в теме
Статья очень хорошая, огромное спасибо автору. Внедрила это у нас. только ЗавершитьРаботуСистемы(Ложь) в процедуре обновления иб упорно не срабатывало (не закрывало 1с). зато ПрекратитьРаботуСистемы() сработало отлично.
И еще не запускается, если имя БД с пробелами, тогда надо еще путь к базе с кавычками указывать, даже если серверный вариант.
15. gulchitai 06.10.09 05:41 Сейчас в теме
Статья хорошая, огромное спасибо автору.
Только ЗавершитьРаботуСистемы(Ложь) упорно не работает у меня, не закрывает 1с. Заменила на ПрекратитьРаботуСистемы и все пошло. И еще, если имя БД с пробелами, то не работает. нужны дополнительные кавычки в серверном варианте.
coder1cv8; +1 Ответить
17. Advakant 15.02.10 13:47 Сейчас в теме
извеняюсь за нубо вопрос...ну куда этот код вписывается ?
18. Advakant 15.02.10 13:49 Сейчас в теме
Попытка
ЧтениеXML=Новый ЧтениеXML;
ЧтениеXML.ОткрытьФайл(ИмяФайлаСообщения);
ЧтениеСообщения=ПланыОбмена.СоздатьЧтениеСообщения();
ЧтениеСообщения.НачатьЧтение(ЧтениеXML);
ПланыОбмена.ПрочитатьИзменения(ЧтениеСообщения);
ЧтениеСообщения.ЗакончитьЧтение();
ЧтениеXML.Закрыть();
Исключение
СтрОписания="Обновление может быть выполнено в режиме Конфигуратор.";
Если Прав(ОписаниеОшибки(),СтрДлина(СтрОписания))=СтрОписания Тогда
ОбновитьКонфигурацию(); // процедура обновления конфигурации
Иначе
Сообщить(ОписаниеОшибки());
КонецЕсли;
КонецПопытки;
19. coder1cv8 3468 15.02.10 17:53 Сейчас в теме
(18) В свою обработку читающую сообщения )
Вообще, с тех пор как я это писал, прошло много времени... Сейчас уже подобный механизм встроен в типовые, можно там подсмотреть...
20. a_titeev 31 14.03.10 18:45 Сейчас в теме
Кто использует подобный механизм, может пригодится вывод сообщения о том, что в данный момент производится обновление... процесс обновления может быть затянутым, вывод сообщения пользователю не помешает, т.к. сталкивался с тем, что если, например, делается длительная реструктуризация пользак может например тупо выключить комп и пойти домой... А утром приходит - не запускается... И давай названивать... А база уже убита...

Применительно тому коду, который есть здесь, можно сделать хотя бы так (во всяком случае делал, изменив код формирования скрипта):

...
    // создаем скрипт с сообщением
    ПутьКСкрипту1=КаталогВременныхФайлов()+"message.vbs";
    Скрипт=Новый ЗаписьТекста(ПутьКСкрипту1,КодировкаТекста.ANSI);
    Скрипт.ЗаписатьСтроку("MsgBox ""Производится обновление конфигурации... Не выключайте компьютер!"",, ""Внимание!""");
    Скрипт.Закрыть();
    // создаем основной скрипт
    СтрокаСоединения=СтрокаСоединенияИнформационнойБазы();
    ПутьКСкрипту2=КаталогВременныхФайлов()+"exchange.vbs";
    Скрипт=Новый ЗаписьТекста(ПутьКСкрипту2,КодировкаТекста.ANSI);
    Скрипт.ЗаписатьСтроку("Dim WshShell, oExec");
    Скрипт.ЗаписатьСтроку("Set WshShell=CreateObject(""WScript.Shell"")");
    Скрипт.ЗаписатьСтроку("Set oExec = WshShell.Exec(""wscript.exe """""+ПутьКСкрипту1+""""""")");
    Скрипт.ЗаписатьСтроку("WScript.Sleep 5000"); // на всякий случай
    Команда=""""""+КаталогПрограммы()+"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 " + ИмяПользователя();
    Скрипт.ЗаписатьСтроку("WshShell.Run """+Команда+""",1,0");
    Скрипт.ЗаписатьСтроку("End If");
    Скрипт.ЗаписатьСтроку("Set FSO=CreateObject(""Scripting.FileSystemObject"")");
    Скрипт.ЗаписатьСтроку("Set File=FSO.GetFile(WScript.ScriptFullName)");
    Скрипт.ЗаписатьСтроку("oExec.Terminate");
    Скрипт.ЗаписатьСтроку("File.Delete");
    Скрипт.Закрыть();
    ЗапуститьПриложение(ПутьКСкрипту2);
...
Показать



PS. Механизм в типовых довольно убогий. Подобный все равно лучше, во всяком случае, когда не применяется автоматический обмен, а обмениваемся "вручную"... Только нужно код немного поменять из примера...
adhocprog; borman; +2 Ответить
21. borman 78 23.11.11 15:56 Сейчас в теме
Типовой механизм убогий однозначно, ИМХО.
Автору спасибо!
22. bolush 12.03.12 15:02 Сейчас в теме
Этот то что я искал, я думаю что поможет, спасибо автору:)
23. Psylocibine 15.06.12 13:18 Сейчас в теме
Спасибо, буду ковырять под себя)
24. echo77 1868 28.09.14 11:53 Сейчас в теме
Переоформите листинги программ в публикации - читать невозможно
pqt; PanKir; +2 Ответить
25. rustemg 21.03.15 16:42 Сейчас в теме
Вот сформатированный:

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

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

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

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