Для данной обработки должны соблюдаться следующие правила:
- Обработка должна быть доступна только пользователям с полными правами.
- Отдельное вынесение в интерфейс данной обработки не требуется.
- Обработка должна иметь одну форму с кратким пояснительным текстом и кнопкой вызова процедуры выполнения пакета инициализационных действий.
- Данная процедура должна быть доступна для программного вызова извне.
- Процедура выполнения пакета должна последовательно вызвать подпроцедуры инициализации, написанные разными разработчиками в рамках своих задач. В каждой из них должна быть собственная (независимая) обработка исключительных ситуаций, с выдачей сообщений об ошибках.
- Ошибка, возникшая в одной в подпроцедуре, не должна влиять на остальную инициализацию.
- Обработку предполагается запускать многократно. Каждое действие должно корректно отрабатывать как при первом запуске обработки, так и при повторных запусках. Во втором случае не должно быть каких-либо побочных эффектов или потери введённых пользователем данных.
В конфигурацию также должен быть добавлен механизм автоматического обнаружения изменений в обработке инициализации и предложения пользователю с полными правами выполнить инициализацию при первой же возможности.
Один из вариантов реализации такого механизма:
- В конфигурации предусматривается константа, хранящая версию последней выполненной обработки инициализации.
- В обработке предусматривается экспортная переменная, хранящая версию (целое число). Версия устанавливается при создании обработки-объекта, значение версии прописано в коде модуля. При любой модификации обработки разработчик должен увеличить данную версию на единицу.
- При начале работы системы, если текущий пользователь имеет полные права и версии обработки в конфигурации и в константе отличаются, выполняется обработка инициализации.
В данном примере, добавлена константа «ВерсияВыполненнойОбработкиИнициализации»
В модуле управляемого приложения в процедуру «ПриНачалеРаботыСистемы()» добавлен вызов серверной процедуры:
Процедура ПриНачалеРаботыСистемы()
// СтандартныеПодсистемы
СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы();
// Конец СтандартныеПодсистемы
//++ VION 08.09.2016 Общие объекты
ОбщегоНазначенияСервер.ВыполнитьОбработкуИнициализации();
//-- VION 08.09.2016
КонецПроцедуры
Которая проверяет наличие прав и вызывает обработку инициализации:
//**************************************************
Процедура ВыполнитьОбработкуИнициализации() Экспорт
Если РольДоступна("ПолныеПрава") Тогда
Обработки.ОбработкаИнициализации.Создать().ВыполнитьОбработку();
КонецЕсли;
КонецПроцедуры
Код модуля обработки инициализации:
//////////////////////////////////////////////////////////
// ОБРАБОТКА ИНИЦИАЛИЗАЦИИ
// --------------------------
// Обработку предполагается запускать многократно.
// Каждое действие должно корректно отрабатывать как при первом запуске обработки, так и при повторных запусках.
// Во втором случае не должно быть каких-либо побочных эффектов или потери введённых пользователем данных.
// В некоторых случаях (если того требует задача) возможно выявление и исправление настроек, уже сделанных,
// но некорректно изменённых пользователем с момента предыдущей инициализации.
// --------------------------
// Используемые объекты конфигурации:
// 1. Константа.ВерсияВыполненнойОбработкиИнициализации - Тип: Число (5,0)
// 2. Вызов обработки при старте системы: Обработки.ОбработкаИнициализации.Создать().ВыполнитьОбработку();
// --------------------------
// Алгоритм для разработчика:
// 1. В процедуре ПолучитьТекущуюВерсиюОбработки() увеличиваете весрию на 1, напрмер было 3, вы ставите 4.
// 2. В модуль обработки добавляете процедуру ОбработкаИнициализации_Версия_4(Отказ).
// 3. Если в процессе обработки возникли ошибки, необходимо установить переменную Отказ в значение Истина.
// 4. Необходимый код располагаете в данной процедуре.
//********************************************************
Функция ПолучитьТекущуюВерсиюОбработки() Экспорт
// ВНИМАНИЕ!
// Код не комментируем, просто увеличиваем текущую версию обработки
// Тип версии - Число (5,0)
Возврат 3;
КонецФункции
//********************************************************
Функция ПолучитьПрошлуюВерсиюОбработки() Экспорт
Возврат Константы.ВерсияВыполненнойОбработкиИнициализации.Получить();
КонецФункции
//********************************************************
Функция УстановитьВерсиюОбработки(ТекущаяВерсия) Экспорт
//Запишем текущую версию в константу
Попытка
Константы.ВерсияВыполненнойОбработкиИнициализации.Установить(ТекущаяВерсия);
Возврат Истина;
Исключение
Сообщить("Обработка инициализации: " + ОписаниеОшибки());
Возврат Ложь;
КонецПопытки;
КонецФункции
//********************************************************
Функция ВыполнитьОбработку(ВсеОбработчики = Ложь) Экспорт
//Обработку инициализации может выполнить только пользователь с полными правами
Если Не РольДоступна("ПолныеПрава") Тогда
Сообщить("Обработка инициализации: Недостаточно прав для выполнения обработки!");
Возврат Ложь;
КонецЕсли;
Если ВсеОбработчики Тогда
ПрошлаяВерсия = 0;
Иначе
ПрошлаяВерсия = ПолучитьПрошлуюВерсиюОбработки();
КонецЕсли;
ТекущаяВерсия = ПолучитьТекущуюВерсиюОбработки();
//Обработка не нужна
Если ТекущаяВерсия <= ПрошлаяВерсия Тогда
Возврат Истина;
КонецЕсли;
//В цикле выполняем все необходимые обработки
Отказ = Ложь;
Для Сч = ПрошлаяВерсия+1 По ТекущаяВерсия Цикл
Выполнить("ОбработкаИнициализации_Версия_"+Сч+"(Отказ);");
КонецЦикла;
Если Отказ Тогда
Сообщить("Обработка инициализации: Ошибка выполнения обоработки!");
Возврат Ложь;
КонецЕсли;
//Запишем текущую версию в константу
Если УстановитьВерсиюОбработки(ТекущаяВерсия) Тогда
Сообщить("Обработка инициализации: Переход на версию " + ТекущаяВерсия + " выполнен успешно!");
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции
//********************************************************
Процедура ОбработкаИнициализации_Версия_1(Отказ)
//Действия обработчика
Сообщить("Обработка инициализации, выполнен переход на версию 1");
КонецПроцедуры
Форма обработки:
Ну и для тех, кому лень копипастить, прикладываю саму обработку для скачивания.