Обработка инициализации

Некоторые модификации требуют действий, которые нельзя выполнить в конфигураторе. Например, заполнение реквизитов предопределённых элементов справочника (помимо кода и наименования), обязательное первоначальное заполнение каких-либо значений. Все подобные действия по разным задачам проекта можно выполнять в одном месте — в обработке инициализации.

 

Для данной обработки должны соблюдаться следующие правила:

  • Обработка должна быть доступна только пользователям с полными правами.
  • Отдельное вынесение в интерфейс данной обработки не требуется.
  • Обработка должна иметь одну форму с кратким пояснительным текстом и кнопкой вызова процедуры выполнения пакета инициализационных действий.
  • Данная процедура должна быть доступна для программного вызова извне.
  • Процедура выполнения пакета должна последовательно вызвать подпроцедуры инициализации, написанные разными разработчиками в рамках своих задач. В каждой из них должна быть собственная (независимая) обработка исключительных ситуаций, с выдачей сообщений об ошибках.
  • Ошибка, возникшая в одной в подпроцедуре, не должна влиять на остальную инициализацию.
  • Обработку предполагается запускать многократно. Каждое действие должно корректно отрабатывать как при первом запуске обработки, так и при повторных запусках. Во втором случае не должно быть каких-либо побочных эффектов или потери введённых пользователем данных.

В конфигурацию также должен быть добавлен механизм автоматического обнаружения изменений в обработке инициализации и предложения пользователю с полными правами выполнить инициализацию при первой же возможности.

Один из вариантов реализации такого механизма:

  • В конфигурации предусматривается константа, хранящая версию последней выполненной обработки инициализации.
  • В обработке предусматривается экспортная переменная, хранящая версию (целое число). Версия устанавливается при создании обработки-объекта, значение версии прописано в коде модуля. При любой модификации обработки разработчик должен увеличить данную версию на единицу.
  • При начале работы системы, если текущий пользователь имеет полные права и версии обработки в конфигурации и в константе отличаются, выполняется обработка инициализации.

 
В данном примере, добавлена константа «АБ_ВерсияВыполненнойОбработкиИнициализации»

pravila-razrabotki-tipovyx-konfiguracij-chast2__007

В модуле управляемого приложения в процедуру «ПриНачалеРаботыСистемы()» добавлен вызов серверной процедуры:

Процедура ПриНачалеРаботыСистемы()
// СтандартныеПодсистемы
СтандартныеПодсистемыКлиент.ПриНачалеРаботыСистемы();
// Конец СтандартныеПодсистемы
//++ 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/

 

Помогла ли вам данная статья?
Да, спасибо, помогла.
Немного помогла.
Совсем не помогла.
Не то, что я искал(а).
Смотреть результаты
Запись опубликована в рубрике Разработка в 1С с метками . Добавьте в закладки постоянную ссылку.




Добавить комментарий

Ваш e-mail не будет опубликован.