АдминистрированиеТребованиеНазначения.ДополнительныйПараметр

Свойства · AdditionalParameter

Тип: Строка. Содержит имя приложения с уточнением. Дополнительные признаки объектов требований Connection и SessionDataService, которые могут использоваться для выбора подходящего требования: Для фонового и регламентного задания - BackgroundJob.CommonModule.<Имя модуля>.<Имя метода>; Для отчета - BackgroundJob.Report.<Имя отчета>; Для фоновой реструктуризации – SystemBackgroundJob; Для клиентского приложения: 1CV8 – толстый клиент; 1CV8CDirect – тонкий клиент – непосредственное соединение; Designer – конфигуратор; COMConnection – COM-соединение; WebServerExtension – веб-клиент, тонкий клиент через веб-сервер, веб-сервисы.

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

АдминистрированиеТребованиеНазначения.ДополнительныйПараметр (AdministrationAssignmentRule.AdditionalParameter)

АдминистрированиеТребованиеНазначения (AdministrationAssignmentRule)

ДополнительныйПараметр (AdditionalParameter)

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

Использование:
Чтение и запись.
Описание:
Тип: Строка.
Содержит имя приложения с уточнением. Дополнительные признаки объектов требований Connection и SessionDataService, которые могут использоваться для выбора подходящего требования:
Для фонового и регламентного задания - BackgroundJob.CommonModule.<Имя модуля>.<Имя метода>;

Для отчета - BackgroundJob.Report.<Имя отчета>;

Для фоновой реструктуризации – SystemBackgroundJob;

Для клиентского приложения:
1CV8 – толстый клиент;

1CV8CDirect – тонкий клиент – непосредственное соединение;

Designer – конфигуратор;

COMConnection – COM-соединение;

WebServerExtension – веб-клиент, тонкий клиент через веб-сервер, веб-сервисы.

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

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

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

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

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

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

Два настоящих черновика требований: разобрать поля и сопоставить свой план без записи

Реальная фабрика собственного рабочего сервера → два typed native объекта → полный паспорт всех шести полей → локальный consumer четырёх учебных строк →1000/1550/1000. Приоритет и действие наблюдаются, кластерная политика не применяется.

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

Полный неглобальный Server+ServerCall общий модуль ЧерновикиНазначения85 в своей новой FileCF8.5.1.1343; собственная новая изолированная VM/localhost RAS. На клиент — только String.

