МенеджерОбработкиОшибок.УстановитьОбщиеНастройки

Методы · SetCommonSettings

Устанавливает общие настройки обработки ошибки. Требуется наличие у текущего пользователя права "Администрирование данных".

Синтаксис

УстановитьОбщиеНастройки(<Настройки>)
Полное описание, параметры и ограничения

МенеджерОбработкиОшибок.УстановитьОбщиеНастройки (ErrorProcessingManager.SetCommonSettings)

МенеджерОбработкиОшибок (ErrorProcessingManager)

УстановитьОбщиеНастройки (SetCommonSettings)

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

Синтаксис:
УстановитьОбщиеНастройки(<Настройки>)
Параметры:

<Настройки> (обязательный)
Тип: НастройкиОбработкиОшибок.
Устанавливаемые настройки.
Описание:

Устанавливает общие настройки обработки ошибки. Требуется наличие у текущего пользователя права "Администрирование данных".

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

Сервер, толстый клиент, мобильное приложение (сервер).

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

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

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

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

Общая пометка своего стенда, без отправки отчета

Полный свой локальный маршрут: подготовить запрет отправки, сохранить исходные реальные scalar поля, внести единственную UUID-пометку, fresh readback, отдельно явно вернуть и еще раз проверить. Без фиктивных settings-объектов, чужих пользователей, сервисов и blind rollback.

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

Полный самостоятельный модуль своей управляемой формы новой пустой файловой ИБ8.5.1.1343. Только server native settings calls; один собственный административный пользователь/сеанс; actualsettings/network/1C0.

Подготовка

  1. Имя корня этой самостоятельной новой CF: УчебныеОбщиеОшибки85.

  2. Только новая собственная VM/локальная файловая ИБ8.5.1.1343, не копия УТ/КА/УНФ/БП и не production. До запуска опыта на своей VM вручную заблокируйте исходящую сеть ОС; никакого API-сервиса, SMTP, URL или отправки отчетов не подготавливать. Здесь VM/сетевые правила не изменялись.

  3. Создайте новую пустую CF с именем из карточки, русский встроенный язык, управляемое приложение, совместимость Не использовать.0справочников/документов/регистров/планов/задач/подписок/регламентных заданий/внешних источников/общих реквизитов;0расширений базы и всех источников сеанса. Полный guard проверяет их.

  4. В Конфигураторе создайте свою роль УчебныйАдминистраторОшибок85. В правах корня конфигурации разрешите Администрирование данных и Администрирование; права запуска выбранного управляемого клиента/открытия своей обработки задайте только для этого учебного стенда. Не используйте privileged общий модуль или УстановитьПривилегированныйРежим.

  5. Конфигуратор → Администрирование → Пользователи: создайте ровно одного собственного пользователя УчебныйАдминистраторОшибок85, назначьте только свою учебную административную роль и учебный пароль. Сохраните пользователя. После его записи native UUID становится ненулевым; образец получает именно этот actual UUID, не конструирует фиктивного пользователя.

  6. Обновите только свою учебную конфигурацию БД. Запустите единственный сеанс под своим пользователем. Никаких параллельных клиентов, фоновых заданий, второго администратора или внешнего редактирования настроек во время опыта. Не вызывайте настоящие ошибки запуска/аварийные завершения.

  7. Создайте внешнюю обработку OwnErrorSettings85 с управляемой формой и единственным реквизитом Статус85 Строка0, многострочный ТолькоПросмотр. Вставьте весь выбранный самостоятельный модуль, не объединяйте три модуля. Все native getters/setters выполняются НаСервереБезКонтекста, не в thin/web-клиенте.

  8. Создайте8команд формы и кнопок с действиями: ПривязатьСвойСтенд85, ПодготовитьЛокальныйЗапрет85, СнятьИсходные85, ВнестиСвоюПометку85, ПрочитатьСостояние85, ЯвноВернутьИсходные85, ОтдельноПроверитьВозврат85, ПроверитьОтказЧужомуUUID85. Параметр Команда передается самой кнопкой.

  9. Native требует Администрирование данных у ВСЕХ трех setter, у common/startup getters; перечисление пользователей требует административных прав. Getter пользователя читает собственного пользователя, но его setter все равно требует Администрирование данных. Код проверяет реальные оба права/неprivileged/ровно1user/current UUID до операций.

  10. Сначала отдельная явно выбранная ПодготовитьЛокальныйЗапрет85. Она получает реальные settings-объекты, доказывает пустые адреса/пометки/помощь/коллекции и записывает6современных НеОтправлять флагов у common и своего user. Начальные Авто/default не являются запретом; у новой ИБ эту локальную подготовку надо выполнить вручную, а не считать defaults безопасными.

  11. Подготовка меняет только6+6send-полей; deprecated агрегирующие aliases могут отразить новое значение и только сравниваются. Остальные scalar поля и startup-область проверяются fresh readback. Подготовка НЕ атомарна, исходные Авто намеренно не восстанавливаются. Если второй setter/readback отказал, не запускайте основной опыт; вручную завершите запрет только в своем стенде при заблокированной сети.

  12. Основной исходный снимок снимается ПОСЛЕ подтвержденного запрета. Это реальные26scalar common +26scalar user +4startup поля с настоящими типами и отдельно пустые readonly коллекции шаблонов. Настройки не имеют конструктора. Снимок — собственная Структура, НЕ объект для setter; setter получает снова настоящий native getter-object.

  13. Исходные85/Ожидаемые85 — клиентские переменные только своей открытой формы. Сохраняются реальный UUID пользователя и новый UUID опыта. Не закрывайте форму до явного возврата и отдельной проверки; после потери снимка запрещен guessed rollback. Это не защищенное хранилище восстановления и не механизм production.

  14. Для startup урока исходный ТекстПомощи обязан быть обычной пустой Строкой новой CF. Native также допускает ФорматированнаяСтрока, но чужой formatted baseline здесь намеренно отвергается, не приводится к строке с потерей оформления. Ссылка помощи и сервис/get-запрос остаются пустыми.

  15. Учебное изменение осмысленно: UUID-пометка происхождения общего/пользовательского отчета при запрещенной отправке либо plain local help-text своего стенда. У user непустое ДополнительнаяИнформацияОтчета задает свое значение вместо documented наследования пустого значения из общих. Ни один отчет не создается/не отправляется.

  16. Каждая запись защищена полным сравнением56реальных scalar полей трех областей и повторным target getter, затем читается весь набор заново. Это проверка optimistic состояния, НЕ compare-and-swap/блокировка/транзакция/атомарность. Если кто-то пишет параллельно между getter/setter, гарантий нет; опыт допускает только собственный один сеанс.

  17. Actualsettings/users/files/network/1C0: здесь только авторство и статические tests/native8.5.1.1343. Резервных копий/архивов не создаем. Подтвержденный runtime протокол появится только после ВАШЕГО отдельного ручного опыта в новом локальном стенде.

