Сравнить два профиля истории данных и изменить копию без применения к базе

Учебные задачи

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

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

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

Подготовка

  1. НОВАЯ отдельная учебная база точно 8.5.1.1343, конфигурация УчебныеПрофилиИстории85, совместимость Не использовать. Единственный справочник УчебныеТовары: неиерархический, без владельцев, собственных реквизитов и табличных частей; стандартный Код строка9 и Наименование строка50. Не создавать записи справочника. Других бизнес-объектов, расширений, подписок и фоновых заданий нет.

  2. Создайте общий модуль УчебнаяИстория: Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставьте полный основной модуль. В своей внешней обработке УчебныеПрофилиИстории85 создайте управляемую форму, команду/кнопку Выполнить с действием Выполнить и вставьте полный отдельный модуль формы ниже.

  3. Будущая ручная подготовка: сохранить конфигурацию, Конфигурация → Обновить конфигурацию базы данных (F7), открыть новый свой сеанс и собственную обработку. Здесь конфигурация, справочник, F7 и BSL не создавались и не запускались.

  4. Код проверяет конфигурацию, единственный справочник и наличие именно стандартных полей Код/Наименование обходом ОписанияСтандартныхРеквизитов. У этой коллекции нет метода Найти: не заменяйте цикл вымышленным вызовом. Имена профиля не взяты из неизвестного рабочего объекта.

Процедура ВыполнитьПример() Экспорт
    ПроверитьСвойСтендПрофилей();
    ПроверитьСвоиИменаПолей();
    Основной = Новый НастройкиИсторииДанных;
    Основной.Использование = Истина;
    ПоляОсновного = Новый Соответствие;
    ПоляОсновного.Вставить("Код", Истина);
    ПоляОсновного.Вставить("Наименование", Ложь);
    Основной.ИспользованиеПолей = ПоляОсновного;
    ПроверитьСвойПрофильИстории(Основной, Истина, Истина, Ложь);
    Копия = Новый НастройкиИсторииДанных;
    Копия.Использование = Основной.Использование;
    ПоляКопии = Новый Соответствие;
    Для Каждого Имя Из СтрРазделить("Код,Наименование", ",") Цикл
        ПоляКопии.Вставить(Имя, Основной.ИспользованиеПолей.Получить(Имя));
    КонецЦикла;
    Копия.ИспользованиеПолей = ПоляКопии;
    ПроверитьСвойПрофильИстории(Копия, Истина, Истина, Ложь);
    Копия.Использование = Ложь;
    ИзмененныеПоля = Новый Соответствие;
    Для Каждого Имя Из СтрРазделить("Код,Наименование", ",") Цикл
        ИзмененныеПоля.Вставить(Имя, Копия.ИспользованиеПолей.Получить(Имя));
    КонецЦикла;
    ИзмененныеПоля.Вставить("Код", Ложь);
    Копия.ИспользованиеПолей = ИзмененныеПоля;
    ПроверитьСвойПрофильИстории(Копия, Ложь, Ложь, Ложь);
    ПроверитьСвойПрофильИстории(Основной, Истина, Истина, Ложь);
    Сообщить("Основной: история включена в профиле, Код включён, Наименование выключено");
    Сообщить("Копия: история и оба правила полей выключены в профиле");
    Сообщить("Профили не применены: настройки и записи истории базы не изменены");
КонецПроцедуры

Процедура ПроверитьСвойСтендПрофилей()
    Если Метаданные.Справочники.Количество() <> 1 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен свой новый стенд с единственным учебным справочником";
    КонецЕсли;
    Если Метаданные.Справочники[0].Имя <> "УчебныеТовары" Тогда
        ВызватьИсключение "Разрешён только собственный справочник УчебныеТовары";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры

