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

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

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

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

45650 36520 руб.

04.08.2015    159665    363    267    

345

SALE! 15%

[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 22572 руб.

12.06.2017    134919    722    291    

388

SALE! 20%

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

Обмен между базами 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 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

34650 27720 руб.

15.04.2019    68413    178    138    

111

SALE! 20%

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

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

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

43450 34760 руб.

03.12.2020    34167    80    58    

78

SALE! 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 25200 руб.

23.07.2020    46283    196    64    

157

SALE! 10%

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

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

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

50722 45650 руб.

31.10.2014    231389    124    327    

295

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

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

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

60000 руб.

05.10.2022    9205    9    8    

10

SALE! 10%

Перенос данных из УПП 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 25200 руб.

15.12.2021    20234    132    38    

90
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. Abadonna 3958 25.07.07 18:50 Сейчас в теме
Хоть и не программлю в 8-ке, подозреваю, что статья хорошая и полезная
+1
2. coder1cv8 3468 25.07.07 20:34 Сейчас в теме
(1) Спасибо, а то я уже не знаю как относиться к тому, что никто ни как не прокомментировал... )
ALL: Если статья плохая, то так и говорим не стесняемся... )
3. tormozit 7136 03.08.07 10:35 Сейчас в теме
Хорошая статья. У нас сделано похожим образом, но еще добавлена попытка динамического обновления и рассылки сообщений пользователям.
4. tormozit 7136 03.08.07 10:56 Сейчас в теме
Кстати, а поясни пожалуйста
Код
НСтр(СтрокаСоединения,"File")
Показать полностью
5. coder1cv8 3468 06.08.07 09:31 Сейчас в теме
(4) Как говорит Синтакс-помощник, НСтр - "получает строку на языке текущего пользователя или указанном языке из набора строк на разных языках конфигурации". А СтрокаСоединения - это как мы видим СтрокаСоединенияИнформационнойБазы(), которая представляет собой, вобщем-то, подобие набора строк на разных языках. Т.е., если для НСтр в качестве параметра <Код языка>, передать "File", то мы получим каталог информационной базы, для файлового режима. Для клиент-серверного режима, аналогично можно получить значения "Srvr" и "Ref" из строки соединения.
6. tormozit 7136 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 1448 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 Ответить
Оставьте свое сообщение