1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-02-10 19:41:26 +02:00

Реализовано отображение ошибок через html

This commit is contained in:
alkoleft 2024-03-20 02:34:30 +03:00
parent 2e7348a6a0
commit f3377cc987
8 changed files with 553 additions and 46 deletions

View File

@ -685,7 +685,7 @@
Функция КонструкторОбъектаXDTO(ИмяТипа, ПространствоИмен, Фабрика = Неопределено) Экспорт
Обработка = Обработки.ЮТКонструкторОбъектаXDTO.Создать();
Обработка.Инициализировать(ИмяТипа, ПространствоИмен);
Обработка.Инициализировать(ИмяТипа, ПространствоИмен, Фабрика);
Возврат Обработка;

View File

@ -0,0 +1,158 @@
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<style>
html {
font-family: monospace, sans-serif;
font-size: 10pt;
font-style: normal;
font-weight: normal;
}
body {
overflow-x: hidden;
overflow-y: auto;
overflow-wrap: anywhere;
margin: 0;
padding: 0;
display: flow-root;
}
.caret {
cursor: pointer;
display: inline-block;
margin: 0;
padding: 0;
width:1.4em;
border: 1px solid silver;
border-radius: 10px;
}
.caret::before {
display: inline-block;
content: '➖';
width: 1.4em;
vertical-align: middle;
text-align: center;
}
.caret-collapse::before {
content: '➕'
}
.hide {
display: none;
}
.status {
margin: 0;
padding: 0;
margin-right: 0.1em;
}
.status::before {
display: inline-block;
}
.success .status::before {
content:url("data:image/svg+xml,%3C!-- Copyright 2000-2022 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. --%3E%3Csvg width='16' height='16' viewBox='0 0 16 16' fill='none' xmlns='http://www.w3.org/2000/svg'%3E%3Cg id='testPassed'%3E%3Cpath id='Path 2' fill-rule='evenodd' clip-rule='evenodd' d='M6.86976 12.9679L14.6479 5.18974L12.5266 3.06842L6.86976 8.72527L4.04133 5.89685L1.92001 8.01817L6.86976 12.9679Z' fill='%2362B543' fill-opacity='0.7'/%3E%3C/g%3E%3C/svg%3E%0A");
}
.error .status::before {
content: url("data:image/svg+xml,%3C!-- Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. --%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath fill='%23E05555' fill-opacity='.7' fill-rule='evenodd' d='M8,14.5 C4.41014913,14.5 1.5,11.5898509 1.5,8 C1.5,4.41014913 4.41014913,1.5 8,1.5 C11.5898509,1.5 14.5,4.41014913 14.5,8 C14.5,11.5898509 11.5898509,14.5 8,14.5 Z M7,4 L7,8 L9,8 L9,4 L7,4 Z M7,10 L7,12 L9,12 L9,10 L7,10 Z'/%3E%3C/svg%3E%0A");
}
.failure .status::before {
content: url("data:image/svg+xml,%3C!-- Copyright 2000-2021 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. --%3E%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 16 16'%3E%3Cpath fill='%23F4AF3D' fill-opacity='.7' fill-rule='evenodd' d='M9.20446966,8.00000012 L11.7854095,5.41906027 L10.583328,4.2169787 L8.0023881,6.79791856 L5.42144836,4.21697882 L4.2193668,5.41906038 L6.80030654,8.00000012 L4.21936692,10.5809397 L5.42144848,11.7830213 L8.0023881,9.20208168 L10.5833278,11.7830214 L11.7854094,10.5809399 L9.20446966,8.00000012 Z M8.0023881,14.5 C4.41253722,14.5 1.5023881,11.5898509 1.5023881,8 C1.5023881,4.41014913 4.41253722,1.5 8.0023881,1.5 C11.592239,1.5 14.5023881,4.41014913 14.5023881,8 C14.5023881,11.5898509 11.592239,14.5 8.0023881,14.5 Z'/%3E%3C/svg%3E%0A");
}
.line .status::before {
content: '-'
}
.line {
border-top: 1px solid rgb(230, 230, 230);
}
.row {
display: flex;
padding-top: 0.5em;
cursor: default;
flex-direction: column;
}
.row-title {
display: flex;
flex-direction:row;
padding-top: 0.5em;
padding-bottom: 0.5em;
}
.row-title:hover {
background: rgb(230, 230, 230);
}
pre {
white-space: pre-wrap;
word-break: break-word;
overflow-wrap: break-word;
margin: 0;
display: inline;
}
.main {
font-weight: bold;
}
.side {
color: rgb(96, 96, 96);
}
.error-line, .note-line, .warn-line {
border-left: 4px solid;
margin: 2px;
padding-left: 4px;
}
.error-line {
border-color: red;
}
.note-line {
border-color: silver;
}
.warn-line {
border-color: orange;
}
.log-block {
display: flex;
padding: 0.5em;
margin-left: 6em;
flex-direction: column;
border: 1px solid #e2e2e2;
background: #f7f7f7;
border-radius: 6px;
}
.log-title {
cursor: pointer;
}
</style>
</head>
<body>
TREE_CONTENT
<script type="text/javascript">
function toggleTreeItem(event) {
this.parentElement.parentElement.querySelector(".nested").classList.toggle("hide");
this.classList.toggle("caret-collapse");
}
function toggleLog(event) {
this.parentElement.querySelector(".nested").classList.toggle("hide");
}
carets = document.getElementsByClassName("caret");
for (i = 0; i < carets.length; i++) {
carets[i].addEventListener("click", toggleTreeItem, false);
}
carets = document.getElementsByClassName("log-title");
for (i = 0; i < carets.length; i++) {
carets[i].addEventListener("click", toggleLog, false);
}
</script>
</body>
</html>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonTemplate xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="79b3b92e-8186-41a2-a4ca-c08cbcf1f1c7">
<name>ЮТИнформацияОбОшибке</name>
<synonym>
<key>ru</key>
<value>Информация об ошибке</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -49,6 +49,7 @@
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеФамилии_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТRegEx1CAddin</commonTemplates>
<commonTemplates>CommonTemplate.ЮТYaxUnitAddIn</commonTemplates>
<commonTemplates>CommonTemplate.ЮТИнформацияОбОшибке</commonTemplates>
<commonTemplates>CommonTemplate.ЮТОписаниеМетаданных</commonTemplates>
<commonModules>CommonModule.Мокито</commonModules>
<commonModules>CommonModule.МокитоОбучение</commonModules>

