НастройкаСервиса.Записать

Методы · Write

Добавляет или обновляет настройку сервиса кластера на рабочем сервере.

Синтаксис

Записать()
Полное описание, параметры и ограничения

НастройкаСервиса.Записать (ServiceSetting.Write)

НастройкаСервиса (ServiceSetting)

Записать (Write)

Доступен, начиная с версии 8.3.26.

Синтаксис:
Записать()
Описание:

Добавляет или обновляет настройку сервиса кластера на рабочем сервере.

Доступность:

Тонкий клиент, сервер, толстый клиент, интеграция.

Использование в версии:

Доступен, начиная с версии 8.3.26.

Методическая информация

Практические примеры

Собственная настройка сервиса RAS: сохранить, проверить и выбрать отмену или применение

На своём новом изолированном кластере настоящий сервис даёт имя для фабрики настройки вторичного сервера. Своя папка сохраняется и проверяется полным списком и двумя адресными чтениями; отдельная конечная ветвь отменяет только свою неактивную запись либо подготавливает применение без переноса и перезагрузки.

Где и как запускать

Неглобальный серверный общий модуль своей файловой CF на Windows x64 8.5.1.1343. Используются платформенные RAS classes в Сервер, не COM wrappers и не Интеграция; клиентская форма выполняет только собственный RPC и проверки скалярного ответа.

Подготовка

  1. Это будущий ручной опыт: здесь 1С, RAS, COM, VM, служба и сеть не запускались. Нужна отдельная новая собственная Windows x64 VM с 8.5.1.1343, собственными агентами/кластером/RAS и законными учётными данными. Не используйте производственный кластер и не создавайте учебную ИБ внутри рабочего кластера.

  2. На той же VM заранее вручную подготовьте RAS на 127.0.0.1:1545 и отдельный кластер УчебныйКластерСервисов85, компьютер 127.0.0.1, порт менеджера 1541. В нём ровно два заранее подготовленных своих рабочих сервера: центральный УчебныйОсновнойСервер85 / 127.0.0.1 / порт агента1540 и нецентральный УчебныйВторичныйСервер85 / 127.0.0.1 / порт агента1740. Администратор задаёт совместимые службы, разные диапазоны рабочих портов и действительные права; код их не устанавливает и не меняет.

  3. В своей консоли выпишите фактические UUID кластера и вторичного сервера. Это настоящие значения, не выдуманные UUID и не доказательство владения по одному имени. В кластере нет зарегистрированных ИБ; администратор отдельно подтверждает отсутствие рабочих процессов. У GetWorkProcesses нулевая подпись, но описание области двусмысленно: пустой результат только дополнительная проверка, не доказательство полноты инвентаря.

  4. На своём основном сервере заранее подтвердите ровно одну настоящую глобальную настройку ClientTestingService с пустым именем ИБ. Это документированное имя сервиса тестирования, но наличие в вашем GetServices и пригодность дополнительного менеджера проверяются фактически. Если глобальной настройки, сервиса или допустимости нет — стенд не подготовлен; не подставляйте другое имя и не создавайте настройки чужого сервера.

  5. Вручную заранее создайте только на этой своей VM отдельную пустую обычную папку C:\OwnedService85\31ac8d49-c71a-46b6-b925-86240b53bd60\service-data и предоставьте действительному служебному пользователю необходимые права. Не junction/symlink и не рабочая папка. Проверки существования и типа папки не доказывают владение, пустоту или права: эти условия подтверждает администратор. Код не создаёт, не переносит и не удаляет файлы.

  6. Создайте вне этого кластера новую собственную файловую ИБ-контроллер на той же VM. В её новой пустой CF: Имя = УчебныеНастройкиСервисов85, Версия = OWN85:service-settings:ras-native, Основной режим запуска = Управляемое приложение, Режим совместимости = Не использовать. Не добавляйте расширения, общие реквизиты, регламентные задания, привилегированный код или обработчики запуска.

  7. Общие → Общие модули: УчебныеСервисы85Сервер. Сервер = Да; Глобальный, Привилегированный, ВызовСервера, оба Клиент, ВнешнееСоединение = Нет; ПовторноеИспользованиеВозвращаемыхЗначений = НеИспользовать. Вставьте весь основной код. Своя серверная функция формы вызывает этот модуль; клиент напрямую его не вызывает.

  8. Общие → Общие формы: управляемая Сервисы85. Реквизиты Строка, длина0: UUIDКластера85, UUIDСервера85, ИмяАгента85, ПарольАгента85, ИмяАдминистратора85, ПарольАдминистратора85, UUIDНастройки85, Отчет85. Согласие85 — Булево. Фаза85 — Число, длина1, точность0, скрыта от редактирования; её фактический начальный0 проверяется при первой команде, редакторное начальное значение не обещается. UUIDНастройки85 — ТолькоПросмотр, при первом создании фактически пуст. Сбросов, редакторов фаз и обработчиков открытия не создавайте.

  9. Выведите входные UUID/имена и два парольных поля с РежимПароля = Да; Отчет85 — многострочное поле, ТолькоПросмотр = Да. АвтоматическоеСохранениеДанныхВНастройках = НеИспользовать и СохранениеДанныхВНастройках = НеИспользовать — два разных перечисления, не Булево. Флажок Согласие85 подписать «Разрешаю выбранное действие только на собственном новом стенде».

  10. В форме создайте три команды Создать85, Отменить85, Применить85. У каждой Действие = Выполнить85, ИспользованиеТекущейСтроки и ИспользованиеВыделенныхСтрок = НеИспользует. Добавьте три кнопки; весь блок модуля формы ниже вставьте в её пустой модуль. Общие → Общие команды: ОткрытьСервисы85 без параметра; вставьте блок общей команды ниже и включите её в свою подсистему УчебныеСервисы85.

  11. Начните с отсутствующей настройки вторичного сервера. После создания здесь допускается ровно один следующий осознанный шаг: отменить неактивную запись либо подготовить применение. Заново введите свои пароли и отметьте согласие на этот второй шаг. Чтобы увидеть обе положительные ветви, используйте два отдельно подготовленных своих экземпляра стенда; не повторяйте изменяющую команду после отказа и не сбрасывайте фазу.

  12. Apply требует отдельной перезагрузки кластера для активации. В этом опыте код не перезагружает, не деактивирует настройки и не переносит данные. Реальная перезагрузка при необходимости — отдельное ручное решение только владельца этого собственного стенда; результата после неё здесь не проверяли.