Процедура ПроверитьСвоиИменаПолей()
    ЕстьКод = Ложь;
    ЕстьНаименование = Ложь;
    Для Каждого Описание Из Метаданные.Справочники.УчебныеТовары.СтандартныеРеквизиты Цикл
        Если Описание.Имя = "Код" Тогда
            ЕстьКод = Истина;
        ИначеЕсли Описание.Имя = "Наименование" Тогда
            ЕстьНаименование = Истина;
        КонецЕсли;
    КонецЦикла;
    Если Не ЕстьКод Или Не ЕстьНаименование Тогда
        ВызватьИсключение "Имена собственного профиля должны соответствовать настоящим полям учебных метаданных";
    КонецЕсли;
КонецПроцедуры

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

Своя внешняя обработка УчебныеПрофилиИстории85 → управляемая Форма → Модуль

Полный отдельный модуль своей формы; не выполнялся.

&НаКлиенте
Процедура Выполнить(Команда)
    ВыполнитьНаСервере();
    Сообщить("Два собственных профиля проверены в памяти; история базы не изменена");
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ВыполнитьНаСервере()
    УчебнаяИстория.ВыполнитьПример();
КонецПроцедуры

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

  1. Новый НастройкиИсторииДанных создаёт отдельный объект параметров в памяти. Все нужные значения задаём явно: Использование=Истина и новое Соответствие с двумя булевыми правилами. Значения по умолчанию не угадываются.

  2. Ключи ИспользованиеПолей — настоящие имена полей метаданных. Истина и Ложь здесь булевы значения, не строки. Код включён, Наименование выключено; проверка контролирует полный набор двух ключей, тип каждого значения и точный флаг.

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

  4. У копии выключаем общий признак и заменяем правила ещё одним собственным Соответствие, где Код тоже выключен. Повторная полная проверка исходного профиля должна по-прежнему получить Истина/Истина/Ложь.

  5. Общий Использование управляет использованием истории для объекта; правила полей не превращают выключенный объект в включённый. Этот урок сравнивает будущие политики, а не считывает или меняет действующую настройку базы.

  6. Не вызываем МенеджерИсторииДанных.УстановитьНастройки, не обновляем историю и не записываем объект справочника. Создание параметров и их применение — разные операции; данный код заканчивается на проверке памяти.

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

  1. Будущий результат: исходный профиль Истина/Истина/Ложь, копия Ложь/Ложь/Ложь; обе карты содержат ровно Код и Наименование. Исключений о типах, ключах или значениях нет.

  2. Будущий отрицательный контроль: в создании ИзмененныеПоля замените только Ложь на строку "Ложь" для Код. Не меняйте проверяющий код и эталоны. Контроль точного типа должен отклонить внешне похожую строку. После опыта восстановите полный модуль.

  3. Фактические настройки объекта и история базы не получались и не применялись. Нельзя считать сообщение об основном профиле подтверждением того, что история данных включена у справочника.

  4. runtimeVerifiedScenarios=0. Выполнение конструктора, работа со стандартными описаниями, присваивания и независимость конкретных контейнеров в1С не проверялись; результаты выше — ожидаемые для будущего учебного запуска.

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

Полный пример подготовки и сравнения двух собственных политик на подтверждённых полях, с независимым редактированием копии и без изменения истории базы.

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

  1. Простое присваивание одного профиля другому не является универсальным копированием. Здесь создаются новые объекты и новые карты, а переносимые значения — только два известных скалярных Булево; произвольные вложенные графы не клонируются.

  2. Ложь отличается от отсутствующего ключа: Получить вернёт Неопределено для пропуска, и строгая проверка типа не примет его за выключенное правило.

  3. Для правила реквизита табличной части справка требует имя табличной части, не произвольную строку ТабличнаяЧасть.Поле. В этой подготовке табличных частей нет; их настройка здесь не демонстрируется.

  4. История данных не равна журналу регистрации или истории выбора. Рабочие требования к аудиту, правам, объёму хранения и применению настроек требуют отдельного решения и проверки на копии базы.

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

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

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

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

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