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

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

 

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

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

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

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

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

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

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С с метками . Добавьте в закладки постоянную ссылку.


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

Ваш адрес email не будет опубликован. Обязательные поля помечены *