&НаСервере
Функция ВыполнитьСервис85(Знач Операция85, Знач UUIDКластера85, Знач UUIDСервера85, Знач ИмяАгента85, Знач ПарольАгента85, Знач ИмяАдминистратора85, Знач ПарольАдминистратора85, Знач UUIDНастройки85, Знач Фаза85, Знач Подтверждено85) Экспорт
    Если ТипЗнч(Подтверждено85) <> Тип("Булево") Или Не Подтверждено85 Тогда
        ВызватьИсключение "Подключение к собственному стенду не подтверждено";
    КонецЕсли;
    Если ТипЗнч(Операция85) <> Тип("Строка") Или ТипЗнч(Фаза85) <> Тип("Число") Тогда
        ВызватьИсключение "Не подтверждены команда и потраченная фаза";
    КонецЕсли;
    Если Операция85 = "Создать85" Тогда
        Если Фаза85 <> 1 Тогда
            ВызватьИсключение "Создание допускается только из потраченной первой фазы";
        КонецЕсли;
    ИначеЕсли Операция85 = "Отменить85" Или Операция85 = "Применить85" Тогда
        Если Фаза85 <> 3 Тогда
            ВызватьИсключение "Завершающая команда требует потраченной третьей фазы";
        КонецЕсли;
    Иначе
        ВызватьИсключение "Неизвестная команда";
    КонецЕсли;
    Если ТипЗнч(UUIDКластера85) <> Тип("Строка") Или ТипЗнч(UUIDСервера85) <> Тип("Строка")
        Или ТипЗнч(ИмяАгента85) <> Тип("Строка") Или ТипЗнч(ПарольАгента85) <> Тип("Строка")
        Или ТипЗнч(ИмяАдминистратора85) <> Тип("Строка") Или ТипЗнч(ПарольАдминистратора85) <> Тип("Строка")
        Или ТипЗнч(UUIDНастройки85) <> Тип("Строка") Тогда
        ВызватьИсключение "Передайте строковые поля собственных учётных данных и идентификаторов";
    КонецЕсли;
    Если ПустаяСтрока(UUIDКластера85) Или ПустаяСтрока(UUIDСервера85)
        Или ПустаяСтрока(ИмяАгента85) Или ПустаяСтрока(ПарольАгента85)
        Или ПустаяСтрока(ИмяАдминистратора85) Или ПустаяСтрока(ПарольАдминистратора85) Тогда
        ВызватьИсключение "Нужны настоящие собственные непустые учётные данные";
    КонецЕсли;
    Среда85 = Новый СистемнаяИнформация;
    Если Среда85.ТипПлатформы <> ТипПлатформы.Windows_x86_64 Тогда
        ВызватьИсключение "Нужна собственная Windows x64 VM с 8.5.1.1343";
    КонецЕсли;
    Агент85 = Новый АдминистрированиеСервера("127.0.0.1", 1545);
    Если ТипЗнч(Агент85) <> Тип("АдминистрированиеСервера") Тогда
        ВызватьИсключение "Не получено настоящее соединение RAS";
    КонецЕсли;
    Агент85.ВыполнитьАутентификацию(ПарольАгента85, ИмяАгента85);
    Версия85 = Агент85.ПолучитьВерсию();
    Если ТипЗнч(Версия85) <> Тип("Строка") Или Версия85 <> "8.5.1.1343" Тогда
        ВызватьИсключение "Версия собственного сервера не подтверждена";
    КонецЕсли;
    Кластеры85 = Агент85.ПолучитьКластеры();
    Если ТипЗнч(Кластеры85) <> Тип("Массив") Тогда
        ВызватьИсключение "Не получен массив кластеров";
    КонецЕсли;
    Кластер85 = Неопределено;
    НайденоКластеров85 = 0;
    Для Каждого Кандидат85 Из Кластеры85 Цикл
        Если ТипЗнч(Кандидат85) <> Тип("АдминистрированиеКластер") Тогда
            ВызватьИсключение "Не подтверждён тип кластера";
        КонецЕсли;
        Если ТипЗнч(Кандидат85.ИдентификаторКластера) <> Тип("УникальныйИдентификатор")
            Или ТипЗнч(Кандидат85.Имя) <> Тип("Строка") Или ТипЗнч(Кандидат85.ИмяКомпьютера) <> Тип("Строка")
            Или ТипЗнч(Кандидат85.Порт) <> Тип("Число") Тогда
            ВызватьИсключение "Не подтверждены поля выбора кластера";
        КонецЕсли;
        Если Строка(Кандидат85.ИдентификаторКластера) = UUIDКластера85
            И Кандидат85.Имя = "УчебныйКластерСервисов85" И Кандидат85.ИмяКомпьютера = "127.0.0.1" И Кандидат85.Порт = 1541 Тогда
            Кластер85 = Кандидат85;
            НайденоКластеров85 = НайденоКластеров85 + 1;
        КонецЕсли;
    КонецЦикла;
    Если НайденоКластеров85 <> 1 Или ТипЗнч(Кластер85) <> Тип("АдминистрированиеКластер") Тогда
        ВызватьИсключение "Не выбран ровно один собственный кластер";
    КонецЕсли;
    Кластер85.ВыполнитьАутентификацию(ИмяАдминистратора85, ПарольАдминистратора85);
    Базы85 = Кластер85.ПолучитьИнформационныеБазы();
    Процессы85 = Кластер85.ПолучитьРабочиеПроцессы();
    Если ТипЗнч(Базы85) <> Тип("Массив") Или ТипЗнч(Процессы85) <> Тип("Массив") Тогда
        ВызватьИсключение "Не подтверждены массивы дополнительной проверки стенда";
    КонецЕсли;
    Если Базы85.Количество() <> 0 Или Процессы85.Количество() <> 0 Тогда
        ВызватьИсключение "Пример запрещён при зарегистрированных ИБ или непустом возвращённом списке процессов";
    КонецЕсли;
    Серверы85 = Кластер85.ПолучитьРабочиеСерверы();
    Если ТипЗнч(Серверы85) <> Тип("Массив") Или Серверы85.Количество() <> 2 Тогда
        ВызватьИсключение "В собственном стенде ожидаются ровно два заранее подготовленных сервера";
    КонецЕсли;
    Основной85 = Неопределено;
    Вторичный85 = Неопределено;
    Основных85 = 0;
    Вторичных85 = 0;
    Для Каждого Рабочий85 Из Серверы85 Цикл
        Если ТипЗнч(Рабочий85) <> Тип("АдминистрированиеРабочийСервер") Тогда
            ВызватьИсключение "Не подтверждён рабочий сервер";
        КонецЕсли;
        Если ТипЗнч(Рабочий85.ИдентификаторРабочегоСервера) <> Тип("УникальныйИдентификатор")
            Или ТипЗнч(Рабочий85.Имя) <> Тип("Строка") Или ТипЗнч(Рабочий85.ИмяКомпьютера) <> Тип("Строка")
            Или ТипЗнч(Рабочий85.Порт) <> Тип("Число") Или ТипЗнч(Рабочий85.ЦентральныйСервер) <> Тип("Булево") Тогда
            ВызватьИсключение "Не подтверждены пять полей рабочего сервера";
        КонецЕсли;
        Если Рабочий85.ЦентральныйСервер И Рабочий85.Имя = "УчебныйОсновнойСервер85"
            И Рабочий85.ИмяКомпьютера = "127.0.0.1" И Рабочий85.Порт = 1540 Тогда
            Основной85 = Рабочий85;
            Основных85 = Основных85 + 1;
        ИначеЕсли Не Рабочий85.ЦентральныйСервер И Рабочий85.Имя = "УчебныйВторичныйСервер85"
            И Рабочий85.ИмяКомпьютера = "127.0.0.1" И Рабочий85.Порт = 1740
            И Строка(Рабочий85.ИдентификаторРабочегоСервера) = UUIDСервера85 Тогда
            Вторичный85 = Рабочий85;
            Вторичных85 = Вторичных85 + 1;
        КонецЕсли;
    КонецЦикла;
    Если Основных85 <> 1 Или Вторичных85 <> 1 Тогда
        ВызватьИсключение "Не выбраны собственные основной и вторичный серверы";
    КонецЕсли;
    Сервисы85 = Кластер85.ПолучитьСервисы();
    Если ТипЗнч(Сервисы85) <> Тип("Массив") Тогда
        ВызватьИсключение "Не получен массив настоящих сервисов";
    КонецЕсли;
    Сервис85 = Неопределено;
    НайденоСервисов85 = 0;
    Для Каждого Элемент85 Из Сервисы85 Цикл
        Если ТипЗнч(Элемент85) <> Тип("АдминистрированиеСервис") Или ТипЗнч(Элемент85.Имя) <> Тип("Строка") Тогда
            ВызватьИсключение "Не подтверждены сервис и его настоящее имя";
        КонецЕсли;
        Если Элемент85.Имя = "ClientTestingService" Тогда
            Сервис85 = Элемент85;
            НайденоСервисов85 = НайденоСервисов85 + 1;
        КонецЕсли;
    КонецЦикла;
    Если НайденоСервисов85 <> 1 Тогда
        ВызватьИсключение "Настоящий сервис тестирования не найден однозначно";
    КонецЕсли;
    ИмяСервиса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 Из Шаблоны85 Цикл
        ПаспортШаблона85 = ПаспортНастройки85(Шаблон85);
        Если ПаспортШаблона85.Имя85 = ИмяСервиса85 И ПаспортШаблона85.База85 = "" Тогда
            Глобальных85 = Глобальных85 + 1;
        КонецЕсли;
    КонецЦикла;
    Если Глобальных85 <> 1 Тогда
        ВызватьИсключение "Нет ровно одной настоящей глобальной настройки сервиса на своём основном сервере";
    КонецЕсли;
    Каталог85 = "C:\OwnedService85\31ac8d49-c71a-46b6-b925-86240b53bd60\service-data";
    Папка85 = Новый Файл(Каталог85);
    Если Не Папка85.Существует() Или Не Папка85.ЭтоКаталог() Тогда
        ВызватьИсключение "Вручную подготовьте отдельную собственную папку";
    КонецЕсли;
    Настройки85 = Вторичный85.ПолучитьНастройкиСервисов();
    Если ТипЗнч(Настройки85) <> Тип("Массив") Тогда
        ВызватьИсключение "Не получен полный массив настроек вторичного сервера";
    КонецЕсли;
    Если Операция85 = "Создать85" Тогда
        Если Настройки85.Количество() <> 0 Или UUIDНастройки85 <> "" Тогда
            ВызватьИсключение "Создание не перезаписывает существующую настройку";
        КонецЕсли;
        Новая85 = Вторичный85.СоздатьНастройкуСервиса(ИмяСервиса85, "");
        Если ТипЗнч(Новая85) <> Тип("НастройкаСервиса") Тогда
            ВызватьИсключение "Фабрика не вернула настоящую настройку";
        КонецЕсли;
        Новая85.КаталогДанныхСервиса = Каталог85;
        Новая85.Записать();
        Настройки85 = Вторичный85.ПолучитьНастройкиСервисов();
        Если ТипЗнч(Настройки85) <> Тип("Массив") Или Настройки85.Количество() <> 1 Тогда
            ВызватьИсключение "Сохранение одной собственной настройки не подтверждено";
        КонецЕсли;
        Своя85 = Настройки85.Получить(0);
        Паспорт85 = ПаспортНастройки85(Своя85);
        НоваяФаза85 = 2;
    Иначе
        Если Настройки85.Количество() <> 1 Или ПустаяСтрока(UUIDНастройки85) Тогда
            ВызватьИсключение "Нужна ранее созданная одна собственная настройка";
        КонецЕсли;
        Своя85 = Настройки85.Получить(0);
        Паспорт85 = ПаспортНастройки85(Своя85);
        Если Строка(Паспорт85.UUID85) <> UUIDНастройки85 Тогда
            ВызватьИсключение "Идентификатор отличается от фактически сохранённого на этой форме";
        КонецЕсли;
        НоваяФаза85 = 4;
    КонецЕсли;
    Если Паспорт85.Имя85 <> ИмяСервиса85 Или Паспорт85.База85 <> "" Или Паспорт85.Каталог85 <> Каталог85 Тогда
        ВызватьИсключение "Состав своей глобальной настройки отличается";
    КонецЕсли;
    ПоUUID85 = ПаспортНастройки85(Вторичный85.ПолучитьНастройкуСервиса(Паспорт85.UUID85));
    ПоИмени85 = ПаспортНастройки85(Вторичный85.ПолучитьНастройкуСервиса(ИмяСервиса85, ""));
    Для Каждого Поле85 Из Паспорт85 Цикл
        Если ПоUUID85[Поле85.Ключ] <> Поле85.Значение Или ПоИмени85[Поле85.Ключ] <> Поле85.Значение Тогда
            ВызватьИсключение "Два свежих адресных чтения пяти полей не совпали";
        КонецЕсли;
    КонецЦикла;
    Если Операция85 = "Отменить85" Тогда
        Если ПоUUID85.Активна85 Тогда
            ВызватьИсключение "Активную настройку этот урок не удаляет";
        КонецЕсли;
        Своя85.Удалить();
        Осталось85 = Вторичный85.ПолучитьНастройкиСервисов();
        Если ТипЗнч(Осталось85) <> Тип("Массив") Или Осталось85.Количество() <> 0 Тогда
            ВызватьИсключение "Удаление только своей неактивной регистрации не подтверждено";
        КонецЕсли;
        Строки85.Добавить("Своих настроек после отмены: " + Строка(Осталось85.Количество()) + ". Папка и файлы не удалялись.");
    ИначеЕсли Операция85 = "Применить85" Тогда
        План85 = Вторичный85.ПолучитьКаталогиДанныхСервисаДляПереноса(ИмяСервиса85);
        Если ТипЗнч(План85) <> Тип("Массив") Или План85.Количество() <> 0 Тогда
            ВызватьИсключение "Перенос данных не входит в этот урок";
        КонецЕсли;
        Вторичный85.ПрименитьНастройкиСервисов();
        ПаспортПосле85 = ПаспортНастройки85(Вторичный85.ПолучитьНастройкуСервиса(Паспорт85.UUID85));
        Если ПаспортПосле85.UUID85 <> Паспорт85.UUID85 Или ПаспортПосле85.Имя85 <> Паспорт85.Имя85
            Или ПаспортПосле85.База85 <> Паспорт85.База85 Или ПаспортПосле85.Каталог85 <> Паспорт85.Каталог85 Тогда
            ВызватьИсключение "Свежая настройка после команды применения отличается";
        КонецЕсли;
        Паспорт85 = ПаспортПосле85;
        Строки85.Добавить("Команда применения выполнена для своего набора. Активация требует отдельной ручной перезагрузки собственного кластера; код её не выполняет.");
    Иначе
        Строки85.Добавить("Сохранена ровно одна собственная настройка. Отмена или подготовка применения выбирается отдельно.");
    КонецЕсли;
    Строки85.Добавить("Фактический UUID настройки: " + Строка(Паспорт85.UUID85));
    Строки85.Добавить("Сервис: " + Паспорт85.Имя85 + "; имя ИБ: [" + Паспорт85.База85 + "]; папка: " + Паспорт85.Каталог85);
    Строки85.Добавить("Прочитанный флаг активности: " + Строка(Паспорт85.Активна85) + ". При отмене это последнее наблюдение до удаления, не существующая запись после него.");
    Строки85.Добавить("Чтения последовательные, не атомарный снимок. Ноль возвращённых процессов не доказывает полноту инвентаря; ручная подготовка своего стенда обязательна.");
    Возврат Новый ФиксированнаяСтруктура(Новый Структура("Отчет85,UUID85,Каталог85,Имя85,Активна85,Фаза85", СтрСоединить(Строки85, Символы.ПС), Строка(Паспорт85.UUID85), Паспорт85.Каталог85, Паспорт85.Имя85, Паспорт85.Активна85, НоваяФаза85));
