Для настоящих стандартных полей Код и Наименование собственного учебного справочника создаём явный профиль. Копируем только два проверенных булевых правила в новые контейнеры, меняем копию и доказываем сохранность исходного профиля. В историю базы ничего не записываем.
Где и как запускать
Полный серверный общий модуль УчебнаяИстория своего стенда УчебныеПрофилиИстории85 с единственным учебным справочником. Только проверка памяти, без применения настроек.
Подготовка
НОВАЯ отдельная учебная база точно 8.5.1.1343, конфигурация УчебныеПрофилиИстории85, совместимость Не использовать. Единственный справочник УчебныеТовары: неиерархический, без владельцев, собственных реквизитов и табличных частей; стандартный Код строка9 и Наименование строка50. Не создавать записи справочника. Других бизнес-объектов, расширений, подписок и фоновых заданий нет.
Создайте общий модуль УчебнаяИстория: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте полный основной модуль. В своей внешней обработке УчебныеПрофилиИстории85 создайте управляемую форму, команду/кнопку Выполнить с действием Выполнить и вставьте полный отдельный модуль формы ниже.
Будущая ручная подготовка: сохранить конфигурацию, Конфигурация → Обновить конфигурацию базы данных (F7), открыть новый свой сеанс и собственную обработку. Здесь конфигурация, справочник, F7 и BSL не создавались и не запускались.
Код проверяет конфигурацию, единственный справочник и наличие именно стандартных полей Код/Наименование обходом ОписанияСтандартныхРеквизитов. У этой коллекции нет метода Найти: не заменяйте цикл вымышленным вызовом. Имена профиля не взяты из неизвестного рабочего объекта.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойСтендПрофилей();
ПроверитьСвоиИменаПолей();
Основной = Новый НастройкиИсторииДанных;
Основной.Использование = Истина;
ПоляОсновного = Новый Соответствие;
ПоляОсновного.Вставить("Код", Истина);
ПоляОсновного.Вставить("Наименование", Ложь);
Основной.ИспользованиеПолей = ПоляОсновного;
ПроверитьСвойПрофильИстории(Основной, Истина, Истина, Ложь);
Копия = Новый НастройкиИсторииДанных;
Копия.Использование = Основной.Использование;
ПоляКопии = Новый Соответствие;
Для Каждого Имя Из СтрРазделить("Код,Наименование", ",") Цикл
ПоляКопии.Вставить(Имя, Основной.ИспользованиеПолей.Получить(Имя));
КонецЦикла;
Копия.ИспользованиеПолей = ПоляКопии;
ПроверитьСвойПрофильИстории(Копия, Истина, Истина, Ложь);
Копия.Использование = Ложь;
ИзмененныеПоля = Новый Соответствие;
Для Каждого Имя Из СтрРазделить("Код,Наименование", ",") Цикл
ИзмененныеПоля.Вставить(Имя, Копия.ИспользованиеПолей.Получить(Имя));
КонецЦикла;
ИзмененныеПоля.Вставить("Код", Ложь);
Копия.ИспользованиеПолей = ИзмененныеПоля;
ПроверитьСвойПрофильИстории(Копия, Ложь, Ложь, Ложь);
ПроверитьСвойПрофильИстории(Основной, Истина, Истина, Ложь);
Сообщить("Основной: история включена в профиле, Код включён, Наименование выключено");
Сообщить("Копия: история и оба правила полей выключены в профиле");
Сообщить("Профили не применены: настройки и записи истории базы не изменены");
КонецПроцедуры
Процедура ПроверитьСвойСтендПрофилей()
Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
ВызватьИсключение "Нужен свой новый стенд с единственным учебным справочником";
КонецЕсли;
Если Метаданные.Справочники[0].Имя <> "УчебныеТовары" Тогда
ВызватьИсключение "Разрешён только собственный справочник УчебныеТовары";
КонецЕсли;
Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
КонецЕсли;
Источники = Новый Массив;
Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
Для Каждого Источник Из Источники Цикл
Расширения = РасширенияКонфигурации.Получить(, Источник);
Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
ВызватьИсключение "Native список расширений должен иметь тип Массив";
КонецЕсли;
Если Расширения.Количество() <> 0 Тогда
ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
КонецЕсли;
КонецЦикла;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвоиИменаПолей()
ЕстьКод = Ложь;
ЕстьНаименование = Ложь;
Для Каждого Описание Из Метаданные.Справочники.УчебныеТовары.СтандартныеРеквизиты Цикл
Если Описание.Имя = "Код" Тогда
ЕстьКод = Истина;
ИначеЕсли Описание.Имя = "Наименование" Тогда
ЕстьНаименование = Истина;
КонецЕсли;
КонецЦикла;
Если Не ЕстьКод Или Не ЕстьНаименование Тогда
ВызватьИсключение "Имена собственного профиля должны соответствовать настоящим полям учебных метаданных";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойПрофильИстории(Профиль, История, Код, Наименование)
Если ТипЗнч(Профиль) <> Тип("НастройкиИсторииДанных") Или ТипЗнч(Профиль.Использование) <> Тип("Булево")
Или Профиль.Использование <> История Тогда
ВызватьИсключение "Не совпал общий булев признак собственного профиля истории";
КонецЕсли;
Поля = Профиль.ИспользованиеПолей;
Если ТипЗнч(Поля) <> Тип("Соответствие") Или Поля.Количество() <> 2 Тогда
ВызватьИсключение "Нужны ровно два собственных правила полей";
КонецЕсли;
Для Каждого Имя Из СтрРазделить("Код,Наименование", ",") Цикл
Факт = Поля.Получить(Имя);
Ожидание = ?(Имя = "Код", Код, Наименование);
Если ТипЗнч(Факт) <> Тип("Булево") Или Факт <> Ожидание Тогда
ВызватьИсключение "Не совпало булево правило собственного поля " + Имя;
КонецЕсли;
КонецЦикла;
КонецПроцедурыУчебныеПрофилиИстории85.Форма
Своя внешняя обработка УчебныеПрофилиИстории85 → управляемая Форма → Модуль
Полный отдельный модуль своей формы; не выполнялся.
&НаКлиенте
Процедура Выполнить(Команда)
ВыполнитьНаСервере();
Сообщить("Два собственных профиля проверены в памяти; история базы не изменена");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
УчебнаяИстория.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Новый НастройкиИсторииДанных создаёт отдельный объект параметров в памяти. Все нужные значения задаём явно: Использование=Истина и новое Соответствие с двумя булевыми правилами. Значения по умолчанию не угадываются.
Ключи ИспользованиеПолей — настоящие имена полей метаданных. Истина и Ложь здесь булевы значения, не строки. Код включён, Наименование выключено; проверка контролирует полный набор двух ключей, тип каждого значения и точный флаг.
Новый второй объект ещё не копирует первый. Создаём новое Соответствие, переносим два известных булевых значения и присваиваем его второму профилю. Обе версии сначала имеют один и тот же явно проверенный смысл.
У копии выключаем общий признак и заменяем правила ещё одним собственным Соответствие, где Код тоже выключен. Повторная полная проверка исходного профиля должна по-прежнему получить Истина/Истина/Ложь.
Общий Использование управляет использованием истории для объекта; правила полей не превращают выключенный объект в включённый. Этот урок сравнивает будущие политики, а не считывает или меняет действующую настройку базы.
Не вызываем МенеджерИсторииДанных.УстановитьНастройки, не обновляем историю и не записываем объект справочника. Создание параметров и их применение — разные операции; данный код заканчивается на проверке памяти.
Как проверить результат
Будущий результат: исходный профиль Истина/Истина/Ложь, копия Ложь/Ложь/Ложь; обе карты содержат ровно Код и Наименование. Исключений о типах, ключах или значениях нет.
Будущий отрицательный контроль: в создании ИзмененныеПоля замените только Ложь на строку "Ложь" для Код. Не меняйте проверяющий код и эталоны. Контроль точного типа должен отклонить внешне похожую строку. После опыта восстановите полный модуль.
Фактические настройки объекта и история базы не получались и не применялись. Нельзя считать сообщение об основном профиле подтверждением того, что история данных включена у справочника.
runtimeVerifiedScenarios=0. Выполнение конструктора, работа со стандартными описаниями, присваивания и независимость конкретных контейнеров в1С не проверялись; результаты выше — ожидаемые для будущего учебного запуска.
Ожидаемый результат
Полный пример подготовки и сравнения двух собственных политик на подтверждённых полях, с независимым редактированием копии и без изменения истории базы.
На что обратить внимание
Простое присваивание одного профиля другому не является универсальным копированием. Здесь создаются новые объекты и новые карты, а переносимые значения — только два известных скалярных Булево; произвольные вложенные графы не клонируются.
Ложь отличается от отсутствующего ключа: Получить вернёт Неопределено для пропуска, и строгая проверка типа не примет его за выключенное правило.
Для правила реквизита табличной части справка требует имя табличной части, не произвольную строку ТабличнаяЧасть.Поле. В этой подготовке табличных частей нет; их настройка здесь не демонстрируется.
История данных не равна журналу регистрации или истории выбора. Рабочие требования к аудиту, правам, объёму хранения и применению настроек требуют отдельного решения и проверки на копии базы.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.