//ирПортативный Перем ирПортативный Экспорт; //ирПортативный Перем ирОбщий Экспорт; //ирПортативный Перем ирСервер Экспорт; //ирПортативный Перем ирКэш Экспорт; //ирПортативный Перем ирПривилегированный Экспорт; // Переменная документа, представляющего файл // настройки технологического журнала Перем мДокументДОМ; // Переменные для работы с двоичным представлением числа Перем мДвоичноеЧисло; Перем мЧисло; // Костанты списков данных Перем мВидыСравнения; Перем мСписокТипов; Перем мСписокСобытий; Перем мСписокСвойствСобытий; Перем мСоставСвойствСобытий; Перем мСписокИменСвойств; Перем мСписокДействий; Перем мКодировкаФайла; //////////////////////////////////////////////////////////////////////////////// // ЗАПОЛНЕНИЕ КОНСТАНТ И ИХ ВОЗВРАТ ПО ТРЕБОВАНИЮ // Возвращает имя конфигурационного файла // Функция ПолучитьПолноеИмяКонфигурационногоФайла(ИспользоватьОбщий = Неопределено) Экспорт Если ИспользоватьОбщий = Неопределено Тогда ИспользоватьОбщий = ИспользоватьОбщийКаталогНастроек; КонецЕсли; Результат = ПолучитьДиректориюКонфигурационногоФайла(ИспользоватьОбщий); Если ЗначениеЗаполнено(Результат) Тогда Результат = Результат + "\logcfg.xml"; КонецЕсли; Возврат Результат; КонецФункции // Возвращает каталог конфигурационного файла // Функция ПолучитьДиректориюКонфигурационногоФайла(ИспользоватьОбщий = Неопределено, СоздатьЕслиОтсутствует = Ложь) Экспорт Если ИспользоватьОбщий = Неопределено Тогда ИспользоватьОбщий = ИспользоватьОбщийКаталогНастроек; КонецЕсли; Если ЗначениеЗаполнено(КаталогНастройки) Тогда Результат = КаталогНастройки; ИначеЕсли НаСервере И ирКэш.ЛиПортативныйРежимЛкс() И Не ирКэш.ЭтоФайловаяБазаЛкс() Тогда Результат = ""; Иначе Результат = ирОбщий.ПолучитьКаталогНастроекПриложения1СЛкс(ИспользоватьОбщий, СоздатьЕслиОтсутствует, НаСервере); КонецЕсли; Возврат Результат; КонецФункции // Возвращает каталог технологического журнала // Функция ПолучитьДиректориюТехнологическогоЖурнала() Экспорт Возврат КаталогПрограммы() + "logs"; КонецФункции // Возвращает каталог дампа // Функция ПолучитьДиректориюДампа() Экспорт Возврат КаталогПрограммы() + "dumps"; КонецФункции // Возвращает имя файла шаблона по имени шаблона // Функция ПолучитьИмяФайлаШаблона(ИмяШаблона) Экспорт Возврат ПолучитьДиректориюКонфигурационногоФайла() + "\" + ИмяШаблона + ".prst"; КонецФункции // Заполнить структуру типов // Процедура ЗаполнитьСписокТипов() мСписокТипов = Новый Структура; СоставСвойствСобытий = ПолучитьСоставСвойствСобытий(); #Если _ Тогда СоставСвойствСобытий = Новый ТаблицаЗначений; #КонецЕсли Для Счетчик = 1 По СоставСвойствСобытий.Колонки.Количество() - 1 Цикл ИмяСвойства = СоставСвойствСобытий.Колонки[Счетчик].Имя; ТипСвойства = НРег(СоставСвойствСобытий[0][Счетчик]); Если ТипСвойства = "n" Тогда СтрокаТипов = "Число"; ИначеЕсли ТипСвойства = "s" Тогда СтрокаТипов = "Строка"; ИначеЕсли ТипСвойства = "d" Тогда СтрокаТипов = "Дата"; ИначеЕсли ТипСвойства = "b" Тогда СтрокаТипов = "Булево"; Иначе // fl, nl, ll СтрокаТипов = "СписокЗначений"; КонецЕсли; ОписаниеТипов = Новый ОписаниеТипов(СтрокаТипов); мСписокТипов.Вставить(ИмяСвойства, ОписаниеТипов); КонецЦикла; КонецПроцедуры Процедура ЗаполнитьСписокВыбораСрокаХранения(СписокВыбора) Экспорт СписокВыбора.Очистить(); СписокВыбора.Добавить(2); СписокВыбора.Добавить(6); СписокВыбора.Добавить(24, "1 день"); СписокВыбора.Добавить(48, "2 дня"); СписокВыбора.Добавить(168, "Неделя"); КонецПроцедуры // Вернуть константу со списком типов // Функция ВернутьСписокТипов() Экспорт Если мСписокТипов = Неопределено Тогда ЗаполнитьСписокТипов(); КонецЕсли; Возврат мСписокТипов; КонецФункции // Заполнить структуру списком событий // Процедура ЗаполнитьСтруктуруСобытий() Экспорт ТаблицаИзМакета = ирОбщий.ПолучитьТаблицуИзТабличногоДокументаЛкс(ПолучитьМакет("События")); События.Загрузить(ТаблицаИзМакета); События.Сортировать("Имя"); КонецПроцедуры // Вернуть константу со списком событий // Функция ПолучитьСписокСобытий() Экспорт Если мСписокСобытий = Неопределено Тогда Если События.Количество() = 0 Тогда ЗаполнитьСтруктуруСобытий(); КонецЕсли; мСписокСобытий = Новый СписокЗначений; Для Каждого СтрокаТЧ Из События Цикл Если ВРег(СтрокаТЧ.Имя) = "" Тогда Продолжить; КонецЕсли; мСписокСобытий.Добавить(НРег(СтрокаТЧ.Имя), СтрокаТЧ.Имя + " - " + СтрокаТЧ.Представление //+ " (" + СтрокаТЧ.Описание + ")" ); КонецЦикла; КонецЕсли; мСписокСобытий.СортироватьПоПредставлению(); Возврат мСписокСобытий; КонецФункции // Заполнить список представления сравнений // Процедура ЗаполнитьСписокСравнения() мВидыСравнения = Новый СписокЗначений; мВидыСравнения.Добавить("eq", "Равно"); мВидыСравнения.Добавить("ne", "Не равно"); мВидыСравнения.Добавить("gt", "Больше"); мВидыСравнения.Добавить("ge", "Больше или равно"); мВидыСравнения.Добавить("lt", "Меньше"); мВидыСравнения.Добавить("le", "Меньше или равно"); мВидыСравнения.Добавить("like", "Шаблон"); КонецПроцедуры // Вернуть константу со списком сравнений // Функция ПолучитьСписокСравнения() Экспорт Если мВидыСравнения = Неопределено Тогда ЗаполнитьСписокСравнения(); КонецЕсли; Возврат мВидыСравнения; КонецФункции // Поиск значения в списке по представлению Функция НайтиПоПредставлению(Список, Представление) Экспорт Результат = ""; Для Каждого Элемент Из Список Цикл Если Элемент.Представление = Представление Тогда Результат = Элемент.Значение; Прервать; КонецЕсли; КонецЦикла; Возврат Результат; КонецФункции Функция ПолучитьСоставСвойствСобытий() Экспорт Если мСоставСвойствСобытий = Неопределено Тогда мСоставСвойствСобытий = ирОбщий.ПолучитьТаблицуИзТабличногоДокументаЛкс(ПолучитьМакет("СоставСвойствСобытий")); КонецЕсли; Возврат мСоставСвойствСобытий; КонецФункции Функция ПолучитьСтруктуруСвойствСобытия(Событие, ВключатьКолонкуСобытия = Истина) Экспорт ПолучитьСоставСвойствСобытий(); СтрокаСобытия = мСоставСвойствСобытий.Найти(ВРег(Событие), "MainEvent"); Если СтрокаСобытия <> Неопределено Тогда АктуальныеСвойства = Новый Структура; Для Каждого Колонка Из мСоставСвойствСобытий.Колонки Цикл Если СтрокаСобытия[Колонка.Имя] = "+" Тогда АктуальныеСвойства.Вставить(Колонка.Имя); КонецЕсли; КонецЦикла; Если Не ВключатьКолонкуСобытия Тогда АктуальныеСвойства.Удалить("Name"); КонецЕсли; Иначе // событие - CONTEXT АктуальныеСвойства = Неопределено; КонецЕсли; Возврат АктуальныеСвойства; КонецФункции // Заполнить структуру свойств событий // Процедура ЗаполнитьСписокСвойствСобытий() Экспорт ТаблицаИзМакета = ирОбщий.ПолучитьТаблицуИзТабличногоДокументаЛкс(ПолучитьМакет("Свойства")); Свойства.Загрузить(ТаблицаИзМакета); Для Каждого СтрокаТЧ Из Свойства Цикл СтрокаТЧ.НИмя = НРег(СтрокаТЧ.Имя); КонецЦикла; Свойства.Сортировать("Представление"); КонецПроцедуры // Вернуть константу со списком свойств событий // Функция ПолучитьСписокСвойствСобытий() Экспорт Если мСписокСвойствСобытий = Неопределено Тогда мСписокСвойствСобытий = Новый СписокЗначений; Если Свойства.Количество() = 0 Тогда ЗаполнитьСписокСвойствСобытий(); КонецЕсли; Для Каждого СтрокаТЧ Из Свойства Цикл мСписокСвойствСобытий.Добавить(СтрокаТЧ.НИмя, СтрокаТЧ.Представление + " (" + СтрокаТЧ.Имя + ")"); КонецЦикла; КонецЕсли; Возврат мСписокСвойствСобытий; КонецФункции // Заполнить структуру имен свойств // Процедура ЗаполнитьСписокИменСвойств() мСписокИменСвойств = ПолучитьСписокСвойствСобытий().Скопировать(); мСписокИменСвойств.Вставить(0, "all", "All (все свойства)"); КонецПроцедуры // Вернуть константу со списком имен свойств // Функция ПолучитьСписокИменСвойств() Экспорт Если мСписокИменСвойств = Неопределено Тогда ЗаполнитьСписокИменСвойств(); КонецЕсли; Возврат мСписокИменСвойств; КонецФункции // Заполнить структуру наименований выполняемого действия // Процедура ЗаполнитьСписокДействий() ТабличныйДокумент = ПолучитьМакет("ЗначенияСвойств"); ЗначенияСвойств = ирОбщий.ПолучитьТаблицуИзТабличногоДокументаЛкс(ТабличныйДокумент); мСписокДействий = Новый СписокЗначений; Для каждого СтрокаУровня Из ЗначенияСвойств Цикл мСписокДействий.Добавить(СтрокаУровня.Имя, СтрокаУровня.Представление); КонецЦикла; КонецПроцедуры // Вернуть константу со списком наименований выполняемого действия // Функция ПолучитьСписокДействий() Экспорт Если мСписокДействий = Неопределено Тогда ЗаполнитьСписокДействий(); КонецЕсли; мСписокДействий.СортироватьПоПредставлению(); Возврат мСписокДействий; КонецФункции // Поиск в списке значений значения по представлению // Функция НайтиЗначениеПоПредставлению(Представление) Экспорт Для Инд = 0 По мВидыСравнения.Количество() Цикл Если Представление = мВидыСравнения[Инд].Представление Тогда Возврат мВидыСравнения[Инд].Значение; КонецЕсли; КонецЦикла; Возврат Неопределено; КонецФункции Функция ПолучитьПредставлениеЭлементаОтбораСобытий(ИндексЖурнала, ИндСоб) Экспорт СтрокаПредставления = ""; УзелУсловия = ПолучитьУзелСобытия(ИндексЖурнала, ИндСоб); Если УзелУсловия = Неопределено Тогда Возврат СтрокаПредставления; КонецЕсли; УзелУсловий = УзелУсловия.ПервыйДочерний; Пока УзелУсловий <> Неопределено Цикл Если СтрокаПредставления <> "" Тогда СтрокаПредставления = СтрокаПредставления + " И "; КонецЕсли; Свойство = ""; Значение = ""; Для Каждого Атрибут Из УзелУсловий.Атрибуты Цикл Если Атрибут.ЛокальноеИмя = "property" Тогда Свойство = Атрибут.ЗначениеУзла; КонецЕсли; Если Атрибут.ЛокальноеИмя = "value" Тогда Значение = Атрибут.ЗначениеУзла; КонецЕсли; КонецЦикла; СтрокаПредставления = СтрокаПредставления + "'" + Свойство + "'" + " " + ПолучитьСписокСравнения().НайтиПоЗначению(НРег(УзелУсловий.ЛокальноеИмя)) + " " + "'" + Значение + "'"; УзелУсловий = УзелУсловий.СледующийСоседний; КонецЦикла; Возврат СтрокаПредставления; КонецФункции Функция ПолучитьПредставлениеЭлементаОтбораСвойств(СписокУзлов, ИндСоб) Экспорт СтрокаПредставления = ""; УзелУсловия = СписокУзлов.Элемент(ИндСоб); Если Не ирОбщий.СтрокиРавныЛкс(УзелУсловия.ЛокальноеИмя, "property") Тогда Возврат СтрокаПредставления; КонецЕсли; Для Каждого Атрибут Из УзелУсловия.Атрибуты Цикл Если ирОбщий.СтрокиРавныЛкс(Атрибут.ЛокальноеИмя, "name") Тогда СтрокаПредставления = Атрибут.ЗначениеУзла; КонецЕсли; КонецЦикла; Если УзелУсловия.ПервыйДочерний <> Неопределено Тогда УзелУсловий = УзелУсловия.ПервыйДочерний.ПервыйДочерний; СтрокаПредставленияУсловия = ""; Пока УзелУсловий <> Неопределено Цикл Если СтрокаПредставленияУсловия <> "" Тогда СтрокаПредставленияУсловия = СтрокаПредставленияУсловия + " И "; КонецЕсли; Свойство = ""; Значение = ""; Для Каждого Атрибут Из УзелУсловий.Атрибуты Цикл Если Атрибут.ЛокальноеИмя = "property" Тогда Свойство = Атрибут.ЗначениеУзла; КонецЕсли; Если Атрибут.ЛокальноеИмя = "value" Тогда Значение = Атрибут.ЗначениеУзла; КонецЕсли; КонецЦикла; СтрокаПредставленияУсловия = СтрокаПредставленияУсловия + "'" + Свойство + "'" + " " + ПолучитьСписокСравнения().НайтиПоЗначению(НРег(УзелУсловий.ЛокальноеИмя)) + " " + "'" + Значение + "'"; УзелУсловий = УзелУсловий.СледующийСоседний; КонецЦикла; Если ЗначениеЗаполнено(СтрокаПредставленияУсловия) Тогда СтрокаПредставления = СтрокаПредставления + "(" + СтрокаПредставленияУсловия + ")"; КонецЕсли; КонецЕсли; Возврат СтрокаПредставления; КонецФункции Функция ПолучитьИмяСобытияЭлементаОтбораСобытийНаРавенство(УзелСобытий, ИндСоб) Экспорт УзелУсловий = УзелСобытий.Элемент(ИндСоб).ПервыйДочерний; Пока УзелУсловий <> Неопределено Цикл Если УзелУсловий.ЛокальноеИмя = "eq" Тогда АтрибутИмениСобытия = УзелУсловий.Атрибуты.ПолучитьИменованныйЭлемент("property"); Если Истина И АтрибутИмениСобытия <> Неопределено И НРег(АтрибутИмениСобытия.ЗначениеУзла) = НРег("Name") Тогда АтрибутЗначенияИмениСобытия = УзелУсловий.Атрибуты.ПолучитьИменованныйЭлемент("value"); Если АтрибутЗначенияИмениСобытия <> Неопределено Тогда Возврат АтрибутЗначенияИмениСобытия.ЗначениеУзла; КонецЕсли; КонецЕсли; ИначеЕсли УзелУсловий.ЛокальноеИмя = "ne" Тогда АтрибутИмениСобытия = УзелУсловий.Атрибуты.ПолучитьИменованныйЭлемент("property"); Если Истина И АтрибутИмениСобытия <> Неопределено И НРег(АтрибутИмениСобытия.ЗначениеУзла) = НРег("Name") Тогда АтрибутЗначенияИмениСобытия = УзелУсловий.Атрибуты.ПолучитьИменованныйЭлемент("value"); Если АтрибутЗначенияИмениСобытия <> Неопределено Тогда Если АтрибутЗначенияИмениСобытия.ЗначениеУзла = "" Тогда Возврат ""; КонецЕсли; КонецЕсли; КонецЕсли; КонецЕсли; УзелУсловий = УзелУсловий.СледующийСоседний; КонецЦикла; Возврат Неопределено; КонецФункции Функция НайтиДобавитьУзелВКоллекцию(Искать = Истина, Документ = Неопределено, Коллекция = Неопределено, ИмяУзла) Экспорт Если Документ = Неопределено Тогда Документ = мДокументДОМ; КонецЕсли; #Если _ Тогда Документ = Новый ДокументDOM; #КонецЕсли Если Коллекция = Неопределено Тогда Коллекция = Документ.ПервыйДочерний; КонецЕсли; Если Искать Тогда СписокУзлов = Коллекция.ПолучитьЭлементыПоИмени(ИмяУзла); КонецЕсли; Если Истина И Искать И СписокУзлов.Количество() > 0 Тогда Узел = СписокУзлов.Элемент(0); Иначе Узел = СоздатьЭлементДОМ(ИмяУзла, Документ); Коллекция.ДобавитьДочерний(Узел); КонецЕсли; Возврат Узел; КонецФункции // ДобавитьУзелВКоллекцию() Функция НайтиДобавитьУзелСАтрибутами(Искать = Истина, Документ = Неопределено, Родитель = Неопределено, ИмяУзла, СтруктураАтрибутов = Неопределено) Экспорт Узел = НайтиДобавитьУзелВКоллекцию(Искать, Документ, Родитель, ИмяУзла); Если СтруктураАтрибутов <> Неопределено Тогда Для каждого Атрибут Из СтруктураАтрибутов Цикл Узел.УстановитьАтрибут(Атрибут.Ключ, XMLСтрока(Атрибут.Значение)); КонецЦикла; КонецЕсли; Возврат Узел; КонецФункции // Проверить принадлежность имени к требуемому // Функция ПроверитьПринадлежность(Имя) Экспорт Если ВернутьСписокСоответствующийИмени(Имя).Количество() > 0 Тогда Возврат Истина; КонецЕсли; Возврат Ложь; КонецФункции // Проверить принадлежность имени к требуемому // Функция ВернутьСписокСоответствующийИмени(Имя) Экспорт Если НРег(Имя) = "name" Тогда Результат = ПолучитьСписокСобытий(); ИначеЕсли НРег(Имя) = "func" Тогда Результат = ПолучитьСписокДействий(); ИначеЕсли НРег(Имя) = "level" Тогда Результат = ПолучитьСписокУровнейСистемныхСобытий(); Иначе Результат = Новый СписокЗначений; КонецЕсли; Возврат Результат; КонецФункции //////////////////////////////////////////////////////////////////////////////// // ФУНКЦИИ РАБОТЫ С ДОКУМЕНТОМ DOM // Загрузить XML файл в DOM документ Функция ЗагрузитьXML(ИмяФайла) Экспорт ТекстХМЛ = ирОбщий.ПрочитатьТекстИзФайлаЛкс(ИмяФайла,, НаСервере); ЧтениеХМЛ = Новый ЧтениеXML(); ЧтениеХМЛ.УстановитьСтроку(ТекстХМЛ); ПостроительДом = Новый ПостроительDOM(); Попытка ДокументДОМ = ПостроительДом.Прочитать(ЧтениеХМЛ); Исключение Сообщить("Ошибка при чтении файла XML: " + ОписаниеОшибки(), СтатусСообщения.Внимание); Возврат Неопределено; КонецПопытки; Возврат ДокументДОМ; КонецФункции Процедура мПереместитьФайл(ИмяИсточника, ИмяПриемника) Экспорт Если НаСервере Тогда ирСервер.ПереместитьФайлЛкс(ИмяИсточника, ИмяПриемника); Иначе ПереместитьФайл(ИмяИсточника, ИмяПриемника); КонецЕсли; КонецПроцедуры // ПереместитьФайл() Функция ЛиФайлСуществует(ПолноеИмяФайла, пНаСервере = Неопределено, выхДатаИзменения = Неопределено) Экспорт Если пНаСервере = Неопределено Тогда пНаСервере = НаСервере; КонецЕсли; Если пНаСервере Тогда ФайлНайден = ирСервер.ЛиФайлСуществуетЛкс(ПолноеИмяФайла, выхДатаИзменения); Иначе Файл1 = Новый Файл(ПолноеИмяФайла); ФайлНайден = Файл1.Существует(); Если ФайлНайден Тогда выхДатаИзменения = Файл1.ПолучитьВремяИзменения() + ирКэш.ПолучитьСмещениеВремениЛкс(); КонецЕсли; КонецЕсли; Возврат ФайлНайден; КонецФункции // ЛиФайлСуществует() // Загрузить конфигурационный файл XML в документ DOM // Функция ЗагрузитьКонфигурационныйXML(Знач ИмяФайла, пНаСервере = Неопределено) Экспорт Если мДокументДОМ <> Неопределено Тогда Возврат мДокументДОМ; КонецЕсли; ТекущийЖурнал = -1; Если пНаСервере = Неопределено Тогда пНаСервере = НаСервере; КонецЕсли; Шаблон = Ложь; МетаМакет = Метаданные().Макеты.Найти(ИмяФайла); Если МетаМакет <> Неопределено Тогда ЗагрузитьШаблон(ИмяФайла, "", ""); Возврат мДокументДОМ; ИначеЕсли ЗначениеЗаполнено(ИмяФайла) Тогда ФайлСуществует = ЛиФайлСуществует(ИмяФайла, пНаСервере); Если Не ФайлСуществует Тогда ИмяФайла = ПолучитьИмяФайлаШаблона(ИмяФайла); Шаблон = Истина; КонецЕсли; Иначе ИмяФайла = ПолучитьПолноеИмяКонфигурационногоФайла(); КонецЕсли; КонфигурационныйФайл = Новый Файл(ИмяФайла); ФайлСуществует = ЛиФайлСуществует(ИмяФайла, пНаСервере); Если Не ФайлСуществует Тогда Документ = Новый Документ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"; УдалитьКорневыеЭлементыПоИмени(ИмяЭлемента); Если СистемныеСобытия.Количество() Тогда Для каждого СтрокаСобытия Из СистемныеСобытия Цикл Если ПустаяСтрока(СтрокаСобытия.Уровень) Тогда Продолжить; КонецЕсли; Элемент = НайтиДобавитьУзелВКоллекцию(Ложь, , , ИмяЭлемента); Элемент.УстановитьАтрибут("level", XMLСтрока(СтрокаСобытия.Уровень)); Если НЕ ПустаяСтрока(СтрокаСобытия.Компонент) Тогда Элемент.УстановитьАтрибут("component", XMLСтрока(СтрокаСобытия.Компонент)); КонецЕсли; Если НЕ ПустаяСтрока(СтрокаСобытия.Класс) Тогда Элемент.УстановитьАтрибут("class", XMLСтрока(СтрокаСобытия.Класс)); КонецЕсли; КонецЦикла; КонецЕсли; ИмяЭлемента = "mem"; УдалитьКорневыеЭлементыПоИмени(ИмяЭлемента); Если СледитьЗаУтечкамиПамятиВРабочихПроцессах Тогда НайтиДобавитьУзелВКоллекцию(, , , ИмяЭлемента); КонецЕсли; //ИмяЭлемента = "planSQL"; ИмяЭлемента = "plansql"; УдалитьКорневыеЭлементыПоИмени(ИмяЭлемента); Если ФиксироватьПланыЗапросовSQL Тогда НайтиДобавитьУзелВКоллекцию(, , , ИмяЭлемента); КонецЕсли; ИмяЭлемента = "dbmslocks"; УдалитьКорневыеЭлементыПоИмени(ИмяЭлемента); Если СобиратьБлокировкиСУБД Тогда НайтиДобавитьУзелВКоллекцию(, , , ИмяЭлемента); КонецЕсли; Возврат мДокументДОМ; КонецФункции Процедура УдалитьКорневыеЭлементыПоИмени(ИмяЭлемента) НайденныеЭлементы = мДокументДОМ.ПолучитьЭлементыПоИмени(ИмяЭлемента); Для Каждого НайденныйЭлемент Из НайденныеЭлементы Цикл Если ирОбщий.СтрокиРавныЛкс(НайденныйЭлемент.РодительскийУзел.ЛокальноеИмя, "config") Тогда НайденныйЭлемент.РодительскийУзел.УдалитьДочерний(НайденныйЭлемент); КонецЕсли; КонецЦикла; КонецПроцедуры // Вернуть документ DOM // Функция ДокументДОМ() Экспорт Возврат мДокументДОМ; КонецФункции Функция СоздатьЭлементДОМ(ЛокальноеИмяЭлемента, Документ = Неопределено) Экспорт Если Документ = Неопределено Тогда Документ = мДокументДОМ; КонецЕсли; ЭлементДОМ = Документ.СоздатьЭлемент(Документ.ЭлементДокумента.URIПространстваИмен, Документ.ЭлементДокумента.Префикс + ":" + ЛокальноеИмяЭлемента); Возврат ЭлементДОМ; КонецФункции // Закрытие документа // Процедура ЗакрытьДокумент() Экспорт мДокументДОМ = Неопределено; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // ФУНКЦИИ ДОСТУПА К ЭЛЕМЕНТАМ ДЕРЕВА ДОКУМЕНТА DOM Функция ПолучитьУзелЖурнала(ИндексЖурнала) Экспорт СписокЭлементов = мДокументДОМ.ПолучитьЭлементыПоИмени("log"); Если СписокЭлементов.Количество() > 0 Тогда Результат = СписокЭлементов.Элемент(ИндексЖурнала); КонецЕсли; Возврат Результат; КонецФункции Процедура ОчиститьЖурнал(Индекс) Экспорт мДокументДОМ.ПервыйДочерний.ЗаменитьДочерний(НовыйЖурнал(), ПолучитьУзелЖурнала(Индекс)); КонецПроцедуры Функция НовыйЖурнал() Экспорт Элемент = СоздатьЭлементДОМ("log"); Элемент.УстановитьАтрибут("history", ""); Элемент.УстановитьАтрибут("location", ""); Возврат Элемент; КонецФункции Функция ПолучитьПервыйУзелСобытий(ИндексЖурнала) Экспорт УзлыЖурнала = ПолучитьСписокЖурналов(); Возврат УзлыЖурнала.Элемент(ИндексЖурнала).ПервыйДочерний; КонецФункции Функция ПолучитьУзелСобытия(ИндексЖурнала, ИндексСобытия) Экспорт НомерУзла = 0; СписокУзлов = ПолучитьСписокУзловЖурнала(ИндексЖурнала); Для Инд = 0 По СписокУзлов.Количество() - 1 Цикл УзелСобытия = СписокУзлов.Элемент(Инд); Если Истина И ирОбщий.СтрокиРавныЛкс(УзелСобытия.РодительскийУзел.ЛокальноеИмя, "log") И ирОбщий.СтрокиРавныЛкс(УзелСобытия.ЛокальноеИмя, "event") Тогда НомерУзла = НомерУзла + 1; КонецЕсли; Если НомерУзла = ИндексСобытия + 1 Тогда Возврат УзелСобытия; КонецЕсли; КонецЦикла; Возврат Неопределено; КонецФункции Функция ПолучитьУзелСвойства(НомерЖурнала, НомерСвойства) Экспорт СписокСвойств = ПолучитьСписокСвойств(НомерЖурнала); Если СписокСвойств.Количество() >= НомерСвойства Тогда Результат = СписокСвойств.Элемент(НомерСвойства - 1); КонецЕсли; Возврат Результат; КонецФункции Функция ПолучитьСписокЖурналов() Экспорт Результат = мДокументДОМ.ПолучитьЭлементыПоИмени("log"); Возврат Результат; КонецФункции Функция ПолучитьСписокУзловЖурнала(ИндексЖурнала) Экспорт УзлыЖурнала = ПолучитьСписокЖурналов(); //Результат = УзлыЖурнала.Элемент(ИндексЖурнала).ПолучитьЭлементыПоИмени("event"); // Так и субдочерние возращаются, а это вредно //Результат = Новый Массив; //Для Каждого ДочернийЭлемент Из УзлыЖурнала.Элемент(ИндексЖурнала).ДочерниеУзлы Цикл // Если ирОбщий.СтрокиРавныЛкс(ДочернийЭлемент.ЛокальноеИмя, "event") Тогда // Результат.Добавить(ДочернийЭлемент); // КонецЕсли; //КонецЦикла; Результат = УзлыЖурнала.Элемент(ИндексЖурнала).ДочерниеУзлы; Возврат Результат; КонецФункции Функция ПолучитьСписокСвойств(ИндексЖурнала) Экспорт УзлыЖурнала = ПолучитьСписокЖурналов(); Результат = УзлыЖурнала.Элемент(ИндексЖурнала).ПолучитьЭлементыПоИмени("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; // КонецПопытки; // КонецЕсли; //КонецЦикла; ПредставлениеСобытий = ПолучитьПредставлениеОтбораСобытийЖурнала(Индекс); КонецПроцедуры Функция ПолучитьПредставлениеОтбораСобытийЖурнала(Индекс) Экспорт ПредставлениеСобытий = ""; СписокУзловЖурнала = ПолучитьСписокУзловЖурнала(Индекс); Для ИндексУзлаСобытия = 0 По СписокУзловЖурнала.Количество() - 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).ТекстовоеСодержимое; ДобавитьОписаниеШаблона(Имя, Описание); Исключение Описание = ""; КонецПопытки; КонецЕсли; ДокументДом = Неопределено; КонецЕсли; Иначе Описание = Описание.Представление; КонецЕсли; Возврат Описание; КонецФункции Функция ПолучитьСодержимоеФайлаШаблона(ИмяШаблона) Экспорт Шаблон = Ложь; МетаМакет = Метаданные().Макеты.Найти(ИмяШаблона); Если МетаМакет <> Неопределено Тогда МакетШаблона = ПолучитьМакет(ИмяШаблона); ТекстШаблона = МакетШаблона.ПолучитьТекст(); ТекстШаблона = Сред(ТекстШаблона, Найти(ТекстШаблона, "<")); Возврат ТекстШаблона; Иначе //Если ЗначениеЗаполнено(ИмяШаблона) Тогда ИмяФайла = ПолучитьИмяФайлаШаблона(ИмяШаблона); ТекстШаблона = ирОбщий.ПрочитатьТекстИзФайлаЛкс(ИмяФайла, , НаСервере); КонецЕсли; Возврат ТекстШаблона; КонецФункции // Заполнает список значений именем и представлением шаблона Процедура ЗаполнитьСписокВыбораШаблона(СписокВыбора, ИсключитьСтандартные) Экспорт Если СписокСтандартныхШаблонов.Количество() = 0 Тогда МетаМакеты = Метаданные().Макеты; Для Каждого МетаМакет Из МетаМакеты Цикл Если Найти(МетаМакет.Имя, "Шаблон") = 1 Тогда ПредставлениеМакета = МетаМакет.Представление(); ПредставлениеМакета = Сред(ПредставлениеМакета, Найти(ПредставлениеМакета, ":") + 1); СписокСтандартныхШаблонов.Добавить(МетаМакет.Имя, ПредставлениеМакета); МакетШаблона = ПолучитьМакет(МетаМакет.Имя); ТекстШаблона = МакетШаблона.ПолучитьТекст(); Позиция = Найти(ТекстШаблона, " 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"); мДокументДОМ.ПервыйДочерний.ДобавитьДочерний(Элемент); КонецПроцедуры Процедура ЗагрузитьШаблон(ИмяШаблона, КаталогЖурнала, КаталогДампа) МакетШаблона = ПолучитьМакет(ИмяШаблона); ТекстШаблона = МакетШаблона.ПолучитьТекст(); Позиция = Найти(ТекстШаблона, "