КонецФункции

&НаСервере
Функция ПаспортНастройки85(Настройка85)
    Если ТипЗнч(Настройка85) <> Тип("НастройкаСервиса") Тогда
        ВызватьИсключение "Получена не настоящая настройка сервиса";
    КонецЕсли;
    UUID85 = Настройка85.ИдентификаторНастройки;
    Имя85 = Настройка85.ИмяСервиса;
    База85 = Настройка85.ИмяИнформационнойБазы;
    Каталог85 = Настройка85.КаталогДанныхСервиса;
    Активна85 = Настройка85.НастройкаАктивна;
    Если ТипЗнч(UUID85) <> Тип("УникальныйИдентификатор") Или ТипЗнч(Имя85) <> Тип("Строка")
        Или ТипЗнч(База85) <> Тип("Строка") Или ТипЗнч(Каталог85) <> Тип("Строка") Или ТипЗнч(Активна85) <> Тип("Булево") Тогда
        ВызватьИсключение "Пять фактических полей настройки имеют неожиданный тип";
    КонецЕсли;
    Возврат Новый ФиксированнаяСтруктура(Новый Структура("UUID85,Имя85,База85,Каталог85,Активна85", UUID85, Имя85, База85, Каталог85, Активна85));
КонецФункции
Модуль своей формы Сервисы85: три настоящие команды и расходование фаз