&НаКлиенте
Перем СвойПользователь85;

&НаКлиенте
Перем Исходные85;

&НаКлиенте
Перем Ожидаемые85;

&НаКлиенте
Процедура ПривязатьСвойСтенд85(Команда)
    Если СвойПользователь85 <> Неопределено Или Исходные85 <> Неопределено Тогда
        ВызватьИсключение "Своя привязка уже есть; не теряйте снимок незавершенного опыта";
    КонецЕсли;
    СвойПользователь85 = ПроверитьСвоегоАдминистратора85();
    Статус85 = "Реальный UUID своего единственного администратора: " + СвойПользователь85;
КонецПроцедуры

&НаКлиенте
Процедура ПодготовитьЛокальныйЗапрет85(Команда)
    Если СвойПользователь85 = Неопределено Или Исходные85 <> Неопределено Тогда
        ВызватьИсключение "Сначала привязка; подготовка запрещена после снятия исходного снимка";
    КонецЕсли;
    Статус85 = "Подготовка запрета еще не подтверждена; автоматического rollback нет";
    ПодготовитьЗапретНаСервере85(СвойПользователь85);
    Статус85 = "Общие и собственные пользовательские send-флаги:6+6 НеОтправлять. Сервисы/ссылки пусты";
КонецПроцедуры

&НаКлиенте
Процедура СнятьИсходные85(Команда)
    Если СвойПользователь85 = Неопределено Или Исходные85 <> Неопределено Тогда
        ВызватьИсключение "Нужна привязка; имеющийся исходный снимок не перезаписывается";
    КонецЕсли;
    Исходные85 = СнятьНаСервере85(СвойПользователь85);
    Ожидаемые85 = ОжиданиеНаСервере85(СвойПользователь85, Исходные85);
    Статус85 = "Сохранены реальные scalar поля26+26+4 и свой UUID опыта: " + Исходные85.Запуск;