Подготовка

  1. Это объяснение своих native черновиков и локальное сопоставление учебных строк, НЕ распределение соединений кластером и НЕ настройка приоритетов. Авторство и Python-проверки не запускали 1С/ras/VM, не подключались к серверу и ничего не записывали. Все будущие шаги — только на совершенно новой собственной изолированной Windows VM.

  2. На новой VM вручную установите законно доступные серверные компоненты 1С 8.5.1.1343 и консоль администрирования, создайте отдельные свой агент и ras. Не подключайте существующие службы/каталоги/кластер и не публикуйте его в интернет. Запишите фактический порт именно ras, не порт ragent/кластера. В примере127.0.0.1 — машина исполнения серверного модуля своей FileCF.

  3. В своей новой консоли оставьте ровно один собственный пустой кластер Уч85ЧерновикиТребований и ровно один собственный рабочий сервер Уч85ЕдинственныйРабочий с ИмяКомпьютера=127.0.0.1. Ни одной зарегистрированной ИБ. Полный список требований этого сервера должен быть пустым до опыта. Если новый стенд не даёт такой исходный набор, остановитесь; код не удаляет существующие правила и не готовит кластер автоматически.

  4. Заведите только свои новые отдельные учетные записи администратора агента и администратора кластера. Скопируйте фактические UUID своего кластера и рабочего сервера из собственной консоли; это НЕ UUID папки FileCF и НЕ UUID черновиков. Не используйте или читайте рабочие пароли. Native аутентификация агента принимает Пароль,Имя, а кластера Имя,Пароль; реальные отказы не обходятся.

  5. На той же VM вручную создайте совершенно новую FileCF C:\1c-labs\OwnAssignmentDrafts85_b9b86a5e-ce7b-499e-9ba4-fd2b2aa8367e\IB, не копию рабочей ИБ. Имя конфигурации УчебныеЧерновикиНазначения85, русский встроенный язык, режим совместимости НеИспользовать, ОсновнойРежимЗапуска УправляемоеПриложение. Не регистрируйте эту ИБ в учебном кластере. Объектов данных/интеграций/заданий/расширений нет.

  6. Создайте только свою роль ЧерновикиRAS85 с административными правами чтения пользователей, АктивныеПользователи для чтения соединений, запуском собственного толстого клиента и открытием общей формы. Создайте ровно одного своего нового пользователя ЧерновикиRAS85Ученик с этой одной ролью. Native ПолучитьПользователей и ПолучитьСоединенияИнформационнойБазы сами проверяют необходимые права; имя роли их не доказывает. Закройте Конфигуратор, оставьте одно соединение своей ИБ.

  7. Создайте единственный неглобальный общий модуль ЧерновикиНазначения85: Сервер Да, ВызовСервера Да; клиентские/ВнешнееСоединение/Привилегированный/Глобальный Нет; ПовторноеИспользованиеВозвращаемыхЗначений НеИспользовать. Вставьте MAIN целиком на уровень модуля. Административные proxy и ТаблицаЗначений остаются только на сервере; экспорт возвращает строку, не объект RAS.

  8. Создайте единственную общую управляемую форму ПультЧерновиковНазначения85. Реквизиты: ПаспортUUID85 Строка(36), Текст85 Строка неограниченная, Согласие85 Булево, ПортRAS85 Число(5,0), UUIDКластера85/UUIDСервера85 Строка(36), ИмяАгента85/ИмяАдминистратора85/ПарольАгента85/ПарольКластера85 Строка неограниченная. Поля привяжите через ПутьКДанным к одноимённым реквизитам; ПаспортUUID85/Текст85 только просмотр. Парольные поля — режим пароля, сохранение данных формы в настройках отключено. Значения паролей очищаются перед RPC, не пишутся в итог.

  9. Полный FORM вставьте в модуль этой общей формы. Настоящие события ПриСозданииНаСервере2 и ПриОткрытии1 свяжите с одноимёнными обработчиками. Создайте команду/кнопку Просмотр85 с действием Просмотр85(Команда). APP целиком разместите в модуле управляемого приложения; ПриНачалеРаботыСистемы0 открывает только свою форму. Не вызывайте события вручную и не подставляйте Неопределено вместо Команда.

  10. Обновите только свою новую FileCF, закройте Конфигуратор и запустите свой толстый управляемый клиент. Введите свой actual порт ras, два настоящих UUID и свои новые учетные данные. Согласие по умолчанию снято. Включайте его только после ручного подтверждения новой VM/единственного пустого кластера/рабочего сервера/0ИБ/0требований. Пульт потребляет согласие перед RPC и до подключения ставит sticky СТОП.

  11. Штатная цепь: Новый АдминистрированиеСервера(127.0.0.1,порт) → GetClusters real Array → свой единственный АдминистрированиеКластер → GetWorkServers real Array → свой единственный АдминистрированиеРабочийСервер → СоздатьТребованиеНазначения0 дважды. Никаких Новый Требование... или произвольных входных объектов. До/после фабрик полный fresh список требований проверяется как Массив/Количество0 у исходного и свежего native рабочего объекта.

  12. Имена баз в черновиках — OwnFutureBase85_<labUUID> и OtherFutureBase85_<labUUID>, явные локальные метки собственного будущего плана, НЕ зарегистрированные ИБ. A/B получают настоящие новые UUIDv4, ТипОбъекта Connection, исходные ДополнительныйПараметр 1CV8/Designer. Все четыре RW поля читаются назад из реального объекта; два readonly поля также читаются фактически.

  13. Приоритет — native Число, ТипТребованияНазначения — фактически полученный enum Авто/Назначать/НеНазначать. Их значения по умолчанию не описаны используемыми страницами и не угадываются: нет присваивания, числа0/101 или обещания типа действия. Если свежий getter возвращает недоступное/неизвестное значение, СТОП. Сортировка использует только наблюдаемый приоритет для порядка нашего текста, не для назначения серверов.

  14. Четыре собственные строки R1/R2/R3/R4 содержат Connection, две метки базы, приложения1CV8/Designer/1CV8CDirect/1CV8 и суммы750/250/800/900. Их вся схема, реальные типы, ключи, каждое поле и сумма2700 проверяются независимо. Наш consumer сравнивает только собственные точные поля черновика с этими строками и объясняет наблюдаемое действие. Это не native движок назначения и не настоящий запрос к ИБ.

  15. Первый вывод: R1/A750 и R2/B250, сумма1000. Затем меняется только поле НЕСОХРАНЁННОГО B.ДополнительныйПараметр на1CV8CDirect: actual R1/A750 и R3/B800, сумма1550. Полные паспорта обоих объектов проверяются до/после; собственные UUID, база, тип объекта, наблюдаемые readonly поля не подменяются. B возвращается к Designer только локальным присваиванием, и real consumer снова даёт1000. Это не rollback кластерной записи.

  16. MAIN нигде не вызывает Записать/Удалить/ПринятьТребованияНазначения/COM/rac.exe/управление службами. В конце fresh зарегистрированных требований0 и ИБ0; исходные четыре строки всё ещё2700. Наличие черновика не доказывает применение, реальное размещение, нагрузку или безопасность. Proxy/доступ к полям может обращаться к ras: отсутствие скрытого внутреннего I/O не обещается.

  17. После любой ошибки подключения, 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");
