RDT1C/DataProcessors/ирАнализЖурналаРегистрации/Ext/ObjectModule.bsl
Администратор 4b9e25c9d6 Конструктор регулярного выражения
+Добавлена страница описания на сайте
        *Исправлена редкая ошибка подсветки группы в проверочном тексте
    Консоль запросов
        +Добавлена поддержка символа "#" в именах временных таблиц 1С
    Управление службами серверов 1С
        +Добавлена поддержка имени производителя "1C-Soft" при поиске доступных версий платформы
    Редактор объекта БД
        *Исправлена проблема выбора ссылки внешнего источника данных в поле "Ссылка"
    Динамический список
        +Добавлен разделитель справа от поля количества строк
    Общие параметры записи объектов
        *Теперь недоступные текущему инструменту параметры скрываются
    Параметры вывода строк таблицы
        *Исправлена не работавшая групповая установка пометок
    Анализ журнала регистрации
        *Исправлено отображение количества строк в выборке из журнала
2018-07-15 23:46:48 +03:00

355 lines
26 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//ирПортативный Перем ирПортативный Экспорт;
//ирПортативный Перем ирОбщий Экспорт;
//ирПортативный Перем ирСервер Экспорт;
//ирПортативный Перем ирКэш Экспорт;
//ирПортативный Перем ирПривилегированный Экспорт;
Функция ПолучитьСписокЗначенийЭлементаОтбора(ПолеОтбора) Экспорт
Если ПолеОтбора = "Уровень" Тогда
ВозможныеЗначения = Новый СписокЗначений;
ВозможныеЗначения.Добавить(УровеньЖурналаРегистрации.Ошибка);
ВозможныеЗначения.Добавить(УровеньЖурналаРегистрации.Предупреждение);
ВозможныеЗначения.Добавить(УровеньЖурналаРегистрации.Информация);
ВозможныеЗначения.Добавить(УровеньЖурналаРегистрации.Примечание);
ИначеЕсли ПолеОтбора = "СтатусТранзакции" Тогда
ВозможныеЗначения = Новый СписокЗначений;
ВозможныеЗначения.Добавить(СтатусТранзакцииЗаписиЖурналаРегистрации.Зафиксирована);
ВозможныеЗначения.Добавить(СтатусТранзакцииЗаписиЖурналаРегистрации.Отменена);
ВозможныеЗначения.Добавить(СтатусТранзакцииЗаписиЖурналаРегистрации.НеЗавершена);
ВозможныеЗначения.Добавить(СтатусТранзакцииЗаписиЖурналаРегистрации.НетТранзакции);
ИначеЕсли Ложь
Или ПолеОтбора = "Пользователь"
Или ПолеОтбора = "Компьютер"
Или ПолеОтбора = "ИмяПриложения"
Или ПолеОтбора = "Событие"
Или ПолеОтбора = "Метаданные"
Или ПолеОтбора = "РабочийСервер"
Или ПолеОтбора = "ОсновнойIPПорт"
Или ПолеОтбора = "ВспомогательныйIPПорт"
Или ПолеОтбора = "РазделениеДанныхСеанса"
Тогда
СтруктураЗначенийОтбора = ПолучитьЗначенияОтбораЖурналаРегистрации(ПолеОтбора, ИмяФайла);
ВозможныеЗначения = СтруктураЗначенийОтбора[ПолеОтбора];
Иначе
ВозможныеЗначения = Неопределено;
КонецЕсли;
Если ВозможныеЗначения <> Неопределено Тогда
Если ТипЗнч(ВозможныеЗначения) = Тип("СписокЗначений") Тогда
СписокВыбора = ВозможныеЗначения;
ИначеЕсли ТипЗнч(ВозможныеЗначения) = Тип("Массив") Тогда
СписокВыбора = Новый СписокЗначений;
СписокВыбора.ЗагрузитьЗначения(ВозможныеЗначения);
СписокВыбора.СортироватьПоЗначению();
ИначеЕсли ТипЗнч(ВозможныеЗначения) = Тип("Соответствие") Тогда
СписокВыбора = Новый СписокЗначений;
Для Каждого КлючИЗначение Из ВозможныеЗначения Цикл
СписокВыбора.Добавить(КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
СписокВыбора.СортироватьПоПредставлению();
КонецЕсли;
КонецЕсли;
Возврат СписокВыбора;
КонецФункции
Функция УстановитьОписаниеТиповЗначенияОтбора(СтрокаОтбора) Экспорт
ПолеОтбора = СтрокаОтбора.Поле;
МетаРеквизит = Метаданные().ТабличныеЧасти.ТаблицаЖурнала.Реквизиты[ПолеОтбора];
БазовоеОписаниеТипов = МетаРеквизит.Тип;
Если Ложь
Или ПолеОтбора = "Уровень"
Или ПолеОтбора = "СтатусТранзакции"
Или ПолеОтбора = "Пользователь"
Или ПолеОтбора = "Компьютер"
Или ПолеОтбора = "ИмяПриложения"
Или ПолеОтбора = "Событие"
Или ПолеОтбора = "Метаданные"
Или ПолеОтбора = "РабочийСервер"
Или ПолеОтбора = "ОсновнойIPПорт"
Или ПолеОтбора = "ВспомогательныйIPПорт"
Или ПолеОтбора = "РазделениеДанныхСеанса"
Тогда
ОписаниеТипов = Новый ОписаниеТипов("СписокЗначений");
ИначеЕсли ПолеОтбора = "Сеанс" Тогда
ОписаниеТипов = Новый ОписаниеТипов(БазовоеОписаниеТипов, "СписокЗначений");
Иначе
ОписаниеТипов = БазовоеОписаниеТипов;
КонецЕсли;
СтрокаОтбора.ОписаниеТипов = ОписаниеТипов;
СтрокаОтбора.Значение = ОписаниеТипов.ПривестиЗначение(СтрокаОтбора.Значение);
СтрокаОтбора.Представление = МетаРеквизит.Представление();
КонецФункции
Функция ДобавитьЭлементОтбора(Отбор, ПолеОтбора = "Данные", Знач ЗначениеОтбора = Неопределено, ПредставлениеЗначения = Неопределено,
Использование = Истина, ОставлятьСтарыеПометки = Истина) Экспорт
Если ПолеОтбора = "Уровень" И ТипЗнч(ЗначениеОтбора) = Тип("Строка") Тогда
ЗначениеОтбора = УровеньЖурналаРегистрации[ЗначениеОтбора];
КонецЕсли;
ДоступныеЗначенияЭлементаОтбора = ПолучитьСписокЗначенийЭлементаОтбора(ПолеОтбора);
СтрокаОтбора = Отбор.Найти(ПолеОтбора);
Если СтрокаОтбора = Неопределено Тогда
СтрокаОтбора = Отбор.Добавить();
СтрокаОтбора.Поле = ПолеОтбора;
СтрокаОтбора.Значение = ДоступныеЗначенияЭлементаОтбора;
УстановитьОписаниеТиповЗначенияОтбора(СтрокаОтбора);
КонецЕсли;
ирОбщий.ПрисвоитьЕслиНеРавноЛкс(СтрокаОтбора.Использование, Использование);
СписокВыбора = СтрокаОтбора.Значение;
Если ТипЗнч(СписокВыбора) = Тип("СписокЗначений") Тогда
Если Не ОставлятьСтарыеПометки Тогда
СписокВыбора.ЗаполнитьПометки(Ложь);
КонецЕсли;
Если ТипЗнч(ЗначениеОтбора) <> Тип("СписокЗначений") Тогда
лПустышка = ЗначениеОтбора;
ЗначениеОтбора = Новый СписокЗначений;
ЗначениеОтбора.Добавить(лПустышка, , Истина);
КонецЕсли;
Для Каждого ЭлементСписка Из СписокВыбора Цикл
ЭлементСтарогоСписка = ЗначениеОтбора.НайтиПоЗначению(ЭлементСписка.Значение);
Если ЭлементСтарогоСписка <> Неопределено Тогда
ЭлементСписка.Пометка = ЭлементСтарогоСписка.Пометка;
КонецЕсли;
КонецЦикла;
Для Каждого ДоступноеЗначение Из ДоступныеЗначенияЭлементаОтбора Цикл
ЭлементСписка = СписокВыбора.НайтиПоЗначению(ДоступноеЗначение.Значение);
Если ЭлементСписка = Неопределено Тогда
ЭлементСписка = СписокВыбора.Добавить();
КонецЕсли;
ЗаполнитьЗначенияСвойств(ЭлементСписка, ДоступноеЗначение,, "Пометка");
КонецЦикла;
СписокВыбора.СортироватьПоПредставлению();
Иначе
СтрокаОтбора.Значение = ЗначениеОтбора;
КонецЕсли;
Возврат СтрокаОтбора;
КонецФункции
Процедура ЗаполнитьОтбор() Экспорт
ДобавитьЭлементОтбора(Отбор, "Уровень");
ДобавитьЭлементОтбора(Отбор, "Комментарий");
ДобавитьЭлементОтбора(Отбор, "Пользователь");
ДобавитьЭлементОтбора(Отбор, "Событие");
ДобавитьЭлементОтбора(Отбор, "СтатусТранзакции");
ДобавитьЭлементОтбора(Отбор, "ИмяПриложения");
ДобавитьЭлементОтбора(Отбор, "Данные");
ДобавитьЭлементОтбора(Отбор, "Метаданные");
КонецПроцедуры
Функция ПолучитьДанные(НачалоПериода = Неопределено, КонецПериода = Неопределено, СтруктураОтбора = Неопределено, МаксимальныйРазмерВыгрузки = Неопределено) Экспорт
//ЗаполнитьОтбор();
Если НачалоПериода <> Неопределено Тогда
ЭтотОбъект.НачалоПериода = НачалоПериода;
Иначе
ЭтотОбъект.НачалоПериода = НачалоДня(ТекущаяДата());
КонецЕсли;
Если КонецПериода <> Неопределено Тогда
ЭтотОбъект.КонецПериода = КонецПериода;
Иначе
ЭтотОбъект.КонецПериода = Неопределено;
КонецЕсли;
Если МаксимальныйРазмерВыгрузки <> Неопределено Тогда
ЭтотОбъект.МаксимальныйРазмерВыгрузки = МаксимальныйРазмерВыгрузки;
КонецЕсли;
Если СтруктураОтбора <> Неопределено Тогда
Для Каждого КлючИЗначение Из СтруктураОтбора Цикл
ДобавитьЭлементОтбора(ЭтотОбъект.Отбор, КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
КонецЕсли;
ЗагрузитьДанныеЖурнала();
Возврат ТаблицаЖурнала;
КонецФункции
Процедура ЗагрузитьДанныеЖурнала() Экспорт
Фильтр = Новый Структура;
Если ЗначениеЗаполнено(НачалоПериода) Тогда
Фильтр.Вставить("ДатаНачала", НачалоПериода);
КонецЕсли;
Если ЗначениеЗаполнено(КонецПериода) Тогда
Фильтр.Вставить("ДатаОкончания", КонецПериода);
КонецЕсли;
Для Каждого СтрокаОтбора Из Отбор Цикл
ЗначениеОтбора = СтрокаОтбора.Значение;
Если Истина
И ЗначениеОтбора = Неопределено
И СтрокаОтбора.Поле <> "Данные"
Тогда
СтрокаОтбора.Использование = Ложь;
КонецЕсли;
Если Не СтрокаОтбора.Использование Тогда
Продолжить;
КонецЕсли;
Если ТипЗнч(ЗначениеОтбора) = Тип("СписокЗначений") Тогда
Если ЗначениеОтбора.ТипЗначения.Типы().Количество() = 0 Тогда
СписокЗначений = ЗначениеОтбора;
ЗначениеОтбора = Новый Массив();
Для Каждого ЭлементСписка Из СписокЗначений Цикл
Если ЭлементСписка.Пометка Тогда
Если СтрокаОтбора.Поле = "Пользователь" Тогда
ЗначениеЭлемента = ЭлементСписка.Представление;
Иначе
ЗначениеЭлемента = ЭлементСписка.Значение;
КонецЕсли;
ЗначениеОтбора.Добавить(ЗначениеЭлемента);
КонецЕсли;
КонецЦикла;
Иначе
ЗначениеОтбора = ЗначениеОтбора.ВыгрузитьЗначения();
КонецЕсли;
КонецЕсли;
Фильтр.Вставить(СтрокаОтбора.Поле, ЗначениеОтбора);
КонецЦикла;
НачалоИнтервала = ТекущаяДата();
ЭтотОбъект.ТаблицаЗначенийЖурнала = Новый ТаблицаЗначений;
Если АнализироватьТранзакцииСУчастиемОбъекта Тогда
#Если Клиент Тогда
Состояние("Анализ транзакций журнала...");
#КонецЕсли
ТаблицаТранзакций = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТаблицаТранзакций, Фильтр,, ИмяФайла, МаксимальныйРазмерВыгрузки);
ТаблицаТранзакций.Свернуть("Транзакция");
ТаблицаТранзакций.Сортировать("Транзакция");
Транзакции = ТаблицаТранзакций.ВыгрузитьКолонку("Транзакция");
Индикатор = ирОбщий.ПолучитьИндикаторПроцессаЛкс(Транзакции.Количество(), "Выгрузка журнала по транзакциям");
ФильтрТранзакции = ирОбщий.СкопироватьУниверсальнуюКоллекциюЛкс(Фильтр);
Для Каждого Транзакция Из Транзакции Цикл
ирОбщий.ОбработатьИндикаторЛкс(Индикатор);
//ФильтрТранзакции.Вставить("Транзакция", ирОбщий.ПолучитьСтрокуМеждуМаркерамиЛкс(Транзакция, "(",")"));
ФильтрТранзакции.Вставить("Транзакция", Транзакция);
Если Транзакция <> "" Тогда
ФильтрТранзакции.Удалить("Данные");
КонецЕсли;
ТаблицаТранзакции = Новый ТаблицаЗначений;
ВыгрузитьЖурналРегистрации(ТаблицаТранзакции, ФильтрТранзакции,, ИмяФайла, МаксимальныйРазмерВыгрузки - ТаблицаЗначенийЖурнала.Количество());
Если Транзакция = "" Тогда
ТаблицаТранзакции = ТаблицаТранзакции.Скопировать(Новый Структура("Транзакция", ""));
КонецЕсли;
ТаблицаТранзакции.Колонки.Добавить("ПорядокСтроки", Новый ОписаниеТипов("Число"));
Для Счетчик = 1 По ТаблицаТранзакции.Количество() Цикл
ТаблицаТранзакции[Счетчик - 1].ПорядокСтроки = ТаблицаЗначенийЖурнала.Количество() + Счетчик;
КонецЦикла;
Если ТаблицаЗначенийЖурнала.Колонки.Количество() = 0 Тогда
ТаблицаЗначенийЖурнала = ТаблицаТранзакции;
Иначе
ирОбщий.ЗагрузитьВТаблицуЗначенийЛкс(ТаблицаТранзакции, ТаблицаЗначенийЖурнала);
КонецЕсли;
Если ТаблицаЗначенийЖурнала.Количество() >= МаксимальныйРазмерВыгрузки Тогда
Прервать;
КонецЕсли;
КонецЦикла;
ирОбщий.ОсвободитьИндикаторПроцессаЛкс();
//ТаблицаЗначенийЖурнала.Индексы.Добавить("Дата, ПорядокСтроки");
//ТаблицаЗначенийЖурнала.Сортировать("Дата, ПорядокСтроки");
Иначе
#Если Клиент Тогда
Состояние("Выборка из журнала регистрации...");
#КонецЕсли
ВыгрузитьЖурналРегистрации(ТаблицаЗначенийЖурнала, Фильтр,, ИмяФайла, МаксимальныйРазмерВыгрузки);
ТаблицаЗначенийЖурнала.Колонки.Добавить("ПорядокСтроки", Новый ОписаниеТипов("Число"));
Для Счетчик = 1 По ТаблицаЗначенийЖурнала.Количество() Цикл
ТаблицаЗначенийЖурнала[Счетчик - 1].ПорядокСтроки = Счетчик;
КонецЦикла;
КонецЕсли;
ТаблицаЗначенийЖурнала.Индексы.Добавить("ПорядокСтроки");
ТаблицаЗначенийЖурнала.Сортировать("ПорядокСтроки");
ТаблицаЖурнала.Загрузить(ТаблицаЗначенийЖурнала);
КоличествоСтрокЖурнала = ТаблицаЖурнала.Количество();
КонецИнтервала = ТекущаяДата();
#Если Клиент Тогда
Состояние("");
#КонецЕсли
ДлительностьИнтервала = КонецИнтервала - НачалоИнтервала;
Если ДлительностьИнтервала > 5 Тогда
КолвоЧасов = Цел(ДлительностьИнтервала / 3600);
ДлительностьИнтервалаДата = '00010101' + (КонецИнтервала - НачалоИнтервала) - КолвоЧасов * 3600;
ДлительностьИнтервалаСтр = Формат(КолвоЧасов, "ЧН=; ЧГ=0") + ":" + Формат(ДлительностьИнтервалаДата, "ДФ=мм:сс; ДП=");
Сообщить("Загрузка данных журнала выполнена за " + ДлительностьИнтервалаСтр);
КонецЕсли;
КонецПроцедуры
#Если Клиент Тогда
Функция ОткрытьСПараметром(ПолеОтбора = "Данные", ЗначениеОтбора, ПредставлениеЗначения = Неопределено) Экспорт
Форма = ПолучитьФорму(,, ЗначениеОтбора);
Форма.Открыть();
Форма.Отбор.ЗаполнитьЗначения(Ложь, "Использование");
Форма.НачалоПериода = НачалоДня(ТекущаяДата());
Форма.КонецПериода = Неопределено;
ДобавитьЭлементОтбора(Форма.Отбор, ПолеОтбора, ЗначениеОтбора, ПредставлениеЗначения);
Ответ = Вопрос("Сразу выполнить выгрузку с текущим отбором?", РежимДиалогаВопрос.ОКОтмена);
Если Ответ = КодВозвратаДиалога.ОК Тогда
Форма.ОбновитьТаблицуЖурнала();
КонецЕсли;
Возврат Форма;
КонецФункции
Функция ОткрытьСОтбором(НачалоПериода = Неопределено, КонецПериода = Неопределено, СтруктураОтбора = Неопределено, МаксимальныйРазмерВыгрузки = Неопределено) Экспорт
Форма = ПолучитьФорму(,,);
Форма.Открыть();
Форма.Отбор.ЗаполнитьЗначения(Ложь, "Использование");
Если НачалоПериода <> Неопределено Тогда
Форма.НачалоПериода = НачалоПериода;
Иначе
Форма.НачалоПериода = НачалоДня(ТекущаяДата());
КонецЕсли;
Если КонецПериода <> Неопределено Тогда
Форма.КонецПериода = КонецПериода;
Иначе
Форма.КонецПериода = Неопределено;
КонецЕсли;
Если МаксимальныйРазмерВыгрузки <> Неопределено Тогда
Форма.МаксимальныйРазмерВыгрузки = МаксимальныйРазмерВыгрузки;
КонецЕсли;
Если СтруктураОтбора <> Неопределено Тогда
Для Каждого КлючИЗначение Из СтруктураОтбора Цикл
ДобавитьЭлементОтбора(Форма.Отбор, КлючИЗначение.Ключ, КлючИЗначение.Значение);
КонецЦикла;
КонецЕсли;
Ответ = Вопрос("Сразу выполнить выгрузку с текущим отбором?", РежимДиалогаВопрос.ОКОтмена);
Если Ответ = КодВозвратаДиалога.ОК Тогда
Форма.ОбновитьТаблицуЖурнала();
КонецЕсли;
Возврат Форма;
КонецФункции
#КонецЕсли
//ирПортативный лФайл = Новый Файл(ИспользуемоеИмяФайла);
//ирПортативный ПолноеИмяФайлаБазовогоМодуля = Лев(лФайл.Путь, СтрДлина(лФайл.Путь) - СтрДлина("Модули\")) + "ирПортативный.epf";
//ирПортативный #Если Клиент Тогда
//ирПортативный Контейнер = Новый Структура();
//ирПортативный Оповестить("ирПолучитьБазовуюФорму", Контейнер);
//ирПортативный Если Не Контейнер.Свойство("ирПортативный", ирПортативный) Тогда
//ирПортативный ирПортативный = ВнешниеОбработки.ПолучитьФорму(ПолноеИмяФайлаБазовогоМодуля);
//ирПортативный ирПортативный.Открыть();
//ирПортативный КонецЕсли;
//ирПортативный #Иначе
//ирПортативный ирПортативный = ВнешниеОбработки.Создать(ПолноеИмяФайлаБазовогоМодуля, Ложь); // Это будет второй экземпляр объекта
//ирПортативный #КонецЕсли
//ирПортативный ирОбщий = ирПортативный.ПолучитьОбщийМодульЛкс("ирОбщий");
//ирПортативный ирКэш = ирПортативный.ПолучитьОбщийМодульЛкс("ирКэш");
//ирПортативный ирСервер = ирПортативный.ПолучитьОбщийМодульЛкс("ирСервер");
//ирПортативный ирПривилегированный = ирПортативный.ПолучитьОбщийМодульЛкс("ирПривилегированный");
Отбор.Колонки.Добавить("Использование", Новый ОписаниеТипов("Булево"));
Отбор.Колонки.Добавить("Поле", Новый ОписаниеТипов("Строка"));
Отбор.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка"));
Отбор.Колонки.Добавить("ОписаниеТипов", Новый ОписаниеТипов("ОписаниеТипов"));
Отбор.Колонки.Добавить("Значение");
ЭтотОбъект.МаксимальныйРазмерВыгрузки = 1000;