РИБ на 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%

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

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

55778 50200 руб.

04.08.2015    169740    353    281    

389

Перенос данных 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27660 руб.

12.06.2017    144611    839    297    

433

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

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

35000 руб.

23.07.2020    54904    248    73    

202

SALE! 10%

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

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой

55778 50200 руб.

15.04.2019    73572    194    154    

131

SALE! 10%

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

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

53111 47800 руб.

03.12.2020    37837    103    69    

98

SALE! 10%

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

Можно проверить до покупки, оставьте заявку! Воспользовались более 268 компаний! Перенос данных из УТ 10.3 в УТ 11 | из УТ 10.3 в КА 2 | из УТ 10.3 в ERP. Предлагаем качественное и проверенное временем решение для перехода с УТ 10.3. Можно перенести начальные остатки, нормативно-справочную информацию и все возможные документы. При выгрузке можно установить отбор по периоду, организациям и складам. При выходе новых релизов конфигураций 1C оперативно выпускаем обновление переноса данных.

55778 50200 руб.

24.04.2015    196845    157    244    

287

SALE! 10%

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

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена | Можно выполнить переход с УПП на БП 3 или запускать выгрузку данных за выбранный период времени | Переносятся документы, начальные остатки и вся справочная информация | Есть фильтр по организации и множество других параметров выгрузки | Поддерживается несколько сценариев работы: как первичный полный перенос, так и перенос только новых документов | Перенос данных возможен в "1С: Бухгалтерия 3.0" версии ПРОФ, КОРП или базовую | Переход с "1С: УПП1.3" / "1С:КА 1.1" на "1С:БП3.0" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

48278 43450 руб.

25.02.2015    172711    310    260    

386

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

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

35000 руб.

15.12.2021    25501    181    52    

138
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Abadonna 3970 25.07.07 18:50 Сейчас в теме
Хоть и не программлю в 8-ке, подозреваю, что статья хорошая и полезная
+1
2. coder1cv8 3481 25.07.07 20:34 Сейчас в теме
(1) Спасибо, а то я уже не знаю как относиться к тому, что никто ни как не прокомментировал... )
ALL: Если статья плохая, то так и говорим не стесняемся... )
3. tormozit 7263 03.08.07 10:35 Сейчас в теме
Хорошая статья. У нас сделано похожим образом, но еще добавлена попытка динамического обновления и рассылки сообщений пользователям.
4. tormozit 7263 03.08.07 10:56 Сейчас в теме
Кстати, а поясни пожалуйста
Код
НСтр(СтрокаСоединения,"File")
Показать полностью
5. coder1cv8 3481 06.08.07 09:31 Сейчас в теме
(4) Как говорит Синтакс-помощник, НСтр - "получает строку на языке текущего пользователя или указанном языке из набора строк на разных языках конфигурации". А СтрокаСоединения - это как мы видим СтрокаСоединенияИнформационнойБазы(), которая представляет собой, вобщем-то, подобие набора строк на разных языках. Т.е., если для НСтр в качестве параметра <Код языка>, передать "File", то мы получим каталог информационной базы, для файлового режима. Для клиент-серверного режима, аналогично можно получить значения "Srvr" и "Ref" из строки соединения.
6. tormozit 7263 06.08.07 09:38 Сейчас в теме
Понял. Спасибо, берем на вооружение.
7. ILNIK 34 25.06.08 17:50 Сейчас в теме
хотелось бы ,что бы проверялось на попытку динамического обновления и если возможно, обновляла бы динамически
8. coder1cv8 3481 25.06.08 19:14 Сейчас в теме
(7) Ну это давно писалось, я тогда 8.1 ещё не видел... )
9. artbear 1566 12.02.09 09:48 Сейчас в теме
Вариант с динамическим обновлением еще не появился?
10. coder1cv8 3481 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 3481 15.02.10 17:53 Сейчас в теме
(18) В свою обработку читающую сообщения )
Вообще, с тех пор как я это писал, прошло много времени... Сейчас уже подобный механизм встроен в типовые, можно там подсмотреть...
20. a_titeev 33 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 1918 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 Ответить
26. Dendik 2 21.02.25 10:15 Сейчас в теме
Коллеги добрый день!
А разве такая конструкция рабочая?

Команда=""""""+КаталогПрограммы()+"1CV8.EXE"""" CONFIG"+?(НСтр(СтрокаСоединения,"File")<>""," /F "+НСтр(СтрокаСоединения,"File")," /S "+НСтр(СтрокаСоединения,"Srvr")+"\"+НСтр(СтрокаСоединения,"Ref"))+" /N Exchange /P Exchange /UpdateDBCfg";

У меня не отрабатывает. В документация написано что ключ /UpdateDBCfg работает только совместно с другими ключами типа /LoadCfg или /UpdateCfg; Пробовал и CONFIG и DESIGNER это по сути одно и тоже.
Оставьте свое сообщение