ОписаниеИспользованияСобытияДоступЖурналаРегистрации.ПоляРегистрации

Свойства · LoggedFields

Тип: Массив. Поля, которые в случае участия их в результате выборки запроса будут выведены в таблицу значений (поле Данные.Данные события журнала регистрации). Поля регистрации задаются массивом, элементом которого является либо строка - имя поля, либо массив строк - имен полей. Первый уровень массива определяет набор ключевых полей, которые будут зарегистрированы. Если элементом массива является массив строк, то в этом массиве описываются альтернативные ключевые поля. В случае возможности вывода нескольких альтернативных ключевых полей выводится поле с меньшим индексом.

Полное описание, параметры и ограничения

ОписаниеИспользованияСобытияДоступЖурналаРегистрации.ПоляРегистрации (EventLogAccessEventUseDescription.LoggedFields)

ОписаниеИспользованияСобытияДоступЖурналаРегистрации (EventLogAccessEventUseDescription)

ПоляРегистрации (LoggedFields)

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

Использование:
Чтение и запись.
Описание:
Тип: Массив.
Поля, которые в случае участия их в результате выборки запроса будут выведены в таблицу значений (поле Данные.Данные события журнала регистрации).
Поля регистрации задаются массивом, элементом которого является либо строка - имя поля, либо массив строк - имен полей. Первый уровень массива определяет набор ключевых полей, которые будут зарегистрированы.
Если элементом массива является массив строк, то в этом массиве описываются альтернативные ключевые поля.
В случае возможности вывода нескольких альтернативных ключевых полей выводится поле с меньшим индексом.
Доступность:

Сервер, толстый клиент, внешнее соединение.

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

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

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

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

Спроектировать аудит в памяти: реальные массивы политики и свой предпросмотр1050/400

Создаем настоящий descriptor для своих реальных метаданных, проверяем каждый элемент его вложенных массивов и используем их только в собственном offline consumer. Счет5/1050 неизменен; журналирование не включается.

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

Платформа8.5.1.1343; серверный общий модуль своей новой File CF; толстая управляемая форма показывает скаляры. Runtime1C/CF/UI не выполнялись.

Подготовка

  1. Задача: безопасно спроектировать описание аудита и понять различие суммы счета1050 и суммы цен400. Мы создаем новый настоящий descriptor и собственную ТаблицуЗначений в памяти, не устанавливаем использование события журнала. Описания полей читаются нашим отдельным consumer предпросмотра; его OR и результат1050/400 НЕ доказывают native query trigger или содержание реального лога1С.

  2. Вручную создайте НОВУЮ пустую файловую CF только C:\1c-labs\OwnAccessAuditPlan85_6f42ea37-93da-4c98-a5d1-17f57bd178c2\IB. Имя конфигурации УчебныйПредпросмотрАудита85, РежимСовместимостиНеИспользовать, основное приложениеУправляемоеПриложение. Windows8.5.1.1343, толстый управляемый клиент. UUID в папке — маркер лаборатории, не UUID информационной базы. Нужна точная строка регистрации File="путь"; иной формат/суффикс/каталог отказует, fuzzy fallback нет.

  3. Документы→Добавить УчебнаяНакладная85. Добавьте ровно три собственных реквизита Количество85, Цена85, Сумма85; все Число, длина15, точность2, не составной тип. Табличных частей, движений, проведения, модулей документа, подписок и форм документа для этой задачи не требуется. Это только реальное описание метаданных: документы не создавайте и не записывайте. Общий модуль проверяет ПолноеИмя, Count3 и тип каждого реквизита до native конструктора.

  4. Не добавляйте справочники, регистры и расширения. Создайте свою роль Аудит85Администратор с полными правами только этой новой CF, включая администрирование для ПолучитьПользователей. Создайте единственного собственного пользователя Аудит85Ученик и назначьте роль. Проверяются Users.Count1 и настоящий UUID текущего пользователя. Код не создает пользователей и не меняет роли; рабочие конфигурации исключены точными guards. Эти действия здесь не выполнялись.

  5. Общие→ОбщиеМодули→ПланАудитаПамять85: СерверДа, оба клиентских контекстаНет, ГлобальныйНет, ВызовСервераНет, ПривилегированныйНет. Вставьте весь CODE. В нем только одна экспортная функция без аргументов; helper функции закрыты внутри модуля и получают только созданные здесь собственные объекты.

  6. Общие→ОбщиеФормы→ПредпросмотрАудита85, управляемая форма. Добавьте Количество85, Сумма85, СуммаЦен85, ИтогA85, ИтогB85, КоличествоA85, КоличествоB85 — Число, длина15, точность2; ВыбранC85, Остановка85, Завершено85 — Булево с начальным значениемЛожь; Протокол85 — Строка неограниченной длины. Выведите семь чисел, ВыбранC85 и многострочный Протокол85 только для просмотра. Флаги остановки/завершения пользователю не выводите.

  7. В форме создайте единственную команду Предпросмотр85, Действие→Предпросмотр85(Команда). Добавьте кнопку с Команда=Предпросмотр85 на командную панель. Вставьте полный supporting module ПредпросмотрАудита85, включая server процедуру. Конфигурация→Открыть модуль управляемого приложения: вставьте supporting module УправляемоеПриложение. Штатное startup событие без аргументов открывает только свою новую форму, не вызывайте callback вручную.

  8. Правила НАШЕГО предпросмотра заданы явно: ownOR выбирает проекцию, если в ней есть хотя бы одно имя из ПоляДоступа=[Цена85,Сумма85]. ПоляРегистрации=[[Сумма85,Цена85],Количество85]: собственный consumer берет первую имеющуюся альтернативу по наименьшему индексу и отдельно количество. A содержит Количество85/Сумма85/Цена85, поэтому доступны ОБЕ альтернативы и выбирается Сумма85 с индексом0; B содержит Количество85/Цена85, поэтому выбирается Цена85 с индексом1; C содержит только Количество85 и не выбирается. Числа рассчитываются реальными native Итог по новым memory копиям, не подставляются как результат логирования.

  9. Вручную обновите только новую учебную конфигурацию и запустите своего пользователя в толстом управляемом клиенте. Нажмите Предпросмотр85 один раз. После успеха или ошибки повтор запрещен. При отказе изучите собственный отладчик; нет retry, продолжения после исключения или слепого восстановления частичного memory плана. Новый ручной протокол начинайте новым собственным клиентом, не изменением журналирования.

  10. Здесь созданы и статически проверены только тексты/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";