Общие → Общие формы → Сервисы85 → пустой модуль; у всех трёх команд Действие=Выполнить85.

Тонкий клиент, затем собственная серверная функция формы без контекста; все10аргументов действительно передаются и используются.

&НаКлиенте
Процедура Выполнить85(Команда)
    Отчет85 = "";
    ЛокальныйПарольАгента85 = ПарольАгента85;
    ЛокальныйПарольАдминистратора85 = ПарольАдминистратора85;
    ПарольАгента85 = "";
    ПарольАдминистратора85 = "";
    Попытка
        Если ТипЗнч(Команда) <> Тип("КомандаФормы") Или ИмяФормы <> "ОбщаяФорма.Сервисы85"
            Или АвтоматическоеСохранениеДанныхВНастройках <> АвтоматическоеСохранениеДанныхФормыВНастройках.НеИспользовать
            Или СохранениеДанныхВНастройках <> СохранениеДанныхФормыВНастройках.НеИспользовать Тогда
            ВызватьИсключение "Нужна настоящая своя форма без сохранения полей в настройках";
        КонецЕсли;
        Если ТипЗнч(Фаза85) <> Тип("Число") Или ТипЗнч(Согласие85) <> Тип("Булево") Или Не Согласие85 Тогда
            ВызватьИсключение "Нужны фактическая фаза и собственное однократное согласие";
        КонецЕсли;
        Операция85 = Команда.Имя;
        Если Операция85 = "Создать85" И Фаза85 = 0 Тогда
            ПотраченнаяФаза85 = 1;
            ОжидаемаяФаза85 = 2;
        ИначеЕсли (Операция85 = "Отменить85" Или Операция85 = "Применить85") И Фаза85 = 2 Тогда
            ПотраченнаяФаза85 = 3;
            ОжидаемаяФаза85 = 4;
        Иначе
            ВызватьИсключение "Команда не разрешена в этой фазе; после отказа повтор запрещён";
        КонецЕсли;
        Подтверждено85 = Согласие85;
        Согласие85 = Ложь;
        Фаза85 = ПотраченнаяФаза85;
        Получено85 = ВыполнитьНаСервере85(Операция85, UUIDКластера85, UUIDСервера85, ИмяАгента85, ЛокальныйПарольАгента85, ИмяАдминистратора85, ЛокальныйПарольАдминистратора85, UUIDНастройки85, Фаза85, Подтверждено85);
        ЛокальныйПарольАгента85 = "";
        ЛокальныйПарольАдминистратора85 = "";
        Если ТипЗнч(Получено85) <> Тип("ФиксированнаяСтруктура") Тогда
            ВызватьИсключение "Не получен проверяемый пакет результата";
        КонецЕсли;
        Если Получено85.Количество() <> 6 Или Не Получено85.Свойство("Отчет85") Или Не Получено85.Свойство("UUID85")
            Или Не Получено85.Свойство("Каталог85") Или Не Получено85.Свойство("Имя85")
            Или Не Получено85.Свойство("Активна85") Или Не Получено85.Свойство("Фаза85") Тогда
            ВызватьИсключение "Состав пакета отличается от шести своих полей";
        КонецЕсли;
        Если ТипЗнч(Получено85.Отчет85) <> Тип("Строка") Или Получено85.Отчет85 = ""
            Или ТипЗнч(Получено85.UUID85) <> Тип("Строка") Или ПустаяСтрока(Получено85.UUID85)
            Или ТипЗнч(Получено85.Каталог85) <> Тип("Строка")
            Или Получено85.Каталог85 <> "C:\OwnedService85\31ac8d49-c71a-46b6-b925-86240b53bd60\service-data"
            Или ТипЗнч(Получено85.Имя85) <> Тип("Строка") Или Получено85.Имя85 <> "ClientTestingService"
            Или ТипЗнч(Получено85.Активна85) <> Тип("Булево")
            Или ТипЗнч(Получено85.Фаза85) <> Тип("Число") Или Получено85.Фаза85 <> ОжидаемаяФаза85 Тогда
            ВызватьИсключение "Фактические значения результата не подтверждены";
        КонецЕсли;
        UUIDНастройки85 = Получено85.UUID85;
        Отчет85 = Получено85.Отчет85;
        Фаза85 = Получено85.Фаза85;
    Исключение
        ЛокальныйПарольАгента85 = "";
        ЛокальныйПарольАдминистратора85 = "";
        Согласие85 = Ложь;
        Фаза85 = 5;
        Отчет85 = "СТОП. Операция не подтверждена. Пароли и технический текст ошибки не выводятся. Собственная настройка могла сохраниться; повтор, восстановление и автоматическая очистка не выполняются.";
    КонецПопытки;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере85(Знач Операция85, Знач UUIDКластера85, Знач UUIDСервера85, Знач ИмяАгента85, Знач ПарольАгента85, Знач ИмяАдминистратора85, Знач ПарольАдминистратора85, Знач UUIDНастройки85, Знач Фаза85, Знач Подтверждено85)
    Возврат УчебныеСервисы85Сервер.ВыполнитьСервис85(Операция85, UUIDКластера85, UUIDСервера85, ИмяАгента85, ПарольАгента85, ИмяАдминистратора85, ПарольАдминистратора85, UUIDНастройки85, Фаза85, Подтверждено85);
