RDT1C/DataProcessors/ирНастройкаТехножурнала/Ext/ObjectModule.bsl
Администратор ebf21867b6 Редактор пользователей
+В списке добавлена группа колонок свойств настроек управляемого приложения
        +Добавлена кнопка "Установить..." для установки настроек управляемого приложения выделенным пользователям
        +В форме запуска под пользователем добавлен флажок "Режим интерфейса "Такси""
        +Запуск под пользователем с флагом "Разрешить отладку" теперь сразу подключает текущий отладчик к запускаемому сеансу
    Общее
        +Команда "Запустить обычное приложение" теперь в обоих типах управляемого приложения открывает одинаковую форму, в которой добавлен включенный по умолчанию флажок "Текущий пользователь"
        +Команда "Запустить связанный тонкий клиент" теперь передает имя текущего пользователя в строке соединения
        +При включенной параметром запуска /EnableCheckModal проверке модальности теперь при первом в сеансе открытии любой формы подсистемы предлагается запуск нового сеанса без проверки модальности
    Интерфейсная панель.
        +В контекстном меню добавлена команда "Связанный динамический список", открывающая единое окно динамического списка, обновляющее список при активизации строки
    Динамический список
        +Добавлена кнопка "Связанный редактор объекта БД", открывающая прикрепленное окно редактора объекта БД, загружающее объект при активизации строки
        +Реализовано автоматическое обновление отображаемых строк при записи объекта в редакторе объекта БД
        *Реализован обход ошибки платформы установки табличному полю типа списка независимого непериодического регистра сведений без измерений
    Редактор объекта БД
        *Увеличена длина дробной части значений отбора набора записей
    Контекстная подсказка
        *Исправлена ошибка инициализации формы списка слов при отсутствии activex компоненты Forms20
    Консоль запросов
        *Кнопка "Найти в дереве запроса" теперь доступна только в режиме просмотра узла дерева запроса
        *При сохранении узла дерева запроса, текущий узел теперь ищется не по именам, а по индексам узлов
        *Исправлено зависание программы при копировании папки дерева запросов
        *Исправлено некорректное определение имени узла дерева запроса в некоторых случаях при наличии функции ЗНАЧЕНИЕ(...)
        *При выборе основного элемента результата пакетного запроса теперь игнорируются результаты уничтожения таблиц
    Редактор табличного документа
        +Добавлена кнопка "Сохранить"

3.70
    Консоль компоновки данных
        +В настройках компоновки в таблице условного оформления добавлен пример оформления текста в колонке "Пример"
    Консоль кода
        +Добавлено дерево алгоритмов
        +Изменен формат файлов на t1c, старый формат f1c доступен только для открытия файлов
        *После сохранения в файл теперь сбрасывается модифицированность формы
        +Добавлена кнопка объединения с файлом
        +Добавлено подменю последних открытых файлов
        +Для булевых параметров реализовано отображение флажка
    Консоль запросов
        +При генерации текста модуля пакетного запроса теперь добавляется установка переменных вида "Индекс_<ИмяЗапроса>=<Индекс>" для всех именованных запросов
        +Команде "Найти в дереве" назначено сочетание клавиш CTRL+T
        +Для булевых параметров реализовано отображение флажка
        *Исправлено некорректное отображение количества строк в дереве результата при наличии выборок итогов
    Общее
        *Исправлены ошибки работы подсистемы при наличии общего модуля с именем ОбменДанными
        *Кнопка "Установить одинаковую ширину для всех колонок" заменена на "Расширить все колонки на 5 символов"
    Синтакс-помощник
        *Исправлено построение дерева, сломавшееся несколько версий назад
    Управление службами серверов 1С
        *Исправлена ошибка чтения служб при наличии службы сервера 1С без ключа "range" в строке запуска
    Редактор объекта БД
        +Для наборов записей добавлена фиксированная колонка картинки вида движения регистра накопления
        +По умолчанию для списка движений теперь включен отбор "Только не пустые"
        +Кнопка открытия редактора для таблицы движений теперь передает текущую строку
    Подбор и обработка объектов
        +Реализована поддержка журналов документов в однотабличном режиме
    Динамический список
        +В режиме выбора в заголовке теперь добавляется "(выбор)"
    Интерфейсная панель
        +Теперь уважает настройку использования "Динамический список / Основная форма списка"