#КонецЕсли
КонецПроцедуры

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

  1. Проверяем точный свой File/user/version/NoUse и реальные метаданные документа с тремя числовыми полями. Получаем native FullName и передаем его как один String в ctor149; ctor194 без аргументов не используется и не кредитуется.

  2. У нового descriptor проверяем настоящий класс, ObjectString→реальный metadata lookup и оба пустых native массива. Создаем свои массивы доступа и регистрации, включая настоящий вложенный массив альтернатив; назначаем RW свойства, затем полностью перечитываем типы, длины, все четыре строки и их порядок.

  3. Создаем две строки собственного счета в ТаблицеЗначений; типы колонок берем из реальных метаданных. Перечитываем все шесть ячеек и вычисляем native итоги5/1050/400. Это независимые memory данные, не записи документа или результаты запроса к ИБ.

  4. Создаем три новые проекции через native Скопировать с пустым первым слотом и явными колонками. В A доступны ОБЕ альтернативы: НАШ consumer выбирает Сумма85 с индексом0, а не Цена85 с индексом1. В B доступна только Цена85, поэтому выбирается индекс1; C отклоняется нашим OR. Имена альтернатив и количество читаются из реальных native массивов. Native Итог возвращает A1050/5 и B400/5; C возвращает собственный false/empty/0, не прогноз записи1С.

  5. Перед и после каждого предпросмотра полностью проверяем descriptor. После каждой проекции перечитываем исходную таблицу целиком; финальные6ячеек и5/1050/400 неизменны. Своя форма принимает только полный проверенный scalar пакет, после исключения не повторяет и не применяет policy.

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

  1. Ожидаемый будущий ручной результат: исходные5/1050/400; собственные A1050/5 при обеих доступных альтернативах и выборе индекса0, B400/5 при единственной альтернативе с индексом1, Cfalse. Сумма цен400 — не сумма счета; товары3×250 и2×150 сохраняют сумму1050.

  2. Native policy complete snapshot: Object resolves to own MD; AccessFields2=[Цена85,Сумма85]; LoggedFields2=[[Сумма85,Цена85],Количество85]; оба альтернативных значения String, nested Count2 и порядок проверены до использования и после каждого consumer шага.

  3. Ни УстановитьИспользованиеСобытияЖурналаРегистрации, ни ЗаписьЖурналаРегистрации, ни запрос/запись документа не вызываются. OR и scalar preview принадлежат этому уроку; native registrar runtime/data/event trigger не проверялись и не обещаются.

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

Ожидаемый будущий ручной протокол собственного consumer: восемь скаляров5,1050,400,1050,400,5,5,Ложь. Новый native descriptor и исходные данные полностью проверены, активное журналирование не изменено этим кодом. В1С этот протокол здесь не выполнялся.

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

  1. У ctor149 String необязателен, однако урок передает ровно один настоящий native FullName. Нулевые варианты ctor149/194 пересекаются по арности: не выбирайте перегрузку по одному имени класса или по0args.

  2. Object — не неизвестный исходный объект, а String полного имени существующих собственных метаданных; lookup и identity проверяются. Массивы получены из собственного нового descriptor либо созданы здесь; все вложенные элементы проверяются целиком, не только Count.

  3. ПоляДоступа определены справкой как поля, использование которых в запросе включает регистрацию. Урок не выполняет запросы и не устанавливает policy; его явно заданный OR не является утверждением о полной внутренней логике триггеров платформы.

  4. LoggedFields описывает поля и альтернативные ключи native события. Наш consumer читает эту структуру и суммирует собственные memory колонки для обучения, но это не реальное Данные.Данные журнала и не тест регистрации событий1С.

  5. RW массивы и частичные назначения не атомарны. После любой ошибки нет слепого rollback/retry или продолжения. Никакие чужие descriptor, системные политики, пользовательские данные, настройки журналирования или рабочие конфигурации не затрагиваются.

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

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

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

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

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