КонецПроцедуры

&НаКлиенте
Процедура ВнестиСвоюПометку85(Команда)
    Если Исходные85 = Неопределено Или Ожидаемые85 = Неопределено Тогда
        ВызватьИсключение "Сначала снимок; неизвестный объект настроек не принимается";
    КонецЕсли;
    Статус85 = "Запись/readback не подтверждены; исходный/ожидаемый снимки сохранены, автоматического отката нет";
    ВнестиНаСервере85(СвойПользователь85, Исходные85, Ожидаемые85);
    Статус85 = "Своя UUID-пометка подтверждена свежими getters; все остальные scalar поля неизменны";
КонецПроцедуры

&НаКлиенте
Процедура ПрочитатьСостояние85(Команда)
    Если Исходные85 = Неопределено Или Ожидаемые85 = Неопределено Тогда
        ВызватьИсключение "Нужны сохраненные собственные снимки";
    КонецЕсли;
    Статус85 = ДиагностикаНаСервере85(СвойПользователь85, Исходные85, Ожидаемые85);
КонецПроцедуры

&НаКлиенте
Процедура ЯвноВернутьИсходные85(Команда)
    Если Исходные85 = Неопределено Или Ожидаемые85 = Неопределено Тогда
        ВызватьИсключение "Без своей baseline/ожидания ничего не восстанавливаем";
    КонецЕсли;
    Статус85 = "Явный возврат/readback еще не подтверждены; никакой автоматической компенсации нет";
    ВернутьНаСервере85(СвойПользователь85, Исходные85, Ожидаемые85);
    Статус85 = "Явно возвращено только свое измененное поле; следующий шаг — отдельная повторная проверка";
КонецПроцедуры

&НаКлиенте
Процедура ОтдельноПроверитьВозврат85(Команда)
    Если Исходные85 = Неопределено Тогда
        ВызватьИсключение "Нет исходного собственного снимка";
    КонецЕсли;
    ПроверитьВозвратНаСервере85(СвойПользователь85, Исходные85);
    Статус85 = "Отдельные fresh getters подтверждают все исходные26+26+4 поля; запрет отправки сохранен";
КонецПроцедуры

&НаКлиенте
Процедура ПроверитьОтказЧужомуUUID85(Команда)
    Если Исходные85 = Неопределено Тогда
        ВызватьИсключение "Сначала исходный снимок с запретом отправки";
    КонецЕсли;
    ОтказUUID = Ложь;
    Попытка
        ПроверитьСвоегоАдминистратора85("00000000-0000-0000-0000-000000000000");
    Исключение
        ОтказUUID = Истина;
    КонецПопытки;
    Если Не ОтказUUID Тогда
        ВызватьИсключение "Нулевой неизвестный UUID должен быть отвергнут до setter";
    КонецЕсли;
    Статус85 = ДиагностикаНаСервере85(СвойПользователь85, Исходные85, Ожидаемые85)
        + "; отказ нулевому UUID подтвержден, setter не вызывался";
КонецПроцедуры

&НаСервереБезКонтекста
Функция СнятьНаСервере85(UUID)
    Возврат ЧитатьВсе85(UUID, Строка(Новый УникальныйИдентификатор));
КонецФункции

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

