Объект создается с указанным полным именем метаданного в качестве объекта и пустыми массивами в свойствах ПоляДоступа и ПоляРегистрации.
Синтаксис
Новый ОписаниеИспользованияСобытияДоступЖурналаРегистрации(<Объект>)Полное описание, параметры и ограничения
ОписаниеИспользованияСобытияДоступЖурналаРегистрации.По имени метаданного
ОписаниеИспользованияСобытияДоступЖурналаРегистрации (EventLogAccessEventUseDescription)
По имени метаданного
Доступен, начиная с версии 8.2.
Синтаксис:
Новый ОписаниеИспользованияСобытияДоступЖурналаРегистрации(<Объект>)
Параметры:
<Объект> (необязательный)
Тип: Строка.
Полное имя объекта метаданных.
Описание:
Объект создается с указанным полным именем метаданного в качестве объекта и пустыми массивами в свойствах ПоляДоступа и ПоляРегистрации.
Использование в версии:
Доступен, начиная с версии 8.2.
Методическая информация
Практические примеры
Спроектировать аудит в памяти: реальные массивы политики и свой предпросмотр1050/400
Создаем настоящий descriptor для своих реальных метаданных, проверяем каждый элемент его вложенных массивов и используем их только в собственном offline consumer. Счет5/1050 неизменен; журналирование не включается.
Где и как запускать
Платформа8.5.1.1343; серверный общий модуль своей новой File CF; толстая управляемая форма показывает скаляры. Runtime1C/CF/UI не выполнялись.
Подготовка
Задача: безопасно спроектировать описание аудита и понять различие суммы счета1050 и суммы цен400. Мы создаем новый настоящий descriptor и собственную ТаблицуЗначений в памяти, не устанавливаем использование события журнала. Описания полей читаются нашим отдельным consumer предпросмотра; его OR и результат1050/400 НЕ доказывают native query trigger или содержание реального лога1С.
Вручную создайте НОВУЮ пустую файловую CF только C:\1c-labs\OwnAccessAuditPlan85_6f42ea37-93da-4c98-a5d1-17f57bd178c2\IB. Имя конфигурации УчебныйПредпросмотрАудита85, РежимСовместимостиНеИспользовать, основное приложениеУправляемоеПриложение. Windows8.5.1.1343, толстый управляемый клиент. UUID в папке — маркер лаборатории, не UUID информационной базы. Нужна точная строка регистрации File="путь"; иной формат/суффикс/каталог отказует, fuzzy fallback нет.
Документы→Добавить УчебнаяНакладная85. Добавьте ровно три собственных реквизита Количество85, Цена85, Сумма85; все Число, длина15, точность2, не составной тип. Табличных частей, движений, проведения, модулей документа, подписок и форм документа для этой задачи не требуется. Это только реальное описание метаданных: документы не создавайте и не записывайте. Общий модуль проверяет ПолноеИмя, Count3 и тип каждого реквизита до native конструктора.
Не добавляйте справочники, регистры и расширения. Создайте свою роль Аудит85Администратор с полными правами только этой новой CF, включая администрирование для ПолучитьПользователей. Создайте единственного собственного пользователя Аудит85Ученик и назначьте роль. Проверяются Users.Count1 и настоящий UUID текущего пользователя. Код не создает пользователей и не меняет роли; рабочие конфигурации исключены точными guards. Эти действия здесь не выполнялись.
Общие→ОбщиеМодули→ПланАудитаПамять85: СерверДа, оба клиентских контекстаНет, ГлобальныйНет, ВызовСервераНет, ПривилегированныйНет. Вставьте весь CODE. В нем только одна экспортная функция без аргументов; helper функции закрыты внутри модуля и получают только созданные здесь собственные объекты.
Общие→ОбщиеФормы→ПредпросмотрАудита85, управляемая форма. Добавьте Количество85, Сумма85, СуммаЦен85, ИтогA85, ИтогB85, КоличествоA85, КоличествоB85 — Число, длина15, точность2; ВыбранC85, Остановка85, Завершено85 — Булево с начальным значениемЛожь; Протокол85 — Строка неограниченной длины. Выведите семь чисел, ВыбранC85 и многострочный Протокол85 только для просмотра. Флаги остановки/завершения пользователю не выводите.
В форме создайте единственную команду Предпросмотр85, Действие→Предпросмотр85(Команда). Добавьте кнопку с Команда=Предпросмотр85 на командную панель. Вставьте полный supporting module ПредпросмотрАудита85, включая server процедуру. Конфигурация→Открыть модуль управляемого приложения: вставьте supporting module УправляемоеПриложение. Штатное startup событие без аргументов открывает только свою новую форму, не вызывайте callback вручную.
Правила НАШЕГО предпросмотра заданы явно: ownOR выбирает проекцию, если в ней есть хотя бы одно имя из ПоляДоступа=[Цена85,Сумма85]. ПоляРегистрации=[[Сумма85,Цена85],Количество85]: собственный consumer берет первую имеющуюся альтернативу по наименьшему индексу и отдельно количество. A содержит Количество85/Сумма85/Цена85, поэтому доступны ОБЕ альтернативы и выбирается Сумма85 с индексом0; B содержит Количество85/Цена85, поэтому выбирается Цена85 с индексом1; C содержит только Количество85 и не выбирается. Числа рассчитываются реальными native Итог по новым memory копиям, не подставляются как результат логирования.
Вручную обновите только новую учебную конфигурацию и запустите своего пользователя в толстом управляемом клиенте. Нажмите Предпросмотр85 один раз. После успеха или ошибки повтор запрещен. При отказе изучите собственный отладчик; нет retry, продолжения после исключения или слепого восстановления частичного memory плана. Новый ручной протокол начинайте новым собственным клиентом, не изменением журналирования.
Здесь созданы и статически проверены только тексты/native контракты/negative tests. Реальная CF/ИБ/пользователь/обновление/1С/UI не создавались и не выполнялись. Нет запросов, чтения документов, смены настроек аудита, WriteLog, подключения к сети, печати или сохранения файлов. Будущие ожидаемые числа не являются выполненным runtime протоколом.
Функция ПроверитьСвойСтенд85()
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnAccessAuditPlan85_6f42ea37-93da-4c98-a5d1-17f57bd178c2\IB"";" Тогда
ВызватьИсключение "Только свой точно подготовленный File-стенд 8.5.1.1343";
КонецЕсли;
Если Метаданные.ОбщиеМодули.Количество() <> 1 Или Метаданные.ОбщиеМодули.Найти("ПланАудитаПамять85") = Неопределено
Или Метаданные.ОбщиеФормы.Количество() <> 1 Или Метаданные.ОбщиеФормы.Найти("ПредпросмотрАудита85") = Неопределено
Или Метаданные.Документы.Количество() <> 1 Или Метаданные.Документы.Найти("УчебнаяНакладная85") = Неопределено
Или Метаданные.Справочники.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0
Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0
Или Метаданные.РегистрыРасчета.Количество() <> 0 Тогда
ВызватьИсключение "Нужны только свои модуль, форма и описание документа; прикладные данные не читаем";
КонецЕсли;
Если РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.БазаДанных).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансАктивные).Количество() <> 0
Или РасширенияКонфигурации.Получить(, ИсточникРасширенийКонфигурации.СеансОтключенные).Количество() <> 0 Тогда
ВызватьИсключение "Свой учебный стенд должен быть без расширений";
КонецЕсли;
Текущий = ПользователиИнформационнойБазы.ТекущийПользователь();
Пользователи = ПользователиИнформационнойБазы.ПолучитьПользователей();
Если Текущий = Неопределено Или Пользователи.Количество() <> 1 Тогда
ВызватьИсключение "Нужен единственный реальный собственный пользователь ИБ";
КонецЕсли;
Если Текущий.Имя <> "Аудит85Ученик" Или Пользователи[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 Тогда
ВызватьИсключение "Нужны ровно две собственные memory строки и три числовые колонки";
КонецЕсли;
Для Каждого ИмяПоля Из СвоиИменаПолей85() Цикл
Колонка = Данные.Колонки.Найти(ИмяПоля);
Если Колонка = Неопределено Тогда
ВызватьИсключение "Потеряна собственная колонка";
КонецЕсли;
Если Колонка.ТипЗначения.Типы().Количество() <> 1 Или Не Колонка.ТипЗначения.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Тип колонки должен оставаться единственным Число";
КонецЕсли;
КонецЦикла;
Первая = Данные.Получить(0);
Вторая = Данные.Получить(1);
Если ТипЗнч(Первая.Количество85) <> Тип("Число") Или ТипЗнч(Первая.Цена85) <> Тип("Число") Или ТипЗнч(Первая.Сумма85) <> Тип("Число")
Или ТипЗнч(Вторая.Количество85) <> Тип("Число") Или ТипЗнч(Вторая.Цена85) <> Тип("Число") Или ТипЗнч(Вторая.Сумма85) <> Тип("Число") Тогда
ВызватьИсключение "Все шесть actual значений собственного счета должны быть числами";
КонецЕсли;
Если Первая.Количество85 <> 3 Или Первая.Цена85 <> 250 Или Первая.Сумма85 <> 750
Или Вторая.Количество85 <> 2 Или Вторая.Цена85 <> 150 Или Вторая.Сумма85 <> 300
Или Первая.Сумма85 <> Первая.Количество85 * Первая.Цена85 Или Вторая.Сумма85 <> Вторая.Количество85 * Вторая.Цена85 Тогда
ВызватьИсключение "Все шесть actual ячеек собственной таблицы должны совпадать с исходным счетом";
КонецЕсли;
Количество = Данные.Итог("Количество85");
Сумма = Данные.Итог("Сумма85");
СуммаЦен = Данные.Итог("Цена85");
Если Количество <> 5 Или Сумма <> 1050 Или СуммаЦен <> 400 Тогда
ВызватьИсключение "Native итоги собственной таблицы должны быть5/1050/400";
КонецЕсли;
Возврат Новый ФиксированнаяСтруктура("Количество,Сумма,СуммаЦен", Количество, Сумма, СуммаЦен);
КонецФункции
Процедура ПроверитьСвоюПолитику85(Описание, МетаДокумент, Пустая)
Если ТипЗнч(Описание) <> Тип("ОписаниеИспользованияСобытияДоступЖурналаРегистрации") Тогда
ВызватьИсключение "Нет настоящего нового native descriptor";
КонецЕсли;
Если ТипЗнч(Описание.Объект) <> Тип("Строка") Или Описание.Объект <> МетаДокумент.ПолноеИмя()
Или Метаданные.НайтиПоПолномуИмени(Описание.Объект) <> МетаДокумент Тогда
ВызватьИсключение "Объект должен реально разрешаться в свои подготовленные метаданные документа";
КонецЕсли;
Доступ = Описание.ПоляДоступа;
Регистрация = Описание.ПоляРегистрации;
Если ТипЗнч(Доступ) <> Тип("Массив") Или ТипЗнч(Регистрация) <> Тип("Массив") Тогда
ВызватьИсключение "Оба native свойства должны быть массивами";
КонецЕсли;
Если Пустая Тогда
Если Доступ.Количество() <> 0 Или Регистрация.Количество() <> 0 Тогда
ВызватьИсключение "У своего именованного конструктора ожидаются два пустых массива";
КонецЕсли;
Возврат;
КонецЕсли;
Если Доступ.Количество() <> 2 Или Регистрация.Количество() <> 2 Тогда
ВызватьИсключение "Нужны два поля доступа и две группы регистрации своего плана";
КонецЕсли;
Если ТипЗнч(Доступ[0]) <> Тип("Строка") Или ТипЗнч(Доступ[1]) <> Тип("Строка")
Или Доступ[0] <> "Цена85" Или Доступ[1] <> "Сумма85"
Или ТипЗнч(Регистрация[0]) <> Тип("Массив") Или ТипЗнч(Регистрация[1]) <> Тип("Строка")
Или Регистрация[1] <> "Количество85" Тогда
ВызватьИсключение "Неверное полное содержимое собственных native массивов";
КонецЕсли;
Альтернативы = Регистрация[0];
Если Альтернативы.Количество() <> 2 Тогда
ВызватьИсключение "Нужно ровно две собственные альтернативы";
КонецЕсли;
Если ТипЗнч(Альтернативы[0]) <> Тип("Строка") Или ТипЗнч(Альтернативы[1]) <> Тип("Строка")
Или Альтернативы[0] <> "Сумма85" Или Альтернативы[1] <> "Цена85" Тогда
ВызватьИсключение "Порядок и типы обеих альтернатив должны полностью совпадать";
КонецЕсли;
Для Каждого ИмяПоля Из СвоиИменаПолей85() Цикл
Если МетаДокумент.Реквизиты.Найти(ИмяПоля) = Неопределено Тогда
ВызватьИсключение "Имя собственного поля не разрешилось в настоящих метаданных";
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Функция ПредпросмотрНашегоПотребителя85(Описание, МетаДокумент, Проекция)
ПроверитьСвоюПолитику85(Описание, МетаДокумент, Ложь);
Если ТипЗнч(Проекция) <> Тип("ТаблицаЗначений") Или Проекция.Количество() <> 2
Или Проекция.Колонки.Количество() < 1 Или Проекция.Колонки.Количество() > 3 Тогда
ВызватьИсключение "Только маленькая собственная memory проекция";
КонецЕсли;
Для Каждого Колонка Из Проекция.Колонки Цикл
Если СвоиИменаПолей85().Найти(Колонка.Имя) = Неопределено Или Колонка.ТипЗначения.Типы().Количество() <> 1
Или Не Колонка.ТипЗначения.СодержитТип(Тип("Число")) Тогда
ВызватьИсключение "Проекция должна содержать только свои числовые поля";
КонецЕсли;
КонецЦикла;
НашВыборOR = Ложь;
Для Каждого ИмяПоля Из Описание.ПоляДоступа Цикл
Если Проекция.Колонки.Найти(ИмяПоля) <> Неопределено Тогда
НашВыборOR = Истина;
КонецЕсли;
КонецЦикла;
Если Не НашВыборOR Тогда
ПроверитьСвоюПолитику85(Описание, МетаДокумент, Ложь);
Возврат Новый ФиксированнаяСтруктура("НашВыбор,Поле,Итог,Количество", Ложь, "", 0, 0);
КонецЕсли;
Альтернативы = Описание.ПоляРегистрации[0];
ВыбранноеПоле = "";
Для Индекс = 0 По Альтернативы.Количество() - 1 Цикл
ИмяПоля = Альтернативы[Индекс];
Если Проекция.Колонки.Найти(ИмяПоля) <> Неопределено Тогда
ВыбранноеПоле = ИмяПоля;
Прервать;
КонецЕсли;
КонецЦикла;
ПолеКоличества = Описание.ПоляРегистрации[1];
Если ВыбранноеПоле = "" Или Проекция.Колонки.Найти(ПолеКоличества) = Неопределено Тогда
ВызватьИсключение "Наша выбранная проекция должна обеспечить обе группы собственного вывода";
КонецЕсли;
Итог = Проекция.Итог(ВыбранноеПоле);
Количество = Проекция.Итог(ПолеКоличества);
Если ТипЗнч(Итог) <> Тип("Число") Или ТипЗнч(Количество) <> Тип("Число") Тогда
ВызватьИсключение "Native итоги собственной проекции должны быть числами";
КонецЕсли;
ПроверитьСвоюПолитику85(Описание, МетаДокумент, Ложь);
Возврат Новый ФиксированнаяСтруктура("НашВыбор,Поле,Итог,Количество", НашВыборOR, ВыбранноеПоле, Итог, Количество);
КонецФункции
Функция ВыполнитьСвойПредпросмотр85() Экспорт
МетаДокумент = ПроверитьСвойСтенд85();
ИмяОбъекта = МетаДокумент.ПолноеИмя();
Описание = Новый ОписаниеИспользованияСобытияДоступЖурналаРегистрации(ИмяОбъекта);
ПроверитьСвоюПолитику85(Описание, МетаДокумент, Истина);
Доступ = Новый Массив;
Доступ.Добавить("Цена85");
Доступ.Добавить("Сумма85");
Альтернативы = Новый Массив;
Альтернативы.Добавить("Сумма85");
Альтернативы.Добавить("Цена85");
Регистрация = Новый Массив;
Регистрация.Добавить(Альтернативы);
Регистрация.Добавить("Количество85");
Описание.ПоляДоступа = Доступ;
Описание.ПоляРегистрации = Регистрация;
ПроверитьСвоюПолитику85(Описание, МетаДокумент, Ложь);
Данные = СоздатьСвоиДанные85(МетаДокумент);
До = ПрочитатьСвоиДанные85(Данные);
ПроекцияA = Данные.Скопировать(, "Количество85,Сумма85,Цена85");
ПроекцияB = Данные.Скопировать(, "Количество85,Цена85");
ПроекцияC = Данные.Скопировать(, "Количество85");
РезультатA = ПредпросмотрНашегоПотребителя85(Описание, МетаДокумент, ПроекцияA);
ПрочитатьСвоиДанные85(Данные);
РезультатB = ПредпросмотрНашегоПотребителя85(Описание, МетаДокумент, ПроекцияB);
ПрочитатьСвоиДанные85(Данные);
РезультатC = ПредпросмотрНашегоПотребителя85(Описание, МетаДокумент, ПроекцияC);
После = ПрочитатьСвоиДанные85(Данные);
Если Не РезультатA.НашВыбор Или РезультатA.Поле <> "Сумма85" Или РезультатA.Итог <> 1050 Или РезультатA.Количество <> 5
Или Не РезультатB.НашВыбор Или РезультатB.Поле <> "Цена85" Или РезультатB.Итог <> 400 Или РезультатB.Количество <> 5
Или РезультатC.НашВыбор Или РезультатC.Поле <> "" Или РезультатC.Итог <> 0 Или РезультатC.Количество <> 0 Тогда
ВызватьИсключение "Не подтвердился полный результат трех проекций НАШЕГО потребителя, не регистратора1С";
КонецЕсли;
Если После.Количество <> До.Количество Или После.Сумма <> До.Сумма Или После.СуммаЦен <> До.СуммаЦен Тогда
ВызватьИсключение "Исходный полный счет должен оставаться неизменным";
КонецЕсли;
ПроверитьСвоюПолитику85(Описание, МетаДокумент, Ложь);
Возврат Новый ФиксированнаяСтруктура("Количество,Сумма,СуммаЦен,ИтогA,ИтогB,КоличествоA,КоличествоB,ВыбранC",
После.Количество, После.Сумма, После.СуммаЦен, РезультатA.Итог, РезультатB.Итог,
РезультатA.Количество, РезультатB.Количество, РезультатC.НашВыбор);
КонецФункцииСвоя управляемая форма: восемь скаляров и две границы остановки
Общие → Общие формы → ПредпросмотрАудита85 → Модуль
Толстый управляемый клиент и серверные процедуры собственной формы; отдельные директивы контекста
&НаКлиенте
Процедура Предпросмотр85(Команда)
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если Остановка85 Или Завершено85 Или ТипЗнч(Команда) <> Тип("КомандаФормы") Или Команда <> Команды.Предпросмотр85 Тогда
ВызватьИсключение "Только один запуск своей команды; повтор после успеха или ошибки запрещен";
КонецЕсли;
Попытка
ПредпросмотрНаСервере85();
Если Не Завершено85 Или Количество85 <> 5 Или Сумма85 <> 1050 Или СуммаЦен85 <> 400
Или ИтогA85 <> 1050 Или ИтогB85 <> 400 Или КоличествоA85 <> 5 Или КоличествоB85 <> 5 Или ВыбранC85 Тогда
ВызватьИсключение "Не совпал полный скалярный результат собственного предпросмотра";
КонецЕсли;
Исключение
Остановка85 = Истина;
Протокол85 = "Отказ. Возможен частичный только memory план; продолжения, retry или слепого восстановления нет.";
ВызватьИсключение;
КонецПопытки;
#Иначе
ВызватьИсключение "Только собственный толстый управляемый клиент";
#КонецЕсли
КонецПроцедуры
&НаСервере
Процедура ПредпросмотрНаСервере85()
Если Остановка85 Или Завершено85 Тогда
ВызватьИсключение "Серверная граница также запрещает повтор";
КонецЕсли;
Попытка
Пакет = ПланАудитаПамять85.ВыполнитьСвойПредпросмотр85();
Если Пакет.Количество <> 5 Или Пакет.Сумма <> 1050 Или Пакет.СуммаЦен <> 400
Или Пакет.ИтогA <> 1050 Или Пакет.ИтогB <> 400 Или Пакет.КоличествоA <> 5 Или Пакет.КоличествоB <> 5 Или Пакет.ВыбранC Тогда
ВызватьИсключение "Не совпали все восемь actual scalar результатов server memory расчета";
КонецЕсли;
Количество85 = Пакет.Количество;
Сумма85 = Пакет.Сумма;
СуммаЦен85 = Пакет.СуммаЦен;
ИтогA85 = Пакет.ИтогA;
ИтогB85 = Пакет.ИтогB;
КоличествоA85 = Пакет.КоличествоA;
КоличествоB85 = Пакет.КоличествоB;
ВыбранC85 = Пакет.ВыбранC;
Протокол85 = "Свои данные5/1050, сумма цен400. НАШ OR и НАШ выбор альтернатив: A1050/5, B400/5, Cне выбран. Регистратор1С не вызывался, настройки журналирования не менялись.";
Завершено85 = Истина;
Исключение
Остановка85 = Истина;
ВызватьИсключение;
КонецПопытки;
КонецПроцедурыНастоящее startup событие открывает только свою общую форму
Конфигурация → Открыть модуль управляемого приложения
Толстый клиент, управляемое приложение
Процедура ПриНачалеРаботыСистемы()
#Если ТолстыйКлиентУправляемоеПриложение Тогда
Если Метаданные.РежимСовместимости <> Метаданные.СвойстваОбъектов.РежимСовместимости.НеИспользовать Или СтрокаСоединенияИнформационнойБазы() <> "File=""C:\1c-labs\OwnAccessAuditPlan85_6f42ea37-93da-4c98-a5d1-17f57bd178c2\IB"";" Тогда
ВызватьИсключение "Только своя новая точно зарегистрированная File CF этого урока";
КонецЕсли;
ОткрытьФорму("ОбщаяФорма.ПредпросмотрАудита85", , , Истина);
#Иначе
ВызватьИсключение "Только собственный толстый управляемый клиент 8.5.1.1343";
#КонецЕсли
КонецПроцедурыРазбор по шагам
Проверяем точный свой File/user/version/NoUse и реальные метаданные документа с тремя числовыми полями. Получаем native FullName и передаем его как один String в ctor149; ctor194 без аргументов не используется и не кредитуется.
У нового descriptor проверяем настоящий класс, ObjectString→реальный metadata lookup и оба пустых native массива. Создаем свои массивы доступа и регистрации, включая настоящий вложенный массив альтернатив; назначаем RW свойства, затем полностью перечитываем типы, длины, все четыре строки и их порядок.
Создаем две строки собственного счета в ТаблицеЗначений; типы колонок берем из реальных метаданных. Перечитываем все шесть ячеек и вычисляем native итоги5/1050/400. Это независимые memory данные, не записи документа или результаты запроса к ИБ.
Создаем три новые проекции через native Скопировать с пустым первым слотом и явными колонками. В A доступны ОБЕ альтернативы: НАШ consumer выбирает Сумма85 с индексом0, а не Цена85 с индексом1. В B доступна только Цена85, поэтому выбирается индекс1; C отклоняется нашим OR. Имена альтернатив и количество читаются из реальных native массивов. Native Итог возвращает A1050/5 и B400/5; C возвращает собственный false/empty/0, не прогноз записи1С.
Перед и после каждого предпросмотра полностью проверяем descriptor. После каждой проекции перечитываем исходную таблицу целиком; финальные6ячеек и5/1050/400 неизменны. Своя форма принимает только полный проверенный scalar пакет, после исключения не повторяет и не применяет policy.
Как проверить результат
Ожидаемый будущий ручной результат: исходные5/1050/400; собственные A1050/5 при обеих доступных альтернативах и выборе индекса0, B400/5 при единственной альтернативе с индексом1, Cfalse. Сумма цен400 — не сумма счета; товары3×250 и2×150 сохраняют сумму1050.
Native policy complete snapshot: Object resolves to own MD; AccessFields2=[Цена85,Сумма85]; LoggedFields2=[[Сумма85,Цена85],Количество85]; оба альтернативных значения String, nested Count2 и порядок проверены до использования и после каждого consumer шага.
Ни УстановитьИспользованиеСобытияЖурналаРегистрации, ни ЗаписьЖурналаРегистрации, ни запрос/запись документа не вызываются. OR и scalar preview принадлежат этому уроку; native registrar runtime/data/event trigger не проверялись и не обещаются.
Ожидаемый результат
Ожидаемый будущий ручной протокол собственного consumer: восемь скаляров5,1050,400,1050,400,5,5,Ложь. Новый native descriptor и исходные данные полностью проверены, активное журналирование не изменено этим кодом. В1С этот протокол здесь не выполнялся.
На что обратить внимание
У ctor149 String необязателен, однако урок передает ровно один настоящий native FullName. Нулевые варианты ctor149/194 пересекаются по арности: не выбирайте перегрузку по одному имени класса или по0args.
Object — не неизвестный исходный объект, а String полного имени существующих собственных метаданных; lookup и identity проверяются. Массивы получены из собственного нового descriptor либо созданы здесь; все вложенные элементы проверяются целиком, не только Count.
ПоляДоступа определены справкой как поля, использование которых в запросе включает регистрацию. Урок не выполняет запросы и не устанавливает policy; его явно заданный OR не является утверждением о полной внутренней логике триггеров платформы.
LoggedFields описывает поля и альтернативные ключи native события. Наш consumer читает эту структуру и суммирует собственные memory колонки для обучения, но это не реальное Данные.Данные журнала и не тест регистрации событий1С.
RW массивы и частичные назначения не атомарны. После любой ошибки нет слепого rollback/retry или продолжения. Никакие чужие descriptor, системные политики, пользовательские данные, настройки журналирования или рабочие конфигурации не затрагиваются.
Пример не запускался в вашей базе. Перед применением проверьте его в указанном учебном контексте.