1С 8.3 БСП ПрочитатьСобытияЖурналаРегистрации - Программист 1С Минск. Автоматизация бизнеса.

Популярные страницы:
Перейти к контенту

1С 8.3 БСП ПрочитатьСобытияЖурналаРегистрации

Данные > Примеры кода 1С > 1С 8.3 БСП > Журнал регистрации
1С 8.3 БСП ПрочитатьСобытияЖурналаРегистрации. Процедура чтения сообщений в журнале регистрации.
Официальная документация ИТС по функционалу (данная процедура не документирована)
Примера кода
&НаСервере
Функция ПолучитьПараметрыОтчета()

   ОтборЖР = Новый Структура("ДатаНачала, ДатаОкончания");

   ОтборЖР.ДатаНачала       = НачалоДня(ТекущаяДата());
   ОтборЖР.ДатаОкончания = КонецДня(ТекущаяДата());

   Результат = Новый Структура;
   Результат.Вставить("ОтборЖурналаРегистрации", ОтборЖР);
   Результат.Вставить("КоличествоПоказываемыхСобытий", 2000);
   Результат.Вставить("УникальныйИдентификатор", УникальныйИдентификатор);
   Результат.Вставить("МенеджерВладельца", Обработки.ЖурналРегистрации);
   Результат.Вставить("ДобавлятьДополнительныеКолонки", Ложь);
   //Результат.Вставить("Журнал", РеквизитФормыВЗначение("Журнал"));

   Возврат Результат;

КонецФункции

&НаСервере
Процедура СобытияЖурнала()

   Отчет = ПолучитьПараметрыОтчета();

   Выполнение = ДлительныеОперации.ПараметрыВыполненияВФоне(УникальныйИдентификатор);
   Выполнение.ОжидатьЗавершение = 0;
   Выполнение.НаименованиеФоновогоЗадания = НСтр("ru = 'Обновление журнала регистрации'");

   Результат = ДлительныеОперации.ВыполнитьВФоне("ЖурналРегистрации.ПрочитатьСобытияЖурналаРегистрации", Отчет, Выполнение);

   СтруктураЗаписейЖурнала = ПолучитьИЗВременногоХранилища(Результат.АдресРезультата);