&НаСервереБезКонтекста
Процедура ВнестиНаСервере85(UUID, Исходные, Ожидаемые)
    ПроверитьСвоегоАдминистратора85(UUID);
    ПроверитьСнимок85(Исходные, UUID);
    ПроверитьСнимок85(Ожидаемые, UUID);
    Вычисленные = ОжиданиеНаСервере85(UUID, Исходные);
    Если Не СовпадаетВсе85(Вычисленные, Ожидаемые) Тогда
        ВызватьИсключение "Ожидание должно отличаться ровно своим полем и own UUID, не send-флагами/соседями";
    КонецЕсли;
    Текущие = ЧитатьВсе85(UUID, Исходные.Запуск);
    Если Не СовпадаетВсе85(Текущие, Исходные) Тогда
        ВызватьИсключение "Baseline устарела/опыт уже записан; ничего повторно не перезаписываем";
    КонецЕсли;
    Настройки = ОбработкаОшибок.ПолучитьОбщиеНастройки();
    До = СнимокОсновных85(Настройки);
    Если Не СовпадаютСкаляры85(До, Исходные.Общие) Тогда
        ВызватьИсключение "Повторный target getter уже не совпадает с собственной baseline";
    КонецЕсли;
    Настройки.ДополнительнаяИнформацияОтчета = Ожидаемые.Общие.ДополнительнаяИнформацияОтчета;
    ОбработкаОшибок.УстановитьОбщиеНастройки(Настройки);
    После = ЧитатьВсе85(UUID, Исходные.Запуск);
    Если Не СовпадаетВсе85(После, Ожидаемые) Тогда
        ВызватьИсключение "Setter был вызван, но полный fresh readback не подтвердился; НЕ выполняйте слепой rollback";
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Функция ДиагностикаНаСервере85(UUID, Исходные, Ожидаемые)
    ПроверитьСвоегоАдминистратора85(UUID);
    ПроверитьСнимок85(Исходные, UUID);
    ПроверитьСнимок85(Ожидаемые, UUID);
    Текущие = ЧитатьВсе85(UUID, Исходные.Запуск);
    Если СовпадаетВсе85(Текущие, Исходные) Тогда
        Возврат "Fresh read: полная собственная baseline, запрет отправки сохранен";
    ИначеЕсли СовпадаетВсе85(Текущие, Ожидаемые) Тогда
        Возврат "Fresh read: ровно свое ожидаемое изменение, запрет отправки сохранен";
    КонецЕсли;
    Возврат "Fresh read: ни baseline, ни own ожидаемое состояние. Ничего не писать; сохранить форму и вручную разобрать свой стенд";
КонецФункции

&НаСервереБезКонтекста
Процедура ВернутьНаСервере85(UUID, Исходные, Ожидаемые)
    ПроверитьСвоегоАдминистратора85(UUID);
    ПроверитьСнимок85(Исходные, UUID);
    ПроверитьСнимок85(Ожидаемые, UUID);
    Вычисленные = ОжиданиеНаСервере85(UUID, Исходные);
    Если Не СовпадаетВсе85(Вычисленные, Ожидаемые) Тогда
        ВызватьИсключение "Чужое ожидание нельзя использовать для восстановления";
    КонецЕсли;
    Текущие = ЧитатьВсе85(UUID, Исходные.Запуск);
    Если Не СовпадаетВсе85(Текущие, Ожидаемые) Тогда
        ВызватьИсключение "Восстановление разрешено только из доказанного своего измененного состояния; baseline/unknown не перезаписываем";
    КонецЕсли;
    Настройки = ОбработкаОшибок.ПолучитьОбщиеНастройки();
    До = СнимокОсновных85(Настройки);
    Если Не СовпадаютСкаляры85(До, Ожидаемые.Общие) Тогда
        ВызватьИсключение "Повторный target getter не совпадает с own измененным состоянием";
    КонецЕсли;
    Настройки.ДополнительнаяИнформацияОтчета = Исходные.Общие.ДополнительнаяИнформацияОтчета;
    ОбработкаОшибок.УстановитьОбщиеНастройки(Настройки);
    После = ЧитатьВсе85(UUID, Исходные.Запуск);
    Если Не СовпадаетВсе85(После, Исходные) Тогда
        ВызватьИсключение "Явный setter вызван, но fresh возврат не подтвержден; дальше только read-only диагностика";
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьВозвратНаСервере85(UUID, Исходные)
    ПроверитьСвоегоАдминистратора85(UUID);
    ПроверитьСнимок85(Исходные, UUID);
    ЕщеРаз = ЧитатьВсе85(UUID, Исходные.Запуск);
    Если Не СовпадаетВсе85(ЕщеРаз, Исходные) Тогда
        ВызватьИсключение "Отдельная повторная проверка возврата не совпала с исходными scalar полями";
    КонецЕсли;
КонецПроцедуры

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

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

&НаСервереБезКонтекста
Функция СнимокЗапуска85(Настройки)
    Если ТипЗнч(Настройки) <> Тип("НастройкиОбработкиОшибокПриЗапуске") Тогда
        ВызватьИсключение "Нужны реальные настройки из native startup getter";
    КонецЕсли;
    Скаляр = Новый Структура;
    Скаляр.Вставить("АдресСервисаОбработкиОшибокПриЗапуске", Настройки.АдресСервисаОбработкиОшибокПриЗапуске);
    Скаляр.Вставить("ДополнительнаяИнформацияЗапроса", Настройки.ДополнительнаяИнформацияЗапроса);
    Скаляр.Вставить("НавигационнаяСсылкаПомощи", Настройки.НавигационнаяСсылкаПомощи);
    Скаляр.Вставить("ТекстПомощи", Настройки.ТекстПомощи);
    ПроверитьScalar85(Скаляр, Истина);
    Возврат Скаляр;