3.69
    Общее
        +Вместо форм выбора теперь по умолчанию всегда открывается динамический список
        -Кнопка "Редактировать список" для значения отбор компоновки везде удалена, теперь редактирование списка всегда выполняется в расширенном режиме
    Динамический список
        +Добавлен флажок "Вместо основной" сохраняемый в настройках пользователя в разрезе объектов метаданных, управляющий подменой форм выбора
    Консоль компоновки
        *Исправлена ошибка команды "переставить с родителем" для группировок колонок и строк таблиц
    Контекстная подсказка
        *Кнопка "Удалить переносы" теперь еще заменяет двойные кавычки обычными
    Конструктор запросов
        +Для списка доступных таблиц добавлена закладка-отбор "Параметр"
        +При добавлении таблицы-параметра в выбранные таблицы сразу устанавливать тип запроса и имя временной таблицы
    Консоль запросов
        *Исправлена вычисление группировок итогов с закомментированным словом ОБЩИЕ
        +Кнопки выполнения запроса разделены на "Выполнить отображаемый запрос (F7)" и "Выполнить полный запрос (F8)"
    Редактор объекта БД
        *Исправлена ошибка поиска значения в бизнес процессе

3.68
    Редактор констант
        +Добавлена частичная поддержка констант с типом значения "Хранилище значения"
    Динамический список
        +Добавлена кнопка открытия основной формы списка с передачей отбора, текущей строки и владельца формы
        *Исправлена свежая ошибки открытия журнала документов
    Менеджер табличного поля
        *Исправлено ограничение типа значений элементов отбора
    Редактор объекта БД
        +В элементах управления колонок набора записей и движений реализован учет многострочного режима и других свойств из метаданных
        *Исправлена свежая поломка привязок на вкладке "Связанные колонки"
    Управление службами 1с
        *Исправлено перезаполнение списка при изменении компьютера
    Консоль запросов
        +Реализовано сохранение и восстановление позиции в тексте запроса при переходе между запросами и переключении режима дерева запроса
        +Для поля текста запроса добавлена команда "найти в дереве запроса" (текущую позицию в тексте запроса)
    Поиск дублей и замена ссылок
        *Исправлена свежая ошибка выполнения замены в иерархическом справочнике без флажка "Изменять поля по связям параметров выбора"
    Расширенный ввод значений
        +Добавлено распознавание навигационных ссылок
    Общее
        +Кнопка запуска связанного тонкого клиента теперь при повторном нажатии позволяет открыть в редакторе объекта БД один из открытых в связанном сеансе объектов
    Контекстная подсказка
        +Включена поддержка 8.3.8 в низкоуровневом получении описаний объектов

3.67
    Управление службами серверов 1С
        *Устранена ошибка открытия при наличии в строке соединения порта
        *Исправлено открытие при ошибках подключения WMI
    Консоль компоновки
        *Исправлена ошибка расшифровки при наличии пользовательских настроек компоновки
        +В панели настроек добавлена закладка "Пользовательские настройки" только для просмотра
        +В подменю "Исследовать" добавлена команда "Пользовательские настройки"
        +При сохранении варианта настроек добавлен пункт "<Новый>"
        +Реализовано перетаскивание полей на строки-коллекции в структуре
    Консоль запросов
        *Исправлена некорректная работа команды "найти результат" дерева запроса
        *Исправлена некорректная работа команды "Встроить из подзапроса" дерева запроса
    Конструктор запросов
        *Исправлено обновление представления условия связи при перетаскивании элементов отбора между связями
    Подбор и обработка объектов
        *Исправлены свежие ошибки при обработке подчиненных регистров сведений
    Редактор объекта БД
        *Исправлена недоступность для изменения основной формы измененного объекта
        +Добавлена кнопка "Отрыть основную форму объекта по ссылке"
        +При двойном клике по имени регистра в списке движений открывается его форма списка с отбором по регистратору
        *Исправлен сломанный несколько версий назад расширенный ввод значений в поле Ссылка
    Общее
        +В панели инструментов добавлена кнопка "Запустить связанный тонкий клиент"
    Интерфейсная панель
        +Реализовано явное отображение пустых ссылок в дереве
    Динамический список
        +Добавлена команда "Редактор объекта БД ячейки"
    Поиск дублей и замена ссылок
        +При выполнении замены реализовано предотвращение зацикливания уровней путем поднятия до ближайшего корректного родителя
    Настройка техножурнала
        *Реализован обход проблемы платформы со смещением времени изменения файла на 1ч

