На отдельных пустых плане счетов и плане характеристик проверим признак инициализации и режим обновления, затем вернём собственную известную подготовку, не трогая четыре записи основных планов.
Где и как запускать
Полный обычный клиентский общий модуль УчебныеМенеджеры85, только толстый клиент. Пульт отдельным полным модулем ниже. Не выполнялся.
Подготовка
Создайте НОВУЮ отдельную файловую базу 8.5.1.1343: имя конфигурации УчебныеМенеджерыПланов85, совместимость НеИспользовать, обычное приложение, толстый клиент. Не рабочая БП/КА2/УТ и не её копия. Нет разделителей, общих реквизитов, расширений, подписок, РИБ и фоновых прикладных заданий. Здесь база и код не запускались: runtimeVerifiedScenarios=0.
Планы счетов → УчебныеСчета85: длина кода 10, маска пустая, длина наименования 100, контроль уникальности включён. Без видов субконто, признаков учёта и предопределённых счетов. Реквизит УчебныйКлюч85: Строка(10), переменная длина, индексирование Индексировать. Формы и макет подготовьте далее, модули пустые. Второй ПустыеСчета85 — без реквизитов, форм, предопределённых счетов и записей, только для политики.
Планы видов характеристик → УчебныеСвойства85: иерархия групп и элементов включена, длина кода 10, тип кода Строка, длина наименования 100, тип характеристик только Строка(30). Реквизит УчебныйКлюч85: Строка(10), переменная длина, Индексировать, использование для групп и элементов. Без предопределённых элементов и дополнительных значений. Второй ПустыеСвойства85 — без предопределённых элементов и записей, только для политики.
Для ОБОИХ основных планов заранее вручную создайте только четыре обычные записи: G — код 01, наименование Учебный родитель, ключ G, родитель пустой; A — код 10, наименование Учебный верхний A, ключ A, родитель пустой; B — код 30, наименование Учебный дочерний B, ключ B, родитель G; C — код 20, наименование Учебный верхний C, ключ C, родитель пустой. У плана характеристик G именно группа, A/B/C элементы типа Строка(30). У плана счетов G обычный родительский счёт, не группа справочника. Записи пометкой удаления не отмечены. Эти собственные записи готовит человек; код уроков их не создаёт и не записывает.
У УчебныеСчета85 создайте обычные формы Счет85 (форма счёта), Список85 (форма списка), Выбор85 (форма выбора), назначьте основными для соответствующих назначений. Используйте стандартный мастер своих форм, модули оставьте пустыми. У УчебныеСвойства85 обычные Элемент85, Группа85, Список85, Выбор85, ВыборГруппы85 — назначьте основными для элемента, группы, списка, выбора элемента и выбора группы. Это НЕ управляемые формы.
У каждого основного плана создайте макет Шаблон85 типа Табличный документ. В R1C1 у плана счетов текст План счетов, у плана характеристик текст План характеристик. Без параметров и кода. У пустых планов макеты и формы не нужны.
Общий модуль УчебныеМенеджеры85: неглобальный, Клиент (обычное приложение)=Да, Сервер=Нет, Привилегированный=Нет, остальные клиентские флаги=Нет. Вставляйте полный основной модуль выбранного урока на верхнем уровне. Создайте обработку УчебныеМенеджеры85, обычную основную форму Пульт, кнопку Выполнить с действием ВыполнитьНажатие; полный модуль формы приведён отдельно.
Для политики войдите собственным учебным администратором. ПустыеСчета85 и ПустыеСвойства85 должны иметь НОЛЬ любых записей, ноль предопределённых определений и никогда ранее не перенастраиваться. Режим обновления в конфигурации и информационной базе исходно Авто. Нельзя подменить это подготовкой существующей базы: вычисленный getter не доказывает исходное значение сохранённого override.
F7 и обновление только собственного стенда, затем Пульт толстого клиента. Уроки поиска только читают четыре записи. Уроки форм открывают 4/6 отдельных своих окон и макет; не нажимайте Записать, завершайте окна без сохранения новых объектов, макет не печатайте и не сохраняйте.
Урок политики в будущем меняет служебный признак и режим обновления только двух пустых своих планов, затем возвращает исходный признак и заранее известное Авто. Это запись системной настройки собственного стенда, не создание предопределённых объектов, не удаление следов изменения и не беззаписный опыт. Здесь никакая запись или UI-операция не выполнялась.
Процедура ВыполнитьПример() Экспорт
ПроверитьСвойКонтекст();
Если Метаданные.ОбщиеРеквизиты.Количество() <> 0 Тогда
ВызватьИсключение "Политика требует новый неразделенный стенд";
КонецЕсли;
Менеджеры = Новый Массив;
Менеджеры.Добавить(ПланыСчетов.ПустыеСчета85);
Менеджеры.Добавить(ПланыВидовХарактеристик.ПустыеСвойства85);
Для Каждого Менеджер Из Менеджеры Цикл
Если Менеджер.Выбрать().Следующий() Тогда
ВызватьИсключение "Служебный опыт запрещён, если есть хотя бы одна запись своего пустого плана";
КонецЕсли;
НачальныйПризнак = Менеджер.ПолучитьИнициализациюПредопределенныхДанных();
Если ТипЗнч(НачальныйПризнак) <> Тип("Булево") Тогда
ВызватьИсключение "Справка не объявляет возвращаемый тип признака; без фактического Булево ничего не меняем";
КонецЕсли;
НачальныйРежим = Менеджер.ПолучитьОбновлениеПредопределенныхДанных();
Если НачальныйРежим <> ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически Тогда
ВызватьИсключение "Нужен новый самостоятельный стенд с заранее известной исходной политикой Авто";
КонецЕсли;
Попытка
Менеджер.УстановитьИнициализациюПредопределенныхДанных(Ложь);
Если Менеджер.ПолучитьИнициализациюПредопределенныхДанных() <> Ложь Тогда
ВызватьИсключение "Не подтвержден сброс признака своего пустого плана";
КонецЕсли;
Менеджер.УстановитьИнициализациюПредопределенныхДанных(Истина);
Если Менеджер.ПолучитьИнициализациюПредопределенныхДанных() <> Истина Тогда
ВызватьИсключение "Не подтверждена установка признака";
КонецЕсли;
Менеджер.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически);
Если Менеджер.ПолучитьОбновлениеПредопределенныхДанных() <> ОбновлениеПредопределенныхДанных.НеОбновлятьАвтоматически Тогда
ВызватьИсключение "Не подтвержден явный режим без автоматического обновления";
КонецЕсли;
Менеджер.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически);
Если Менеджер.ПолучитьОбновлениеПредопределенныхДанных() <> ОбновлениеПредопределенныхДанных.ОбновлятьАвтоматически Тогда
ВызватьИсключение "Не подтвержден явный режим автоматического обновления";
КонецЕсли;
Исключение
ВернутьСвоюПолитику(Менеджер, НачальныйПризнак, НачальныйРежим);
ВызватьИсключение;
КонецПопытки;
ВернутьСвоюПолитику(Менеджер, НачальныйПризнак, НачальныйРежим);
КонецЦикла;
Сообщить("У двух пустых своих планов проверены флаги и режимы; начальные признаки и известная политика Авто возвращены. Записи планов не создавались.");
КонецПроцедуры
Процедура ВернутьСвоюПолитику(Менеджер, НачальныйПризнак, НачальныйРежим)
Менеджер.УстановитьИнициализациюПредопределенныхДанных(НачальныйПризнак);
Менеджер.УстановитьОбновлениеПредопределенныхДанных(ОбновлениеПредопределенныхДанных.Авто);
Если Менеджер.ПолучитьИнициализациюПредопределенныхДанных() <> НачальныйПризнак
Или Менеджер.ПолучитьОбновлениеПредопределенныхДанных() <> НачальныйРежим Тогда
ВызватьИсключение "Возврат служебной подготовки не подтвержден; опыт не завершён";
КонецЕсли;
Если Менеджер.Выбрать().Следующий() Тогда
ВызватьИсключение "В пустом плане появились записи; это не ожидаемый результат опыта";
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСвойКонтекст()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Тогда
ВызватьИсключение "Нужен собственный стенд УчебныеМенеджерыПланов85 платформы 8.5.1.1343";
КонецЕсли;
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Учебный вывод не должен выполняться внутри чужой транзакции";
КонецЕсли;
КонецПроцедурыУчебныеМенеджеры85.Пульт
УчебныеМенеджерыПланов85 → Обработки → УчебныеМенеджеры85 → Формы → Пульт → Модуль
Полный модуль собственной обычной формы; не выполнялся.
Процедура ВыполнитьНажатие(Кнопка)
УчебныеМенеджеры85.ВыполнитьПример();
КонецПроцедурыРазбор по шагам
Свой контекст и отсутствие общих реквизитов проверяются до изменения. Реальные менеджеры ПустыеСчета85 и ПустыеСвойства85 явно указаны, основные планы с A/G/B/C в служебный опыт не передаются.
Выбрать().Следующий проверяет отсутствие вообще любых записей: это строже требования отсутствия предопределённых данных для установки Ложь. Если запись есть, никакой сброс не выполняется.
Установленная статья getter инициализации не объявляет возвращаемый тип. Получаем значение и проверяем фактическое Булево перед setter; никакой произвольный тип или строка в setter не передаётся.
Запоминаем собственный начальный признак. В Попытка устанавливаем Ложь, затем Истина и проверяем чтением; значение Истина является служебным флагом, не созданием объекта.
Getter режима обновления вычисляет эффективное значение из данных, метаданных и базы. В новом самостоятельном стенде с подготовкой Авто ожидается ОбновлятьАвтоматически, а не обязательно Авто как возвращённое значение.
Проверяем два явных режима, затем возвращаем именно заранее известную исходную настройку Авто. Не передаём вычисленный getter обратно как будто это исходный override: это изменило бы наследование.
ВернутьСвоюПолитику вызывается и после успеха, и в Исключение. Сверяем начальный флаг, исходный вычисленный режим и ноль записей; при ошибке восстановления опыт не объявляется завершённым.
Неразделённый сеанс и административные права обязательны. Область-соответствие разделителей здесь не создаётся и не передаётся; код не настраивает РИБ или разделители.
Как проверить результат
Будущий тест: F7, собственный администратор, оба вспомогательных плана полностью пусты, исходная настройка Авто известна из подготовки. Здесь setters не выполнялись: runtimeVerifiedScenarios=0.
У обоих менеджеров Ложь и Истина должны читаться после установки; затем собственный начальный признак должен совпасть с исходным снимком.
Явные НеОбновлятьАвтоматически/ОбновлятьАвтоматически должны читаться как выбранные режимы; после Авто должен вернуться исходный вычисленный режим, не обязательно буквальное Авто.
Для будущего отрицательного опыта создайте одну обычную запись в вспомогательном плане: опыт должен отказать до первого setter. Не удаляйте её автоматически, восстанавливайте стенд вручную.
Четыре записи основных планов не затрагиваются. У вспомогательных после опыта по-прежнему ноль записей; наличие служебных следов настройки не отрицается.
Неправильные права или разделённый сеанс не обходятся. После ошибки проверяйте собственный исходный признак и режим; это не универсальный откат произвольной базы.
Ожидаемый результат
Будущий опыт работает только с подготовленными собственными планами. Код, формы и служебные настройки здесь не выполнялись: runtimeVerifiedScenarios=0.
На что обратить внимание
Установка Инициализированы=Ложь требует фактического отсутствия предопределённых данных. Нельзя применять её к основному плану с неизвестным составом или РИБ ради ускорения.
Вычисленный режим не раскрывает первоначальное значение override. Авто известно только из новой не перенастроенной подготовки; совпадение getter с ОбновлятьАвтоматически само по себе не доказывает исходное Авто.
Служебные настройки сохраняются в данных. Это не readonly-урок и не удаление всех следов; рабочие базы запрещены, здесь setters фактически не вызывались.
Если восстановление тоже завершилось исключением, первоначальная ошибка может быть заменена ошибкой восстановления. Нельзя объявлять такой опыт успешно завершённым.
Автоматический режим обновления не означает, что любые пользовательские записи стали предопределёнными. Вспомогательные планы вообще не имеют предопределённых определений.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.