Сервер получает реальное состояние своего обновления без конструктора, отдельно читает фазу, два признака, процент обработки и весь массив сообщений. Из действительных описаний и степеней серьёзности строится местный отчёт; управление обновлением код не выполняет.
Где и как запускать
Своя управляемая форма: тонкий клиент 8.5.1.1343 с настоящей командой и серверная функция НаСервереБезКонтекста в собственной новой изолированной клиент-серверной ИБ той же версии. Native объекты остаются на сервере; клиенту возвращается только Строка.
Подготовка
Опыт только для целиком собственной новой лаборатории: отдельная VM, свой отдельный кластер 1С и СУБД, новая клиент-серверная ИБ, свой администратор. Существующий рабочий кластер, File-база, чужие сеансы и рабочие данные не подходят. Установка, регистрация сервера и создание ИБ здесь не выполняются; в этом уроке они не автоматизируются.
Создайте вручную новую пустую CF УчебноеФоновоеОбновление85. Основной режим запуска — Управляемое приложение, РежимСовместимости — НеИспользовать. На собственных клиенте и сервере нужна версия 8.5.1.1343; минимум 8.3.1 из справки не обещает одинаковое поведение другой сборки. Имя конфигурации — учебная проверка, не доказательство владения ИБ.
В своей CF вручную подготовьте пользователя с административными правами или правами обновления конфигурации базы данных. Само имя пользователя/роли не даёт этих прав. Код роли не назначает, привилегированный режим не включает; штатный getter вправе отказать и тогда будет СТОП.
Общие → Общие формы → Добавить → управляемая СтатусСвоегоОбновления85. Создайте ПодтверждаюСвойСтенд85 — Булево, начальное значение Ложь, и Протокол85 — Строка длиной 0. Выведите редактируемый флажок; многострочное поле протокола сделайте только для просмотра. ПопыткаНачата85 — закрытая переменная модуля, не реквизит формы.
В свойствах формы задайте отдельно: АвтоматическоеСохранениеДанныхВНастройках = АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать; СохранениеДанныхВНастройках = СохранениеДанныхФормыВНастройках.НеИспользовать. На вкладке Команды создайте ПрочитатьСтатус85, Действие → ПрочитатьСтатус85(Команда); добавьте кнопку именно с этой командой. В пустой модуль формы вставьте весь основной блок, включая серверную функцию.
Общие → Общие команды → Добавить → ОткрытьСтатусСвоегоОбновления85, команда без параметра. В её пустой модуль вставьте второй полный блок. Включите свою команду в собственную подсистему и панель действий её раздела. Она лишь открывает форму; своих серверных функций чтения статуса не вызывает.
Создайте собственный небольшой учебный справочник со строковым реквизитом длиной 20 и двумя вымышленными записями. F7: проверьте клиент/сервер собственной CF, затем вручную сформируйте исходную конфигурацию базы данных. Форма наблюдения и команда уже должны существовать в этой исходной базе. Это будущие изменения только своей лаборатории, не выполняемые здесь.
В Конфигураторе своей CF измените лишь собственный строковый реквизит, например увеличьте длину до 40. Не применяйте эту новую структуру обычным обновлением базы перед опытом. Если эти собственные изменения не допускают фоновое обновление, остановитесь; код не подделывает состояние и не обещает, что любой набор изменений подходит.
Откройте Конфигурация → Конфигурация базы данных → Фоновое обновление конфигурации базы данных. В своём диалоге выключите Разрешить динамическое обновление, иначе возможна динамическая замена фонового; установите Выполнять на сервере. Запустить — отдельное ручное изменение собственной ИБ. Код примера эту кнопку не нажимает.
До наблюдения не нажимайте Завершить или Отменить. В своём клиенте этой же новой ИБ вручную откройте форму собственной общей командой. Убедитесь, что это именно подготовленная отдельная лаборатория, установите флажок и нажмите ПрочитатьСтатус85 один раз. Положительный путь требует настоящей активной фазы и непустых реальных сообщений; иначе честный СТОП.
Приостановить, Продолжить и нормальное завершение выполняются только вами вручную в своей лаборатории по штатному диалогу. Справка ограничивает паузу 48 часами; урок длительную паузу не создаёт. Завершение требует монопольной блокировки: сначала вручную завершите лишь свои сеансы наблюдения. Код не закрывает приложения или другие сеансы.
Протокол содержит настоящие собственные служебные описания, которые могут включать пути, имена и технические сведения. Смотрите его только местно, не публикуйте и не переносите код в рабочую ИБ. Укорочение каждого описания до 160 символов ограничивает размер текста, но не скрывает секреты.
&НаКлиенте
Перем ПопыткаНачата85;
&НаКлиенте
Процедура ПрочитатьСтатус85(Команда)
Протокол85 = "";
Попытка
Если ПопыткаНачата85 <> Неопределено Тогда
ВызватьИсключение "Этот экземпляр наблюдателя уже использован";
КонецЕсли;
ПопыткаНачата85 = Истина;
Согласен85 = ПодтверждаюСвойСтенд85;
ПодтверждаюСвойСтенд85 = Ложь;
Если ТипЗнч(Согласен85) <> Тип("Булево") Или Не Согласен85 Тогда
ВызватьИсключение "Сначала подтвердите полностью собственную лабораторию";
КонецЕсли;
Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда.Имя <> "ПрочитатьСтатус85"
Или ИмяФормы <> "ОбщаяФорма.СтатусСвоегоОбновления85"
Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
ВызватьИсключение "Нужны собственная форма и настоящая команда без сохранения настроек";
КонецЕсли;
Отчет85 = ПрочитатьСвойОтчетНаСервере85();
Если ТипЗнч(Отчет85) <> Тип("Строка") Тогда
ВызватьИсключение "Не получен строковый серверный отчёт";
КонецЕсли;
Если Отчет85 = "" Тогда
ВызватьИсключение "Серверный отчёт пуст";
КонецЕсли;
Протокол85 = Отчет85;
Исключение
Протокол85 = "СТОП. Наблюдение не подтверждено. Состояние фонового процесса неизвестно; код его не меняет. Повтор и автоматическое восстановление запрещены.";
КонецПопытки;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПрочитатьСвойОтчетНаСервере85()
Обновление85 = ПолучитьОбновлениеКонфигурацииБазыДанных();
Если ТипЗнч(Обновление85) <> Тип("ОбновлениеКонфигурацииБазыДанных") Тогда
ВызватьИсключение "Не получено настоящее состояние фонового обновления";
КонецЕсли;
Фаза85 = Обновление85.Состояние;
Если ТипЗнч(Фаза85) <> Тип("СостояниеОбновленияКонфигурацииБазыДанных") Тогда
ВызватьИсключение "Не получена настоящая фаза";
КонецЕсли;
Если Фаза85 = СостояниеОбновленияКонфигурацииБазыДанных.Неактивно Тогда
ВызватьИсключение "Неактивное обновление не подтверждает успешное наблюдение";
ИначеЕсли Фаза85 = СостояниеОбновленияКонфигурацииБазыДанных.ВыполняетсяОбработка Тогда
НазваниеФазы85 = "Обработка записей";
ИначеЕсли Фаза85 = СостояниеОбновленияКонфигурацииБазыДанных.ВыполняетсяАктуализация Тогда
НазваниеФазы85 = "Актуализация изменённых данных";
Иначе
ВызватьИсключение "Неизвестная фаза обновления";
КонецЕсли;
Приостановлено85 = Обновление85.Приостановлено;
ПрошлаяОшибка85 = Обновление85.ЗавершеноСОшибкой;
Если ТипЗнч(Приостановлено85) <> Тип("Булево") Или ТипЗнч(ПрошлаяОшибка85) <> Тип("Булево") Тогда
ВызватьИсключение "Оба признака состояния должны быть настоящими Булево";
КонецЕсли;
Процент85 = Обновление85.ПроцентОбработки;
Если ТипЗнч(Процент85) <> Тип("Число") Тогда
ВызватьИсключение "Процент обработки должен быть настоящим числом";
КонецЕсли;
Если Процент85 < 0 Или Процент85 > 100 Тогда
ВызватьИсключение "Процент обработки вне диапазона 0..100";
КонецЕсли;
Сообщения85 = Обновление85.ИнформацияОВыполнении;
Если ТипЗнч(Сообщения85) <> Тип("Массив") Тогда
ВызватьИсключение "Нет настоящего массива сообщений";
КонецЕсли;
Количество85 = Сообщения85.Количество();
Если Количество85 < 1 Или Количество85 > 500 Тогда
ВызватьИсключение "Нужен небольшой непустой массив собственных сообщений";
КонецЕсли;
Информация85 = 0;
Предупреждения85 = 0;
Ошибки85 = 0;
Подробности85 = "";
Для Каждого Элемент85 Из Сообщения85 Цикл
Если ТипЗнч(Элемент85) <> Тип("ЭлементИнформацииОВыполненииОбновленияКонфигурацииБазыДанных") Тогда
ВызватьИсключение "Массив содержит не настоящий элемент информации";
КонецЕсли;
Вид85 = Элемент85.ТипЭлемента;
Описание85 = Элемент85.Описание;
Если ТипЗнч(Вид85) <> Тип("ТипЭлементаИнформацииОВыполненииОбновленияКонфигурацииБазыДанных")
Или ТипЗнч(Описание85) <> Тип("Строка") Тогда
ВызватьИсключение "Нужны настоящий тип сообщения и строковое описание";
КонецЕсли;
Если Описание85 = "" Тогда
ВызватьИсключение "Описание собственного сообщения пусто";
КонецЕсли;
Если Вид85 = ТипЭлементаИнформацииОВыполненииОбновленияКонфигурацииБазыДанных.Информация Тогда
Информация85 = Информация85 + 1;
ИначеЕсли Вид85 = ТипЭлементаИнформацииОВыполненииОбновленияКонфигурацииБазыДанных.Предупреждение Тогда
Предупреждения85 = Предупреждения85 + 1;
ИначеЕсли Вид85 = ТипЭлементаИнформацииОВыполненииОбновленияКонфигурацииБазыДанных.Ошибка Тогда
Ошибки85 = Ошибки85 + 1;
Иначе
ВызватьИсключение "Неизвестная степень серьёзности сообщения";
КонецЕсли;
Подробности85 = Подробности85 + Строка(Вид85) + ": " + Лев(Описание85, 160) + " | ";
КонецЦикла;
ВсегоПоВидам85 = Информация85 + Предупреждения85 + Ошибки85;
Если ВсегоПоВидам85 <> Количество85 Тогда
ВызватьИсключение "Классификация не покрыла полный настоящий массив";
КонецЕсли;
Отчет85 = "Фаза: " + НазваниеФазы85 + ". Приостановлено: " + Строка(Приостановлено85)
+ ". Ошибка ПРЕДЫДУЩЕЙ попытки: " + Строка(ПрошлаяОшибка85)
+ ". Обработано записей, %: " + Строка(Процент85) + ". ";
Если Фаза85 = СостояниеОбновленияКонфигурацииБазыДанных.ВыполняетсяОбработка Тогда
ОсталосьОбработки85 = 100 - Процент85;
Отчет85 = Отчет85 + "Остаток ТОЛЬКО фазы обработки, %: " + Строка(ОсталосьОбработки85) + ". ";
Иначе
Отчет85 = Отчет85 + "Сейчас актуализация; процент не измеряет её остаток. ";
КонецЕсли;
Отчет85 = Отчет85 + "100% не подтверждает завершение всего обновления. Информация: " + Строка(Информация85)
+ "; предупреждения: " + Строка(Предупреждения85) + "; ошибки: " + Строка(Ошибки85)
+ "; всего: " + Строка(Количество85) + ". Собственные сообщения: " + Подробности85
+ " Это последовательные чтения, не атомарный снимок. Протокол только для собственной лаборатории; не публикуйте его.";
Возврат Отчет85;
КонецФункцииСобственная общая команда открытия формы статуса
Своя CF → Общие → Общие команды → ОткрытьСтатусСвоегоОбновления85 → пустой модуль.
Настоящее клиентское событие общей команды без параметра; оба native параметра потреблены. Только открывает свою подготовленную форму, не читает статус.
&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
Если ПараметрКоманды <> Неопределено
Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
ВызватьИсключение "Нужна собственная общая команда без параметра";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.СтатусСвоегоОбновления85");
КонецПроцедурыРазбор по шагам
Настоящая команда очищает старый протокол, запрещает повтор в этом экземпляре и расходует настоящий Булево флажка до серверного вызова. Затем проверяет свою команду, имя формы и два отдельных режима без сохранения настроек. Тонкий клиент не читает Метаданные.Имя и получает только строковый отчёт.
Сервер читает действительные имя конфигурации и версию приложения. Zeroarg ПолучитьОбновлениеКонфигурацииБазыДанных возвращает настоящий объект; проверки прав делает платформа. Нет нового объекта обновления, Структуры вместо него или неизвестного входного объекта.
Состояние проверяется как настоящий тип и сравнивается с тремя документированными значениями. Неактивно — не успешное наблюдение: справка допускает незапущенный процесс или завершение с ошибкой. Неизвестная фаза тоже останавливает пример.
Приостановлено и ЗавершеноСОшибкой читаются и проверяются как два настоящих Булево. Второй признак относится к ПРЕДЫДУЩЕЙ попытке; Ложь не означает, что текущая попытка успешно завершена. В отчёт попадают именно прочитанные значения.
ПроцентОбработки — реальное Число 0..100. Только в фазе обработки вычисляется 100 минус прочитанный процент. Это остаток обработки записей, не оценка времени и не процент всего обновления. Актуализация получает отдельное фактическое название и пояснение.
Весь настоящий Массив сообщений должен быть непустым и не больше 500 элементов для маленькой лаборатории. Каждый native элемент проверяется по типу; читаются его действительные ТипЭлемента и непустое строковое Описание. Не используются шаблонные сообщения или первая строка вместо полного обхода.
По настоящему виду каждого сообщения увеличивается только его счётчик. Сумма трёх счётчиков сравнивается с фактическим количеством всего массива. Местные фрагменты строятся из реальных описаний; они не объявляются безопасными для публикации.
Возвращается составленный сервером строковый отчёт, который клиент показывает только после проверки типа и непустоты. Это последовательные чтения движущегося процесса, не атомарный снимок. Исключение даёт фиксированный СТОП без текста исключения, повторного запроса, паузы, завершения, отмены или восстановления.
Как проверить результат
Без флажка — СТОП до собственного серверного запроса. Повтор кнопки в том же экземпляре даже после успеха — СТОП; прежний протокол очищен. Новое наблюдение возможно только после вашей явной ручной подготовки нового экземпляра своей формы.
Будущий нормальный опыт: прочитана настоящая активная фаза, процент, два признака и хотя бы одно сообщение. Информация + предупреждения + ошибки точно равны фактическому числу полностью обойдённых элементов, а местные фрагменты относятся к собственному обновлению.
До запуска или при неактивном обновлении не появляется утверждение об успехе. Не создавайте искусственный Массив и не заменяйте getter фиксированной Структурой для прохождения проверки.
Если вы вручную приостановили своё обновление, новый отдельный опыт показывает настоящий признак паузы. Код не возобновляет процесс. Не вызывайте обработчик команды вручную и не подделывайте native фазу.
При 100% нет автоматического завершения или утверждения, что обновление целиком закончено. При актуализации пояснение не выдаёт 100 минус процент за её оставшийся объём.
Неверная версия/CF/форма/команда/права, пустой массив, иной класс элемента, пустое описание или неизвестный вид сообщения — неуспех. Негативные опыты только в своём новом стенде, не на рабочем обновлении.
Ожидаемый результат
При будущем успешном ручном наблюдении показаны действительная активная фаза, реальные признаки и процент обработки, полный классифицированный массив собственных сообщений. Это наблюдение, не подтверждение окончания обновления; здесь runtime-результат не получен.
На что обратить внимание
Фоновый producer из установленного диалога относится к клиент-серверной ИБ. Обычная новая File-база, неизвестный CFU или ОписаниеОбновленияКонфигурации не заменяют этот объект. Конструкторы описаний аудита с пересекающейся нулевой арностью не используются и не кредитуются.
Неактивно не является доказательством завершения без ошибки. ЗавершеноСОшибкой описывает предыдущую попытку, а 100% — лишь завершение обработки записей. Код не принимает административных решений по одному признаку.
Возвращаемые свойства только читаются. Тексты сообщений не гарантированно обезличены; фрагмент в 160 символов не маскирует пароль, путь или имя. Отчёт только местный и для целиком собственного стенда.
Статус может измениться между последовательными чтениями. Getter не документирует атомарный снимок, продолжительность, окончание всех фаз или отсутствие скрытых внутренних вызовов платформы.
Нет автоматического запуска, таймера, опроса, паузы, продолжения, отмены, завершения, очистки или повторной попытки. После исключения состояние процесса неизвестно; эта форма не является механизмом гарантированного восстановления.
Здесь создан и статически проверяется только учебный код. 1С, VM, ИБ, кластер, серверные процессы, сеть и GUI не запускались; реальные обновления, записи, файлы и резервные копии не создавались.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.