#Если Сервер Или ВнешнееСоединение Или ТолстыйКлиентОбычноеПриложение Тогда Перем СловарьАнглийскихИменСвойств; #Область ПрограммныйИнтерфейс Функция СведенияОВнешнейОбработке() Экспорт ПараметрыРегистрации = ДополнительныеОтчетыИОбработки.СведенияОВнешнейОбработке(); ПараметрыРегистрации.Вид = ДополнительныеОтчетыИОбработкиКлиентСервер.ВидОбработкиДополнительнаяОбработка(); ПараметрыРегистрации.Версия = "0.0.0.8"; ПараметрыРегистрации.БезопасныйРежим = Ложь; // Для регламентного задания. НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = Метаданные().Представление(); НоваяКоманда.Идентификатор = Метаданные().Имя; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); НоваяКоманда.ПоказыватьОповещение = Ложь; // Для регламентного задания. НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = "Удаление старых файлов"; НоваяКоманда.Идентификатор = "УдалениеСтарыхФайлов"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыВызовСерверногоМетода(); НоваяКоманда.ПоказыватьОповещение = Ложь; // Для ручной выгрузки. НоваяКоманда = ПараметрыРегистрации.Команды.Добавить(); НоваяКоманда.Представление = Метаданные().Представление() + НСтр("en = ' (manual)'; ru = ' (ручная)'"); НоваяКоманда.Идентификатор = Метаданные().Имя + "Ручная"; НоваяКоманда.Использование = ДополнительныеОтчетыИОбработкиКлиентСервер.ТипКомандыОткрытиеФормы(); НоваяКоманда.ПоказыватьОповещение = Ложь; Возврат ПараметрыРегистрации; КонецФункции Процедура ВыполнитьКоманду(Команда = "") Экспорт Если Команда = Метаданные().Имя Тогда ВыполнитьВыгрузку(); ИначеЕсли Команда = "УдалениеСтарыхФайлов" Тогда ВыполнитьУдалениеФайлов(); КонецЕсли; КонецПроцедуры Процедура ВыполнитьВыгрузку() Экспорт СтруктураПараметров = ПолучитьПараметрыВыгрузки(Истина); ДатаПоследнейВыгрузки = СтруктураПараметров.ДатаВыгрузки; ИнтервалВыгрузкиВМинутах = СтруктураПараметров.ИнтервалВыгрузкиВМинутах; ДатаВыгрузки = ДатаПоследнейВыгрузки; // например, (10:10:00) ДатаОкончания = ДатаВыгрузки + (ИнтервалВыгрузкиВМинутах * 60) - 1; // например, (10:19:59) //! НДН - Начало блока, 2022-08-30 04:35:53 1CERP-69424 // Дата окончания это дата сеанса, к текущей дате она будет приводиться позже //ПределВыгрузки = ТекущаяДата(); ПределВыгрузки = ТекущаяДатаСеанса(); //! НДН - Конец блока, 2022-08-30 04:35:53 Пока ДатаОкончания < ПределВыгрузки Цикл РезультатВыгрузки = ВыгрузитьЗаПериод(ДатаВыгрузки, ДатаОкончания, СтруктураПараметров); Если Не РезультатВыгрузки.Успешно Тогда ЗаписьЖурналаРегистрации("Роботы.Выгрузка журнала регистрации для ИБ 2.0", УровеньЖурналаРегистрации.Ошибка , , , РезультатВыгрузки.ОписаниеОшибки); Прервать; КонецЕсли; ДатаВыгрузки = ДатаОкончания + 1; ДатаОкончания = ДатаВыгрузки + ИнтервалВыгрузкиВМинутах * 60 - 1; КонецЦикла; Если ДатаВыгрузки <> ДатаПоследнейВыгрузки Тогда ХранилищеОбщихНастроек.Сохранить("НастройкиИБ20", "ДатаВыгрузки", ДатаВыгрузки, , "PT"); КонецЕсли; КонецПроцедуры Процедура ВыполнитьУдалениеФайлов() Экспорт ПараметрыВыгрузки = ПолучитьПараметрыВыгрузки(Истина); ИнтервалУдаленияВЧасах = ПараметрыВыгрузки.ИнтервалУдаленияВЧасах; ПределВыгрузки = ТекущаяДата(); ГраницаУдаления = ПределВыгрузки - ИнтервалУдаленияВЧасах * 60 * 60; ДиректорияДляХраненияФайлов = ПараметрыВыгрузки.ДиректорияДляХраненияФайлов;//"D:\temp\"; ФайлыКУдалению = ФайлыЖурналаКУдалению(ГраницаУдаления, ДиректорияДляХраненияФайлов); УдалитьСтарыеФайлы(ФайлыКУдалению, ДиректорияДляХраненияФайлов); КонецПроцедуры #КонецОбласти #Область СлужебныйПрограммныйИнтерфейс Функция ПолучитьПараметрыВыгрузки(СообщатьОбОшибке = Ложь) Экспорт ДатаВыгрузки = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиИБ20", "ДатаВыгрузки", '00010101', , "PT"); Если СообщатьОбОшибке И Не ЗначениеЗаполнено(ДатаВыгрузки) Тогда Инфо = НСтр("en = 'The date of the last unloading is not filled in'; ru = 'Не заполнена дата последней выгрузки'"); ЗаписьЖурналаРегистрации("Роботы.Настройки выгрузки Журнала для ИБ 2.0", УровеньЖурналаРегистрации.Ошибка, , , Инфо); ВызватьИсключение Инфо; КонецЕсли; ДиректорияДляХраненияФайлов = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиИБ20", "ДиректорияДляХраненияФайлов", "", , "PT"); Если СообщатьОбОшибке И Не ЗначениеЗаполнено(ДиректорияДляХраненияФайлов) Тогда Инфо = НСтр("en = 'The directory for storing files is not filled'; ru = 'Не заполнена Директория для хранения файлов'"); ЗаписьЖурналаРегистрации("Роботы.Настройки выгрузки Журнала для ИБ 2.0", УровеньЖурналаРегистрации.Ошибка, , , Инфо); ВызватьИсключение Инфо; КонецЕсли; ИнтервалВыгрузкиВМинутах = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиИБ20", "ИнтервалВыгрузкиВМинутах", 0, , "PT"); Если СообщатьОбОшибке И Не ЗначениеЗаполнено(ИнтервалВыгрузкиВМинутах) Тогда Инфо = НСтр("en = 'Unloading interval not filled'; ru = 'Не заполнен инервал выгрузки в минутах'"); ЗаписьЖурналаРегистрации("Роботы.Настройки выгрузки Журнала для ИБ 2.0", УровеньЖурналаРегистрации.Ошибка, , , Инфо); ВызватьИсключение Инфо; КонецЕсли; ИнтервалУдаленияВЧасах = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиИБ20", "ИнтервалУдаленияВЧасах", 0, , "PT"); Если СообщатьОбОшибке И Не ЗначениеЗаполнено(ИнтервалУдаленияВЧасах) Тогда Инфо = НСтр("en = 'Delete interval not filled'; ru = 'Не заполнена интервал удаления в часах'"); ЗаписьЖурналаРегистрации("Роботы.Настройки выгрузки Журнала для ИБ 2.0", УровеньЖурналаРегистрации.Ошибка, , , Инфо); ВызватьИсключение Инфо; КонецЕсли; ОтборыЖурнала = ОбщегоНазначения.ХранилищеОбщихНастроекЗагрузить("НастройкиИБ20", "ОтборыЖурнала", Новый СписокЗначений, , "PT"); Если СообщатьОбОшибке И ОтборыЖурнала.Количество() = 0 Тогда Инфо = НСтр("en = 'Journal selections not completed'; ru = 'Не заполнены отборы журнала'"); ЗаписьЖурналаРегистрации("Роботы.Настройки выгрузки Журнала для ИБ 2.0", УровеньЖурналаРегистрации.Ошибка, , , Инфо); ВызватьИсключение Инфо; КонецЕсли; СтруктураПараметров = Новый Структура("ДатаВыгрузки, ДиректорияДляХраненияФайлов,ИнтервалВыгрузкиВМинутах,ИнтервалУдаленияВЧасах,ОтборыЖурнала", ДатаВыгрузки, ДиректорияДляХраненияФайлов,ИнтервалВыгрузкиВМинутах,ИнтервалУдаленияВЧасах, ОтборыЖурнала); Возврат СтруктураПараметров; КонецФункции Процедура СохранитьПараметрыВыгрузки(СтруктураПараметров) Экспорт ХранилищеОбщихНастроек.Сохранить("НастройкиИБ20", "ДатаВыгрузки", СтруктураПараметров.ДатаВыгрузки, , "PT"); ХранилищеОбщихНастроек.Сохранить("НастройкиИБ20", "ДиректорияДляХраненияФайлов", СтруктураПараметров.ДиректорияДляХраненияФайлов, , "PT"); ХранилищеОбщихНастроек.Сохранить("НастройкиИБ20", "ИнтервалВыгрузкиВМинутах", СтруктураПараметров.ИнтервалВыгрузкиВМинутах, , "PT"); ХранилищеОбщихНастроек.Сохранить("НастройкиИБ20", "ИнтервалУдаленияВЧасах", СтруктураПараметров.ИнтервалУдаленияВЧасах, , "PT"); ХранилищеОбщихНастроек.Сохранить("НастройкиИБ20", "ОтборыЖурнала", СтруктураПараметров.ОтборыЖурнала, , "PT"); КонецПроцедуры #КонецОбласти #Область СлужебныеПроцедурыИФункции Функция ВыгрузитьЗаПериод(НачалоПериода, КонецПериода, ПараметрыВыгрузки) ИмяИБ = ПолучитьИмяИБ(); ДанныеДляВыгрузки = СобратьДанные(НачалоПериода, КонецПериода, ИмяИБ, ПараметрыВыгрузки); МассивЗаписейЖурнала = Новый Массив; Поля = "Level,Date,ApplicationName,ApplicationPresentation,Event, |EventPresentation,User,UserName,Computer,Metadata,MetadataPresentation, |Comment,Data,DataPresentation,TransactionStatus,TransactionID,Connection, |Session,ServerName,Port,SyncPort,v8ibase,abc"; ЗаписьJSON = Новый ЗаписьJSON; ЗаписьJSON.УстановитьСтроку(Новый ПараметрыЗаписиJSON(ПереносСтрокJSON.Нет, Символы.Таб)); НастройкиСериализацииJSON = Новый НастройкиСериализацииJSON; НастройкиСериализацииJSON.ВариантЗаписиДаты = ВариантЗаписиДатыJSON.ЛокальнаяДатаСоСмещением;//.ЛокальнаяДата; НастройкиСериализацииJSON.ФорматСериализацииДаты = ФорматДатыJSON.ISO; Для Каждого ЗаписьЖурнала Из ДанныеДляВыгрузки Цикл СтруктураЗаписи = Новый Структура(Поля); ЗаполнитьЗначенияСвойств(СтруктураЗаписи, ЗаписьЖурнала); МассивЗаписейЖурнала.Добавить(Новый Структура("Event", СтруктураЗаписи)); КонецЦикла; // Если записей нет, то файл не должен создаваться. Если МассивЗаписейЖурнала.Количество() = 0 Тогда Результат = Новый Структура("Успешно,ОписаниеОшибки", Истина, ""); Возврат Результат; КонецЕсли; ЗаписатьJSON(ЗаписьJSON, МассивЗаписейЖурнала, НастройкиСериализацииJSON, "ПреобразованиеЗначенийJSON", РаботаВМоделиСервисаБТС); ТекстИзJSON = ЗаписьJSON.Закрыть(); ТекстИзJSON = СтрЗаменить(ТекстИзJSON, "},{", "}" + Символы.ПС + "{"); ТекстИзJSON = СтрЗаменить(ТекстИзJSON, "[{", "{"); ТекстИзJSON = СтрЗаменить(ТекстИзJSON, "}]", "}"); Результат = ЗаписатьФайлJSON(ТекстИзJSON, ИмяИБ, НачалоПериода, КонецПериода, ПараметрыВыгрузки); Возврат Результат; КонецФункции Функция ЗаписатьФайлJSON(ТекстИзJSON, ИмяИБ, НачалоПериода, КонецПериода, ПараметрыВыгрузки) ДиректорияДляХраненияФайлов = ПараметрыВыгрузки.ДиректорияДляХраненияФайлов; НачалоПериодаПредставление = формат(НачалоПериода, "ДФ=yyyyMMddHHmmss"); КонецПериодаПредставление = формат(КонецПериода, "ДФ=yyyyMMddHHmmss"); ИмяФайла = ДиректорияДляХраненияФайлов + ПолучитьРазделительПутиСервера() + ИмяИБ + "_" + сокрЛП(КонецПериодаПредставление) + ".json"; Результат = Новый Структура("Успешно,ОписаниеОшибки", Истина, ""); Попытка //ВызватьИсключение "Учебная тревога - отключили формирование файла"; ТекстДляЗаписи = Новый ТекстовыйДокумент; ТекстДляЗаписи.УстановитьТекст(ТекстИзJSON); ТекстДляЗаписи.Записать(ИмяФайла); Исключение Результат.Успешно = Ложь; Результат.ОписаниеОшибки = ОписаниеОшибки(); Возврат Результат; КонецПопытки; Возврат Результат; КонецФункции Процедура ОтправитьJSONвSIEM(ТекстИзJSON) // c этим блолком проблема- процедура не вызывается насколько я понял //ЗаписьJSON = Новый ЗаписьJSON; //ЗаписьJSON.УстановитьСтроку(); //ЗаписьJSON.ЗаписатьНачалоОбъекта(); // ЗаписьJSON.ЗаписатьИмяСвойства("Msg1"); // ЗаписьJSON.ЗаписатьЗначение("Helo from 1C"); // ЗаписьJSON.ЗаписатьИмяСвойства("Msg2"); // ЗаписьJSON.ЗаписатьЗначение("SIEM, be ready"); //ЗаписьJSON.ЗаписатьКонецОбъекта(); //СтрокаJSON= ЗаписьJSON.Закрыть(); //JSONОбъект.Вставить("ключ1", "Hello"); //JSONОбъект.Вставить("ключ2", "1C+SIEM"); //JSONСтрока = ЗаписатьJSON(JSONОбъект); //JSONСтрока = JSONОбъект.ВыполнитьJSON(); HTTPСоединение = Новый HTTPСоединение("172.24.91.20", 6000,,,,,,); //HTTPСоединение = Новый HTTPСоединение("172.24.91.20", 6000,,,,,ЗащищенноеСоединение,); //HTTPСоединение2 = Новый HTTPСоединение( // Указываем заголовки для запроса HTTPЗапрос = Новый HTTPЗапрос; HTTPЗапрос.АдресРесурса = "/"; HTTPЗапрос.УстановитьЗаголовок("Content-Type", "application/json"); HTTPЗапрос.УстановитьМетод("POST"); //HTTPЗапрос. HTTPЗапрос.УстановитьТелоИзСтроки(ТекстИзJSON, "UTF-8"); // Отправляем запрос методом POST // HTTPКлиент = Новый HTTPКлиент; //Ответ = HTTPКлиент.Отправить(HTTPЗапрос); HTTPОтвет = HTTPСоединение.Отправить(HTTPЗапрос); // Обрабатываем ответ Если HTTPОтвет.КодСостояния = 200 Тогда Сообщить("Запрос успешно выполнен. Ответ: " + HTTPОтвет.ПолучитьТелоКакСтроку()); Иначе Сообщить("Ошибка при выполнении запроса. Код: " + Строка(HTTPОтвет.КодСостояния)); КонецЕсли; КонецПроцедуры Функция СобратьДанные(НачалоПериода, КонецПериода, ИмяИБ, ПараметрыВыгрузки) Выгрузка = ПолучитьТаблицуВыгрузкиЖурналаРегистрации(); ЗаписиЖурнала = Новый ТаблицаЗначений; ОтборЖурналаНаКлиенте = ПараметрыВыгрузки.ОтборыЖурнала; СмещениеВремениСервера = СмещениеВремениСервера(); ОтборПоПериоду = Новый Структура("ДатаНачала, ДатаОкончания", НачалоПериода, КонецПериода); Для Каждого СтрокаОтбора Из ОтборЖурналаНаКлиенте Цикл // Подготовка отбора Отбор = Новый Структура; ТекущийОтбор = СтрокаОтбора.Значение.Получить(); Для Каждого ЭлементОтбора Из ТекущийОтбор Цикл Отбор.Вставить(ЭлементОтбора.Представление, ЭлементОтбора.Значение); КонецЦикла; Если Отбор.Свойство("ДатаНачала") Тогда Отбор.ДатаНачала = НачалоПериода; Иначе Отбор.Вставить("ДатаНачала", НачалоПериода); КонецЕсли; Если Отбор.Свойство("ДатаОкончания") Тогда Отбор.ДатаОкончания = КонецПериода; Иначе Отбор.Вставить("ДатаОкончания", КонецПериода); КонецЕсли; ПреобразованиеОтбора(Отбор, СмещениеВремениСервера); ВыгрузитьЖурналРегистрации(ЗаписиЖурнала, Отбор); Для Каждого ТекЗаписьЖурнала Из ЗаписиЖурнала Цикл ДобавитьЗаписьВыгрузкиЖурнала(Выгрузка, ТекЗаписьЖурнала, ИмяИБ); КонецЦикла; КонецЦикла; Выгрузка.Сортировать("Date"); Возврат Выгрузка; КонецФункции Функция ПолучитьТаблицуВыгрузкиЖурналаРегистрации() Строка100 = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(128)); Строка200 = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(256)); Строка1000 = Новый ОписаниеТипов("Строка",,,,Новый КвалификаторыСтроки(1024)); Выгрузка = Новый ТаблицаЗначений; Выгрузка.Колонки.Добавить("Level", Строка100); Выгрузка.Колонки.Добавить("Date", Новый ОписаниеТипов("Дата")); Выгрузка.Колонки.Добавить("ApplicationName", Строка100); Выгрузка.Колонки.Добавить("ApplicationPresentation", Строка100); Выгрузка.Колонки.Добавить("Event", Строка100); Выгрузка.Колонки.Добавить("EventPresentation", Строка100); Выгрузка.Колонки.Добавить("User", Строка100); Выгрузка.Колонки.Добавить("UserName", Строка100); Выгрузка.Колонки.Добавить("Computer", Строка100); Выгрузка.Колонки.Добавить("Metadata", Строка1000); Выгрузка.Колонки.Добавить("MetadataPresentation", Строка1000); Выгрузка.Колонки.Добавить("Comment");//, Строка1000); Выгрузка.Колонки.Добавить("Data");//, Строка100); Выгрузка.Колонки.Добавить("DataPresentation", Строка1000); Выгрузка.Колонки.Добавить("TransactionStatus", Строка100); Выгрузка.Колонки.Добавить("TransactionID", Строка100); Выгрузка.Колонки.Добавить("Connection", Строка100); Выгрузка.Колонки.Добавить("Session", Строка100); Выгрузка.Колонки.Добавить("ServerName", Строка100); Выгрузка.Колонки.Добавить("Port", Строка100); Выгрузка.Колонки.Добавить("SyncPort", Строка100); Выгрузка.Колонки.Добавить("v8ibase", Строка100); Возврат Выгрузка; КонецФункции Функция ПолучитьСписокПолейЖурналаРегистрации() Возврат "Уровень,ИмяПользователя,Дата,ИмяПриложения,Событие,Комментарий,Метаданные,ПредставлениеМетаданных," + "ПредставлениеДанных,Данные,Компьютер,ОсновнойIPПорт,Пользователь,ПредставлениеСобытия,Сеанс," + "РабочийСервер,Соединение,СтатусТранзакции"; КонецФункции Функция ПолучитьИмяИБ() ИмяИБ = ""; СтрокаСоединения = НРег(СтрокаСоединенияИнформационнойБазы()); Если Не ОбщегоНазначения.ИнформационнаяБазаФайловая(СтрокаСоединения) Тогда ИмяИБ = НСтр(СтрокаСоединения, "ref"); Иначе Разделитель = ПолучитьРазделительПути(); Пути = СтрРазделить(НСтр(СтрокаСоединения, "file"), Разделитель, Ложь); Если Пути.Количество() Тогда ИмяИБ = Пути[Пути.ВГраница()]; КонецЕсли; КонецЕсли; Если ПустаяСтрока(ИмяИБ) Тогда СтрокаОшибки = НСтр("en = 'Couldn''t find out the name of the database'; ru = 'Не удалось определить имя информационной базы'"); ЗаписьЖурналаРегистрации("Роботы.Выгрузка журнала регистрации для ИБ 2.0", УровеньЖурналаРегистрации.Ошибка, , , СтрокаОшибки); ВызватьИсключение СтрокаОшибки; КонецЕсли; Возврат ИмяИБ; КонецФункции Процедура ДобавитьЗаписьВыгрузкиЖурнала(Выгрузка, ИсходнаяЗапись, ИмяИБ) НоваяСтрока = Выгрузка.Добавить(); НоваяСтрока.Level = ИсходнаяЗапись.Уровень; НоваяСтрока.Date = ИсходнаяЗапись.Дата; НоваяСтрока.ApplicationName = ИсходнаяЗапись.ИмяПриложения; НоваяСтрока.ApplicationPresentation = ИсходнаяЗапись.ПредставлениеПриложения; НоваяСтрока.Event = ИсходнаяЗапись.Событие; НоваяСтрока.EventPresentation = ИсходнаяЗапись.ПредставлениеСобытия; НоваяСтрока.User = ИсходнаяЗапись.Пользователь; НоваяСтрока.UserName = ИсходнаяЗапись.ИмяПользователя; НоваяСтрока.Computer = ИсходнаяЗапись.Компьютер; НоваяСтрока.Metadata = ИсходнаяЗапись.Метаданные; НоваяСтрока.MetadataPresentation = ИсходнаяЗапись.ПредставлениеМетаДанных; НоваяСтрока.Data = ЗначениеДляПоляData(ИсходнаяЗапись.Данные); НоваяСтрока.DataPresentation = ИсходнаяЗапись.ПредставлениеДанных; НоваяСтрока.TransactionStatus = ИсходнаяЗапись.СтатусТранзакции; НоваяСтрока.TransactionID = ИсходнаяЗапись.Транзакция; НоваяСтрока.Connection = Формат(ИсходнаяЗапись.Соединение, "ЧГ=0"); НоваяСтрока.Session = Формат(ИсходнаяЗапись.Сеанс, "ЧГ=0"); НоваяСтрока.ServerName = ИсходнаяЗапись.РабочийСервер; НоваяСтрока.Port = Формат(ИсходнаяЗапись.ОсновнойIPПорт, "ЧГ=0"); НоваяСтрока.SyncPort = ИсходнаяЗапись.ВспомогательныйIPПорт; НоваяСтрока.v8ibase = ИмяИБ; Если ОбщегоНазначения.ЗначениеСсылочногоТипа(НоваяСтрока.Data) Тогда НоваяСтрока.Data = СокрЛП(НоваяСтрока.Data); КонецЕсли; НоваяСтрока.Comment = ИсходнаяЗапись.Комментарий; Если Не ЗначениеЗаполнено(НоваяСтрока.Comment) Тогда НоваяСтрока.Comment = Неопределено; КонецЕсли; Если ТипЗнч(ИсходнаяЗапись.ПредставлениеМетаданных) = Тип("СписокЗначений") Тогда ПредставлениеМетаданных = ""; Для Каждого СтрокаСписка Из ИсходнаяЗапись.ПредставлениеМетаданных Цикл Если ПредставлениеМетаданных <> "" Тогда ПредставлениеМетаданных = ПредставлениеМетаданных + "; "; КонецЕсли; ПредставлениеМетаданных = ПредставлениеМетаданных + СтрокаСписка; КонецЦикла; НоваяСтрока.MetadataPresentation = ПредставлениеМетаданных; КонецЕсли; КонецПроцедуры Функция ФайлыЖурналаКУдалению(ГраницаУдаления, ДиректорияДляХраненияФайлов) ФайлыКУдалению = Новый Массив; МассивФайлов = НайтиФайлы(ДиректорияДляХраненияФайлов, "*.json"); Для Каждого ЭлементМассива Из МассивФайлов Цикл ИмяФайла = Прав(Лев(ЭлементМассива.Имя,СтрДлина(ЭлементМассива.Имя) - 5),14); ДатаПоИмени = Дата(ИмяФайла); Если ДатаПоИмени <= ГраницаУдаления Тогда ФайлыКУдалению.Добавить(ЭлементМассива.Имя); КонецЕсли; КонецЦикла; Возврат ФайлыКУдалению; КонецФункции Процедура УдалитьСтарыеФайлы(ФайлыКУдалению, ПутьЖурналРегистрации) Для Каждого ЭлементМассива Из ФайлыКУдалению Цикл УдалитьФайлы(ПутьЖурналРегистрации, ЭлементМассива); КонецЦикла; КонецПроцедуры #КонецОбласти #Область КопияИзОбщегоМодуляЖурналРегистрации // Определяет смещение времени сервера относительно времени программы. // // Возвращаемое значение: // Число - смещение времени в секундах. // Может использоваться для приведения фильтров, применяемых к журналу, к дате сервера, // а также для приведения дат, полученных из журнала, к датам программы. // Функция СмещениеВремениСервера() СмещениеВремениСервера = ТекущаяДата() - ТекущаяДатаСеанса(); Если СмещениеВремениСервера >= -1 И СмещениеВремениСервера <= 1 Тогда СмещениеВремениСервера = 0; КонецЕсли; Возврат СмещениеВремениСервера; КонецФункции // Преобразование отбора. // // Параметры: // Отбор - Отбор - передаваемый отбор. // Процедура ПреобразованиеОтбора(Отбор, СмещениеВремениСервера) Для Каждого ЭлементОтбора Из Отбор Цикл Если ТипЗнч(ЭлементОтбора.Значение) = Тип("СписокЗначений") Тогда ПреобразованиеЭлементаОтбора(Отбор, ЭлементОтбора); ИначеЕсли ВРег(ЭлементОтбора.Ключ) = ВРег("Транзакция") Тогда Если СтрНайти(ЭлементОтбора.Значение, "(") = 0 Тогда Отбор.Вставить(ЭлементОтбора.Ключ, "(" + ЭлементОтбора.Значение); КонецЕсли; ИначеЕсли СмещениеВремениСервера <> 0 И (ВРег(ЭлементОтбора.Ключ) = ВРег("ДатаНачала") Или ВРег(ЭлементОтбора.Ключ) = ВРег("ДатаОкончания")) Тогда Отбор.Вставить(ЭлементОтбора.Ключ, ЭлементОтбора.Значение + СмещениеВремениСервера); КонецЕсли; КонецЦикла; КонецПроцедуры // Преобразование элемента отбора. // // Параметры: // Отбор - Отбор - передаваемый отбор. // Отбор - ЭлементОтбора - элемент передаваемого отбора. // Процедура ПреобразованиеЭлементаОтбора(Отбор, ЭлементОтбора) КлючСтруктурыОтбора = ЭлементОтбора.Ключ; // Эта процедура вызывается, если элемент отбора является списком значений, // в отборе же должен быть массив значений. Преобразуем список в массив. Если ВРег(КлючСтруктурыОтбора) = ВРег("РазделениеДанныхСеанса") Тогда НовоеЗначение = Новый Структура; Иначе НовоеЗначение = Новый Массив; КонецЕсли; КлючСтруктурыОтбора = ЭлементОтбора.Ключ; Для Каждого ЗначениеИзСписка Из ЭлементОтбора.Значение Цикл Если ВРег(КлючСтруктурыОтбора) = ВРег("Уровень") Тогда // Уровни сообщений представлены строкой, требуется преобразование в значение перечисления. НовоеЗначение.Добавить(Обработки.ЖурналРегистрации.УровеньЖурналаРегистрацииЗначениеПоИмени(ЗначениеИзСписка.Значение)); ИначеЕсли ВРег(КлючСтруктурыОтбора) = ВРег("СтатусТранзакции") Тогда // Статусы транзакций представлены строкой, требуется преобразование в значение перечисления. НовоеЗначение.Добавить(Обработки.ЖурналРегистрации.СтатусТранзакцииЗаписиЖурналаРегистрацииЗначениеПоИмени(ЗначениеИзСписка.Значение)); ИначеЕсли ВРег(КлючСтруктурыОтбора) = ВРег("РазделениеДанныхСеанса") Тогда МассивЗначенийРазделителей = Новый Массив; КлючСтруктурыОтбора = "РазделениеДанныхСеанса"; РазделениеДанныхМассив = СтрРазделить(ЗначениеИзСписка.Значение, "=", Истина); ЗначенияРазделителя = СтрРазделить(РазделениеДанныхМассив[1], ",", Истина); Для Каждого ЗначениеРазделителя Из ЗначенияРазделителя Цикл ЭлементОтбораПоРазделителю = Новый Структура("Значение, Использование", Число(ЗначениеРазделителя), Истина); МассивЗначенийРазделителей.Добавить(ЭлементОтбораПоРазделителю); КонецЦикла; НовоеЗначение.Вставить(РазделениеДанныхМассив[0], МассивЗначенийРазделителей); Иначе Если ТипЗнч(ЗначениеИзСписка.Значение) = Тип("Число") Тогда НовоеЗначение.Добавить(ЗначениеИзСписка.Значение); Продолжить; Иначе ЗначенияОтбора = СтрРазделить(ЗначениеИзСписка.Значение, Символы.ПС, Ложь); КонецЕсли; Для Каждого ЗначениеОтбора Из ЗначенияОтбора Цикл НовоеЗначение.Добавить(ЗначениеОтбора); КонецЦикла; КонецЕсли; КонецЦикла; Отбор.Вставить(ЭлементОтбора.Ключ, НовоеЗначение); КонецПроцедуры #КонецОбласти Функция ЗначениеДляПоляData(Знач ИсходноеЗначение) Если ОбщегоНазначения.ЗначениеСсылочногоТипа(ИсходноеЗначение) Тогда Возврат СокрЛП(ИсходноеЗначение); КонецЕсли; Если ТипЗнч(ИсходноеЗначение) = Тип("Строка") И ИсходноеЗначение = "" Тогда Возврат Неопределено; КонецЕсли; ПростыеТипы = Новый ОписаниеТипов("Число, Дата, Булево"); Если ПростыеТипы.СодержитТип(ТипЗнч(ИсходноеЗначение)) Тогда Возврат ИсходноеЗначение; КонецЕсли; Если ТипЗнч(ИсходноеЗначение) = Тип("Массив") Тогда НовыйМассив = Новый Массив; Для Каждого ЭлементМассива Из ИсходноеЗначение Цикл НовыйМассив.Добавить(ЗначениеДляПоляData(ЭлементМассива)); КонецЦикла; Возврат Новый Структура("Item", НовыйМассив); КонецЕсли; Если ТипЗнч(ИсходноеЗначение) = Тип("Структура") Тогда НоваяСтруктура = Новый Структура; Для Каждого КлючЗначение Из ИсходноеЗначение Цикл НовыйКлюч = АнглийскиеИменаСвойств().Получить(КлючЗначение.Ключ); Если НовыйКлюч = Неопределено Тогда НовыйКлюч = КлючЗначение.Ключ; КонецЕсли; НоваяСтруктура.Вставить(НовыйКлюч, ЗначениеДляПоляData(КлючЗначение.Значение)); КонецЦикла; Возврат НоваяСтруктура; КонецЕсли; Возврат Строка(ИсходноеЗначение); КонецФункции Функция АнглийскиеИменаСвойств() Если ЗначениеЗаполнено(СловарьАнглийскихИменСвойств) Тогда Возврат СловарьАнглийскихИменСвойств; КонецЕсли; Соответствие = Новый Соответствие; Соответствие.Вставить("Данные", "Data"); Соответствие.Вставить("Действие", "Action"); Соответствие.Вставить("СпособВосстановленияПароля", "PasswordRecoveryMethod"); Соответствие.Вставить("НавигационнаяСсылкаВосстановленияПароля", "PasswordRecoveryURL"); Соответствие.Вставить("НавигационнаяСсылкаПомощи", "HelpURL"); Соответствие.Вставить("ОтображатьГиперссылкуПомощи", "ShowHelpHyperlink"); Соответствие.Вставить("ДлинаКодаПодтверждения", "VerificationCodeLength"); Соответствие.Вставить("МаксимальноеКоличествоНеуспешныхПопытокПроверкиКодаПодтверждения ", "MaxUnsuccessfulVerificationCodeValidationAttemptsCount"); Соответствие.Вставить("ДлительностьБлокировкиЗапросаОбновленияКодаПодтверждения ", "VerificationCodeRefreshRequestLockDuration"); Соответствие.Вставить("АдресСервераSMTP", "SMTPServerAddress"); Соответствие.Вставить("ПользовательSMTP", "SMTPUser"); Соответствие.Вставить("ПарольSMTPИзменен", "SMTPPasswordChanged"); Соответствие.Вставить("ПортSMTP", "SMTPPort"); Соответствие.Вставить("ИмяОтправителя", "SenderName"); Соответствие.Вставить("Заголовок", "Header"); Соответствие.Вставить("ТекстСообщенияHTML", "HTMLMessageText"); Соответствие.Вставить("ПарольSMTP", "SMTPPassword"); Соответствие.Вставить("ИспользоватьSSL", "UseSSL"); Соответствие.Вставить("Имя", "Name"); Соответствие.Вставить("Версия", "Version"); Соответствие.Вставить("Дата", "Date"); Соответствие.Вставить("Уровни", "Levels"); Соответствие.Вставить("ПериодРазделения", "SplitPeriod"); Соответствие.Вставить("ФорматЖурналаРегистрации", "EventLogFormat"); Соответствие.Вставить("ИмяСобытия", "EventName"); Соответствие.Вставить("СобытиеРегистрируется", "EventIsLogged"); Соответствие.Вставить("URLДоверяющейСтороны", "RelyingPartyURL"); Соответствие.Вставить("ПользовательОС", "OSUser"); Соответствие.Вставить("ТекущийПользовательОС", "CurrentOSUser"); Соответствие.Вставить("КодДополненияИмениПользователя", "UserNameAdditionCode"); Соответствие.Вставить("URLПровайдераOpenID", "OpenIDProviderURL"); Соответствие.Вставить("ИдентификаторПользователяПровайдераOpenID", "OpenIDProviderUserID"); Соответствие.Вставить("АутентификацияОС", "OSAuthentication"); Соответствие.Вставить("АутентификацияСтандартная", "StandardAuthentication"); Соответствие.Вставить("АутентификацияOpenID", "OpenIDAuthentication"); Соответствие.Вставить("ЗащитаОтОпасныхДействий", "UnsafeOperationProtection"); Соответствие.Вставить("ЗапрещеноИзменятьПароль", "CannotChangePassword"); Соответствие.Вставить("ОсновнойИнтерфейс", "DefaultInterface"); Соответствие.Вставить("ПарольИзменен", "PasswordChanged"); Соответствие.Вставить("ПарольУстановлен", "PasswordIsSet"); Соответствие.Вставить("ПоказыватьВСпискеВыбора", "ShowInList"); Соответствие.Вставить("ПолноеИмя", "FullName"); Соответствие.Вставить("РежимЗапуска", "RunMode"); Соответствие.Вставить("Роли", "Role"); Соответствие.Вставить("Язык", "Language"); Соответствие.Вставить("НастройкиВторогоФактораАутентификации", "SecondAuthenticationFactorSettings"); Соответствие.Вставить("ОбработкаНастроекВторогоФактораАутентификации", "SecondAuthenticationFactorSettingsProcessing"); Соответствие.Вставить("ЗапрещеноВосстанавливатьПароль", "CannotRecoveryPassword"); Соответствие.Вставить("АдресЭлектроннойПочты", "Email"); Соответствие.Вставить("АутентификацияOpenIDConnect", "OpenIDConnectAuthentication"); СловарьАнглийскихИменСвойств = Соответствие; Возврат СловарьАнглийскихИменСвойств; КонецФункции #КонецЕсли