Разберите отличие информации об ошибке, категории и шаблона сообщения. На своем новом пользователе отдельно согласуйте каждый шаг 0 → 2 → 1 → 0, а счет 2 × 250 = 500 и все остальные свойства профиля проверяйте до и после.
Где и как запускать
Windows 8.5.1.1343; свой отдельный File CF, единственный пользователь, толстый клиент обычного приложения. MAIN обычной общей формы, настоящие кнопочные события1. Common только клиент обычного приложения; opaque настройки/Info через RPC не передаются.
Подготовка
Это будущий ручной опыт в своей новой базе, а не выполненные здесь изменения. Windows 8.5.1.1343, толстый клиент, обычное приложение. Создайте только собственную File-базу C:\1c-labs\OwnErrorMessages4_b705873a-f6e7-4400-b4ca-b19ee7b13a89\IB, один пользователь и один сеанс. Не берите рабочую базу, чужой профиль, расширения или фоновые задания.
Конфигурация УчебныеСообщенияОшибок85: ОсновнойРежимЗапуска=ОбычноеПриложение, совместимость НеИспользовать, язык Русский. Только одна общая форма СообщенияСчета85, общий модуль УчебныеСообщенияОшибокКлиент85 и роль УчебнаяПолная85; документы, справочники, регистры, константы, обработки и отчеты не нужны.
Для видимости клиентского флага откройте Конфигуратор → Сервис → Параметры → Общие → Редактирование конфигурации для режима запуска → Управляемое приложение и обычное приложение. Это настройка редактора, не свойство SupportedRunModes. ОсновнойРежимЗапуска конфигурации отдельно остается ОбычноеПриложение.
Создайте единственного собственного пользователя УченикСообщений85 с собственной полной ролью УчебнаяПолная85, включая Администрирование и Администрирование данных. Первый нужен для ПолучитьПользователей, второй — для чтения общих настроек и установки пользовательских. Имя роли само по себе не доказывает ее права; задайте их вручную только в этой новой базе. Не храните пароль в коде.
Общие → Общие модули → УчебныеСообщенияОшибокКлиент85: Клиент (обычное приложение)=Да; Клиент (управляемое приложение), Сервер, Вызов сервера, Внешнее соединение, Глобальный, Привилегированный=Нет; повторное использование возвращаемых значений НеИспользовать. Вставьте COMMON целиком. Не переносите его в объектный модуль или серверный RPC.
Общие → Общие формы → СообщенияСчета85: обычная форма. Создайте реквизиты Количество85 и ЧислоШаблонов85 (Число 3.0), Цена85 и Сумма85 (Число 9.2), Состояние85 (Строка неограниченной длины), Наблюдение85 (Строка неограниченной длины). Разместите одноименные поля ввода с Данные=одноименный реквизит и ТолькоПросмотр=Истина. Поля состояния и наблюдения сделайте многострочными; пользователь не редактирует исходные числа.
В этой же форме создайте четыре настоящие кнопки Проверить85, Установить85, Удалить85, Очистить85. Заголовки: Проверить без записи; Согласен установить два текста; Согласен удалить текст счета; Согласен очистить остаток. Для каждой задайте действие Нажатие=одноименная процедура из FORM, с одним первым параметром Элемент. ПриОткрытии свяжите с ПриОткрытии() без параметров. Вставьте FORM целиком в модуль этой формы.
В модуль обычного приложения вставьте APPLICATION целиком и обновите только эту собственную CF. Запустите под своим пользователем: настоящее ПриНачалеРаботыСистемы() получает обычную форму через ПолучитьОбщуюФорму и открывает ее. События и кнопочные обработчики руками не вызывайте.
На старте пользовательская и общая коллекции текстов должны быть пустыми. Если есть ранее существующие шаблоны, урок откажет до изменений: не очищайте их ради запуска. Полные 27 свойств обоих профилей фиксируются отдельно; все 26 строковых/перечислимых значений только читаются. Устаревшие имена используются только для полного снимка, не как рекомендуемые новые настройки.
В памяти создается счет 2 × 250 = 500. Собственный контроль количества 0 вызывает пойманное исключение; ИнформацияОбОшибке берется непосредственно внутри Catch. Категория реально получена менеджером и проверена как ИсключениеВызванноеИзВстроенногоЯзыка. НеправильныйПароль означает ошибку при открытии PDF, а не пароль пользователя: PDF и аутентификация здесь не вызываются.
Прочитайте фактический результат в Наблюдение85. Кнопка Проверить без записи повторно сравнивает полный профиль и счет. Она не устанавливает настройки. Не согласны на будущие изменения своей настройки — не нажимайте остальные три кнопки.
Нажмите Согласен установить два текста один раз: это отдельное согласие изменять полученную коллекцию и сохранять профиль только своего пользователя. Создаются два native шаблона, каждый с двумя обязательными текстами; вставляются собственная категория и отличающаяся PDF-категория. После одного setter выполняется новое чтение менеджера: 2 шаблона и все прежние 26 свойств.
Затем отдельно нажмите Согласен удалить текст счета. Сначала снова проверяется полный профиль с двумя собственными шаблонами. Удаляется только фактическая категория собственного исключения; новое чтение должно дать 1 оставшийся PDF-шаблон. Сообщение для нашей той же ошибки только наблюдается; приоритет, fallback и конкретный локализованный текст не обещаются.
Только после этого отдельно нажмите Согласен очистить остаток. До Очистить проверяется единственный собственный PDF-шаблон, оба его текста и все другие свойства. Новое чтение должно дать пустую коллекцию и структурное равенство начальным 27 свойствам. Счет снова равен 500; это не транзакционный откат или восстановление всей базы.
Getter настроек не объявлен копией: согласие охватывает и изменения его дочерней коллекции. Исходные снимки состоят из фиксированных структур/массивов и отдельных значений, а не ссылок на изменяемые native настройки. Каждый результат проверяется новым getter менеджера, не только старой переменной.
При ошибке, повторе неподходящего шага, чужом профиле или измененном снимке остается STOP. Setter мог частично выполниться; автоматического повтора, удаления, очистки и отката нет. Закрытие формы не восстанавливает настройки. Не продолжайте с другой кнопкой; сначала разберите собственный фактический профиль вручную.
СообщениеОбОшибкеДляПользователя возвращает реальную ФорматированнаяСтрока. Строка в поле — только наблюдение, не сравнение форматирования или доказательство выбора шаблона. Обе ветви текста сохранены, но реальный перезапуск намеренно не вызывается. Нет ПоказатьИнформациюОбОшибке, отправки отчетов, установки общих настроек или изменения адресов/флагов отправки.
Здесь выполнено только авторство кода и статическая сверка API. 1С, CF, GUI, пользовательские настройки и сеть не запускались. Доставка событий, применение профиля и отображение сообщений требуют ваших ручных контрольных проверок в собственной учебной базе.
Перем Остановка85, Готово85, Этап85, Пользователь85, Счет85, Ошибка85, Категория85;
Перем ИсходныеПользовательские85, ИсходныеОбщие85, ОжидаемыеТексты85, ПоследнееНаблюдение85;
Процедура ПриОткрытии()
Если Остановка85 <> Неопределено Или Готово85 <> Неопределено Тогда
Возврат;
КонецЕсли;
Остановка85 = Истина;
Готово85 = Ложь;
Попытка
Пользователь85 = УчебныеСообщенияОшибокКлиент85.ПроверитьСтенд85();
Количество85 = 2;
Цена85 = 250;
Сумма85 = Количество85 * Цена85;
Счет85 = Новый ФиксированнаяСтруктура("Количество,Цена,Сумма", Количество85, Цена85, Сумма85);
ПроверитьСчет85();
Настройки = ОбработкаОшибок.ПолучитьНастройкиПользователя(Пользователь85.Имя);
ИсходныеПользовательские85 = УчебныеСообщенияОшибокКлиент85.СнимокНастроек85(Настройки);
ИсходныеОбщие85 = УчебныеСообщенияОшибокКлиент85.СнимокНастроек85(ОбработкаОшибок.ПолучитьОбщиеНастройки());
Если ИсходныеПользовательские85.Шаблоны.Количество() <> 0 Или ИсходныеОбщие85.Шаблоны.Количество() <> 0 Тогда
ВызватьИсключение "Начальные коллекции пользователя и общего профиля должны быть пустыми";
КонецЕсли;
Ошибка85 = УчебныеСообщенияОшибокКлиент85.ПолучитьСвоюОшибку85();
Категория85 = ОбработкаОшибок.КатегорияОшибкиДляПользователя(Ошибка85);
Если ТипЗнч(Категория85) <> Тип("КатегорияОшибки")
Или Категория85 <> КатегорияОшибки.ИсключениеВызванноеИзВстроенногоЯзыка
Или Категория85 = КатегорияОшибки.НеправильныйПароль
Или Не Ошибка85.ЯвляетсяОшибкойКатегории(Категория85, Ложь)
Или Ошибка85.ЯвляетсяОшибкойКатегории(КатегорияОшибки.НеправильныйПароль, Ложь) Тогда
ВызватьИсключение "Получена не собственная категория контроля количества";
КонецЕсли;
ОжидаемыеТексты85 = Новый ФиксированныйМассив(Новый Массив);
Этап85 = 0;
Готово85 = Истина;
Остановка85 = Ложь;
ПроверитьПрофиль85(0);
Наблюдать85();
Состояние85 = "Проверено 2 × 250 = 500. Настройки пока не изменялись; шаблонов 0.";
Исключение
Остановить85(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура ПроверитьСчет85()
Если ТипЗнч(Счет85) <> Тип("ФиксированнаяСтруктура") Или Счет85.Количество() <> 3
Или ТипЗнч(Количество85) <> Тип("Число") Или Количество85 <> 2
Или ТипЗнч(Цена85) <> Тип("Число") Или Цена85 <> 250
Или ТипЗнч(Сумма85) <> Тип("Число") Или Сумма85 <> Количество85 * Цена85 Или Сумма85 <> 500
Или Счет85.Количество <> Количество85 Или Счет85.Цена <> Цена85 Или Счет85.Сумма <> Сумма85 Тогда
ВызватьИсключение "Изменен собственный исходный счет 2 × 250 = 500";
КонецЕсли;
УчебныеСообщенияОшибокКлиент85.ПроверитьКоличество85(Количество85);
КонецПроцедуры
Функция ПроверитьПрофиль85(НужныйЭтап)
Если Остановка85 <> Ложь Или Готово85 <> Истина Или Этап85 <> НужныйЭтап Тогда
ВызватьИсключение "Неверный этап или процесс уже остановлен";
КонецЕсли;
ТекущийПользователь = УчебныеСообщенияОшибокКлиент85.ПроверитьСтенд85();
Если ТекущийПользователь.Имя <> Пользователь85.Имя Или ТекущийПользователь.Идентификатор <> Пользователь85.Идентификатор Тогда
ВызватьИсключение "Изменился собственный пользователь";
КонецЕсли;
ПроверитьСчет85();
Настройки = ОбработкаОшибок.ПолучитьНастройкиПользователя(Пользователь85.Имя);
Фактические = УчебныеСообщенияОшибокКлиент85.СнимокНастроек85(Настройки);
УчебныеСообщенияОшибокКлиент85.ПроверитьСкаляры85(Фактические, ИсходныеПользовательские85);
УчебныеСообщенияОшибокКлиент85.ПроверитьТексты85(Фактические.Шаблоны, ОжидаемыеТексты85);
Общие = УчебныеСообщенияОшибокКлиент85.СнимокНастроек85(ОбработкаОшибок.ПолучитьОбщиеНастройки());
УчебныеСообщенияОшибокКлиент85.ПроверитьСкаляры85(Общие, ИсходныеОбщие85);
УчебныеСообщенияОшибокКлиент85.ПроверитьТексты85(Общие.Шаблоны, ИсходныеОбщие85.Шаблоны);
Возврат Настройки;
КонецФункции
Процедура Наблюдать85()
ПоследнееНаблюдение85 = ОбработкаОшибок.СообщениеОбОшибкеДляПользователя(Ошибка85);
Если ТипЗнч(ПоследнееНаблюдение85) <> Тип("ФорматированнаяСтрока") Тогда
ВызватьИсключение "Ожидался фактический форматированный текст сообщения";
КонецЕсли;
Наблюдение85 = Строка(ПоследнееНаблюдение85);
ПроверитьСчет85();
ЧислоШаблонов85 = ОжидаемыеТексты85.Количество();
КонецПроцедуры
Процедура Проверить85(Элемент)
Попытка
Если Элемент <> ЭлементыФормы.Проверить85 Тогда
ВызватьИсключение "Нужна собственная кнопка проверки";
КонецЕсли;
ПроверитьПрофиль85(Этап85);
Наблюдать85();
Состояние85 = "Полный профиль снова проверен без записи; исходный счет остается 500.";
Исключение
Остановить85(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура Установить85(Элемент)
Попытка
Если Элемент <> ЭлементыФормы.Установить85 Тогда
ВызватьИсключение "Нужно отдельное согласие своей кнопкой установки двух текстов";
КонецЕсли;
Настройки = ПроверитьПрофиль85(0);
Тексты = Настройки.ТекстыСообщенийОбОшибках;
ШаблонСчета = Новый ТекстыСообщенияОбОшибке("Проверьте положительное количество в своем учебном счете.", "Прекратите учебный опыт и проверьте собственный счет перед новым запуском.");
ШаблонPDF = Новый ТекстыСообщенияОбОшибке("Учебный шаблон другой PDF-категории; PDF не открывается.", "Учебный текст другой PDF-категории с завершением; PDF не открывается.");
План = Новый Массив;
План.Добавить(Новый ФиксированнаяСтруктура("Категория,Обычный,Перезапуск", Категория85,
ШаблонСчета.ТекстДляОшибкиНеТребующейПерезапуск, ШаблонСчета.ТекстДляОшибкиТребующейПерезапуск));
План.Добавить(Новый ФиксированнаяСтруктура("Категория,Обычный,Перезапуск", КатегорияОшибки.НеправильныйПароль,
ШаблонPDF.ТекстДляОшибкиНеТребующейПерезапуск, ШаблонPDF.ТекстДляОшибкиТребующейПерезапуск));
Тексты.Вставить(Категория85, ШаблонСчета);
Тексты.Вставить(КатегорияОшибки.НеправильныйПароль, ШаблонPDF);
ОбработкаОшибок.УстановитьНастройкиПользователя(Настройки, Пользователь85.Имя);
ОжидаемыеТексты85 = Новый ФиксированныйМассив(План);
Этап85 = 1;
ПроверитьПрофиль85(1);
Если ОжидаемыеТексты85.Количество() <> 2 Тогда
ВызватьИсключение "Не подтверждены два собственных шаблона";
КонецЕсли;
Наблюдать85();
Состояние85 = "После отдельного согласия подтверждены 2 шаблона; остальные 26 свойств и счет 500 не изменились.";
Исключение
Остановить85(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура Удалить85(Элемент)
Попытка
Если Элемент <> ЭлементыФормы.Удалить85 Тогда
ВызватьИсключение "Нужно отдельное согласие своей кнопкой удаления текста счета";
КонецЕсли;
Настройки = ПроверитьПрофиль85(1);
Тексты = Настройки.ТекстыСообщенийОбОшибках;
Оставшийся = Тексты.Получить(КатегорияОшибки.НеправильныйПароль);
Если ТипЗнч(Оставшийся) <> Тип("ТекстыСообщенияОбОшибке") Тогда
ВызватьИсключение "Нет оставшегося собственного PDF-шаблона";
КонецЕсли;
План = Новый Массив;
План.Добавить(Новый ФиксированнаяСтруктура("Категория,Обычный,Перезапуск", КатегорияОшибки.НеправильныйПароль,
Оставшийся.ТекстДляОшибкиНеТребующейПерезапуск, Оставшийся.ТекстДляОшибкиТребующейПерезапуск));
Тексты.Удалить(Категория85);
ОбработкаОшибок.УстановитьНастройкиПользователя(Настройки, Пользователь85.Имя);
ОжидаемыеТексты85 = Новый ФиксированныйМассив(План);
Этап85 = 2;
ФактическиеНастройки = ПроверитьПрофиль85(2);
Если ФактическиеНастройки.ТекстыСообщенийОбОшибках.Получить(Категория85) <> Неопределено
Или ОжидаемыеТексты85.Количество() <> 1 Тогда
ВызватьИсключение "Удаление именно своей категории не подтверждено";
КонецЕсли;
Наблюдать85();
Состояние85 = "Подтвержден 1 собственный PDF-шаблон. Он не относится к пойманной ошибке; счет остается 500.";
Исключение
Остановить85(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура Очистить85(Элемент)
Попытка
Если Элемент <> ЭлементыФормы.Очистить85 Тогда
ВызватьИсключение "Нужно отдельное согласие своей кнопкой очистки остатка";
КонецЕсли;
Настройки = ПроверитьПрофиль85(2);
Тексты = Настройки.ТекстыСообщенийОбОшибках;
Если Тексты.Количество() <> 1 Или Тексты.Получить(Категория85) <> Неопределено
Или ТипЗнч(Тексты.Получить(КатегорияОшибки.НеправильныйПароль)) <> Тип("ТекстыСообщенияОбОшибке") Тогда
ВызватьИсключение "Очищать можно только проверенный остаток своего опыта";
КонецЕсли;
Тексты.Очистить();
ОбработкаОшибок.УстановитьНастройкиПользователя(Настройки, Пользователь85.Имя);
ОжидаемыеТексты85 = Новый ФиксированныйМассив(Новый Массив);
Этап85 = 3;
ФактическиеНастройки = ПроверитьПрофиль85(3);
КонечныйСнимок = УчебныеСообщенияОшибокКлиент85.СнимокНастроек85(ФактическиеНастройки);
УчебныеСообщенияОшибокКлиент85.ПроверитьТексты85(КонечныйСнимок.Шаблоны, ИсходныеПользовательские85.Шаблоны);
Наблюдать85();
Состояние85 = "Подтверждено 0 шаблонов и структурное восстановление всех 27 свойств. Исходный счет остается 500.";
Исключение
Остановить85(ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Процедура Остановить85(Диагностика)
Остановка85 = Истина;
Состояние85 = "СТОП: " + Диагностика + ". Возможен частичный исход; не повторять и не очищать автоматически.";
КонецПроцедурыПолный клиентский общий модуль: свой стенд, пойманная ошибка и полные неизменяемые снимки
Своя CF → Общие → Общие модули → УчебныеСообщенияОшибокКлиент85 → Модуль целиком
Клиент (обычное приложение)Да; все остальные контексты/Глобальный/ПривилегированныйНет, без повторного использования. Только толстый обычный клиент; реальные настройки полностью читаются и сравниваются.
Функция ПроверитьСтенд85() Экспорт
#Если ТолстыйКлиентОбычноеПриложение Тогда
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnErrorMessages4_b705873a-f6e7-4400-b4ca-b19ee7b13a89\IB"";" Тогда
ВызватьИсключение "Нужна только новая собственная учебная File-база сообщений";
КонецЕсли;
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или Метаданные.ОсновнойРежимЗапуска <> РежимЗапускаКлиентскогоПриложения.ОбычноеПриложение Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("СообщенияСчета85") = Неопределено Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.Константы.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.Обработки.Количество() <> 0 Или Метаданные.Отчеты.Количество() <> 0 Тогда
ВызватьИсключение "Не совпадает собственная пустая учебная конфигурация";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0 Тогда
ВызватьИсключение "Расширения базы на этом стенде запрещены";
КонецЕсли;
Пользователь = ПользователиИнформационнойБазы.ТекущийПользователь();
Если Пользователь = Неопределено Тогда
ВызватьИсключение "Сначала войдите под единственным собственным учебным пользователем";
КонецЕсли;
Если Пользователь.Имя <> "УченикСообщений85"
Или ПользователиИнформационнойБазы.ПолучитьПользователей().Количество() <> 1
Или Не РольДоступна("УчебнаяПолная85") Тогда
ВызватьИсключение "Нужен единственный собственный пользователь с подготовленной полной ролью";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("Имя,Идентификатор", Пользователь.Имя, Пользователь.УникальныйИдентификатор);
#Иначе
ВызватьИсключение "Урок предназначен только для толстого клиента обычного приложения";
#КонецЕсли;
КонецФункции
Процедура ПроверитьКоличество85(Количество) Экспорт
Если ТипЗнч(Количество) <> Тип("Число") Или Количество <= 0 Тогда
ВызватьИсключение "Количество собственного учебного счета должно быть положительным";
КонецЕсли;
КонецПроцедуры
Функция ПолучитьСвоюОшибку85() Экспорт
Попытка
ПроверитьКоличество85(0);
Исключение
Ошибка = ИнформацияОбОшибке();
Если ТипЗнч(Ошибка) <> Тип("ИнформацияОбОшибке") Тогда
ВызватьИсключение "Платформа не вернула информацию о нашей пойманной ошибке";
КонецЕсли;
Возврат Ошибка;
КонецПопытки;
ВызватьИсключение "Контроль количества 0 не вызвал ожидаемую ошибку";
КонецФункции
Функция СнимокНастроек85(Настройки) Экспорт
Если ТипЗнч(Настройки) <> Тип("НастройкиОбработкиОшибок") Тогда
ВызватьИсключение "Ожидались настоящие настройки менеджера обработки ошибок";
КонецЕсли;
Скаляры = Новый Структура;
Скаляры.Вставить("АдресСервисаОбработкиОшибок", Настройки.АдресСервисаОбработкиОшибок);
Скаляры.Вставить("ВариантОтображенияСообщения", Настройки.ВариантОтображенияСообщения);
Скаляры.Вставить("ВключатьИмяПользователяВОтчет", Настройки.ВключатьИмяПользователяВОтчет);
Скаляры.Вставить("ВключатьИмяПользователяВОтчетНаКлиенте", Настройки.ВключатьИмяПользователяВОтчетНаКлиенте);
Скаляры.Вставить("ВключатьИмяПользователяВОтчетНаСервере", Настройки.ВключатьИмяПользователяВОтчетНаСервере);
Скаляры.Вставить("ВключатьИнформациюОСистемеВОтчет", Настройки.ВключатьИнформациюОСистемеВОтчет);
Скаляры.Вставить("ВключатьИнформациюОСистемеВОтчетНаКлиенте", Настройки.ВключатьИнформациюОСистемеВОтчетНаКлиенте);
Скаляры.Вставить("ВключатьПодробныйТекстОшибкиВОтчет", Настройки.ВключатьПодробныйТекстОшибкиВОтчет);
Скаляры.Вставить("ВключатьПодробныйТекстОшибкиВОтчетНаКлиенте", Настройки.ВключатьПодробныйТекстОшибкиВОтчетНаКлиенте);
Скаляры.Вставить("ВключатьПодробныйТекстОшибкиВОтчетНаСервере", Настройки.ВключатьПодробныйТекстОшибкиВОтчетНаСервере);
Скаляры.Вставить("ВключатьСведенияОбИнформационнойБазеВОтчет", Настройки.ВключатьСведенияОбИнформационнойБазеВОтчет);
Скаляры.Вставить("ВключатьСведенияОбИнформационнойБазеВОтчетНаКлиенте", Настройки.ВключатьСведенияОбИнформационнойБазеВОтчетНаКлиенте);
Скаляры.Вставить("ВключатьСведенияОбИнформационнойБазеВОтчетНаСервере", Настройки.ВключатьСведенияОбИнформационнойБазеВОтчетНаСервере);
Скаляры.Вставить("ВключатьСнимокОконВОтчет", Настройки.ВключатьСнимокОконВОтчет);
Скаляры.Вставить("ВключатьСнимокОконВОтчетНаКлиенте", Настройки.ВключатьСнимокОконВОтчетНаКлиенте);
Скаляры.Вставить("ДополнительнаяИнформацияОтчета", Настройки.ДополнительнаяИнформацияОтчета);
Скаляры.Вставить("ОтправлятьОтчет", Настройки.ОтправлятьОтчет);
Скаляры.Вставить("ОтправлятьОтчетНаКлиенте", Настройки.ОтправлятьОтчетНаКлиенте);
Скаляры.Вставить("ОтправлятьОтчетНаСервере", Настройки.ОтправлятьОтчетНаСервере);
Скаляры.Вставить("ОтправлятьОтчетОбАварийномЗавершении", Настройки.ОтправлятьОтчетОбАварийномЗавершении);
Скаляры.Вставить("ОтправлятьОтчетОбАварийномЗавершенииВСервисРегистрацииОшибокПлатформы", Настройки.ОтправлятьОтчетОбАварийномЗавершенииВСервисРегистрацииОшибокПлатформы);
Скаляры.Вставить("ОтправлятьОтчетОбАварийномЗавершенииНаКлиенте", Настройки.ОтправлятьОтчетОбАварийномЗавершенииНаКлиенте);
Скаляры.Вставить("ОтправлятьОтчетОбАварийномЗавершенииНаКлиентеВСервисРегистрацииОшибокПлатформы", Настройки.ОтправлятьОтчетОбАварийномЗавершенииНаКлиентеВСервисРегистрацииОшибокПлатформы);
Скаляры.Вставить("ОтправлятьОтчетОбАварийномЗавершенииНаСервере", Настройки.ОтправлятьОтчетОбАварийномЗавершенииНаСервере);
Скаляры.Вставить("ОтправлятьОтчетОбАварийномЗавершенииНаСервереВСервисРегистрацииОшибокПлатформы", Настройки.ОтправлятьОтчетОбАварийномЗавершенииНаСервереВСервисРегистрацииОшибокПлатформы);
Скаляры.Вставить("ОтправлятьОчет", Настройки.ОтправлятьОчет);
Для Каждого Свойство Из Скаляры Цикл
Если Свойство.Ключ = "АдресСервисаОбработкиОшибок" Или Свойство.Ключ = "ДополнительнаяИнформацияОтчета" Тогда
Если ТипЗнч(Свойство.Значение) <> Тип("Строка") Тогда
ВызватьИсключение "Ожидалось строковое свойство настроек";
КонецЕсли;
ИначеЕсли Свойство.Ключ = "ВариантОтображенияСообщения" Тогда
Если ТипЗнч(Свойство.Значение) <> Тип("ВариантОтображенияСообщенияОбОшибке") Тогда
ВызватьИсключение "Не совпал тип варианта отображения сообщения";
КонецЕсли;
Иначе
Если ТипЗнч(Свойство.Значение) <> Тип("РежимОтправкиИнформацииОбОшибке") Тогда
ВызватьИсключение "Не совпал тип режима отправки информации";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Скаляры.Количество() <> 26 Тогда
ВызватьИсключение "Нужны все 26 скалярных свойств";
КонецЕсли;
Тексты = Настройки.ТекстыСообщенийОбОшибках;
Если ТипЗнч(Тексты) <> Тип("ТекстыСообщенийОбОшибках") Тогда
ВызватьИсключение "Не совпал тип настоящей коллекции настроек";
КонецЕсли;
СнимкиТекстов = Новый Массив;
Для Каждого Пара Из Тексты Цикл
Если ТипЗнч(Пара.Ключ) <> Тип("КатегорияОшибки")
Или ТипЗнч(Пара.Значение) <> Тип("ТекстыСообщенияОбОшибке") Тогда
ВызватьИсключение "Ожидалась настоящая пара категории и текстов ошибки";
КонецЕсли;
Шаблон = Пара.Значение;
Если ТипЗнч(Шаблон.ТекстДляОшибкиНеТребующейПерезапуск) <> Тип("Строка")
Или ТипЗнч(Шаблон.ТекстДляОшибкиТребующейПерезапуск) <> Тип("Строка") Тогда
ВызватьИсключение "Этот новый стенд использует только два собственных строковых текста";
КонецЕсли;
СнимкиТекстов.Добавить(Новый ФиксированнаяСтруктура("Категория,Обычный,Перезапуск", Пара.Ключ,
Шаблон.ТекстДляОшибкиНеТребующейПерезапуск, Шаблон.ТекстДляОшибкиТребующейПерезапуск));
КонецЦикла;
Если СнимкиТекстов.Количество() <> Тексты.Количество() Тогда
ВызватьИсключение "Коллекция изменилась при полном чтении";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("Скаляры,Шаблоны", Новый ФиксированнаяСтруктура(Скаляры), Новый ФиксированныйМассив(СнимкиТекстов));
КонецФункции
Процедура ПроверитьСкаляры85(Факт, Исходный) Экспорт
Если ТипЗнч(Факт) <> Тип("ФиксированнаяСтруктура") Или ТипЗнч(Исходный) <> Тип("ФиксированнаяСтруктура")
Или Факт.Скаляры.Количество() <> 26 Или Исходный.Скаляры.Количество() <> 26 Тогда
ВызватьИсключение "Нужны полные неизменяемые снимки настроек";
КонецЕсли;
Для Каждого Свойство Из Исходный.Скаляры Цикл
Если Не Факт.Скаляры.Свойство(Свойство.Ключ, ЗначениеФакта)
Или ТипЗнч(ЗначениеФакта) <> ТипЗнч(Свойство.Значение)
Или ЗначениеФакта <> Свойство.Значение Тогда
ВызватьИсключение "Изменено другое свойство настроек: " + Свойство.Ключ;
КонецЕсли;
КонецЦикла;
Для Каждого Свойство Из Факт.Скаляры Цикл
Если Не Исходный.Скаляры.Свойство(Свойство.Ключ, ЗначениеИсходное)
Или ТипЗнч(ЗначениеИсходное) <> ТипЗнч(Свойство.Значение)
Или ЗначениеИсходное <> Свойство.Значение Тогда
ВызватьИсключение "Набор скалярных свойств не совпал";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьТексты85(Факт, Ожидаемые) Экспорт
Если ТипЗнч(Факт) <> Тип("ФиксированныйМассив") Или ТипЗнч(Ожидаемые) <> Тип("ФиксированныйМассив")
Или Факт.Количество() <> Ожидаемые.Количество() Тогда
ВызватьИсключение "Не совпало полное число собственных шаблонов";
КонецЕсли;
Для Каждого Ожидаемый Из Ожидаемые Цикл
Найдено = 0;
Для Каждого Фактический Из Факт Цикл
Если Фактический.Категория = Ожидаемый.Категория Тогда
Найдено = Найдено + 1;
Если ТипЗнч(Фактический.Обычный) <> ТипЗнч(Ожидаемый.Обычный)
Или ТипЗнч(Фактический.Перезапуск) <> ТипЗнч(Ожидаемый.Перезапуск)
Или Фактический.Обычный <> Ожидаемый.Обычный
Или Фактический.Перезапуск <> Ожидаемый.Перезапуск Тогда
ВызватьИсключение "Изменены собственные тексты шаблона";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Если Найдено <> 1 Тогда
ВызватьИсключение "Нет единственного совпадения собственной категории";
КонецЕсли;
КонецЦикла;
Для Каждого Фактический Из Факт Цикл
Найдено = 0;
Для Каждого Ожидаемый Из Ожидаемые Цикл
Если Фактический.Категория = Ожидаемый.Категория Тогда
Найдено = Найдено + 1;
КонецЕсли;
КонецЦикла;
Если Найдено <> 1 Тогда
ВызватьИсключение "В коллекции есть неизвестная или повторная категория";
КонецЕсли;
КонецЦикла;
КонецПроцедурыПолный модуль обычного приложения: открытие собственной формы без установки настроек
Своя CF → Модуль обычного приложения целиком
Толстый клиент обычного приложения; настоящее ПриНачалеРаботыСистемы0. Только ПолучитьОбщуюФорму и Открыть; изменение профиля автоматически не запускается.
Процедура ПриНачалеРаботыСистемы()
Пользователь = УчебныеСообщенияОшибокКлиент85.ПроверитьСтенд85();
Если Пользователь.Имя <> "УченикСообщений85" Тогда
ВызватьИсключение "Нужен собственный пользователь";
КонецЕсли;
Форма = ПолучитьОбщуюФорму("СообщенияСчета85");
Если Форма = Неопределено Или ТипЗнч(Форма) <> Тип("Форма") Тогда
ВызватьИсключение "Не получена собственная обычная общая форма";
КонецЕсли;
Форма.Открыть();
КонецПроцедурыРазбор по шагам
Снимите полный пользовательский и общий профили, проверьте пустые коллекции и исходный счет 500.
Получите настоящую информацию о пойманной ошибке количества 0 и ее фактическую категорию.
Отдельным настоящим нажатием согласитесь установить два native шаблона с обоими текстами.
Новым чтением подтвердите 2 категории; отдельно согласитесь удалить только категорию своего исключения.
Новым чтением подтвердите 1 собственную неподходящую PDF-категорию; отдельно согласитесь очистить только этот проверенный остаток.
Новым чтением подтвердите пустую коллекцию, все 27 исходных свойств и неизменный счет 500; форматированный результат наблюдайте отдельно.
Как проверить результат
Первые настройки имеют реальные native типы; общий профиль никогда не устанавливается.
Каждый из 26 других параметров сравнивается по имени, типу и значению; коллекция — по числу, категориям и обоим текстам в двух направлениях.
Собственная категория проверена по native Info, отличается от PDF-категории; AllErrors не используется.
У каждой будущей записи собственная кнопка согласия, точная фаза и одно УстановитьНастройкиПользователя.
После ошибки STOP не сбрасывается; нет автоматических Delete/Clear/retry/rollback.
Полный счет 2/250/500 и общий профиль неизменны при всех успешных контрольных чтениях.
Ожидаемый результат
Ожидаемый ручной результат: число собственных шаблонов 0 → 2 → 1 → 0; исходный счет всегда 500. В каждой фазе поле наблюдения содержит фактически полученный текст менеджера, без эталона локали или обещания fallback. Runtime здесь не проверен.
На что обратить внимание
Read-only свойство ТекстыСообщенийОбОшибках запрещает присвоить новую коллекцию, но ее настоящие Вставить/Удалить/Очистить изменяют содержимое.
Название конструктора По умолчанию не означает ноль аргументов: обязательны оба текста.
НеправильныйПароль относится к PDF; другая категория не становится совпавшей только потому, что осталась единственной.
Нет документированного обещания приоритета/fallback/атомарности или копии getter. Возвращенный форматированный текст — наблюдение, а не golden value.
Пример начинается только с пустых собственных коллекций; чужие и форматированные ранее существующие шаблоны не переписываются.
Начальные настройки отправки/сервиса только читаются. Отсутствие явных вызовов отправки не доказывает, что вся среда никогда не использует сеть.
После неизвестного или частичного исхода STOP; закрытие формы не очищает профиль. Полное структурное совпадение не является откатом всей ИБ.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.