КонецФункции

&НаСервереБезКонтекста
Процедура ПроверитьScalar85(Скаляр, ПриЗапуске)
    Если ТипЗнч(Скаляр) <> Тип("Структура") Тогда
        ВызватьИсключение "Нужен собственный scalar снимок, не native settings-object";
    КонецЕсли;
    Если ПриЗапуске Тогда
        Поля = СтрРазделить("АдресСервисаОбработкиОшибокПриЗапуске,ДополнительнаяИнформацияЗапроса,НавигационнаяСсылкаПомощи,ТекстПомощи", ",");
    Иначе
        Поля = СтрРазделить("АдресСервисаОбработкиОшибок,ВариантОтображенияСообщения,ВключатьИмяПользователяВОтчет,ВключатьИмяПользователяВОтчетНаКлиенте,ВключатьИмяПользователяВОтчетНаСервере,ВключатьИнформациюОСистемеВОтчет,ВключатьИнформациюОСистемеВОтчетНаКлиенте,ВключатьПодробныйТекстОшибкиВОтчет,ВключатьПодробныйТекстОшибкиВОтчетНаКлиенте,ВключатьПодробныйТекстОшибкиВОтчетНаСервере,ВключатьСведенияОбИнформационнойБазеВОтчет,ВключатьСведенияОбИнформационнойБазеВОтчетНаКлиенте,ВключатьСведенияОбИнформационнойБазеВОтчетНаСервере,ВключатьСнимокОконВОтчет,ВключатьСнимокОконВОтчетНаКлиенте,ДополнительнаяИнформацияОтчета,ОтправлятьОтчет,ОтправлятьОтчетНаКлиенте,ОтправлятьОтчетНаСервере,ОтправлятьОтчетОбАварийномЗавершении,ОтправлятьОтчетОбАварийномЗавершенииВСервисРегистрацииОшибокПлатформы,ОтправлятьОтчетОбАварийномЗавершенииНаКлиенте,ОтправлятьОтчетОбАварийномЗавершенииНаКлиентеВСервисРегистрацииОшибокПлатформы,ОтправлятьОтчетОбАварийномЗавершенииНаСервере,ОтправлятьОтчетОбАварийномЗавершенииНаСервереВСервисРегистрацииОшибокПлатформы,ОтправлятьОчет", ",");
    КонецЕсли;
    Если Скаляр.Количество() <> Поля.Количество() Тогда
        ВызватьИсключение "Должны сохраниться все native scalar поля4 либо26";
    КонецЕсли;
    Для Каждого Имя Из Поля Цикл
        Если Не Скаляр.Свойство(Имя, Значение) Тогда
            ВызватьИсключение "Нет собственного исходного поля " + Имя;
        КонецЕсли;
        Если ПриЗапуске Или Имя = "АдресСервисаОбработкиОшибок" Или Имя = "ДополнительнаяИнформацияОтчета" Тогда
            ТипПоля = Тип("Строка");
        ИначеЕсли Имя = "ВариантОтображенияСообщения" Тогда
            ТипПоля = Тип("ВариантОтображенияСообщенияОбОшибке");
        Иначе
            ТипПоля = Тип("РежимОтправкиИнформацииОбОшибке");
        КонецЕсли;
        Если ТипЗнч(Значение) <> ТипПоля Тогда
            ВызватьИсключение "Чужой тип поля " + Имя + "; own startup fixture допускает только plain string";
        КонецЕсли;
    КонецЦикла;
    Если ПриЗапуске Тогда
        Если Не ПустаяСтрока(Скаляр.АдресСервисаОбработкиОшибокПриЗапуске)
            Или Не ПустаяСтрока(Скаляр.НавигационнаяСсылкаПомощи)
            Или Не ПустаяСтрока(Скаляр.ДополнительнаяИнформацияЗапроса) Тогда
            ВызватьИсключение "URL/сервис/запросы не входят в свой локальный опыт";
        КонецЕсли;
    ИначеЕсли Не ПустаяСтрока(Скаляр.АдресСервисаОбработкиОшибок) Тогда
        ВызватьИсключение "Не принимаем чужой адрес сервиса даже при запрете send";
    КонецЕсли;
