diff --git a/documentation/docs/user-api/test-data/test-data-deletion.md b/documentation/docs/user-api/test-data/test-data-deletion.md
new file mode 100644
index 00000000..27bf3f94
--- /dev/null
+++ b/documentation/docs/user-api/test-data/test-data-deletion.md
@@ -0,0 +1,96 @@
+---
+tags: [Getting started, Test data]
+---
+
+# Удаление тестовых данных
+
+При использовании тестовых данных нередко необходимо удалять созданные объекты.
+
+Для этого вы можете использовать
+
+## Автоматические транзакции
+
+Для включения нужно при регистрации теста вызвать метод `ВТранзакции()`
+
+```bsl title=ВТранзакции.bsl
+ЮТТесты
+ .ДобавитьТест("Фикция").ВТранзакции() // Использование транзакции для конкретного теста
+
+ЮТТесты
+ .ДобавитьТестовыйНабор("Основной).ВТранзакции() // Использование транзакции для набора тестов
+ .ДобавитьТест("Фикция")
+
+ЮТТесты.ВТранзакции() // Использование транзакции для тестов модуля
+ .ДобавитьТест("Фикция")
+
+```
+
+И тогда тестовый движок будет оборачивать в транзакцию каждый серверный тест (для клиентских будет игнорироваться)
+
+:::caution Учитывайте
+В транзакцию оборачивается тест, а не модуль или набор, поэтому данные созданные вне теста не будут удалены.
+Такие данные необходимо удалять самостоятельно при необходимости.
+:::
+
+## Механизма удаления тестовых данных
+
+Для включения нужно при регистрации теста вызвать метод `УдалениеТестовыхДанных()`
+
+```bsl title=УдалениеТестовыхДанных.bsl
+ЮТТесты
+ .ДобавитьТест("Фикция").УдалениеТестовыхДанных() // Использование для конкретного теста
+
+ЮТТесты
+ .ДобавитьТестовыйНабор("Основной).УдалениеТестовыхДанных() // Использование для всех тестов набора
+ .ДобавитьТест("Фикция")
+
+ЮТТесты.УдалениеТестовыхДанных() // Использование для всех тестов модуля
+ .ДобавитьТест("Фикция")
+
+ЮТТесты.ВТранзакции().УдалениеТестовыхДанных() // Совместно с транзакцией
+ .ДобавитьТест("Фикция")
+
+```
+
+Механизм не используется транзакции, а запоминает в контексте все созданные с помощью API объекты и записи регистров сведений.
+Позволяет:
+
+* Удалять данные созданные с клиента
+* Удалять данные созданные вне теста (в обработчиках событий)
+
+:::tip
+Механизм понимает в рамках какого контекста исполнения (тест, набор, модуль) были созданы данные и удаляет их по выходу из него.
+:::
+
+Рассмотрим время жизни объектов созданных на разных этапах тестирования, например имеем такой модуль.
+
+```bsl title=УдалениеТестовыхДанныхВремяЖизни.bsl
+Процедура ПередВсемиТестами() Экспорт
+ ДанныеМодуля = ЮТест.Данные().СоздатьЭлемент(); // Не будет удалена
+КонецПроцедуры
+
+Процедура ПередТестовымНабором() Экспорт
+ ДанныеНабора = ЮТест.Данные().СоздатьЭлемент();
+КонецПроцедуры
+
+Процедура ПослеВсехТестов() Экспорт
+ ДанныеТеста = ЮТест.Данные().СоздатьЭлемент();
+КонецПроцедуры
+
+Процедура Тест() Экспорт
+ Ссылка = ЮТест.Данные().СоздатьЭлемент();
+КонецПроцедуры
+```
+
+Для переменных получим разное время жизни
+
+* `ДанныеМодуля` - Не будет удалена, проблема будет решена в ближайшем будущем.
+* `ДанныеНабора` - Живет, пока исполняются тесты набора.
+* `ДанныеТеста` и `Ссылка`- Живут, пока исполняется тест.
+
+:::caution Механизм имеет ряд ограничений и не работает для следующих кейсов:
+
+* Данные создан не через API
+* Данные созданы в событии "ПередВсемиТестами" (работает для "ПередТестовымНабором")
+* Данные созданы в клиентском модуле через вызов своего серверного модуля, даже если он использует API тестового движка
+:::
diff --git a/documentation/docs/user-api/test-data.md b/documentation/docs/user-api/test-data/test-data.md
similarity index 98%
rename from documentation/docs/user-api/test-data.md
rename to documentation/docs/user-api/test-data/test-data.md
index 8e26512f..0b0776ff 100644
--- a/documentation/docs/user-api/test-data.md
+++ b/documentation/docs/user-api/test-data/test-data.md
@@ -22,12 +22,13 @@ tags: [Getting started, Test data]
Если грамотно распределить тестовые данные на способы создания, мы можем добиться оптимального результата.
Например, можно статичные данные создать вручную, сложные кейсы данных засунуть в макеты, а для программного создания реализовать методы-конструкторы, которые будем переиспользовать. Таким образом, сможем уйти от минусов данного подхода или минимизировать их вред.
-В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные`.
+В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные()`.
Сейчас это минимальный набор методов, который в дальнейшем будет развиваться. Он позволяет:
* Создавать данные информационной базы
* Генерировать случайные значения
+* Автоматически удалять созданные данные (для этого необходимо включить настройку теста `УдалениеТестовыхДанных()`)
* Работать с файлами
* Использовать таблицы markdown в качестве макетов данных
diff --git a/exts/yaxunit/src/CommonModules/ЮТИсполнительКлиентСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТИсполнительКлиентСервер/Module.bsl
index 029504aa..52f420d5 100644
--- a/exts/yaxunit/src/CommonModules/ЮТИсполнительКлиентСервер/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТИсполнительКлиентСервер/Module.bsl
@@ -31,9 +31,6 @@
Возврат Наборы;
КонецЕсли;
- Уровни = ЮТФабрика.УровниИсполнения();
- ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
-
ЮТСобытия.ПередВсемиТестамиМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
@@ -51,8 +48,6 @@
КонецЦикла;
- ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
-
ЮТСобытия.ПослеВсехТестовМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
@@ -71,9 +66,6 @@
Функция ВыполнитьНаборТестов(Набор, ТестовыйМодуль)
- Уровни = ЮТФабрика.УровниИсполнения();
- ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
-
Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередТестовымНабором(ТестовыйМодуль, Набор);
@@ -82,7 +74,6 @@
КонецЕсли;
Результаты = Новый Массив();
- ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Тест;
Для Каждого Тест Из Набор.Тесты Цикл
@@ -98,7 +89,6 @@
КонецЦикла;
- ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
ЮТСобытия.ПослеТестовогоНабора(ТестовыйМодуль, Набор);
Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта;
diff --git a/exts/yaxunit/src/CommonModules/ЮТКонструкторТестовыхДанных/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТКонструкторТестовыхДанных/Module.bsl
index e59b96d4..1891a30b 100644
--- a/exts/yaxunit/src/CommonModules/ЮТКонструкторТестовыхДанных/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТКонструкторТестовыхДанных/Module.bsl
@@ -148,7 +148,11 @@
ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства;
ПараметрыЗаписи.ОбменДаннымиЗагрузка = ОбменДаннымиЗагрузка;
- Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
+ Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
+
+ ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
+
+ Возврат Ссылка;
КонецФункции
@@ -170,7 +174,11 @@
ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства;
ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение;
- Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
+ Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
+
+ ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
+
+ Возврат Ссылка;
КонецФункции
diff --git a/exts/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl
index f10639a6..2e9b5ae9 100644
--- a/exts/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТКонтекст/Module.bsl
@@ -222,21 +222,21 @@
КонецПроцедуры
-Процедура УстановитьКонтекстНабораТестов(Знач ДанныеКонтекста) Экспорт
+Процедура УстановитьКонтекстНабораТестов() Экспорт
- УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), ДанныеКонтекста);
+ УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), Новый Структура);
КонецПроцедуры
-Процедура УстановитьКонтекстМодуля(Знач ДанныеКонтекста) Экспорт
+Процедура УстановитьКонтекстМодуля() Экспорт
- УстановитьЗначениеКонтекста(ИмяКонтекстаМодуля(), ДанныеКонтекста);
+ УстановитьЗначениеКонтекста(ИмяКонтекстаМодуля(), Новый Структура);
КонецПроцедуры
-Процедура УстановитьКонтекстТеста(Знач ДанныеКонтекста) Экспорт
+Процедура УстановитьКонтекстТеста() Экспорт
- УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), ДанныеКонтекста);
+ УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), Новый Структура);
КонецПроцедуры
diff --git a/exts/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl
index 50d84ee2..c447efb9 100644
--- a/exts/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТКонтекстТеста/Module.bsl
@@ -30,19 +30,26 @@
Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;
Уровни = ЮТФабрика.УровниИсполнения();
- Если Уровень = Уровни.Тест И ЮТКонтекст.КонтекстТеста().Свойство(ИмяЗначения) Тогда
+ КонтекстТеста = ЮТКонтекст.КонтекстТеста();
+ Если Уровень = Уровни.Тест И КонтекстТеста <> Неопределено И КонтекстТеста.Свойство(ИмяЗначения) Тогда
- Возврат ЮТКонтекст.КонтекстТеста()[ИмяЗначения];
+ Возврат КонтекстТеста[ИмяЗначения];
- ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов)
- И ЮТКонтекст.КонтекстНабора().Свойство(ИмяЗначения) Тогда
+ КонецЕсли;
+
+ КонтекстНабора = ЮТКонтекст.КонтекстНабора();
+ Если (Уровень = Уровни.НаборТестов ИЛИ Уровень = Уровни.Тест)
+ И КонтекстНабора <> Неопределено И КонтекстНабора.Свойство(ИмяЗначения) Тогда
- Возврат ЮТКонтекст.КонтекстНабора()[ИмяЗначения];
+ Возврат КонтекстНабора[ИмяЗначения];
- ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов ИЛИ Уровень = Уровни.Модуль)
- И ЮТКонтекст.КонтекстМодуля().Свойство(ИмяЗначения) Тогда
+ КонецЕсли;
+
+ КонтекстМодуля = ЮТКонтекст.КонтекстМодуля();
+ Если (Уровень = Уровни.Модуль ИЛИ Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов)
+ И КонтекстМодуля <> Неопределено И КонтекстМодуля.Свойство(ИмяЗначения) Тогда
- Возврат ЮТКонтекст.КонтекстМодуля()[ИмяЗначения];
+ Возврат КонтекстМодуля[ИмяЗначения];
Иначе
@@ -63,20 +70,53 @@
Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;
Уровни = ЮТФабрика.УровниИсполнения();
- Если Уровень = Уровни.Тест Тогда
+ Контекст = ТекущийКонтекст();
+
+ Если Контекст = Неопределено Тогда
- ЮТКонтекст.КонтекстТеста().Вставить(ИмяЗначения, Значение);
+ Если Уровень = Уровни.Тест Тогда
+ ЮТКонтекст.УстановитьКонтекстТеста();
+ ИначеЕсли Уровень = Уровни.НаборТестов Тогда
+ ЮТКонтекст.УстановитьКонтекстНабораТестов();
+ ИначеЕсли Уровень = Уровни.Модуль Тогда
+ ЮТКонтекст.УстановитьКонтекстМодуля();
+ Иначе
+ ВызватьИсключение СтрШаблон("Неизвестный уровень исполнения `%1`", Уровень);
+ КонецЕсли;
- ИначеЕсли Уровень = Уровни.НаборТестов Тогда
-
- ЮТКонтекст.КонтекстНабора().Вставить(ИмяЗначения, Значение);
-
- ИначеЕсли Уровень = Уровни.Модуль Тогда
-
- ЮТКонтекст.КонтекстМодуля().Вставить(ИмяЗначения, Значение);
+ Контекст = ТекущийКонтекст();
КонецЕсли;
+ Контекст.Вставить(ИмяЗначения, Значение);
+
КонецПроцедуры
+Функция ТекущийКонтекст() Экспорт
+
+ Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;
+ Уровни = ЮТФабрика.УровниИсполнения();
+
+ Если Уровень = Уровни.Тест Тогда
+
+ Контекст = ЮТКонтекст.КонтекстТеста();
+
+ ИначеЕсли Уровень = Уровни.НаборТестов Тогда
+
+ Контекст = ЮТКонтекст.КонтекстНабора();
+
+ ИначеЕсли Уровень = Уровни.Модуль Тогда
+
+ Контекст = ЮТКонтекст.КонтекстМодуля();
+
+ Иначе
+
+ Контекст = Неопределено;
+
+ КонецЕсли;
+
+ Возврат Контекст;
+
+КонецФункции
+
#КонецОбласти
diff --git a/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl
index c6ddd359..edce5398 100644
--- a/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТМетаданныеСервер/Module.bsl
@@ -110,66 +110,44 @@
КонецФункции
-Функция ОписаниеОбъектМетаданных(Знач Значение) Экспорт
+Функция ОписаниеОбъектМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт
- ТипЗначение = ТипЗнч(Значение);
-
- Если ТипЗначение = Тип("Тип") Тогда
-
- МетаданныеОбъекта = Метаданные.НайтиПоТипу(Значение);
- ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
-
- ИначеЕсли ТипЗначение = Тип("ОбъектМетаданных") Тогда
-
- МетаданныеОбъекта = Значение;
- ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
-
- ИначеЕсли ТипЗначение = Тип("Строка") Тогда
-
- ЧастиСтроки = СтрРазделить(Значение, ".");
- Если ЧастиСтроки.Количество() = 2 Тогда
- ТипыМетаданных = ЮТМетаданные.ТипыМетаданных();
- ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]];
- Если ОписаниеТипа <> Неопределено Тогда
- МетаданныеОбъекта = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]];
- КонецЕсли;
- КонецЕсли;
-
- КонецЕсли;
-
- Если МетаданныеОбъекта = Неопределено ИЛИ ОписаниеТипа = Неопределено Тогда
- Сообщение = СтрШаблон("Не удалось получить описание метаданных для `%1` (%2)", Значение, ТипЗначение);
- ВызватьИсключение Сообщение;
- КонецЕсли;
+ МетаданныеОбъекта = ОбъектМетаданных(Значение);
+ ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
ОписаниеОбъект = Новый Структура;
+ ОписаниеОбъект.Вставить("Имя", МетаданныеОбъекта.Имя);
ОписаниеОбъект.Вставить("ОписаниеТипа", ОписаниеТипа);
ОписаниеОбъект.Вставить("Реквизиты", Новый Структура());
ОписаниеОбъект.Вставить("ТабличныеЧасти", Новый Структура());
- ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты);
+ Если НЕ ЗаполнятьРеквизиты Тогда
+ Возврат ОписаниеОбъект;
+ КонецЕсли;
+
+ ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты, "Ссылка, Период");
Если ОписаниеТипа.Измерения Тогда
- ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты);
+ ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты, Истина);
КонецЕсли;
Если ОписаниеТипа.Реквизиты Тогда
- ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Реквизиты, ОписаниеОбъект.Реквизиты);
+ ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Реквизиты, ОписаниеОбъект.Реквизиты, Ложь);
КонецЕсли;
Если ОписаниеТипа.Ресурсы Тогда
- ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Ресурсы, ОписаниеОбъект.Реквизиты);
+ ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Ресурсы, ОписаниеОбъект.Реквизиты, Ложь);
КонецЕсли;
Если ОписаниеТипа.РеквизитыАдресации Тогда
- ДобавитьОписанияРеквизитов(МетаданныеОбъекта.РеквизитыАдресации, ОписаниеОбъект.Реквизиты);
+ ДобавитьОписанияРеквизитов(МетаданныеОбъекта.РеквизитыАдресации, ОписаниеОбъект.Реквизиты, Ложь);
КонецЕсли;
Если ОписаниеТипа.ТабличныеЧасти Тогда
Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл
РеквизитыТабличнойЧасти = Новый Структура();
- ДобавитьОписанияРеквизитов(ТабличнаяЧасть.Реквизиты, РеквизитыТабличнойЧасти);
+ ДобавитьОписанияРеквизитов(ТабличнаяЧасть.Реквизиты, РеквизитыТабличнойЧасти, Ложь);
ОписаниеОбъект.ТабличныеЧасти.Вставить(ТабличнаяЧасть.Имя, РеквизитыТабличнойЧасти);
КонецЦикла;
@@ -245,22 +223,69 @@
#Область СлужебныеПроцедурыИФункции
-Процедура ДобавитьОписанияРеквизитов(КоллекцияРеквизитов, КоллекцияОписаний)
+Функция ОбъектМетаданных(Значение)
+
+ ТипЗначение = ТипЗнч(Значение);
+
+ Если ТипЗначение = Тип("Тип") Тогда
+
+ ОбъектМетаданных = Метаданные.НайтиПоТипу(Значение);
+
+ ИначеЕсли ТипЗначение = Тип("ОбъектМетаданных") Тогда
+
+ ОбъектМетаданных = Значение;
+
+ ИначеЕсли ТипЗначение = Тип("Строка") Тогда
+
+ ЧастиСтроки = СтрРазделить(Значение, ".");
+ Если ЧастиСтроки.Количество() = 2 Тогда
+ ТипыМетаданных = ЮТМетаданные.ТипыМетаданных();
+ ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]];
+ Если ОписаниеТипа <> Неопределено Тогда
+ ОбъектМетаданных = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]];
+ КонецЕсли;
+ КонецЕсли;
+
+ Иначе
+
+ ОбъектМетаданных = Неопределено;
+
+ КонецЕсли;
+
+ Если ОбъектМетаданных = Неопределено Тогда
+ Сообщение = ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТМетаданныеСервер.ОбъектМетаданных", Значение);
+ ВызватьИсключение Сообщение;
+ КонецЕсли;
+
+ Возврат ОбъектМетаданных;
+
+КонецФункции
+
+Процедура ДобавитьОписанияРеквизитов(КоллекцияРеквизитов, КоллекцияОписаний, Знач ЭтоКлюч)
+
+ Если ТипЗнч(ЭтоКлюч) = Тип("Строка") Тогда
+ ИменаКлючевыхПолей = СтрРазделить(ЭтоКлюч, ", ");
+ КонецЕсли;
Для Каждого Реквизит Из КоллекцияРеквизитов Цикл
- КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит));
+ Если ИменаКлючевыхПолей <> Неопределено Тогда
+ ЭтоКлюч = ИменаКлючевыхПолей.Найти(Реквизит.Имя) <> Неопределено;
+ КонецЕсли;
+
+ КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит, ЭтоКлюч));
КонецЦикла;
КонецПроцедуры
-Функция ОписаниеРеквизита(Реквизит) Экспорт
+Функция ОписаниеРеквизита(Реквизит, ЭтоКлюч) Экспорт
Описание = Новый Структура();
Описание.Вставить("Имя", Реквизит.Имя);
Описание.Вставить("Тип", Реквизит.Тип);
Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку);
+ Описание.Вставить("ЭтоКлюч", ЭтоКлюч);
Возврат Описание;
diff --git a/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl
index 0006346e..9b4c756a 100644
--- a/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТНастройкиВыполнения/Module.bsl
@@ -18,17 +18,39 @@
#Область СлужебныйПрограммныйИнтерфейс
-Функция ЗначениеНастройкиТеста(ИмяНастройки, ОписаниеТеста, ОписаниеТестовогоНабора, ЗначениеПоУмолчанию) Экспорт
+Функция ВТранзакции() Экспорт
+
+ ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции;
+
+ Возврат ЗначениеНастройкиТеста(ИмяПараметра, Ложь);
+
+КонецФункции
+
+Функция УдалениеТестовыхДанных() Экспорт
+
+ ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().УдалениеТестовыхДанных;
+
+ Возврат ЗначениеНастройкиТеста(ИмяПараметра, Ложь);
+
+КонецФункции
+
+Функция ЗначениеНастройкиТеста(ИмяНастройки, ЗначениеПоУмолчанию) Экспорт
Значение = ЗначениеПоУмолчанию;
+ КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
- Если ОписаниеТеста.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
- Значение = ОписаниеТеста.НастройкиВыполнения[ИмяНастройки];
- ИначеЕсли ОписаниеТестовогоНабора.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
- Значение = ОписаниеТестовогоНабора.НастройкиВыполнения[ИмяНастройки];
+ Если КонтекстИсполнения.Тест <> Неопределено И КонтекстИсполнения.Тест.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
+
+ Значение = КонтекстИсполнения.Тест.НастройкиВыполнения[ИмяНастройки];
+
+ ИначеЕсли КонтекстИсполнения.Набор <> Неопределено И КонтекстИсполнения.Набор.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
+
+ Значение = КонтекстИсполнения.Набор.НастройкиВыполнения[ИмяНастройки];
+
Иначе
ГлобальныеНастройки = ЮТКонтекст.ГлобальныеНастройкиВыполнения();
+
Если ГлобальныеНастройки.Свойство(ИмяНастройки) Тогда
Значение = ГлобальныеНастройки[ИмяНастройки];
КонецЕсли;
diff --git a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl
index 1d3754e9..8ae1b58f 100644
--- a/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТОбщий/Module.bsl
@@ -790,6 +790,12 @@
КонецПроцедуры
+Функция НеподдерживаемыйПараметрМетода(ИмяМетода, ЗначениеПараметра) Экспорт
+
+ Возврат СтрШаблон("Неподдерживаемый параметры метода `%1` `%2`(%3)", ИмяМетода, ЗначениеПараметра, ТипЗнч(ЗначениеПараметра));
+
+КонецФункции
+
Функция УстановленБезопасныйРежим() Экспорт
Возврат ЮТОбщийВызовСервера.УстановленБезопасныйРежим();
diff --git a/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl
index 63c047f2..de447c8b 100644
--- a/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТСобытия/Module.bsl
@@ -33,7 +33,12 @@
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
Процедура ПередВсемиТестамиМодуля(ТестовыйМодуль) Экспорт
- ЮТКонтекст.УстановитьКонтекстМодуля(Новый Структура());
+ Уровни = ЮТФабрика.УровниИсполнения();
+ КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
+ КонтекстИсполнения.Уровень = Уровни.Модуль;
+ КонтекстИсполнения.Модуль = ТестовыйМодуль;
+
+ ЮТКонтекст.УстановитьКонтекстМодуля();
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль);
ВызватьОбработкуСобытия("ПередВсемиТестами", ОписаниеСобытия);
@@ -47,7 +52,12 @@
// Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Процедура ПередТестовымНабором(ТестовыйМодуль, Набор) Экспорт
- ЮТКонтекст.УстановитьКонтекстНабораТестов(Новый Структура());
+ Уровни = ЮТФабрика.УровниИсполнения();
+ КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
+ КонтекстИсполнения.Уровень = Уровни.НаборТестов;
+ КонтекстИсполнения.Набор = Набор;
+
+ ЮТКонтекст.УстановитьКонтекстНабораТестов();
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор);
ВызватьОбработкуСобытия("ПередТестовымНабором", ОписаниеСобытия);
@@ -62,15 +72,20 @@
// Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста
Процедура ПередКаждымТестом(ТестовыйМодуль, Набор, Тест) Экспорт
+ Уровни = ЮТФабрика.УровниИсполнения();
+ КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
+ КонтекстИсполнения.Уровень = Уровни.Тест;
+ КонтекстИсполнения.Тест = Тест;
+
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор, Тест);
- ЮТКонтекст.УстановитьКонтекстТеста(Новый Структура());
+ ЮТКонтекст.УстановитьКонтекстТеста();
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
ПолучитьСообщенияПользователю(Истина);
#КонецЕсли
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
- Если ВТранзакции(ОписаниеСобытия) Тогда
+ Если ЮТНастройкиВыполнения.ВТранзакции() Тогда
НачатьТранзакцию();
КонецЕсли;
#КонецЕсли
@@ -94,7 +109,7 @@
ВызватьОбработкуСобытия("ПослеКаждогоТеста", ОписаниеСобытия);
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
- Если ВТранзакции(ОписаниеСобытия) Тогда
+ Если ЮТНастройкиВыполнения.ВТранзакции() Тогда
ОтменитьТранзакцию();
Пока ТранзакцияАктивна() Цикл
ОтменитьТранзакцию();
@@ -103,6 +118,11 @@
КонецЕсли;
#КонецЕсли
+ Уровни = ЮТФабрика.УровниИсполнения();
+ КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
+ КонтекстИсполнения.Уровень = Уровни.НаборТестов;
+ КонтекстИсполнения.Тест = Неопределено;
+
КонецПроцедуры
// Обработчик события "ПослеТестовогоНабора"
@@ -115,6 +135,11 @@
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор);
ВызватьОбработкуСобытия("ПослеТестовогоНабора", ОписаниеСобытия);
+ Уровни = ЮТФабрика.УровниИсполнения();
+ КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
+ КонтекстИсполнения.Уровень = Уровни.Модуль;
+ КонтекстИсполнения.Набор = Неопределено;
+
КонецПроцедуры
// Обработчик события "ПослеВсехТестовМодуля"
@@ -126,6 +151,10 @@
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль);
ВызватьОбработкуСобытия("ПослеВсехТестов", ОписаниеСобытия);
+ КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
+ КонтекстИсполнения.Уровень = Неопределено;
+ КонтекстИсполнения.Модуль = Неопределено;
+
КонецПроцедуры
#КонецОбласти
@@ -253,12 +282,4 @@
КонецПроцедуры
-Функция ВТранзакции(ОписаниеСобытия)
-
- ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции;
-
- Возврат ЮТНастройкиВыполнения.ЗначениеНастройкиТеста(ИмяПараметра, ОписаниеСобытия.Тест, ОписаниеСобытия.Набор, Ложь);
-
-КонецФункции
-
#КонецОбласти
diff --git a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl
index dfbb5738..4b6be2f8 100644
--- a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанные/Module.bsl
@@ -29,7 +29,9 @@
// ЛюбаяСсылка - Ссылка на созданный объект
Функция СоздатьЭлемент(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено) Экспорт
- Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЭлемент(Менеджер, Наименование, Реквизиты);
+ Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЭлемент(Менеджер, Наименование, Реквизиты);
+ ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
+ Возврат Ссылка;
КонецФункции
@@ -43,7 +45,9 @@
// ДокументСсылка - Ссылка на созданный объект
Функция СоздатьДокумент(Менеджер, Реквизиты = Неопределено) Экспорт
- Возврат ЮТТестовыеДанныеВызовСервера.СоздатьДокумент(Менеджер, Реквизиты);
+ Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьДокумент(Менеджер, Реквизиты);
+ ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
+ Возврат Ссылка;
КонецФункции
@@ -259,9 +263,7 @@
// Строка
Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт
- Результат = ПолучитьИмяВременногоФайла(Расширение);
- ЮТКонтекст.КонтекстТеста().ВременныеФайлы.Добавить(Результат);
- Возврат Результат;
+ Возврат ЮТТестовыеДанныеСлужебный.НовоеИмяВременногоФайла(Расширение);
КонецФункции
@@ -392,7 +394,9 @@
// Ссылки - Массив из ЛюбаяСсылка
Процедура Удалить(Ссылки) Экспорт
- ЮТТестовыеДанныеВызовСервера.Удалить(Ссылки);
+ Если ЗначениеЗаполнено(Ссылки) Тогда
+ ЮТТестовыеДанныеВызовСервера.Удалить(Ссылки);
+ КонецЕсли;
КонецПроцедуры
@@ -409,84 +413,3 @@
#КонецЕсли
#КонецОбласти
-
-#Область СлужебныйПрограммныйИнтерфейс
-
-// Обработчик события "ПередКаждымТестом"
-//
-// Параметры:
-// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
-Процедура ПередКаждымТестом(ОписаниеСобытия) Экспорт
-
- ЮТКонтекст.КонтекстТеста().Вставить("ВременныеФайлы", Новый Массив);
-
-КонецПроцедуры
-
-// Обработчик события "ПослеКаждогоТеста"
-//
-// Параметры:
-// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
-Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
-
- ВременныеФайлы = ЮТКонтекст.КонтекстТеста().ВременныеФайлы;
-
- Если ВременныеФайлы.Количество() = 0 Тогда
- Возврат;
- КонецЕсли;
-
- Ошибки = Новый Массив();
-
- Для Каждого УдаляемыйФайл Из ВременныеФайлы Цикл
-
- Если ТипЗнч(УдаляемыйФайл) = Тип("Строка") Тогда
- УдаляемыйФайл = Новый Файл(УдаляемыйФайл);
- КонецЕсли;
-
- Попытка
- Если УдаляемыйФайл.Существует() Тогда
-
- Если УдаляемыйФайл.ПолучитьТолькоЧтение() Тогда
- УдаляемыйФайл.УстановитьТолькоЧтение(Ложь);
- КонецЕсли;
-
- УдалитьФайлы(УдаляемыйФайл.ПолноеИмя);
-
- КонецЕсли;
- Исключение
-
- Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление файла " + УдаляемыйФайл, ИнформацияОбОшибке()));
-
- КонецПопытки;
-
- КонецЦикла;
-
- Если ЗначениеЗаполнено(Ошибки) Тогда
- ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
- КонецЕсли;
-
-КонецПроцедуры
-
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Процедура ДобавитьВарианты(Варианты, БазоваяСтруктура, ЗначенияПараметров, Ключи, Инд)
-
- Если Инд > Ключи.ВГраница() Тогда
- Возврат;
- КонецЕсли;
-
- Ключ = Ключи[Инд];
- Для Каждого Значение Из ЗначенияПараметров[Ключ] Цикл
-
- Вариант = ЮТОбщий.СкопироватьСтруктуру(БазоваяСтруктура);
- Вариант[Ключ] = Значение;
- Варианты.Добавить(Вариант);
-
- ДобавитьВарианты(Варианты, Вариант, ЗначенияПараметров, Ключи, Инд + 1);
-
- КонецЦикла;
-
-КонецПроцедуры
-
-#КонецОбласти
diff --git a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl
index 265284c7..1e0f53eb 100644
--- a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеВызовСервера/Module.bsl
@@ -18,16 +18,7 @@
#Область СлужебныйПрограммныйИнтерфейс
-// СоздатьЭлемент
-// Создает новый элемент и возвращает его ссылку
-// Параметры:
-// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд.
-// Наименование - Строка, Неопределено - Наименование элемента
-// Реквизиты - Структура, Неопределено - Значения реквизитов элемента
-//
-// Возвращаемое значение:
-// ЛюбаяСсылка - Ссылка на созданный объект
-Функция СоздатьЭлемент(Знач Менеджер, Знач Наименование = Неопределено, Знач Реквизиты = Неопределено) Экспорт
+Функция СоздатьЭлемент(Знач Менеджер, Знач Наименование, Знач Реквизиты) Экспорт
Менеджер = ЮТОбщий.Менеджер(Менеджер);
@@ -47,21 +38,11 @@
Объект.УстановитьНовыйКод();
КонецЕсли;
- ЗаписатьОбъект(Объект);
-
- Возврат Объект.Ссылка;
+ Возврат ЗаписатьОбъект(Объект);
КонецФункции
-// СоздатьДокумент
-// Создает новый документ и возвращает его ссылку
-// Параметры:
-// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд.
-// Реквизиты - Структура, Неопределено - Значения реквизитов элемента
-//
-// Возвращаемое значение:
-// ДокументСсылка - Ссылка на созданный объект
-Функция СоздатьДокумент(Знач Менеджер, Знач Реквизиты = Неопределено) Экспорт
+Функция СоздатьДокумент(Знач Менеджер, Знач Реквизиты) Экспорт
РежимЗаписи = РежимЗаписиДокумента.Запись;
@@ -76,23 +57,11 @@
РежимЗаписи = ЮТОбщий.ЗначениеСтруктуры(Реквизиты, "РежимЗаписи", РежимЗаписи);
КонецЕсли;
- ЗаписатьОбъект(Объект, , РежимЗаписи);
-
- Возврат Объект.Ссылка;
+ Возврат ЗаписатьОбъект(Объект, , РежимЗаписи);
КонецФункции
-// Создать запись.
-//
-// Параметры:
-// Менеджер - Произвольный
-// Данные - Структура - Данные заполнения объекта
-// ПараметрыЗаписи - см. ЮТОбщий.
-// ВернутьОбъект - Булево - Вернуть объект
-//
-// Возвращаемое значение:
-// Произвольный - Создать запись
-Функция СоздатьЗапись(Знач Менеджер, Знач Данные, Знач ПараметрыЗаписи = Неопределено, Знач ВернутьОбъект = Ложь) Экспорт
+Функция СоздатьЗапись(Знач Менеджер, Знач Данные, Знач ПараметрыЗаписи, Знач ВернутьОбъект) Экспорт
Менеджер = ЮТОбщий.Менеджер(Менеджер);
@@ -135,15 +104,12 @@
КонецЕсли;
РежимЗаписи = ?(СтрСравнить(ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя, "Документ") = 0, ПараметрыЗаписи.РежимЗаписи, Неопределено);
- ЗаписатьОбъект(Объект, ПараметрыЗаписи.ОбменДаннымиЗагрузка, РежимЗаписи);
+ КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи.ОбменДаннымиЗагрузка, РежимЗаписи);
Если ВернутьОбъект Тогда
Возврат Объект;
- ИначеЕсли ЭтоСсылочный Тогда
- Возврат Объект.Ссылка;
Иначе
- ЮТОбщий.СообщитьПользователю("Я пока не умею возвращать ключи регистра");
- Возврат Неопределено;
+ Возврат КлючЗаписи;
КонецЕсли;
КонецФункции
@@ -154,12 +120,43 @@
Ссылки = ЮТОбщий.ЗначениеВМассиве(Ссылки);
КонецЕсли;
+ СсылочныеТипы = ЮТОбщий.ОписаниеТиповЛюбаяСсылка();
+ Ошибки = Новый Массив;
+
Для Каждого Ссылка Из Ссылки Цикл
- Ссылка.ПолучитьОбъект().Удалить();
+ ТипЗначения = ТипЗнч(Ссылка);
+ Если Ссылка = Неопределено ИЛИ СтрНачинаетсяС(ЮТОбщий.ПредставлениеТипа(ТипЗначения), "Enum") Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Попытка
+ Если СсылочныеТипы.СодержитТип(ТипЗначения) Тогда
+ Объект = Ссылка.ПолучитьОбъект();
+ Если Объект <> Неопределено Тогда
+ Объект.Удалить();
+ КонецЕсли;
+ Иначе
+ Менеджер = Менеджер(ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗначения, Ложь));
+ Запись = Менеджер.СоздатьМенеджерЗаписи();
+ ЗаполнитьЗначенияСвойств(Запись, Ссылка);
+ Запись.Прочитать();
+ Запись.Удалить();
+ КонецЕсли;
+ Исключение
+
+ Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление " + Ссылка, ИнформацияОбОшибке()));
+
+ КонецПопытки;
КонецЦикла;
+ ОбновитьНумерациюОбъектов();
+
+ Если ЗначениеЗаполнено(Ошибки) Тогда
+ ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
+ КонецЕсли;
+
КонецПроцедуры
Функция ФикцияЗначенияБазы(Знач ТипЗначения) Экспорт
@@ -188,9 +185,7 @@
ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных);
- ЗаписатьОбъект(Объект);
-
- Возврат Объект.Ссылка;
+ Возврат ЗаписатьОбъект(Объект);
КонецФункции
@@ -235,7 +230,7 @@
КонецФункции
-Процедура ЗаписатьОбъект(Объект, ОбменДаннымиЗагрузка = Ложь, РежимЗаписи = Неопределено)
+Функция ЗаписатьОбъект(Объект, ОбменДаннымиЗагрузка = Ложь, РежимЗаписи = Неопределено)
Если ОбменДаннымиЗагрузка Тогда
Объект.ОбменДанными.Загрузка = Истина;
@@ -249,6 +244,8 @@
Объект.Записать();
КонецЕсли;
+ Возврат КлючЗаписи(Объект);
+
Исключение
Сообщение = СтрШаблон("Не удалось записать объект `%1` (%2)
@@ -257,7 +254,7 @@
КонецПопытки;
-КонецПроцедуры
+КонецФункции
Процедура ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных)
@@ -285,4 +282,38 @@
КонецПроцедуры
+Функция КлючЗаписи(Объект)
+
+ ПредставлениеТипа = ЮТОбщий.ПредставлениеТипа(ТипЗнч(Объект));
+ Если СтрНайти(ПредставлениеТипа, "Object.") Тогда
+
+ Возврат Объект.Ссылка;
+
+ ИначеЕсли СтрНайти(ПредставлениеТипа, "менеджер записи:") Тогда // TODO
+
+ Описание = ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗнч(Объект));
+
+ КлючевыеРеквизиты = Новый Структура();
+ Для Каждого Реквизит Из Описание.Реквизиты Цикл
+ Если Реквизит.Значение.ЭтоКлюч Тогда
+ КлючевыеРеквизиты.Вставить(Реквизит.Ключ, Объект[Реквизит.Ключ]);
+ КонецЕсли;
+ КонецЦикла;
+
+ Менеджер = Менеджер(Описание);
+ Возврат Менеджер.СоздатьКлючЗаписи(КлючевыеРеквизиты);
+
+ Иначе
+
+ Сообщение = ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.КлючЗаписи", Объект);
+ ВызватьИсключение Сообщение;
+
+ КонецЕсли;
+
+КонецФункции
+
+Функция Менеджер(ОписаниеОбъектМетаданных)
+ Возврат Новый(СтрШаблон("%1Менеджер.%2", ОписаниеОбъектМетаданных.ОписаниеТипа.Имя, ОписаниеОбъектМетаданных.Имя));
+КонецФункции
+
#КонецОбласти
diff --git a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеСлужебный/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеСлужебный/Module.bsl
index 642e2154..dffa7d84 100644
--- a/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеСлужебный/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТТестовыеДанныеСлужебный/Module.bsl
@@ -66,20 +66,83 @@
ИначеЕсли ЭтоСистемноеПеречисление(Тип) Тогда
Значение = СлучайноЗначениеСистемногоПеречисления(Тип);
+
Иначе
Значение = ЮТТестовыеДанныеВызовСервера.ФикцияЗначенияБазы(Тип);
+ ДобавитьТестовуюЗапись(Значение);
КонецЕсли;
Если Значение = Неопределено Тогда
ВызватьИсключение СтрШаблон("Создание фейковых значений для `%1` не поддерживается", ОписаниеТипа);
КонецЕсли;
-
+
Возврат ОписаниеТипа.ПривестиЗначение(Значение);
КонецФункции
+// см. ЮТТестовыеДанные.НовоеИмяВременногоФайла
+Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт
+
+ //@skip-check missing-temporary-file-deletion
+ Результат = ПолучитьИмяВременногоФайла(Расширение); // BSLLS:MissingTemporaryFileDeletion-off
+ ДобавитьВременныйФайл(Результат);
+ Возврат Результат;
+
+КонецФункции
+
+Процедура ДобавитьВременныйФайл(Файл) Экспорт
+
+ БуферВременныеФайлы().Добавить(Файл);
+
+КонецПроцедуры
+
+Процедура ДобавитьТестовуюЗапись(Запись) Экспорт
+
+#Если Сервер Тогда
+ Если ТранзакцияАктивна() И ЮТНастройкиВыполнения.ВТранзакции() Тогда
+ Возврат;
+ КонецЕсли;
+#КонецЕсли
+ Если ЮТНастройкиВыполнения.УдалениеТестовыхДанных() Тогда
+ БуферТестовыеДанные().Добавить(Запись);
+ КонецЕсли;
+
+КонецПроцедуры
+
+Процедура УдалитьТестовыеДанные() Экспорт
+
+ ЮТФайлы.УдалитьВременныеФайлы(БуферВременныеФайлы());
+
+ Если ЮТНастройкиВыполнения.УдалениеТестовыхДанных() Тогда
+ ЮТТестовыеДанные.Удалить(БуферТестовыеДанные());
+ КонецЕсли;
+
+КонецПроцедуры
+
+#Область ОбработчикиСобытий
+
+Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
+
+ УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста
+
+КонецПроцедуры
+
+Процедура ПослеТестовогоНабора(ОписаниеСобытия) Экспорт
+
+ УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста
+
+КонецПроцедуры
+
+Процедура ПослеВсехТестов(ОписаниеСобытия) Экспорт
+
+ УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста
+
+КонецПроцедуры
+
+#КонецОбласти
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -129,4 +192,31 @@
КонецФункции
+Функция БуферВременныеФайлы()
+
+ Возврат Буфер("ВременныеФайлы");
+
+КонецФункции
+
+Функция БуферТестовыеДанные()
+
+ Возврат Буфер("ТестовыеДанные");
+
+КонецФункции
+
+Функция Буфер(Ключ)
+
+ ТекущийКонтекст = ЮТест.Контекст().ТекущийКонтекст();
+
+ Если ТекущийКонтекст.Свойство(Ключ) Тогда
+ Буфер = ТекущийКонтекст[Ключ];
+ Иначе
+ Буфер = Новый Массив();
+ ТекущийКонтекст.Вставить(Ключ, Буфер);
+ КонецЕсли;
+
+ Возврат Буфер;
+
+КонецФункции
+
#КонецОбласти
diff --git a/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl
index ef49ca86..5aaf0a74 100644
--- a/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТТесты/Module.bsl
@@ -163,6 +163,27 @@
КонецФункции
+// Устанавливает настройку удаления созданных тестовых данных
+// В отличии от использования транзакции:
+//
+// * Умеет работь с данными созданными на клиенте
+// * Только удаляет созданные данные и не откатывает изменения объектов
+// * Работает с данными созданными через API работы с тестовыми данными
+// * Удаляет данные созданные вне теста (в обработчиках событий, например, ПередТестовымНабором)
+//
+// Параметры:
+// УдалятьСозданныеДанные - Булево
+//
+// Возвращаемое значение:
+// ОбщийМодуль - Этот же модуль, для замыкания
+Функция УдалениеТестовыхДанных(УдалятьСозданныеДанные = Истина) Экспорт
+
+ НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().УдалениеТестовыхДанных, УдалятьСозданныеДанные);
+
+ Возврат ЮТТесты;
+
+КонецФункции
+
// Устанавливает параметры вызова теста.
//
// * Если метод вызывается первый раз, то он устанавливает параметры теста.
diff --git a/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl
index 7c1f84ea..1b5dbe2a 100644
--- a/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТФабрика/Module.bsl
@@ -63,11 +63,13 @@
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - Параметры исполнения теста:
-// * ВТранзакции - Строка - Тест должен выполняться в транзакции
+// * ВТранзакции - Строка - Тест должен выполняться в транзакции
+// * УдалениеТестовыхДанных - Строка - Тест должен удалить созданные тестовые данные
Функция ПараметрыИсполненияТеста() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("ВТранзакции", "ВТранзакции");
+ Параметры.Вставить("УдалениеТестовыхДанных", "УдалениеТестовыхДанных");
Возврат Новый ФиксированнаяСтруктура(Параметры);
@@ -592,11 +594,20 @@
//
// Возвращаемое значение:
// Структура - Данные контекста исполнения:
-// * Уровень - Строка
+// * Уровень - Строка - Возможные значения см. УровниИсполнения
+// * Модуль - Неопределено - Нет исполняемого модуля
+// - см. ОписаниеТестовогоМодуля
+// * Набор - Неопределено - Нет исполняемого тестового набора
+// - см. ОписаниеИсполняемогоНабораТестов
+// * Тест - Неопределено - Нет исполняемого теста
+// - см. ОписаниеИсполняемогоТеста
Функция НовыйКонтекстИсполнения() Экспорт
Контекст = Новый Структура();
Контекст.Вставить("Уровень", "");
+ Контекст.Вставить("Модуль", Неопределено);
+ Контекст.Вставить("Набор", Неопределено);
+ Контекст.Вставить("Тест", Неопределено);
Возврат Контекст;
diff --git a/exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl b/exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl
index 95f1806b..249d5d76 100644
--- a/exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl
+++ b/exts/yaxunit/src/CommonModules/ЮТФайлы/Module.bsl
@@ -103,6 +103,49 @@
КонецФункции
+// Удаляет файлы
+//
+// Параметры:
+// Файлы - Массив из Файл
+// - Массив из Строка
+Процедура УдалитьВременныеФайлы(Файлы) Экспорт
+
+ Если НЕ ЗначениеЗаполнено(Файлы) Тогда
+ Возврат;
+ КонецЕсли;
+
+ Ошибки = Новый Массив();
+
+ Для Каждого УдаляемыйФайл Из Файлы Цикл
+
+ Если ТипЗнч(УдаляемыйФайл) = Тип("Строка") Тогда
+ УдаляемыйФайл = Новый Файл(УдаляемыйФайл);
+ КонецЕсли;
+
+ Попытка
+ Если УдаляемыйФайл.Существует() Тогда
+
+ Если УдаляемыйФайл.ПолучитьТолькоЧтение() Тогда
+ УдаляемыйФайл.УстановитьТолькоЧтение(Ложь);
+ КонецЕсли;
+
+ УдалитьФайлы(УдаляемыйФайл.ПолноеИмя);
+
+ КонецЕсли;
+ Исключение
+
+ Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление файла " + УдаляемыйФайл, ИнформацияОбОшибке()));
+
+ КонецПопытки;
+
+ КонецЦикла;
+
+ Если ЗначениеЗаполнено(Ошибки) Тогда
+ ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
+ КонецЕсли;
+
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git a/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo b/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo
index 80ee2585..0e0a76b6 100644
--- a/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo
+++ b/exts/yaxunit/src/Subsystems/ЮТФункциональность/Subsystems/ЮТОбработчикиСобытий/ЮТОбработчикиСобытий.mdo
@@ -9,7 +9,7 @@
true
CommonModule.МокитоСлужебный
CommonModule.ЮТЛогирование
- CommonModule.ЮТТестовыеДанные
+ CommonModule.ЮТТестовыеДанныеСлужебный
CommonModule.ЮТУтверждения
Subsystem.ЮТФункциональность
diff --git a/tests/src/CommonModules/ОМ_Мокито/Module.bsl b/tests/src/CommonModules/ОМ_Мокито/Module.bsl
index 2f4772ea..01727556 100644
--- a/tests/src/CommonModules/ОМ_Мокито/Module.bsl
+++ b/tests/src/CommonModules/ОМ_Мокито/Module.bsl
@@ -25,7 +25,7 @@
.ДобавитьТест("Обучение_ЦепочкаВызовов")
.ДобавитьТест("Проверить")
.ДобавитьТест("Прогон_НакоплениеСтатистики").СПараметрами(Истина).СПараметрами(Ложь)
- .ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов")
+ .ДобавитьСерверныйТест("МокированиеМетодовСсылочныхОбъектов").ВТранзакции()
;
КонецПроцедуры
diff --git a/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl b/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl
index 6f549c6e..a5384258 100644
--- a/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl
+++ b/tests/src/CommonModules/ОМ_ЮТЗапросы/Module.bsl
@@ -20,7 +20,7 @@
Процедура ИсполняемыеСценарии() Экспорт
- ЮТТесты.ВТранзакции()
+ ЮТТесты.ВТранзакции().УдалениеТестовыхДанных()
.ДобавитьТест("ЗначенияРеквизитов")
.ДобавитьТест("ЗначениеРеквизита")
.ДобавитьТест("ТаблицаСодержитЗаписи")
diff --git a/tests/src/CommonModules/ОМ_ЮТКонструкторТестовыхДанных/Module.bsl b/tests/src/CommonModules/ОМ_ЮТКонструкторТестовыхДанных/Module.bsl
index 420205ec..8c239817 100644
--- a/tests/src/CommonModules/ОМ_ЮТКонструкторТестовыхДанных/Module.bsl
+++ b/tests/src/CommonModules/ОМ_ЮТКонструкторТестовыхДанных/Module.bsl
@@ -20,7 +20,7 @@
Процедура ИсполняемыеСценарии() Экспорт
- ЮТТесты.ВТранзакции()
+ ЮТТесты.ВТранзакции().УдалениеТестовыхДанных()
.ДобавитьТест("ЗаполнитьСправочник")
.ДобавитьТест("ЗаполнитьДокумент")
;
diff --git a/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl b/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl
index 30ca3723..28611603 100644
--- a/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl
+++ b/tests/src/CommonModules/ОМ_ЮТТестовыеДанные/Module.bsl
@@ -21,6 +21,8 @@
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
+ .ВТранзакции()
+ .УдалениеТестовыхДанных()
.ДобавитьТест("Удалить");
;
diff --git a/tests/src/CommonModules/ОМ_ЮТТестовыеДанныеСлужебный/Module.bsl b/tests/src/CommonModules/ОМ_ЮТТестовыеДанныеСлужебный/Module.bsl
index 8e8e2ebe..2d0af530 100644
--- a/tests/src/CommonModules/ОМ_ЮТТестовыеДанныеСлужебный/Module.bsl
+++ b/tests/src/CommonModules/ОМ_ЮТТестовыеДанныеСлужебный/Module.bsl
@@ -20,7 +20,12 @@
Процедура ИсполняемыеСценарии() Экспорт
+ КодТовара = ЮТОбщий.ЧислоВСтроку(ЮТест.Данные().СлучайноеПоложительноеЧисло(999999999));
+ Период = ТекущаяДата();
+
ЮТТесты
+ .ВТранзакции()
+ .УдалениеТестовыхДанных()
.ДобавитьТест("Фикция")
.СПараметрами(Новый ОписаниеТипов("Число"))
.СПараметрами(Новый ОписаниеТипов("Строка"))
@@ -35,6 +40,16 @@
.СПараметрами(Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыХарактеристик"))
.СПараметрами(Новый ОписаниеТипов("ПланВидовХарактеристикСсылка.ВидыХарактеристик, СправочникСсылка.Банки, ПеречислениеСсылка.СостоянияЗаказов"))
.СПараметрами(Новый ОписаниеТипов("ВидДвиженияНакопления"))
+ .ДобавитьТест("УдалениеТестовыхДанныхСправочник")
+ .СПараметрами(КодТовара)
+ .СПараметрами(КодТовара)
+ .ДобавитьТест("УдалениеТестовыхДанныхДокумент")
+ .СПараметрами(КодТовара)
+ .СПараметрами(КодТовара)
+ .ДобавитьТест("УдалениеТестовыхДанныхРегистрСведений")
+ .СПараметрами(Период)
+ .СПараметрами(Период)
+ .ДобавитьТест("НеУдалениеТестовыхДанныхВызовСервера")
;
КонецПроцедуры
@@ -49,5 +64,100 @@
КонецПроцедуры
+Процедура УдалениеТестовыхДанныхСправочник(Код) Экспорт
+
+ СоздатьСсылку("Тест", Код);
+
+ Ссылки = ЮТест.Контекст().Значение("Ссылки");
+ СсылкаСуществует(Ссылки.Набор, "Набор");
+
+КонецПроцедуры
+
+Процедура НеУдалениеТестовыхДанныхВызовСервера() Экспорт
+
+ Ссылка = ПомощникТестированияВызовСервера.НовыйТовар();
+ ЮТест.Контекст().Значение("Ссылки").Вставить("ТестВызовСервера", Ссылка);
+
+КонецПроцедуры
+
+Процедура УдалениеТестовыхДанныхДокумент(НомерДокумента) Экспорт
+
+ ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара")
+ .Установить("Номер", НомерДокумента)
+ .Провести();
+
+КонецПроцедуры
+
+Процедура УдалениеТестовыхДанныхРегистрСведений(Период) Экспорт
+
+ ЮТест.ОжидаетЧтоТаблицаБазы("РегистрСведений.КурсыВалют").НеСодержитЗаписи(ЮТест.Предикат().Реквизит("Период").Равно(Период));
+ ЮТест.Данные().КонструкторОбъекта("РегистрыСведений.КурсыВалют")
+ .Фикция("Валюта")
+ .Фикция("Курс")
+ .Установить("Период", Период)
+ .Записать();
+
+КонецПроцедуры
+
#КонецОбласти
+#Область СлужебныеПроцедурыИФункции
+
+Процедура ПередВсемиТестами() Экспорт
+
+ Ссылки = Новый Структура("Набор, Тест");
+ ЮТест.Контекст().УстановитьЗначение("Ссылки", Ссылки);
+
+КонецПроцедуры
+
+Процедура ПередТестовымНабором() Экспорт
+
+ СоздатьСсылку("Набор");
+
+КонецПроцедуры
+
+Процедура ПослеВсехТестов() Экспорт
+
+ Ссылки = ЮТест.Контекст().Значение("Ссылки");
+ СсылкаНеСуществует(Ссылки.Набор, "Набор");
+ Если Ссылки.Тест <> Неопределено Тогда
+ СсылкаНеСуществует(Ссылки.Тест, "Тест");
+ КонецЕсли;
+
+#Если Сервер Тогда
+ СсылкаНеСуществует(Ссылки.ТестВызовСервера, "ТестВызовСервера");
+#Иначе
+ СсылкаСуществует(Ссылки.ТестВызовСервера, "ТестВызовСервера");
+#КонецЕсли
+
+КонецПроцедуры
+
+Процедура СоздатьСсылку(ИмяПеременной, Знач Код = Неопределено)
+
+ Если Код = Неопределено Тогда
+ Код = ЮТОбщий.ЧислоВСтроку(ЮТест.Данные().СлучайноеПоложительноеЧисло(999999999));
+ КонецЕсли;
+
+ Ссылка = ЮТест.Данные().КонструкторОбъекта("Справочники.Товары")
+ .Установить("Наименование", Код)
+ .Установить("Код", Код)
+ .Записать();
+ ЮТест.Контекст().Значение("Ссылки").Вставить(ИмяПеременной, Ссылка);
+
+КонецПроцедуры
+
+Процедура СсылкаСуществует(Ссылка, Описание)
+
+ ЮТест.ОжидаетЧто(Ссылка, Описание).ИмеетТип("СправочникСсылка.Товары");
+ ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары", Описание).СодержитЗаписи(ЮТест.Предикат().Реквизит("Ссылка").Равно(Ссылка));
+
+КонецПроцедуры
+
+Процедура СсылкаНеСуществует(Ссылка, Описание)
+
+ ЮТест.ОжидаетЧто(Ссылка, Описание).ИмеетТип("СправочникСсылка.Товары");
+ ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары", Описание).НеСодержитЗаписи(ЮТест.Предикат().Реквизит("Ссылка").Равно(Ссылка));
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git a/tests/src/CommonModules/ОМ_ЮТУтвержденияИБ/Module.bsl b/tests/src/CommonModules/ОМ_ЮТУтвержденияИБ/Module.bsl
index 80153394..7f304cb0 100644
--- a/tests/src/CommonModules/ОМ_ЮТУтвержденияИБ/Module.bsl
+++ b/tests/src/CommonModules/ОМ_ЮТУтвержденияИБ/Module.bsl
@@ -20,7 +20,7 @@
Процедура ИсполняемыеСценарии() Экспорт
- ЮТТесты.ВТранзакции()
+ ЮТТесты.ВТранзакции().УдалениеТестовыхДанных()
.ДобавитьТест("СодержитЗаписи")
.ДобавитьТест("НеСодержитЗаписи")
.ДобавитьТест("СообщенияОбОшибках")
diff --git a/tests/src/CommonModules/ПомощникТестированияВызовСервера/Module.bsl b/tests/src/CommonModules/ПомощникТестированияВызовСервера/Module.bsl
index 37a4aa60..ebd471b5 100644
--- a/tests/src/CommonModules/ПомощникТестированияВызовСервера/Module.bsl
+++ b/tests/src/CommonModules/ПомощникТестированияВызовСервера/Module.bsl
@@ -16,11 +16,7 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
-///////////////////////////////////////////////////////////////////
-// ПрограммныйИнтерфейс
-// Экспортные процедуры и функции для прикладного использования
-///////////////////////////////////////////////////////////////////
-#Область ПрограммныйИнтерфейс
+#Область СлужебныйПрограммныйИнтерфейс
// Проверяет существование ссылки в информационной базе
//
@@ -54,4 +50,17 @@
КонецФункции
+Функция НовыйТовар(Знач Код = Неопределено) Экспорт
+
+ Если Код = Неопределено Тогда
+ Код = ЮТОбщий.ЧислоВСтроку(ЮТест.Данные().СлучайноеПоложительноеЧисло(999999999));
+ КонецЕсли;
+
+ Возврат ЮТест.Данные().КонструкторОбъекта("Справочники.Товары")
+ .Установить("Наименование", Код)
+ .Установить("Код", Код)
+ .Записать();
+
+КонецФункции
+
#КонецОбласти