Мой вариант:
Изменения в модуле обычного приложения (думаю с легкими модификациями подобный механизм можно использовать и в управляемом режиме, сам не думал: необходимости нет):
Перем глОтображеноПредупреждениеКонфРИБ Экспорт; ... // Проверка на обновление конфигурации РИБ для кассиров с выдачей предупреждения Функция ПроверкаНаОбновлениеКонфигурации() Экспорт Если КонфигурацияИзменена() И НЕ глОтображеноПредупреждениеКонфРИБ Тогда глОтображеноПредупреждениеКонфРИБ = Истина; Предупреждение( "ВНИМАНИЕ!!! ПРИНЯТО ИЗМЕНЕНИЕ КОНФИГУРАЦИИ." + Символы.ПС + Символы.ПС + "Закройте 1С на всех компьютерах и запустить программу с полными правами" + Символы.ПС + "После запуска необходимо согласиться на обновление конфигурации." + Символы.ПС + "В противном случае обмен с учетной системой офиса производиться не будет!", 30, "Обновление конфигурации" ); глОтображеноПредупреждениеКонфРИБ = Ложь; КонецЕсли; КонецФункции // Обновление конфигурации в узле Функция ОбновитьКонфигурациюБазыДанныхРИБ() Экспорт //Если конфигурация изменена, тогда нужно выполнить ее обновление... флОбновлять = Ложь; Если КонфигурацияИзменена() И НЕ глОтображеноПредупреждениеКонфРИБ Тогда глОтображеноПредупреждениеКонфРИБ = Истина; Если Вопрос( "ВНИМАНИЕ!!! ПРИНЯТО ИЗМЕНЕНИЕ КОНФИГУРАЦИИ. РЕКОМЕНДУЕТСЯ ИХ ПРИНЯТЬ." + Символы.ПС + Символы.ПС + "Закройте 1С на всех компьютерах торговой точки и нажмите ""ДА"" для обновления." + Символы.ПС + "Если вы хотите продолжать работу без обновления (не рекомендуется) нажмите ""НЕТ""." + Символы.ПС + "При отказе от немедленного обновления, обязательно сделайте его в ближайшее время."+ Символы.ПС + "В противном случае обмен с учетной системой офиса производиться не будет!"+ Символы.ПС + Символы.ПС + "ОБНОВИТЬ КОНФИГУРАЦИЮ?", РежимДиалогаВопрос.ДаНет, 60, КодВозвратаДиалога.Нет, "Обновление кнфигурации", КодВозвратаДиалога.Нет) = КодВозвратаДиалога.Да Тогда флОбновлять = Истина; КонецЕсли; Если НЕ флОбновлять Тогда Сообщить(Формат(ТекущаяДата(), "ДЛФ=В")+", отказ от обновления конфигурации"); глОтображеноПредупреждениеКонфРИБ = Ложь; Возврат Ложь; КонецЕсли; //Смотрим, чтобы в базе никого не сидело Попытка УстановитьМонопольныйРежим(Истина); Исключение Предупреждение("Ошибка захвата базы в монопольном режиме!" + Символы.ПС + ОписаниеОшибки()); глОтображеноПредупреждениеКонфРИБ = Ложь; Возврат Ложь; КонецПопытки; Предупреждение( "Работа системы будет завершена для обновления конфигурации" + Символы.ПС + Символы.ПС + "ВНИМАНИЕ!!!" + Символы.ПС + "После обновления конфигурации НЕОБХОДИМО ПОВТОРНО ПРОИЗВЕСТИ ОБМЕН!!!" + Символы.ПС + "В противном случае все изменения, полученные из центральной ИБ, обработаны не будут!",30, "Завершение обновления" ); глОтображеноПредупреждениеКонфРИБ = Ложь; ЗавершитьРаботуСистемы(Ложь, Истина, " CONFIG /UpdateDBCfg /Visible "); КонецЕсли; Возврат флОбновлять; КонецФункции // Процедура выполняется перед нначалом работы системы // Процедура ПриНачалеРаботыСистемы() // Проверка обновления конфы в РИБ глОтображеноПредупреждениеКонфРИБ = Ложь; Если ПланыОбмена.ГлавныйУзел() <> Неопределено И ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда Если РольДоступна(Метаданные.Роли.ПолныеПрава) Тогда Если ОбновитьКонфигурациюБазыДанныхРИБ() Тогда Возврат; КонецЕсли; // Проверка обновления в узле РИБ раз в 5 минут под полными правами ПодключитьОбработчикОжидания("ОбновитьКонфигурациюБазыДанныхРИБ", 300); Иначе // Проверка обновления в узле РИБ раз в 30 минут под кассирами ПодключитьОбработчикОжидания("ПроверкаНаОбновлениеКонфигурации", 1800); КонецЕсли; КонецЕсли; ...Для стандартных конфигураций дополнительно можно вставить проверку изменения конфигурации после завершения интерактивного обмена в общем модуле "ПроцедурыОбменаДанными":
// регистрирует что обмен был произведен и фиксирует информацию в протоколе Процедура ЗафиксироватьЗавершениеОбмена(СтруктураДанныхНастройкиОбмена, Знач СтрокаСообщенияОбОшибке = "", ... #Если Клиент Тогда Если СтруктураДанныхНастройкиОбмена.РучнойРежимЗапуска И СтруктураДанныхНастройкиОбмена.ДанныеНастройкиАвтообмена = Неопределено Тогда // для On Line обменов показываем отдельную форму завершения обмена ФормаПоказа = ПолучитьОбщуюФорму("ФормаРезультатOnLineОбмена"); ФормаПоказа.НаборЗаписейИстории = НаборЗаписейИстории; ФормаПоказа.Открыть(); Если ОбщегоНазначения.ИнформационнаяБазаФайловая() Тогда ОбновитьКонфигурациюБазыДанныхРИБ(); КонецЕсли; КонецЕсли; #КонецЕсли КонецПроцедуры
Я прекрасно понимаю что фразы предупреждений и вопросов не универсальны. Но целью публикации было предложить не тиражное решение, а технологию для облегчения жизни администраторам РИБ. Да, самый важный вопрос: ЧЕМ ЭТО ЛУЧШЕ ЧЕМ В ПЕРВОИСТОЧНИКЕ? Считаю такой вариант предпочтительнее чем в Автоматическое обновление конфигурации в узлах РИБ по следующим причинам:
- В первоисточнике строка запуска предполагает заранее известные имя и пароль пользователя для обновления, что накладывает жесткие ограничения на тиражирование решения на различные ИБ, в данном случае решение универсально: запуск конфигуратора происходит от имени пользователя в сеансе которого запущена процедура обновления и повторной регистрации не требуется
- Мелочь, но! Черное окно запуска скрипта не эстетично смотрится :) в данном случае оно отсутствует
- Совсем мелочь, но! НУ НЕ НРАВИТСЯ МНЕ УСЛОВНЫЙ ПЕРЕХОД НА МЕТКУ!!! хоть автор и убеждает что дескать так надо... но глаз режет :)
Как пример работы процедуры, прилагаю обработку для обновления конфигурации ИБ в режиме enterprise
З.Ы. Мелкий совет: отключить надоедливое предупреждение при старте о том что конфигурация БД не соответствует сохраненной конфигурации можно при помощи параметра запуска /DisableStartupMessages. При использовании описанной в публикации технологии практический смысл такого предупреждения равен нулю!