КонецПроцедуры

&НаСервереБезКонтекста
Процедура ПроверитьЗапрет85(Скаляр)
    ПроверитьScalar85(Скаляр, Ложь);
    Поля = СтрРазделить("ОтправлятьОтчетНаКлиенте,ОтправлятьОтчетНаСервере,ОтправлятьОтчетОбАварийномЗавершенииНаКлиенте,ОтправлятьОтчетОбАварийномЗавершенииНаСервере,ОтправлятьОтчетОбАварийномЗавершенииНаКлиентеВСервисРегистрацииОшибокПлатформы,ОтправлятьОтчетОбАварийномЗавершенииНаСервереВСервисРегистрацииОшибокПлатформы", ",");
    Для Каждого Имя Из Поля Цикл
        Если Скаляр[Имя] <> РежимОтправкиИнформацииОбОшибке.НеОтправлять Тогда
            ВызватьИсключение "Нужно6современных явных запретов, Авто не является запретом";
        КонецЕсли;
    КонецЦикла;
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция ЧитатьВсе85(UUID, Запуск)
    ПроверитьСвоегоАдминистратора85(UUID);
    ПроверитьUUID85(Запуск);
    Общие = СнимокОсновных85(ОбработкаОшибок.ПолучитьОбщиеНастройки());
    Пользовательские = СнимокОсновных85(ОбработкаОшибок.ПолучитьНастройкиПользователя("УчебныйАдминистраторОшибок85"));
    ЗапускПриложения = СнимокЗапуска85(ОбработкаОшибок.ПолучитьНастройкиОбработкиОшибокПриЗапуске());
    Снимок = Новый Структура("Пользователь,Запуск,Общие,Пользовательские,ЗапускПриложения", UUID, Запуск,
        Общие, Пользовательские, ЗапускПриложения);
    ПроверитьСнимок85(Снимок, UUID);
    Возврат Снимок;
КонецФункции

&НаСервереБезКонтекста
Функция СовпадаютСкаляры85(Факт, Ожидание)
    Если Факт.Количество() <> Ожидание.Количество() Тогда
        Возврат Ложь;
    КонецЕсли;
    Для Каждого Поле Из Ожидание Цикл
        Если Не Факт.Свойство(Поле.Ключ, Значение) Тогда
            Возврат Ложь;
        КонецЕсли;
        Если ТипЗнч(Значение) <> ТипЗнч(Поле.Значение) Или Значение <> Поле.Значение Тогда
            Возврат Ложь;
        КонецЕсли;
    КонецЦикла;
    Возврат Истина;
КонецФункции

&НаСервереБезКонтекста
Функция СовпадаетВсе85(Факт, Ожидание)
    Возврат Факт.Пользователь = Ожидание.Пользователь И Факт.Запуск = Ожидание.Запуск
        И СовпадаютСкаляры85(Факт.Общие, Ожидание.Общие)
        И СовпадаютСкаляры85(Факт.Пользовательские, Ожидание.Пользовательские)
        И СовпадаютСкаляры85(Факт.ЗапускПриложения, Ожидание.ЗапускПриложения);
КонецФункции

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

&НаСервереБезКонтекста
Процедура ПроверитьUUID85(UUID)
    Если ТипЗнч(UUID) <> Тип("Строка") Тогда
        ВызватьИсключение "Своя UUID-привязка должна быть строкой";
    КонецЕсли;
    Если Строка(Новый УникальныйИдентификатор(UUID)) <> UUID
        Или UUID = "00000000-0000-0000-0000-000000000000" Тогда
        ВызватьИсключение "Нужен canonical ненулевой UUID своего сохраненного объекта/опыта";
    КонецЕсли;