КонецФункции
Модуль своей общей команды ОткрытьСервисы85

Общие → Общие команды → ОткрытьСервисы85 → пустой модуль; команда без параметра.

Клиентская штатная ОбработкаКоманды с двумя используемыми формальными параметрами; только открытие своей формы.

&НаКлиенте
Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
    Если ПараметрКоманды <> Неопределено Или ТипЗнч(ПараметрыВыполненияКоманды) <> Тип("ПараметрыВыполненияКоманды") Тогда
        ВызватьИсключение "Используйте свою общую команду без параметра";
    КонецЕсли;
    ОткрытьФорму("ОбщаяФорма.Сервисы85");
КонецПроцедуры

Разбор по шагам

  1. Создать85: старый отчёт и парольные поля очищаются, исходное согласие захватывается, первая фаза расходуется до RPC. На сервере этот настоящий Булево проверяется до RAS. После любой ошибки форма остаётся в терминальной фазе5, повтор запрещён.

  2. Это платформенные русскоязычные классы RAS, не одноимённые COM-интерфейсы. У аутентификации агента порядок Пароль, Имя; у кластера Имя, Пароль. Из полных настоящих массивов выбираются ровно свой кластер, основной и вторичный серверы с фактическими UUID и подготовленными признаками.

  3. Имя настоящего ClientTestingService используется в фабрике настройки; его описание идёт в отчёт, признак «только главный менеджер» запрещает неподходящий выбор, весь возвращённый список UUID менеджеров отображается. Не предполагается универсальное количество менеджеров0или1.

  4. Фабрика возвращает настоящую НастройкаСервиса. Меняется только КаталогДанныхСервиса; Записать сохраняет описание. На вторичном сервере свежий список меняется с фактического0на1. Реальные UUID, сервис, пустая область ИБ, папка и активность типизируются и сравниваются ещё в двух новых чтениях: по UUID и по имени+ИБ.

  5. Отменить85: повторно проверяется одна собственная запись и сохранённый на этой форме фактический UUID. Только при реально прочитанном Ложь активности выполняется Удалить, затем свежий полный список должен иметь0элементов. Это удаление регистрации, не папки, не файлов и не обратный перенос данных.

  6. Применить85: выбран только свой набор из одной записи; непустой фактический план переноса запрещает действие. ПрименитьНастройкиСервисов — процедура без возвращаемого результата. Новое чтение сообщает пять фактических полей и наблюдаемый Булево активности; сохранённый план и команда применения не объявляются доказательством уже работающего сервиса.