3.66
    +Добавлен инструмент "Управление службами серверов 1С"
    Поиск дублей и замена ссылок
        *Исправлена ошибка вывода сообщения об ошибке при отказе в записи независимых регистров сведений
        *Исправлено неверное замещение неуникальных записей в подчиненных регистрах сведений
    Подбор и обработка объектов
        *Исправлены ошибки при работе с подчиненными регистрами сведений
    Общее
        *Исправлено восстановление пароля в форме подключения СУБД
        *Исправлено свежее незапланированное изменение в поведении кнопки "Редактор объекта БД"
    Консоль компоновки данных
        *Кнопка "Исполняемый запрос" теперь открывает консоль запросов немодально
    Различные значения колонки
        +Добавлена кнопка "В список"
        *Исправлено некорректное вычисление типов значений
    Редактор объекта БД
        +Реализована поддержка флагов "Многострочный режим" и "Расширенное редактирование" колонок табличных частей и наборов записей
2016-12-04 00:22:14 +03:00

1529 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", "Шаблон");
КонецПроцедуры
// Вернуть константу со списком сравнений
//
Функция ПолучитьСписокСравнения() Экспорт
Если мВидыСравнения = Неопределено Тогда
ЗаполнитьСписокСравнения();
КонецЕсли;
Возврат мВидыСравнения;
КонецФункции
// Поиск значения в списке по представлению
Функция НайтиПоПредставлению(Список, Представление) Экспорт
Результат = "";
Для Каждого Элемент Из Список Цикл
Если Элемент.Представление = Представление Тогда
Результат = Элемент.Значение;
Прервать;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ПолучитьСоставСвойствСобытий() Экспорт
Если мСоставСвойствСобытий = Неопределено Тогда
мСоставСвойствСобытий = ирОбщий.ПолучитьТаблицуИзТабличногоДокументаЛкс(ПолучитьМакет("СоставСвойствСобытий"));
КонецЕсли;
Возврат мСоставСвойствСобытий;
КонецФункции
Функция ПолучитьСтруктуруСвойствСобытия(Событие, ВключатьКолонкуСобытия = Истина) Экспорт
ПолучитьСоставСвойствСобытий();
СтрокаСобытия = мСоставСвойствСобытий.Найти(ВРег(Событие), "MainEvent");
Если СтрокаСобытия <> Неопределено Тогда
АктуальныеСвойства = Новый Структура;
Для Каждого Колонка Из мСоставСвойствСобытий.Колонки Цикл
Если СтрокаСобытия[Колонка.Имя] = "+" Тогда
АктуальныеСвойства.Вставить(Колонка.Имя);
КонецЕсли;
КонецЦикла;
Если Не ВключатьКолонкуСобытия Тогда
АктуальныеСвойства.Удалить("Name");
КонецЕсли;
Иначе
// событие - CONTEXT
АктуальныеСвойства = Неопределено;
КонецЕсли;
Возврат АктуальныеСвойства;
КонецФункции
// Заполнить структуру свойств событий
//
Процедура ЗаполнитьСписокСвойствСобытий() Экспорт
ТаблицаИзМакета = ирОбщий.ПолучитьТаблицуИзТабличногоДокументаЛкс(ПолучитьМакет("Свойства"));
Свойства.Загрузить(ТаблицаИзМакета);
Для Каждого СтрокаТЧ Из Свойства Цикл
СтрокаТЧ.НИмя = НРег(СтрокаТЧ.Имя);
КонецЦикла;
Свойства.Сортировать("Представление");
КонецПроцедуры
// Вернуть константу со списком свойств событий
//
Функция ПолучитьСписокСвойствСобытий() Экспорт
Если мСписокСвойствСобытий = Неопределено Тогда
мСписокСвойствСобытий = Новый СписокЗначений;
Если Свойства.Количество() = 0 Тогда
ЗаполнитьСписокСвойствСобытий();
КонецЕсли;
Для Каждого СтрокаТЧ Из Свойства Цикл
мСписокСвойствСобытий.Добавить(СтрокаТЧ.НИмя, СтрокаТЧ.Представление + " (" + СтрокаТЧ.Имя + ")");
КонецЦикла;
КонецЕсли;
Возврат мСписокСвойствСобытий;
КонецФункции
// Заполнить структуру имен свойств
//
Процедура ЗаполнитьСписокИменСвойств()
мСписокИменСвойств = ПолучитьСписокСвойствСобытий().Скопировать();
мСписокИменСвойств.Вставить(0, "all", "All (все свойства)");
КонецПроцедуры
// Вернуть константу со списком имен свойств
//
Функция ПолучитьСписокИменСвойств() Экспорт
Если мСписокИменСвойств = Неопределено Тогда
ЗаполнитьСписокИменСвойств();
КонецЕсли;
Возврат мСписокИменСвойств;
КонецФункции
// Заполнить структуру наименований выполняемого действия
//
Процедура ЗаполнитьСписокДействий()
ТабличныйДокумент = ПолучитьМакет("ЗначенияСвойств");
ЗначенияСвойств = ирОбщий.ПолучитьТаблицуИзТабличногоДокументаЛкс(ТабличныйДокумент);
мСписокДействий = Новый СписокЗначений;
Для каждого СтрокаУровня Из ЗначенияСвойств Цикл
мСписокДействий.Добавить(СтрокаУровня.Имя, СтрокаУровня.Представление);
КонецЦикла;
КонецПроцедуры
// Вернуть константу со списком наименований выполняемого действия
//
Функция ПолучитьСписокДействий() Экспорт
Если мСписокДействий = Неопределено Тогда
ЗаполнитьСписокДействий();
КонецЕсли;
мСписокДействий.СортироватьПоПредставлению();
Возврат мСписокДействий;
КонецФункции
// Поиск в списке значений значения по представлению
//
Функция НайтиЗначениеПоПредставлению(Представление) Экспорт
Для Инд = 0 По мВидыСравнения.Количество() Цикл
Если Представление = мВидыСравнения[Инд].Представление Тогда
Возврат мВидыСравнения[Инд].Значение;
КонецЕсли;
КонецЦикла;
Возврат Неопределено;
КонецФункции
Функция ПолучитьПредставлениеЭлементаОтбораСобытий(ИндексЖурнала, ИндСоб) Экспорт
СтрокаПредставления = "";
УзелУсловия = ПолучитьУзелСобытия(ИндексЖурнала, ИндСоб);
Если УзелУсловия = Неопределено Тогда
Возврат СтрокаПредставления;
КонецЕсли;
УзелУсловий = УзелУсловия.ПервыйДочерний;
Пока УзелУсловий <> Неопределено Цикл
Если СтрокаПредставления <> "" Тогда
СтрокаПредставления = СтрокаПредставления + " И ";
КонецЕсли;
Свойство = "";
Значение = "";
Для Каждого Атрибут Из УзелУсловий.Атрибуты Цикл
Если Атрибут.ЛокальноеИмя = "property" Тогда
Свойство = Атрибут.ЗначениеУзла;
КонецЕсли;
Если Атрибут.ЛокальноеИмя = "value" Тогда
Значение = Атрибут.ЗначениеУзла;
КонецЕсли;
КонецЦикла;
СтрокаПредставления = СтрокаПредставления + "'" + Свойство + "'"
+ " " + ПолучитьСписокСравнения().НайтиПоЗначению(НРег(УзелУсловий.ЛокальноеИмя)) + " "
+ "'" + Значение + "'";
УзелУсловий = УзелУсловий.СледующийСоседний;
КонецЦикла;
Возврат СтрокаПредставления;
КонецФункции
Функция ПолучитьПредставлениеЭлементаОтбораСвойств(СписокУзлов, ИндСоб) Экспорт
СтрокаПредставления = "";
УзелУсловия = СписокУзлов.Элемент(ИндСоб);
Если Не ирОбщий.СтрокиРавныЛкс(УзелУсловия.ЛокальноеИмя, "property") Тогда
Возврат СтрокаПредставления;
КонецЕсли;
Для Каждого Атрибут Из УзелУсловия.Атрибуты Цикл
Если ирОбщий.СтрокиРавныЛкс(Атрибут.ЛокальноеИмя, "name") Тогда
СтрокаПредставления = Атрибут.ЗначениеУзла;
КонецЕсли;
КонецЦикла;
Если УзелУсловия.ПервыйДочерний <> Неопределено Тогда
УзелУсловий = УзелУсловия.ПервыйДочерний.ПервыйДочерний;
СтрокаПредставленияУсловия = "";
Пока УзелУсловий <> Неопределено Цикл
Если СтрокаПредставленияУсловия <> "" Тогда
СтрокаПредставленияУсловия = СтрокаПредставленияУсловия + " И ";
КонецЕсли;
Свойство = "";
Значение = "";
Для Каждого Атрибут Из УзелУсловий.Атрибуты Цикл
Если Атрибут.ЛокальноеИмя = "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(Знач ИмяФайла, пНаСервере = Неопределено) Экспорт
Если мДокументДОМ <> Неопределено Тогда
Возврат мДокументДОМ;
КонецЕсли;
ТекущийЖурнал = -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);
СписокСтандартныхШаблонов.Добавить(МетаМакет.Имя, ПредставлениеМакета);
МакетШаблона = ПолучитьМакет(МетаМакет.Имя);
ТекстШаблона = МакетШаблона.ПолучитьТекст();
Позиция = Найти(ТекстШаблона, "<?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";