Создает объект ИспользованиеСобытияЖурналаРегистрации.
Синтаксис
Новый ИспользованиеСобытияЖурналаРегистрации(<Использование>, <ОписаниеИспользования>)Полное описание, параметры и ограничения
ИспользованиеСобытияЖурналаРегистрации.По умолчанию
ИспользованиеСобытияЖурналаРегистрации (EventLogEventUse)
На основании значения свойства Использование
Доступен, начиная с версии 8.2.
Синтаксис:
Новый ИспользованиеСобытияЖурналаРегистрации(<Использование>, <ОписаниеИспользования>)
Параметры:
<Использование> (необязательный)
Тип: Булево.
Определяет значение свойства Использование.
Значение по умолчанию: Истина.
<ОписаниеИспользования> (необязательный)
Тип: Произвольный.
Определяет значение свойства ОписаниеИспользования.
Значение по умолчанию: Неопределено.
Описание:
Создает объект ИспользованиеСобытияЖурналаРегистрации.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
План отказов в доступе в памяти: включить, изменить состав и восстановить свой предпросмотр
Настоящие native descriptor и режим события используются нашим отдельным потребителем: сумма счета 1050, выключенный план 0, альтернативные цены 400. Реальное журналирование и права доступа не меняются.
Где и как запускать
Серверный общий модуль собственной новой File CF 8.5.1.1343; толстая управляемая форма получает только проверенные скаляры. Runtime не выполнялся.
Подготовка
Что изучаем. Сначала создаём в памяти два настоящих описания отказа в доступе и объект использования события. Затем наш отдельный предпросмотр меняет режим и выбранное описание: 1050 → 0 → 1050 → 400 → 1050. Так видны роль Булево, содержимое свойства ОписаниеИспользования и порядок альтернатив. Это подготовка собственного плана, а не включение журналирования и не проверка реального отказа в доступе.
Создайте вручную НОВУЮ пустую файловую учебную базу только C:\1c-labs\OwnAccessDeniedPolicy85_c5771276-93dc-42d9-8f52-23ba39a74485\IB. Имя конфигурации УчебныйПланОтказа85; ОсновнойРежимЗапуска = УправляемоеПриложение; РежимСовместимости = НеИспользовать. Платформа Windows 8.5.1.1343, толстый управляемый клиент. Регистрируйте именно File="этот полный путь";: другой каталог, суффикс или формат строки отвергается. UUID в имени папки — только маркер лаборатории, не UUID базы.
Документы → Добавить → УчебнаяНакладная85. Создайте ровно три реквизита: Количество85, Цена85, Сумма85; каждый Число, длина 15, точность 2, не составной тип. Не добавляйте табличные части, формы документа, движения, подписки и модуль документа. Не создавайте и не записывайте ни одного документа: нам нужны только реальные метаданные, их полное имя и описание числовых типов.
Другие документы, справочники, регистры и расширения не добавляйте. В своей новой CF создайте собственную роль ПланОтказа85Администратор с полными учебными правами, включая Администрирование для ПолучитьПользователей и АктивныеПользователи для ПолучитьСоединенияИнформационнойБазы. Создайте единственного реального пользователя ПланОтказа85Ученик и назначьте роль. Код не создаёт пользователей и не меняет права. Проверяются настоящий UUID пользователя и текущее единственное соединение; Конфигуратор перед ручным тестом закройте.
Общие → Общие модули → ПланОтказаПамять85. Сервер = Да; Глобальный, ВызовСервера, Привилегированный, КлиентУправляемоеПриложение, КлиентОбычноеПриложение, ВнешнееСоединение = Нет. ПовторноеИспользованиеВозвращаемыхЗначений = НеИспользовать. Вставьте весь основной модуль CODE. Он проверяет эти настройки и не кеширует повторные проверки. Только ВыполнитьПредпросмотр85 экспортируется, без аргументов; все остальные функции работают с объектами, созданными здесь.
Общие → Общие формы → ПредпросмотрОтказа85, управляемая форма. Добавьте восемь реквизитов Число 15.2: Количество85, Сумма85, СуммаЦен85, Включен85, Отключен85, СноваВключен85, ДругойСостав85, Восстановлен85. Добавьте Протокол85 — Строка неограниченной длины, Остановка85 и Завершено85 — Булево с начальным значением Ложь. Покажите восемь чисел и многострочный протокол только для просмотра; служебные Булево пользователю не выводите.
Создайте собственную команду формы Предпросмотр85. В свойстве Действие назначьте обработчик Предпросмотр85(Команда); кнопку на командной панели привяжите к этой команде. Вставьте полный поддерживающий модуль формы. Его &НаСервере процедура вызывает серверный общий модуль, а клиент получает только восемь скаляров. Массивы, ТаблицаЗначений и native descriptor через RPC не передаются.
Конфигурация → Открыть модуль управляемого приложения: вставьте полный поддерживающий модуль УправляемоеПриложение. Штатное ПриНачалеРаботыСистемы() без аргументов откроет свою общую форму только в толстом управляемом клиенте. Сами обработчики событий не вызывайте. Константы перечислимых свойств метаданных в коде квалифицированы через Метаданные.СвойстваОбъектов.
ПоляРегистрации у описания отказа — readonly свойство. Поэтому ему ничего не присваиваем. У нового descriptor читаем настоящий Массив, требуем пустое состояние, вызываем документированный Массив.Добавить на нём и затем заново читаем свойство через полный ПроверитьОписание85. Если изменения не видны, тип неожиданен или начальный массив непустой, урок останавливается. Справка не превращается в обещание удержания изменений; это проверяет будущий ручной протокол.
A получает вложенный массив [Сумма85, Цена85] и отдельное Количество85; B — [Цена85, Сумма85] и Количество85. Это два собственных native описания одного настоящего документа. В обеих проекциях доступны обе альтернативы: наш потребитель выбирает первую имеющуюся и вычисляет реальные native Итог по собственной копии. Поэтому A даёт сумму счёта 1050, B — сумму цен 400. Отдельный режим Использование = Ложь означает нулевой предпросмотр по явно заданному правилу именно нашего потребителя.
Обновите вручную только эту новую учебную CF и запустите единственного своего пользователя в толстом управляемом клиенте. Нажмите Предпросмотр85 один раз. После успеха и после ошибки повтор запрещён. Для нового ручного протокола закройте клиент и начните новый собственный сеанс; не сбрасывайте служебные флаги в отладчике. В случае ошибки изучите первый отказ: нет автоматического повторения, catch-восстановления или продолжения после частичного memory изменения.
Здесь написаны и статически проверяются только source и тесты. CF, ИБ, роль, пользователь, 1С и GUI не создавались и не запускались. Нет запросов, записи прикладных данных, смены использования событий, записи журнала, сети, печати и файлового сохранения результата. Все числа далее — ожидаемый будущий ручной протокол, а не выполненный runtime.
Функция ПроверитьСтенд85()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnAccessDeniedPolicy85_c5771276-93dc-42d9-8f52-23ba39a74485\IB"";" Тогда
ВызватьИсключение "Нужен свой точно подготовленный файловый стенд 8.5.1.1343";
КонецЕсли;
Если Метаданные.Документы.Количество() <> 1 Или Метаданные.Документы.Найти("УчебнаяНакладная85") = Неопределено
Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеМодули.Найти("ПланОтказаПамять85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("ПредпросмотрОтказа85") = Неопределено
Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0
Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0
Или Метаданные.РегистрыРасчета.Количество() <> 0 Тогда
ВызватьИсключение "Допускаются только свои описание документа, общий модуль и общая форма";
КонецЕсли;
МодульМД = Метаданные.ОбщиеМодули.Найти("ПланОтказаПамять85");
Если Не МодульМД.Сервер Или МодульМД.Глобальный Или МодульМД.ВызовСервера Или МодульМД.Привилегированный
Или МодульМД.КлиентУправляемоеПриложение Или МодульМД.КлиентОбычноеПриложение Или МодульМД.ВнешнееСоединение Тогда
ВызватьИсключение "Общий модуль должен быть только серверным, неглобальным и без кеширования результатов";
КонецЕсли;
Если МодульМД.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Повторные чтения не должны возвращать кешированный результат";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "В собственном стенде не должно быть расширений";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если Текущий = Неопределено Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен единственный реальный собственный пользователь";
КонецЕсли;
Если Текущий.Имя <> "ПланОтказа85Ученик" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпала настоящая идентичность своего пользователя ИБ";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если Соединения.Количество() <> 1 Тогда
ВызватьИсключение "Закройте Конфигуратор и другие сеансы своей лаборатории";
КонецЕсли;
Соединение = Соединения[0];
Если Соединение.НомерСоединения <> НомерСоединенияИнформационнойБазы()
Или Соединение.Пользователь.УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Единственное соединение должно принадлежать текущему учебному пользователю";
КонецЕсли;
МетаДокумент = Метаданные.Документы.Найти("УчебнаяНакладная85");
Если МетаДокумент.ПолноеИмя() <> "Документ.УчебнаяНакладная85" Или МетаДокумент.Реквизиты.Количество() <> 3 Тогда
ВызватьИсключение "Проверьте точное имя и три реквизита собственного документа";
КонецЕсли;
Для Каждого ИмяПоля Из ИменаПолей85() Цикл
ПолеМД = МетаДокумент.Реквизиты.Найти(ИмяПоля);
Если ПолеМД = Неопределено Тогда
ВызватьИсключение "Отсутствует собственный числовой реквизит";
КонецЕсли;
Если ПолеМД.Тип.Типы().Количество() <> 1 Или Не ПолеМД.Тип.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Собственный реквизит должен иметь единственный тип Число";
КонецЕсли;
КонецЦикла;
Возврат МетаДокумент;
КонецФункции
Функция ИменаПолей85()
Имена = Новый Массив;
Имена.Добавить("Количество85");
Имена.Добавить("Цена85");
Имена.Добавить("Сумма85");
Возврат Имена;
КонецФункции
Функция СоздатьДанные85(МетаДокумент)
Данные = Новый ТаблицаЗначений;
Для Каждого ИмяПоля Из ИменаПолей85() Цикл
ПолеМД = МетаДокумент.Реквизиты.Найти(ИмяПоля);
Данные.Колонки.Добавить(ИмяПоля, ПолеМД.Тип);
КонецЦикла;
Первая = Данные.Добавить();
Первая.Количество85 = 3;
Первая.Цена85 = 250;
Первая.Сумма85 = Первая.Количество85 * Первая.Цена85;
Вторая = Данные.Добавить();
Вторая.Количество85 = 2;
Вторая.Цена85 = 150;
Вторая.Сумма85 = Вторая.Количество85 * Вторая.Цена85;
Возврат Данные;
КонецФункции
Функция ПрочитатьДанные85(Данные)
Если ТипЗнч(Данные) <> Тип("ТаблицаЗначений") Или Данные.Количество() <> 2 Или Данные.Колонки.Количество() <> 3 Тогда
ВызватьИсключение "Исходник должен содержать две собственные строки и три колонки";
КонецЕсли;
Для Каждого ИмяПоля Из ИменаПолей85() Цикл
Колонка = Данные.Колонки.Найти(ИмяПоля);
Если Колонка = Неопределено Тогда
ВызватьИсключение "Пропала колонка собственной таблицы";
КонецЕсли;
Если Колонка.ТипЗначения.Типы().Количество() <> 1 Или Не Колонка.ТипЗначения.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Тип каждой колонки должен оставаться единственным Число";
КонецЕсли;
КонецЦикла;
Первая = Данные.Получить(0);
Вторая = Данные.Получить(1);
Если ТипЗнч(Первая.Количество85) <> Тип("Число") Или ТипЗнч(Первая.Цена85) <> Тип("Число") Или ТипЗнч(Первая.Сумма85) <> Тип("Число")
Или ТипЗнч(Вторая.Количество85) <> Тип("Число") Или ТипЗнч(Вторая.Цена85) <> Тип("Число") Или ТипЗнч(Вторая.Сумма85) <> Тип("Число") Тогда
ВызватьИсключение "Все шесть ячеек должны содержать числа";
КонецЕсли;
Если Первая.Количество85 <> 3 Или Первая.Цена85 <> 250 Или Первая.Сумма85 <> 750
Или Вторая.Количество85 <> 2 Или Вторая.Цена85 <> 150 Или Вторая.Сумма85 <> 300
Или Первая.Сумма85 <> Первая.Количество85 * Первая.Цена85 Или Вторая.Сумма85 <> Вторая.Количество85 * Вторая.Цена85 Тогда
ВызватьИсключение "Изменилось хотя бы одно значение собственного исходного счета";
КонецЕсли;
Количество = Данные.Итог("Количество85");
Сумма = Данные.Итог("Сумма85");
СуммаЦен = Данные.Итог("Цена85");
Если Количество <> 5 Или Сумма <> 1050 Или СуммаЦен <> 400 Тогда
ВызватьИсключение "Native итоги исходника должны быть 5, 1050 и 400";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("Количество,Сумма,СуммаЦен", Количество, Сумма, СуммаЦен);
КонецФункции
Процедура ПроверитьОписание85(Описание, МетаДокумент, ПервоеПоле, Пустое)
Если ТипЗнч(Описание) <> Тип("ОписаниеИспользованияСобытияОтказВДоступеЖурналаРегистрации") Тогда
ВызватьИсключение "Нужен реальный собственный native descriptor отказа в доступе";
КонецЕсли;
Если ТипЗнч(Описание.Объект) <> Тип("Строка") Или Описание.Объект <> МетаДокумент.ПолноеИмя()
Или Метаданные.НайтиПоПолномуИмени(Описание.Объект) <> МетаДокумент Тогда
ВызватьИсключение "Объект должен быть полным именем своих настоящих метаданных";
КонецЕсли;
Регистрация = Описание.ПоляРегистрации;
Если ТипЗнч(Регистрация) <> Тип("Массив") Тогда
ВызватьИсключение "Readonly свойство должно вернуть настоящий Массив";
КонецЕсли;
Если Пустое Тогда
Если Регистрация.Количество() <> 0 Тогда
ВызватьИсключение "Новый массив должен быть пустым; чужое или неожиданное состояние не изменяем";
КонецЕсли;
Возврат;
КонецЕсли;
Если ПервоеПоле <> "Сумма85" И ПервоеПоле <> "Цена85" Тогда
ВызватьИсключение "Допускаются только две собственные альтернативы";
КонецЕсли;
ВтороеПоле = ?(ПервоеПоле = "Сумма85", "Цена85", "Сумма85");
Если Регистрация.Количество() <> 2 Тогда
ВызватьИсключение "Нужны ровно две группы регистрации своего плана";
КонецЕсли;
Если ТипЗнч(Регистрация[0]) <> Тип("Массив") Или ТипЗнч(Регистрация[1]) <> Тип("Строка")
Или Регистрация[1] <> "Количество85" Тогда
ВызватьИсключение "Проверьте вложенные альтернативы и отдельное поле количества";
КонецЕсли;
Альтернативы = Регистрация[0];
Если Альтернативы.Количество() <> 2 Тогда
ВызватьИсключение "Вложенный массив должен содержать ровно две альтернативы";
КонецЕсли;
Если ТипЗнч(Альтернативы[0]) <> Тип("Строка") Или ТипЗнч(Альтернативы[1]) <> Тип("Строка")
Или Альтернативы[0] <> ПервоеПоле Или Альтернативы[1] <> ВтороеПоле Тогда
ВызватьИсключение "Нужно полностью подтвердить типы и порядок обеих альтернатив";
КонецЕсли;
КонецПроцедуры
Функция СоздатьОписание85(МетаДокумент, ПервоеПоле)
Если ПервоеПоле <> "Сумма85" И ПервоеПоле <> "Цена85" Тогда
ВызватьИсключение "Неизвестное поле нового собственного плана";
КонецЕсли;
ИмяОбъекта = МетаДокумент.ПолноеИмя();
Описание = Новый ОписаниеИспользованияСобытияОтказВДоступеЖурналаРегистрации(ИмяОбъекта);
ПроверитьОписание85(Описание, МетаДокумент, ПервоеПоле, Истина);
Регистрация = Описание.ПоляРегистрации;
Альтернативы = Новый Массив;
Альтернативы.Добавить(ПервоеПоле);
Альтернативы.Добавить(?(ПервоеПоле = "Сумма85", "Цена85", "Сумма85"));
Регистрация.Добавить(Альтернативы);
Регистрация.Добавить("Количество85");
ПроверитьОписание85(Описание, МетаДокумент, ПервоеПоле, Ложь);
Возврат Описание;
КонецФункции
Процедура ПроверитьСостав85(Состав, МетаДокумент, ПервоеПоле)
Если ТипЗнч(Состав) <> Тип("Массив") Или Состав.Количество() <> 1 Тогда
ВызватьИсключение "Состав должен быть своим массивом с одним описанием отказа";
КонецЕсли;
Описание = Состав[0];
ПроверитьОписание85(Описание, МетаДокумент, ПервоеПоле, Ложь);
КонецПроцедуры
Процедура ПроверитьПлан85(План, МетаДокумент, Использовать, ПервоеПоле)
Если ТипЗнч(План) <> Тип("ИспользованиеСобытияЖурналаРегистрации") Тогда
ВызватьИсключение "Нужен настоящий native объект использования события";
КонецЕсли;
Если ТипЗнч(План.Использование) <> Тип("Булево") Или План.Использование <> Использовать Тогда
ВызватьИсключение "Режим должен точно совпадать с ожидаемым собственным этапом";
КонецЕсли;
Состав = План.ОписаниеИспользования;
ПроверитьСостав85(Состав, МетаДокумент, ПервоеПоле);
КонецПроцедуры
Функция Предпросмотр85(План, МетаДокумент, Данные, Использовать, ПервоеПоле)
ПроверитьПлан85(План, МетаДокумент, Использовать, ПервоеПоле);
ПрочитатьДанные85(Данные);
Если Не План.Использование Тогда
ПроверитьПлан85(План, МетаДокумент, Ложь, ПервоеПоле);
Возврат Новый ФиксированнаяСтруктура("Количество,Итог,Поле", 0, 0, "");
КонецЕсли;
Состав = План.ОписаниеИспользования;
Описание = Состав[0];
Регистрация = Описание.ПоляРегистрации;
Альтернативы = Регистрация[0];
ВыбранноеПоле = "";
Для Индекс = 0 По Альтернативы.Количество() - 1 Цикл
ИмяПоля = Альтернативы[Индекс];
Если Данные.Колонки.Найти(ИмяПоля) <> Неопределено Тогда
ВыбранноеПоле = ИмяПоля;
Прервать;
КонецЕсли;
КонецЦикла;
ПолеКоличества = Регистрация[1];
Если ВыбранноеПоле = "" Или Данные.Колонки.Найти(ПолеКоличества) = Неопределено Тогда
ВызватьИсключение "Собственная проекция не обеспечивает обе группы вывода";
КонецЕсли;
Проекция = Данные.Скопировать(, ПолеКоличества + "," + ВыбранноеПоле);
Если Проекция.Количество() <> 2 Или Проекция.Колонки.Количество() <> 2
Или Проекция.Колонки.Найти(ПолеКоличества) = Неопределено Или Проекция.Колонки.Найти(ВыбранноеПоле) = Неопределено Тогда
ВызватьИсключение "Native копия должна содержать ровно две свои строки и две выбранные колонки";
КонецЕсли;
Количество = Проекция.Итог(ПолеКоличества);
Итог = Проекция.Итог(ВыбранноеПоле);
Если ТипЗнч(Количество) <> Тип("Число") Или ТипЗнч(Итог) <> Тип("Число") Тогда
ВызватьИсключение "Предпросмотр должен вычислить реальные числовые native итоги";
КонецЕсли;
ПрочитатьДанные85(Данные);
ПроверитьПлан85(План, МетаДокумент, Истина, ПервоеПоле);
Возврат Новый ФиксированнаяСтруктура("Количество,Итог,Поле", Количество, Итог, ВыбранноеПоле);
КонецФункции
Процедура ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Использовать, ПервоеПоле)
ПроверитьСтенд85();
ПрочитатьДанные85(Данные);
ПроверитьСостав85(СоставA, МетаДокумент, "Сумма85");
ПроверитьСостав85(СоставB, МетаДокумент, "Цена85");
ПроверитьПлан85(План, МетаДокумент, Использовать, ПервоеПоле);
КонецПроцедуры
Функция ВыполнитьПредпросмотр85() Экспорт
МетаДокумент = ПроверитьСтенд85();
ОписаниеA = СоздатьОписание85(МетаДокумент, "Сумма85");
ОписаниеB = СоздатьОписание85(МетаДокумент, "Цена85");
СоставA = Новый Массив;
СоставA.Добавить(ОписаниеA);
СоставB = Новый Массив;
СоставB.Добавить(ОписаниеB);
План = Новый ИспользованиеСобытияЖурналаРегистрации(Истина, СоставA);
Данные = СоздатьДанные85(МетаДокумент);
До = ПрочитатьДанные85(Данные);
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Истина, "Сумма85");
Включен = Предпросмотр85(План, МетаДокумент, Данные, Истина, "Сумма85");
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Истина, "Сумма85");
План.Использование = Ложь;
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Ложь, "Сумма85");
Отключен = Предпросмотр85(План, МетаДокумент, Данные, Ложь, "Сумма85");
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Ложь, "Сумма85");
План.Использование = Истина;
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Истина, "Сумма85");
СноваВключен = Предпросмотр85(План, МетаДокумент, Данные, Истина, "Сумма85");
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Истина, "Сумма85");
План.ОписаниеИспользования = СоставB;
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Истина, "Цена85");
ДругойСостав = Предпросмотр85(План, МетаДокумент, Данные, Истина, "Цена85");
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Истина, "Цена85");
План.ОписаниеИспользования = СоставA;
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Истина, "Сумма85");
Восстановлен = Предпросмотр85(План, МетаДокумент, Данные, Истина, "Сумма85");
ПроверитьЭтап85(План, МетаДокумент, Данные, СоставA, СоставB, Истина, "Сумма85");
После = ПрочитатьДанные85(Данные);
Если Включен.Количество <> 5 Или Включен.Итог <> 1050 Или Включен.Поле <> "Сумма85"
Или Отключен.Количество <> 0 Или Отключен.Итог <> 0 Или Отключен.Поле <> ""
Или СноваВключен.Количество <> 5 Или СноваВключен.Итог <> 1050 Или СноваВключен.Поле <> "Сумма85"
Или ДругойСостав.Количество <> 5 Или ДругойСостав.Итог <> 400 Или ДругойСостав.Поле <> "Цена85"
Или Восстановлен.Количество <> 5 Или Восстановлен.Итог <> 1050 Или Восстановлен.Поле <> "Сумма85"
Или После.Количество <> До.Количество Или После.Сумма <> До.Сумма Или После.СуммаЦен <> До.СуммаЦен Тогда
ВызватьИсключение "Не подтвердился полный результат пяти этапов собственного предпросмотра";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("Количество,Сумма,СуммаЦен,Включен,Отключен,СноваВключен,ДругойСостав,Восстановлен",
После.Количество, После.Сумма, После.СуммаЦен, Включен.Итог, Отключен.Итог, СноваВключен.Итог, ДругойСостав.Итог, Восстановлен.Итог);
КонецФункцииСвоя управляемая форма: восемь скаляров, реальные команды и две границы остановки
Общие → Общие формы → ПредпросмотрОтказа85 → Модуль
Толстый управляемый клиент и &НаСервере процедуры собственной формы
&НаКлиенте
Процедура Предпросмотр85(Команда)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если Остановка85 Или Завершено85 Или ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда <> Команды.Предпросмотр85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Только своя команда и один запуск; после ошибки или успеха повтор запрещен";
КонецЕсли;
Попытка
ПредпросмотрНаСервере85();
Если Не Завершено85 Или Количество85 <> 5 Или Сумма85 <> 1050 Или СуммаЦен85 <> 400
Или Включен85 <> 1050 Или Отключен85 <> 0 Или СноваВключен85 <> 1050
Или ДругойСостав85 <> 400 Или Восстановлен85 <> 1050 Тогда
ВызватьИсключение "Не совпал весь скалярный пакет своего предпросмотра";
КонецЕсли;
Исключение
Остановка85 = Истина;
Протокол85 = "Отказ. Настройки журнала не менялись. Возможно частичное состояние только собственного memory плана; повтор и слепое восстановление запрещены.";
ВызватьИсключение;
КонецПопытки;
#Иначе
Остановка85 = Истина;
ВызватьИсключение "Подготовьте именно свой толстый управляемый клиент";
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура ПредпросмотрНаСервере85()
Если Остановка85 Или Завершено85 Тогда
Остановка85 = Истина;
ВызватьИсключение "Серверная граница также запрещает повтор";
КонецЕсли;
Попытка
Пакет = ПланОтказаПамять85.ВыполнитьПредпросмотр85();
Если Пакет.Количество <> 5 Или Пакет.Сумма <> 1050 Или Пакет.СуммаЦен <> 400
Или Пакет.Включен <> 1050 Или Пакет.Отключен <> 0 Или Пакет.СноваВключен <> 1050
Или Пакет.ДругойСостав <> 400 Или Пакет.Восстановлен <> 1050 Тогда
ВызватьИсключение "Сервер не принимает неполный или неподтвержденный результат";
КонецЕсли;
Количество85 = Пакет.Количество;
Сумма85 = Пакет.Сумма;
СуммаЦен85 = Пакет.СуммаЦен;
Включен85 = Пакет.Включен;
Отключен85 = Пакет.Отключен;
СноваВключен85 = Пакет.СноваВключен;
ДругойСостав85 = Пакет.ДругойСостав;
Восстановлен85 = Пакет.Восстановлен;
Протокол85 = "Свой счет: количество 5, сумма 1050, сумма цен 400. НАШ предпросмотр: 1050 → 0 → 1050 → 400 → 1050. Реальное журналирование, RLS и запросы не проверялись и не изменялись.";
Завершено85 = Истина;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыНастоящее startup событие открывает только собственную форму
Конфигурация → Открыть модуль управляемого приложения
Толстый клиент, управляемое приложение
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnAccessDeniedPolicy85_c5771276-93dc-42d9-8f52-23ba39a74485\IB"";" Тогда
ВызватьИсключение "Открывается только собственная новая файловая лаборатория этого урока";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.ПредпросмотрОтказа85", , , Истина);
#Иначе
ВызватьИсключение "Нужен толстый управляемый клиент 8.5.1.1343";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Проверяем точный File/version/NoUse, серверные настройки своего модуля, отсутствие расширений, настоящего единственного пользователя и соединение. Из реальных метаданных единственного документа получаем ПолноеИмя и три числовых типа. Документ не создаётся и не читается из базы.
Передаём ровно один настоящий String в ctor150. Проверяем native класс, actual ObjectString и metadata lookup, затем пустой массив из readonly свойства. Создаём два разных собственных порядка альтернатив A/B через Array.Add и свежий полный getter readback. Если удержание содержимого не подтверждено, немедленно отказываем; setter readonly свойства отсутствует.
Создаём две реальные строки ТаблицыЗначений: 3×250=750 и 2×150=300. Полностью перечитываем все шесть типизированных ячеек и вычисляем количество 5, сумму 1050, сумму цен 400. Native ctor151 получает явно Истина и новый массив с одним своим descriptor A; его фактическое содержимое заново проверяется.
Наш отдельный consumer читает actual режим и вложенные имена полей из native плана. Для включённого A он создаёт настоящую проекцию через Скопировать с пустым первым слотом и явными колонками, затем вычисляет Итог 1050/5. Не подменяем actual результат готовыми числами и не называем проекцию данными реального журнала.
Перед каждым из четырёх RW назначений выполняется полный свежий ПроверитьЭтап85: свой стенд, весь исходник, оба массива описаний и ожидаемый текущий native план. Использование=False даёт собственный пустой предпросмотр 0/0; True возвращает 1050/5; смена ОписаниеИспользования на свой B даёт 400/5; возврат своего A разрешён только после подтверждённого состояния B и возвращает 1050/5. Ни одно восстановление не выполняется из catch.
В конце проверяем поля, количество и итог каждого из пяти результатов, полностью неизменные входные ячейки и оба native описания. Сервер формы принимает восемь скаляров только целиком; клиент отдельно подтверждает их. Ошибки на любой границе устанавливают Остановка85, успех — Завершено85; ни один флаг не сбрасывается.
Как проверить результат
Ожидаемый будущий протокол: исходные 5/1050/400; пять собственных предпросмотров 1050 → 0 → 1050 → 400 → 1050. У включённых этапов количество 5, у отключённого 0; выбор A=Сумма85, B=Цена85; отключённый выбор пустой. Все шесть исходных ячеек и оба порядка вложенных альтернатив полностью проверяются, не только суммы или Count.
Все четыре setter имеют fresh whole-state guard непосредственно перед изменением и после него. Неизвестное состояние, неверная CF/пользователь/другое соединение, непустой новый массив, wrong type, потерянный порядок или частичный scalar пакет приводят к отказу; повтор, blind rollback и catch-успех запрещены.
MAIN реально использует все восемь PRIMARY. ПоляРегистрации не присваивается; generic ОписаниеИспользования допускается только после проверки фактического Array[ownDeniedDescriptor]. Нет нулевого ctor193/194, native event installation, запроса, RLS-теста или записи журнала.
Ожидаемый результат
Ожидаемый будущий ручной результат формы: 5, 1050, 400, 1050, 0, 1050, 400, 1050. Это реальный расчёт нашего memory consumer при указанной подготовке, не выполненный здесь запуск 1С и не доказательство регистрации отказов в журнале.
На что обратить внимание
У ctor150 String необязателен, но мы явно передаём один собственный FullName. Нулевой ctor150 пересекается с ctor193; аналогичную неоднозначность имеет access ctor149/194. Нулевые перегрузки не выбираются и не кредитуются.
Object8836 объявлен String. Не копируйте противоречивую фразу ctor150 про пустые массивы в Object: код требует реальный String своего документа и останавливается при другом результате. ПоляРегистрации8837 readonly; native setter-пример в большой странице SetEvent4041 не отменяет этот контракт.
Readonly свойство и тип Массив не являются гарантией, что изменения getter-результата удержатся в descriptor. Поэтому только собственный новый пустой массив, нативный Add и свежий полный readback; если подготовленная платформа не удержит изменения, будущий ручной протокол честно остановится, а не будет считаться успешным.
UseDescription имеет тип Произвольный. Для события _$Access$_.AccessDenied методическая область SetEvent4041 описывает Array[DeniedDescriptor]; здесь мы сами строим только такой массив и проверяем весь граф. Большая страница читалась только в относящемся к этому событию фрагменте, не целиком.
План никуда не устанавливается. Наше правило нулевого предпросмотра и суммы проекций не доказывают live RLS, query trigger, native Data.Data или порядок приоритетов реального регистратора. Не переносите код в рабочую базу: все входные данные и метаданные должны быть только своими.
Назначения и изменение массивов не атомарны. Возврат состава A допустим только после успешного этапа B и его полного fresh snapshot; при исключении не восстанавливаем вслепую. Sticky флаги защищают наш протокол формы, но не являются универсальным механизмом безопасности 1С.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.
Свой последовательный журнал: настройки, реальные события и архивное сокращение
Две реальные команды новой одноразовой File базы: проверить уровни, политику и разделение с восстановлением; затем сохранить архив и удалить старые записи всего собственного журнала.
Где и как запускать
Неглобальный серверный модуль новой пустой File CF 8.5.1.1343 в отдельной VM; толстая управляемая форма. Будущие изменения реального учебного журнала, не только памяти.
Подготовка
В отдельной НОВОЙ одноразовой Windows VM вручную создайте пустую файловую ИБ точно C:\1c-labs\OwnEventLogSequential4_9e2c4621-52cc-4d19-8c2d-f035ba650763\IB. Не берите копию рабочей базы или чужую CF. UUID пути — учебный маркер, не защита от подмены базы, junction или злонамеренного кода.
Конфигуратор → Конфигурация → свойства: Имя=СтендЖРПоследовательный85; Версия=OwnEventLogSequential4-e6bf76c4-72d0-490f-819b-d0bb63112546; ОсновнойРежимЗапуска=УправляемоеПриложение; РежимСовместимости=НеИспользовать; вариант встроенного языка Русский. Не добавляйте документы, справочники, регистры, регламентные задания и расширения.
Общие → Роли → ЖР85Администратор: учебные права Администрирование, ЖурналРегистрации, АктивныеПользователи и доступ к своей форме. Администрирование → Пользователи: создайте только своего ЖР85Ученик с этой ролью. Код не создаёт пользователей и не меняет роли; он читает настоящую текущую идентичность и UUID единственного соединения.
Администрирование → Настройка журнала регистрации: подтвердите поле Разделять хранение журнала по периодам, которое установленная справка описывает для последовательного формата. Если вместо этого доступен только SQLite-журнал — остановитесь. Не преобразовывайте чужой или уже существующий журнал ради урока. Getter периода не объявлен детектором формата.
В этой будущей VM вручную создайте только новый пустой каталог C:\1c-labs\OwnEventLogSequential4_9e2c4621-52cc-4d19-8c2d-f035ba650763\Archive. Все родительские каталоги должны существовать. Код не создаёт/удаляет каталоги, отказывается от любых существующих файлов и от добавления к старому архиву.
Общие → Общие модули → ЖРПоследовательный85: Сервер=Да; Глобальный, ВызовСервера, Привилегированный, КлиентУправляемоеПриложение, КлиентОбычноеПриложение, ВнешнееСоединение=Нет; ПовторноеИспользованиеВозвращаемыхЗначений=НеИспользовать. Вставьте CODE целиком. ВызовСервера здесь не нужен: общий модуль вызывается только сервером собственной формы, а не напрямую клиентом.
Общие → Общие формы → УрокЖурнала85. Реквизиты: Остановка85 Булево исходно Ложь; Этап85 Число1.0 исходно0; ДатаСтарая85/Граница85 Дата с составом ДатаИВремя; МаскаУровней85 Число2.0; Период85 ПериодРазделенияХраненияДанныхЖурналаРегистрации; Использование85 Булево; Код85 Строка100; СтарыхПосле85/НовыхПосле85/СтарыхВАрхиве85/ВсегоВАрхиве85 Число15.0; Архив85/Протокол85 неограниченная Строка. Служебные состояние и исходные настройки скрыты, результат и многострочный протокол только для просмотра.
В форме добавьте команды Подготовить85 и Архивировать85, их Действия одноимённые процедуры FORM; кнопки панели привяжите именно к этим командам. Вставьте весь FORM. Сначала только Подготовить. После протокола успешного восстановления подождите несколько реальных секунд, затем отдельно нажмите Архивировать. Не вызывайте callback команды вручную и не переоткрывайте форму для обхода остановки.
Конфигурация → Открыть модуль управляемого приложения: вставьте APPLICATION. Настоящее ПриНачалеРаботыСистемы() открывает собственную форму. Обновите только эту новую пустую CF, закройте Конфигуратор и все другие соединения, запустите один толстый управляемый клиент 8.5.1.1343. Перечисление периода создаётся и обрабатывается сервером, его обмен с сервером документирован.
Первый этап сохраняет реальные уровни, состояние своего Policy и период. Наборы уровней проверяются как множества настоящих enum, не порядок массива. Коды0/1/3/7/15 — только компактные суммы1/2/4/8 для передачи исходного набора; в setter передаётся настоящий Массив, не эти числа. При трёх уровнях Info записывается, Note3 не должен; при четырёх Note4 должен. Policy один и тот же для Disabled/Enabled, комментарии разные.
Политика собственного события возвращается настоящим getter. ОписаниеИспользования фактически проверяется как Неопределено: это условие урока, не обещание для любого события. Отдельные новые descriptor для Ложь/Истина/исходного Bool не меняют сохранённый объект. Системные события Access, AccessDenied и транзакций не настраиваются.
Разделение меняется на Час или День, затем исходное значение восстанавливается и перечитывается. Не обещается появление нового часового файла без смены часа. Все настройки первого этапа восстановлены до возврата; перед сокращением второго этапа временные уровни снова восстанавливаются и проверяются.
Старые/новые даты берутся из настоящих строк журнала. ЗаписьЖурналаРегистрации не принимает дату события. Граница — реальная дата Keep, строго позже Info; все совпадения UUID/имени/комментария/уровня проверяются. Выгрузка идёт в серверную ТаблицаЗначений с пятью точными колонками, MaximumCount0 означает без лимита. Таблицы, массивы и descriptor через RPC не передаются.
СократитьЖурналРегистрации удаляет ВСЕ записи всего своего учебного журнала старше даты Keep, включая платформенные системные записи, а не только отбор Info. .lgf — имя легенды; дополнительные файлы данных получают документированный префикс. Архив читается через явное своё имя. В текущем журнале проверяются все даты не раньше границы, в архиве все даты раньше границы. Автоматические системные события не позволяют обещать фиксированное общее число записей.
Любая ошибка означает отказ и постоянный STOP этой формы, без повторения мутаций или восстановительных вызовов внутри catch. Если ошибка возникла до подтверждённого восстановления настроек, они могли остаться изменёнными. Не обещается автоматический rollback: сохраните исходную ошибку, остановите VM; отдельное ручное восстановление из зафиксированных исходных значений либо новый пустой стенд требует отдельного решения. Повторный запуск урока на использованном журнале запрещён.
Архив — сохранённые удалённые записи, а не их автоматический импорт обратно. СкопироватьЖурналРегистрации и ОчиститьЖурналРегистрации здесь не вызываются и не получают покрытие: отдельный новый SQLite producer ещё не доказан. Этот код проверяется статически; создание VM/CF/ИБ, запись журнала, настройки и архивирование здесь не выполнялись.
Функция ПроверитьСтенд85()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnEventLogSequential4_9e2c4621-52cc-4d19-8c2d-f035ba650763\IB"";" Тогда
ВызватьИсключение "Разрешена только своя новая пустая File база в отдельной учебной VM";
КонецЕсли;
Если Метаданные.Документы.Количество() <> 0 Или Метаданные.Справочники.Количество() <> 0
Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0
Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0
Или Метаданные.РегламентныеЗадания.Количество() <> 0
Или Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеМодули.Найти("ЖРПоследовательный85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("УрокЖурнала85") = Неопределено Тогда
ВызватьИсключение "Нужен пустой стенд с одним своим модулем и формой, без данных и заданий";
КонецЕсли;
МодульМД = Метаданные.ОбщиеМодули.Найти("ЖРПоследовательный85");
Если Не МодульМД.Сервер Или МодульМД.Глобальный Или МодульМД.ВызовСервера Или МодульМД.Привилегированный
Или МодульМД.КлиентУправляемоеПриложение Или МодульМД.КлиентОбычноеПриложение Или МодульМД.ВнешнееСоединение
Или МодульМД.ПовторноеИспользованиеВозвращаемыхЗначений <> Метаданные.СвойстваОбъектов.ПовторноеИспользованиеВозвращаемыхЗначений.НеИспользовать Тогда
ВызватьИсключение "Нужен неглобальный серверный модуль без прямого RPC, привилегий и кеширования";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Расширения в этой собственной лаборатории запрещены";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если ТипЗнч(Текущий) <> Тип("ПользовательИнформационнойБазы") Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен один настоящий учебный пользователь";
КонецЕсли;
Если Текущий.Имя <> "ЖР85Ученик" Или Пользователи[0].УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Не совпала фактическая идентичность собственного пользователя";
КонецЕсли;
Соединения = ПолучитьСоединенияИнформационнойБазы();
Если Соединения.Количество() <> 1 Тогда
ВызватьИсключение "Закройте Конфигуратор и все остальные соединения своего стенда";
КонецЕсли;
Соединение = Соединения[0];
Если Соединение.НомерСоединения <> НомерСоединенияИнформационнойБазы()
Или Соединение.Пользователь.УникальныйИдентификатор <> Текущий.УникальныйИдентификатор Тогда
ВызватьИсключение "Единственное соединение должно принадлежать своему текущему пользователю";
КонецЕсли;
Возврат Текущий;
КонецФункции
Функция ИмяСобытия85(Метка)
Метки = СтрРазделить("Info,Note3,Note4,Disabled,Enabled,Keep", ",");
Если Метки.Найти(Метка) = Неопределено Тогда
ВызватьИсключение "Неизвестная метка собственного учебного события";
КонецЕсли;
Возврат "Учебный.ЖР85.e6bf76c4." + ?(Метка = "Disabled" Или Метка = "Enabled", "Policy", Метка);
КонецФункции
Функция ИмяАрхива85()
Возврат "C:\1c-labs\OwnEventLogSequential4_9e2c4621-52cc-4d19-8c2d-f035ba650763\Archive\own-journal-before-cutoff.lgf";
КонецФункции
Процедура ПроверитьПустойАрхив85()
Каталог = Новый Файл("C:\1c-labs\OwnEventLogSequential4_9e2c4621-52cc-4d19-8c2d-f035ba650763\Archive");
Выход = Новый Файл(ИмяАрхива85());
Если Не Каталог.Существует() Или Каталог.ЭтоФайл() Или Выход.Существует()
Или НайтиФайлы(Каталог.ПолноеИмя, "*", Ложь).Количество() <> 0 Тогда
ВызватьИсключение "В своей VM вручную подготовьте только этот новый пустой каталог; существующий архив запрещён";
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьЖурнал85(Метка, ВходнойФайл)
Текущий = ПроверитьСтенд85();
Если ТипЗнч(Метка) <> Тип("Строка") Или ТипЗнч(ВходнойФайл) <> Тип("Строка") Тогда
ВызватьИсключение "Нужны точные строковые метка и источник";
КонецЕсли;
Если ВходнойФайл <> "" И ВходнойФайл <> ИмяАрхива85() Тогда
ВызватьИсключение "Чужие файлы журнала читать запрещено";
КонецЕсли;
Отбор = Новый Структура;
Если Метка <> "" Тогда
Отбор.Вставить("Событие", ИмяСобытия85(Метка));
Отбор.Вставить("Комментарий", "Учебный маркер " + Метка);
Отбор.Вставить("Пользователь", Текущий);
КонецЕсли;
Таблица = Новый ТаблицаЗначений;
Если ВходнойФайл = "" Тогда
ВыгрузитьЖурналРегистрации(Таблица, Отбор, "Дата,Пользователь,Событие,Комментарий,Уровень", , 0);
Иначе
ВыгрузитьЖурналРегистрации(Таблица, Отбор, "Дата,Пользователь,Событие,Комментарий,Уровень", ВходнойФайл, 0);
КонецЕсли;
Если ТипЗнч(Таблица) <> Тип("ТаблицаЗначений") Или Таблица.Колонки.Количество() <> 5 Тогда
ВызватьИсключение "Нужна фактическая таблица ровно с пятью колонками";
КонецЕсли;
Для Каждого ИмяКолонки Из СтрРазделить("Дата,Пользователь,Событие,Комментарий,Уровень", ",") Цикл
Если Таблица.Колонки.Найти(ИмяКолонки) = Неопределено Тогда
ВызватьИсключение "Не найдена обязательная колонка журнала";
КонецЕсли;
КонецЦикла;
Для Каждого СтрокаЖР Из Таблица Цикл
Если ТипЗнч(СтрокаЖР) <> Тип("СтрокаТаблицыЗначений") Или ТипЗнч(СтрокаЖР.Дата) <> Тип("Дата")
Или ТипЗнч(СтрокаЖР.Пользователь) <> Тип("УникальныйИдентификатор")
Или ТипЗнч(СтрокаЖР.Событие) <> Тип("Строка") Или ТипЗнч(СтрокаЖР.Комментарий) <> Тип("Строка")
Или ТипЗнч(СтрокаЖР.Уровень) <> Тип("УровеньЖурналаРегистрации") Тогда
ВызватьИсключение "Каждая строка должна иметь все настоящие документированные типы";
КонецЕсли;
Если Метка <> "" Тогда
Уровень = ?(Метка = "Note3" Или Метка = "Note4", УровеньЖурналаРегистрации.Примечание, УровеньЖурналаРегистрации.Информация);
Если СтрокаЖР.Событие <> ИмяСобытия85(Метка) Или СтрокаЖР.Комментарий <> "Учебный маркер " + Метка
Или СтрокаЖР.Пользователь <> Текущий.УникальныйИдентификатор Или СтрокаЖР.Уровень <> Уровень Тогда
ВызватьИсключение "Не подтверждены имя, комментарий, UUID и уровень собственного события";
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Таблица;
КонецФункции
Процедура ЗаписатьМаркер85(Метка, Уровень)
ЗаписьЖурналаРегистрации(ИмяСобытия85(Метка), Уровень, , , "Учебный маркер " + Метка);
КонецПроцедуры
Функция МаскаУровней85()
Уровни = ПолучитьИспользованиеЖурналаРегистрации();
Если ТипЗнч(Уровни) <> Тип("Массив") Или Уровни.Количество() > 4 Тогда
ВызватьИсключение "Получатель должен вернуть настоящий массив не более четырёх уровней";
КонецЕсли;
Просмотренные = Новый Массив;
Маска = 0;
Для Каждого Уровень Из Уровни Цикл
Если ТипЗнч(Уровень) <> Тип("УровеньЖурналаРегистрации") Или Просмотренные.Найти(Уровень) <> Неопределено Тогда
ВызватьИсключение "Произвольные значения и повторные уровни запрещены";
КонецЕсли;
Просмотренные.Добавить(Уровень);
Если Уровень = УровеньЖурналаРегистрации.Ошибка Тогда
Маска = Маска + 1;
ИначеЕсли Уровень = УровеньЖурналаРегистрации.Предупреждение Тогда
Маска = Маска + 2;
ИначеЕсли Уровень = УровеньЖурналаРегистрации.Информация Тогда
Маска = Маска + 4;
ИначеЕсли Уровень = УровеньЖурналаРегистрации.Примечание Тогда
Маска = Маска + 8;
Иначе
ВызватьИсключение "Неизвестный уровень журнала";
КонецЕсли;
КонецЦикла;
Если Маска <> 0 И Маска <> 1 И Маска <> 3 И Маска <> 7 И Маска <> 15 Тогда
ВызватьИсключение "Набор уровней не разрешён установленной платформой";
КонецЕсли;
Возврат Маска;
КонецФункции
Процедура УстановитьУровни85(Маска)
Если ТипЗнч(Маска) <> Тип("Число") Тогда
ВызватьИсключение "Код набора уровней должен быть числом";
КонецЕсли;
Если Маска <> 0 И Маска <> 1 И Маска <> 3 И Маска <> 7 И Маска <> 15 Тогда
ВызватьИсключение "Допускаются только пять документированных наборов";
КонецЕсли;
Уровни = Новый Массив;
Если Маска >= 1 Тогда Уровни.Добавить(УровеньЖурналаРегистрации.Ошибка); КонецЕсли;
Если Маска >= 3 Тогда Уровни.Добавить(УровеньЖурналаРегистрации.Предупреждение); КонецЕсли;
Если Маска >= 7 Тогда Уровни.Добавить(УровеньЖурналаРегистрации.Информация); КонецЕсли;
Если Маска = 15 Тогда Уровни.Добавить(УровеньЖурналаРегистрации.Примечание); КонецЕсли;
УстановитьИспользованиеЖурналаРегистрации(Уровни);
Если МаскаУровней85() <> Маска Тогда
ВызватьИсключение "Настройка уровней фактически не совпала с ожидаемой";
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьПолитику85()
Политика = ПолучитьИспользованиеСобытияЖурналаРегистрации(ИмяСобытия85("Enabled"));
Если ТипЗнч(Политика) <> Тип("ИспользованиеСобытияЖурналаРегистрации") Тогда
ВызватьИсключение "Нужен настоящий объект использования собственного события";
КонецЕсли;
Если ТипЗнч(Политика.Использование) <> Тип("Булево") Или Политика.ОписаниеИспользования <> Неопределено Тогда
ВызватьИсключение "Неожиданная политика: произвольное описание не изменяем";
КонецЕсли;
Возврат Политика.Использование;
КонецФункции
Процедура УстановитьПолитику85(Использовать)
Если ТипЗнч(Использовать) <> Тип("Булево") Тогда
ВызватьИсключение "Нужно точное булево состояние собственного события";
КонецЕсли;
Политика = Новый ИспользованиеСобытияЖурналаРегистрации(Использовать, Неопределено);
УстановитьИспользованиеСобытияЖурналаРегистрации(ИмяСобытия85("Enabled"), Политика);
Если ПрочитатьПолитику85() <> Использовать Тогда
ВызватьИсключение "Состояние собственного события не подтверждено";
КонецЕсли;
КонецПроцедуры
Функция ПрочитатьПериод85()
Период = ПолучитьПериодРазделенияХраненияДанныхЖурналаРегистрации();
Если ТипЗнч(Период) <> Тип("ПериодРазделенияХраненияДанныхЖурналаРегистрации") Тогда
ВызватьИсключение "Период должен быть настоящим значением перечисления";
КонецЕсли;
Возврат Период;
КонецФункции
Процедура ПроверитьПоля85(Пакет, Описание)
Если ТипЗнч(Пакет) <> Тип("ФиксированнаяСтруктура") Тогда
ВызватьИсключение "До чтения полей нужен настоящий неизменяемый пакет";
КонецЕсли;
Если Пакет.Количество() <> Описание.Количество() Тогда
ВызватьИсключение "Отсутствующие и лишние поля запрещены";
КонецЕсли;
Для Каждого Поле Из Описание Цикл
Если Не Пакет.Свойство(Поле.Ключ, ЗначениеПоля) Или ТипЗнч(ЗначениеПоля) <> Поле.Значение Тогда
ВызватьИсключение "Не совпали точные имена и типы всех полей";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПроверитьПодготовку85(Пакет) Экспорт
Описание = Новый Структура("ДатаСтарая,МаскаУровней,Период,Использование,Код", Тип("Дата"), Тип("Число"), Тип("ПериодРазделенияХраненияДанныхЖурналаРегистрации"), Тип("Булево"), Тип("Строка"));
ПроверитьПоля85(Пакет, Описание);
Если Пакет.Код <> "OwnEventLogSequential4-e6bf76c4-72d0-490f-819b-d0bb63112546"
Или (Пакет.МаскаУровней <> 0 И Пакет.МаскаУровней <> 1 И Пакет.МаскаУровней <> 3 И Пакет.МаскаУровней <> 7 И Пакет.МаскаУровней <> 15) Тогда
ВызватьИсключение "Не совпали код стенда и разрешённый исходный набор уровней";
КонецЕсли;
КонецПроцедуры
Функция Подготовить85() Экспорт
ПроверитьСтенд85();
ПроверитьПустойАрхив85();
Для Каждого Метка Из СтрРазделить("Info,Note3,Note4,Disabled,Enabled,Keep", ",") Цикл
Если ПрочитатьЖурнал85(Метка, "").Количество() <> 0 Тогда
ВызватьИсключение "Этот стенд уже использовался; повторные изменения запрещены";
КонецЕсли;
КонецЦикла;
СтараяМаска = МаскаУровней85();
СтароеИспользование = ПрочитатьПолитику85();
СтарыйПериод = ПрочитатьПериод85();
УстановитьУровни85(7);
ЗаписатьМаркер85("Info", УровеньЖурналаРегистрации.Информация);
ЗаписатьМаркер85("Note3", УровеньЖурналаРегистрации.Примечание);
Старые = ПрочитатьЖурнал85("Info", "");
Если Старые.Количество() <> 1 Или ПрочитатьЖурнал85("Note3", "").Количество() <> 0 Тогда
ВызватьИсключение "Информация должна записаться, а Примечание при трёх уровнях — нет";
КонецЕсли;
УстановитьУровни85(15);
ЗаписатьМаркер85("Note4", УровеньЖурналаРегистрации.Примечание);
УстановитьПолитику85(Ложь);
ЗаписатьМаркер85("Disabled", УровеньЖурналаРегистрации.Информация);
Если ПрочитатьЖурнал85("Note4", "").Количество() <> 1 Или ПрочитатьЖурнал85("Disabled", "").Количество() <> 0 Тогда
ВызватьИсключение "Не подтверждены четвёртый уровень и отключение своего события";
КонецЕсли;
УстановитьПолитику85(Истина);
ЗаписатьМаркер85("Enabled", УровеньЖурналаРегистрации.Информация);
Если ПрочитатьЖурнал85("Enabled", "").Количество() <> 1 Тогда
ВызватьИсключение "Включённое собственное событие должно появиться один раз";
КонецЕсли;
НовыйПериод = ?(СтарыйПериод = ПериодРазделенияХраненияДанныхЖурналаРегистрации.Час, ПериодРазделенияХраненияДанныхЖурналаРегистрации.День, ПериодРазделенияХраненияДанныхЖурналаРегистрации.Час);
УстановитьПериодРазделенияХраненияДанныхЖурналаРегистрации(НовыйПериод);
Если ПрочитатьПериод85() <> НовыйПериод Тогда
ВызватьИсключение "Новый период разделения фактически не подтверждён";
КонецЕсли;
УстановитьПериодРазделенияХраненияДанныхЖурналаРегистрации(СтарыйПериод);
Если ПрочитатьПериод85() <> СтарыйПериод Тогда
ВызватьИсключение "Исходный период не восстановлен";
КонецЕсли;
УстановитьПолитику85(СтароеИспользование);
УстановитьУровни85(СтараяМаска);
Если ПрочитатьПолитику85() <> СтароеИспользование Или ПрочитатьПериод85() <> СтарыйПериод Тогда
ВызватьИсключение "Вся исходная настройка должна быть подтверждена до второй команды";
КонецЕсли;
Пакет = Новый ФиксированнаяСтруктура(Новый Структура("ДатаСтарая,МаскаУровней,Период,Использование,Код", Старые.Получить(0).Дата, СтараяМаска, СтарыйПериод, СтароеИспользование, "OwnEventLogSequential4-e6bf76c4-72d0-490f-819b-d0bb63112546"));
ПроверитьПодготовку85(Пакет);
Возврат Пакет;
КонецФункции
Процедура ПроверитьИтог85(Итог) Экспорт
Описание = Новый Структура("ДатаСтарая,Граница,СтарыхПосле,НовыхПосле,СтарыхВАрхиве,ВсегоВАрхиве,Архив", Тип("Дата"), Тип("Дата"), Тип("Число"), Тип("Число"), Тип("Число"), Тип("Число"), Тип("Строка"));
ПроверитьПоля85(Итог, Описание);
Если Итог.ДатаСтарая >= Итог.Граница Или Итог.СтарыхПосле <> 0 Или Итог.НовыхПосле <> 1
Или Итог.СтарыхВАрхиве <> 1 Или Итог.ВсегоВАрхиве < 1 Или Итог.Архив <> ИмяАрхива85() Тогда
ВызватьИсключение "Ожидаемый результат сокращения фактически не подтверждён";
КонецЕсли;
КонецПроцедуры
Функция Архивировать85(Пакет) Экспорт
ПроверитьСтенд85();
ПроверитьПодготовку85(Пакет);
ПроверитьПустойАрхив85();
Старые = ПрочитатьЖурнал85("Info", "");
Если Старые.Количество() <> 1 Или ПрочитатьЖурнал85("Keep", "").Количество() <> 0
Или ПрочитатьЖурнал85("Note4", "").Количество() <> 1 Или ПрочитатьЖурнал85("Enabled", "").Количество() <> 1
Или ПрочитатьЖурнал85("Note3", "").Количество() <> 0 Или ПрочитатьЖурнал85("Disabled", "").Количество() <> 0 Тогда
ВызватьИсключение "Нужен полностью подтверждённый первый этап без повторного Keep";
КонецЕсли;
Если Старые.Получить(0).Дата <> Пакет.ДатаСтарая Или ТекущаяДата() <= Пакет.ДатаСтарая
Или МаскаУровней85() <> Пакет.МаскаУровней Или ПрочитатьПериод85() <> Пакет.Период
Или ПрочитатьПолитику85() <> Пакет.Использование Тогда
ВызватьИсключение "Нужны исходные настройки, фактическая старая дата и реальный разрыв времени";
КонецЕсли;
УстановитьУровни85(15);
ЗаписатьМаркер85("Keep", УровеньЖурналаРегистрации.Информация);
Новые = ПрочитатьЖурнал85("Keep", "");
Если Новые.Количество() <> 1 Тогда
ВызватьИсключение "Новый сохраняемый маркер должен появиться ровно один раз";
КонецЕсли;
Граница = Новые.Получить(0).Дата;
Если Граница <= Пакет.ДатаСтарая Тогда
ВызватьИсключение "Фактическая новая дата должна быть строго позже старой";
КонецЕсли;
УстановитьУровни85(Пакет.МаскаУровней);
Если ПрочитатьПериод85() <> Пакет.Период Или ПрочитатьПолитику85() <> Пакет.Использование Тогда
ВызватьИсключение "Все настройки должны быть восстановлены до необратимого сокращения";
КонецЕсли;
До = ПрочитатьЖурнал85("", "");
ПериодЖР = ПолучитьПериодЖурналаРегистрации();
Если ТипЗнч(ПериодЖР) <> Тип("Диапазон") Тогда
ВызватьИсключение "Период журнала должен быть настоящим диапазоном";
КонецЕсли;
Если ТипЗнч(ПериодЖР.Начало) <> Тип("Дата") Или ТипЗнч(ПериодЖР.Конец) <> Тип("Дата")
Или До.Количество() < 2 Или ПериодЖР.Начало > Пакет.ДатаСтарая Или ПериодЖР.Конец < Граница Тогда
ВызватьИсключение "Весь собственный журнал должен содержать обе реальные даты";
КонецЕсли;
ПроверитьСтенд85();
ПроверитьПустойАрхив85();
СократитьЖурналРегистрации(Граница, ИмяАрхива85());
Выход = Новый Файл(ИмяАрхива85());
Если Не Выход.Существует() Или Не Выход.ЭтоФайл() Тогда
ВызватьИсключение "Новый собственный архив не появился";
КонецЕсли;
СтарыеПосле = ПрочитатьЖурнал85("Info", "");
НовыеПосле = ПрочитатьЖурнал85("Keep", "");
АрхивСтарых = ПрочитатьЖурнал85("Info", ИмяАрхива85());
Если СтарыеПосле.Количество() <> 0 Или НовыеПосле.Количество() <> 1 Или АрхивСтарых.Количество() <> 1
Или ПрочитатьЖурнал85("Keep", ИмяАрхива85()).Количество() <> 0 Тогда
ВызватьИсключение "Не подтверждено разделение собственных старого и сохраняемого событий";
КонецЕсли;
Если АрхивСтарых.Получить(0).Дата <> Пакет.ДатаСтарая Или НовыеПосле.Получить(0).Дата <> Граница Тогда
ВызватьИсключение "Изменились реальные даты сохранённых событий";
КонецЕсли;
После = ПрочитатьЖурнал85("", "");
Для Каждого СтрокаЖР Из После Цикл
Если СтрокаЖР.Дата < Граница Тогда ВызватьИсключение "В текущем журнале осталась запись старше границы"; КонецЕсли;
КонецЦикла;
ВесьАрхив = ПрочитатьЖурнал85("", ИмяАрхива85());
Для Каждого СтрокаЖР Из ВесьАрхив Цикл
Если СтрокаЖР.Дата >= Граница Тогда ВызватьИсключение "В архив попала запись не старше границы"; КонецЕсли;
КонецЦикла;
ПериодЖР = ПолучитьПериодЖурналаРегистрации();
Если ТипЗнч(ПериодЖР) <> Тип("Диапазон") Тогда ВызватьИсключение "Нужен фактический диапазон после сокращения"; КонецЕсли;
Если ТипЗнч(ПериодЖР.Начало) <> Тип("Дата") Или ТипЗнч(ПериодЖР.Конец) <> Тип("Дата")
Или ПериодЖР.Начало < Граница Или ПериодЖР.Конец < Граница Тогда
ВызватьИсключение "Границы всего журнала не подтверждены";
КонецЕсли;
Итог = Новый ФиксированнаяСтруктура(Новый Структура("ДатаСтарая,Граница,СтарыхПосле,НовыхПосле,СтарыхВАрхиве,ВсегоВАрхиве,Архив", Пакет.ДатаСтарая, Граница, СтарыеПосле.Количество(), НовыеПосле.Количество(), АрхивСтарых.Количество(), ВесьАрхив.Количество(), ИмяАрхива85()));
ПроверитьИтог85(Итог);
Возврат Итог;
КонецФункцииДве собственные команды, проверенные пакеты и постоянная остановка
Общие → Общие формы → УрокЖурнала85 → Модуль
Толстый управляемый клиент / &НаСервере
&НаКлиенте
Процедура Подготовить85(Команда)
Попытка
Если Остановка85 Или Этап85 <> 0 Или ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда <> Команды.Подготовить85 Тогда
ВызватьИсключение "Команда разрешена только один раз на новом стенде";
КонецЕсли;
ПодготовитьНаСервере85();
Если Остановка85 Или Этап85 <> 1 Или ТипЗнч(ДатаСтарая85) <> Тип("Дата")
Или ТипЗнч(МаскаУровней85) <> Тип("Число") Или ТипЗнч(Период85) <> Тип("ПериодРазделенияХраненияДанныхЖурналаРегистрации")
Или ТипЗнч(Использование85) <> Тип("Булево") Или Код85 <> "OwnEventLogSequential4-e6bf76c4-72d0-490f-819b-d0bb63112546" Тогда
ВызватьИсключение "Первый этап не подтверждён на границе клиент/сервер";
КонецЕсли;
Исключение
Остановка85 = Истина;
Протокол85 = "ОТКАЗ, не успех. Не повторяйте команды и не переоткрывайте форму для обхода STOP. Настройки могли не восстановиться. Сохраните исходную ошибку и остановите учебную VM.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура ПодготовитьНаСервере85()
Попытка
Если Остановка85 Или Этап85 <> 0 Тогда ВызватьИсключение "Подготовка уже запускалась"; КонецЕсли;
Пакет = ЖРПоследовательный85.Подготовить85();
ЖРПоследовательный85.ПроверитьПодготовку85(Пакет);
ДатаСтарая85 = Пакет.ДатаСтарая;
МаскаУровней85 = Пакет.МаскаУровней;
Период85 = Пакет.Период;
Использование85 = Пакет.Использование;
Код85 = Пакет.Код;
Этап85 = 1;
Протокол85 = "Первый этап подтверждён. Исходные уровни, собственная политика и период восстановлены. Старая дата: " + Строка(ДатаСтарая85) + ". Подождите несколько секунд, затем отдельно нажмите Архивировать. Будут удалены ВСЕ записи собственной учебной базы старше новой реальной даты, включая системные.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаКлиенте
Процедура Архивировать85(Команда)
Попытка
Если Остановка85 Или Этап85 <> 1 Или ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда <> Команды.Архивировать85 Тогда
ВызватьИсключение "Нужен завершённый первый этап и ровно одна своя команда архивации";
КонецЕсли;
АрхивироватьНаСервере85();
Если Остановка85 Или Этап85 <> 2 Или ТипЗнч(Граница85) <> Тип("Дата") Или Граница85 <= ДатаСтарая85
Или ТипЗнч(СтарыхПосле85) <> Тип("Число") Или СтарыхПосле85 <> 0
Или ТипЗнч(НовыхПосле85) <> Тип("Число") Или НовыхПосле85 <> 1
Или ТипЗнч(СтарыхВАрхиве85) <> Тип("Число") Или СтарыхВАрхиве85 <> 1
Или ТипЗнч(ВсегоВАрхиве85) <> Тип("Число") Или ВсегоВАрхиве85 < 1
Или Архив85 <> "C:\1c-labs\OwnEventLogSequential4_9e2c4621-52cc-4d19-8c2d-f035ba650763\Archive\own-journal-before-cutoff.lgf" Тогда
ВызватьИсключение "Не подтверждён весь фактический итог";
КонецЕсли;
Исключение
Остановка85 = Истина;
Протокол85 = "ОТКАЗ, не успех. После ошибки нет повторных мутаций или автоматического отката. Удалённые записи не восстановлены в текущий журнал; архив не является импортом. Сохраните ошибку и остановите учебную VM.";
ВызватьИсключение;
КонецПопытки;
КонецПроцедуры
&НаСервере
Процедура АрхивироватьНаСервере85()
Попытка
Если Остановка85 Или Этап85 <> 1 Тогда ВызватьИсключение "Архивация на этом этапе запрещена"; КонецЕсли;
Пакет = Новый ФиксированнаяСтруктура(Новый Структура("ДатаСтарая,МаскаУровней,Период,Использование,Код", ДатаСтарая85, МаскаУровней85, Период85, Использование85, Код85));
ЖРПоследовательный85.ПроверитьПодготовку85(Пакет);
Итог = ЖРПоследовательный85.Архивировать85(Пакет);
ЖРПоследовательный85.ПроверитьИтог85(Итог);
Если Итог.ДатаСтарая <> ДатаСтарая85 Тогда ВызватьИсключение "Подменена исходная дата"; КонецЕсли;
Граница85 = Итог.Граница;
СтарыхПосле85 = Итог.СтарыхПосле;
НовыхПосле85 = Итог.НовыхПосле;
СтарыхВАрхиве85 = Итог.СтарыхВАрхиве;
ВсегоВАрхиве85 = Итог.ВсегоВАрхиве;
Архив85 = Итог.Архив;
Этап85 = 2;
Протокол85 = "В текущем журнале старых своих Info:0, сохранённых Keep:1; в архиве старых Info:1. ВСЕ записи всего собственного журнала старше " + Строка(Граница85) + " удалены. В архиве всего " + Строка(ВсегоВАрхиве85) + " записей, включая возможные системные. Архив: " + Архив85 + ". Настройки восстановлены ДО сокращения. Импорт удалённых записей не выполнялся.";
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыШтатное событие запуска открывает только собственную лабораторию
Конфигурация → Открыть модуль управляемого приложения
Толстый управляемый клиент
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnEventLogSequential4_9e2c4621-52cc-4d19-8c2d-f035ba650763\IB"";" Тогда
ВызватьИсключение "Откройте только свою новую учебную File базу в отдельной VM";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.УрокЖурнала85", , , Истина);
#Иначе
ВызватьИсключение "Нужен толстый управляемый клиент 8.5.1.1343";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Подготовить отдельную новую пустую VM/File CF, одного своего пользователя, последовательный журнал, точные форму/модуль и пустой каталог архива; проверить все маркеры и единственное соединение.
Подготовить85: получить исходные настройки через native getters, наблюдать уровни7/15 и один свой Policy Ложь/Истина на реальных строках. Проверить период Час/День, восстановить и подтвердить все исходные настройки.
Подождать реальный разрыв времени между двумя командами. Архивировать85 перечитывает старую строку и настройки, создаёт Keep и берёт его настоящую дату. Временные уровни восстанавливаются ДО сокращения.
После полного readback и отказа от любого существующего архива один раз сократить весь собственный журнал до фактической даты Keep с новым .lgf архивом. Проверить Info0/Keep1 в текущем журнале и Info1/Keep0 в архиве, все даты обоих журналов и настоящий период текущего журнала.
Как проверить результат
Будущий первый протокол: Info1, Note3=0, Note4=1, Disabled0, Enabled1; уровни, свой Policy и период восстановлены. Getter сам по себе не доказывает запись события: проверяются actual строки.
Будущий итог: старая дата строго меньше границы, СтарыхПосле0, НовыхПосле1, СтарыхВАрхиве1, ВсегоВАрхиве≥1 и точный новый путь. Общее число может включать системные записи и берётся фактически.
Пакеты имеют ровно5 и7 полей с проверкой всех имён/типов до чтения. Только4 primary. Ошибка/отказ не отмечается как полезный успешный пример; повторение и автоматический ремонт запрещены.
Ожидаемый результат
Ожидаемый будущий ручной результат: исходные настройки восстановлены до whole-own-lab сокращения; старый Info доступен в новом архиве, новый Keep остаётся в текущем журнале. Здесь 1С не запускалась.
На что обратить внимание
Никогда не запускайте в рабочей базе: дата сокращения касается всего журнала, без event-фильтра. Проверки учебных имён/UUID не являются защитой от намеренной подмены.
Setter уровня допускает лишь0/1/3/7/15 наборы enum, требует администратора и отсутствие других соединений. Числа — только представление пакета, не аргумент native setter.
Period setter доступен только последовательному журналу. Native enum периода имеет серверный контекст; не переносите код в чисто клиентский модуль.
Native Range.Начало/Конец и ТаблицаЗначений.Колонки только читаются. UUID строки журнала сравнивается с фактическим пользовательским UUID, не с объектом пользователя.
Truncate существующий архив пытается дополнить: здесь любой старый файл или содержимое каталога запрещены. Удаление не может быть отменено повторным чтением архива.
STOP действует в текущей форме; не закрывайте/открывайте её заново ради повторного запуска. Ошибка до восстановления может оставить учебные настройки изменёнными; успешное восстановление не выдумывается.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.