View File

@ -262,11 +262,9 @@
Для Каждого Свойство Из Тип.Свойства Цикл
Если НеЗаполнено(Свойство, Пакет[Свойство.Имя]) Тогда
Продолжить;
УстановитьСлучайноеЗначениеСвойства(Пакет, Свойство, Уровень);
КонецЕсли;
УстановитьСлучайноеЗначениеСвойства(Пакет, Свойство, Уровень);
КонецЦикла;
КонецПроцедуры

View File

@ -75,7 +75,7 @@
</items>
<items xsi:type="form:Button">
<name>ЗапуститьВсеТесты</name>
<id>126</id>
<id>21</id>
<title>
<key>ru</key>
<value>Все тесты</value>
@ -87,7 +87,7 @@
</userVisible>
<extendedTooltip>
<name>ЗапуститьВсеТестыРасширеннаяПодсказка</name>
<id>127</id>
<id>22</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
@ -148,7 +148,7 @@
</userVisible>
<extendedTooltip>
<name>ЗамерВремениВыполненияРасширеннаяПодсказка</name>
<id>129</id>
<id>23</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
@ -889,6 +889,56 @@
<items xsi:type="form:FormGroup">
<name>ГруппаДанныеОшибок</name>
<id>83</id>
<items xsi:type="form:FormField">
<name>ФорматВыводаОшибки</name>
<id>26</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:DataPath">
<segments>ФорматВыводаОшибки</segments>
</dataPath>
<handlers>
<event>OnChange</event>
<name>ФорматВыводаОшибкиПриИзменении</name>
</handlers>
<extendedTooltip>
<name>ФорматВыводаОшибкиРасширеннаяПодсказка</name>
<id>24</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>ФорматВыводаОшибкиКонтекстноеМеню</name>
<id>25</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>RadioButtonField</type>
<groupHorizontalAlign>Right</groupHorizontalAlign>
<editMode>Enter</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:RadioButtonsFieldExtInfo">
<radioButtonsType>Tumbler</radioButtonsType>
</extInfo>
</items>
<items xsi:type="form:Table">
<name>ДеревоТестовОшибки</name>
<id>59</id>
@ -967,10 +1017,6 @@
<horizontalAlign>Left</horizontalAlign>
<autoFill>true</autoFill>
</autoCommandBar>
<handlers>
<event>OnActivateRow</event>
<name>ДеревоТестовОшибкиПриАктивизацииСтроки</name>
</handlers>
<searchStringAddition>
<visible>true</visible>
<enabled>true</enabled>
@ -1129,7 +1175,6 @@
<items xsi:type="form:FormField">
<name>ДеревоТестовОшибкиСтек</name>
<id>75</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
@ -1179,6 +1224,59 @@
</borderColor>
</extInfo>
</items>
<items xsi:type="form:FormField">
<name>ОтображениеОшибки</name>
<id>144</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:DataPath">
<segments>ОтображениеОшибки</segments>
</dataPath>
<titleLocation>None</titleLocation>
<extendedTooltip>
<name>ОтображениеОшибкиРасширеннаяПодсказка</name>
<id>146</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>ОтображениеОшибкиКонтекстноеМеню</name>
<id>145</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
</contextMenu>
<type>HTMLDocumentField</type>
<editMode>Enter</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:HtmlFieldExtInfo">
<width>50</width>
<autoMaxWidth>true</autoMaxWidth>
<height>10</height>
<autoMaxHeight>true</autoMaxHeight>
<horizontalStretch>true</horizontalStretch>
<verticalStretch>true</verticalStretch>
<borderColor xsi:type="core:ColorRef">
<color>Style.FormBackColor</color>
</borderColor>
</extInfo>
</items>
<items xsi:type="form:FormGroup">
<name>РаботаСОшибкой</name>
<id>110</id>
@ -1370,6 +1468,7 @@
<event>OnOpen</event>
<name>ПриОткрытии</name>
</handlers>
<autoSaveDataInSettings>Use</autoSaveDataInSettings>
<autoTitle>true</autoTitle>
<autoUrl>true</autoUrl>
<group>Vertical</group>
@ -1664,6 +1763,23 @@
<common>true</common>
</edit>
</columns>
<columns>
<name>Лог</name>
<title>
<key>ru</key>
<value>Лог</value>
</title>
<id>129</id>
<valueType>
<types>ValueList</types>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
</columns>
</additionalColumns>
</attributes>
<attributes>
@ -1684,26 +1800,6 @@
<common>true</common>
</edit>
</attributes>
<attributes>
<name>СтатистикаВыполненияВеса</name>
<title>
<key>ru</key>
<value>Статистика выполнения веса</value>
</title>
<id>118</id>
<valueType>
<types>String</types>
<stringQualifiers>
<length>10</length>
</stringQualifiers>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
</attributes>
<attributes>
<name>ЗагрузитьТестыПриОткрытии</name>
<title>
@ -1721,6 +1817,46 @@
<common>true</common>
</edit>
</attributes>
<attributes>
<name>ОтображениеОшибки</name>
<title>
<key>ru</key>
<value>Отображение ошибки</value>
</title>
<id>27</id>
<valueType>
<types>String</types>
<stringQualifiers/>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
</attributes>
<attributes>
<name>ФорматВыводаОшибки</name>
<title>
<key>ru</key>
<value>Формат вывода ошибки</value>
</title>
<id>126</id>
<valueType>
<types>String</types>
<stringQualifiers/>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
<settingsSavedData xsi:type="form:DataPath">
<segments>ФорматВыводаОшибки</segments>
</settingsSavedData>
<savedData>true</savedData>
</attributes>
<formCommands>
<name>Сравнить</name>
<title>