Как проверить результат

  1. Ожидания относятся только к будущему ручному запуску. После Создать85 показаны настоящий UUID и ровно одна собственная настройка с ClientTestingService, пустым именем ИБ и своей папкой; два новых способа чтения совпали по всем пяти полям. UUID не задаётся вручную.

  2. При выбранной отмене реально неактивной записи показан свежий0элементов. Собственная папка и её содержимое не удалялись. При активности Истина получаете СТОП; код не пытается присвоить активности Ложь.

  3. При выбранной подготовке применения план переноса фактически пуст, пять полей прочитаны заново и сообщается наблюдаемый флаг. Перезагрузка, активация после неё, переразмещение и перенос файлов не проверены и не обещаются.

  4. Пароли исчезают из двух полей до RPC. Фаза на клиенте уже1или3 до вызова сервера; нельзя получить второй запуск той же изменяющей фазы после ошибки. При успехе создания доступны только две конечные альтернативы, после них фаза4; при отказе5. Фазы — учебный порядок на этой форме, не механизм безопасности или конкурентной блокировки.

  5. Пакет ответа проверен по точному типу, шести именам, количеству и типам/значениям до присвоений. Ошибка выводится фиксированным текстом без паролей и технического исключения. Собственная запись могла сохраниться до отказа: автоматической очистки, восстановления и гарантии атомарности нет.