КонецПроцедуры
Типовая процедура БСП
// Выполняет чтение событий журнала регистрации в соответствии с установленным отбором.
//
// Параметры:
//
//     ПараметрыОтчета - Структура - содержит параметры для чтения событий журнала регистрации. Содержит поля:
//      *  Журнал                  - ТаблицаЗначений         - содержит записи журнала регистрации.
//      *  ОтборЖурналаРегистрации   - Структура             - настройки отбора для чтения записей журнала регистрации:
//          ** ДатаНачала - Дата - дата начала событий (опционально).
//          ** ДатаОкончания - Дата - дата окончания событий (опционально).
//      *  КоличествоСобытий       - Число                   - ограничение числа считываемых событий журнала.
//      *  УникальныйИдентификатор - УникальныйИдентификатор - уникальный идентификатор формы.
//      *  МенеджерВладельца       - Произвольный            - менеджер объекта, в форме которого отображается журнал
//                                                             регистрации, необходим для обратного вызова функций
//                                                             оформления.
//      *  ДобавлятьДополнительныеКолонки - Булево           - определяет необходимость обратного вызова для добавления
//                                                             дополнительных колонок.
//     АдресХранилища - Строка
//                    - УникальныйИдентификатор - адрес временного хранилища для результата.
//
// Результат представляет собой структуру с полями:
//     СобытияЖурнала - ТаблицаЗначений - Отобранные события.
//
Процедура ПрочитатьСобытияЖурналаРегистрации(ПараметрыОтчета, АдресХранилища) Экспорт

   ОтборЖурналаНаКлиенте          = ПараметрыОтчета.ОтборЖурналаРегистрации;
   КоличествоСобытий              = ПараметрыОтчета.КоличествоПоказываемыхСобытий;
   МенеджерВладельца              = ПараметрыОтчета.МенеджерВладельца;
   ДобавлятьДополнительныеКолонки = ПараметрыОтчета.ДобавлятьДополнительныеКолонки;

   // Проверяем параметры на корректность.
   ДатаНачала    = Неопределено;
   ДатаОкончания = Неопределено;
   ДатыОтбораУказаны = ОтборЖурналаНаКлиенте.Свойство("ДатаНачала", ДатаНачала) И ОтборЖурналаНаКлиенте.Свойство("ДатаОкончания", ДатаОкончания)
   И ЗначениеЗаполнено(ДатаНачала) И ЗначениеЗаполнено(ОтборЖурналаНаКлиенте.ДатаОкончания);

   Если ДатыОтбораУказаны И ДатаНачала > ДатаОкончания Тогда
       ВызватьИсключение НСтр("ru = 'Некорректно заданы условия отбора журнала регистрации. Дата начала больше даты окончания.'");
   КонецЕсли;
   СмещениеВремениСервера = СмещениеВремениСервера();

   // Подготовка отбора
   Отбор = Новый Структура;
   Для Каждого ЭлементОтбора Из ОтборЖурналаНаКлиенте Цикл
       Отбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение);
   КонецЦикла;
   ПреобразованиеОтбора(Отбор, СмещениеВремениСервера);

   // Выгрузка отбираемых событий и формирование структуры таблицы.
   СобытияЖурнала = Новый ТаблицаЗначений;
   ВыгрузитьЖурналРегистрации(СобытияЖурнала, Отбор, , , КоличествоСобытий);

   СобытияЖурнала.Колонки.Дата.Имя = "ДатаНаСервере";
   СобытияЖурнала.Колонки.Добавить("Дата", Новый ОписаниеТипов("Дата"));

   СобытияЖурнала.Колонки.Добавить("НомерРисунка", Новый ОписаниеТипов("Число"));
   СобытияЖурнала.Колонки.Добавить("АдресДанных",  Новый ОписаниеТипов("Строка"));

   Если ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
       СобытияЖурнала.Колонки.Добавить("РазделениеДанныхСеанса", Новый ОписаниеТипов("Строка"));
       СобытияЖурнала.Колонки.Добавить("ПредставлениеРазделенияДанныхСеанса", Новый ОписаниеТипов("Строка"));
   КонецЕсли;

   Если ДобавлятьДополнительныеКолонки Тогда
       МенеджерВладельца.ДобавитьДополнительныеКолонкиСобытия(СобытияЖурнала);
   КонецЕсли;

   Если ОбщегоНазначения.РазделениеВключено()
       И ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных()
       И ОбщегоНазначения.ПодсистемаСуществует("ТехнологияСервиса.БазоваяФункциональность") Тогда

       МодульРаботаВМоделиСервиса = ОбщегоНазначения.ОбщийМодуль("РаботаВМоделиСервиса");
       ПсевдонимыПользователей    = Новый Соответствие();
   Иначе
       МодульРаботаВМоделиСервиса = Неопределено;
       ПсевдонимыПользователей    = Неопределено;
   КонецЕсли;

   Для Каждого СобытиеЖурнала Из СобытияЖурнала Цикл
       СобытиеЖурнала.Дата = СобытиеЖурнала.ДатаНаСервере - СмещениеВремениСервера;

       // Заполнение номеров картинок строк.
       МенеджерВладельца.УстановитьНомерРисунка(СобытиеЖурнала);

       Если ДобавлятьДополнительныеКолонки Тогда
           // Заполнение дополнительных полей, определенных только у владельца.
           МенеджерВладельца.ЗаполнитьДополнительныеКолонкиСобытия(СобытиеЖурнала);
       КонецЕсли;

       // Преобразование массива метаданных в список значений.
       СписокПредставленийМетаданных = Новый СписокЗначений;
       Если ТипЗнч(СобытиеЖурнала.ПредставлениеМетаданных) = Тип("Массив") Тогда
           СписокПредставленийМетаданных.ЗагрузитьЗначения(СобытиеЖурнала.ПредставлениеМетаданных);
           СобытиеЖурнала.ПредставлениеМетаданных = СписокПредставленийМетаданных;
       Иначе
           СобытиеЖурнала.ПредставлениеМетаданных = Строка(СобытиеЖурнала.ПредставлениеМетаданных);
       КонецЕсли;

       // Преобразование массива "ПредставлениеРазделенияДанныхСеанса" в список значений.
       Если ОбщегоНазначения.РазделениеВключено()
           И Не ОбщегоНазначения.ДоступноИспользованиеРазделенныхДанных() Тогда
           ПолноеПредставлениеРазделенияДанныхСеанса = "";

           РазделениеДанныхСеанса = СобытиеЖурнала.РазделениеДанныхСеанса;
           СписокРеквизитовРазделенияДанных = Новый СписокЗначений;
           Для Каждого РазделительСеанса Из РазделениеДанныхСеанса Цикл
               ПредставлениеРазделителя = Метаданные.ОбщиеРеквизиты.Найти(РазделительСеанса.Ключ).Синоним;
               ПредставлениеРазделителя = ПредставлениеРазделителя + " = " + РазделительСеанса.Значение;
               ЗначениеРазделителя = РазделительСеанса.Ключ + "=" + РазделительСеанса.Значение;
               СписокРеквизитовРазделенияДанных.Добавить(ЗначениеРазделителя, ПредставлениеРазделителя);
               ПолноеПредставлениеРазделенияДанныхСеанса = ?(Не ПустаяСтрока(ПолноеПредставлениеРазделенияДанныхСеанса),
               ПолноеПредставлениеРазделенияДанныхСеанса + "; ", "")
               + ПредставлениеРазделителя;
           КонецЦикла;
           СобытиеЖурнала.РазделениеДанныхСеанса = СписокРеквизитовРазделенияДанных;
           СобытиеЖурнала.ПредставлениеРазделенияДанныхСеанса = ПолноеПредставлениеРазделенияДанныхСеанса;
       КонецЕсли;

       // Обработка данных специальных событий.
       Если СобытиеЖурнала.Событие = "_$Access$_.Access" Тогда
           УстановитьСтрокуАдресаДанных(СобытиеЖурнала);

           Если СобытиеЖурнала.Данные <> Неопределено Тогда
               СобытиеЖурнала.Данные = ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", "...");
           КонецЕсли;

       ИначеЕсли СобытиеЖурнала.Событие = "_$Access$_.AccessDenied" Тогда
           УстановитьСтрокуАдресаДанных(СобытиеЖурнала);

           Если СобытиеЖурнала.Данные <> Неопределено Тогда
               Если СобытиеЖурнала.Данные.Свойство("Право") Тогда
                   СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                   НСтр("ru = 'Право: %1'"),
                   СобытиеЖурнала.Данные.Право);
               Иначе
                   ДанныеЖурнала = СобытиеЖурнала.Данные; // Структура
                   СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(
                   НСтр("ru = 'Действие: %1%2'"),
                   ДанныеЖурнала.Действие, ?(СобытиеЖурнала.Данные.Данные = Неопределено, "", ", ...") );
               КонецЕсли;
           КонецЕсли;

       ИначеЕсли СобытиеЖурнала.Событие = "_$Session$_.Authentication"
           Или СобытиеЖурнала.Событие = "_$Session$_.AuthenticationError" Тогда

           УстановитьСтрокуАдресаДанных(СобытиеЖурнала);

           СобытиеЖурналаДанные = "";
           Если СобытиеЖурнала.Данные <> Неопределено Тогда
               Для Каждого КлючИЗначение Из СобытиеЖурнала.Данные Цикл
                   Если ЗначениеЗаполнено(СобытиеЖурналаДанные) Тогда
                       СобытиеЖурналаДанные = СобытиеЖурналаДанные + ", ...";
                       Прервать;
                   КонецЕсли;
                   СобытиеЖурналаДанные = КлючИЗначение.Ключ + ": " + КлючИЗначение.Значение;
               КонецЦикла;
           КонецЕсли;
           СобытиеЖурнала.Данные = СобытиеЖурналаДанные;

       ИначеЕсли СобытиеЖурнала.Событие = "_$User$_.Delete" Тогда
           УстановитьСтрокуАдресаДанных(СобытиеЖурнала);

           СобытиеЖурналаДанные = "";
           Если СобытиеЖурнала.Данные <> Неопределено Тогда
               Для Каждого КлючИЗначение Из СобытиеЖурнала.Данные Цикл
                   СобытиеЖурналаДанные = КлючИЗначение.Ключ + ": " + КлючИЗначение.Значение;
                   Прервать;
               КонецЦикла;
           КонецЕсли;
           СобытиеЖурнала.Данные = СобытиеЖурналаДанные;

       ИначеЕсли СобытиеЖурнала.Событие = "_$User$_.New"
           Или СобытиеЖурнала.Событие = "_$User$_.Update" Тогда
           УстановитьСтрокуАдресаДанных(СобытиеЖурнала);

           ИмяПользователяИБ = "";
           Если СобытиеЖурнала.Данные <> Неопределено Тогда
               СобытиеЖурнала.Данные.Свойство("Имя", ИмяПользователяИБ);
           КонецЕсли;
           СобытиеЖурнала.Данные = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Имя: %1, ...'"), ИмяПользователяИБ);

       КонецЕсли;

       УстановитьПривилегированныйРежим(Истина);
       // Уточнение имени пользователя.
       Если СобытиеЖурнала.Пользователь = Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000") Тогда
           СобытиеЖурнала.ИмяПользователя = НСтр("ru = ''");

       ИначеЕсли СобытиеЖурнала.ИмяПользователя = "" Тогда
           СобытиеЖурнала.ИмяПользователя = Пользователи.ПолноеИмяНеУказанногоПользователя();

       ИначеЕсли ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь) = Неопределено Тогда
           СобытиеЖурнала.ИмяПользователя = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = '%1 '"), СобытиеЖурнала.ИмяПользователя);
       КонецЕсли;

       Если МодульРаботаВМоделиСервиса <> Неопределено Тогда
           Если ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь) = Неопределено Тогда
               ПсевдонимПользователя = МодульРаботаВМоделиСервиса.ПсевдонимПользователяИнформационнойБазы(СобытиеЖурнала.Пользователь);
               ПсевдонимыПользователей.Вставить(СобытиеЖурнала.Пользователь, ПсевдонимПользователя);
           Иначе
               ПсевдонимПользователя = ПсевдонимыПользователей.Получить(СобытиеЖурнала.Пользователь);
           КонецЕсли;

           Если ЗначениеЗаполнено(ПсевдонимПользователя) Тогда
               СобытиеЖурнала.ИмяПользователя = ПсевдонимПользователя;
           КонецЕсли;
       КонецЕсли;

       // Преобразование идентификатора в имя для использования в дальнейшем при установке отборе.
       ПользовательИБ = ПользователиИнформационнойБазы.НайтиПоУникальномуИдентификатору(СобытиеЖурнала.Пользователь);
       Если ПользовательИБ <> Неопределено Тогда
           СобытиеЖурнала.Пользователь = ПользовательИБ.Имя;
       КонецЕсли;
       УстановитьПривилегированныйРежим(Ложь);
   КонецЦикла;

   // Успешное завершение
   Результат = Новый Структура;
   Результат.Вставить("СобытияЖурнала", СобытияЖурнала);

   ПоместитьВоВременноеХранилище(Результат, АдресХранилища);
КонецПроцедуры
// Автор библиотеки: ООО "1С-Софт". Все права защищены © 2021
// Типовая конфигурация Библиотека стандартных подсистем (далее - БСП)
// Код БСП распространяется по лицензии Attribution 4.0 International (CC BY 4.0):
// ссылка на лицензию: https://creativecommons.org/licenses/by/4.0/legalcode
Поиск кода
0
Комментарии
____________________
Copyright©, «Программист 1С в г.Минске», 16.06.2021
Перепечатка текста и фотографий разрешена при наличии прямой ссылки на источник
Назад к содержимому