View File

@ -37,6 +37,10 @@
Параметры.Свойство("ЗагрузитьТесты", ЗагрузитьТестыПриОткрытии);
Для Каждого Формат Из ФорматыВыводаОшибки() Цикл
Элементы.ФорматВыводаОшибки.СписокВыбора.Добавить(Формат.Ключ, Формат.Ключ);
КонецЦикла;
КонецПроцедуры
&НаКлиенте
@ -49,6 +53,19 @@
ЗагрузитьТесты();
КонецЕсли;
ПереключитьВыводОшибки();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовШапкиФормы
&НаКлиенте
Процедура ФорматВыводаОшибкиПриИзменении(Элемент)
ПереключитьВыводОшибки();
КонецПроцедуры
#КонецОбласти
@ -68,17 +85,7 @@
Элементы.ДеревоТестовОшибки.ТекущаяСтрока = Данные.Ошибки[0].ПолучитьИдентификатор();
КонецЕсли;
ОбновитьДоступностьСравнения();
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиСобытийЭлементовТаблицыФормыДеревоТестовОшибки
&НаКлиенте
Процедура ДеревоТестовОшибкиПриАктивизацииСтроки(Элемент)
ОтобразитьДанныеОшибки();
ОбновитьДоступностьСравнения();
КонецПроцедуры
@ -90,13 +97,14 @@
&НаКлиенте
Процедура Сравнить(Команда)
Данные = Элементы.ДеревоТестовОшибки.ТекущиеДанные;
Данные = ДанныеТекущейОшибки();
Если Данные = Неопределено ИЛИ ПустаяСтрока(Данные.ОжидаемоеЗначение) И ПустаяСтрока(Данные.ФактическоеЗначение) Тогда
Возврат;
КонецЕсли;
ПараметрыФормы = Новый Структура("ОжидаемоеЗначение, ФактическоеЗначение", Данные.ОжидаемоеЗначение, Данные.ФактическоеЗначение);
ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.Сравнение", ПараметрыФормы, ЭтотОбъект, , , , , РежимОткрытияОкнаФормы.БлокироватьОкноВладельца);
КонецПроцедуры
@ -246,11 +254,13 @@
&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьОшибки(СтрокаДерева, ОписаниеОбъекта)
СтрокаДерева.Ошибки.Очистить();
Для Каждого Ошибка Из ОписаниеОбъекта.Ошибки Цикл
СтрокаОшибки = СтрокаДерева.Ошибки.Добавить();
СтрокаОшибки.Сообщение = Ошибка.Сообщение;
СтрокаОшибки.Стек = Ошибка.Стек;
СтрокаОшибки.Лог.ЗагрузитьЗначения(Ошибка.Лог);
СтрокаОшибки.ОжидаемоеЗначение = ЮТКоллекции.ЗначениеСтруктуры(Ошибка, "ОжидаемоеЗначение");
СтрокаОшибки.ФактическоеЗначение = ЮТКоллекции.ЗначениеСтруктуры(Ошибка, "ПроверяемоеЗначение");
@ -692,14 +702,32 @@
КонецФункции
#КонецОбласти
&НаКлиенте
Процедура ОбновитьДоступностьСравнения()
Данные = Элементы.ДеревоТестовОшибки.ТекущиеДанные;
Данные = ДанныеТекущейОшибки();;
Элементы.Сравнить.Доступность = Данные <> Неопределено И (НЕ ПустаяСтрока(Данные.ОжидаемоеЗначение) ИЛИ НЕ ПустаяСтрока(Данные.ФактическоеЗначение));
КонецПроцедуры
&НаКлиенте
Функция ДанныеТекущейОшибки()
Данные = Элементы.ДеревоТестовОшибки.ТекущиеДанные;
Если Данные <> Неопределено Или ФорматВыводаОшибки = ФорматыВыводаОшибки().Текст Тогда
Возврат Данные;
КонецЕсли;
ДанныеТеста = Элементы.ДеревоТестов.ТекущиеДанные;
Если ДанныеТеста <> Неопределено И ЗначениеЗаполнено(ДанныеТеста.Ошибки) Тогда
Возврат ДанныеТеста.Ошибки[0];
КонецЕсли;
КонецФункции
&НаКлиенте
Процедура ПослеВодаКоличестваИтерацийЗамера(Результат, ДополнительныеПараметры) Экспорт
@ -770,4 +798,181 @@
КонецПроцедуры
#Область ВыводОшибки
&НаКлиенте
Процедура ПереключитьВыводОшибки()
Форматы = ФорматыВыводаОшибки();
Если НЕ ЗначениеЗаполнено(ФорматВыводаОшибки) Тогда
ФорматВыводаОшибки = Форматы.HTML;
КонецЕсли;
Элементы.ДеревоТестовОшибки.Видимость = ФорматВыводаОшибки = Форматы.Текст;
Элементы.ДеревоТестовОшибкиСтек.Видимость = ФорматВыводаОшибки = Форматы.Текст;
Элементы.ОтображениеОшибки.Видимость = ФорматВыводаОшибки = Форматы.HTML;
Если ФорматВыводаОшибки = Форматы.HTML Тогда
ОтобразитьДанныеОшибки();
КонецЕсли;
КонецПроцедуры
&НаКлиентеНаСервереБезКонтекста
Функция ФорматыВыводаОшибки()
Форматы = Новый Структура();
Форматы.Вставить("Текст", "Текст");
Форматы.Вставить("HTML", "HTML");
Возврат Форматы;
КонецФункции
&НаКлиенте
Процедура ОтобразитьДанныеОшибки();
ДанныеТеста = Элементы.ДеревоТестов.ТекущиеДанные;
Если ДанныеТеста = Неопределено Или НЕ ЗначениеЗаполнено(ДанныеТеста.Ошибки) Тогда
Если ЭтоАдресВременногоХранилища(ОтображениеОшибки) Тогда
УдалитьИзВременногоХранилища(ОтображениеОшибки);
КонецЕсли;
ОтображениеОшибки = Неопределено;
Возврат;
КонецЕсли;
ОтображениеОшибки = ДеревоОшибкиHTML(ОтображениеОшибки, ДанныеТеста.Ошибки);
КонецПроцедуры
&НаСервереБезКонтекста
Функция ДеревоОшибкиHTML(Знач АдресХранилища, Знач Ошибки)
Если ЭтоАдресВременногоХранилища(АдресХранилища) Тогда
УдалитьИзВременногоХранилища(АдресХранилища);
КонецЕсли;
Блоки = Новый Массив();
Для Каждого Ошибка Из Ошибки Цикл
ВывестиДанныеОшибки(Блоки, Ошибка);
КонецЦикла;
ШаблонПредставленияОшибки = ЮТОбщий.Макет("ОбщийМакет.ЮТИнформацияОбОшибке").ПолучитьТекст();
ПредставленияОшибки = СтрЗаменить(ШаблонПредставленияОшибки, "TREE_CONTENT", СтрСоединить(Блоки, Символы.ПС));
Возврат ПолучитьНавигационнуюСсылкуИнформационнойБазы() + "/"+ ПоместитьВоВременноеХранилище(ПредставленияОшибки, Новый УникальныйИдентификатор);
КонецФункции
&НаСервереБезКонтекста
Процедура ВывестиДанныеОшибки(Блоки, Ошибка)
Блоки.Добавить(СтрШаблон("<div class='row main message'>
|<div class='row-title'>
| <span class='caret'></span>
| <span class='status'></span>
| <pre>%1</pre>
|</div>
|", ЗаменитьСпецСимволы(Ошибка.Сообщение)));
Если ЗначениеЗаполнено(Ошибка.Лог) Или ЗначениеЗаполнено(Ошибка.Стек) Тогда
Блоки.Добавить("<div class='nested'>");
ВывестиЛог(Блоки, Ошибка.Лог);
ВывестиСтек(Блоки, Ошибка.Стек);
Блоки.Добавить("</div>");
КонецЕсли;
Блоки.Добавить("</div>");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВывестиЛог(Блоки, Лог)
Если НЕ ЗначениеЗаполнено(Лог) Тогда
Возврат;
КонецЕсли;
Блоки.Добавить("<div class='log-block side'>
| <span class='log-title'>Лог исполнения</span>
| <div class='nested'>");
Для Каждого Строка Из Лог Цикл
Блоки.Добавить(СтрШаблон(" <pre class='note-line'>%1</pre>", ЗаменитьСпецСимволы(Строка)));
КонецЦикла;
Блоки.Добавить("</div></div>");
КонецПроцедуры
&НаСервереБезКонтекста
Процедура ВывестиСтек(Блоки, ПредставлениеСтека)
Если НЕ ЗначениеЗаполнено(ПредставлениеСтека) Тогда
Возврат;
КонецЕсли;
Стек = Стек(ПредставлениеСтека);
Блоки.Добавить(СтрШаблон("<div class='row main %1' style='margin-left:1em'>
|<div class='row-title'>
| <span class='caret'></span>
| <span class='status'></span>
| <pre>%2</pre>
|</div>
|<div class='nested'>
|", "failure", ЗаменитьСпецСимволы(Стек.Сообщение)));
Для Каждого Линия Из Стек.Линии Цикл
Блоки.Добавить(СтрШаблон("<div class='row-title side line' style='margin-left:1em'></span><span class='status'></span>
|<pre>%1</pre>
|</div>
|", ЗаменитьСпецСимволы(Линия)));
КонецЦикла;
Блоки.Добавить("</div></div>");
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаменитьСпецСимволы(Знач Стр)
Стр = СтрЗаменить(Стр, "&", "&amp;");
Стр = СтрЗаменить(Стр, """", "&quot;");
Стр = СтрЗаменить(Стр, "<", "&lt;");
Стр = СтрЗаменить(Стр, ">", "&gt;");
Стр = СтрЗаменить(Стр, "‘", "&apos;");
Возврат СокрЛП(Стр);
КонецФункции
&НаСервереБезКонтекста
Функция Стек(Стек)
Разделитель = Символы.ПС;
Строки = СтрРазделить(Стек, Разделитель);
Корень = Новый Структура("Сообщение, Линии", Неопределено, Новый Массив());
Для Инд = 0 По Строки.ВГраница() Цикл
Строка = Строки[Инд];
Если СтрНачинаетсяС(Строка, "{") И СтрНайти(Строка, ")}") Тогда
НомерСтроки = Инд;
Прервать;
КонецЕсли;
Корень.Сообщение = ЮТСтроки.ДобавитьСтроку(Корень.Сообщение, Строка, Разделитель);
КонецЦикла;
Для Инд = НомерСтроки По Строки.ВГраница() Цикл
Строка = Строки[Инд];
Если СтрНачинаетсяС(Строка, "{") И СтрНайти(Строка, ")}") Тогда
Корень.Линии.Добавить(Строка);
КонецЕсли;
КонецЦикла;
Возврат Корень;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -457,7 +457,7 @@
#Если ВебКлиент Тогда
ВызватьИсключение "Сохранение конфигурации из веб-клиента не поддерживается";
#Иначе
Конфигурация = ЮТФабрикаСлужебный.ПараметрыЗапуска();
Конфигурация = ЮТФабрика.ПараметрыЗапуска();
Конфигурация.Удалить("ВыполнятьМодульноеТестирование");
Конфигурация.showReport = ОтобразитьОтчет;