КонецПроцедуры

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

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

  1. ПривязатьСвойСтенд85: guardпустойCF/версия/права/ровно1user, read actual UUID собственного текущего сохраненного администратора. Повторную привязку при имеющейся baseline нельзя выполнять.

  2. ПодготовитьЛокальныйЗапрет85: явно подготовить6+6modern НеОтправлять у common/user и подтвердить freshread, нулевые URLs/шаблоны/startup request. DefaultsАвто не маскируются безопасным состоянием; вернуть Авто команд нет.

  3. СнятьИсходные85: создать новый собственный UUID опыта и сохранить сразу реальные scalar26+26+4. Они остаются в открытой форме вместе с вычисленным own ожиданием; ни один объект настроек не заменяется genericСтруктура.

  4. ВнестиСвоюПометку85: проверить baseline целиком и повторный native target getter ОбработкаОшибок.ПолучитьОбщиеНастройки(); изменить только Общие.ДополнительнаяИнформацияОтчета на строку с OwnErrorSettings85:common:<actual ownUUID>. Setter: ОбработкаОшибок.УстановитьОбщиеНастройки(Настройки).

  5. Full fresh getters после setter обязаны дать собственное ожидание во всех3областях. Если write/readback не подтвердился, исходный/ожидаемый снимок остаются в форме, автоrollback/retry отсутствуют.

  6. ПрочитатьСостояние85: read-only классификация baseline/ownexpected/unknown. Unknown состояние не объявляется успешным и не восстанавливается поверх других изменений.

  7. Повторная ВнестиСвоюПометку85 при уже измененном состоянии должна отказать ДОsetter. После этого ПрочитатьСостояние85 должно по-прежнему показать ownexpected; ошибки запуска/отправка отчетов не моделируются.

  8. ПроверитьОтказЧужомуUUID85: собственный нулевой UUID намеренно отвергается guardдоsetter; затем fresh диагностика подтверждает фактическое прежнее состояние. Чужой user-object или рабочая ИБ для отрицательного теста не нужны.

  9. ЯвноВернутьИсходные85 — отдельное ваше действие. Разрешено только если весь current набор точно ownexpected; меняет только свое поле обратно и делает fresh полный readback. Уже baseline/unknown отвергаются без writes.

  10. ОтдельноПроверитьВозврат85 — следующая отдельная команда с новым native чтением. Должны совпасть все56scalar поля с baseline; обе readonly коллекции пусты,12modern send-флагов остаютсяНеОтправлять.

  11. После отдельной проверки можно закрыть свою форму. Вне этого процесса потеря формы/снимка не дает права угадывать исходные значения или откатывать по умолчанию.

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

  1. Actual getter-objects имеют native тип; snapshot включает каждое scalar поле правильного типа, startup plainString сохраняется без потери formatting.

  2. 6modern send-полей common и6user остаются explicitНеОтправлять до/после каждой основной записи/возврата; service/helpURLs/startup request пусты.

  3. Неизменными остались56scalar minus1modified и обе пустые readonly коллекции; при явном возврате совпадают все56original поля, свежий отдельный read подтверждает это.

  4. Нулевой/не тот UUID,2user,неadmin,невернаяCF/версия,foreignurls,nonemptytemplates,повторныйwrite,unknownstate отвергаются до изменения.

  5. Снимки сохраняются при ошибке вызова/readback; никаких promises атомарности, auto rollback, восстановления defaults или отправки отчетов.

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

Ожидаемый ручной результат: baseline56 → ровно1own UUID field → явный возврат baseline56 → отдельное fresh подтверждение. Запрет отправки сохранен. Runtime здесь не запускался.

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

  1. НастройкиОбработкиОшибок/ПриЗапуске не имеют constructor; Структура снимка не подходит setter. Единственный настоящий объект для записи всегда получен соответствующим native getter.

  2. Deprecated агрегаты читаются для полного контроля, но не присваиваются. При основной marker-записи/возврате даже эти aliases обязаны совпасть с baseline/expectation; preparation может изменить только их отражение send-флагов.

  3. User setter требует Администрирование данных даже для себя. Общая адресная/другая настройка не является автоматически пользовательской: фиксируется точное ownимя, UUID и три разные области.

  4. Проверки до/после не делают sequence атомарным. Нет параллельной работы, privileged обхода, транзакционной гарантии или слепой компенсации. При unknown состоянии остановите записи и разберите только собственный стенд.

  5. URL/SMTP/отчеты/реальный сбой запуска/аварийное завершение не входят в опыт. Help-text проверяется getterreadback, это не доказательство показа ошибки запуска или доставки помощи.

  6. Подготовка запрета — самостоятельное явное изменение своего стенда, не restoration source defaults. Основной снимок снимается только после нее; запрет отправки никогда не снимается.

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

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

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

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

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