Як запустити відкладене оновлення 1с
Обробники оновлення інформаційної бази
Область застосування: керований додаток, звичайний додаток.
Діє для конфігурацій на базі Бібліотеки стандартних підсистем.
Містить уточнення до інших стандартів.
Див. документацію до підсистеми "Оновлення версії ІБ" на ІТС.
1. Основні відомості про бібліотеку (основну конфігурацію)
2. Розташування обробників оновлення
3. Реалізація обробників оновлення
4. Перехід на нові версії бібліотек
1. Основні відомості про бібліотеку (основну конфігурацію)
1.1. При розробці конфігурацій на базі бібліотек кожна бібліотека повинна повідомити про себе ряд відомостей, необхідних для коректного оновлення інформаційної бази на нову версію конфігурації:
- Ім'я
- Версію
- Список обробників оновлення
- Залежно від інших бібліотек.
Ці відомості розміщуються у спеціальному загальному модулі бібліотеки, ім'я якого має починатися з ОновленняІнформаційної бази.
Приклад:
У конфігурації УТ 11 модуль обробників оновлення називається ОновленняІнформаційної БазиУТ
Імена модулів всіх бібліотек, що використовуються в конфігурації, слід явно перерахувати в загальному модулі ПідсистемиКонфігураціїПеревизначуваний у вигляді:
Процедура При додаванні Підсистем (Модулі Підсистем) Експорт
Крім того, аналогічний модуль повинен бути визначений і для основної конфігурації.
При створенні загального модуля Оновлення Інформаційної Бази слід використовувати шаблон:
// Заповнює основні відомості про бібліотеку чи основну конфігурацію.
// Бібліотека, ім'я якої ім'я збігається з ім'ям конфігурації метаданих, визначається як основна конфігурація.
//
// Параметри:
// Опис - Структура - відомості про бібліотеку:
//
// Ім'я - Рядок - ім'я бібліотеки, наприклад, "Стандартні Підсистеми".
// Версія - Рядок - версія у форматі з 4-х цифр, наприклад, "2.1.3.1".
//
// Необхідні Підсистеми - Масив - імена інших бібліотек (Рядок), від яких ця бібліотека.
// Обробники оновлення таких біблітек повинні бути викликані раніше
// Оброблювачів оновлення даної бібліотеки.
// При циклічних залежностях або, навпаки, відсутності будь-яких залежностей,
// Порядок виклику обробників оновлення визначається порядком додавання модулів
// У процедурі при додаванні Підсистем загального модуля Підсистеми Конфігурації Перевизначуваний.
// РежимВиконання Відкладених Оброблювачів - Рядок - "Послідовно" - відкладені обробники оновлення виконуються
// Послідовно в інтервалі від номера версії інформаційної бази до номера
// версії конфігурації включно або "Паралельно" - відкладений обробник після
// обробки першої порції даних передає керування наступному обробнику, а після
// Виконання останнього оброблювача цикл повторюється заново.
//
Процедура ПриДодаткуПідсистеми(Опис) Експорт
Опис.Ім'я = "";
Опис.Версія = "XX.XX.XX.XX";
Опис.ПотрібніПідсистеми.Додати("СтандартніПідсистеми");
Опис.РежимВиконанняВідкладенихОброблювачів = "Послідовно";
// Додає до списку процедур-обробників оновлення даних ІБ
// для всіх підтримуваних версій бібліотеки чи конфігурації.
// Викликається перед початком оновлення даних ІБ побудувати план оновлення.
//
// Параметри:
// Обробники - ТаблицяЗначень - опис полів
// див. у процедурі Оновлення Інформаційної Бази. Нова Таблиця Оброблювачів Оновлення
//
// Приклад додавання процедури-обробника до списку:
// Обробник = Обробники.Додати();
// Обробник. Версія = "1.0.0.0";
// Обробник.Процедура = "Оновлення ІБ.ПерейтиНаВерсію_1_0_0_0";
// Обробник. Режим Виконання = "Монопольно";
//
Процедура Додавання ОброблювачівОновлення(Оброблювачі) Експорт
// Обробники, які виконуються при кожному оновленні ІБ
// Обробники, виконувані під час переходу певну версію
// Обробники, які виконуються при заповненні порожньої ІБ
// Викликається перед процедурами-обробниками оновлення даних ІБ.
//
Процедура ПередОновленнямІнформаційноїБази() Експорт
// Викликається після завершення оновлення даних ІБ.
//
// Параметри:
// Попередня Версія - Рядок - версія до оновлення. "0.0.0.0" для "порожній" ІБ.
// Поточна версія - Рядок - версія після оновлення.
// Виконані Обробники - ДеревоЗначень - список виконаних процедур-обробників оновлення,
// згрупованих за номером версії.
// ВиводитиОпис Оновлень - Бульово - (повертається) якщо встановити Істина,
// то буде виведено форму з описом оновлень. За промовчанням, Істина.
//МонопольнийРежим - Бульово - Істина, якщо оновлення виконувалося монопольному режимі.
//
Процедура ПісляОновленняІнформаційноїБази(Знач ПопередняВерсія, Значення ПоточнаВерсія,
Знач Виконані Обробники, ВиводитиОпис Обновлень, МонопольнийРежим) Експорт
// Викликається під час підготовки табличного документа з описом змін у програмі.
//
// Параметри:
// Макет - ТабличнийДокумент - опис оновлення всіх бібліотек та конфігурації.
// Макет можна доповнити чи замінити.
// Див. також загальний макет Опис Змін системи.
//
Процедура ПриПідготовціМакетаОписиОновлень(Знач Макет) Експорт
// Дозволяє перевизначити режим оновлення даних інформаційної бази.
// Для використання у рідкісних (нештатних) випадках переходу, не передбачених у
// Стандартна процедура визначення режиму оновлення.
//
// Параметри:
// Режим Оновлення Даних - Рядок - в обробнику можна присвоїти одне із значень:
// "Початкове Заповнення" - якщо це перший запуск порожньої бази (області даних);
// "Оновлення Версії" - якщо виконується перший запуск після оновлення конфігурації бази даних;
// "Перехід з іншої програми" - якщо виконується перший запуск після оновлення конфігурації бази даних,
// у якій змінилося ім'я основний зміни.
//
// Стандартна Обробка - Бульово - якщо присвоїти Брехню, то стандартна процедура
// Визначення режиму оновлення не виконується,
// а використовується значення Режим Оновлення даних.
//
Процедура ПриВизначенніРежимуОновленняДанних(РежимОновленняДаних, СтандартнаОбробка) Експорт
// Додає список процедури-обработчики переходу з іншої програми (з іншим ім'ям конфігурації).
// Наприклад, для переходу між різними, але спорідненими конфігураціями: базова->проф->корп.
// Викликається перед початком оновлення даних ІБ.
//
// Параметри:
// Обробники - ТаблицяЗначень - з колонками:
// * ПопереднєІм'яКонфігурації - Рядок - ім'я конфігурації, з якої виконується перехід;
// або "*", якщо потрібно виконувати під час переходу з будь-якої конфігурації.
// * Процедура - Рядок - повне ім'я процедури-обробника переходу з програми Попереднє Ім'я Конфігурації.
// Наприклад, "ОновленняІнформаційноїБазиУПП.ЗаповнитиОбліковуПолітику"
// Обов'язково має бути експортною.
//
// Приклад додавання процедури-обробника до списку:
// Обробник = Обробники.Додати();
// Обробник.ПопереднєІм'яКонфігурації = "УправлінняТоргівлею";
// Обробник.Процедура = "ОновленняІнформаційноїБазиУПП.ЗаповнитиОбліковуПолітику";
//
Процедура При додаванні обробників Переходу з іншої програми (обробники) Експорт
// Викликається після виконання всіх процедур-обробників переходу з іншої програми (з іншим ім'ям конфігурації),
// і початку виконання оновлення даних ІБ.
//
// Параметри:
// ПопереднєІм'яКонфігурації - Рядок - ім'я конфігурації до переходу.
// ПопередняВерсіяКонфігурації - Рядок - ім'я попередньої конфігурації (до переходу).
// Параметри - Структура -
// * ВиконатиОновленняСВерсії - Бульово - за умовчанням Істина. Якщо встановити Брехня,
// то будуть виконані лише обов'язкові обробники оновлення (з версією "*").
// * ВерсіяКонфігурації - Рядок - номер версії після переходу.
// За умовчанням, дорівнює значенню версії конфігурації у властивостях метаданих.
// Для того, щоб виконати, наприклад, всі обробники оновлення з версії ПопередняВерсіяКонфігурації,
// слід встановити значення параметра Попередня Версія Конфігурації.
// Для того, щоб виконати взагалі всі обробники оновлення, встановити значення "0.0.0.1".
// * ОчиститиВідомостіПопередньоїКонфігурації - Булеве - за умовчанням Істина.
// Для випадків коли попередня конфігурація збігається на ім'я з підсистемою поточної конфігурації, слід зазначити Брехня.
//
Процедура ПриЗавершенніПереходуЗІншоїПрограми(Знач ПопереднєІм'яКонфігурації,
Значення ПопередняВерсіяКонфігурації, Параметри) Експорт
1.2.Обробники оновлення даних інформаційної бази призначені для додаткової обробки даних після завершення оновлення конфігурації (реструктуризації) бази даних:
- ініціалізація нових констант, нових реквізитів, реквізитів нових визначених елементів;
- перенесення даних із застарілих структур метаданих у нові;
- генерація нових даних
- і т.п.
Для автогенерованих рядків, які програмно записуються в інформаційну базу, наприклад, при заповненні найменувань визначених елементів довідників, ПВХ тощо, слід керуватися стандартом Автогенеровані дані в інформаційній базі: вимоги щодо локалізації.
1.3. Обробник оновлення даних інформаційної бази складається із двох частин:
описової - повідомляє, коли має виконатися обробник, і він перебуває у конфігурації;програмний - безпосередньо код модифікації даних ІБ, оформлений у вигляді процедури-обробника оновлення.
Додавання описів нових обробників виконується в процедурі Додавання Обробників Оновлення за допомогою вставки фрагмента коду за шаблоном:
Цей код додає новий рядок до таблиці значень Обробники , рядок якого має такі поля:
Версія ( Рядок ) – номер версії конфігурації, при оновленні на яку має бути викликана процедура оновлення, вказана у параметрі Процедура .
Номер версії конфігурації вказується у форматі «Р.П.В.С» (Р – старший номер редакції; П – молодший номер редакції; В – номер версії; С – номер складання. .
Якщо в якості версії вказано символ «*», обробник оновлення повинен виконуватися щоразу під час оновлення інформаційної бази, незалежно від номера версії конфігурації. Обробники такого виду призначені для оновлення службових, системних даних (наприклад, оновлення профілів, що поставляються, і груп доступу).
Якщо властивість Версія не задано, то має бути встановлена в Істина властивість Початкове Заповнення (див. далі).
Процедура (Рядок) – ідентифікатор процедури, що містить повний шлях до процедури-оброблювача оновлення.
Наприклад, "Довідник.Валюти.ЗаповнитиКодДля Пошуку" .
Початкове Заповнення (Булево) – якщо Істина, то обробник буде викликаний при першому запуску порожньої інформаційної бази (версія «0.0.0.0»), створеної з файлу постачання конфігурації та не містить даних.
Це обробники початкового наповнення бази.
РежимВиконання ( Рядок ) – приймає одне із значень: "Монопольно", "Оперативно" та "Відкладено". Якщо властивість не задано, то за замовчуванням обробник монопольний.
-
Монопольно – якщо обробник оновлення необхідно виконувати монопольно, за умови відсутності активних сеансів роботи користувачів, регламентних завдань, зовнішніх з'єднань та підключень до веб-сервісів. Інакше оновлення версії програми переривається. Докладніше див. Обмеження на використання монопольного режиму обробників оновлення
Монопольні обробники призначені для оновлення тих даних, обробка яких має бути обов'язково завершена на момент входу користувачів у програму. Для скорочення часу простою (очікування обробки даних) рекомендується великі обсяги даних оновлювати відкладено (див. нижче).
Приклади монопольних обробників: опрацювання невеликого обсягу даних поточного періоду, активних позицій номенклатури тощо.
Якщо хоча б один обробник оновлення конфігурації – монопольний, всі оперативні обробники (див. далі) виконуються в монопольному режимі.
- Такий обробник викликається двічі, у нього передається параметр Параметри типу Структура, в якому є властивість Монопольний режим (Булеве)
- При першому дзвінку в режимі перевірки, властивість Монопольний режим містить значення Брехня .
- Код оброблювача не повинен модифікувати дані ІБ
- Якщо в ході виконання оброблювача виникає необхідність внесення змін до ІБ, обробник повинен встановити значення властивості в Істина та припинити своє виконання
- Код обробник може модифікувати дані ІБ
- Зміна значення властивості у разі ігнорується
Оперативні обробники слід застосовувати в окремих випадках, коли важливо скоротити час очікування користувачів при переході на виправні релізи, які не містять змін у структурі даних, та оновлення на які має виконуватися динамічно.
Відкладені обробники призначені для обробки частини даних ІБ, які не перешкоджають користувачам починати свою роботу з новою версією програми, не чекаючи завершення обробки цих даних.
Приклади відкладених обробників: обробка великих архівів даних за закриті/минулі періоди, неактивних позицій номенклатури, різних даних, відключених на даний момент функціональними опціями тощо.
Приклад опису обробника, для виконання якого потрібен монопольний режим:
Обробник = Обробники.Додати();
Обробник.РежимВиконання = "Монопольно";
Обробник. Версія = "11.1.0.0";
Обробник.Процедура = "Довідник.Мій Довідник.ЗаповнитиКодДля Пошуку";Приклад реалізації оброблювача в модулі менеджера Довідник.
// Обробник оновлення УТ 11.1.0.0
//
// Перебираються всі елементи довідника, у яких не заповнено код для пошуку,
// і заповнюється кодом довідника без лідируючих нулів та префіксів
//
Процедура ЗаповнитиКодДляПошуку Експорт
.2. Розташування обробників оновлення
2.1. Процедура-обробник має оформлюватися у вигляді експортної процедури.
Розташовувати процедуру слід у модулі менеджера об'єкта метаданих, оновлення якого вона виконує.Приклад:
Якщо довідник «Підрозділи» додали новий реквізит, який необхідно заповнити за замовчуванням, то процедура-обробник повинна розташовуватися в модулі менеджера цього довідника.2.2. У деяких випадках, коли неможливо співвіднести обробник з якимось конкретним об'єктом метаданих, припустимо розташування процедури-обробника в серверному загальному модулі, призначення якого за змістом пов'язане з обробленою ІБ (наприклад, процедури оновлення, пов'язані зі складською функціональністю повинні розташовуватися в загальному модулі Склад Сервер). При цьому процедура повинна розташовуватись у службовій частині модуля, в підрозділі «Оновлення ІБ».
3. Реалізація обробників оновлення
3.1. До процедури-оброблювача пред'являються такі вимоги:
Обробник не повинен містити логіки щодо інтерактивної взаємодії з користувачем.Алгоритм оброблювача має бути побудований так, щоб не переривати, не зациклювати обробку даних, не залишати необроблені дані та не вимагати будь-яких додаткових дій від користувача для продовження обробки даних. Будь-яке невиконання оброблювача слід розглядати як логічну помилку та перепроектувати логіку оброблювача. Наприклад, якщо номер документа, який створюється в обробнику, виявляється неунікальним, то надавати новий незайнятий номер, а не завершувати роботу обробника викликом виключення. Якщо оброблювані обробником дані посилаються на неіснуючі дані (т.зв. "бита посилання"), пропускати обробку цих даних або виконувати з відсутніми значеннями за умовчанням.
Оброблювач має бути розрахований на неодноразове виконання. На тих самих даних результат виконання обробника повинен бути ідентичний за будь-якої кількості викликів цього обробника (наприклад, повторний запуск обробника не повинен призводити до дублювання даних в інформаційній базі).
3.2. Обробник оновлення не повинен містити зайвих надлишкових дій з даними – повинен виконуватися максимально швидко.
3.2.1. Для цього необхідно відключати бізнес-логіку під час обробки даних. У більшості випадків, за допомогою установки ознаки ОбмінДаними.
В окремих випадках для часткового відключення бізнес-логіки допустимо передбачити додаткову ознаку, наприклад:
3.2.2. Для більшості даних, що обробляються, слід відключати реєстрацію змін на вузлах планів обміну, щоб уникнути відправки всього обсягу оброблених даних у всі вузли. Таким чином:
- У розподіленій інформаційній базі (РІБ) обробка даних має виконуватися незалежно у кожному з вузлів;
- При обміні між довільними конфігураціями (програмами) обробка даних повинна призводити до їх розвантаженню в базы-получатели.
Виняток становлять випадки створення об'єктів посилань, які повинні бути перенесені механізмами обміну даними в інші вузли РИБ з тим же значенням реквізиту Посилання.
3.2.3. Таким чином, у коді обробника оновлення замість
ДокументОб'єкт.ОбмінДаними.Завантаження = Істина; // відключити всю бізнес-логіку під час запису
ДокументОб'єкт.ДодатковіВластивості.Вставити("ВимкнутиМеханізмРеєстраціїОб'єктів");
ДокументОб'єкт.ОбмінДаними.Отримувачі.АвтоЗаповнення = Брехня;
ДокументОбъект.Записать();При використанні в конфігурації Бібліотеки стандартних підсистем (БСП) версії 2.1.4 і вище слід використовувати процедуру Записати дані загального модуля Оновлення інформаційної бази:
3.3. Перед процедурою-обробником має бути коментар. Перший рядок коментаря повинен містити інформацію про версію конфігурації, для якої призначений цей обробник. Наступні рядки коментаря повинні містити відповідь на такі запитання:
// Обробник оновлення УТ 11.1.0.0
//
// Перебираються всі елементи довідника, у яких не заповнено код для пошуку,
// і заповнюється кодом довідника без лідируючих нулів та префіксів
//
Процедура ЗаповнитиКодДляПошуку Експорт4. Перехід на нові версії бібліотек
4.1. У разі встановлення конфігурації на підтримку нової версії бібліотеки слід збільшувати номер версії конфігурації. Це необхідно для запуску обробників оновлення інформаційної бази.