RDT1C/DataProcessors/ирНастройкаТехножурнала/Ext/ObjectModule.bsl
2016-12-04 00:14:16 +03:00

1433 lines
82 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.

// Переменная документа, представляющего файл
// настройки технологического журнала
Перем мДокументДОМ;
// Переменные для работы с двоичным представлением числа
Перем мДвоичноеЧисло;
Перем мЧисло;
// Костанты списков данных
Перем мВидыСравнения;
Перем мСписокТипов;
Перем мСписокСобытий;
Перем мСписокСвойствСобытий;
Перем мСоставСвойствСобытий;
Перем мСписокИменСвойств;
Перем мСписокДействий;
Перем мКодировкаФайла;
////////////////////////////////////////////////////////////////////////////////
// ЗАПОЛНЕНИЕ КОНСТАНТ И ИХ ВОЗВРАТ ПО ТРЕБОВАНИЮ
// Возвращает имя конфигурационного файла
//
Функция ПолучитьПолноеИмяКонфигурационногоФайла(ИспользоватьОбщий = Неопределено) Экспорт
Если ИспользоватьОбщий = Неопределено Тогда
ИспользоватьОбщий = ИспользоватьОбщийКаталогНастроек;
КонецЕсли;
Результат = ПолучитьДиректориюКонфигурационногоФайла(ИспользоватьОбщий) + "\logcfg.xml";
Возврат Результат;
КонецФункции
// Возвращает каталог конфигурационного файла
//
Функция ПолучитьДиректориюКонфигурационногоФайла(ИспользоватьОбщий = Неопределено, СоздатьЕслиОтсутствует = Ложь) Экспорт
Если ИспользоватьОбщий = Неопределено Тогда
ИспользоватьОбщий = ИспользоватьОбщийКаталогНастроек;
КонецЕсли;
Если ЗначениеЗаполнено(КаталогНастройки) Тогда
Результат = КаталогНастройки;
Иначе
Результат = ирНеглобальный.ПолучитьКаталогНастроекПриложения1СЛкс(ИспользоватьОбщий, СоздатьЕслиОтсутствует, НаСервере);
КонецЕсли;
Возврат Результат;
КонецФункции
// Возвращает каталог технологического журнала
//
Функция ПолучитьДиректориюТехнологическогоЖурнала() Экспорт
Возврат КаталогПрограммы() + "logs";
КонецФункции
// Возвращает каталог дампа
//
Функция ПолучитьДиректориюДампа() Экспорт
Возврат КаталогПрограммы() + "dumps";
КонецФункции
// Возвращает имя файла шаблона по имени шаблона
//
Функция ПолучитьИмяФайлаШаблона(ИмяШаблона) Экспорт
Возврат ПолучитьДиректориюКонфигурационногоФайла() + "\" + ИмяШаблона + ".prst";
КонецФункции
// Заполнить структуру типов
//
Процедура ЗаполнитьСписокТипов()
мСписокТипов = Новый Структура;
СоставСвойствСобытий = ПолучитьСоставСвойствСобытий();
#Если _ Тогда
СоставСвойствСобытий = Новый ТаблицаЗначений;
#КонецЕсли
Для Счетчик = 1 По СоставСвойствСобытий.Колонки.Количество() - 1 Цикл
ИмяСвойства = СоставСвойствСобытий.Колонки[Счетчик].Имя;
ТипСвойства = НРег(СоставСвойствСобытий[0][Счетчик]);
Если ТипСвойства = "n" Тогда
СтрокаТипов = "Число";
ИначеЕсли ТипСвойства = "s" Тогда
СтрокаТипов = "Строка";
ИначеЕсли ТипСвойства = "d" Тогда
СтрокаТипов = "Дата";
ИначеЕсли ТипСвойства = "b" Тогда
СтрокаТипов = "Булево";
Иначе // fl, nl, ll
СтрокаТипов = "СписокЗначений";
КонецЕсли;
ОписаниеТипов = Новый ОписаниеТипов(СтрокаТипов);
мСписокТипов.Вставить(ИмяСвойства, ОписаниеТипов);
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьСписокВыбораСрокаХранения(СписокВыбора) Экспорт
СписокВыбора.Очистить();
СписокВыбора.Добавить(2);
СписокВыбора.Добавить(6);
СписокВыбора.Добавить(24, "1 день");
СписокВыбора.Добавить(48, "2 дня");
СписокВыбора.Добавить(168, "Неделя");
КонецПроцедуры
// Вернуть константу со списком типов
//
Функция ВернутьСписокТипов() Экспорт
Если мСписокТипов = Неопределено Тогда
ЗаполнитьСписокТипов();
КонецЕсли;
Возврат мСписокТипов;
КонецФункции
// Заполнить структуру списком событий
//
Процедура ЗаполнитьСтруктуруСобытий() Экспорт
ТаблицаИзМакета = ирНеглобальный.ПолучитьТаблицуИзТабличногоДокументаЛкс(ПолучитьМакет("События"));
События.Загрузить(ТаблицаИзМакета);
События.Сортировать("Представление");
КонецПроцедуры
// Вернуть константу со списком событий
//
Функция ПолучитьСписокСобытий() Экспорт
Если мСписокСобытий = Неопределено Тогда
Если События.Количество() = 0 Тогда
ЗаполнитьСтруктуруСобытий();
КонецЕсли;
мСписокСобытий = Новый СписокЗначений;
Для Каждого СтрокаТЧ Из События Цикл
Если ВРег(СтрокаТЧ.Имя) = "<ALL>" Тогда
Продолжить;
КонецЕсли;
мСписокСобытий.Добавить(НРег(СтрокаТЧ.Имя), СтрокаТЧ.Имя + " - " + СтрокаТЧ.Представление
//+ " (" + СтрокаТЧ.Описание + ")"
);
КонецЦикла;
КонецЕсли;
Возврат мСписокСобытий;
КонецФункции
// Заполнить список представления сравнений
//
Процедура ЗаполнитьСписокСравнения()
мВидыСравнения = Новый СписокЗначений;
мВидыСравнения.Добавить("eq", "Равно");
мВидыСравнения.Добавить("ne", "Не равно");
мВидыСравнения.Добавить("gt", "Больше");
мВидыСравнения.Добавить("ge", "Больше или равно");
мВидыСравнения.Добавить("lt", "Меньше");
мВидыСравнения.Добавить("le", "Меньше или равно");
мВидыСравнения.Добавить("like", "Шаблон");
КонецПроцедуры
// Вернуть константу со списком сравнений
//
Функция ПолучитьСписокСравнения() Экспорт
Если мВидыСравнения = Неопределено Тогда
ЗаполнитьСписокСравнения();
КонецЕсли;
Возврат мВидыСравнения;
КонецФункции
// Поиск значения в списке по представлению
Функция НайтиПоПредставлению(Список, Представление) Экспорт
Результат = "";
Для Каждого Элемент Из Список Цикл
Если Элемент.Представление = Представление Тогда
Результат = Элемент.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ПолучитьСоставСвойствСобытий() Экспорт
Если мСоставСвойствСобытий = Неопределено Тогда
мСоставСвойствСобытий = ирНеглобальный.ПолучитьТаблицуИзТабличногоДокументаЛкс(ПолучитьМакет("СоставСвойствСобытий"));
КонецЕсли;
Возврат мСоставСвойствСобытий;
КонецФункции
// Заполнить структуру свойств событий
//
Процедура ЗаполнитьСписокСвойствСобытий() Экспорт
ТаблицаИзМакета = ирНеглобальный.ПолучитьТаблицуИзТабличногоДокументаЛкс(ПолучитьМакет("Свойства"));
Свойства.Загрузить(ТаблицаИзМакета);
Для Каждого СтрокаТЧ Из Свойства Цикл
СтрокаТЧ.НИмя = НРег(СтрокаТЧ.Имя);
КонецЦикла;
Свойства.Сортировать("Представление");
КонецПроцедуры
// Вернуть константу со списком свойств событий
//
Функция ПолучитьСписокСвойствСобытий() Экспорт
Если мСписокСвойствСобытий = Неопределено Тогда
мСписокСвойствСобытий = Новый СписокЗначений;
Если Свойства.Количество() = 0 Тогда
ЗаполнитьСписокСвойствСобытий();
КонецЕсли;
Для Каждого СтрокаТЧ Из Свойства Цикл
мСписокСвойствСобытий.Добавить(СтрокаТЧ.НИмя, СтрокаТЧ.Представление + " (" + СтрокаТЧ.Имя + ")");
КонецЦикла;
КонецЕсли;
Возврат мСписокСвойствСобытий;
КонецФункции
// Заполнить структуру имен свойств
//
Процедура ЗаполнитьСписокИменСвойств()
мСписокИменСвойств = ПолучитьСписокСвойствСобытий().Скопировать();
мСписокИменСвойств.Вставить(0, "all", "All (все свойства)");
КонецПроцедуры
// Вернуть константу со списком имен свойств
//
Функция ПолучитьСписокИменСвойств() Экспорт
Если мСписокИменСвойств = Неопределено Тогда
ЗаполнитьСписокИменСвойств();
КонецЕсли;
Возврат мСписокИменСвойств;
КонецФункции
// Заполнить структуру наименований выполняемого действия
//
Процедура ЗаполнитьСписокДействий()
мСписокДействий = Новый СписокЗначений;
мСписокДействий.Добавить("agentauthenticate", "agentAuthenticate (аутентификация администратора центрального сервера)");
мСписокДействий.Добавить("authenticateadmin", "authenticateAdmin (аутентификация администратора информационной базы)");
мСписокДействий.Добавить("authenticatesrvrUser", "authenticateSrvrUser (аутентификация администратора кластера в рабочем процессе)");
мСписокДействий.Добавить("begintransaction", "beginTransaction (начало транзакции)");
мСписокДействий.Добавить("changelocale", "changeLocale (изменение национальные настройки базы данных)");
мСписокДействий.Добавить("committransaction", "commitTransaction (фиксация транзакции)");
мСписокДействий.Добавить("copymovefile", "copyMoveFile (копирование/перемещение фрагмента конфигурации между записями таблиц базы данных)");
мСписокДействий.Добавить("createfile", "createFile (создание файла)");
мСписокДействий.Добавить("createinfobase", "createInfoBase (создание информационной базы)");
мСписокДействий.Добавить("deletefile", "deleteFile (удаление файла)");
мСписокДействий.Добавить("deserializetable", "deserializeTable (восстановление данных таблицы базы данных из файла)");
мСписокДействий.Добавить("dropinfobase", "dropInfoBase (удаление информационной базы)");
мСписокДействий.Добавить("eraseagentuser", "eraseAgentUser (удаление администратора центрального сервера)");
мСписокДействий.Добавить("eraseibregistry", "eraseIBRegistry (удаление кластера)");
мСписокДействий.Добавить("eraseregserver", "eraseRegServer (удаление рабочего сервера)");
мСписокДействий.Добавить("erasereguser", "eraseRegUser (удаление администратора кластера)");
мСписокДействий.Добавить("eraseserverprocess", "eraseServerProcess (удаление рабочего процесса)");
мСписокДействий.Добавить("gettransactionsplitter", "getTransactionSplitter (получение разделителя итогов)");
мСписокДействий.Добавить("holdconnection", "holdConnection (удержание соединения)");
мСписокДействий.Добавить("insertagentuser", "insertAgentUser (добавление администратора центрального сервера)");
мСписокДействий.Добавить("insertibregistry", "insertIBRegistry (создание кластера)");
мСписокДействий.Добавить("insertrecords", "insertRecords (добавление записи в таблицу базы данных)");
мСписокДействий.Добавить("insertregserver", "insertRegServer (добавление рабочего сервера)");
мСписокДействий.Добавить("insertreguser", "insertRegUser (добавление администратора кластера)");
мСписокДействий.Добавить("insertserverprocess", "insertServerProcess (добавление рабочего процесса)");
мСписокДействий.Добавить("isproperlocale", "isProperLocale (проверка национальных настроек, установленных для базы данных)");
мСписокДействий.Добавить("killclient", "killClient (разрыв соединения клиента с кластером серверов 1С:Предприятия)");
мСписокДействий.Добавить("lockrecord", "lockRecord (блокировка записи)");
мСписокДействий.Добавить("lookuptmptable", "lookupTmpTable (получение/создание временной балицы базы данных)");
мСписокДействий.Добавить("modifyfile", "modifyFile (обновление файла)");
мСписокДействий.Добавить("movefile", "moveFile (перемещение файла)");
мСписокДействий.Добавить("quickinsert", "quickInsert (быстрая вставка данных в таблицу базы данных)");
мСписокДействий.Добавить("readfile", "readFile (чтение файла)");
мСписокДействий.Добавить("regauthenticate", "regAuthenticate (аутентификация администратора кластера)");
мСписокДействий.Добавить("restoreobject", "restoreObject (восстановление объект)");
мСписокДействий.Добавить("resumeindexing", "resumeIndexing (восстановление индексирования таблиц базы данных)");
мСписокДействий.Добавить("returntmptable", "returnTmpTable (освобождение временной таблицы базы данных)");
мСписокДействий.Добавить("rollbacktransaction", "rollbackTransaction (отмена транзакции)");
мСписокДействий.Добавить("saveobject", "saveObject (сохранение объект)");
мСписокДействий.Добавить("searchfile", "searchFile (поиск файла)");
мСписокДействий.Добавить("securedinsert", "securedInsert (вставка записей с наложением ограничений доступа к данным)");
мСписокДействий.Добавить("selectfilename", "selectFileName (выбор имени файла)");
мСписокДействий.Добавить("serializetable", "serializeTable (сохранение данных таблицы в файл)");
мСписокДействий.Добавить("setinfobaseconnectingdeny", "setInfoBaseConnectingDeny (установка режима блокировки установки соединений с информационной базой)");
мСписокДействий.Добавить("setinfobasedescr", "setInfoBaseDescr (установка описания информационной базы)");
мСписокДействий.Добавить("setregdescr", "setRegDescr (установка описания кластера)");
мСписокДействий.Добавить("setregmultiprocenable", "setRegMultiProcEnable (установка значения флага поддрержки кластером многих рабочих процессов)");
мСписокДействий.Добавить("setregseclevel", "setRegSecLevel (установка уровня безопасности кластера)");
мСписокДействий.Добавить("setrollbackonly", "setRollbackOnly (установка флага наличия в транзакции ошибки (ее можно только откатить))");
мСписокДействий.Добавить("setserverprocesscapacity", "setServerProcessCapacity (установка значения пропускной способности рабочего процесса)");
мСписокДействий.Добавить("setserverprocessenable", "setServerProcessEnable (установка значениея флага разрешения запуска рабочего процесса)");
мСписокДействий.Добавить("setsingleuser", "setSingleUser (установка монопольного режима)");
мСписокДействий.Добавить("suspendindexing", "suspendIndexing (отмена индексирования таблиц базы данных)");
мСписокДействий.Добавить("takekeyval", "takeKeyVal (получение значения ключа записи табличной части)");
мСписокДействий.Добавить("updateregserver", "updateRegServer (изменение параметров рабочего сервера)");
мСписокДействий.Добавить("xlocktables", "xlockTables (установка исключительной блокировки на таблицу)");
мСписокДействий.Добавить("xlocktablesshared", "xlockTablesShared (установкаь разделяемой блокировки на таблицу)");
КонецПроцедуры
// Вернуть константу со списком наименований выполняемого действия
//
Функция ПолучитьСписокДействий() Экспорт
Если мСписокДействий = Неопределено Тогда
ЗаполнитьСписокДействий();
КонецЕсли;
Возврат мСписокДействий;
КонецФункции
// Поиск в списке значений значения по представлению
//
Функция НайтиЗначениеПоПредставлению(Представление) Экспорт
Для Инд = 0 По мВидыСравнения.Количество() Цикл
Если Представление = мВидыСравнения[Инд].Представление Тогда
Возврат мВидыСравнения[Инд].Значение;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция ПолучитьПредставлениеЭлементаОтбораСобытий(УзелСобытий, ИндСоб) Экспорт
СтрокаПредставления = "";
УзелУсловий = УзелСобытий.Элемент(ИндСоб).ПервыйДочерний;
Пока УзелУсловий <> Неопределено Цикл
Если СтрокаПредставления <> "" Тогда
СтрокаПредставления = СтрокаПредставления + " И ";
КонецЕсли;
Свойство = "";
Значение = "";
Для Каждого Атрибут Из УзелУсловий.Атрибуты Цикл
Если Атрибут.ИмяУзла = "property" Тогда
Свойство = Атрибут.ЗначениеУзла;
КонецЕсли;
Если Атрибут.ИмяУзла = "value" Тогда
Значение = Атрибут.ЗначениеУзла;
КонецЕсли;
КонецЦикла;
СтрокаПредставления = СтрокаПредставления + "'" + Свойство + "'"
+ " " + ПолучитьСписокСравнения().НайтиПоЗначению(НРег(ЛксПолучитьПервыйФрагмент(УзелУсловий.ИмяУзла, ":"))) + " "
+ "'" + Значение + "'";
УзелУсловий = УзелУсловий.СледующийСоседний;
КонецЦикла;
Возврат СтрокаПредставления;
КонецФункции
Функция ПолучитьИмяСобытияЭлементаОтбораСобытийНаРавенство(УзелСобытий, ИндСоб) Экспорт
УзелУсловий = УзелСобытий.Элемент(ИндСоб).ПервыйДочерний;
Пока УзелУсловий <> Неопределено Цикл
Если УзелУсловий.ИмяУзла = "eq" Тогда
АтрибутИмениСобытия = УзелУсловий.Атрибуты.ПолучитьИменованныйЭлемент("property");
Если Истина
И АтрибутИмениСобытия <> Неопределено
И НРег(АтрибутИмениСобытия.ЗначениеУзла) = НРег("Name")
Тогда
АтрибутЗначенияИмениСобытия = УзелУсловий.Атрибуты.ПолучитьИменованныйЭлемент("value");
Если АтрибутЗначенияИмениСобытия <> Неопределено Тогда
Возврат АтрибутЗначенияИмениСобытия.ЗначениеУзла;
КонецЕсли;
КонецЕсли;
ИначеЕсли УзелУсловий.ИмяУзла = "ne" Тогда
АтрибутИмениСобытия = УзелУсловий.Атрибуты.ПолучитьИменованныйЭлемент("property");
Если Истина
И АтрибутИмениСобытия <> Неопределено
И НРег(АтрибутИмениСобытия.ЗначениеУзла) = НРег("Name")
Тогда
АтрибутЗначенияИмениСобытия = УзелУсловий.Атрибуты.ПолучитьИменованныйЭлемент("value");
Если АтрибутЗначенияИмениСобытия <> Неопределено Тогда
Если АтрибутЗначенияИмениСобытия.ЗначениеУзла = "" Тогда
Возврат "<ALL>";
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецЕсли;
УзелУсловий = УзелУсловий.СледующийСоседний;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция НайтиДобавитьУзелВКоллекцию(Искать = Истина, Документ = Неопределено, Коллекция = Неопределено, ИмяУзла) Экспорт
Если Документ = Неопределено Тогда
Документ = мДокументДОМ;
КонецЕсли;
#Если _ Тогда
Документ = Новый ДокументDOM;
#КонецЕсли
Если Коллекция = Неопределено Тогда
Коллекция = Документ.ПервыйДочерний;
КонецЕсли;
Если Искать Тогда
СписокУзлов = Коллекция.ПолучитьЭлементыПоИмени(ИмяУзла);
КонецЕсли;
Если Истина
И Искать
И СписокУзлов.Количество() > 0
Тогда
Узел = СписокУзлов.Элемент(0);
Иначе
Узел = Документ.СоздатьЭлемент(ИмяУзла);
Коллекция.ДобавитьДочерний(Узел);
КонецЕсли;
Возврат Узел;
КонецФункции // ДобавитьУзелВКоллекцию()
Функция НайтиДобавитьУзелСАтрибутами(Искать = Истина, Документ = Неопределено, Родитель = Неопределено, ИмяУзла, СтруктураАтрибутов = Неопределено) Экспорт
Узел = НайтиДобавитьУзелВКоллекцию(Искать, Документ, Родитель, ИмяУзла);
Если СтруктураАтрибутов <> Неопределено Тогда
Для каждого Атрибут Из СтруктураАтрибутов Цикл
Узел.УстановитьАтрибут(Атрибут.Ключ, XMLСтрока(Атрибут.Значение));
КонецЦикла;
КонецЕсли;
Возврат Узел;
КонецФункции
// Проверить принадлежность имени к требуемому
//
Функция ПроверитьПринадлежность(Имя) Экспорт
Если ВернутьСписокСоответствующийИмени(Имя).Количество() > 0 Тогда
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
// Проверить принадлежность имени к требуемому
//
Функция ВернутьСписокСоответствующийИмени(Имя) Экспорт
Если НРег(Имя) = "name" Тогда
Возврат ПолучитьСписокСобытий();
ИначеЕсли НРег(Имя) = "func" Тогда
Возврат ПолучитьСписокДействий();
ИначеЕсли НРег(Имя) = "level" Тогда
Возврат ПолучитьСписокУровнейСистемныхСобытий();
Иначе
ПустойСписок = Новый СписокЗначений;
Возврат ПустойСписок;
КонецЕсли;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ РАБОТЫ С ДОКУМЕНТОМ DOM
// Загрузить XML файл в DOM документ
Функция ЗагрузитьXML(ИмяФайла) Экспорт
ТекстХМЛ = ирНеглобальный.ПрочитатьТекстИзФайлаЛкс(ИмяФайла,, НаСервере);
ЧтениеХМЛ = Новый ЧтениеXML();
ЧтениеХМЛ.УстановитьСтроку(ТекстХМЛ);
ПостроительДом = Новый ПостроительDOM();
Попытка
ДокументДОМ = ПостроительДом.Прочитать(ЧтениеХМЛ);
Исключение
Сообщить("Ошибка при чтении файла XML: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
Возврат ДокументДОМ;
КонецФункции
Процедура мПереместитьФайл(ИмяИсточника, ИмяПриемника) Экспорт
Если НаСервере Тогда
ирСервер.ПереместитьФайлЛкс(ИмяИсточника, ИмяПриемника);
Иначе
ПереместитьФайл(ИмяИсточника, ИмяПриемника);
КонецЕсли;
КонецПроцедуры // ПереместитьФайл()
Функция ЛиФайлСуществует(ПолноеИмяФайла, пНаСервере = Неопределено, выхДатаИзменения = Неопределено) Экспорт
Если пНаСервере = Неопределено Тогда
пНаСервере = НаСервере;
КонецЕсли;
Если пНаСервере Тогда
ФайлНайден = ирСервер.ЛиФайлСуществуетЛкс(ПолноеИмяФайла, выхДатаИзменения);
Иначе
Файл1 = Новый Файл(ПолноеИмяФайла);
ФайлНайден = Файл1.Существует();
Если ФайлНайден Тогда
выхДатаИзменения = Файл1.ПолучитьВремяИзменения();
КонецЕсли;
КонецЕсли;
Возврат ФайлНайден;
КонецФункции // ЛиФайлСуществует()
// Загрузить конфигурационный файл XML в документ DOM
//
Функция ЗагрузитьКонфигурационныйXML(Знач ИмяФайла, пНаСервере = Неопределено) Экспорт
Если мДокументДОМ <> Неопределено Тогда
Возврат мДокументДОМ;
КонецЕсли;
Если пНаСервере = Неопределено Тогда
пНаСервере = НаСервере;
КонецЕсли;
Шаблон = Ложь;
МетаМакет = Метаданные().Макеты.Найти(ИмяФайла);
Если МетаМакет <> Неопределено Тогда
ЗагрузитьШаблон(ИмяФайла, "", "");
Возврат мДокументДОМ;
ИначеЕсли ЗначениеЗаполнено(ИмяФайла) Тогда
ФайлСуществует = ЛиФайлСуществует(ИмяФайла, пНаСервере);
Если Не ФайлСуществует Тогда
ИмяФайла = ПолучитьИмяФайлаШаблона(ИмяФайла);
Шаблон = Истина;
КонецЕсли;
Иначе
ИмяФайла = ПолучитьПолноеИмяКонфигурационногоФайла();
КонецЕсли;
КонфигурационныйФайл = Новый Файл(ИмяФайла);
ФайлСуществует = ЛиФайлСуществует(ИмяФайла, пНаСервере);
Если Не ФайлСуществует Тогда
Документ = Новый ДокументDOM("http://v8.1c.ru/v8/tech-log", "config");
мДокументДОМ = Документ;
// Создаем новую настройку техножурнала
Элемент = Документ.СоздатьЭлемент("dump");
Элемент.УстановитьАтрибут("create", "true");
//Элемент.УстановитьАтрибут("location", "");
Элемент.УстановитьАтрибут("type", "0");
Элемент.УстановитьАтрибут("prntscrn", "false");
Документ.ПервыйДочерний.ДобавитьДочерний(Элемент);
Элемент = Документ.СоздатьЭлемент("log");
Элемент.УстановитьАтрибут("history", "24");
Элемент.УстановитьАтрибут("location", "");
ЭлементProperty = мДокументДОМ.СоздатьЭлемент("property");
ЭлементProperty.УстановитьАтрибут("name", "all");
УзелСвойства = Элемент.ДобавитьДочерний(ЭлементProperty);
Документ.ПервыйДочерний.ДобавитьДочерний(Элемент);
УтечкиМетоды.Очистить();
СистемныеСобытия.Очистить();
//ЗаписатьДОМ(Документ, КонфигурационныйФайл.ПолноеИмя);
УстановитьПути(ОсновнойКаталогЖурнала, ОсновнойКаталогДампов);
Иначе
СтрокаХМЛ = ирНеглобальный.ПрочитатьТекстИзФайлаЛкс(КонфигурационныйФайл.ПолноеИмя,, пНаСервере);
ПрочитатьДокументДомИзСтроки(СтрокаХМЛ);
КонецЕсли;
Если Шаблон Тогда
УдалитьОписаниеШаблона();
КонецЕсли;
Возврат мДокументДОМ;
КонецФункции
Функция ПрочитатьДокументДомИзСтроки(СтрокаХМЛ)
ЧтениеХМЛ = Новый ЧтениеXML();
ЧтениеХМЛ.УстановитьСтроку(СтрокаХМЛ);
ПостроительДом = Новый ПостроительDOM();
Попытка
мДокументДОМ = ПостроительДом.Прочитать(ЧтениеХМЛ);
Исключение
Сообщить("Ошибка при чтении файла XML: " + ОписаниеОшибки(), СтатусСообщения.Внимание);
Возврат Неопределено;
КонецПопытки;
Возврат Неопределено;
КонецФункции
// Записать документ DOM в файл XML
//
Процедура ЗаписатьДОМ(Документ, ИмяФайла) Экспорт
ЗаписьХМЛ = Новый ЗаписьXML();
ЗаписьХМЛ.УстановитьСтроку(мКодировкаФайла);
ЗаписатьДом = Новый ЗаписьDOM();
ЗаписатьДом.Записать(Документ, ЗаписьХМЛ);
СтрокаХМЛ = ЗаписьХМЛ.Закрыть();
ирНеглобальный.ЗаписатьТекстВФайлЛкс(ИмяФайла, СтрокаХМЛ, мКодировкаФайла, НаСервере);
КонецПроцедуры
// Запись DOM в файл XML, учитывая выбранный шаблон
//
Функция ЗаписатьКонфигурационныйXML() Экспорт
УдалитьОписаниеШаблона();
ПолучитьОбновитьДокументДОМ();
ИмяКонфигурационногоФайла = ПолучитьПолноеИмяКонфигурационногоФайла();
ЗаписатьДОМ(мДокументДОМ, ИмяКонфигурационногоФайла);
Возврат ИмяКонфигурационногоФайла;
КонецФункции
Функция ПолучитьСписокУровнейСистемныхСобытий() Экспорт
ТабличныйДокумент = ПолучитьМакет("УровниСистемныхСобытий");
ТаблицаУровней = ирНеглобальный.ПолучитьТаблицуИзТабличногоДокументаЛкс(ТабличныйДокумент);
Список = Новый СписокЗначений;
Для каждого СтрокаУровня Из ТаблицаУровней Цикл
Список.Добавить(СтрокаУровня.Имя, СтрокаУровня.Представление);
КонецЦикла;
Возврат Список;
КонецФункции
// Удаляется из документа описание шаблона
//
Процедура УдалитьОписаниеШаблона() Экспорт
Попытка
КоллекцияУзловОписанияШаблона = мДокументДОМ.ПолучитьЭлементыПоИмени("draft");
Для Инд = 1 По КоллекцияУзловОписанияШаблона.Количество() Цикл
УзелОписанияШаблона = КоллекцияУзловОписанияШаблона.Элемент(0);
УзелОписанияШаблона.РодительскийУзел.УдалитьДочерний(УзелОписанияШаблона);
КонецЦикла;
Исключение
КонецПопытки;
КонецПроцедуры
// Получить строку XML представления документа DOM для записи в
// поле текстового документа
Функция ПолучитьСтрокуХМЛ(Документ) Экспорт
ЗаписьХМЛ = Новый ЗаписьXML();
ЗаписьХМЛ.УстановитьСтроку(мКодировкаФайла);
ЗаписатьДом = Новый ЗаписьDOM();
УдалитьОписаниеШаблона();
ЗаписатьДом.Записать(Документ, ЗаписьХМЛ);
Возврат ЗаписьХМЛ.Закрыть();
КонецФункции
Функция ПолучитьОбновитьДокументДОМ() Экспорт
ЗаписатьНастройкиДампа();
Если Не ПустаяСтрока(КаталогСистемногоЖурнала) Тогда
Элемент = НайтиДобавитьУзелВКоллекцию(, , , "defaultlog");
Если Не ПустаяСтрока(КаталогСистемногоЖурнала) Тогда
Элемент.УстановитьАтрибут("location", XMLСтрока(КаталогСистемногоЖурнала));
КонецЕсли;
Если СрокХраненияСистемногоЖурнала <> 24 Тогда
Элемент.УстановитьАтрибут("history", XMLСтрока(СрокХраненияСистемногоЖурнала));
КонецЕсли;
КонецЕсли;
Если СледитьЗаУтечкамиПамятиВПрикладномКоде Тогда
Утечки = НайтиДобавитьУзелСАтрибутами(,,, "leaks", Новый Структура("collect", Истина));
Пока Утечки.ПервыйДочерний <> Неопределено Цикл
Утечки.УдалитьДочерний(Утечки.ПервыйДочерний);
КонецЦикла;
Если КонтрольнаяТочкаУтечкиКлиент Тогда
НайтиДобавитьУзелСАтрибутами(Ложь, , Утечки, "point", Новый Структура("call", "client"));
КонецЕсли;
Если КонтрольнаяТочкаУтечкиСервер Тогда
НайтиДобавитьУзелСАтрибутами(Ложь, , Утечки, "point", Новый Структура("call", "server"));
КонецЕсли;
Для каждого СтрокаУтечки Из УтечкиМетоды Цикл
Если ПустаяСтрока(СтрокаУтечки.Метод) Тогда
Продолжить;
КонецЕсли;
НайтиДобавитьУзелСАтрибутами(Ложь, , Утечки, "point", Новый Структура("proc", СтрокаУтечки.Метод));
КонецЦикла;
//Для каждого Утечка Из УтечкиПроцедуры Цикл
// НайтиДобавитьУзелСАтрибутами(Ложь, , Утечки, "point", Новый Структура("on, off", Утечка.Строка1, Утечка.Строка2));
//КонецЦикла;
КонецЕсли;
ИмяЭлемента = "system";
Если СледитьЗаУтечкамиПамятиВРабочихПроцессах Тогда
НайтиДобавитьУзелВКоллекцию(, , , ИмяЭлемента);
Иначе
УдалитьКорневыеЭлементыПоИмени(ИмяЭлемента);
КонецЕсли;
Если СистемныеСобытия.Количество() Тогда
Для каждого СтрокаСобытия Из СистемныеСобытия Цикл
Если ПустаяСтрока(СтрокаСобытия.Уровень) Тогда
Продолжить;
КонецЕсли;
Элемент = НайтиДобавитьУзелВКоллекцию(Ложь, , , "system");
Элемент.УстановитьАтрибут("level", XMLСтрока(СтрокаСобытия.Уровень));
Если НЕ ПустаяСтрока(СтрокаСобытия.Компонент) Тогда
Элемент.УстановитьАтрибут("component", XMLСтрока(СтрокаСобытия.Компонент));
КонецЕсли;
Если НЕ ПустаяСтрока(СтрокаСобытия.Класс) Тогда
Элемент.УстановитьАтрибут("class", XMLСтрока(СтрокаСобытия.Класс));
КонецЕсли;
КонецЦикла;
КонецЕсли;
ИмяЭлемента = "mem";
Если СледитьЗаУтечкамиПамятиВРабочихПроцессах Тогда
НайтиДобавитьУзелВКоллекцию(, , , ИмяЭлемента);
Иначе
УдалитьКорневыеЭлементыПоИмени(ИмяЭлемента);
КонецЕсли;
//ИмяЭлемента = "planSQL";
ИмяЭлемента = "plansql";
Если ФиксироватьПланыЗапросовSQL Тогда
НайтиДобавитьУзелВКоллекцию(, , , ИмяЭлемента);
Иначе
УдалитьКорневыеЭлементыПоИмени(ИмяЭлемента);
КонецЕсли;
Возврат мДокументДОМ;
КонецФункции
Процедура УдалитьКорневыеЭлементыПоИмени(ИмяЭлемента)
НайденныеЭлементы = мДокументДОМ.ПолучитьЭлементыПоИмени(ИмяЭлемента);
Для Каждого НайденныйЭлемент Из НайденныеЭлементы Цикл
Если НРег(НайденныйЭлемент.РодительскийУзел.ИмяУзла) = НРег("config") Тогда
НайденныйЭлемент.РодительскийУзел.УдалитьДочерний(НайденныйЭлемент);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
// Вернуть документ DOM
//
Функция ДокументДОМ() Экспорт
Возврат мДокументДОМ;
КонецФункции
// Закрытие документа
//
Процедура ЗакрытьДокумент() Экспорт
мДокументДОМ = Неопределено;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ ДОСТУПА К ЭЛЕМЕНТАМ ДЕРЕВА ДОКУМЕНТА DOM
Функция ПолучитьУзелЖурнала(НомерЖурнала) Экспорт
СписокЭлементов = мДокументДОМ.ПолучитьЭлементыПоИмени("log");
Если СписокЭлементов.Количество() > 0 Тогда
Результат = СписокЭлементов.Элемент(НомерЖурнала - 1);
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ОчиститьЖурнал(Индекс) Экспорт
мДокументДОМ.ПервыйДочерний.ЗаменитьДочерний(НовыйЖурнал(), ПолучитьУзелЖурнала(Индекс));
КонецПроцедуры
Функция НовыйЖурнал() Экспорт
Элемент = мДокументДОМ.СоздатьЭлемент("log");
Элемент.УстановитьАтрибут("history", "");
Элемент.УстановитьАтрибут("location", "");
Возврат Элемент;
КонецФункции
Функция ПолучитьПервыйУзелСобытий(ИндексЖурнала) Экспорт
УзлыЖурнала = ПолучитьСписокЖурналов();
Возврат УзлыЖурнала.Элемент(ИндексЖурнала).ПервыйДочерний;
КонецФункции
Функция ПолучитьУзелСобытия(ИндексЖурнала, ИндексСобытия) Экспорт
НомерУзла = 0;
СписокУзлов = ПолучитьСписокСобытийЖурнала(ИндексЖурнала);
Для Инд = 0 По СписокУзлов.Количество() - 1 Цикл
УзелСобытия = СписокУзлов.Элемент(Инд);
Если УзелСобытия.РодительскийУзел.ИмяУзла = "log" Тогда
НомерУзла = НомерУзла + 1;
КонецЕсли;
Если НомерУзла = ИндексСобытия Тогда
Возврат УзелСобытия;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция ПолучитьУзелСвойства(НомерЖурнала, НомерСвойства) Экспорт
СписокСвойств = ПолучитьСписокСвойств(НомерЖурнала);
Если СписокСвойств.Количество() >= НомерСвойства Тогда
Результат = СписокСвойств.Элемент(НомерСвойства - 1);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПолучитьСписокЖурналов() Экспорт
Результат = мДокументДОМ.ПолучитьЭлементыПоИмени("log");
Возврат Результат;
КонецФункции
Функция ПолучитьСписокСобытийЖурнала(НомерЖурнала) Экспорт
УзлыЖурнала = ПолучитьСписокЖурналов();
Результат = УзлыЖурнала.Элемент(НомерЖурнала - 1).ПолучитьЭлементыПоИмени("event");
Возврат Результат;
КонецФункции
Функция ПолучитьСписокСвойств(НомерЖурнала) Экспорт
УзлыЖурнала = ПолучитьСписокЖурналов();
Результат = УзлыЖурнала.Элемент(НомерЖурнала - 1).ПолучитьЭлементыПоИмени("property");
Возврат Результат;
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ РАБОТЫ С ДАМПОМ
// Считать настройки дампа из документа DOM
//
Процедура ПрочитатьНастройкиДампа() Экспорт
ЗаписатьНастройкиД = Ложь;
ЭлементДамп = мДокументДОМ.ПолучитьЭлементыПоИмени("dump");
Если ЭлементДамп.Количество() > 0 Тогда
ПервыйЭлемент = ЭлементДамп.Элемент(0);
Если ПервыйЭлемент <> Неопределено Тогда
ТипДампа = ПервыйЭлемент.ПолучитьАтрибут("type");
РасположениеДампа = ПервыйЭлемент.ПолучитьАтрибут("location");
Попытка
ДампСкриншот = XMLЗначение(Тип("Булево"), ПервыйЭлемент.ПолучитьАтрибут("prntscrn"));
Исключение
ДампСкриншот = Ложь;
//ЗаписатьНастройкиД = Истина;
//ПервыйЭлемент.УстановитьАтрибут("prntscrn", "false");
КонецПопытки;
Попытка
СоздаватьДамп = XMLЗначение(Тип("Булево"), ПервыйЭлемент.ПолучитьАтрибут("create"));
Исключение
СоздаватьДамп = Ложь;
//ЗаписатьНастройкиД = Истина;
//ПервыйЭлемент.УстановитьАтрибут("create", "false");
КонецПопытки;
КонецЕсли;
Иначе
ТипДампа = 0;
РасположениеДампа = "";
ДампСкриншот = Ложь;
СоздаватьДамп = Ложь;
КонецЕсли;
//Если ЗаписатьНастройкиД Тогда
// ЗаписатьДОМ(мДокументДОМ, ПолучитьПолноеИмяКонфигурационногоФайла());
//КонецЕсли;
КонецПроцедуры
// Записать настройки дампа в документа DOM
//
Функция ЗаписатьНастройкиДампа() Экспорт
Перем ПервыйДочерний;
ЭлементДамп = мДокументДОМ.ПолучитьЭлементыПоИмени("dump");
Если ЭлементДамп.Количество() = 0 Тогда
Элемент = мДокументДОМ.СоздатьЭлемент("dump");
Элемент.УстановитьАтрибут("create", "true");
//Элемент.УстановитьАтрибут("location", "");
Элемент.УстановитьАтрибут("type", "0");
Элемент.УстановитьАтрибут("prntscrn", "false");
ПервыйДочерний = Элемент;
мДокументДОМ.ПервыйДочерний.ДобавитьДочерний(Элемент);
Иначе
ПервыйДочерний = ЭлементДамп.Элемент(0);
КонецЕсли;
ПервыйДочерний.УстановитьАтрибут("create", XMLСтрока(СоздаватьДамп));
ПервыйДочерний.УстановитьАтрибут("type", XMLСтрока(ТипДампа));
ПервыйДочерний.УстановитьАтрибут("prntscrn", XMLСтрока(ДампСкриншот));
Если Не ПустаяСтрока(РасположениеДампа) Тогда
ПервыйДочерний.УстановитьАтрибут("location", РасположениеДампа);
Иначе
ПервыйДочерний.УдалитьАтрибут("location");
КонецЕсли;
Возврат мДокументДОМ;
КонецФункции
// Считать настройки журнала из документа DOM
//
Процедура ПрочитатьНастройкиЖурнала(Индекс, Местоположение, ВремяХранения, ПредставлениеСобытий = Неопределено) Экспорт
УзлыЖурналов = ПолучитьСписокЖурналов();
УзелЖурнала = УзлыЖурналов.Элемент(Индекс);
Местоположение = УзелЖурнала.ПолучитьАтрибут("location");
ВремяХранения = УзелЖурнала.ПолучитьАтрибут("history");
Попытка
ВремяХранения = Число(ВремяХранения);
Исключение
ВремяХранения = 1;
КонецПопытки;
//Для Каждого Атрибут Из УзелЖурнала.Атрибуты Цикл
// Если Атрибут.ИмяУзла = "location" Тогда
// Попытка
// Местоположение = Атрибут.ЗначениеУзла;
// Исключение
// Местоположение = "";
// КонецПопытки;
// КонецЕсли;
// Если Атрибут.ИмяУзла = "history" Тогда
// Попытка
// ВремяХранения = Число(Атрибут.ЗначениеУзла);
// Исключение
// ВремяХранения = 1;
// КонецПопытки;
// КонецЕсли;
//КонецЦикла;
ПредставлениеСобытий = ПолучитьПредставлениеУсловияЖурнала(Индекс);
КонецПроцедуры
Функция ПолучитьПредставлениеУсловияЖурнала(Индекс) Экспорт
ПредставлениеСобытий = "";
УзелСобытий = ПолучитьСписокСобытийЖурнала(Индекс + 1);
Для ИндСоб = 0 По УзелСобытий.Количество() - 1 Цикл
ПредставлениеУсловияСобытий = ПолучитьПредставлениеЭлементаОтбораСобытий(УзелСобытий, ИндСоб);
Если ПредставлениеСобытий <> "" Тогда
ПредставлениеСобытий = ПредставлениеСобытий + " ИЛИ ";
КонецЕсли;
ПредставлениеСобытий = ПредставлениеСобытий + "(" + ПредставлениеУсловияСобытий + ")";
КонецЦикла;
Возврат ПредставлениеСобытий;
КонецФункции
// Запись настройки журнал в документ DOM
//
Процедура ЗаписатьНастройкиЖурнала(Индекс, Местоположение, ВремяХранения) Экспорт
ЭлементДомЖурнала = ПолучитьУзелЖурнала(Индекс);
Если ЭлементДомЖурнала = Неопределено Тогда
Возврат;
КонецЕсли;
ЭлементДомЖурнала.УстановитьАтрибут("location", XMLСтрока(Местоположение));
ЭлементДомЖурнала.УстановитьАтрибут("history", XMLСтрока(ВремяХранения));
КонецПроцедуры
// Считать настройки журналов из документа DOM
//
Процедура ПрочитатьНастройкиЖурналов(ТабличноеПолеЖурналы) Экспорт
ТабличноеПолеЖурналы.Очистить();
УзлыЖурналов = ПолучитьСписокЖурналов();
Для Инд = 0 По УзлыЖурналов.Количество() - 1 Цикл
Журнал = ТабличноеПолеЖурналы.Добавить();
Журнал.НомерЖурнала = Инд + 1;
ПрочитатьНастройкиЖурнала(Инд, Журнал.Местоположение, Журнал.ВремяХранения, Журнал.События);
Журнал.Включен = Не ирНеглобальный.ЛиКаталогТехножурналаСодержитБлокирующиеФайлыЛкс(Журнал.Местоположение, НаСервере);
КонецЦикла;
КонецПроцедуры
// Изменить пути к файлам технологического журнала
//
Процедура УстановитьПути(КаталогЖурнала, КаталогДампа) Экспорт
ЭлементДамп = мДокументДОМ.ПолучитьЭлементыПоИмени("dump");
Если ЭлементДамп.Количество() > 0 Тогда
ЭлементДамп = ЭлементДамп.Элемент(0);
Иначе
ЭлементДамп = Неопределено;
КонецЕсли;
Если ЭлементДамп <> Неопределено Тогда
Если ЗначениеЗаполнено(КаталогДампа) Тогда
ЭлементДамп.УстановитьАтрибут("location", КаталогДампа);
КонецЕсли;
КонецЕсли;
Журналы = мДокументДОМ.ПолучитьЭлементыПоИмени("log");
Для Инд = 0 По Журналы.Количество() - 1 Цикл
Журнал = Журналы.Элемент(Инд);
Если ЗначениеЗаполнено(КаталогЖурнала) Тогда
Журнал.УстановитьАтрибут("location", КаталогЖурнала)
КонецЕсли;
КонецЦикла;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// СЕРВИСНЫЕ ФУНКЦИИ
// Перевести десятичное число в двоичное представление и
// разместить в строке в перевернутом виде
//
Процедура ДесятичноеВДвоичное(Знач Число)
мДвоичноеЧисло = "";
мЧисло = Число;
Пока Число >= 1 Цикл
Остаток = Число % 2;
Число = Цел(Число / 2);
мДвоичноеЧисло = мДвоичноеЧисло + Строка(Остаток);
КонецЦикла;
КонецПроцедуры
// Проверка взведения бита в числе
//
Функция ПроверитьБит(НомерБита, Число) Экспорт
Если Число <> мЧисло Тогда
ДесятичноеВДвоичное(Число);
КонецЕсли;
Если СтрДлина(мДвоичноеЧисло) < НомерБита Тогда
Возврат Ложь;
КонецЕсли;
Если Сред(мДвоичноеЧисло, НомерБита, 1) = "1" Тогда
Возврат Истина;
Иначе
Возврат Ложь;
КонецЕсли
КонецФункции
// Функция выбора значения при свойстве Name и Func
//
Процедура РедактированиеЗначения(ТабличноеПоле, Элемент) Экспорт
КолонкаЗначение = ТабличноеПоле.Колонки.Значение;
Свойство = ТабличноеПоле.ТекущаяСтрока.Свойство;
Если Свойство = "" Тогда
Возврат;
КонецЕсли;
ТипСвойства = ВернутьСписокТипов()[Свойство];
Если ПроверитьПринадлежность(Свойство) Тогда
КолонкаЗначение.УстановитьЭлементУправления(Тип("ПолеВвода"));
КолонкаЗначение.ЭлементУправления.ТипЗначения = ТипСвойства;
ДоВыбора = ТабличноеПоле.ТекущаяСтрока.Значение;
// В зависимости от имени свойства возвращаем соответствующий список
КолонкаЗначение.ЭлементУправления.Значение = ВернутьСписокСоответствующийИмени(Свойство);
Результат = КолонкаЗначение.ЭлементУправления.Значение.ВыбратьЭлемент();
КолонкаЗначение.УстановитьЭлементУправления(Тип("ПолеВвода"));
КолонкаЗначение.ЭлементУправления.ТипЗначения = Новый ОписаниеТипов("Строка");
КолонкаЗначение.ЭлементУправления.КнопкаВыбора = Истина;
КолонкаЗначение.ЭлементУправления.РедактированиеТекста = Ложь;
Если Результат = Неопределено Тогда
Если Не ПустаяСтрока(ДоВыбора) Тогда
ЭлементЗначения = ВернутьСписокСоответствующийИмени(Свойство).НайтиПоЗначению(НРег(ДоВыбора));
Если ЭлементЗначения <> Неопределено Тогда
КолонкаЗначение.ЭлементУправления.Значение = ЭлементЗначения.Представление;
Инд = ТабличноеПоле.Значение.Индекс(ТабличноеПоле.ТекущаяСтрока);
ТабличноеПоле.Значение.Получить(Инд).Значение = ДоВыбора;
КонецЕсли;
КонецЕсли;
Иначе
КолонкаЗначение.ЭлементУправления.Значение = Результат.Представление;
Инд = ТабличноеПоле.Значение.Индекс(ТабличноеПоле.ТекущаяСтрока);
ТабличноеПоле.Значение.Получить(Инд).Значение = Результат.Значение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Функция заменяет символ на другой
//
Функция ЗаменитьСимвол(Строка, Что, НаЧто) Экспорт
Возврат СтрЗаменить(Строка, Что, НаЧто);
КонецФункции
////////////////////////////////////////////////////////////////////////////////
// ОБЩИЕ ОБРАБОТЧИКИ СОБЫТИЙ
// Процедура обработки события показа строки
//
Процедура ПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки) Экспорт
Если ПроверитьПринадлежность(ДанныеСтроки.Свойство) Тогда
Если ДанныеСтроки.Значение <> "" И ДанныеСтроки.Значение <> Неопределено Тогда
НайденноеЗначение = ВернутьСписокСоответствующийИмени(ДанныеСтроки.Свойство).НайтиПоЗначению(НРег(ДанныеСтроки.Значение));
Если НайденноеЗначение <> Неопределено Тогда
ОформлениеСтроки.Ячейки.Значение.УстановитьТекст(НайденноеЗначение);
КонецЕсли;
КонецЕсли;
Иначе
Если ДанныеСтроки.Значение <> "" И ДанныеСтроки.Значение <> Неопределено Тогда
ОформлениеСтроки.Ячейки.Значение.УстановитьТекст(ДанныеСтроки.Значение);
КонецЕсли;
КонецЕсли;
Если ДанныеСтроки.Сравнение <> "" И ДанныеСтроки.Сравнение <> Неопределено Тогда
НайденноеЗначение = ПолучитьСписокСравнения().НайтиПоЗначению(НРег(ДанныеСтроки.Сравнение));
Если НайденноеЗначение <> Неопределено Тогда
ОформлениеСтроки.Ячейки.Сравнение.УстановитьТекст(НайденноеЗначение.Представление);
КонецЕсли;
Иначе
ОформлениеСтроки.Ячейки.Сравнение.УстановитьТекст(ПолучитьСписокСравнения().НайтиПоЗначению("eq").Представление);
КонецЕсли;
Если ДанныеСтроки.Свойство <> "" И ДанныеСтроки.Свойство <> Неопределено Тогда
ОформлениеСтроки.Ячейки.Свойство.УстановитьТекст(ПолучитьСписокСвойствСобытий().НайтиПоЗначению(НРег(ЗаменитьСимвол(ДанныеСтроки.Свойство, ":", "_"))).Представление);
КонецЕсли;
КонецПроцедуры
// Процедура обработки события начала редактирования
//
Процедура ПриНачалеРедактирования(ТабличноеПоле, Элемент, НоваяСтрока, Копирование) Экспорт
Если НоваяСтрока Тогда
Элемент.ТекущаяСтрока.Сравнение = "eq";
Иначе
Если Элемент.ТекущаяКолонка.Имя = "Значение" Тогда
Если ПустаяСтрока(Элемент.ТекущаяСтрока.Свойство) Тогда
// Редактировать нечего, неизвестен тип свойства
Возврат;
КонецЕсли;
Если Не НоваяСтрока Тогда
КолонкаЗначение = ТабличноеПоле.Колонки.Значение;
КолонкаЗначение.УстановитьЭлементУправления(Тип("ПолеВвода"));
КолонкаЗначение.ЭлементУправления.ТипЗначения = ВернутьСписокТипов()[Элемент.ТекущаяСтрока.Свойство];
КонецЕсли;
РедактированиеЗначения(ТабличноеПоле, Элемент);
Инд = ТабличноеПоле.Значение.Индекс(ТабличноеПоле.ТекущаяСтрока);
ТабличноеПоле.Колонки.Значение.ЭлементУправления.Значение = ТабличноеПоле.Значение.Получить(Инд).Значение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Процедура обработки события выбора
//
Процедура СвойствоОбработкаВыбора(ТабличноеПоле, Элемент, ВыбранноеЗначение, СтандартнаяОбработка) Экспорт
ТипСвойства = ВернутьСписокТипов()[ВыбранноеЗначение];
КолонкаЗначение = ТабличноеПоле.Колонки.Значение;
КолонкаЗначение.УстановитьЭлементУправления(Тип("ПолеВвода"));
КолонкаЗначение.ЭлементУправления.ТипЗначения = ТипСвойства;
Инд = ТабличноеПоле.Значение.Индекс(ТабличноеПоле.ТекущаяСтрока);
Если Строка(ТипСвойства) = "Строка" Тогда
ТабличноеПоле.Значение.Получить(Инд).Значение = "";
Иначе Если Строка(ТипСвойства) = "Число" Тогда
ТабличноеПоле.Значение.Получить(Инд).Значение = "0";
Иначе Если Строка(ТипСвойства) = "Список значений" Тогда
ТабличноеПоле.Значение.Получить(Инд).Значение = "";
КонецЕсли;КонецЕсли;КонецЕсли;
КонецПроцедуры
// Процедура обработки события выбора
//
Процедура ЗначениеНачалоВыбора(ТабличноеПоле, Элемент, СтандартнаяОбработка) Экспорт
Свойство = ТабличноеПоле.ТекущаяСтрока.Свойство;
Если ПроверитьПринадлежность(Свойство) Тогда
ДоВыбора = ТабличноеПоле.ТекущаяСтрока.Значение;
Результат = ВернутьСписокСоответствующийИмени(Свойство).ВыбратьЭлемент();
Если Результат = Неопределено Тогда
Если Не ПустаяСтрока(ДоВыбора) Тогда
ЭлементЗначения = ВернутьСписокСоответствующийИмени(Свойство).НайтиПоЗначению(НРег(ДоВыбора));
Если ЭлементЗначения <> Неопределено Тогда
ТабличноеПоле.Колонки.Значение.ЭлементУправления.Значение = ЭлементЗначения.Представление;
Инд = ТабличноеПоле.Значение.Индекс(ТабличноеПоле.ТекущаяСтрока);
ТабличноеПоле.Значение.Получить(Инд).Значение = ДоВыбора;
КонецЕсли;
КонецЕсли;
Иначе
ТабличноеПоле.Колонки.Значение.ЭлементУправления.Значение = Результат.Представление;
Инд = ТабличноеПоле.Значение.Индекс(ТабличноеПоле.ТекущаяСтрока);
ТабличноеПоле.Значение.Получить(Инд).Значение = Результат.Значение;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// ФУНКЦИИ РАБОТЫ С ШАБЛОНАМИ
// Добавляет описание шаблона в кэш
Процедура ДобавитьОписаниеШаблона(Имя, Описание) Экспорт
Элемент = КэшОписанияШаблонов.НайтиПоЗначению(Имя);
Если Элемент = Неопределено Тогда
КэшОписанияШаблонов.Добавить(Имя, Описание);
Иначе
Элемент = Описание;
КонецЕсли;
КонецПроцедуры
// Получение описания из кэша
Функция ПолучитьОписаниеШаблона(Имя) Экспорт
Описание = КэшОписанияШаблонов.НайтиПоЗначению(Имя);
Если Описание = Неопределено Тогда
Описание = "";
Файл = Новый Файл(ПолучитьИмяФайлаШаблона(Имя));
ФайлСуществует = ЛиФайлСуществует(Файл.ПолноеИмя);
Если ФайлСуществует Тогда
ДокументДом = ЗагрузитьXML(Файл.ПолноеИмя);
Шаблон = ДокументДом.ПолучитьЭлементыПоИмени("draft");
Если Шаблон.Количество() > 0 Тогда
Шаблон = Шаблон.Элемент(0);
Попытка
Описание = Шаблон.ПолучитьЭлементыПоИмени("description").Элемент(0).ТекстовоеСодержимое;
ДобавитьОписаниеШаблона(Имя, Описание);
Исключение
Описание = "";
КонецПопытки;
КонецЕсли;
ДокументДом = Неопределено;
КонецЕсли;
Иначе
Описание = Описание.Представление;
КонецЕсли;
Возврат Описание;
КонецФункции
Функция ПолучитьСодержимоеФайлаШаблона(ИмяШаблона) Экспорт
Шаблон = Ложь;
МетаМакет = Метаданные().Макеты.Найти(ИмяШаблона);
Если МетаМакет <> Неопределено Тогда
МакетШаблона = ПолучитьМакет(ИмяШаблона);
ТекстШаблона = МакетШаблона.ПолучитьТекст();
ТекстШаблона = Сред(ТекстШаблона, Найти(ТекстШаблона, Символы.ПС) + 1);
Возврат ТекстШаблона;
Иначе //Если ЗначениеЗаполнено(ИмяШаблона) Тогда
ИмяФайла = ПолучитьИмяФайлаШаблона(ИмяШаблона);
ТекстШаблона = ирНеглобальный.ПрочитатьТекстИзФайлаЛкс(ИмяФайла, , НаСервере);
КонецЕсли;
Возврат ТекстШаблона;
КонецФункции
// Заполнает список значений именем и представлением шаблона
Процедура ЗаполнитьСписокВыбораШаблона(СписокВыбора, ИсключитьСтандартные) Экспорт
Если СписокСтандартныхШаблонов.Количество() = 0 Тогда
МетаМакеты = Метаданные().Макеты;
Для Каждого МетаМакет Из МетаМакеты Цикл
Если Найти(МетаМакет.Имя, "Шаблон") = 1 Тогда
ПредставлениеМакета = МетаМакет.Представление();
ПредставлениеМакета = Сред(ПредставлениеМакета, Найти(ПредставлениеМакета, ":") + 1);
СписокСтандартныхШаблонов.Добавить(МетаМакет.Имя, ПредставлениеМакета);
МакетШаблона = ПолучитьМакет(МетаМакет.Имя);
ТекстШаблона = МакетШаблона.ПолучитьТекст();
Позиция = Найти(ТекстШаблона, "<?xml");
Описание = Лев(ТекстШаблона, Позиция - 1);
ДобавитьОписаниеШаблона(МетаМакет.Имя, Описание);
КонецЕсли;
КонецЦикла;
СписокСтандартныхШаблонов.СортироватьПоПредставлению();
КонецЕсли;
Если Не ИсключитьСтандартные Тогда
СписокВыбора = СписокСтандартныхШаблонов.Скопировать();
СписокВыбора.ЗаполнитьПометки(Истина);
КонецЕсли;
ИменаФайлов = ирНеглобальный.НайтиИменаФайловЛкс(ПолучитьДиректориюКонфигурационногоФайла(), "*.prst", , НаСервере);
Если ИменаФайлов.Количество() > 0 Тогда
Для Каждого ПолноеИмяФайла Из ИменаФайлов Цикл
Файл = Новый Файл(ПолноеИмяФайла);
Имя = Файл.ИмяБезРасширения;
ДокументДом = ЗагрузитьXML(Файл.ПолноеИмя);
Шаблон = ДокументДом.ПолучитьЭлементыПоИмени("draft");
Если Шаблон.Количество() > 0 Тогда
Шаблон = Шаблон.Элемент(0);
Попытка
Представление = Шаблон.ПолучитьЭлементыПоИмени("presentation").Элемент(0).ТекстовоеСодержимое;
Исключение
Представление = Имя;
КонецПопытки;
Попытка
Описание = Шаблон.ПолучитьЭлементыПоИмени("description").Элемент(0).ТекстовоеСодержимое;
Исключение
Описание = "";
КонецПопытки;
Иначе
Продолжить;
КонецЕсли;
СписокВыбора.Добавить(Имя, Представление);
ДобавитьОписаниеШаблона(Имя, Описание);
ДокументДом = Неопределено;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
////////////////////////////////////////////////////////////////////////////////
// Стандартные шаблоны
// Пустой шаблон
//
Процедура ПустойШаблон(СписокВыбора, КаталогЖурнала, КаталогДампа, Описание)
Если Описание Тогда
Имя = "__empty";
Представление = "Пустой шаблон";
Описание = "Настройка технологического журнала на поведение по умолчанию, " +
"как если бы конфигурационного файла не было.";
СписокВыбора.Добавить(Имя, Представление);
ДобавитьОписаниеШаблона(Имя, Описание);
Возврат;
КонецЕсли;
ЗакрытьДокумент();
мДокументДОМ = Новый ДокументDOM("http://v8.1c.ru/v8/tech-log", "config");
Элемент = мДокументДОМ.СоздатьЭлемент("dump");
Элемент.УстановитьАтрибут("create", "true");
//Элемент.УстановитьАтрибут("location", "");
Элемент.УстановитьАтрибут("type", "0");
Элемент.УстановитьАтрибут("prntscrn", "false");
мДокументДОМ.ПервыйДочерний.ДобавитьДочерний(Элемент);
КонецПроцедуры
Процедура ЗагрузитьШаблон(ИмяШаблона, КаталогЖурнала, КаталогДампа)
МакетШаблона = ПолучитьМакет(ИмяШаблона);
ТекстШаблона = МакетШаблона.ПолучитьТекст();
Позиция = Найти(ТекстШаблона, "<?xml");
Описание = Лев(ТекстШаблона, Позиция - 1);
ТекстШаблона = Сред(ТекстШаблона, Позиция);
ЗакрытьДокумент();
ПрочитатьДокументДомИзСтроки(ТекстШаблона);
КонецПроцедуры
ИспользоватьОбщийКаталогНастроек = Истина;
мКодировкаФайла = "UTF-8";