Некоторые модификации требуют действий, которые нельзя выполнить в конфигураторе. Например, заполнение реквизитов предопределённых элементов справочника (помимо кода и наименования), обязательное первоначальное заполнение каких-либо значений. Все подобные действия по разным задачам проекта можно выполнять в одном месте — в обработке инициализации.
Для данной обработки должны соблюдаться следующие правила:
- Обработка должна быть доступна только пользователям с полными правами.
- Отдельное вынесение в интерфейс данной обработки не требуется.
- Обработка должна иметь одну форму с кратким пояснительным текстом и кнопкой вызова процедуры выполнения пакета инициализационных действий.
- Данная процедура должна быть доступна для программного вызова извне.
- Процедура выполнения пакета должна последовательно вызвать подпроцедуры инициализации, написанные разными разработчиками в рамках своих задач. В каждой из них должна быть собственная (независимая) обработка исключительных ситуаций, с выдачей сообщений об ошибках.
- Ошибка, возникшая в одной в подпроцедуре, не должна влиять на остальную инициализацию.
- Обработку предполагается запускать многократно. Каждое действие должно корректно отрабатывать как при первом запуске обработки, так и при повторных запусках. Во втором случае не должно быть каких-либо побочных эффектов или потери введённых пользователем данных.
В конфигурацию также должен быть добавлен механизм автоматического обнаружения изменений в обработке инициализации и предложения пользователю с полными правами выполнить инициализацию при первой же возможности.
Один из вариантов реализации такого механизма:
- В конфигурации предусматривается константа, хранящая версию последней выполненной обработки инициализации.
- В обработке предусматривается экспортная переменная, хранящая версию (целое число). Версия устанавливается при создании обработки-объекта, значение версии прописано в коде модуля. При любой модификации обработки разработчик должен увеличить данную версию на единицу.
- При начале работы системы, если текущий пользователь имеет полные права и версии обработки в конфигурации и в константе отличаются, выполняется обработка инициализации.
В данном примере, добавлена константа «АБ_ВерсияВыполненнойОбработкиИнициализации»
В модуле управляемого приложения в процедуру «ПриНачалеРаботыСистемы()» добавлен вызов серверной процедуры:
Процедура ПриНачалеРаботыСистемы() // СтандартныеПодсистемы СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы(); // Конец СтандартныеПодсистемы //++ 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"); КонецПроцедуры
Форма обработки, требующая выполнения инициализации:
Все обработчики выполнены:
Скачать готовую обработку можно здесь: https://infostart.ru/public/553011/