КонецПроцедуры

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

  1. Проверить собственный точный FileCF/userUUID и новый localhost RAS/версию/единственный кластер+worker/0ИБ/0требований.

  2. Создать A/B реальной фабрикой рабочего сервера, назначить только четыре RW поля, прочитать все шесть native полей и разные UUID.

  3. Проверить каждую из четырёх реальных строк источника, получить собственные объяснения1000 с actual action labels и presentation priority.

  4. Изменить только несохранённый B application filter, перечитать оба полных паспорта и пересчитать1550.

  5. Вернуть только свой in-memory фильтр B, подтвердить1000/исходные поля/2700 источника и fresh0требований/0ИБ.

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

  1. В своём будущем ручном опыте должно быть три actual отчета:1000,1550,1000; в каждом2 совпадения по собственным строкам.

  2. Порядок строк объяснения определяется actual Priority/слотом; само число приоритета, действие и порядок A/B заранее не обещаются.

  3. Чужой UUID/путь/кластер/сервер, непустой список, неизвестное readonly поле, изменённая строка, повторный ключ или иная сумма должны остановить опыт.

  4. Статические проверки не выполняли BSL/RAS/аутентификацию; после собственного ручного опыта отдельно проверьте в консоли0ИБ/0требований.

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

Новичок видит реальные native черновики, различает их изменяемые и readonly поля, получает честный собственный план сопоставления без сохранения или применения.

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

  1. Нельзя записывать readonly Приоритет/ТипТребованияНазначения или угадывать их default.

  2. Имя будущей базы — own draft label, не готовая ссылка на зарегистрированную ИБ.

  3. Local matching не равен реальному кластерному распределению; candidate/fallback/exclusion labels лишь объясняют фактически прочитанный enum.

  4. Ошибка getter не разрешает подставить0/Авто или неизвестный объект. Readback не даёт атомарности или доказательства отсутствия вмешательства.

  5. Локальное возвращение Designer — не откат чужой/кластерной записи; никаких NativeWrite/Delete/Apply в уроке нет.

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

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

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

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

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