Тип: Число. Приоритет требования. Для объекта требования при размещении вычисляется эффективное требование для каждого из серверов. Объект будет размещен там, где приоритет выше (при одинаковых типах требования).
Полное описание, параметры и ограничения
АдминистрированиеТребованиеНазначения.Приоритет (AdministrationAssignmentRule.Priority)
АдминистрированиеТребованиеНазначения (AdministrationAssignmentRule)
Приоритет (Priority)
Доступен, начиная с версии 8.3.14.
Использование:
Только чтение.
Описание:
Тип: Число.
Приоритет требования. Для объекта требования при размещении вычисляется эффективное требование для каждого из серверов. Объект будет размещен там, где приоритет выше (при одинаковых типах требования).
Доступность:
Тонкий клиент, сервер, толстый клиент, интеграция.
Использование в версии:
Доступен, начиная с версии 8.3.14.
Методическая информация
Практические примеры
Два настоящих черновика требований: разобрать поля и сопоставить свой план без записи
Реальная фабрика собственного рабочего сервера → два typed native объекта → полный паспорт всех шести полей → локальный consumer четырёх учебных строк →1000/1550/1000. Приоритет и действие наблюдаются, кластерная политика не применяется.
Где и как запускать
Полный неглобальный Server+ServerCall общий модуль ЧерновикиНазначения85 в своей новой FileCF8.5.1.1343; собственная новая изолированная VM/localhost RAS. На клиент — только String.
Подготовка
Это объяснение своих native черновиков и локальное сопоставление учебных строк, НЕ распределение соединений кластером и НЕ настройка приоритетов. Авторство и Python-проверки не запускали 1С/ras/VM, не подключались к серверу и ничего не записывали. Все будущие шаги — только на совершенно новой собственной изолированной Windows VM.
На новой VM вручную установите законно доступные серверные компоненты 1С 8.5.1.1343 и консоль администрирования, создайте отдельные свой агент и ras. Не подключайте существующие службы/каталоги/кластер и не публикуйте его в интернет. Запишите фактический порт именно ras, не порт ragent/кластера. В примере127.0.0.1 — машина исполнения серверного модуля своей FileCF.
В своей новой консоли оставьте ровно один собственный пустой кластер Уч85ЧерновикиТребований и ровно один собственный рабочий сервер Уч85ЕдинственныйРабочий с ИмяКомпьютера=127.0.0.1. Ни одной зарегистрированной ИБ. Полный список требований этого сервера должен быть пустым до опыта. Если новый стенд не даёт такой исходный набор, остановитесь; код не удаляет существующие правила и не готовит кластер автоматически.
Заведите только свои новые отдельные учетные записи администратора агента и администратора кластера. Скопируйте фактические UUID своего кластера и рабочего сервера из собственной консоли; это НЕ UUID папки FileCF и НЕ UUID черновиков. Не используйте или читайте рабочие пароли. Native аутентификация агента принимает Пароль,Имя, а кластера Имя,Пароль; реальные отказы не обходятся.
На той же VM вручную создайте совершенно новую FileCF C:\1c-labs\OwnAssignmentDrafts85_b9b86a5e-ce7b-499e-9ba4-fd2b2aa8367e\IB, не копию рабочей ИБ. Имя конфигурации УчебныеЧерновикиНазначения85, русский встроенный язык, режим совместимости НеИспользовать, ОсновнойРежимЗапуска УправляемоеПриложение. Не регистрируйте эту ИБ в учебном кластере. Объектов данных/интеграций/заданий/расширений нет.
Создайте только свою роль ЧерновикиRAS85 с административными правами чтения пользователей, АктивныеПользователи для чтения соединений, запуском собственного толстого клиента и открытием общей формы. Создайте ровно одного своего нового пользователя ЧерновикиRAS85Ученик с этой одной ролью. Native ПолучитьПользователей и ПолучитьСоединенияИнформационнойБазы сами проверяют необходимые права; имя роли их не доказывает. Закройте Конфигуратор, оставьте одно соединение своей ИБ.
Создайте единственный неглобальный общий модуль ЧерновикиНазначения85: Сервер Да, ВызовСервера Да; клиентские/ВнешнееСоединение/Привилегированный/Глобальный Нет; ПовторноеИспользованиеВозвращаемыхЗначений НеИспользовать. Вставьте MAIN целиком на уровень модуля. Административные proxy и ТаблицаЗначений остаются только на сервере; экспорт возвращает строку, не объект RAS.
Создайте единственную общую управляемую форму ПультЧерновиковНазначения85. Реквизиты: ПаспортUUID85 Строка(36), Текст85 Строка неограниченная, Согласие85 Булево, ПортRAS85 Число(5,0), UUIDКластера85/UUIDСервера85 Строка(36), ИмяАгента85/ИмяАдминистратора85/ПарольАгента85/ПарольКластера85 Строка неограниченная. Поля привяжите через ПутьКДанным к одноимённым реквизитам; ПаспортUUID85/Текст85 только просмотр. Парольные поля — режим пароля, сохранение данных формы в настройках отключено. Значения паролей очищаются перед RPC, не пишутся в итог.
Полный FORM вставьте в модуль этой общей формы. Настоящие события ПриСозданииНаСервере2 и ПриОткрытии1 свяжите с одноимёнными обработчиками. Создайте команду/кнопку Просмотр85 с действием Просмотр85(Команда). APP целиком разместите в модуле управляемого приложения; ПриНачалеРаботыСистемы0 открывает только свою форму. Не вызывайте события вручную и не подставляйте Неопределено вместо Команда.
Обновите только свою новую FileCF, закройте Конфигуратор и запустите свой толстый управляемый клиент. Введите свой actual порт ras, два настоящих UUID и свои новые учетные данные. Согласие по умолчанию снято. Включайте его только после ручного подтверждения новой VM/единственного пустого кластера/рабочего сервера/0ИБ/0требований. Пульт потребляет согласие перед RPC и до подключения ставит sticky СТОП.
Штатная цепь: Новый АдминистрированиеСервера(127.0.0.1,порт) → GetClusters real Array → свой единственный АдминистрированиеКластер → GetWorkServers real Array → свой единственный АдминистрированиеРабочийСервер → СоздатьТребованиеНазначения0 дважды. Никаких Новый Требование... или произвольных входных объектов. До/после фабрик полный fresh список требований проверяется как Массив/Количество0 у исходного и свежего native рабочего объекта.
Имена баз в черновиках — OwnFutureBase85_<labUUID> и OtherFutureBase85_<labUUID>, явные локальные метки собственного будущего плана, НЕ зарегистрированные ИБ. A/B получают настоящие новые UUIDv4, ТипОбъекта Connection, исходные ДополнительныйПараметр 1CV8/Designer. Все четыре RW поля читаются назад из реального объекта; два readonly поля также читаются фактически.
Приоритет — native Число, ТипТребованияНазначения — фактически полученный enum Авто/Назначать/НеНазначать. Их значения по умолчанию не описаны используемыми страницами и не угадываются: нет присваивания, числа0/101 или обещания типа действия. Если свежий getter возвращает недоступное/неизвестное значение, СТОП. Сортировка использует только наблюдаемый приоритет для порядка нашего текста, не для назначения серверов.
Четыре собственные строки R1/R2/R3/R4 содержат Connection, две метки базы, приложения1CV8/Designer/1CV8CDirect/1CV8 и суммы750/250/800/900. Их вся схема, реальные типы, ключи, каждое поле и сумма2700 проверяются независимо. Наш consumer сравнивает только собственные точные поля черновика с этими строками и объясняет наблюдаемое действие. Это не native движок назначения и не настоящий запрос к ИБ.
Первый вывод: R1/A750 и R2/B250, сумма1000. Затем меняется только поле НЕСОХРАНЁННОГО B.ДополнительныйПараметр на1CV8CDirect: actual R1/A750 и R3/B800, сумма1550. Полные паспорта обоих объектов проверяются до/после; собственные UUID, база, тип объекта, наблюдаемые readonly поля не подменяются. B возвращается к Designer только локальным присваиванием, и real consumer снова даёт1000. Это не rollback кластерной записи.
MAIN нигде не вызывает Записать/Удалить/ПринятьТребованияНазначения/COM/rac.exe/управление службами. В конце fresh зарегистрированных требований0 и ИБ0; исходные четыре строки всё ещё2700. Наличие черновика не доказывает применение, реальное размещение, нагрузку или безопасность. Proxy/доступ к полям может обращаться к ras: отсутствие скрытого внутреннего I/O не обещается.
После любой ошибки подключения, native getter, проверки источника, сопоставления или RPC пульт sticky СТОП и согласие снято. Нет автоматического повтора, удаления, вызова другого агента или снятия защиты. Сохраните фактическую ошибку для своего стенда, не публикуйте диагностические окна/учётные данные. Не переоткрывайте форму ради сброса флага: сначала отдельно установите действительный исход на собственной VM.
Функция Паспорт85() Экспорт
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnAssignmentDrafts85_b9b86a5e-ce7b-499e-9ba4-fd2b2aa8367e\IB"";" Тогда
ВызватьИсключение "Нужна новая собственная файловая ИБ по точному пути";
КонецЕсли;
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или ПривилегированныйРежим() Или ТранзакцияАктивна() Тогда
ВызватьИсключение "Не совпал собственный непривилегированный FileCF/8.5/NoUse контекст";
КонецЕсли;
Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0
Или Метаданные.Константы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0
Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0
Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0
Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0
Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Или Метаданные.HTTPСервисы.Количество() <> 0
Или Метаданные.WebСервисы.Количество() <> 0 Или Метаданные.СервисыИнтеграции.Количество() <> 0
Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0
Или Метаданные.Отчеты.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0 Тогда
ВызватьИсключение "Нужна пустая собственная модель без объектов данных и интеграций";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации()
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения своей базы и сеанса запрещены";
КонецЕсли;
Если Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеФормы.Количество() <> 1
Или Метаданные.ОбщиеФормы.Найти("ПультЧерновиковНазначения85") = Неопределено
Или Метаданные.Роли.Количество() <> 1 Тогда
ВызватьИсключение "Нужны только один полный модуль, один пульт и одна роль";
КонецЕсли;
Модуль = Метаданные.ОбщиеМодули.Найти("ЧерновикиНазначения85");
Если Модуль = Неопределено Тогда
ВызватьИсключение "Нет собственного полного общего модуля";
КонецЕсли;
Если Модуль.Глобальный Или Не Модуль.Сервер Или Не Модуль.ВызовСервера
Или Модуль.КлиентОбычноеПриложение Или Модуль.КлиентУправляемоеПриложение
Или Модуль.ВнешнееСоединение Или Модуль.Привилегированный
Или Модуль.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Модуль должен быть неглобальным Server+ServerCall без привилегий/кеша";
КонецЕсли;
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователь = Неопределено Или ТипЗнч(Пользователь) <> Тип("ПользовательИнформационнойБазы") Тогда
ВызватьИсключение "Нет настоящего текущего пользователя";
КонецЕсли;
Если Пользователь.Имя <> "ЧерновикиRAS85Ученик" Тогда
ВызватьИсключение "Нужен только свой новый учебный пользователь";
КонецЕсли;
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если ТипЗнч(Пользователи) <> Тип("Массив") Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Только один собственный пользователь";
КонецЕсли;
Свой = Пользователи[0];
Если ТипЗнч(Свой) <> Тип("ПользовательИнформационнойБазы") Или Свой.Имя <> Пользователь.Имя
Или Свой.УникальныйИдентификатор <> Пользователь.УникальныйИдентификатор Тогда
ВызватьИсключение "Фактический полный список не совпал с пользователем своего сеанса";
КонецЕсли;
СвояРоль = Метаданные.Роли.Найти("ЧерновикиRAS85");
Если СвояРоль = Неопределено Или Не Свой.Роли.Содержит(СвояРоль) Тогда
ВызватьИсключение "Нет своей явно подготовленной роли";
КонецЕсли;
ЧислоРолей = 0;
Для Каждого Роль Из Свой.Роли Цикл
Если Роль <> СвояРоль Тогда
ВызватьИсключение "Чужая роль запрещена";
КонецЕсли;
ЧислоРолей = ЧислоРолей + 1;
КонецЦикла;
Если ЧислоРолей <> 1 Или ПолучитьСоединенияИнформационнойБазы().Количество() <> 1 Тогда
ВызватьИсключение "Только одна своя роль и одно соединение";
КонецЕсли;
Возврат Строка(Свой.УникальныйИдентификатор);
КонецФункции
Функция БазаЧерновиков85()
Возврат "OwnFutureBase85_b9b86a5e-ce7b-499e-9ba4-fd2b2aa8367e";
КонецФункции
Процедура ПустойRAS85(Агент, Кластер, Рабочий, UUIDКластера, UUIDСервера, ПаспортПользователя)
Если Паспорт85() <> ПаспортПользователя Или Агент.ПолучитьВерсию() <> "8.5.1.1343" Тогда
ВызватьИсключение "Изменился собственный FileCF/пользователь/сервер";
КонецЕсли;
Кластеры = Агент.ПолучитьКластеры();
Если ТипЗнч(Кластеры) <> Тип("Массив") Или Кластеры.Количество() <> 1 Тогда
ВызватьИсключение "Только один собственный кластер";
КонецЕсли;
СвежийКластер = Кластеры[0];
Если ТипЗнч(СвежийКластер) <> Тип("АдминистрированиеКластер")
Или СвежийКластер.Имя <> "Уч85ЧерновикиТребований"
Или Строка(СвежийКластер.ИдентификаторКластера) <> UUIDКластера
Или Строка(Кластер.ИдентификаторКластера) <> UUIDКластера Тогда
ВызватьИсключение "Не совпал фактический новый собственный кластер";
КонецЕсли;
Базы = Кластер.ПолучитьИнформационныеБазы();
Если ТипЗнч(Базы) <> Тип("Массив") Или Базы.Количество() <> 0 Тогда
ВызватьИсключение "Ни одной зарегистрированной ИБ";
КонецЕсли;
Серверы = Кластер.ПолучитьРабочиеСерверы();
Если ТипЗнч(Серверы) <> Тип("Массив") Или Серверы.Количество() <> 1 Тогда
ВызватьИсключение "Только один свой рабочий сервер";
КонецЕсли;
СвежийРабочий = Серверы[0];
Если ТипЗнч(СвежийРабочий) <> Тип("АдминистрированиеРабочийСервер")
Или СвежийРабочий.Имя <> "Уч85ЕдинственныйРабочий"
Или СвежийРабочий.ИмяКомпьютера <> "127.0.0.1"
Или Строка(СвежийРабочий.ИдентификаторРабочегоСервера) <> UUIDСервера
Или Строка(Рабочий.ИдентификаторРабочегоСервера) <> UUIDСервера Тогда
ВызватьИсключение "Не совпал фактический свой рабочий сервер";
КонецЕсли;
Требования = СвежийРабочий.ПолучитьТребованияНазначения();
Если ТипЗнч(Требования) <> Тип("Массив") Или Требования.Количество() <> 0 Тогда
ВызватьИсключение "Полный свежий список должен быть пустым, чужие требования не изменять";
КонецЕсли;
ТребованияИсходного = Рабочий.ПолучитьТребованияНазначения();
Если ТипЗнч(ТребованияИсходного) <> Тип("Массив") Или ТребованияИсходного.Количество() <> 0 Тогда
ВызватьИсключение "Исходный native рабочий объект также не подтверждает пустое состояние";
КонецЕсли;
КонецПроцедуры
Функция ПаспортЧерновика85(Черновик, Идентификатор, Приложение)
Если ТипЗнч(Черновик) <> Тип("АдминистрированиеТребованиеНазначения")
Или ТипЗнч(Идентификатор) <> Тип("УникальныйИдентификатор") Тогда
ВызватьИсключение "Нужны настоящий собственный native черновик и его UUID";
КонецЕсли;
Если Черновик.ИдентификаторТребования <> Идентификатор
Или Черновик.ИмяИнформационнойБазы <> БазаЧерновиков85()
Или Черновик.ТипОбъекта <> "Connection"
Или Черновик.ДополнительныйПараметр <> Приложение Тогда
ВызватьИсключение "Полный паспорт четырех своих RW полей не совпал";
КонецЕсли;
Приоритет = Черновик.Приоритет;
Действие = Черновик.ТипТребованияНазначения;
Если ТипЗнч(Приоритет) <> Тип("Число")
Или ТипЗнч(Действие) <> Тип("АдминистрированиеТипТребованияНазначения") Тогда
ВызватьИсключение "Свежие native readonly поля не доступны ожидаемыми типами";
КонецЕсли;
Если Действие <> АдминистрированиеТипТребованияНазначения.Назначать
И Действие <> АдминистрированиеТипТребованияНазначения.Авто
И Действие <> АдминистрированиеТипТребованияНазначения.НеНазначать Тогда
ВызватьИсключение "Неизвестное фактически полученное native действие";
КонецЕсли;
Возврат Новый Структура("Идентификатор,База,Объект,Приложение,Приоритет,Действие",
Черновик.ИдентификаторТребования, Черновик.ИмяИнформационнойБазы, Черновик.ТипОбъекта,
Черновик.ДополнительныйПараметр, Приоритет, Действие);
КонецФункции
Функция Черновик85(Рабочий, Идентификатор, Приложение)
Если Приложение <> "1CV8" И Приложение <> "Designer" Тогда
ВызватьИсключение "Только два исходных своих приложения";
КонецЕсли;
Черновик = Рабочий.СоздатьТребованиеНазначения();
Если ТипЗнч(Черновик) <> Тип("АдминистрированиеТребованиеНазначения") Тогда
ВызватьИсключение "Реальная native фабрика не создала ожидаемый объект";
КонецЕсли;
Черновик.ИдентификаторТребования = Идентификатор;
Черновик.ИмяИнформационнойБазы = БазаЧерновиков85();
Черновик.ТипОбъекта = "Connection";
Черновик.ДополнительныйПараметр = Приложение;
ПаспортЧерновика85(Черновик, Идентификатор, Приложение);
Возврат Черновик;
КонецФункции
Функция Задания85()
Задания = Новый ТаблицаЗначений;
Для Каждого Имя Из СтрРазделить("Код,База,Объект,Приложение", ",") Цикл
Задания.Колонки.Добавить(Имя, Новый ОписаниеТипов("Строка"));
КонецЦикла;
Задания.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
ДобавитьЗадание85(Задания, "R1", БазаЧерновиков85(), "1CV8", 750);
ДобавитьЗадание85(Задания, "R2", БазаЧерновиков85(), "Designer", 250);
ДобавитьЗадание85(Задания, "R3", БазаЧерновиков85(), "1CV8CDirect", 800);
ДобавитьЗадание85(Задания, "R4", "OtherFutureBase85_b9b86a5e-ce7b-499e-9ba4-fd2b2aa8367e", "1CV8", 900);
ПроверитьЗадания85(Задания);
Возврат Задания;
КонецФункции
Процедура ДобавитьЗадание85(Задания, Код, База, Приложение, Сумма)
СтрокаЗадания = Задания.Добавить();
СтрокаЗадания.Код = Код;
СтрокаЗадания.База = База;
СтрокаЗадания.Объект = "Connection";
СтрокаЗадания.Приложение = Приложение;
СтрокаЗадания.Сумма = Сумма;
КонецПроцедуры
Процедура ПроверитьЗадания85(Задания)
Если ТипЗнч(Задания) <> Тип("ТаблицаЗначений") Или Задания.Количество() <> 4
Или Задания.Колонки.Количество() <> 5 Тогда
ВызватьИсключение "Нужен полный собственный источник четырех строк/пяти колонок";
КонецЕсли;
Для Каждого ИмяКолонки Из СтрРазделить("Код,База,Объект,Приложение,Сумма", ",") Цикл
Если Задания.Колонки.Найти(ИмяКолонки) = Неопределено Тогда
ВызватьИсключение "Изменена собственная полная схема колонок";
КонецЕсли;
КонецЦикла;
Встреченные = Новый Соответствие;
Всего = 0;
Для Каждого СтрокаЗадания Из Задания Цикл
Если ТипЗнч(СтрокаЗадания) <> Тип("СтрокаТаблицыЗначений")
Или ТипЗнч(СтрокаЗадания.Код) <> Тип("Строка")
Или ТипЗнч(СтрокаЗадания.База) <> Тип("Строка")
Или ТипЗнч(СтрокаЗадания.Объект) <> Тип("Строка")
Или ТипЗнч(СтрокаЗадания.Приложение) <> Тип("Строка")
Или ТипЗнч(СтрокаЗадания.Сумма) <> Тип("Число")
Или СтрокаЗадания.Объект <> "Connection"
Или Встреченные.Получить(СтрокаЗадания.Код) <> Неопределено Тогда
ВызватьИсключение "Чужая/повторная строка или неверный реальный тип значения";
КонецЕсли;
Код = СтрокаЗадания.Код;
Если Код = "R1" Тогда
База = БазаЧерновиков85(); Приложение = "1CV8"; Сумма = 750;
ИначеЕсли Код = "R2" Тогда
База = БазаЧерновиков85(); Приложение = "Designer"; Сумма = 250;
ИначеЕсли Код = "R3" Тогда
База = БазаЧерновиков85(); Приложение = "1CV8CDirect"; Сумма = 800;
ИначеЕсли Код = "R4" Тогда
База = "OtherFutureBase85_b9b86a5e-ce7b-499e-9ba4-fd2b2aa8367e"; Приложение = "1CV8"; Сумма = 900;
Иначе
ВызватьИсключение "Неизвестный собственный ключ источника";
КонецЕсли;
Если СтрокаЗадания.База <> База Или СтрокаЗадания.Приложение <> Приложение Или СтрокаЗадания.Сумма <> Сумма Тогда
ВызватьИсключение "Проверяется каждое значение источника, не только сумма";
КонецЕсли;
Встреченные.Вставить(Код, Истина);
Всего = Всего + СтрокаЗадания.Сумма;
КонецЦикла;
Если Встреченные.Количество() <> 4 Или Всего <> 2700 Тогда
ВызватьИсключение "Полный независимый источник изменен";
КонецЕсли;
КонецПроцедуры
Функция ПодписьДействия85(Действие)
Если Действие = АдминистрированиеТипТребованияНазначения.Назначать Тогда
Возврат "кандидат по native значению";
ИначеЕсли Действие = АдминистрированиеТипТребованияНазначения.Авто Тогда
Возврат "резерв по native значению";
ИначеЕсли Действие = АдминистрированиеТипТребованияНазначения.НеНазначать Тогда
Возврат "исключение по native значению";
КонецЕсли;
ВызватьИсключение "Нельзя подменять неизвестное действие";
КонецФункции
Процедура СравнитьПаспорт85(Фактический, Исходный, Приложение)
Если ТипЗнч(Фактический) <> Тип("Структура") Или ТипЗнч(Исходный) <> Тип("Структура")
Или Фактический.Количество() <> 6 Или Исходный.Количество() <> 6 Тогда
ВызватьИсключение "Нужны полные шесть скалярных полей реальных паспортов";
КонецЕсли;
Для Каждого Имя Из СтрРазделить("Идентификатор,База,Объект,Приоритет,Действие", ",") Цикл
Если Не Фактический.Свойство(Имя, Значение) Или Не Исходный.Свойство(Имя, Эталон) Или Значение <> Эталон Тогда
ВызватьИсключение "Изменилось неподвижное actual поле собственного черновика";
КонецЕсли;
КонецЦикла;
Если Фактический.Приложение <> Приложение Тогда
ВызватьИсключение "Не подтвердился разрешенный собственный фильтр приложения";
КонецЕсли;
КонецПроцедуры
Функция Сопоставить85(Задания, A, B, UUIDA, UUIDB, ПриложениеB, ОжидаемаяСумма)
ПроверитьЗадания85(Задания);
Паспорта = Новый Массив;
Паспорта.Добавить(ПаспортЧерновика85(A, UUIDA, "1CV8"));
Паспорта.Добавить(ПаспортЧерновика85(B, UUIDB, ПриложениеB));
Если UUIDA = UUIDB Тогда
ВызватьИсключение "Свои два native черновика должны иметь разные UUID";
КонецЕсли;
Объяснения = Новый ТаблицаЗначений;
Для Каждого Имя Из СтрРазделить("Слот,Код,UUID,Действие", ",") Цикл
Объяснения.Колонки.Добавить(Имя, Новый ОписаниеТипов("Строка"));
КонецЦикла;
Объяснения.Колонки.Добавить("Приоритет", Новый ОписаниеТипов("Число"));
Объяснения.Колонки.Добавить("Сумма", Новый ОписаниеТипов("Число"));
Встреченные = Новый Соответствие;
Сумма = 0;
Для Каждого Паспорт Из Паспорта Цикл
Слот = "A";
Если Паспорт.Идентификатор = UUIDB Тогда
Слот = "B";
КонецЕсли;
Для Каждого СтрокаЗадания Из Задания Цикл
Если СтрокаЗадания.База = Паспорт.База И СтрокаЗадания.Объект = Паспорт.Объект
И СтрокаЗадания.Приложение = Паспорт.Приложение Тогда
Если Встреченные.Получить(СтрокаЗадания.Код) <> Неопределено Тогда
ВызватьИсключение "Неоднозначное сопоставление собственных фильтров";
КонецЕсли;
СтрокаОбъяснения = Объяснения.Добавить();
СтрокаОбъяснения.Слот = Слот;
СтрокаОбъяснения.Код = СтрокаЗадания.Код;
СтрокаОбъяснения.UUID = Строка(Паспорт.Идентификатор);
СтрокаОбъяснения.Действие = ПодписьДействия85(Паспорт.Действие);
СтрокаОбъяснения.Приоритет = Паспорт.Приоритет;
СтрокаОбъяснения.Сумма = СтрокаЗадания.Сумма;
Встреченные.Вставить(СтрокаЗадания.Код, Истина);
Сумма = Сумма + СтрокаЗадания.Сумма;
КонецЕсли;
КонецЦикла;
КонецЦикла;
Если Объяснения.Количество() <> 2 Или Встреченные.Количество() <> 2 Или Сумма <> ОжидаемаяСумма Тогда
ВызватьИсключение "Фактический собственный consumer не подтвердил две строки/ожидаемую сумму";
КонецЕсли;
Объяснения.Сортировать("Приоритет Убыв, Слот");
Текст = "Собственное сопоставление, НЕ распределение кластером. Сумма=" + Строка(Сумма) + Символы.ПС;
Для Каждого СтрокаОбъяснения Из Объяснения Цикл
Текст = Текст + СтрокаОбъяснения.Слот + "/" + СтрокаОбъяснения.Код + "/"
+ СтрокаОбъяснения.UUID + "/" + СтрокаОбъяснения.Действие
+ "/наблюдаемыйПриоритет=" + Строка(СтрокаОбъяснения.Приоритет)
+ "/сумма=" + Строка(СтрокаОбъяснения.Сумма) + Символы.ПС;
КонецЦикла;
Возврат Текст;
КонецФункции
Функция Выполнить85(ПортRAS, UUIDКластера, UUIDСервера, ИмяАгента, ПарольАгента,
ИмяАдминистратора, ПарольАдминистратора, ПаспортПользователя, ПодтвержденСвойRAS) Экспорт
Если Паспорт85() <> ПаспортПользователя Или ТипЗнч(ПодтвержденСвойRAS) <> Тип("Булево")
Или Не ПодтвержденСвойRAS Тогда
ВызватьИсключение "Сначала подтвердите свой физически изолированный новый стенд";
КонецЕсли;
Если ТипЗнч(ПортRAS) <> Тип("Число") Или ПортRAS < 1 Или ПортRAS > 65535 Или ПортRAS <> Цел(ПортRAS) Тогда
ВызватьИсключение "Нужен фактический целый порт ras своей VM";
КонецЕсли;
Параметры = Новый Структура("UUIDКластера,UUIDСервера,ИмяАгента,ПарольАгента,ИмяАдминистратора,ПарольАдминистратора",
UUIDКластера, UUIDСервера, ИмяАгента, ПарольАгента, ИмяАдминистратора, ПарольАдминистратора);
Для Каждого Параметр Из Параметры Цикл
Если ТипЗнч(Параметр.Значение) <> Тип("Строка") Тогда
ВызватьИсключение "Учетные данные и actual UUID должны быть строками";
КонецЕсли;
КонецЦикла;
Если СтрДлина(UUIDКластера) <> 36 Или СтрДлина(UUIDСервера) <> 36 Или ИмяАгента = "" Или ИмяАдминистратора = "" Тогда
ВызватьИсключение "Укажите собственные действительные UUID и две разные учетные области";
КонецЕсли;
Агент = Новый АдминистрированиеСервера("127.0.0.1", ПортRAS);
Если ТипЗнч(Агент) <> Тип("АдминистрированиеСервера") Тогда
ВызватьИсключение "Не получен native агент своей VM";
КонецЕсли;
Агент.ВыполнитьАутентификацию(ПарольАгента, ИмяАгента);
Если Агент.ПолучитьВерсию() <> "8.5.1.1343" Тогда
ВызватьИсключение "Не совпала точная версия собственного сервера";
КонецЕсли;
Кластеры = Агент.ПолучитьКластеры();
Если ТипЗнч(Кластеры) <> Тип("Массив") Или Кластеры.Количество() <> 1 Тогда
ВызватьИсключение "Не единственный собственный кластер";
КонецЕсли;
Кластер = Кластеры[0];
Если ТипЗнч(Кластер) <> Тип("АдминистрированиеКластер") Или Кластер.Имя <> "Уч85ЧерновикиТребований"
Или Строка(Кластер.ИдентификаторКластера) <> UUIDКластера Тогда
ВызватьИсключение "Неправильный фактический UUID/имя кластера";
КонецЕсли;
Кластер.ВыполнитьАутентификацию(ИмяАдминистратора, ПарольАдминистратора);
Серверы = Кластер.ПолучитьРабочиеСерверы();
Если ТипЗнч(Серверы) <> Тип("Массив") Или Серверы.Количество() <> 1 Тогда
ВызватьИсключение "Не единственный собственный рабочий сервер";
КонецЕсли;
Рабочий = Серверы[0];
Если ТипЗнч(Рабочий) <> Тип("АдминистрированиеРабочийСервер") Тогда
ВызватьИсключение "Нет настоящего native рабочего сервера";
КонецЕсли;
ПустойRAS85(Агент, Кластер, Рабочий, UUIDКластера, UUIDСервера, ПаспортПользователя);
UUIDA = Новый УникальныйИдентификатор;
UUIDB = Новый УникальныйИдентификатор;
A = Черновик85(Рабочий, UUIDA, "1CV8");
ПустойRAS85(Агент, Кластер, Рабочий, UUIDКластера, UUIDСервера, ПаспортПользователя);
B = Черновик85(Рабочий, UUIDB, "Designer");
ПустойRAS85(Агент, Кластер, Рабочий, UUIDКластера, UUIDСервера, ПаспортПользователя);
ИсходныйA = ПаспортЧерновика85(A, UUIDA, "1CV8");
ИсходныйB = ПаспортЧерновика85(B, UUIDB, "Designer");
Задания = Задания85();
Первый = Сопоставить85(Задания, A, B, UUIDA, UUIDB, "Designer", 1000);
СравнитьПаспорт85(ПаспортЧерновика85(A, UUIDA, "1CV8"), ИсходныйA, "1CV8");
СравнитьПаспорт85(ПаспортЧерновика85(B, UUIDB, "Designer"), ИсходныйB, "Designer");
ПустойRAS85(Агент, Кластер, Рабочий, UUIDКластера, UUIDСервера, ПаспортПользователя);
B.ДополнительныйПараметр = "1CV8CDirect";
Второй = Сопоставить85(Задания, A, B, UUIDA, UUIDB, "1CV8CDirect", 1550);
СравнитьПаспорт85(ПаспортЧерновика85(A, UUIDA, "1CV8"), ИсходныйA, "1CV8");
СравнитьПаспорт85(ПаспортЧерновика85(B, UUIDB, "1CV8CDirect"), ИсходныйB, "1CV8CDirect");
ПустойRAS85(Агент, Кластер, Рабочий, UUIDКластера, UUIDСервера, ПаспортПользователя);
B.ДополнительныйПараметр = "Designer";
Третий = Сопоставить85(Задания, A, B, UUIDA, UUIDB, "Designer", 1000);
СравнитьПаспорт85(ПаспортЧерновика85(A, UUIDA, "1CV8"), ИсходныйA, "1CV8");
СравнитьПаспорт85(ПаспортЧерновика85(B, UUIDB, "Designer"), ИсходныйB, "Designer");
ПустойRAS85(Агент, Кластер, Рабочий, UUIDКластера, UUIDСервера, ПаспортПользователя);
ПроверитьЗадания85(Задания);
Возврат Первый + Второй + Третий + "Подтверждено: сохраненных требований 0, ИБ 0.";
КонецФункцииПолный модуль собственной общей формы-пульта
ОбщаяФорма.ПультЧерновиковНазначения85.Модуль
Server ПриСозданииНаСервере2; толстый управляемый клиент ПриОткрытии1/Просмотр85(Команда)1; только scalar RPC.
&НаКлиенте
Перем Остановлен85;
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПаспортUUID85 = ЧерновикиНазначения85.Паспорт85();
Согласие85 = Ложь;
Текст85 = "Только будущая новая собственная VM. Запись и применение требований здесь запрещены.";
КонецПроцедуры
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если Остановлен85 <> Неопределено Тогда
ВызватьИсключение "Повторная инициализация не очищает предыдущий СТОП";
КонецЕсли;
Остановлен85 = Истина;
Попытка
Если ТипЗнч(ПаспортUUID85) <> Тип("Строка") Или СтрДлина(ПаспортUUID85) <> 36
Или Согласие85 <> Ложь Тогда
ВызватьИсключение "Нет собственного первичного паспорта/снятого согласия";
КонецЕсли;
Остановлен85 = Ложь;
Исключение
Остановлен85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура Просмотр85(Команда)
Если Остановлен85 <> Ложь Тогда
ВызватьИсключение "СТОП: не сбрасывайте ошибку переоткрытием или повтором";
КонецЕсли;
Если Согласие85 <> Истина Тогда
ВызватьИсключение "Сначала вручную подтвердите точную новую собственную VM и прочитайте границы";
КонецЕсли;
Разрешение = Согласие85;
Согласие85 = Ложь;
ПарольА = ПарольАгента85;
ПарольК = ПарольКластера85;
ПарольАгента85 = "";
ПарольКластера85 = "";
Остановлен85 = Истина;
Попытка
Итог = ЧерновикиНазначения85.Выполнить85(ПортRAS85, UUIDКластера85, UUIDСервера85,
ИмяАгента85, ПарольА, ИмяАдминистратора85, ПарольК, ПаспортUUID85, Разрешение);
Если ТипЗнч(Итог) <> Тип("Строка") Тогда
ВызватьИсключение "Не получен полный scalar RPC отчет";
КонецЕсли;
Текст85 = Итог;
Остановлен85 = Ложь;
Исключение
Остановлен85 = Истина;
Согласие85 = Ложь;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыПолный модуль собственного управляемого приложения
Модуль управляемого приложения своей новой CF
Толстый управляемый клиент, настоящее ПриНачалеРаботыСистемы0.
Процедура ПриНачалеРаботыСистемы()
ОткрытьФорму("ОбщаяФорма.ПультЧерновиковНазначения85");
КонецПроцедурыРазбор по шагам
Проверить собственный точный FileCF/userUUID и новый localhost RAS/версию/единственный кластер+worker/0ИБ/0требований.
Создать A/B реальной фабрикой рабочего сервера, назначить только четыре RW поля, прочитать все шесть native полей и разные UUID.
Проверить каждую из четырёх реальных строк источника, получить собственные объяснения1000 с actual action labels и presentation priority.
Изменить только несохранённый B application filter, перечитать оба полных паспорта и пересчитать1550.
Вернуть только свой in-memory фильтр B, подтвердить1000/исходные поля/2700 источника и fresh0требований/0ИБ.
Как проверить результат
В своём будущем ручном опыте должно быть три actual отчета:1000,1550,1000; в каждом2 совпадения по собственным строкам.
Порядок строк объяснения определяется actual Priority/слотом; само число приоритета, действие и порядок A/B заранее не обещаются.
Чужой UUID/путь/кластер/сервер, непустой список, неизвестное readonly поле, изменённая строка, повторный ключ или иная сумма должны остановить опыт.
Статические проверки не выполняли BSL/RAS/аутентификацию; после собственного ручного опыта отдельно проверьте в консоли0ИБ/0требований.
Ожидаемый результат
Новичок видит реальные native черновики, различает их изменяемые и readonly поля, получает честный собственный план сопоставления без сохранения или применения.
На что обратить внимание
Нельзя записывать readonly Приоритет/ТипТребованияНазначения или угадывать их default.
Имя будущей базы — own draft label, не готовая ссылка на зарегистрированную ИБ.
Local matching не равен реальному кластерному распределению; candidate/fallback/exclusion labels лишь объясняют фактически прочитанный enum.
Ошибка getter не разрешает подставить0/Авто или неизвестный объект. Readback не даёт атомарности или доказательства отсутствия вмешательства.
Локальное возвращение Designer — не откат чужой/кластерной записи; никаких NativeWrite/Delete/Apply в уроке нет.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.