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

Вступайте в нашу телеграмм-группу Инфостарт

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

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

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

58000 руб.

04.08.2015    186839    440    301    

450

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 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. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

27633 руб.

12.06.2017    160174    963    317    

481

Перенос данных 1C Файловый обмен (TXT, XML, DBF), FTP Системный администратор Программист 1С:Предприятие 8 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" с помощью правил конвертации будет максимально комфортным! | Можно бесплатно проверить перенос на вашем сервере!

50050 руб.

25.02.2015    187836    358    288    

417

SALE! 10%

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

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

42000 37800 руб.

15.12.2021    33859    254    64    

194

SALE! 10%

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

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

42000 37800 руб.

23.07.2020    67833    314    95    

252

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

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

58000 руб.

15.04.2019    83760    224    174    

161

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

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

84000 руб.

05.10.2022    13289    15    8    

16

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

Правила переноса кадровых и расчетных данных и справочной информации из "1С:УПП1.3" или "1С:КА 1.1" в "1С:ЗУП 3.1 | Разработан в формате КД 2 (правила конвертации данных) | При выгрузке есть фильтр по организациям | Обновляется при выходе новых релизов 1С | Развитие алгоритмов | Расчетные документы переносятся в документ "Перенос данных" | Создаются документы "Начальная штатная расстановка" и "Начальная задолженность по зарплате", переносятся кадровые документы

58000 руб.

29.10.2018    62574    80    131    

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