Ожидаемый результат

После будущего успешного создания фактически сохранена ровно одна своя настройка, пять полей совпадают в двух новых чтениях. Выбранная отмена подтверждает отсутствие неактивной регистрации; выбранная подготовка применения сообщает новое наблюдение без обещания активации до ручной перезагрузки. Код не переносит/удаляет файлы и не делает recovery. Запуск в 1С не проверялся.

На что обратить внимание

  1. ИдентификаторНастройки, ИмяСервиса, ИмяИнформационнойБазы и НастройкаАктивна только читаются. Readonly имена/UUID берутся из реальной фабрики и свежего списка; Новый НастройкаСервиса отсутствует.

  2. GetServices допускает несколько менеджеров у SessionDataService, а отдельная страница ManagerIDs говорит об одном на сервис. Это расхождение сохранено: не ограничиваем весь список универсальным1 и не приписываем пустому списку выдуманные UUID.

  3. Пустой план переноса не доказывает отсутствие ранее применённых настроек: уже применённые записи не отображаются в таком плане. Поэтому собственный новый стенд и ручная история подготовки необходимы; код не выдаёт ноль за доказательство безопасности чужого кластера.

  4. Native GetWorkProcesses описывает рабочий сервер при нулевой подписи на Кластере. Проверяется только фактически возвращённый массив; полнота списка и отсутствие процессов всего кластера им не доказываются. Чтения и выбор по UUID не атомарный снимок и не защита от изменений между вызовами.

  5. Права служебной папки и минимальные административные права кодом не доказываются. Истечение паролей, иной формат версии, неверный тип или неподготовленный стенд дают отказ. Очищенные строки не гарантируют стирание памяти или отсутствие внутреннего аудита платформы.

  6. После серверной ошибки не вызываются Get, Delete, Apply, повторная аутентификация или восстановление. Нет автоматического возврата каталогов, деактивации, перезагрузки, создания/удаления рабочих серверов, ИБ, файлов и резервных копий.

Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.