1
0
mirror of https://github.com/bia-technologies/yaxunit.git synced 2025-03-17 20:48:01 +02:00

Merge branch 'release/23.07'

This commit is contained in:
alkoleft 2023-07-31 23:48:15 +03:00
commit 078cdfc065
724 changed files with 101963 additions and 974 deletions

View File

@ -8,7 +8,7 @@
[![Quality Gate](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=alert_status)](https://sonar.openbsl.ru/dashboard?id=yaxunit)
[![Maintainability](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=sqale_rating)](https://sonar.openbsl.ru/dashboard?id=yaxunit)
Обсудить в [телеграмм чате](https://t.me/BIAOpenTools/12)
Обсудить в [Telegram чате](https://t.me/BIAOpenTools/12)
----

View File

@ -0,0 +1,40 @@
---
title: YaxUnit. Версия 23.05
authors: alkoleft
tags: [releases, yaxunit]
---
[Release 23.05](https://github.com/bia-technologies/edt-test-runner/releases/tag/23.05)
## Новое в версии
### Тестовые данные
* Научили конструктор тестовых данных создавать данные в регистрах [#69](https://github.com/bia-technologies/yaxunit/pull/69)
* Реализовано удаление тестовых данных созданных на клиенте [#74](https://github.com/bia-technologies/yaxunit/pull/74)
* Добавлена возможность создания объекта без записи и формирование вариантов параметров [#86](https://github.com/bia-technologies/yaxunit/pull/86)
* Реализована поддержка параметров заполнения для функции "Фикция" в тестовых данных [#75](https://github.com/bia-technologies/yaxunit/pull/75)
* Сброс признака ОбменДанными.Загрузка после создании объекта через методы движка [#92](https://github.com/bia-technologies/yaxunit/pull/92)
* Поддержка генератором тестовых данных создания группы [#90](https://github.com/bia-technologies/yaxunit/pull/90)
* Возможность создавать несколько конструкторов тестовых данных [#55](https://github.com/bia-technologies/yaxunit/pull/55)
* В конструктор тестовых данных добавлен метод заполнения обязательных полей фиктивными данными [#93](https://github.com/bia-technologies/yaxunit/pull/93)
### Мокито
* Использование предикатов при указании параметров мокируемого метода [#98](https://github.com/bia-technologies/yaxunit/pull/98)
* Исправлена ошибка неправильного сравнение параметров при проверке вызовов Мокито [#76](https://github.com/bia-technologies/yaxunit/pull/76). Спасибо [@alexandr-yang](https://github.com/alexandr-yang)
* Исправлена ошибка подбора реакции Мокито [#62](https://github.com/bia-technologies/yaxunit/pull/62)
### Утверждения
* Утверждения для проверки таблиц информационной базы [#70](https://github.com/bia-technologies/yaxunit/pull/70)
### Запросы
* Расширение API для работы с запросами [#94](https://github.com/bia-technologies/yaxunit/pull/94)
### Прочее
* Добавлена картинка подсистемы 16*16 [#78](https://github.com/bia-technologies/yaxunit/pull/78). Спасибо [@petypen](https://github.com/petypen)
* Исправлены некоторые ошибки [#85](https://github.com/bia-technologies/yaxunit/pull/85). Спасибо [@potoyalo](https://github.com/potoyalo)
* Добавлена настройки выполнения на уровень модуля [#84](https://github.com/bia-technologies/yaxunit/pull/84)

View File

@ -0,0 +1,35 @@
---
title: YaxUnit. Версия 23.07
authors: alkoleft
tags: [releases, yaxunit]
---
[Release 23.07](https://github.com/bia-technologies/edt-test-runner/releases/tag/23.07)
## Новое в версии
### Тестовые данные
* Faker for YaxUnit (Генерация валидных бизнес), [#88](https://github.com/bia-technologies/yaxunit/issues/88), [#80](https://github.com/bia-technologies/yaxunit/issues/80). Спасибо [@Daabramov](https://github.com/Daabramov)
### Запросы
* Добавлены новые методы модуля ЮТЗапросы, [#122](https://github.com/bia-technologies/yaxunit/pull/122). Спасибо [@potoyalo](https://github.com/potoyalo)
### Прочее
* Переопределение обработчиков событий тестового модуля, [#124](https://github.com/bia-technologies/yaxunit/pull/124). Спасибо [@potoyalo](https://github.com/potoyalo)
* Необязательное значение дополнительного свойства [#106](https://github.com/bia-technologies/yaxunit/pull/106). Спасибо [@alexandr-yang](https://github.com/alexandr-yang)
* В репозиторий добавлена конфигурация для прогона тестов, [#123](https://github.com/bia-technologies/yaxunit/pull/123)
## Исправленные ошибки
### Мокито
* Исправлена ошибка определения предикатов при обучении, [#108](https://github.com/bia-technologies/yaxunit/issues/108). Спасибо [@dlyubanevich](https://github.com/dlyubanevich)
* Исправлена ошибка анализа количества вызовов мокируемого метода, [#118](https://github.com/bia-technologies/yaxunit/pull/118)
* Исправлена ошибка при мокировании метода вызываемого при установке параметров сеанса, [#116](https://github.com/bia-technologies/yaxunit/issues/116)
### Утверждения
* Исправлена ошибка проверки равенства значения соответствия, если ключом соответствия является не строка, [#114](https://github.com/bia-technologies/yaxunit/issues/114). Спасибо [@alexandr-yang](https://github.com/alexandr-yang)

View File

@ -5,3 +5,9 @@ sidebar_position: 1
# Руководство разработчика
Здесь будут собраны материалы по доработке тестового движка.
## Тестирование
Для прогона тестов используется [доработанная демо-конфигурация](https://github.com/bia-technologies/yaxunit/tree/develop/fixtures/demo-configuration) от фирмы [](https://github.com/1C-Company).
Вам необходимо импортировать ее в рабочую область и привязать к ней проект yaxunit, запустить тесты.

View File

@ -1,6 +1,6 @@
---
sidebar_position: 2
tags: [Getting started]
tags: [Начало]
---
# Пишем первый тест

View File

@ -1,6 +1,6 @@
---
sidebar_position: 1
tags: [Getting started]
tags: [Начало]
---
# Установка

View File

@ -1,26 +1,16 @@
---
tags: [Getting started, Asserts]
tags: [Начало, Утверждения]
---
# Утверждения
# Базовые утверждения
Каждый тестовый сценарий должен проверить результат работы тестируемого метода, будь то функция или процедура.
Для написания таких проверок реализован механизм утверждений, позволяющий в лаконичной форме описать свои ожидания, требования к результату.
Утверждения для проверки значений
Доступ к утверждениям обеспечивает метод `ЮТест.ОжидаетЧто`, который возвращает инициализированный модуль `ЮТУтверждения`, реализующий работу с утверждениями.
## Особенности реализации утверждений
* Реализованы по модели [текучих выражений](https://ru.wikipedia.org/wiki/Fluent_interface), с целью повышения удобства и читаемости тестов
```bsl
ЮТест.ОжидаетЧто(Контекст)
.ИмеетТип("Структура")
.Свойство("ПрефиксОшибки").Равно("Контекст метода с параметрами")
.Свойство("ИмяМетода").Заполнено().Равно("МетодБезИсключение")
.Свойство("ПараметрыМетода").ИмеетТип("Массив").ИмеетДлину(1);
```
:::tip
Не рекомендуется обращаться к модулю `ЮТУтверждения` напрямую, используйте `ЮТест.ОжидаетЧто`
:::
* Реализован минимально необходимый набор проверок
* Большая часть методов - это сравнения фактического и ожидаемого результатов, но есть несколько методов настройки
@ -92,6 +82,10 @@ tags: [Getting started, Asserts]
* `ЛюбойЭлементСодержитСвойство` - проверяет, что в коллекции есть элемент содержащий указанное свойство
* `ЛюбойЭлементСодержитСвойствоСоЗначением` - проверяет, что в коллекции есть элемент содержащий указанное свойство, которое равно ожидаемому значению
:::tip
Полный и актуальный набор методов смотрите в описании API
:::
### Проверка методов объекта
Для проверки работы методов объекта есть набор утверждений среди описанных выше (`ВыбрасываетИсключение` и `НеВыбрасываетИсключение`), но для их работы необходимо выполнить предварительные настройки.

View File

@ -0,0 +1,44 @@
---
tags: [Начало, Утверждения, ДанныеИБ]
---
# Утверждения для проверки данных информационной базы
Большая часть тестируемых методов так или иначе оставляет свой след в базе, создает или изменяет записи в ИБ.
Для проверки правильности работы метода нам необходимо проверить, что изменилось в базе. В этом могут помочь утверждения проверяющие записи ИБ.
Доступ к утверждениям обеспечивает метод `ЮТест.ОжидаетЧтоТаблицаБазы`, который возвращает инициализированный модуль `ЮТУтвержденияИБ`, реализующий работу с утверждениями для ИБ.
Утверждения позволяют проверить наличие и отсутствие записей по различным условиям, для задания условий используются [предикаты](../predicates.md)
```bsl
ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары")
.НеСодержитЗаписи(); // В базе нет товаров
ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары")
.СодержитЗаписи(); // В базе есть товары
ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары")
.СодержитЗаписи(ЮТест.Предикат() // В базе есть товары определенного поставщика
.Реквизит("Поставщик").Равно(ДанныеСправочника.Поставщик));
ЮТест.ОжидаетЧтоТаблицаБазы("РегистрСведений.КурсыВалют")
.НеСодержитЗаписи(ЮТест.Предикат() // Курс валюты не установлен
.Реквизит("Валюта").Равно(ДанныеРегистра.Валюта)
.Реквизит("Период").БольшеИлиРавно(ДанныеРегистра.Период));
```
## Доступные методы
* `СодержитЗаписи` - проверяет наличие записей по условиям
* `НеСодержитЗаписи` - проверяет отсутствие записей по условиям
* `СодержитЗаписиСНаименованием` - проверяет наличие в таблице записей с указанным наименованием
* `СодержитЗаписиСКодом` - проверяет наличие в таблице записей с указанным кодом
* `СодержитЗаписиСНомером` - проверяет наличие в таблице записей с указанным номером
* `НеСодержитЗаписиСНаименованием` - проверяет отсутствие в таблице записей с указанным наименованием
* `НеСодержитЗаписиСКодом` - проверяет отсутствие в таблице записей с указанным кодом
* `НеСодержитЗаписиСНомером` - проверяет отсутствие в таблице записей с указанным номером
:::tip
[Предлагайте](https://github.com/bia-technologies/yaxunit/issues) и [добавляйте](https://github.com/bia-technologies/yaxunit/pulls) свои утверждения
:::

View File

@ -0,0 +1,26 @@
---
tags: [Начало, Утверждения]
---
# Утверждения
Каждый тестовый сценарий должен проверить результат работы тестируемого метода, будь то функция или процедура.
Для написания таких проверок реализован механизм утверждений, позволяющий в лаконичной форме описать свои ожидания, требования к результату.
Как и большая часть API, утверждения реализованы по модели [текучих выражений](https://ru.wikipedia.org/wiki/Fluent_interface), с целью повышения удобства и читаемости тестов
```bsl
ЮТест.ОжидаетЧто(Контекст)
.ИмеетТип("Структура")
.Свойство("ПрефиксОшибки").Равно("Контекст метода с параметрами")
.Свойство("ИмяМетода").Заполнено().Равно("МетодБезИсключение")
.Свойство("ПараметрыМетода").ИмеетТип("Массив").ИмеетДлину(1);
```
YaxUnit содержит утверждения для:
* Проверки [значений](assertions-base.md#доступные-методы)
* Проверки [методов объекта на выброс исключений](assertions-base.md#проверка-методов-объекта)
* Проверки [данных информационной базы](assertions-db.md)

View File

@ -1,27 +1,33 @@
---
tags: [Getting started]
tags: [Начало, Контекст]
---
# Контекст
## Механизм контекстов
Одним из важнейших блоков работы тестового движка является механизм контекстов.
Он позволяет:
1. хранить промежуточные данные и обеспечивать работу механизма текучих выражений
2. передавать между тестами необходимые данные
3. удалять тестовые данные (пока только временные файлы)
1. Хранить промежуточные данные и обеспечивать работу механизма текучих выражений.
2. Передавать между тестами необходимые данные.
3. Удалять тестовые данные.
И имеет несколько ограничений:
1. Не синхронизируется между клиентом и сервером
2. Тестовые контексты имеют ограниченное время жизни, например, контекст теста "живет" только в рамках теста и событиях "ПередКаждымТестом", "ПослеКаждогоТеста".
1. Не синхронизируется между клиентом и сервером.
2. Тестовые контексты имеют ограниченное время жизни. Например, контекст теста "живет" только в рамках теста и событиях "ПередКаждымТестом", "ПослеКаждогоТеста".
Для различных механизмов движка существуют различные контексты, такие как контекст утверждений, контекст теста и тд.
## Контексты тестового модуля
Разработчику тестов будут интересны следующие контексты:
* Контекст теста (`ЮТест.КонтекстТеста`) - живет в рамках одного теста, также доступен в обработчиках событий `ПередКаждымТестом` и `ПослеКаждогоТеста`
* Контекст теста (`ЮТест.КонтекстТеста`) - живет в рамках одного теста. Доступен в каждом тесте и в обработчиках событий
* `ПередКаждымТестом`
* `ПослеКаждогоТеста`
* Контекст тестового набора (`ЮТест.КонтекстТестовогоНабора`) - живет в рамках набора тестов. Доступен в каждом тесте набора и в обработчиках событий
* `ПередТестовымНабором`
* `ПослеТестовогоНабора`
@ -34,3 +40,13 @@ tags: [Getting started]
* `ПослеТестовогоНабора`
* `ПередКаждымТестом`
* `ПослеКаждогоТеста`
На каждом уровне исполнения есть возможность переопределить обработчики событий соответствующего контекста исполнения при помощи методов `Перед()` и `После()`. Настроенный обработчик события будет вызван _вместо_ основного. Пример:
```bsl
ЮТТесты
.ДобавитьТестовыйНабор("Набор1") // Будет вызван основной обработчик ПередТестовымНабором()
.ДобавитьТест("Тест1")
.ДобавитьТестовыйНабор("Набор2").Перед("Перед_Набор2") // Будет вызван обработчик Перед_Набор2()
.ДобавитьТест("Тест2");
```

View File

@ -1,18 +1,27 @@
---
description: Create a doc page with rich content.
tags: [Getting started]
tags: [Начало]
---
# Пользовательский API
Для разработчиков тестов расширение предоставляет API для:
Для разработчиков тестов расширение предоставляет API:
* [Регистрации тестовых сценариев](test-registration.md)
* Формирования [утверждений](assertions.md) для проверки результата работы различных механизмов системы.
* Создания [тестовых данных](test-data.md)
* Передачи данных между тестами используя [контекст](context.md)
* Формирования [утверждений](assertions/assertions.md) для проверки результата работы различных механизмов системы.
* Создания [тестовых данных](test-data/test-data.md)
* Сохранения состояния и обмена данными между тестами используя [контекст](context.md)
* [Подмены](mockito.md) алгоритмов работы системы
* [Предикаты](predicates.md), которые используются во многих механизмах движка
* [Получения данных](queries.md) информационной базы
* [Интерфейс](yaxunit-ui.md) для просмотра отчета и настройки параметров запуска тестов
* [Предикаты](predicates.md) для проверки коллекций
Доступ к API осуществляется через методы модуля `ЮТест`, например
* `ЮТест.Данные()` для доступа к методам работы с тестовыми данными
* `ЮТест.ОжидаетЧто()` для доступа к утверждения
Планируется расширять существующий API и реализовать нужный недостающий функционал.
:::tip
Не рекомендуется обращаться к модулям API напрямую, используйте `ЮТест`
:::

View File

@ -1,6 +1,7 @@
---
tags: [Getting started, Mock]
tags: [Начало, Мокирование]
---
# Мокито
Мокито - модуль созданный по образу популярного java-фреймворка для тестирования [Mockito](https://site.mockito.org/). Расширяет возможности тестирования, позволяет легко менять логику работы системы подменяя результаты работы методов, отключая какие-либо алгоритмы и проверки.
@ -136,7 +137,6 @@ flowchart LR
Условия можно задать на равенство определенному значению, на проверку типа переданного значения или же безусловно принимать любый параметры
Существует 2 основных подхода к формированию условий вызова:
1. Явный вызов метода с параметрами: `Обучение(РаботаСHTTP).Когда(РаботаСHTTP.ОтправитьОбъектНаСервер(ИсточникДанных, Данные)).Вернуть(2)`
@ -236,6 +236,24 @@ flowchart LR
* `Больше` - количество вызовов попавших под условия больше указанного значения
* `Меньше` - количество вызовов попавших под условия меньше указанного значения
### Ограничения параметров
При обучении (а также при проверке) не редко мы не может указать конкретные значения, которые придут в метод. для этих целей имеются.
* Маски параметров
* `ЛюбойПараметр` - ожидаем любой параметр
* `ЧисловойПараметр` - ожидаем только числовой параметр
* `СтроковыйПараметр` - ожидаем только строковый параметр
* `ТипизированныйПараметр` - ожидаем параметр указанного типа
* [Предикаты](predicates.md) позволяющие сформировать почти любые условия на параметры
Примеры
* `Когда(Метод(1, 2))`
* `Когда(Метод(Мокито.ЧисловойПараметр(), 2))`
* `Когда(Метод(ЮТест.Предикат().Больше(0), 2))`
## Кейсы использования\*
\* *В примерах опускается часть добавления метода в расширение*

View File

@ -1,24 +1,59 @@
---
tags: [Начало, Предикаты, Утверждения, Запросы, Мокирование]
---
# Предикаты
Механизм предикатов позволяет:
* Формировать наборы утверждений и передавать в методы проверки
* Методы для формирования предикатов имеют такой же синтаксис как и утверждения для тестов (`ЮТест.ОжидаетЧто()`)
* Проверять элементы коллекций на соответствие утверждениям
Например
Предикаты это утверждения, которые вы можете передавать в качестве параметров.
Они расширяют и унифицируют функциональность тестового движка.
```bsl
ЮТест.ОжидаетЧто(Коллекция)
.ЛюбойЭлементСоответствуетПредикату(Ютест.Предикат()
.Реквизит("Число").Равно(2)); // Проверят, что в коллекции есть элементы с реквизитом `Число`, которое равно `2`
ЮТест.ОжидаетЧто(Коллекция)
.КаждыйЭлементСоответствуетПредикату(Ютест.Предикат()
.Заполнено().ИмеетТип("Массив")); // Проверят, что каждый элемент коллекции это заполненный массив
Процедура АктуализацияУведомлений() Экспорт
ИмяРегистра = "РегистрСведений.ОповещенияПользователя";
Объект = ТестовыеДанные.Объект();
УсловиеУведомления = ЮТест.Предикат()
.Реквизит("Источник").Равно(Объект)
.Реквизит("ТипОповещения").Равно(Справочники.ТипыОповещенийПользователя.Уведомление1)
.Получить();
ЮТест.ОжидаетЧтоТаблицаБазы(ИмяРегистра)
.НеСодержитЗаписи(УсловиеУведомления);
УведомленияВызовСервера.АктуализацияУведомлений();
ЮТест.ОжидаетЧтоТаблицаБазы(ИмяРегистра)
.СодержитЗаписи(УсловиеУведомления);
ДанныеУведомления = ЮТЗапросы.Запись(ИмяРегистра, УсловиеУведомления);
ЮТест.ОжидаетЧто(ДанныеУведомления)
.Свойство("Прочитано").ЭтоЛожь()
.Свойство("Пользователь").Равно(Справочники.ГруппыОповещенийПользователей.Инженер);
КонецПроцедуры
```
## Планы развития
Механизм предикатов:
* позволяет формировать наборы утверждений и передавать их в качества параметров;
* используется для проверки коллекций, записей базы и так далее;
* построен по модели текучих выражения и имеет схожий с базовыми утверждениями синтаксис (`ЮТест.ОжидаетЧто()`);
## Примеры использования
* Проверка коллекции
```bsl
ЮТест.ОжидаетЧто(Коллекция)
.ЛюбойЭлементСоответствуетПредикату(ЮТест.Предикат()
.Реквизит("Число").Равно(2)); // Проверят, что в коллекции есть элементы с реквизитом `Число`, которое равно `2`
ЮТест.ОжидаетЧто(Коллекция)
.КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат()
.Заполнено().ИмеетТип("Массив")); // Проверят, что каждый элемент коллекции это заполненный массив
```
* Описания параметров метода при мокировании
@ -26,11 +61,11 @@
```bsl
Мокито.Обучение(Модуль)
.Когда(Модуль.Посчитать(Мокито.Предикат()
.Когда(Модуль.Посчитать(ЮТест.Предикат()
.Реквизит("Оператор").Равно("Сложить")))
.ВернутьРезультат(Результат1)
.Когда(Модуль.Посчитать(Мокито.Предикат()
.Когда(Модуль.Посчитать(ЮТест.Предикат()
.Реквизит("Оператор").Равно("Вычесть")))
.ВернутьРезультат(Результат2);
```
@ -45,4 +80,57 @@
);
```
* Перевести обычные утверждения на предикаты
* Получение записей из базы
```bsl
ДанныеТовара = ЮТЗапросы.Запись("Справочник.Товары", ЮТест.Предикат()
.Реквизит("Наименование").Равно("Товар 1")
.Реквизит("Ссылка").НеРавно(Исключение));
```
## Особенности
### Особенности контекста
Предикаты как и большинство механизмов построены на текучих выражениях с сохранением состояния в глобальном контексте.
Это приводит к тому, что вы не можете сразу использовать несколько предикатов, например
```bsl
Мокито.Обучение(Модуль)
.Когда(Модуль.СделатьЧтоТо(
ЮТест.Предикат().ИмеетТип("Строка"),
ЮТест.Предикат().ИмеетТип("Число")))
.ВернутьРезультат(Результат1);
```
В этом примере 1С сначала вычислит выражения для всех параметров, а потом передаст их в метод и мы получим для обоих параметров один и тот же предикат, ожидающий тип `Число`.
Потому что состояние первого предиката будет заменено вторым. Для обхода этой проблемы можно использовать метод `Получить`, который возвращает текущее состояние.
```bsl
Мокито.Обучение(Модуль)
.Когда(Модуль.СделатьЧтоТо(
ЮТест.Предикат().ИмеетТип("Строка").Получить(),
ЮТест.Предикат().ИмеетТип("Число")))
.ВернутьРезультат(Результат1);
```
Такая же история при сохранение предикатов в переменные.
```bsl
ПроверкаСтрока = ЮТест.Предикат().ИмеетТип("Строка");
ПроверкаЧисло = ЮТест.Предикат().ИмеетТип("Число");
```
`ПроверкаСтрока` и `ПроверкаЧисло` будут равны и содержать одинаковые условия. Проблему также можно обойти используя метод `Получить`.
```bsl
ПроверкаСтрока = ЮТест.Предикат().ИмеетТип("Строка").Получить();
ПроверкаЧисло = ЮТест.Предикат().ИмеетТип("Число").Получить();
```
### Особенности реализации
Сам модуль предикатов используется только для формирования утверждений/условий.
Реализацией проверок и формированием условий занимаются другие модули и возможна ситуация, когда некоторые предикаты еще не реализованы или не поддерживаются каким-либо механизмом. Например, проверка заполненности не поддерживается запросами.

View File

@ -0,0 +1,20 @@
---
tags: [Начало, ДанныеИБ]
---
# Запросы
Для получения данных базы предоставлен API выполнения запросов `ЮТЗапросы`
Позволяет как с сервера, так и с клиента получать данные информационной базы и имеет следующие методы
* `ЗначенияРеквизитов` - Возвращает значения реквизитов ссылки
* `ЗначениеРеквизита` - Возвращает значение реквизита ссылки
* `Запись` - Возвращает первую запись таблицы, соответствующую условиям
* `Записи` - Возвращает записи таблицы, соответствующую условиям
* `ЗначенияРеквизитовЗаписи` - Возвращает значения реквизитов первой записи таблицы, соответствующей условиям
* `ЗначениеРеквизитаЗаписи` - Возвращает значение реквизита первой записи таблицы, соответствующей условиям
* `ТаблицаСодержитЗаписи` - Вернет признак, содержит ли таблица записи, удовлетворяющие переданным условиям
* `РезультатЗапроса` - Возвращает результат выполнения простого запроса, используя описание запроса
* `РезультатПустой` - Определяет, есть ли в результате записи, используя описание запроса
* `ОписаниеЗапроса` - Формирует описание простого запроса

View File

@ -0,0 +1,99 @@
---
tags: [Начало, Тестовые данные]
---
# Удаление тестовых данных
При использовании тестовых данных нередко необходимо удалять созданные объекты.
Для этого вы можете использовать
## Автоматические транзакции
Для включения нужно при регистрации теста вызвать метод `ВТранзакции()`
```bsl title=ВТранзакции.bsl
ЮТТесты
.ДобавитьТест("Фикция").ВТранзакции() // Использование транзакции для конкретного теста
ЮТТесты
.ДобавитьТестовыйНабор("Основной).ВТранзакции() // Использование транзакции для набора тестов
.ДобавитьТест("Фикция")
ЮТТесты.ВТранзакции() // Использование транзакции для тестов модуля
.ДобавитьТест("Фикция")
```
И тогда тестовый движок будет оборачивать в транзакцию каждый серверный тест (для клиентских будет игнорироваться)
:::caution Учитывайте
В транзакцию оборачивается тест, а не модуль или набор, поэтому данные созданные вне теста не будут удалены.
Такие данные необходимо удалять самостоятельно при необходимости.
:::
## Механизм удаления тестовых данных
Для включения нужно при регистрации теста вызвать метод `УдалениеТестовыхДанных()`
```bsl title=УдалениеТестовыхДанных.bsl
ЮТТесты
.ДобавитьТест("Фикция").УдалениеТестовыхДанных() // Использование для конкретного теста
ЮТТесты
.ДобавитьТестовыйНабор("Основной).УдалениеТестовыхДанных() // Использование для всех тестов набора
.ДобавитьТест("Фикция")
ЮТТесты.УдалениеТестовыхДанных() // Использование для всех тестов модуля
.ДобавитьТест("Фикция")
ЮТТесты.ВТранзакции().УдалениеТестовыхДанных() // Совместно с транзакцией
.ДобавитьТест("Фикция")
```
Механизм не использует транзакции, а запоминает в контексте все созданные с помощью API объекты и записи регистров сведений.
Позволяет:
* Удалять данные созданные с клиента
* Удалять данные созданные вне теста (в обработчиках событий)
:::caution Удаление и только
Механизм только удаляет созданные объекты, изменения не откатываются
:::
:::tip Разное время жизни данных
Механизм понимает в рамках какого контекста исполнения (тест, набор, модуль) были созданы данные и удаляет их по выходу из него.
:::
Рассмотрим время жизни объектов созданных на разных этапах тестирования, например имеем такой модуль.
```bsl title=УдалениеТестовыхДанныхВремяЖизни.bsl
Процедура ПередВсемиТестами() Экспорт
ДанныеМодуля = ЮТест.Данные().СоздатьЭлемент();
КонецПроцедуры
Процедура ПередТестовымНабором() Экспорт
ДанныеНабора = ЮТест.Данные().СоздатьЭлемент();
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
ДанныеТеста = ЮТест.Данные().СоздатьЭлемент();
КонецПроцедуры
Процедура Тест() Экспорт
Ссылка = ЮТест.Данные().СоздатьЭлемент();
КонецПроцедуры
```
Для переменных получим разное время жизни
* `ДанныеМодуля` - Живет, пока исполняются тесты модуля одного контекста (Сервер, Клиент).
* `ДанныеНабора` - Живет, пока исполняются тесты набора.
* `ДанныеТеста` и `Ссылка` - Живут, пока исполняется тест.
:::caution Механизм имеет ряд ограничений и не работает для следующих кейсов:
* Данные создан не через API
* Данные созданы в клиентском модуле через вызов своего серверного модуля, даже если он использует API тестового движка
:::

View File

@ -1,5 +1,5 @@
---
tags: [Getting started, Test data]
tags: [Начало, Тестовые данные]
---
# Тестовые данные
@ -22,12 +22,17 @@ tags: [Getting started, Test data]
Если грамотно распределить тестовые данные на способы создания, мы можем добиться оптимального результата.
Например, можно статичные данные создать вручную, сложные кейсы данных засунуть в макеты, а для программного создания реализовать методы-конструкторы, которые будем переиспользовать. Таким образом, сможем уйти от минусов данного подхода или минимизировать их вред.
В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные`.
В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные()`.
Сейчас это минимальный набор методов, который в дальнейшем будет развиваться. Он позволяет:
:::tip
Не рекомендуется обращаться к модулю `ЮТТестовыеДанные` напрямую, используйте `ЮТест.Данные()`
:::
Он позволяет:
* Создавать данные информационной базы
* Генерировать случайные значения
* Автоматически удалять созданные данные (для этого необходимо включить настройку теста `УдалениеТестовыхДанных()`)
* Работать с файлами
* Использовать таблицы markdown в качестве макетов данных
@ -46,7 +51,7 @@ tags: [Getting started, Test data]
.Фикция("Поставщик")
.Фикция("Склад")
.Фикция("Валюта")
.Фикция("Организация")
.Установить("Организация", ЮТест.Данные().КонструкторОбъекта("Справочники.Организации").Установить("КакойТоТамУчет", Истина))
.ТабличнаяЧасть("Товары");
Для Инд1 = 1 По ЮТест.Данные().СлучайноеЧисло(1, 5) Цикл

View File

@ -1,6 +1,7 @@
---
tags: [Getting started]
tags: [Начало]
---
# Регистрация тестовых методов (ЮТТесты)
Кроме того, чтобы написать тестовые сценарии, разработчик должен зарегистрировать их в движке.

View File

@ -13,7 +13,7 @@ slug: /
[![Quality Gate](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=alert_status)](https://sonar.openbsl.ru/dashboard?id=yaxunit)
[![Maintainability](https://sonar.openbsl.ru/api/project_badges/measure?project=yaxunit&metric=sqale_rating)](https://sonar.openbsl.ru/dashboard?id=yaxunit)
Обсудить в [телеграмм чате](https://t.me/BIAOpenTools/12)
Обсудить в [Telegram чате](https://t.me/BIAOpenTools/12)
----

View File

@ -1,3 +1,3 @@
addModuleStrictTypesAnnotation=true
addModuleStrictTypesAnnotation=false
createModuleStructure=true
eclipse.preferences.version=1

View File

@ -18,39 +18,6 @@
#Область СлужебныйПрограммныйИнтерфейс
Процедура ИсполняемыеСценарии() Экспорт
ЮТТесты
.ДобавитьТест("ТестовыйМетод")
.ДобавитьТест("ТестовыйМетод").СПараметрами(1, 2, 3);
;
КонецПроцедуры
#Область События
Процедура ПередВсемиТестами() Экспорт
КонецПроцедуры
Процедура ПередКаждымТестом() Экспорт
КонецПроцедуры
Процедура ПослеКаждогоТеста() Экспорт
КонецПроцедуры
Процедура ПослеВсехТестов() Экспорт
КонецПроцедуры
#КонецОбласти
Процедура ТестовыйМетод() Экспорт
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -51,15 +51,18 @@
//
// Параметры:
// Объект - Произвольный - Объект, методы которого хотим подменить.
//
// СброситьСтарыеНастройки - Булево - Необходимо удалить старые настройки по объекту.
// + `Истина` - все предыдущие настройки мокирования объекта будут забыты.
// + `Ложь` - будет выполнено дообучение объекта.
//
// Возвращаемое значение:
// ОбщийМодуль - см. МокитоОбучение
Функция Обучение(Объект) Экспорт
Функция Обучение(Объект, СброситьСтарыеНастройки = Истина) Экспорт
Режимы = МокитоСлужебный.РежимыРаботы();
МокитоСлужебный.УстановитьРежим(Режимы.Обучение);
Возврат МокитоОбучение.Обучение(Объект);
Возврат МокитоОбучение.Обучение(Объект, СброситьСтарыеНастройки);
КонецФункции
@ -148,7 +151,6 @@
//
// Возвращаемое значение:
// Структура - Описание маски параметра:
// * МаскаСопоставленияПараметров - Булево - Признак, что это маска параметра (значение: `Истина`)
// * Режим - Строка - Тип маски (значение: `Тип`)
// * Приоритет - Число - Приоритет маски, используется если значение подпадает под несколько масок (значение: `10`)
// * Тип - Тип - Тип, которому должен соответствовать параметр
@ -220,7 +222,6 @@
// Произвольный - Подменный результат работы метода
Функция АнализВызова(Объект, ИмяМетода, ПараметрыМетода, ПрерватьВыполнение) Экспорт
ЮТОбщий.ВызовУстаревшегоМетода("Мокито.АнализВызова", "МокитоСлужебный.АнализВызова");
Возврат МокитоСлужебный.АнализВызова(Объект, ИмяМетода, ПараметрыМетода, ПрерватьВыполнение);
КонецФункции

View File

@ -27,12 +27,16 @@
//
// Параметры:
// Объект - Произвольный - Обучаемый объект, с методами которого хотим работать.
// СброситьСтарыеНастройки - Булево - Необходимо удалить старые настройки по объекту.
// + `Истина` - все предыдущие настройки мокирования объекта будут забыты.
// + `Ложь` - будет выполнено дообучение объекта.
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
Функция Обучение(Объект) Экспорт
Функция Обучение(Объект, СброситьСтарыеНастройки = Истина) Экспорт
УстановитьПараметрыОбучения(Объект);
МокитоСлужебный.ЗарегистрироватьПерехватОбъекта(Объект, СброситьСтарыеНастройки);
Возврат МокитоОбучение;
@ -198,35 +202,8 @@
Функция СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода)
Возврат Новый Структура("УсловиеРеакции, Действие", УсловиеРеакции(СтруктураВызоваМетода), Неопределено);
КонецФункции
Функция УсловиеРеакции(СтруктураВызоваМетода)
Параметры = СтруктураВызоваМетода.Параметры;
Если Параметры = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Условия = Новый Массив;
Для Каждого Параметр Из Параметры Цикл
Если МокитоСлужебный.ЭтоМаскаПарамера(Параметр) Тогда
Условия.Добавить(Параметр);
Иначе
Условия.Добавить(Новый Структура("Режим, Значение, Приоритет", "Значение", Параметр, 100));
КонецЕсли;
КонецЦикла;
Возврат Условия;
Условия = МокитоСлужебный.УсловиеИзПараметров(СтруктураВызоваМетода.Параметры);
Возврат Новый Структура("УсловиеРеакции, Действие", Условия, Неопределено);
КонецФункции
@ -255,7 +232,6 @@
ПараметрыОбучения = Новый Структура("ОбучаемыйОбъект, РеакцияТекущегоВыражения", Объект, Неопределено);
МокитоСлужебный.Настройки().ПараметрыОбучения = ПараметрыОбучения;
МокитоСлужебный.ЗарегистрироватьПерехватОбъекта(Объект);
КонецПроцедуры

View File

@ -197,6 +197,7 @@
Если ЗначениеЗаполнено(СтруктураВызоваМетода.Параметры) Тогда
УсловияПроверки = МокитоСлужебный.УсловиеИзПараметров(СтруктураВызоваМетода.Параметры);
Результат = Новый Массив();
Для Каждого ВызовМетода Из ВызовыМетода Цикл
@ -205,19 +206,15 @@
ВызватьИсключение "Сигнатура метода содержит меньше параметров";
КонецЕсли;
КоличествоПараметров = СтруктураВызоваМетода.Параметры.Количество();
КоличествоУсловий = УсловияПроверки.Количество();
Успешно = Истина;
Для Инд = 0 По КоличествоПараметров - 1 Цикл
Для Инд = 0 По КоличествоУсловий - 1 Цикл
Параметр = ВызовМетода.Параметры[Инд];
Условие = СтруктураВызоваМетода.Параметры[Инд];
Условие = УсловияПроверки[Инд];
Если МокитоСлужебный.ЭтоМаскаПарамера(Условие) Тогда
Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие);
Иначе
Успешно = Параметр = Условие;
КонецЕсли;
Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие);
Если НЕ Успешно Тогда
Прервать;
@ -258,7 +255,8 @@
Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда
СтруктураВызоваМетода = ИмяМетода;
Иначе
СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, ПараметрыВызова);
Условия = МокитоСлужебный.УсловиеИзПараметров(ПараметрыВызова);
СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Параметры.ПроверяемыйОбъект, ИмяМетода, Условия);
КонецЕсли;
Если СтруктураВызоваМетода.Объект <> Параметры.ПроверяемыйОбъект Тогда

View File

@ -159,6 +159,7 @@
Типы.Вставить("Значение", "Значение");
Типы.Вставить("Тип", "Тип");
Типы.Вставить("ОписаниеТипа", "ОписаниеТипа");
Типы.Вставить("Предикат", "Предикат");
Возврат Новый ФиксированнаяСтруктура(Типы);
@ -172,12 +173,13 @@
//
// Возвращаемое значение:
// Структура - Описание маски параметра:
// * МаскаСопоставленияПараметров - Булево - Признак, что это маска параметра
// * Режим - Строка - см. ТипыУсловийПараметров
// * Приоритет - Число - Приоритет маски, используется если значение подпадает под несколько масок, чем выше приоритет, тем лучше
Функция ОписаниеМаскиПараметра(ТипУсловия, Приоритет) Экспорт
МаскаПараметра = Новый Структура("МаскаСопоставленияПараметров", Истина);
МаскаПараметра = Новый Структура;
ЮТОбщий.УказатьТипСтруктуры(МаскаПараметра, "МаскаПараметра");
МаскаПараметра.Вставить("Режим", ТипУсловия);
МаскаПараметра.Вставить("Приоритет", Приоритет);
@ -187,7 +189,7 @@
Функция ЭтоМаскаПарамера(Параметр) Экспорт
Возврат ТипЗнч(Параметр) = Тип("Структура") И Параметр.Свойство("МаскаСопоставленияПараметров") И Параметр.МаскаСопоставленияПараметров;
Возврат ТипЗнч(Параметр) = Тип("Структура") И ЮТОбщий.ТипСтруктуры(Параметр) = "МаскаПараметра";
КонецФункции
@ -212,6 +214,11 @@
Совпадает = Условие.Тип.СодержитТип(ТипЗнч(Параметр));
ИначеЕсли Условие.Режим = ТипыУсловий.Предикат Тогда
Результат = ЮТПредикатыКлиентСервер.ПроверитьПредикаты(Параметр, Условие.Предикат);
Совпадает = Результат.Успешно;
КонецЕсли;
Возврат Совпадает;
@ -265,14 +272,17 @@
КонецФункции
Процедура ЗарегистрироватьПерехватОбъекта(Знач Объект) Экспорт
Процедура ЗарегистрироватьПерехватОбъекта(Знач Объект, СброситьСтарыеНастройки = Истина) Экспорт
Если ЭтоОбъект(Объект) Тогда
Объект = Объект.Ссылка;
КонецЕсли;
ПараметрыПерехвата = ПараметрыПерехвата();
ПараметрыПерехвата.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект));
Если СброситьСтарыеНастройки ИЛИ ПараметрыПерехвата[Объект] = Неопределено Тогда
ПараметрыПерехвата.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект));
КонецЕсли;
КонецПроцедуры
@ -420,6 +430,11 @@
Для Каждого Реакция Из ПараметрыПерехватаМетода.Реакции Цикл
ПриоритетРеакции = ПроверитьРеакцию(Реакция, ПараметрыВызова);
Если ПриоритетРеакции < 0 Тогда
Продолжить;
КонецЕсли;
ПриоритетыРеакций.Добавить(Новый Структура("Приоритет, Реакция", ПриоритетРеакции, Реакция));
Если ЛучшийПриоритет < ПриоритетРеакции Тогда
@ -428,7 +443,12 @@
КонецЦикла;
Если ЛучшийПриоритет <= 0 Тогда
Возврат Неопределено;
КонецЕсли;
Реакция = Неопределено;
Для Каждого ПриоритетРеакции Из ПриоритетыРеакций Цикл
Если ПриоритетРеакции.Приоритет = ЛучшийПриоритет Тогда
@ -459,7 +479,7 @@
Если НЕ ПроверитьПараметр(ПараметрыМетода[Инд], Реакция.УсловиеРеакции[Инд]) Тогда
Возврат 0;
Возврат -1;
КонецЕсли;
@ -552,4 +572,40 @@
КонецФункции
Функция УсловиеИзПараметров(Параметры) Экспорт
Если Параметры = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
Условия = Новый Массив;
ТипыУсловий = ТипыУсловийПараметров();
Для Каждого Параметр Из Параметры Цикл
Если ЭтоМаскаПарамера(Параметр) Тогда
Условия.Добавить(Параметр);
ИначеЕсли ЮТПредикатыКлиентСервер.ЭтоПредикат(Параметр) Тогда
Маска = ОписаниеМаскиПараметра(ТипыУсловий.Предикат, 90);
Маска.Вставить("Предикат", ЮТПредикатыКлиентСервер.НаборПредикатов(Параметр));
Условия.Добавить(Маска);
Иначе
Маска = ОписаниеМаскиПараметра(ТипыУсловий.Значение, 100);
Маска.Вставить("Значение", Параметр);
Условия.Добавить(Маска);
КонецЕсли;
КонецЦикла;
Возврат Условия;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,201 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
///////////////////////////////////////////////////////////////////
// Расширяет возможности тестирования,
// позволяет в упрощенной форме получать данны из информационной базы
// как с сервера так и с клиента.
///////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// Возвращает значения реквизитов ссылки
//
// Параметры:
// Ссылка - ЛюбаяСсылка
// ИменаРеквизитов - Строка - Имена получаемых реквизитов, разделенные запятой.
// Важно, нельзя указывать реквизиты через точку.
//
// Возвращаемое значение:
// Структура Из Произвольный - Значения реквизитов ссылки
Функция ЗначенияРеквизитов(Ссылка, ИменаРеквизитов) Экспорт
//@skip-check constructor-function-return-section
Возврат ЮТЗапросыВызовСервера.ЗначенияРеквизитов(Ссылка, ИменаРеквизитов, Ложь);
КонецФункции
// Возвращает значение реквизита ссылки
//
// Параметры:
// Ссылка - ЛюбаяСсылка
// ИмяРеквизита - Строка - Имя получаемого реквизита, можно указать путь к вложенному реквизиту через точку
//
// Возвращаемое значение:
// Произвольный - Значение реквизита ссылки
Функция ЗначениеРеквизита(Ссылка, ИмяРеквизита) Экспорт
Возврат ЮТЗапросыВызовСервера.ЗначенияРеквизитов(Ссылка, ИмяРеквизита, Истина);
КонецФункции
// Возвращает первую запись таблицы соответствующую условиям
//
// Параметры:
// ИмяТаблицы - Строка - Имя таблицы базы
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Структура, Неопределено - Содержит все данные записи, включая табличный части
Функция Запись(ИмяТаблицы, Предикат) Экспорт
ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Предикат, "*");
//@skip-check constructor-function-return-section
Возврат ЮТЗапросыВызовСервера.Записи(ОписаниеЗапроса, Истина);
КонецФункции
// Возвращает записи таблицы соответствующую условиям
//
// Параметры:
// ИмяТаблицы - Строка - Имя таблицы базы
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Массив из Структура - Найденные записи, включая табличный части
Функция Записи(ИмяТаблицы, Предикат) Экспорт
ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Предикат, "*");
Возврат ЮТЗапросыВызовСервера.Записи(ОписаниеЗапроса, Ложь);
КонецФункции
// Возвращает значения реквизитов первой записи таблицы, соответствующей условиям
//
// Параметры:
// ИмяТаблицы - Строка
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// ИменаРеквизитов - Строка - Имена получаемых реквизитов
//
// Возвращаемое значение:
// Произвольный - Значение реквизита записи
//
Функция ЗначенияРеквизитовЗаписи(ИмяТаблицы, Предикат, ИменаРеквизитов) Экспорт
ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Предикат, ИменаРеквизитов);
Возврат ЮТЗапросыВызовСервера.ЗначенияРеквизитовЗаписи(ОписаниеЗапроса, Ложь);
КонецФункции
// Возвращает значение реквизита первой записи таблицы, соответствующей условиям
//
// Параметры:
// ИмяТаблицы - Строка
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// ИмяРеквизита - Строка - Имя получаемого реквизита
//
// Возвращаемое значение:
// Структура Из Произвольный - Значения реквизитов записи
//
Функция ЗначениеРеквизитаЗаписи(ИмяТаблицы, Предикат, ИмяРеквизита) Экспорт
ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Предикат, ИмяРеквизита);
//@skip-check constructor-function-return-section
Возврат ЮТЗапросыВызовСервера.ЗначенияРеквизитовЗаписи(ОписаниеЗапроса, Истина);
КонецФункции
// Вернет признак содержит ли таблица записи удовлетворяющие переданным условиям
//
// Параметры:
// ИмяТаблицы - Строка - Имя таблицы базы
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Булево - Таблица содержит записи
Функция ТаблицаСодержитЗаписи(ИмяТаблицы, Предикат = Неопределено) Экспорт
ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяТаблицы, Предикат);
Возврат НЕ РезультатПустой(ОписаниеЗапроса);
КонецФункции
// Возвращает результат выполнения простого запроса.
//
// Параметры:
// ОписаниеЗапроса - см. ОписаниеЗапроса
//
// Возвращаемое значение:
// - ТаблицаЗначений - Результат запроса для сервера
// - Массив из Структура - Результат запроса для клиента
Функция РезультатЗапроса(ОписаниеЗапроса) Экспорт
#Если Клиент Тогда
Возврат ЮТЗапросыВызовСервера.РезультатЗапроса(ОписаниеЗапроса, Истина);
#Иначе
Возврат ЮТЗапросыВызовСервера.РезультатЗапроса(ОписаниеЗапроса, Ложь);
#КонецЕсли
КонецФункции
// Определяет, есть ли в результате записи
//
// Параметры:
// ОписаниеЗапроса - см. ОписаниеЗапроса
//
// Возвращаемое значение:
// Булево - Результат пустой
Функция РезультатПустой(ОписаниеЗапроса) Экспорт
Возврат ЮТЗапросыВызовСервера.РезультатПустой(ОписаниеЗапроса);
КонецФункции
// Описание простого запроса
//
// Возвращаемое значение:
// Структура - Описание запроса:
// * ИмяТаблицы - Строка -
// * ВыбираемыеПоля - Массив из Строка
// * КоличествоЗаписей - Число, Неопределено - Ограничение количества выбираемых записей
// * Условия - Массив из Строка - Коллекция выражений условий, которые будут объединены через `И`
// * ЗначенияПараметров - Структура - Набор параметров запроса
Функция ОписаниеЗапроса() Экспорт
Описание = Новый Структура();
Описание.Вставить("ИмяТаблицы", "");
Описание.Вставить("ВыбираемыеПоля", Новый Массив);
Описание.Вставить("КоличествоЗаписей", Неопределено);
Описание.Вставить("Условия", Новый Массив());
Описание.Вставить("ЗначенияПараметров", Новый Структура());
//@skip-check constructor-function-return-section
Возврат Описание;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c8a4bf65-9736-47f1-a39c-12536b8207a6">
<name>ЮТЗапросы</name>
<synonym>
<key>ru</key>
<value>Запросы</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,267 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Функция РезультатЗапроса(ОписаниеЗапроса, ДляКлиента) Экспорт
Запрос = Запрос(ОписаниеЗапроса);
РезультатЗапроса = Запрос.Выполнить();
Возврат ВыгрузитьРезультатЗапроса(РезультатЗапроса, ДляКлиента);
КонецФункции
// Результат пустой.
//
// Параметры:
// ОписаниеЗапроса - см. ЮТЗапросы.ОписаниеЗапроса
//
// Возвращаемое значение:
// Булево - Результат пустой
Функция РезультатПустой(Знач ОписаниеЗапроса) Экспорт
Запрос = Запрос(ОписаниеЗапроса);
РезультатЗапроса = Запрос.Выполнить();
Возврат РезультатЗапроса.Пустой();
КонецФункции
// Возвращает значения реквизитов ссылки
//
// Параметры:
// Ссылка - ЛюбаяСсылка
// ИменаРеквизитов - Строка
// ОдинРеквизит - Булево
//
// Возвращаемое значение:
// - Структура Из Произвольный - Значения реквизитов ссылки при получении значений множества реквизитов
// - Произвольный - Значение реквизита ссылки при получении значения одного реквизита
Функция ЗначенияРеквизитов(Ссылка, ИменаРеквизитов, ОдинРеквизит) Экспорт
ИмяТаблицы = Ссылка.Метаданные().ПолноеИмя();
ТекстЗапроса = СтрШаблон("ВЫБРАТЬ ПЕРВЫЕ 1 %1 ИЗ %2 ГДЕ Ссылка = &Ссылка", ИменаРеквизитов, ИмяТаблицы);
Запрос = Новый Запрос(ТекстЗапроса);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Если ОдинРеквизит Тогда
Возврат ЗначениеИзЗапроса(Запрос, 0);
Иначе
Возврат ЗначенияИзЗапроса(Запрос, ИменаРеквизитов);
КонецЕсли;
КонецФункции
// Возвращяет записи результат запроса
//
// Параметры:
// ОписаниеЗапроса - см. ЮТЗапросы.ОписаниеЗапроса
// ОднаЗапись - Булево - Вернуть первую запись
//
// Возвращаемое значение:
// Массив из Структура, Структура, Неопределено - Записи
Функция Записи(ОписаниеЗапроса, ОднаЗапись) Экспорт
Если ОднаЗапись Тогда
ОписаниеЗапроса.КоличествоЗаписей = 1;
КонецЕсли;
Запрос = Запрос(ОписаниеЗапроса);
РезультатЗапроса = Запрос.Выполнить();
Записи = ВыгрузитьРезультатЗапроса(РезультатЗапроса, Истина);
Если НЕ ОднаЗапись Тогда
Возврат Записи;
ИначеЕсли Записи.Количество() Тогда
Возврат Записи[0];
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
// Возвращает значения реквизитов записи
//
// Параметры:
// ОписаниеЗапроса - см. ЮТЗапросы.ОписаниеЗапроса
// ОдинРеквизит - Булево
//
// Возвращаемое значение:
// - Структура Из Произвольный - Значения множества реквизитов записи
// - Произвольный - Значение одного реквизита записи
//
Функция ЗначенияРеквизитовЗаписи(ОписаниеЗапроса, ОдинРеквизит) Экспорт
Запись = Записи(ОписаниеЗапроса, Истина);
Если ТипЗнч(Запись) <> Тип("Структура") Тогда
Если ОдинРеквизит Тогда
Возврат Неопределено;
Иначе
Реквизиты = СтрСоединить(ПсеводнимыВыбираемыхПолей(ОписаниеЗапроса), ",");
Возврат Новый Структура(Реквизиты);
КонецЕсли;
КонецЕсли;
Если ОдинРеквизит Тогда
Для каждого КлючЗнач Из Запись Цикл
Возврат КлючЗнач.Значение;
КонецЦикла;
Иначе
Возврат Запись;
КонецЕсли;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Запрос.
//
// Параметры:
// ОписаниеЗапроса - см. ЮТЗапросы.ОписаниеЗапроса
//
// Возвращаемое значение:
// Запрос
Функция Запрос(ОписаниеЗапроса)
Строки = Новый Массив();
Строки.Добавить("ВЫБРАТЬ ");
Если ОписаниеЗапроса.КоличествоЗаписей <> Неопределено Тогда
Строки.Добавить("ПЕРВЫЕ " + ЮТОбщий.ЧислоВСтроку(ОписаниеЗапроса.КоличествоЗаписей));
КонецЕсли;
Если ОписаниеЗапроса.ВыбираемыеПоля.Количество() Тогда
ВыбираемыеПоля = ОписаниеЗапроса.ВыбираемыеПоля;
Иначе
ВыбираемыеПоля = ЮТОбщий.ЗначениеВМассиве("1 КАК Поле");
КонецЕсли;
Строки.Добавить(СтрСоединить(ВыбираемыеПоля, "," + Символы.ПС));
Строки.Добавить("ИЗ " + ОписаниеЗапроса.ИмяТаблицы);
Если ОписаниеЗапроса.Условия.Количество() Тогда
Строки.Добавить("ГДЕ (");
Строки.Добавить(СтрСоединить(ОписаниеЗапроса.Условия, ") И (" + Символы.ПС));
Строки.Добавить(")");
КонецЕсли;
Запрос = Новый Запрос(СтрСоединить(Строки, Символы.ПС));
ЮТОбщий.ОбъединитьВСтруктуру(Запрос.Параметры, ОписаниеЗапроса.ЗначенияПараметров);
Возврат Запрос;
КонецФункции
Функция ЗначенияИзЗапроса(Запрос, Реквизиты)
Результат = Новый Структура(Реквизиты);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ЗаполнитьЗначенияСвойств(Результат, Выборка);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЗначениеИзЗапроса(Запрос, Реквизит)
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Возврат Выборка[Реквизит];
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция ВыгрузитьРезультатЗапроса(РезультатЗапроса, ВМассив)
Если НЕ ВМассив Тогда
Возврат РезультатЗапроса.Выгрузить();
Иначе
Результат = Новый Массив();
КонецЕсли;
Если РезультатЗапроса.Пустой() Тогда
Возврат Результат;
КонецЕсли;
Реквизиты = Новый Массив();
ТабличныеЧасти = Новый Массив();
ТипРезультатЗапроса = Тип("РезультатЗапроса");
Для Каждого Колонка Из РезультатЗапроса.Колонки Цикл
Реквизиты.Добавить(Колонка.Имя);
Если Колонка.ТипЗначения.СодержитТип(ТипРезультатЗапроса) Тогда
ТабличныеЧасти.Добавить(Колонка.Имя);
КонецЕсли;
КонецЦикла;
ПараметрыКонструктора = СтрСоединить(Реквизиты, ",");
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Запись = Новый Структура(ПараметрыКонструктора);
ЗаполнитьЗначенияСвойств(Запись, Выборка);
Для Каждого ТабличнаяЧасть Из ТабличныеЧасти Цикл
Запись[ТабличнаяЧасть] = ВыгрузитьРезультатЗапроса(Выборка[ТабличнаяЧасть], ВМассив);
КонецЦикла;
Результат.Добавить(Запись);
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ПсеводнимыВыбираемыхПолей(ОписаниеЗапроса)
Псевдонимы = Новый Массив;
Запрос = Запрос(ОписаниеЗапроса);
СхемаЗапроса = Новый СхемаЗапроса();
СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
Для каждого ЗапросСЗ Из СхемаЗапроса.ПакетЗапросов Цикл
Для каждого КолонкаСЗ Из ЗапросСЗ.Колонки Цикл
Псевдонимы.Добавить(КолонкаСЗ.Псевдоним);
КонецЦикла;
КонецЦикла;
Возврат Псевдонимы;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="9115c1c4-e348-46da-820d-e61915f18fde">
<name>ЮТЗапросыВызовСервера</name>
<synonym>
<key>ru</key>
<value>Запросы вызов сервера</value>
</synonym>
<server>true</server>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,128 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Функция ОписаниеЗапроса(ИмяТаблицы, ПредикатыУсловия, ВыбираемыеПоля = Неопределено) Экспорт
Описание = ЮТЗапросы.ОписаниеЗапроса();
Описание.ИмяТаблицы = ИмяТаблицы;
Если ВыбираемыеПоля = Неопределено Тогда
Описание.ВыбираемыеПоля.Добавить("1 КАК Проверка");
Иначе
ЗаполнитьВыбираемыеПоля(Описание, ВыбираемыеПоля);
КонецЕсли;
СформироватьУсловия(ПредикатыУсловия, Описание.Условия, Описание.ЗначенияПараметров);
Возврат Описание;
КонецФункции
Процедура СформироватьУсловия(Предикат, КоллекцияУсловий, ЗначенияПараметров) Экспорт
Если Предикат = Неопределено Тогда
Возврат;
КонецЕсли;
Предикаты = ЮТПредикатыКлиентСервер.НаборПредикатов(Предикат);
ВидыСравнения = ЮТПредикаты.Выражения();
Для Каждого ВыражениеПредиката Из Предикаты Цикл
ИмяПараметра = "Параметр_" + ЮТОбщий.ЧислоВСтроку(ЗначенияПараметров.Количество() + 1);
Шаблон = ШаблонУсловия(ВыражениеПредиката.ВидСравнения, ВидыСравнения);
Условие = СтрШаблон(Шаблон, ВыражениеПредиката.ИмяРеквизита, ИмяПараметра);
КоллекцияУсловий.Добавить(Условие);
ЗначенияПараметров.Вставить(ИмяПараметра, ВыражениеПредиката.Значение);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ШаблонУсловия(Знач Выражение, ВыраженияПредикатов)
Отрицание = ЮТПредикатыКлиентСервер.ЭтоВыраженияОтрицания(Выражение);
Если Отрицание Тогда
Выражение = ЮТПредикатыКлиентСервер.ВыраженияБезОтрицания(Выражение);
КонецЕсли;
Если Выражение = ВыраженияПредикатов.Равно Тогда
Шаблон = "%1 = &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Больше Тогда
Шаблон = "%1 > &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.БольшеРавно Тогда
Шаблон = "%1 >= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Меньше Тогда
Шаблон = "%1 < &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.МеньшеРавно Тогда
Шаблон = "%1 <= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.ИмеетТип Тогда
Шаблон = "ТИПЗНАЧЕНИЯ(%1) = &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Содержит Тогда
Шаблон = "%1 ПОДОБНО ""%%"" + &%2 + ""%%""";
ИначеЕсли Выражение = ВыраженияПредикатов.Заполнено Тогда
// TODO Реализовать
ВызватьИсключение "Проверка заполненности пока не поддерживается";
Иначе
ВызватьИсключение "Неподдерживаемое выражения предикатов " + Выражение;
КонецЕсли;
Если Отрицание Тогда
Шаблон = СтрШаблон("НЕ (%1)", Шаблон);
КонецЕсли;
Возврат Шаблон;
КонецФункции
Процедура ЗаполнитьВыбираемыеПоля(ОписаниеЗапроса, Знач ВыбираемыеПоля)
ТипПараметра = ТипЗнч(ВыбираемыеПоля);
Если ТипПараметра = Тип("Строка") Тогда
ВыбираемыеПоля = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(ВыбираемыеПоля, ",", Истина);
ТипПараметра = Тип("Массив");
КонецЕсли;
Если ТипПараметра = Тип("Массив") Тогда
ОписаниеЗапроса.ВыбираемыеПоля = ВыбираемыеПоля;
ИначеЕсли ТипПараметра = Тип("Структура") Тогда
Для Каждого Поле Из ВыбираемыеПоля Цикл
Выражение = СтрШаблон("%1 КАК %2", Поле.Значение, Поле.Ключ);
ОписаниеЗапроса.ВыбираемыеПоля.Добавить(Выражение);
КонецЦикла;
Иначе
ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТЗапросыКлиентСервер.ЗаполнитьВыбираемыеПоля", ВыбираемыеПоля);
КонецЕсли;
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="6dfe96cd-f835-42f2-b5d7-561680929207">
<name>ЮТЗапросыКлиентСервер</name>
<synonym>
<key>ru</key>
<value>Запросы клиент сервер</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -31,9 +31,6 @@
Возврат Наборы;
КонецЕсли;
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПередВсемиТестамиМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
@ -51,8 +48,6 @@
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Модуль;
ЮТСобытия.ПослеВсехТестовМодуля(ТестовыйМодуль);
Если ЕстьОшибки(ТестовыйМодуль) Тогда
@ -71,9 +66,6 @@
Функция ВыполнитьНаборТестов(Набор, ТестовыйМодуль)
Уровни = ЮТФабрика.УровниИсполнения();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
Набор.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередТестовымНабором(ТестовыйМодуль, Набор);
@ -82,7 +74,6 @@
КонецЕсли;
Результаты = Новый Массив();
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.Тест;
Для Каждого Тест Из Набор.Тесты Цикл
@ -98,7 +89,6 @@
КонецЦикла;
ЮТКонтекст.КонтекстИсполнения().Уровень = Уровни.НаборТестов;
ЮТСобытия.ПослеТестовогоНабора(ТестовыйМодуль, Набор);
Набор.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Набор.ДатаСтарта;

View File

@ -45,11 +45,20 @@
// Параметр3 - Произвольный
// Параметр4 - Произвольный
// Параметр5 - Произвольный
// Параметр6 - Произвольный
// Параметр7 - Произвольный
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
Функция Добавить(Параметр1, Параметр2 = Неопределено, Параметр3 = Неопределено, Параметр4 = Неопределено, Параметр5 = Неопределено) Экспорт
Функция Добавить(Параметр1,
Параметр2 = Неопределено,
Параметр3 = Неопределено,
Параметр4 = Неопределено,
Параметр5 = Неопределено,
Параметр6 = Неопределено,
Параметр7 = Неопределено) Экспорт
// BSLLS:MagicNumber-off
// BSLLS:NumberOfValuesInStructureConstructor-off
Варианты = ЮТКонтекст.ЗначениеКонтекста(КлючКонтекста());
Если Варианты.КоличествоРеквизитов = 1 Тогда
@ -62,8 +71,13 @@
Вариант = Новый Структура(Варианты.Реквизиты, Параметр1, Параметр2, Параметр3, Параметр4);
ИначеЕсли Варианты.КоличествоРеквизитов = 5 Тогда
Вариант = Новый Структура(Варианты.Реквизиты, Параметр1, Параметр2, Параметр3, Параметр4, Параметр5);
ИначеЕсли Варианты.КоличествоРеквизитов = 6 Тогда
Вариант = Новый Структура(Варианты.Реквизиты, Параметр1, Параметр2, Параметр3, Параметр4, Параметр5, Параметр6);
ИначеЕсли Варианты.КоличествоРеквизитов = 7 Тогда
Вариант = Новый Структура(Варианты.Реквизиты, Параметр1, Параметр2, Параметр3, Параметр4, Параметр5, Параметр6, Параметр7);
КонецЕсли;
// BSLLS:NumberOfValuesInStructureConstructor-on
// BSLLS:MagicNumber-on
Варианты.Варианты.Добавить(Вариант);
Возврат ЮТКонструкторВариантов;

View File

@ -0,0 +1,200 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Процедура Установить(Контекст, ИмяРеквизита, Значение) Экспорт
Если ЗначениеЗаполнено(Контекст.ТекущаяТабличнаяЧасть) Тогда
ТекущаяЗапись = ДанныеСтроки(Контекст);
Иначе
ТекущаяЗапись = Контекст.Данные;
КонецЕсли;
ТекущаяЗапись.Вставить(ИмяРеквизита, Значение);
КонецПроцедуры
Процедура Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения = Неопределено) Экспорт
Если ЗначениеЗаполнено(Контекст.ТекущаяТабличнаяЧасть) Тогда
ОписаниеРеквизита = Контекст.Метаданные.ТабличныеЧасти[Контекст.ТекущаяТабличнаяЧасть][ИмяРеквизита];
ТекущаяЗапись = ДанныеСтроки(Контекст);
Иначе
ОписаниеРеквизита = Контекст.Метаданные.Реквизиты[ИмяРеквизита];
ТекущаяЗапись = Контекст.Данные;
КонецЕсли;
Значение = ЮТТестовыеДанныеСлужебный.Фикция(ОписаниеРеквизита.Тип, РеквизитыЗаполнения);
ТекущаяЗапись.Вставить(ИмяРеквизита, Значение);
КонецПроцедуры
Процедура ФикцияОбязательныхПолей(Контекст) Экспорт
Если ЗначениеЗаполнено(Контекст.ТекущаяТабличнаяЧасть) Тогда
Реквизиты = Контекст.Метаданные.ТабличныеЧасти[Контекст.ТекущаяТабличнаяЧасть];
ТекущаяЗапись = ДанныеСтроки(Контекст);
Иначе
Реквизиты = Контекст.Метаданные.Реквизиты;
ТекущаяЗапись = Контекст.Данные;
КонецЕсли;
Для Каждого Элемент Из Реквизиты Цикл
Реквизит = Элемент.Значение;
Если Реквизит.Обязательный И НЕ Контекст.Данные.Свойство(Реквизит.Имя) Тогда
Значение = ЮТТестовыеДанныеСлужебный.Фикция(Реквизит.Тип);
ТекущаяЗапись.Вставить(Реквизит.Имя, Значение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ТабличнаяЧасть(Контекст, ИмяТабличнойЧасти) Экспорт
Контекст.ТекущаяТабличнаяЧасть = ИмяТабличнойЧасти;
Контекст.Данные.Вставить(ИмяТабличнойЧасти, Новый Массив());
КонецПроцедуры
Процедура ДобавитьСтроку(Контекст) Экспорт
Запись = Новый Структура();
ДанныеТабличнойЧасти(Контекст).Добавить(Запись);
КонецПроцедуры
Процедура УстановитьДополнительноеСвойство(Контекст, ИмяСвойства, Значение = Неопределено) Экспорт
Контекст.ДополнительныеСвойства.Вставить(ИмяСвойства, Значение);
КонецПроцедуры
Функция Записать(Контекст, ВернутьОбъект = Ложь, ОбменДаннымиЗагрузка = Ложь) Экспорт
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства;
ПараметрыЗаписи.ОбменДаннымиЗагрузка = ОбменДаннымиЗагрузка;
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
Возврат Ссылка;
КонецФункции
Функция НовыйОбъект(Контекст) Экспорт
Возврат ЮТТестовыеДанныеВызовСервера.НовыйОбъект(Контекст.Менеджер, Контекст.Данные, Контекст.ДополнительныеСвойства);
КонецФункции
Функция Провести(Контекст, ВернутьОбъект = Ложь) Экспорт
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства;
ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение;
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
Возврат Ссылка;
КонецФункции
Функция ДанныеСтроки(Контекст) Экспорт
Если ПустаяСтрока(Контекст.ТекущаяТабличнаяЧасть) Тогда
Возврат Неопределено;
КонецЕсли;
ДанныеТабличнойЧасти = ДанныеТабличнойЧасти(Контекст);
Если ДанныеТабличнойЧасти.Количество() Тогда
Возврат ДанныеТабличнойЧасти[ДанныеТабличнойЧасти.ВГраница()];
Иначе
ВызватьИсключение "Сначала необходимо добавить строку табличной части";
КонецЕсли;
КонецФункции
Функция ДанныеОбъекта(Контекст) Экспорт
Возврат Контекст.Данные;
КонецФункции
// Инициализирует конструктор тестовых данных
//
// Параметры:
// Менеджер - Строка - Имя менеджера. Примеры: Справочники.Товары, Документы.ПриходТоваров
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТКонструкторТестовыхДанных
Функция Инициализировать(Менеджер) Экспорт
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Конструктор = Обработки.ЮТКонструкторТестовыхДанных.Создать();
#Иначе
Конструктор = ПолучитьФорму("Обработка.ЮТКонструкторТестовыхДанных.Форма.КлиентскийКонструктор"); // BSLLS:GetFormMethod-off
#КонецЕсли
Конструктор.Инициализировать(Менеджер);
Возврат Конструктор;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Новый контекст конструктора.
//
// Параметры:
// Менеджер - Произвольный
//
// Возвращаемое значение:
// Структура - Новый контекст конструктора:
// * Менеджер - Произвольный
// * Данные - Структура
// * Метаданные - см. ЮТМетаданные.ОписаниеОбъектМетаданных
// * ТекущаяТабличнаяЧасть - Строка
// * ДополнительныеСвойства - Структура
Функция НовыйКонтекстКонструктора(Менеджер) Экспорт
Контекст = Новый Структура("Менеджер, Данные, Метаданные", Менеджер, Новый Структура());
Контекст.Вставить("Менеджер", Менеджер);
Контекст.Вставить("Данные", Новый Структура());
Контекст.Вставить("Метаданные", ЮТМетаданные.ОписаниеОбъектМетаданных(Менеджер));
Контекст.Вставить("ТекущаяТабличнаяЧасть", "");
Контекст.Вставить("ДополнительныеСвойства", Новый Структура());
Возврат Контекст;
КонецФункции
Функция ДанныеТабличнойЧасти(Контекст)
Возврат Контекст.Данные[Контекст.ТекущаяТабличнаяЧасть];
КонецФункции
#КонецОбласти

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e388b434-0a40-41e7-943b-3941bd455cf2">
<name>ЮТКонструкторТестовыхДанных</name>
<name>ЮТКонструкторТестовыхДанныхСлужебный</name>
<synonym>
<key>ru</key>
<value>Конструктор тестовых данных</value>

View File

@ -22,10 +22,13 @@
// Выполняет начальную настройку для работы с хранимым контекстом
Процедура ИнициализироватьКонтекст() Экспорт
#Если Клиент Тогда
#Если НЕ Клиент Тогда
ВызватьИсключение "Метод `ИнициализироватьКонтекст` должен вызываться только с клиента";
#Иначе
ЮТКонтекстКлиент.ИнициализироватьКонтекст();
#КонецЕсли
ЮТКонтекстСервер.ИнициализироватьКонтекст();
ОбновитьПовторноИспользуемыеЗначения();
#КонецЕсли
КонецПроцедуры
@ -201,6 +204,38 @@
КонецФункции
// Контекст исполнения текущего уровня.
//
// Возвращаемое значение:
// - Неопределено
// - См. ЮТФабрика.ОписаниеТестовогоМодуля
// - См. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// - См. ЮТФабрика.ОписаниеИсполняемогоТеста
Функция КонтекстИсполненияТекущегоУровня() Экспорт
Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = КонтекстИсполнения();
Если КонтекстИсполнения.Уровень = Уровни.Модуль Тогда
Возврат КонтекстИсполнения.Модуль;
ИначеЕсли КонтекстИсполнения.Уровень = Уровни.НаборТестов Тогда
Возврат КонтекстИсполнения.Набор;
ИначеЕсли КонтекстИсполнения.Уровень = Уровни.Тест Тогда
Возврат КонтекстИсполнения.Тест;
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция ОписаниеКонтекста() Экспорт
Описание = Новый Структура;
@ -222,21 +257,21 @@
КонецПроцедуры
Процедура УстановитьКонтекстНабораТестов(Знач ДанныеКонтекста) Экспорт
Процедура УстановитьКонтекстНабораТестов() Экспорт
УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), ДанныеКонтекста);
УстановитьЗначениеКонтекста(ИмяКонтекстаНабораТестов(), Новый Структура);
КонецПроцедуры
Процедура УстановитьКонтекстМодуля(Знач ДанныеКонтекста) Экспорт
Процедура УстановитьКонтекстМодуля() Экспорт
УстановитьЗначениеКонтекста(ИмяКонтекстаМодуля(), ДанныеКонтекста);
УстановитьЗначениеКонтекста(ИмяКонтекстаМодуля(), Новый Структура);
КонецПроцедуры
Процедура УстановитьКонтекстТеста(Знач ДанныеКонтекста) Экспорт
Процедура УстановитьКонтекстТеста() Экспорт
УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), ДанныеКонтекста);
УстановитьЗначениеКонтекста(ИмяКонтекстаТеста(), Новый Структура);
КонецПроцедуры

View File

@ -21,11 +21,11 @@
Процедура ИнициализироватьКонтекст() Экспорт
Контекст = ЮТКонтекст.ОписаниеКонтекста();
АдресХранилища = ПоместитьВоВременноеХранилище(Контекст, Новый УникальныйИдентификатор());
ХранилищеОбщихНастроек.Сохранить(КлючНастроекКонтекста(), "АдресХранилища", АдресХранилища);
ОбновитьПовторноИспользуемыеЗначения();
КонецПроцедуры
Функция ДанныеКонтекста() Экспорт

View File

@ -30,19 +30,26 @@
Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;
Уровни = ЮТФабрика.УровниИсполнения();
Если Уровень = Уровни.Тест И ЮТКонтекст.КонтекстТеста().Свойство(ИмяЗначения) Тогда
КонтекстТеста = ЮТКонтекст.КонтекстТеста();
Если Уровень = Уровни.Тест И КонтекстТеста <> Неопределено И КонтекстТеста.Свойство(ИмяЗначения) Тогда
Возврат ЮТКонтекст.КонтекстТеста()[ИмяЗначения];
Возврат КонтекстТеста[ИмяЗначения];
ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов)
И ЮТКонтекст.КонтекстНабора().Свойство(ИмяЗначения) Тогда
КонецЕсли;
КонтекстНабора = ЮТКонтекст.КонтекстНабора();
Если (Уровень = Уровни.НаборТестов ИЛИ Уровень = Уровни.Тест)
И КонтекстНабора <> Неопределено И КонтекстНабора.Свойство(ИмяЗначения) Тогда
Возврат ЮТКонтекст.КонтекстНабора()[ИмяЗначения];
Возврат КонтекстНабора[ИмяЗначения];
ИначеЕсли (Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов ИЛИ Уровень = Уровни.Модуль)
И ЮТКонтекст.КонтекстМодуля().Свойство(ИмяЗначения) Тогда
КонецЕсли;
КонтекстМодуля = ЮТКонтекст.КонтекстМодуля();
Если (Уровень = Уровни.Модуль ИЛИ Уровень = Уровни.Тест ИЛИ Уровень = Уровни.НаборТестов)
И КонтекстМодуля <> Неопределено И КонтекстМодуля.Свойство(ИмяЗначения) Тогда
Возврат ЮТКонтекст.КонтекстМодуля()[ИмяЗначения];
Возврат КонтекстМодуля[ИмяЗначения];
Иначе
@ -63,20 +70,53 @@
Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;
Уровни = ЮТФабрика.УровниИсполнения();
Если Уровень = Уровни.Тест Тогда
Контекст = ТекущийКонтекст();
Если Контекст = Неопределено Тогда
ЮТКонтекст.КонтекстТеста().Вставить(ИмяЗначения, Значение);
Если Уровень = Уровни.Тест Тогда
ЮТКонтекст.УстановитьКонтекстТеста();
ИначеЕсли Уровень = Уровни.НаборТестов Тогда
ЮТКонтекст.УстановитьКонтекстНабораТестов();
ИначеЕсли Уровень = Уровни.Модуль Тогда
ЮТКонтекст.УстановитьКонтекстМодуля();
Иначе
ВызватьИсключение СтрШаблон("Неизвестный уровень исполнения `%1`", Уровень);
КонецЕсли;
ИначеЕсли Уровень = Уровни.НаборТестов Тогда
ЮТКонтекст.КонтекстНабора().Вставить(ИмяЗначения, Значение);
ИначеЕсли Уровень = Уровни.Модуль Тогда
ЮТКонтекст.КонтекстМодуля().Вставить(ИмяЗначения, Значение);
Контекст = ТекущийКонтекст();
КонецЕсли;
Контекст.Вставить(ИмяЗначения, Значение);
КонецПроцедуры
Функция ТекущийКонтекст() Экспорт
Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;
Уровни = ЮТФабрика.УровниИсполнения();
Если Уровень = Уровни.Тест Тогда
Контекст = ЮТКонтекст.КонтекстТеста();
ИначеЕсли Уровень = Уровни.НаборТестов Тогда
Контекст = ЮТКонтекст.КонтекстНабора();
ИначеЕсли Уровень = Уровни.Модуль Тогда
Контекст = ЮТКонтекст.КонтекстМодуля();
Иначе
Контекст = Неопределено;
КонецЕсли;
Возврат Контекст;
КонецФункции
#КонецОбласти

View File

@ -110,66 +110,44 @@
КонецФункции
Функция ОписаниеОбъектМетаданных(Знач Значение) Экспорт
Функция ОписаниеОбъектМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт
ТипЗначение = ТипЗнч(Значение);
Если ТипЗначение = Тип("Тип") Тогда
МетаданныеОбъекта = Метаданные.НайтиПоТипу(Значение);
ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
ИначеЕсли ТипЗначение = Тип("ОбъектМетаданных") Тогда
МетаданныеОбъекта = Значение;
ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
ИначеЕсли ТипЗначение = Тип("Строка") Тогда
ЧастиСтроки = СтрРазделить(Значение, ".");
Если ЧастиСтроки.Количество() = 2 Тогда
ТипыМетаданных = ЮТМетаданные.ТипыМетаданных();
ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]];
Если ОписаниеТипа <> Неопределено Тогда
МетаданныеОбъекта = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]];
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если МетаданныеОбъекта = Неопределено ИЛИ ОписаниеТипа = Неопределено Тогда
Сообщение = СтрШаблон("Не удалось получить описание метаданных для `%1` (%2)", Значение, ТипЗначение);
ВызватьИсключение Сообщение;
КонецЕсли;
МетаданныеОбъекта = ОбъектМетаданных(Значение);
ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
ОписаниеОбъект = Новый Структура;
ОписаниеОбъект.Вставить("Имя", МетаданныеОбъекта.Имя);
ОписаниеОбъект.Вставить("ОписаниеТипа", ОписаниеТипа);
ОписаниеОбъект.Вставить("Реквизиты", Новый Структура());
ОписаниеОбъект.Вставить("ТабличныеЧасти", Новый Структура());
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты);
Если НЕ ЗаполнятьРеквизиты Тогда
Возврат ОписаниеОбъект;
КонецЕсли;
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты, "Ссылка, Период");
Если ОписаниеТипа.Измерения Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты);
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты, Истина);
КонецЕсли;
Если ОписаниеТипа.Реквизиты Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Реквизиты, ОписаниеОбъект.Реквизиты);
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Реквизиты, ОписаниеОбъект.Реквизиты, Ложь);
КонецЕсли;
Если ОписаниеТипа.Ресурсы Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Ресурсы, ОписаниеОбъект.Реквизиты);
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Ресурсы, ОписаниеОбъект.Реквизиты, Ложь);
КонецЕсли;
Если ОписаниеТипа.РеквизитыАдресации Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.РеквизитыАдресации, ОписаниеОбъект.Реквизиты);
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.РеквизитыАдресации, ОписаниеОбъект.Реквизиты, Ложь);
КонецЕсли;
Если ОписаниеТипа.ТабличныеЧасти Тогда
Для Каждого ТабличнаяЧасть Из МетаданныеОбъекта.ТабличныеЧасти Цикл
РеквизитыТабличнойЧасти = Новый Структура();
ДобавитьОписанияРеквизитов(ТабличнаяЧасть.Реквизиты, РеквизитыТабличнойЧасти);
ДобавитьОписанияРеквизитов(ТабличнаяЧасть.Реквизиты, РеквизитыТабличнойЧасти, Ложь);
ОписаниеОбъект.ТабличныеЧасти.Вставить(ТабличнаяЧасть.Имя, РеквизитыТабличнойЧасти);
КонецЦикла;
@ -245,22 +223,69 @@
#Область СлужебныеПроцедурыИФункции
Процедура ДобавитьОписанияРеквизитов(КоллекцияРеквизитов, КоллекцияОписаний)
Функция ОбъектМетаданных(Значение)
ТипЗначение = ТипЗнч(Значение);
Если ТипЗначение = Тип("Тип") Тогда
ОбъектМетаданных = Метаданные.НайтиПоТипу(Значение);
ИначеЕсли ТипЗначение = Тип("ОбъектМетаданных") Тогда
ОбъектМетаданных = Значение;
ИначеЕсли ТипЗначение = Тип("Строка") Тогда
ЧастиСтроки = СтрРазделить(Значение, ".");
Если ЧастиСтроки.Количество() = 2 Тогда
ТипыМетаданных = ЮТМетаданные.ТипыМетаданных();
ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]];
Если ОписаниеТипа <> Неопределено Тогда
ОбъектМетаданных = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]];
КонецЕсли;
КонецЕсли;
Иначе
ОбъектМетаданных = Неопределено;
КонецЕсли;
Если ОбъектМетаданных = Неопределено Тогда
Сообщение = ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТМетаданныеСервер.ОбъектМетаданных", Значение);
ВызватьИсключение Сообщение;
КонецЕсли;
Возврат ОбъектМетаданных;
КонецФункции
Процедура ДобавитьОписанияРеквизитов(КоллекцияРеквизитов, КоллекцияОписаний, Знач ЭтоКлюч)
Если ТипЗнч(ЭтоКлюч) = Тип("Строка") Тогда
ИменаКлючевыхПолей = СтрРазделить(ЭтоКлюч, ", ");
КонецЕсли;
Для Каждого Реквизит Из КоллекцияРеквизитов Цикл
КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит));
Если ИменаКлючевыхПолей <> Неопределено Тогда
ЭтоКлюч = ИменаКлючевыхПолей.Найти(Реквизит.Имя) <> Неопределено;
КонецЕсли;
КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит, ЭтоКлюч));
КонецЦикла;
КонецПроцедуры
Функция ОписаниеРеквизита(Реквизит) Экспорт
Функция ОписаниеРеквизита(Реквизит, ЭтоКлюч) Экспорт
Описание = Новый Структура();
Описание.Вставить("Имя", Реквизит.Имя);
Описание.Вставить("Тип", Реквизит.Тип);
Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку);
Описание.Вставить("ЭтоКлюч", ЭтоКлюч);
Возврат Описание;

View File

@ -18,17 +18,67 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция ЗначениеНастройкиТеста(ИмяНастройки, ОписаниеТеста, ОписаниеТестовогоНабора, ЗначениеПоУмолчанию) Экспорт
Функция ВТранзакции() Экспорт
ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции;
Возврат ЗначениеНастройкиТеста(ИмяПараметра, Ложь);
КонецФункции
Функция УдалениеТестовыхДанных() Экспорт
ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().УдалениеТестовыхДанных;
Возврат ЗначениеНастройкиТеста(ИмяПараметра, Ложь);
КонецФункции
Функция Перед() Экспорт
ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().Перед;
Возврат ЗначениеНастройкиТеста(ИмяПараметра, "", Истина);
КонецФункции
Функция После() Экспорт
ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().После;
Возврат ЗначениеНастройкиТеста(ИмяПараметра, "", Истина);
КонецФункции
Функция ЗначениеНастройкиТеста(ИмяНастройки, ЗначениеПоУмолчанию, СтрогийУровеньИсполнения = Ложь) Экспорт
Значение = ЗначениеПоУмолчанию;
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
Если ОписаниеТеста.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = ОписаниеТеста.НастройкиВыполнения[ИмяНастройки];
ИначеЕсли ОписаниеТестовогоНабора.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = ОписаниеТестовогоНабора.НастройкиВыполнения[ИмяНастройки];
Если СтрогийУровеньИсполнения Тогда
ТекущийКонтекстИсполнения = ЮТКонтекст.КонтекстИсполненияТекущегоУровня();
Если ТекущийКонтекстИсполнения <> Неопределено Тогда
Значение = ЮТОбщий.ЗначениеСтруктуры(ТекущийКонтекстИсполнения.НастройкиВыполнения, ИмяНастройки, ЗначениеПоУмолчанию);
КонецЕсли;
ИначеЕсли КонтекстИсполнения.Тест <> Неопределено И КонтекстИсполнения.Тест.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = КонтекстИсполнения.Тест.НастройкиВыполнения[ИмяНастройки];
ИначеЕсли КонтекстИсполнения.Набор <> Неопределено И КонтекстИсполнения.Набор.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = КонтекстИсполнения.Набор.НастройкиВыполнения[ИмяНастройки];
ИначеЕсли КонтекстИсполнения.Модуль <> Неопределено И КонтекстИсполнения.Модуль.НастройкиВыполнения.Свойство(ИмяНастройки) Тогда
Значение = КонтекстИсполнения.Модуль.НастройкиВыполнения[ИмяНастройки];
Иначе
ГлобальныеНастройки = ЮТКонтекст.ГлобальныеНастройкиВыполнения();
Если ГлобальныеНастройки.Свойство(ИмяНастройки) Тогда
Значение = ГлобальныеНастройки[ИмяНастройки];
КонецЕсли;

View File

@ -175,12 +175,11 @@
Функция ЗначениеСтруктуры(Знач ИсходнаяСтруктура, ИмяПоля, Знач ЗначениеПоУмолчанию = Неопределено, ПроверятьЗаполненность = Ложь) Экспорт
Если ПустаяСтрока(ИмяПоля) Тогда
Возврат ЗначениеПоУмолчанию;
КонецЕсли;
ЗначениеПоля = Неопределено;
Если ИсходнаяСтруктура.Свойство(ИмяПоля, ЗначениеПоля) Тогда
Если ПроверятьЗаполненность И ЗначениеЗаполнено(ЗначениеПоля) Или Не ПроверятьЗаполненность Тогда
Возврат ЗначениеПоля;
@ -726,7 +725,7 @@
Функция МетодНеДоступен(ИмяМетода, ИмяКонтекста = "веб-клиенте") Экспорт
Возврат СтрШаблон("Метод `%1` не доступен в %2");
Возврат СтрШаблон("Метод `%1` не доступен в %2", ИмяМетода, ИмяКонтекста);
КонецФункции
@ -790,6 +789,12 @@
КонецПроцедуры
Функция НеподдерживаемыйПараметрМетода(ИмяМетода, ЗначениеПараметра) Экспорт
Возврат СтрШаблон("Неподдерживаемый параметры метода `%1` `%2`(%3)", ИмяМетода, ЗначениеПараметра, ТипЗнч(ЗначениеПараметра));
КонецФункции
Функция УстановленБезопасныйРежим() Экспорт
Возврат ЮТОбщийВызовСервера.УстановленБезопасныйРежим();
@ -824,6 +829,18 @@
КонецФункции
Функция ТипСтруктуры(Структура) Экспорт
Возврат ЗначениеСтруктуры(Структура, "__type__");
КонецФункции
Процедура УказатьТипСтруктуры(Структура, ИмяТипа) Экспорт
Структура.Вставить("__type__", ИмяТипа);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -0,0 +1,55 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
// @strict-types
#Область ПрограммныйИнтерфейс
// Локализация.
//
// Возвращаемое значение:
// Строка - Возвращает текущую установленную локализацию
Функция Локализация() Экспорт
Возврат ЮТПодражательСлужебный.Контекст().Локализация;
КонецФункции
// Устанавливает локализацию подражателя
// В дальнейшем используется для получения списка словарей с указанной локализацией
// Параметры:
// КодЯзыка - Строка - Код языка
Процедура УстановитьЛокализацию(КодЯзыка) Экспорт
ЮТПодражательСлужебный.Контекст().Локализация = КодЯзыка;
КонецПроцедуры
#Область Реализации
Функция Люди() Экспорт
Возврат ЮТПодражатель_Люди;
КонецФункции
Функция Компании() Экспорт
Возврат ЮТПодражатель_Компании;
КонецФункции
Функция Банки() Экспорт
Возврат ЮТПодражатель_Банки;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b65b686f-0077-4d10-8f99-7a16ea68b42b">
<name>ЮТПодражатель</name>
<synonym>
<key>ru</key>
<value>Подражатель</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,89 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область ПрограммныйИнтерфейс
// Возвращает случайный номер банковского счета, по умолчанию
// Подробности алгоритма можно прочитать по ссылке
// http://keysystems.ru/files/fo/arm_budjet/show_docum/BKS/onlinehelphtm/ro_kr_algor_klyuch_rs.htm
// Параметры:
// БИК - Строка - БИК банка
// КодВалюты - Строка - Код валюты
// ЮрЛицо - Булево - Генерация счета юрлица, иначе физ лица
//
// Возвращаемое значение:
// Строка - Номер счета
Функция НомерСчета(БИК, КодВалюты = "810", ЮрЛицо = Истина) Экспорт
Если СтрДлина(КодВалюты) <> 3 Тогда
ВызватьИсключение "Длина кода валюты должна быть равна 3";
КонецЕсли;
БалансовыйСчет = ?(ЮрЛицо, "40702", "40802");
НомерСчетаВБанке = ЮТТестовыеДанные.СлучайнаяСтрока(11, , "0123456789");
ЧислоДляРасчетаКонтрольнойСуммы = Прав(БИК, 3) + БалансовыйСчет + КодВалюты + "0" + НомерСчетаВБанке;
Весы = ВесовыеКоэффициентаДляРасчетаКонтрольнойСуммыСчета();
КонтрольнаяСумма = 0;
Для Индекс = 0 По 22 Цикл
КонтрольнаяСумма =
КонтрольнаяСумма
+ Число(Сред(ЧислоДляРасчетаКонтрольнойСуммы, Индекс + 1, 1)) * Число(Весы.Получить(Индекс))
;
КонецЦикла;
КонтрольноеЧисло = ((КонтрольнаяСумма % 10) * 3) % 10;
Возврат СтрШаблон(
"%1%2%3%4",
БалансовыйСчет,
КодВалюты,
КонтрольноеЧисло,
НомерСчетаВБанке
);
КонецФункции
// Формирует случайный валидный БИК банка
//
// Возвращаемое значение:
// Строка - БИК
Функция БИК() Экспорт
Возврат СтрШаблон(
"%1%2%3%4",
"04", // код страны
ЮТТестовыеДанные.СлучайнаяСтрока(2, , "0123456789"), // ОКАТО код территории
ЮТТестовыеДанные.СлучайнаяСтрока(2, , "0123456789"), // код подразделение расчетной сети ЦБ
Формат(ЮТТестовыеДанные.СлучайноеЧисло(50, 999), "ЧЦ=3; ЧВН=;") // номер кредитной организации
);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ИмяРеализации()
Возврат "Банки";
КонецФункции
Функция ВесовыеКоэффициентаДляРасчетаКонтрольнойСуммыСчета()
Возврат СтрРазделить("7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1", ",");
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="4b1986d5-23da-4865-9a45-e72d224801b9">
<name>ЮТПодражатель_Банки</name>
<synonym>
<key>ru</key>
<value>Подражатель реализация люди клиент сервер</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,150 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область ПрограммныйИнтерфейс
// Возвращает случайное имя компании
//
// Возвращаемое значение:
// Строка
Функция Наименование() Экспорт
СловарьИмен = СловарьИменаКомпаний();
СловарьПрефиксов = СловарьПрефиксыИменКомпаний();
Возврат СтрШаблон(
"%1 %2",
ЮТПодражательСлужебный.СлучайноеЗначениеИзСловаря(СловарьПрефиксов),
ЮТПодражательСлужебный.СлучайноеЗначениеИзСловаря(СловарьИмен)
);
КонецФункции
// Формирует случайный валидный ИНН РФ.
//
// Параметры:
// КодРегиона - Строка - Код региона это первые две цифры кода ИНН. Список действующих кодов регионов
// можно подсмотреть: https://www.nalog.gov.ru/html/docs/kods_regions.doc . Если код региона задан
// как "00" то будет сформирован случайный код региона. По умолчанию "00" (случайный код региона)
// ЭтоИННФизическогоЛица - Булево - Если Истина, то это ИНН физического лица, иначе ИНН юридического
// лица. По умолчанию Ложь (ИНН юридического лица)
//
// Возвращаемое значение:
// Строка - Случайный ИНН, например 3444140904
Функция ИНН(КодРегиона = "00", ЭтоИННФизическогоЛица = Ложь) Экспорт
СлучайныйИНН = "";
Если ЭтоИННФизическогоЛица Тогда
ИННМассив = Новый Массив(12);
ВесовыеКоэффициенты1 = СтрРазделить("7, 2, 4, 10, 3, 5, 9, 4, 6, 8", ",");
ВесовыеКоэффициенты2 = СтрРазделить("3, 7, 2, 4, 10, 3, 5, 9, 4, 6, 8", ",");
Иначе
ИННМассив = Новый Массив(10);
ВесовыеКоэффициенты1 = СтрРазделить("2, 4, 10, 3, 5, 9, 4, 6, 8", ",");
ВесовыеКоэффициенты2 = Новый Массив;
КонецЕсли;
Если КодРегиона = "00" Или СтрДлина(КодРегиона) <> 2 Тогда
ИННМассив.Установить(0, ЮТТестовыеДанные.СлучайноеЧисло(0, 9, 0));
ИННМассив.Установить(1, ЮТТестовыеДанные.СлучайноеЧисло(0, 9, 0));
Иначе
ИННМассив.Установить(0, Число(Сред(КодРегиона, 1, 1)));
ИННМассив.Установить(1, Число(Сред(КодРегиона, 2, 1)));
КонецЕсли;
Для Индекс = 2 По ИННМассив.ВГраница() Цикл
ИННМассив.Установить(Индекс, ЮТТестовыеДанные.СлучайноеЧисло(0, 9, 0));
КонецЦикла;
Сумма1 = 0;
Для Индекс = 0 По ВесовыеКоэффициенты1.ВГраница() Цикл
Элемент = ИННМассив.Получить(Индекс) * Число(ВесовыеКоэффициенты1.Получить(Индекс));
Сумма1 = Сумма1 + Элемент;
КонецЦикла;
ИННМассив.Установить(ВесовыеКоэффициенты1.Количество(), Сумма1 % 11 % 10);
Если ВесовыеКоэффициенты2.Количество() <> 0 Тогда
Сумма2 = 0;
Для Индекс = 0 По ВесовыеКоэффициенты2.ВГраница() Цикл
Элемент = ИННМассив.Получить(Индекс) * Число(ВесовыеКоэффициенты2.Получить(Индекс));
Сумма2 = Сумма2 + Элемент;
КонецЦикла;
ИННМассив.Установить(ВесовыеКоэффициенты2.Количество(), Сумма1 % 11 % 10);
КонецЕсли;
СлучайныйИНН = СтрСоединить(ИННМассив);
Возврат СлучайныйИНН;
КонецФункции
// Формирует случайный валидный КПП РФ
//
// Параметры:
// КодНалоговогоОргана - Строка - Код налогового органа, первые четыре цифры КПП.
// Причина - Число - Причина постановки. Поддерживаются следующие варианты
// # 2 - код причины "43" постановка на учет филиала российской организации
// # любая другая цифра - код причины "01" постановка на учет российской организации
// по месту ее нахождения
//
// Возвращаемое значение:
// Строка - Случайный КПП, например 344401001
Функция КПП(КодНалоговогоОргана = "0000", Причина = 1) Экспорт
СлучайныйКПП = "";
Если ТипЗнч(Причина) = Тип("Число") И Причина = 2 Тогда
Код2 = "43";
Иначе
Код2 = "01";
КонецЕсли;
Если ТипЗнч(КодНалоговогоОргана) = Тип("Строка") И СтрДлина(КодНалоговогоОргана) = 4 Тогда
Код1 = КодНалоговогоОргана;
Иначе
МассивКод1 = Новый Массив(4);
Для Индекс = 0 По МассивКод1.ВГраница() Цикл
МассивКод1.Установить(Индекс, ЮТТестовыеДанные.СлучайноеЧисло(0, 9, 0));
КонецЦикла;
Код1 = СтрСоединить(МассивКод1);
КонецЕсли;
Код3 = "00" + Строка(ЮТТестовыеДанные.СлучайноеЧисло(0, 9, 0));
СлучайныйКПП = СтрШаблон("%1%2%3", Код1, Код2, Код3);
Возврат СлучайныйКПП;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ИмяРеализации()
Возврат "Компании";
КонецФункции
Функция СловарьИменаКомпаний()
Возврат ЮТПодражательСлужебный.Словарь(ИмяРеализации(), "Наименования");
КонецФункции
Функция СловарьПрефиксыИменКомпаний()
Возврат ЮТПодражательСлужебный.Словарь(ИмяРеализации(), "ПрефиксыНаименований");
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="02573bc2-6df0-4e30-b6d9-267399c050de">
<name>ЮТПодражатель_Компании</name>
<synonym>
<key>ru</key>
<value>Подражатель реализация люди клиент сервер</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,197 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область ПрограммныйИнтерфейс
// Возвращает случайное имя
//
// Параметры:
// Пол - Строка - см. ЮТПодражатель_Люди.ПолЧеловека
//
// Возвращаемое значение:
// Строка
Функция Имя(Пол = Неопределено) Экспорт
ПолЧеловека = ОпределитьПолЧеловекаИзПараметра(Пол);
Если ПолЧеловека = ПолЧеловека().Мужской Тогда
Словарь = СловарьМужскиеИмена();
ИначеЕсли ПолЧеловека = ПолЧеловека().Женский Тогда
Словарь = СловарьЖенскиеИмена();
КонецЕсли;
Возврат ЮТПодражательСлужебный.СлучайноеЗначениеИзСловаря(Словарь);
КонецФункции
// Возвращает случайную фамилию
//
// Параметры:
// Пол - Строка - см. ЮТПодражатель_Люди.ПолЧеловека
//
// Возвращаемое значение:
// Строка
Функция Фамилия(Пол = Неопределено) Экспорт
ПолЧеловека = ОпределитьПолЧеловекаИзПараметра(Пол);
Если ПолЧеловека = ПолЧеловека().Мужской Тогда
Словарь = СловарьМужскиеФамилии();
ИначеЕсли ПолЧеловека = ПолЧеловека().Женский Тогда
Словарь = СловарьЖенскиеФамилии();
КонецЕсли;
Возврат ЮТПодражательСлужебный.СлучайноеЗначениеИзСловаря(Словарь);
КонецФункции
// Возвращает случайное отчество
//
// Параметры:
// Пол - Строка - см. ЮТПодражатель_Люди.ПолЧеловека
//
// Возвращаемое значение:
// Строка
Функция Отчество(Пол = Неопределено) Экспорт
ПолЧеловека = ОпределитьПолЧеловекаИзПараметра(Пол);
Если ПолЧеловека = ПолЧеловека().Мужской Тогда
Словарь = СловарьМужскиеОтчества();
ИначеЕсли ПолЧеловека = ПолЧеловека().Женский Тогда
Словарь = СловарьЖенскиеОтчества();
КонецЕсли;
Возврат ЮТПодражательСлужебный.СлучайноеЗначениеИзСловаря(Словарь);
КонецФункции
// Возвращает случайное отчество
//
// Параметры:
// Пол - Строка - см. ЮТПодражатель_Люди.ПолЧеловека
//
// Возвращаемое значение:
// Строка
Функция ФИО(Пол = Неопределено) Экспорт
ПолЧеловека = ОпределитьПолЧеловекаИзПараметра(Пол);
Возврат СтрШаблон(
"%1 %2 %3",
Фамилия(ПолЧеловека),
Имя(ПолЧеловека),
Отчество(ПолЧеловека)
);
КонецФункции
// Формирует случаный ИНН физического лица
//
// Возвращаемое значение:
// Строка
Функция ИНН() Экспорт
Возврат ЮТТестовыеДанные.Подражатель().Компании().ИНН(, Истина);
КонецФункции
// Формирует случаный СНИЛС.
// https://ru.wikipedia.org/wiki/Контрольное_число
// Возвращаемое значение:
// Строка
Функция СНИЛС() Экспорт
ЧастиСнилс = Новый Массив();
ЧастиСнилс.Добавить(Формат(ЮТТестовыеДанные.СлучайноеЧисло(100, 999), "ЧЦ=3; ЧВН=;"));
ЧастиСнилс.Добавить(Формат(ЮТТестовыеДанные.СлучайноеЧисло(0, 999), "ЧЦ=3; ЧВН=;"));
ЧастиСнилс.Добавить(Формат(ЮТТестовыеДанные.СлучайноеЧисло(0, 999), "ЧЦ=3; ЧВН=;"));
ИтогоСтрокой = СтрСоединить(ЧастиСнилс, "");
ДлинаОсновнойЧасти = СтрДлина(ИтогоСтрокой);
Сумма = 0;
Для Итератор = 0 По 8 Цикл
Сумма = Сумма + (Число(Сред(ИтогоСтрокой, ДлинаОсновнойЧасти - Итератор, 1)) * (Итератор + 1));
КонецЦикла;
ОстатокОтДеления = Сумма % 101;
КонтрольноеЧисло = ?(ОстатокОтДеления = 100, 0, ОстатокОтДеления);
Возврат СтрШаблон(
"%1-%2-%3 %4",
ЧастиСнилс[0],
ЧастиСнилс[1],
ЧастиСнилс[2],
Формат(КонтрольноеЧисло, "ЧЦ=2; ЧВН=;")
);
КонецФункции
#Область ФабрикаПеречислений
Функция ПолЧеловека() Экспорт
Результат = Новый Структура();
Результат.Вставить("Мужской", "Мужской");
Результат.Вставить("Женский", "Женский");
Возврат Новый ФиксированнаяСтруктура(Результат);
КонецФункции
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ИмяРеализации()
Возврат "Люди";
КонецФункции
Функция СловарьЖенскиеИмена()
Возврат ЮТПодражательСлужебный.Словарь(ИмяРеализации(), "ЖенскиеИмена");
КонецФункции
Функция СловарьЖенскиеФамилии()
Возврат ЮТПодражательСлужебный.Словарь(ИмяРеализации(), "ЖенскиеФамилии");
КонецФункции
Функция СловарьЖенскиеОтчества()
Возврат ЮТПодражательСлужебный.Словарь(ИмяРеализации(), "ЖенскиеОтчества");
КонецФункции
Функция СловарьМужскиеИмена()
Возврат ЮТПодражательСлужебный.Словарь(ИмяРеализации(), "МужскиеИмена");
КонецФункции
Функция СловарьМужскиеФамилии()
Возврат ЮТПодражательСлужебный.Словарь(ИмяРеализации(), "МужскиеФамилии");
КонецФункции
Функция СловарьМужскиеОтчества()
Возврат ЮТПодражательСлужебный.Словарь(ИмяРеализации(), "МужскиеОтчества");
КонецФункции
Функция ОпределитьПолЧеловекаИзПараметра(Пол)
Если Пол <> Неопределено Тогда
Если Не ПолЧеловека().Свойство(Пол) Тогда
ВызватьИсключение СтрШаблон("Отсутствует реализация словаря для пола: %1", Пол);
КонецЕсли;
Возврат Пол;
КонецЕсли;
Варианты = ЮТОбщий.ВыгрузитьЗначения(ПолЧеловека(), "Значение");
Возврат ЮТТестовыеДанные.СлучайноеЗначениеИзСписка(Варианты);
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="e9002bdd-602e-4348-9d0f-4c910f9e40f4">
<name>ЮТПодражатель_Люди</name>
<synonym>
<key>ru</key>
<value>Подражатель реализация люди клиент сервер</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,42 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
// Данные словаря.
//
// Параметры:
// Кодификатор - Строка - Имя словаря в метаданных
//
// Возвращаемое значение:
// ФиксированныйМассив из Строка
Функция ДанныеСловаря(Кодификатор) Экспорт
Если Метаданные.ОбщиеМакеты.Найти(Кодификатор) = Неопределено Тогда
ВызватьИсключение СтрШаблон("Словарь с именем (%1) не найден", Кодификатор);
КонецЕсли;
Макет = ПолучитьОбщийМакет(Кодификатор);
Возврат СтрРазделить(Макет.ПолучитьТекст(), Символы.ПС, Ложь);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1e6f3296-03af-4bd2-b52a-d89f576e7166">
<name>ЮТПодражательВызовСервера</name>
<synonym>
<key>ru</key>
<value>Подражатель вызов сервера</value>
</synonym>
<server>true</server>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,51 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
// @strict-types
#Область СлужебныйПрограммныйИнтерфейс
// Получает список из словаря с учетом установленной локализации
//
// Параметры:
// ИмяРеализации - Строка - Имя реализации
// ИмяСловаря - Строка - Имя словаря
// КодЛокализации - Строка - Код локализации
//
// Возвращаемое значение:
// ФиксированныйМассив из Строка
Функция Словарь(ИмяРеализации, ИмяСловаря, КодЛокализации) Экспорт
Кодификатор = КодификаторСловаря(ИмяРеализации, ИмяСловаря, КодЛокализации);
Возврат Новый ФиксированныйМассив(ЮТПодражательВызовСервера.ДанныеСловаря(Кодификатор));
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция КодификаторСловаря(ИмяРеализации, ИмяСловаря, КодЛокализации)
Возврат СтрШаблон(
"ЮТ_СловарьПодражателя_%1_%2_%3",
ИмяРеализации,
ИмяСловаря,
КодЛокализации
);
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="6974dbbd-182e-43c6-94e3-e19696766e0f">
<name>ЮТПодражательПовтИсп</name>
<synonym>
<key>ru</key>
<value>Подражатель повт исп</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
<returnValuesReuse>DuringSession</returnValuesReuse>
</mdclass:CommonModule>

View File

@ -0,0 +1,91 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
// Получает список из словаря с учетом установленной локализации
//
// Параметры:
// ИмяРеализации - Строка - Имя реализации
// ИмяСловаря - Строка - Имя словаря
// КодЛокализации - Строка - Код локализации, по умолчанию берется из контекста
//
// Возвращаемое значение:
// ФиксированныйМассив из Строка
Функция Словарь(ИмяРеализации, ИмяСловаря, КодЛокализации = Неопределено) Экспорт
_КодЛокализации = ?(КодЛокализации = Неопределено, ЮТПодражатель.Локализация(), КодЛокализации);
Возврат ЮТПодражательПовтИсп.Словарь(ИмяРеализации, ИмяСловаря, _КодЛокализации);
КонецФункции
// Случайное значение из словаря.
//
// Параметры:
// Словарь - Массив из Строка - Словарь
//
// Возвращаемое значение:
// - Строка
Функция СлучайноеЗначениеИзСловаря(Словарь) Экспорт
Возврат Словарь.Получить(ЮТТестовыеДанные.СлучайноеЧисло(0, Словарь.ВГраница()));
КонецФункции
// Контекст.
//
// Возвращаемое значение:
// см. НовыйКонтекст
Функция Контекст() Экспорт
//@skip-check constructor-function-return-section
Возврат ЮТКонтекст.ЗначениеКонтекста(КлючКонтекста());
КонецФункции
// Инициализирует подражатель
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция Инициализировать() Экспорт
Если Контекст() = Неопределено Тогда
ЮТКонтекст.УстановитьЗначениеКонтекста(КлючКонтекста(), НовыйКонтекст());
КонецЕсли;
Возврат ЮТПодражатель;
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция КлючКонтекста()
Возврат "Подражатель";
КонецФункции
// Новый контекст.
//
// Возвращаемое значение:
// Структура - Новый контекст:
// * Локализация - Строка - Установленная локализация
Функция НовыйКонтекст()
Описание = Новый Структура;
#Если Клиент Тогда
Описание.Вставить("Локализация", ТекущийЯзык());
#Иначе
Описание.Вставить("Локализация", ТекущийЯзык().КодЯзыка);
#КонецЕсли
Возврат Описание;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="0bbb9e3a-a83f-4444-aaed-98b2a1ac8bda">
<name>ЮТПодражательСлужебный</name>
<synonym>
<key>ru</key>
<value>Подражатель служебный</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -64,11 +64,11 @@
ТипПараметра = ТипЗнч(Предикаты);
Если ТипПараметра = Тип("ОбщийМодуль") И Предикаты = ЮТПредикаты Тогда
Если ЭтоПредикатОбщийМодуль(ТипПараметра, Предикаты) Тогда
Результат = ЮТПредикаты.Получить();
ИначеЕсли ТипПараметра = Тип("Массив") Тогда
ИначеЕсли ЭтоПредикатМассив(ТипПараметра, Предикаты) Тогда
Результат = Предикаты;
ИначеЕсли ТипПараметра = Тип("Структура") Тогда
ИначеЕсли ЭтоПредикатСтруктура(ТипПараметра, Предикаты) Тогда
Результат = ЮТОбщий.ЗначениеВМассиве(Предикаты);
Иначе
ВызватьИсключение "Некорректный параметр метода `ЮТПредикатыКлиентСервер.НаборПредикатов`";
@ -78,24 +78,41 @@
КонецФункции
Функция ПредставлениеПредикатов(Знач Предикаты, Разделитель) Экспорт
// Это предикат
//
// Параметры:
// Предикаты - Произвольный - значение, для которого будет определено является ли оно предикатом или нет
//
// Возвращаемое значение:
// Булево
Функция ЭтоПредикат(Предикаты) Экспорт
ТипПараметра = ТипЗнч(Предикаты);
Возврат ЭтоПредикатОбщийМодуль(ТипПараметра, Предикаты)
Или ЭтоПредикатМассив(ТипПараметра, Предикаты)
Или ЭтоПредикатСтруктура(ТипПараметра, Предикаты);
КонецФункции
Функция ПредставлениеПредикатов(Знач Предикаты, Разделитель, ШаблонСвойства = "содержит свойство `%1`, которое") Экспорт
Представления = Новый Массив();
Предикаты = НаборПредикатов(Предикаты);
Для Каждого Выражение Из Предикаты Цикл
Представления.Добавить(ПредставлениеПредиката(Выражение));
Представления.Добавить(ПредставлениеПредиката(Выражение, ШаблонСвойства));
КонецЦикла;
Возврат СтрСоединить(Представления, Разделитель);
КонецФункции
Функция ПредставлениеПредиката(ВыражениеПредиката) Экспорт
Функция ПредставлениеПредиката(ВыражениеПредиката, ШаблонСвойства) Экспорт
Если ВыражениеПредиката.ИмяРеквизита = Неопределено Тогда
ПроверяемоеЗначение = "";
Иначе
ПроверяемоеЗначение = СтрШаблон("содержит свойство `%1`, которое ", ВыражениеПредиката.ИмяРеквизита);
ПроверяемоеЗначение = СтрШаблон(ШаблонСвойства, ВыражениеПредиката.ИмяРеквизита) + " ";
КонецЕсли;
Выражение = СтрШаблон(ШаблонВыражения(ВыражениеПредиката.ВидСравнения), ВыражениеПредиката.Значение);
@ -146,14 +163,49 @@
КонецФункции
Функция ЭтоВыраженияОтрицания(Выражение) Экспорт
Возврат СтрНачинаетсяС(Выражение, "Не");
КонецФункции
Функция ВыраженияБезОтрицания(Выражение) Экспорт
Возврат Сред(Выражение, 3);
КонецФункции
// Параметры сообщений об ошибке.
//
// Параметры:
// ОписаниеПроверки - Строка - Описание конкретной проверки
// ТекстПроверяемоеЗначение - Строка - Человекочитаемое описание проверяемого значения
// ПредставлениеПроверяемогоЗначения - Неопределено - Представление проверяемого значения
//
// Возвращаемое значение:
// Структура - Параметры сообщений об ошибке:
// * ОписаниеПроверки - Неопределено, Строка - Описание конкретной проверки
// * ТекстПроверяемоеЗначение - Неопределено, Строка - Человекочитаемое описание проверяемого значения
// * ПредставлениеПроверяемогоЗначения - Неопределено, Строка -
Функция ПараметрыСообщенийОбОшибке(ОписаниеПроверки = Неопределено,
ТекстПроверяемоеЗначение = "проверяемое значение",
ПредставлениеПроверяемогоЗначения = Неопределено) Экспорт
Возврат Новый Структура("ОписаниеПроверки, ТекстПроверяемоеЗначение, ПредставлениеПроверяемогоЗначения",
ОписаниеПроверки,
ТекстПроверяемоеЗначение,
ПредставлениеПроверяемогоЗначения);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ПроверитьВыражениеПредиката(Значение, Выражение, СтатусПроверки, БазовыеПараметрыПроверки, ПараметрыСравнения)
Процедура ПроверитьВыражениеПредиката(Значение, Выражение, СтатусПроверки, ПараметрыСообщенийОбОшибке, ПараметрыСравнения)
Попытка
ВызватьОбработчикПредиката(Значение, Выражение, СтатусПроверки, БазовыеПараметрыПроверки, ПараметрыСравнения);
ВызватьОбработчикПредиката(Значение, Выражение, СтатусПроверки, ПараметрыСообщенийОбОшибке, ПараметрыСравнения);
Исключение
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(СтатусПроверки, ИнформацияОбОшибке());
КонецПопытки;
@ -166,15 +218,19 @@
// Значение - Произвольный - Значение
// Выражение - см. ЮТФабрика.ВыражениеПредиката
// СтатусПроверки - см. ЮТФабрика.ОписаниеРезультатаПроверки
// БазовыеПараметрыПроверки - см. ПараметрыПроверки
// ПараметрыСообщенийОбОшибке - см. ПараметрыСообщенийОбОшибке
// ПараметрыСравнения - Неопределено
// - Структура - Параметры сравнения значений, для разных выражений испльзуются свои параметры
Процедура ВызватьОбработчикПредиката(Значение, Выражение, СтатусПроверки, БазовыеПараметрыПроверки, ПараметрыСравнения)
Процедура ВызватьОбработчикПредиката(Значение, Выражение, СтатусПроверки, ПараметрыСообщенийОбОшибке, ПараметрыСравнения)
// BSLLS:CognitiveComplexity-off
ВидыСравнения = ЮТПредикаты.Выражения();
ПараметрыПроверки = ЮТСравнениеКлиентСервер.ПараметрыПроверки(Выражение.ВидСравнения, Значение, Выражение.ИмяРеквизита, Выражение.Значение, Ложь);
ЗаполнитьЗначенияСвойств(ПараметрыПроверки, БазовыеПараметрыПроверки, "ОписаниеПроверки, ОбъектПроверки, ПредставлениеПроверяемогоЗначения");
ПараметрыПроверки.ОписаниеПроверки = ПараметрыСообщенийОбОшибке.ОписаниеПроверки;
ПараметрыПроверки.ТекстПроверяемоеЗначение = ПараметрыСообщенийОбОшибке.ТекстПроверяемоеЗначение;
ПараметрыПроверки.ОбъектПроверки.Представление = ПараметрыСообщенийОбОшибке.ПредставлениеПроверяемогоЗначения;
Если СтрНачинаетсяС(Выражение.ВидСравнения, "Не") И ВидыСравнения.Свойство(Сред(Выражение.ВидСравнения, 3)) Тогда
ПараметрыПроверки.Реверс = Истина;
@ -232,26 +288,25 @@
КонецПроцедуры
// Параметры сообщений об ошибке.
//
// Параметры:
// ОписаниеПроверки - Строка - Описание конкретной проверки
// ОбъектПроверки - Строка - Человекочитаемое описание проверяемого значения
// ПредставлениеПроверяемогоЗначения - Неопределено - Представление проверяемого значения
//
// Возвращаемое значение:
// Структура - Параметры сообщений об ошибке:
// * ОписаниеПроверки - Строка - Описание конкретной проверки
// * ОбъектПроверки - Строка - Человекочитаемое описание проверяемого значения
// * ПредставлениеПроверяемогоЗначения - Неопределено -
Функция ПараметрыСообщенийОбОшибке(ОписаниеПроверки = Неопределено,
ОбъектПроверки = "проверяемое значение",
ПредставлениеПроверяемогоЗначения = Неопределено) Экспорт
Функция ЭтоПредикатОбщийМодуль(ТипПредикатов, Предикаты)
Возврат Новый Структура("ОписаниеПроверки, ОбъектПроверки, ПредставлениеПроверяемогоЗначения",
ОписаниеПроверки,
ОбъектПроверки,
ПредставлениеПроверяемогоЗначения);
Возврат ТипПредикатов = Тип("ОбщийМодуль")
И Предикаты = ЮТПредикаты;
КонецФункции
Функция ЭтоПредикатМассив(ТипПредикатов, Предикаты)
Возврат ТипПредикатов = Тип("Массив")
И Предикаты.Количество()
И ЭтоПредикатСтруктура(ТипЗнч(Предикаты[0]), Предикаты[0]);
КонецФункции
Функция ЭтоПредикатСтруктура(ТипПредикатов, Предикаты)
Возврат ТипПредикатов = Тип("Структура")
И ЮТОбщий.ТипСтруктуры(Предикаты) = "Предикат";
КонецФункции

View File

@ -94,12 +94,13 @@
//
// Параметры:
// ИнформацияОбОшибке - ИнформацияОбОшибке
Процедура СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке) Экспорт
// ОписаниеПроверки - см. ЮТФабрика.ОписаниеПроверки
Процедура СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке, ОписаниеПроверки = Неопределено) Экспорт
СтруктураОшибки = ЮТКонтекст.КонтекстОшибки();
СтруктураОшибки.ОшибкаУтверждения = Ложь;
ВызватьОшибкуИсполнения(ИнформацияОбОшибке);
ВызватьОшибкуИсполнения(ИнформацияОбОшибке, ОписаниеПроверки);
КонецПроцедуры
@ -107,16 +108,20 @@
// При этом сохраняет в контекст состояние, для дальнейшей обработки
//
// Параметры:
// ОписаниеПроверки - см. ЮТФабрика.ОписаниеПроверки
// Сообщение - Строка
// ПроверяемоеЗначение - Произвольный
// ОжидаемоеЗначение - Произвольный
// ОбъектПроверки - Строка - Человекочитаемое описание проверяемого значения
Процедура СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ОжидаемоеЗначение, ОбъектПроверки = "проверяемое значение") Экспорт
Процедура СгенерироватьОшибкуСравнения(ОписаниеПроверки,
Сообщение,
ПроверяемоеЗначение,
ОжидаемоеЗначение,
ОбъектПроверки = "проверяемое значение") Экспорт
УстановитьДанныеОшибкиСравнения(ПроверяемоеЗначение, ОжидаемоеЗначение);
Контекст = ЮТКонтекст.КонтекстПроверки();
ТекстСообщения = ФорматированныйТекстОшибкиУтверждения(ПроверяемоеЗначение, Сообщение, ОбъектПроверки, Контекст);
ВызватьОшибкуПроверки(ТекстСообщения);
ТекстСообщения = ФорматированныйТекстОшибкиУтверждения(ОписаниеПроверки, Сообщение, ОбъектПроверки);
ВызватьОшибкуПроверки(ТекстСообщения, ОписаниеПроверки);
КонецПроцедуры
@ -124,15 +129,15 @@
// При этом сохраняет в контекст состояние, для дальнейшей обработки
//
// Параметры:
// ОписаниеПроверки - см. ЮТФабрика.ОписаниеПроверки
// Сообщение - Строка
// ПроверяемоеЗначение - Произвольный
// ОбъектПроверки - Строка - Человекочитаемое описание проверяемого значения
Процедура СгенерироватьОшибкуУтверждения(Сообщение, ПроверяемоеЗначение, ОбъектПроверки = "проверяемое значение") Экспорт
Процедура СгенерироватьОшибкуУтверждения(ОписаниеПроверки, Сообщение, ПроверяемоеЗначение, ОбъектПроверки = "проверяемое значение") Экспорт
УстановитьДанныеОшибкиУтверждения(ПроверяемоеЗначение);
Контекст = ЮТКонтекст.КонтекстПроверки();
ТекстСообщения = ФорматированныйТекстОшибкиУтверждения(ПроверяемоеЗначение, Сообщение, ОбъектПроверки, Контекст);
ВызватьОшибкуПроверки(ТекстСообщения);
ТекстСообщения = ФорматированныйТекстОшибкиУтверждения(ОписаниеПроверки, Сообщение, ОбъектПроверки);
ВызватьОшибкуПроверки(ТекстСообщения, ОписаниеПроверки);
КонецПроцедуры
@ -160,9 +165,10 @@
// Служебный метод, предварительно нужно самостоятельно настроить контекст (см. ЮТКонтекст.КонтекстОшибки)
// Параметры:
// ТекстСообщения - Строка
Процедура ВызватьОшибкуПроверки(Знач ТекстСообщения) Экспорт
// ОписаниеПроверки - см. ЮТФабрика.ОписаниеПроверки
Процедура ВызватьОшибкуПроверки(Знач ТекстСообщения, ОписаниеПроверки = Неопределено) Экспорт
СообщениеОбОшибке = СообщениеОбОшибке(ТекстСообщения, ПрефиксОшибкиУтверждений());
СообщениеОбОшибке = СообщениеОбОшибке(ТекстСообщения, ПрефиксОшибкиУтверждений(), ОписаниеПроверки);
ВызватьИсключение СообщениеОбОшибке;
КонецПроцедуры
@ -307,20 +313,27 @@
КонецПроцедуры
Функция ФорматированныйТекстОшибкиУтверждения(Знач ПроверяемоеЗначение, ТекстОжидания, ОбъектПроверки, Контекст) Экспорт
// Форматированный текст ошибки утверждения.
//
// Параметры:
// ОписаниеПроверки - см. ЮТФабрика.ОписаниеПроверки
// ТекстОжидания - Строка - Описание ожидания
// ОбъектПроверки - Строка - Объект проверки
//
// Возвращаемое значение:
// Строка - Форматированный текст ошибки утверждения
Функция ФорматированныйТекстОшибкиУтверждения(Знач ОписаниеПроверки, ТекстОжидания, ОбъектПроверки) Экспорт
ИмяСвойства = Контекст.ИмяСвойства;
Если ЗначениеЗаполнено(ИмяСвойства) Тогда
ВставкаСвойство = СтрШаблон(" содержит свойство `%1`, которое", ИмяСвойства);
Если ЗначениеЗаполнено(ОписаниеПроверки.ОбъектПроверки.ИмяСвойства) Тогда
ВставкаСвойство = СтрШаблон(" содержит свойство `%1`, которое", ОписаниеПроверки.ОбъектПроверки.ИмяСвойства);
Иначе
ВставкаСвойство = "";
КонецЕсли;
Если ЗначениеЗаполнено(Контекст.ПредставлениеПроверяемогоЗначения) Тогда
ПредставлениеЗначения = Контекст.ПредставлениеПроверяемогоЗначения;
Если ЗначениеЗаполнено(ОписаниеПроверки.ОбъектПроверки.Представление) Тогда
ПредставлениеЗначения = ОписаниеПроверки.ОбъектПроверки.Представление;
Иначе
ПредставлениеЗначения = СтрШаблон("`%1`", Контекст.ПроверяемоеЗначение);
ПредставлениеЗначения = СтрШаблон("`%1`", ОписаниеПроверки.ОбъектПроверки.Значение);
КонецЕсли;
// Заголовок сообщения
@ -336,6 +349,20 @@
КонецФункции
Функция ДобавитьОписания(ТекстОшибки, ОписаниеПроверки = Неопределено) Экспорт
Если ОписаниеПроверки <> Неопределено Тогда
ПрефиксОшибки = ЮТОбщий.ДобавитьСтроку(ОписаниеПроверки.ПрефиксОшибки, ОписаниеПроверки.ОписаниеПроверки, " ");
СообщениеОбОшибке = ЮТОбщий.ДобавитьСтроку(ПрефиксОшибки, ТекстОшибки, ": ");
Иначе
СообщениеОбОшибке = ТекстОшибки;
КонецЕсли;
СообщениеОбОшибке = ВРег(Лев(СообщениеОбОшибке, 1)) + Сред(СообщениеОбОшибке, 2);
Возврат СообщениеОбОшибке;
КонецФункции
Процедура ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, Ошибка) Экспорт
РезультатПроверки.Успешно = Ложь;
@ -517,21 +544,17 @@
КонецПроцедуры
Процедура ВызватьОшибкуИсполнения(Знач ИнформацияОбОшибке)
Процедура ВызватьОшибкуИсполнения(Знач ИнформацияОбОшибке, ОписаниеПроверки)
ТекстОшибки = ИнформациюОбОшибкеВСтроку(ИнформацияОбОшибке);
СообщениеОбОшибке = СообщениеОбОшибке(ТекстОшибки, ПрефиксОшибкиВыполнения());
СообщениеОбОшибке = СообщениеОбОшибке(ТекстОшибки, ПрефиксОшибкиВыполнения(), ОписаниеПроверки);
ВызватьИсключение СообщениеОбОшибке;
КонецПроцедуры
Функция СообщениеОбОшибке(ТекстОшибки, ПрефиксТипаОшибки)
Функция СообщениеОбОшибке(ТекстОшибки, ПрефиксТипаОшибки, ОписаниеПроверки = Неопределено) Экспорт
Контекст = ЮТКонтекст.КонтекстПроверки();
ПрефиксОшибки = ЮТОбщий.ДобавитьСтроку(Контекст.ПрефиксОшибки, Контекст.ОписаниеПроверки, " ");
СообщениеОбОшибке = ЮТОбщий.ДобавитьСтроку(ПрефиксОшибки, ТекстОшибки, ": ");
СообщениеОбОшибке = ВРег(Лев(СообщениеОбОшибке, 1)) + Сред(СообщениеОбОшибке, 2);
СообщениеОбОшибке = ДобавитьОписания(ТекстОшибки, ОписаниеПроверки);
Возврат СтрШаблон("%1 <%2>", ПрефиксТипаОшибки, СообщениеОбОшибке);

View File

@ -33,7 +33,12 @@
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
Процедура ПередВсемиТестамиМодуля(ТестовыйМодуль) Экспорт
ЮТКонтекст.УстановитьКонтекстМодуля(Новый Структура());
Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
КонтекстИсполнения.Уровень = Уровни.Модуль;
КонтекстИсполнения.Модуль = ТестовыйМодуль;
ЮТКонтекст.УстановитьКонтекстМодуля();
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль);
ВызватьОбработкуСобытия("ПередВсемиТестами", ОписаниеСобытия);
@ -47,7 +52,12 @@
// Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Процедура ПередТестовымНабором(ТестовыйМодуль, Набор) Экспорт
ЮТКонтекст.УстановитьКонтекстНабораТестов(Новый Структура());
Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
КонтекстИсполнения.Уровень = Уровни.НаборТестов;
КонтекстИсполнения.Набор = Набор;
ЮТКонтекст.УстановитьКонтекстНабораТестов();
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор);
ВызватьОбработкуСобытия("ПередТестовымНабором", ОписаниеСобытия);
@ -62,21 +72,25 @@
// Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста
Процедура ПередКаждымТестом(ТестовыйМодуль, Набор, Тест) Экспорт
Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
КонтекстИсполнения.Уровень = Уровни.Тест;
КонтекстИсполнения.Тест = Тест;
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор, Тест);
ЮТКонтекст.УстановитьКонтекстТеста(Новый Структура());
ЮТКонтекст.УстановитьКонтекстТеста();
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
ПолучитьСообщенияПользователю(Истина);
#КонецЕсли
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если ВТранзакции(ОписаниеСобытия) Тогда
Если ЮТНастройкиВыполнения.ВТранзакции() Тогда
НачатьТранзакцию();
КонецЕсли;
#КонецЕсли
ВызватьОбработкуСобытия("ПередКаждымТестом", ОписаниеСобытия);
ВызватьОбработкуСобытия("ПередТестом", ОписаниеСобытия);
ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПередКаждымТестом", "ПередТестом"), ОписаниеСобытия);
КонецПроцедуры
@ -90,11 +104,10 @@
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор, Тест);
ВызватьОбработкуСобытия("ПослеТеста", ОписаниеСобытия);
ВызватьОбработкуСобытия("ПослеКаждогоТеста", ОписаниеСобытия);
ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПослеТеста", "ПослеКаждогоТеста"), ОписаниеСобытия);
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если ВТранзакции(ОписаниеСобытия) Тогда
Если ЮТНастройкиВыполнения.ВТранзакции() Тогда
ОтменитьТранзакцию();
Пока ТранзакцияАктивна() Цикл
ОтменитьТранзакцию();
@ -103,6 +116,11 @@
КонецЕсли;
#КонецЕсли
Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
КонтекстИсполнения.Уровень = Уровни.НаборТестов;
КонтекстИсполнения.Тест = Неопределено;
КонецПроцедуры
// Обработчик события "ПослеТестовогоНабора"
@ -115,6 +133,11 @@
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль, Набор);
ВызватьОбработкуСобытия("ПослеТестовогоНабора", ОписаниеСобытия);
Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
КонтекстИсполнения.Уровень = Уровни.Модуль;
КонтекстИсполнения.Набор = Неопределено;
КонецПроцедуры
// Обработчик события "ПослеВсехТестовМодуля"
@ -126,6 +149,10 @@
ОписаниеСобытия = ЮТФабрика.ОписаниеСобытияИсполненияТестов(ТестовыйМодуль);
ВызватьОбработкуСобытия("ПослеВсехТестов", ОписаниеСобытия);
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
КонтекстИсполнения.Уровень = Неопределено;
КонтекстИсполнения.Модуль = Неопределено;
КонецПроцедуры
#КонецОбласти
@ -189,13 +216,31 @@
#Область СлужебныеПроцедурыИФункции
Процедура ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия)
Процедура ВызватьОбработкуСобытий(События, ОписаниеСобытия)
ЭтоСобытиеПеред = СтрНачинаетсяС(ИмяСобытия, "Перед");
Для ы = 0 По События.ВГраница() Цикл
ИмяСобытия = События[ы];
ПропуститьОбработчикТестовогоМодуля = (ы > 0 И ОбработчикСобытияПереопределен(ИмяСобытия));
Если ПропуститьОбработчикТестовогоМодуля Тогда
Параметры = ЮТОбщий.ЗначениеВМассиве(ОписаниеСобытия);
Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры);
ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки);
Иначе
ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ВызватьОбработкуСобытия(ИмяСобытия, ОписаниеСобытия)
Параметры = ЮТОбщий.ЗначениеВМассиве(ОписаниеСобытия);
Если ЭтоСобытиеПеред Тогда
Если ЭтоСобытиеПеред(ИмяСобытия) Тогда
Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры);
ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия);
Иначе
@ -203,9 +248,7 @@
Ошибки = ВызватьОбработчикРасширения(ИмяСобытия, Параметры);
КонецЕсли;
Для Каждого Ошибка Из Ошибки Цикл
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибка);
КонецЦикла;
ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки);
КонецПроцедуры
@ -218,10 +261,10 @@
Если ЮТОбщий.МетодМодуляСуществует(ИмяМодуля, ИмяСобытия) Тогда
ПолноеИмяМетода = СтрШаблон("%1.%2", ИмяМодуля, ИмяСобытия);
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода, ПараметрыСобытия);
КонецЕсли;
Если Ошибка <> Неопределено Тогда
Ошибки.Добавить(Ошибка);
Если Ошибка <> Неопределено Тогда
Ошибки.Добавить(Ошибка);
КонецЕсли;
КонецЕсли;
КонецЦикла;
@ -236,28 +279,77 @@
// ИмяСобытия - Строка - Имя вызываемого метода обработки события
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
//
Процедура ВызватьОбработчикТестовогоМодуля(ИмяСобытия, ОписаниеСобытия)
Процедура ВызватьОбработчикТестовогоМодуля(Знач ИмяСобытия, ОписаниеСобытия)
ОбработчикСобытияПереопределен = ОбработчикСобытияПереопределен(ИмяСобытия);
Если ОбработчикСобытияПереопределен Тогда
ИмяСобытия = ПереопределенноеИмяСобытия(ИмяСобытия);
КонецЕсли;
ИмяМодуля = ОписаниеСобытия.Модуль.МетаданныеМодуля.Имя;
Ошибка = Неопределено;
ЧастиКоманды = СтрРазделить(ИмяСобытия, ".");
Если ЧастиКоманды.Количество() = 2 Тогда
ИмяМодуля = ЧастиКоманды[0];
ИмяСобытия = ЧастиКоманды[1];
КонецЕсли;
Ошибки = Новый Массив();
Команда = СтрШаблон("%1.%2()", ИмяМодуля, ИмяСобытия);
Если ЮТОбщий.МетодМодуляСуществует(ИмяМодуля, ИмяСобытия) Тогда
Команда = СтрШаблон("%1.%2()", ИмяМодуля, ИмяСобытия);
Ошибка = ЮТОбщий.ВыполнитьМетод(Команда);
Если Ошибка <> Неопределено Тогда
Ошибки.Добавить(Ошибка);
КонецЕсли;
ИначеЕсли ОбработчикСобытияПереопределен Тогда
ТекстИсключения = СтрШаблон("Не найден обработчик тестового модуля %1", Команда);
ВызватьИсключение ТекстИсключения
КонецЕсли;
Если Ошибка <> Неопределено Тогда
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибка);
КонецЕсли;
ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки);
КонецПроцедуры
Функция ВТранзакции(ОписаниеСобытия)
Процедура ЗарегистрироватьОшибкиСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибки)
ИмяПараметра = ЮТФабрика.ПараметрыИсполненияТеста().ВТранзакции;
Для Каждого Ошибка Из Ошибки Цикл
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибка);
КонецЦикла;
Возврат ЮТНастройкиВыполнения.ЗначениеНастройкиТеста(ИмяПараметра, ОписаниеСобытия.Тест, ОписаниеСобытия.Набор, Ложь);
КонецПроцедуры
Функция ОбработчикСобытияПереопределен(ИмяСобытия)
Возврат ЗначениеЗаполнено(ПереопределенноеИмяСобытия(ИмяСобытия));
КонецФункции
Функция ПереопределенноеИмяСобытия(ИмяСобытия)
Если ЭтоСобытиеПеред(ИмяСобытия) Тогда
Возврат ЮТНастройкиВыполнения.Перед();
ИначеЕсли ЭтоСобытиеПосле(ИмяСобытия) Тогда
Возврат ЮТНастройкиВыполнения.После();
Иначе
Возврат "";
КонецЕсли;
КонецФункции
Функция ЭтоСобытиеПеред(ИмяСобытия)
Возврат СтрНачинаетсяС(ИмяСобытия, "Перед");
КонецФункции
Функция ЭтоСобытиеПосле(ИмяСобытия)
Возврат СтрНачинаетсяС(ИмяСобытия, "После");
КонецФункции

View File

@ -249,18 +249,33 @@
КонецПроцедуры
// Параметры проверки.
//
// Параметры:
// ВидСравнения - Строка
// ПроверяемоеЗначение - Произвольный
// ИмяСвойства - Строка
// ОжидаемоеЗначение - Произвольный
// Реверс - Булево
//
// Возвращаемое значение:
// Структура - Параметры проверки:
// * ОбъектПроверки - см. ЮТФабрика.ОписаниеПроверяемогоЗначения
// * ПрефиксОшибки - Строка, Неопределено -
// * ОписаниеПроверки - Строка, Неопределено -
// * ВидСравнения - Строка
// * ОжидаемоеЗначение - Произвольный
// * Реверс - Булево
// * ТекстПроверяемоеЗначение - Строка
Функция ПараметрыПроверки(ВидСравнения, ПроверяемоеЗначение, ИмяСвойства, ОжидаемоеЗначение, Реверс = Ложь) Экспорт
Параметры = Новый Структура();
Параметры = ЮТФабрика.ОписаниеПроверки(ПроверяемоеЗначение);
Параметры.ОбъектПроверки.ИмяСвойства = ИмяСвойства;
Параметры.Вставить("ВидСравнения", ВидСравнения);
Параметры.Вставить("ПроверяемоеЗначение", ПроверяемоеЗначение);
Параметры.Вставить("ОжидаемоеЗначение", ОжидаемоеЗначение);
Параметры.Вставить("ИмяСвойства", ИмяСвойства);
Параметры.Вставить("Реверс", Реверс);
Параметры.Вставить("ОбъектПроверки", Неопределено);
Параметры.Вставить("ОписаниеПроверки", Неопределено);
Параметры.Вставить("ПредставлениеПроверяемогоЗначения", Неопределено);
Параметры.Вставить("ТекстПроверяемоеЗначение", "проверяемое значение");
Возврат Параметры;
@ -503,22 +518,11 @@
Процедура ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ФактическоеЗначение)
ШаблонСообщения = ЮТПредикатыКлиентСервер.ШаблонВыражения(ПараметрыПроверки.ВидСравнения);
Сообщение = СтрШаблон(ШаблонСообщения, ПараметрыПроверки.ОжидаемоеЗначение);
Если ЗначениеЗаполнено(ПараметрыПроверки.ПредставлениеПроверяемогоЗначения) Тогда
ПредставлениеЗначения = ПараметрыПроверки.ПредставлениеПроверяемогоЗначения;
Иначе
ПредставлениеЗначения = СтрШаблон("`%1`", ПараметрыПроверки.ПроверяемоеЗначение);
КонецЕсли;
ТекстОшибки = ЮТРегистрацияОшибок.ФорматированныйТекстОшибкиУтверждения(ПараметрыПроверки, Сообщение, ПараметрыПроверки.ТекстПроверяемоеЗначение);
ТекстОшибки = ЮТРегистрацияОшибок.ДобавитьОписания(ТекстОшибки, ПараметрыПроверки);
ТекстОшибки = ЮТРегистрацияОшибок.ФорматированныйТекстОшибкиУтверждения(ПредставлениеЗначения,
Сообщение,
ПараметрыПроверки.ОбъектПроверки,
ПараметрыПроверки);
ТекстОшибки = ЮТОбщий.ДобавитьСтроку(ПараметрыПроверки.ОписаниеПроверки, ТекстОшибки, ": ");
ТекстОшибки = ВРег(Лев(ТекстОшибки, 1)) + Сред(ТекстОшибки, 2);
ЮТРегистрацияОшибок.ДобавитьОшибкуСравненияКРезультатуПроверки(РезультатПроверки,
ТекстОшибки,
ФактическоеЗначение,
@ -535,10 +539,10 @@
// Произвольный
Функция ПроверяемоеЗначение(ПараметрыПроверки)
Если ПараметрыПроверки.ИмяСвойства <> Неопределено Тогда
Значение = ЗначениеСвойства(ПараметрыПроверки.ПроверяемоеЗначение, ПараметрыПроверки.ИмяСвойства);
Если ПараметрыПроверки.ОбъектПроверки.ИмяСвойства <> Неопределено Тогда
Значение = ЗначениеСвойства(ПараметрыПроверки.ОбъектПроверки.Значение, ПараметрыПроверки.ОбъектПроверки.ИмяСвойства);
Иначе
Значение = ПараметрыПроверки.ПроверяемоеЗначение;
Значение = ПараметрыПроверки.ОбъектПроверки.Значение;
КонецЕсли;
Возврат Значение;

View File

@ -29,7 +29,20 @@
// ЛюбаяСсылка - Ссылка на созданный объект
Функция СоздатьЭлемент(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено) Экспорт
Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЭлемент(Менеджер, Наименование, Реквизиты);
Если Реквизиты <> Неопределено Тогда
Данные = Реквизиты;
Иначе
Данные = Новый Структура;
КонецЕсли;
Если ЗначениеЗаполнено(Наименование) Тогда
Данные.Вставить("Наименование", Наименование);
КонецЕсли;
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Менеджер, Данные, Неопределено, Ложь);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
Возврат Ссылка;
КонецФункции
@ -43,7 +56,45 @@
// ДокументСсылка - Ссылка на созданный объект
Функция СоздатьДокумент(Менеджер, Реквизиты = Неопределено) Экспорт
Возврат ЮТТестовыеДанныеВызовСервера.СоздатьДокумент(Менеджер, Реквизиты);
Если Реквизиты <> Неопределено Тогда
Данные = Реквизиты;
Иначе
Данные = Новый Структура;
КонецЕсли;
Если Данные.Свойство("РежимЗаписи") Тогда
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.РежимЗаписи = Данные.РежимЗаписи;
Данные.Удалить("РежимЗаписи");
КонецЕсли;
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, Ложь);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
Возврат Ссылка;
КонецФункции
// Создает новую группу
//
// Параметры:
// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд.
// Наименование - Строка, Неопределено - Наименование элемента
// Реквизиты - Структура, Неопределено - Значения реквизитов элемента
//
// Возвращаемое значение:
// ЛюбаяСсылка - Ссылка на созданную группу
Функция СоздатьГруппу(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено) Экспорт
Если Реквизиты <> Неопределено Тогда
Данные = Реквизиты;
Иначе
Данные = Новый Структура;
КонецЕсли;
Данные.Вставить("ЭтоГруппа", Истина);
Возврат СоздатьЭлемент(Менеджер, Наименование, Данные);
КонецФункции
@ -117,12 +168,17 @@
// Параметры:
// Длина - Число - Длина генерируемой строки, без учета префикса
// Префикс - Строка - Префикс строки
// ДопустимыеСимволы - Строка - Допустимые символы из которая будет формироваться случайно строка
//
// Возвращаемое значение:
// Строка - Случайная строка
Функция СлучайнаяСтрока(Знач Длина = 10, Префикс = "") Экспорт
Функция СлучайнаяСтрока(Знач Длина = 10, Префикс = "", ДопустимыеСимволы = Неопределено) Экспорт
Строка = "1234567890абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Если ДопустимыеСимволы = Неопределено Тогда
Строка = "1234567890абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
Иначе
Строка = ДопустимыеСимволы;
КонецЕсли;
Результат = "";
КоличествоСимволов = СтрДлина(Строка);
@ -259,9 +315,7 @@
// Строка
Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт
Результат = ПолучитьИмяВременногоФайла(Расширение);
ЮТКонтекст.КонтекстТеста().ВременныеФайлы.Добавить(Результат);
Возврат Результат;
Возврат ЮТТестовыеДанныеСлужебный.НовоеИмяВременногоФайла(Расширение);
КонецФункции
@ -308,7 +362,7 @@
Если ЗагрузилиЗаголовок Тогда
Если Блоки.Количество() <> Ключи.Количество() Тогда
ВызватьИсключение СтрШаблон("Количество значений в строке (%1) Markdown не совпадает с количеством заголовков (2):
ВызватьИсключение СтрШаблон("Количество значений в строке (%1) Markdown не совпадает с количеством заголовков (%2):
|%3", Блоки.Количество(), Ключи.Количество(), Строка);
КонецЕсли;
@ -357,6 +411,29 @@
КонецФункции
// Формирует массив различных комбиначий параметров
//
// Предназначено для формирования таблицы возможных значений параметров для краш теста метода.
//
// Параметры:
// ЗначенияПоУмолчанию - Структура - Значения параметров по умолчанию.
// ЗначенияПараметров - Структура - Массивы значений для каждого параметра.
//
// Возвращаемое значение:
// Массив из Структура - Варианты параметров.
Функция ВариантыПараметров(ЗначенияПоУмолчанию, ЗначенияПараметров) Экспорт
Варианты = Новый Массив;
Варианты.Добавить(ЗначенияПоУмолчанию);
Ключи = ЮТОбщий.ВыгрузитьЗначения(ЗначенияПараметров, "Ключ");
ДобавитьВарианты(Варианты, ЗначенияПоУмолчанию, ЗначенияПараметров, Ключи, 0);
Возврат Варианты;
КонецФункции
// Возвращает конструктор создания тестовых данных
//
// Конструктор имеет ряд особенностей:
@ -379,10 +456,10 @@
// Менеджер - Строка - Имя менеджера. Примеры: Справочники.Товары, Документы.ПриходТоваров
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
// ОбработкаОбъект.ЮТКонструкторТестовыхДанных
Функция КонструкторОбъекта(Менеджер) Экспорт
Возврат ЮТКонструкторТестовыхДанных.Инициализировать(Менеджер);
Возврат ЮТКонструкторТестовыхДанныхСлужебный.Инициализировать(Менеджер);
КонецФункции
@ -392,10 +469,20 @@
// Ссылки - Массив из ЛюбаяСсылка
Процедура Удалить(Ссылки) Экспорт
ЮТТестовыеДанныеВызовСервера.Удалить(Ссылки);
Если ЗначениеЗаполнено(Ссылки) Тогда
ЮТТестовыеДанныеВызовСервера.Удалить(Ссылки);
КонецЕсли;
КонецПроцедуры
// Возвращает объект подражателя для формирования осмысленных тестовых данных
//
// Возвращаемое значение:
// ОбщийМодуль - Подражатель
Функция Подражатель() Экспорт
Возврат ЮТПодражательСлужебный.Инициализировать();
КонецФункции
#Если Сервер Тогда
// Возвращает мок для `HTTPСервисЗапрос`.
//
@ -410,64 +497,6 @@
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Обработчик события "ПередКаждымТестом"
//
// Параметры:
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
Процедура ПередКаждымТестом(ОписаниеСобытия) Экспорт
ЮТКонтекст.КонтекстТеста().Вставить("ВременныеФайлы", Новый Массив);
КонецПроцедуры
// Обработчик события "ПослеКаждогоТеста"
//
// Параметры:
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
ВременныеФайлы = ЮТКонтекст.КонтекстТеста().ВременныеФайлы;
Если ВременныеФайлы.Количество() = 0 Тогда
Возврат;
КонецЕсли;
Ошибки = Новый Массив();
Для Каждого УдаляемыйФайл Из ВременныеФайлы Цикл
Если ТипЗнч(УдаляемыйФайл) = Тип("Строка") Тогда
УдаляемыйФайл = Новый Файл(УдаляемыйФайл);
КонецЕсли;
Попытка
Если УдаляемыйФайл.Существует() Тогда
Если УдаляемыйФайл.ПолучитьТолькоЧтение() Тогда
УдаляемыйФайл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
УдалитьФайлы(УдаляемыйФайл.ПолноеИмя);
КонецЕсли;
Исключение
Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление файла " + УдаляемыйФайл, ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
Если ЗначениеЗаполнено(Ошибки) Тогда
ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура ДобавитьВарианты(Варианты, БазоваяСтруктура, ЗначенияПараметров, Ключи, Инд)
@ -489,4 +518,4 @@
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@ -18,87 +18,49 @@
#Область СлужебныйПрограммныйИнтерфейс
// СоздатьЭлемент
// Создает новый элемент и возвращает его ссылку
// Параметры:
// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд.
// Наименование - Строка, Неопределено - Наименование элемента
// Реквизиты - Структура, Неопределено - Значения реквизитов элемента
//
// Возвращаемое значение:
// ЛюбаяСсылка - Ссылка на созданный объект
Функция СоздатьЭлемент(Знач Менеджер, Знач Наименование = Неопределено, Знач Реквизиты = Неопределено) Экспорт
Функция СоздатьЗапись(Знач Менеджер, Знач Данные, Знач ПараметрыЗаписи, Знач ВернутьОбъект) Экспорт
Менеджер = ЮТОбщий.Менеджер(Менеджер);
Объект = Менеджер.СоздатьЭлемент();
Если ЗначениеЗаполнено(Наименование) Тогда
Объект.Наименование = Наименование;
ИначеЕсли Объект.Метаданные().ДлинаНаименования > 0 Тогда
Объект.Наименование = ЮТТестовыеДанные.УникальнаяСтрока();
Если ПараметрыЗаписи = Неопределено Тогда
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
Иначе
ПереданныеПараметрыЗаписи = ПараметрыЗаписи;
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ЗаполнитьЗначенияСвойств(ПараметрыЗаписи, ПереданныеПараметрыЗаписи);
КонецЕсли;
Если Реквизиты <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(Объект, Реквизиты);
Объект = НовыйОбъект(Менеджер, Данные, ПараметрыЗаписи.ДополнительныеСвойства);
ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектМетаданных(ТипЗнч(Менеджер));
РежимЗаписи = ?(СтрСравнить(ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя, "Документ") = 0, ПараметрыЗаписи.РежимЗаписи, Неопределено);
КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи.ОбменДаннымиЗагрузка, РежимЗаписи);
Если ВернутьОбъект Тогда
Возврат Объект;
Иначе
Возврат КлючЗаписи;
КонецЕсли;
Если Объект.Метаданные().ДлинаКода И НЕ ЗначениеЗаполнено(Объект.Код) Тогда
Объект.УстановитьНовыйКод();
КонецЕсли;
ЗаписатьОбъект(Объект);
Возврат Объект.Ссылка;
КонецФункции
// СоздатьДокумент
// Создает новый документ и возвращает его ссылку
// Параметры:
// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд.
// Реквизиты - Структура, Неопределено - Значения реквизитов элемента
//
// Возвращаемое значение:
// ДокументСсылка - Ссылка на созданный объект
Функция СоздатьДокумент(Знач Менеджер, Знач Реквизиты = Неопределено) Экспорт
РежимЗаписи = РежимЗаписиДокумента.Запись;
Менеджер = ЮТОбщий.Менеджер(Менеджер);
Объект = Менеджер.СоздатьДокумент();
Объект.Дата = ТекущаяДатаСеанса();
Объект.УстановитьНовыйНомер();
Если Реквизиты <> Неопределено Тогда
ЗаполнитьЗначенияСвойств(Объект, Реквизиты);
РежимЗаписи = ЮТОбщий.ЗначениеСтруктуры(Реквизиты, "РежимЗаписи", РежимЗаписи);
КонецЕсли;
ЗаписатьОбъект(Объект, , РежимЗаписи);
Возврат Объект.Ссылка;
КонецФункции
// Создать запись.
// Создает новый объект и заполняет его данными
//
// Параметры:
// Менеджер - Произвольный
// Данные - Структура - Данные заполнения объекта
// ПараметрыЗаписи - см. ЮТОбщий.
// ВернутьОбъект - Булево - Вернуть объект
// ДополнительныеСвойства - Структура - Дополнительные свойства объекта
//
// Возвращаемое значение:
// Произвольный - Создать запись
Функция СоздатьЗапись(Знач Менеджер, Знач Данные, Знач ПараметрыЗаписи = Неопределено, Знач ВернутьОбъект = Ложь) Экспорт
// Произвольный - Созданный объект
Функция НовыйОбъект(Знач Менеджер, Знач Данные, Знач ДополнительныеСвойства = Неопределено) Экспорт
Менеджер = ЮТОбщий.Менеджер(Менеджер);
ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектМетаданных(ТипЗнч(Менеджер));
Объект = СоздатьОбъект(Менеджер, ОписаниеОбъектаМетаданных.ОписаниеТипа);
Объект = СоздатьОбъект(Менеджер, ОписаниеОбъектаМетаданных.ОписаниеТипа, Данные);
ЗаполнитьЗначенияСвойств(Объект, Данные);
Если ОписаниеОбъектаМетаданных.ОписаниеТипа.ТабличныеЧасти Тогда
@ -119,22 +81,13 @@
КонецЕсли;
Если ПараметрыЗаписи = Неопределено Тогда
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
Иначе
ПереданныеПараметрыЗаписи = ПараметрыЗаписи;
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ЗаполнитьЗначенияСвойств(ПараметрыЗаписи, ПереданныеПараметрыЗаписи);
КонецЕсли;
ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных);
ЮТОбщий.ОбъединитьВСтруктуру(Объект.ДополнительныеСвойства, ПараметрыЗаписи.ДополнительныеСвойства);
Если ОписаниеОбъектаМетаданных.ОписаниеТипа.Ссылочный И ДополнительныеСвойства <> Неопределено Тогда
ЮТОбщий.ОбъединитьВСтруктуру(Объект.ДополнительныеСвойства, ДополнительныеСвойства);
КонецЕсли;
РежимЗаписи = ?(СтрСравнить(ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя, "Документ") = 0, ПараметрыЗаписи.РежимЗаписи, Неопределено);
ЗаписатьОбъект(Объект, ПараметрыЗаписи.ОбменДаннымиЗагрузка, РежимЗаписи);
Возврат ?(ВернутьОбъект, Объект, Объект.Ссылка);
Возврат Объект;
КонецФункции
@ -144,15 +97,46 @@
Ссылки = ЮТОбщий.ЗначениеВМассиве(Ссылки);
КонецЕсли;
СсылочныеТипы = ЮТОбщий.ОписаниеТиповЛюбаяСсылка();
Ошибки = Новый Массив;
Для Каждого Ссылка Из Ссылки Цикл
Ссылка.ПолучитьОбъект().Удалить();
ТипЗначения = ТипЗнч(Ссылка);
Если Ссылка = Неопределено ИЛИ СтрНачинаетсяС(ЮТОбщий.ПредставлениеТипа(ТипЗначения), "Enum") Тогда
Продолжить;
КонецЕсли;
Попытка
Если СсылочныеТипы.СодержитТип(ТипЗначения) Тогда
Объект = Ссылка.ПолучитьОбъект();
Если Объект <> Неопределено Тогда
Объект.Удалить();
КонецЕсли;
Иначе
Менеджер = Менеджер(ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗначения, Ложь));
Запись = Менеджер.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, Ссылка);
Запись.Прочитать();
Запись.Удалить();
КонецЕсли;
Исключение
Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление " + Ссылка, ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
ОбновитьНумерациюОбъектов();
Если ЗначениеЗаполнено(Ошибки) Тогда
ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
КонецЕсли;
КонецПроцедуры
Функция ФикцияЗначенияБазы(Знач ТипЗначения) Экспорт
Функция ФикцияЗначенияБазы(Знач ТипЗначения, Знач РеквизитыЗаполнения = Неопределено) Экспорт
ОбъектМетаданных = Метаданные.НайтиПоТипу(ТипЗначения);
@ -174,13 +158,15 @@
ИмяТипаМенеджера = СтрШаблон("%1Менеджер.%2", ОписаниеТипа.Имя, ОбъектМетаданных.Имя);
Менеджер = Новый (ИмяТипаМенеджера);
Объект = СоздатьОбъект(Менеджер, ОписаниеТипа);
Объект = СоздатьОбъект(Менеджер, ОписаниеТипа, РеквизитыЗаполнения);
Если ЗначениеЗаполнено(РеквизитыЗаполнения) Тогда
ЗаполнитьЗначенияСвойств(Объект, РеквизитыЗаполнения);
КонецЕсли;
ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных);
ЗаписатьОбъект(Объект);
Возврат Объект.Ссылка;
Возврат ЗаписатьОбъект(Объект);
КонецФункции
@ -194,13 +180,20 @@
// См. ОписаниеМенеджера
// Менеджер - Произвольный - Менеджер
// ОписаниеТипа - см. ЮТМетаданные.ОписаниеОбъектМетаданных
//
// Данные - Структура
// Возвращаемое значение:
// Произвольный - Создать объект
Функция СоздатьОбъект(Менеджер, ОписаниеТипа)
Функция СоздатьОбъект(Менеджер, ОписаниеТипа, Данные)
Если ОписаниеТипа.Конструктор = "СоздатьЭлемент" Тогда
Результат = Менеджер.СоздатьЭлемент();
ЭтоГруппа = ?(Данные = Неопределено, Ложь, ЮТОбщий.ЗначениеСтруктуры(Данные, "ЭтоГруппа", Ложь));
Если ЭтоГруппа Тогда
Результат = Менеджер.СоздатьГруппу();
Иначе
Результат = Менеджер.СоздатьЭлемент();
КонецЕсли;
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьДокумент" Тогда
Результат = Менеджер.СоздатьДокумент();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьСчет" Тогда
@ -211,6 +204,8 @@
Результат = Менеджер.СоздатьУзел();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьНаборЗаписей" Тогда
Результат = Менеджер.СоздатьНаборЗаписей();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьМенеджерЗаписи" Тогда
Результат = Менеджер.СоздатьМенеджерЗаписи();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьБизнесПроцесс" Тогда
Результат = Менеджер.СоздатьБизнесПроцесс();
ИначеЕсли ОписаниеТипа.Конструктор = "СоздатьЗадачу" Тогда
@ -220,10 +215,10 @@
КонецЕсли;
Возврат Результат;
КонецФункции
Процедура ЗаписатьОбъект(Объект, ОбменДаннымиЗагрузка = Ложь, РежимЗаписи = Неопределено)
Функция ЗаписатьОбъект(Объект, ОбменДаннымиЗагрузка = Ложь, РежимЗаписи = Неопределено)
Если ОбменДаннымиЗагрузка Тогда
Объект.ОбменДанными.Загрузка = Истина;
@ -237,6 +232,12 @@
Объект.Записать();
КонецЕсли;
Если ОбменДаннымиЗагрузка Тогда
Объект.ОбменДанными.Загрузка = Ложь;
КонецЕсли;
Возврат КлючЗаписи(Объект);
Исключение
Сообщение = СтрШаблон("Не удалось записать объект `%1` (%2)
@ -245,7 +246,7 @@
КонецПопытки;
КонецПроцедуры
КонецФункции
Процедура ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных)
@ -273,4 +274,38 @@
КонецПроцедуры
Функция КлючЗаписи(Объект)
ПредставлениеТипа = ЮТОбщий.ПредставлениеТипа(ТипЗнч(Объект));
Если СтрНайти(ПредставлениеТипа, "Object.") Тогда
Возврат Объект.Ссылка;
ИначеЕсли СтрНайти(ПредставлениеТипа, "менеджер записи:") Тогда // TODO
Описание = ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗнч(Объект));
КлючевыеРеквизиты = Новый Структура();
Для Каждого Реквизит Из Описание.Реквизиты Цикл
Если Реквизит.Значение.ЭтоКлюч Тогда
КлючевыеРеквизиты.Вставить(Реквизит.Ключ, Объект[Реквизит.Ключ]);
КонецЕсли;
КонецЦикла;
Менеджер = Менеджер(Описание);
Возврат Менеджер.СоздатьКлючЗаписи(КлючевыеРеквизиты);
Иначе
Сообщение = ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.КлючЗаписи", Объект);
ВызватьИсключение Сообщение;
КонецЕсли;
КонецФункции
Функция Менеджер(ОписаниеОбъектМетаданных)
Возврат Новый(СтрШаблон("%1Менеджер.%2", ОписаниеОбъектМетаданных.ОписаниеТипа.Имя, ОписаниеОбъектМетаданных.Имя));
КонецФункции
#КонецОбласти

View File

@ -22,10 +22,12 @@
//
// Параметры:
// ОписаниеТипа - ОписаниеТипов
// РеквизитыЗаполнения - Структура - Значения реквизитов заполнения создаваемого объекта базы
// - Неопределено
//
// Возвращаемое значение:
// Произвольный
Функция Фикция(ОписаниеТипа) Экспорт
Функция Фикция(ОписаниеТипа, РеквизитыЗаполнения = Неопределено) Экспорт
Если ОписаниеТипа.Типы().Количество() > 1 Тогда
НомерТипа = ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(ОписаниеТипа.Типы().Количество());
@ -38,14 +40,7 @@
Если Тип = Тип("Число") Тогда
МаксимальноеЗначение = 4294967295;
Если ОписаниеТипа.КвалификаторыЧисла.ДопустимыйЗнак = ДопустимыйЗнак.Неотрицательный ИЛИ ЮТТестовыеДанные.СлучайноеБулево() Тогда
МаксимальноеЗначение = ОписаниеТипа.ПривестиЗначение(МаксимальноеЗначение);
Значение = ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(МаксимальноеЗначение, ОписаниеТипа.КвалификаторыЧисла.РазрядностьДробнойЧасти);
Иначе
МаксимальноеЗначение = ОписаниеТипа.ПривестиЗначение(-МаксимальноеЗначение);
Значение = ЮТТестовыеДанные.СлучайноеОтрицательноеЧисло(МаксимальноеЗначение, ОписаниеТипа.КвалификаторыЧисла.РазрядностьДробнойЧасти);
КонецЕсли;
Значение = ФиктивноеЧисло(ОписаниеТипа);
ИначеЕсли Тип = Тип("Строка") Тогда
@ -66,20 +61,83 @@
ИначеЕсли ЭтоСистемноеПеречисление(Тип) Тогда
Значение = СлучайноЗначениеСистемногоПеречисления(Тип);
Иначе
Значение = ЮТТестовыеДанныеВызовСервера.ФикцияЗначенияБазы(Тип);
Значение = ЮТТестовыеДанныеВызовСервера.ФикцияЗначенияБазы(Тип, РеквизитыЗаполнения);
ДобавитьТестовуюЗапись(Значение);
КонецЕсли;
Если Значение = Неопределено Тогда
ВызватьИсключение СтрШаблон("Создание фейковых значений для `%1` не поддерживается", ОписаниеТипа);
КонецЕсли;
Возврат ОписаниеТипа.ПривестиЗначение(Значение);
КонецФункции
// см. ЮТТестовыеДанные.НовоеИмяВременногоФайла
Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт
//@skip-check missing-temporary-file-deletion
Результат = ПолучитьИмяВременногоФайла(Расширение); // BSLLS:MissingTemporaryFileDeletion-off
ДобавитьВременныйФайл(Результат);
Возврат Результат;
КонецФункции
Процедура ДобавитьВременныйФайл(Файл) Экспорт
БуферВременныеФайлы().Добавить(Файл);
КонецПроцедуры
Процедура ДобавитьТестовуюЗапись(Запись) Экспорт
#Если Сервер Тогда
Если ТранзакцияАктивна() И ЮТНастройкиВыполнения.ВТранзакции() Тогда
Возврат;
КонецЕсли;
#КонецЕсли
Если ЮТНастройкиВыполнения.УдалениеТестовыхДанных() Тогда
БуферТестовыеДанные().Добавить(Запись);
КонецЕсли;
КонецПроцедуры
Процедура УдалитьТестовыеДанные() Экспорт
ЮТФайлы.УдалитьВременныеФайлы(БуферВременныеФайлы());
Если ЮТНастройкиВыполнения.УдалениеТестовыхДанных() Тогда
ЮТТестовыеДанные.Удалить(БуферТестовыеДанные());
КонецЕсли;
КонецПроцедуры
#Область ОбработчикиСобытий
Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста
КонецПроцедуры
Процедура ПослеТестовогоНабора(ОписаниеСобытия) Экспорт
УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста
КонецПроцедуры
Процедура ПослеВсехТестов(ОписаниеСобытия) Экспорт
УдалитьТестовыеДанные(); // Очистка тестовых данных на уровне теста
КонецПроцедуры
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -129,4 +187,46 @@
КонецФункции
Функция БуферВременныеФайлы()
Возврат Буфер("ВременныеФайлы");
КонецФункции
Функция БуферТестовыеДанные()
Возврат Буфер("ТестовыеДанные");
КонецФункции
Функция Буфер(Ключ)
ТекущийКонтекст = ЮТест.Контекст().ТекущийКонтекст();
Если ТекущийКонтекст.Свойство(Ключ) Тогда
Буфер = ТекущийКонтекст[Ключ];
Иначе
Буфер = Новый Массив();
ТекущийКонтекст.Вставить(Ключ, Буфер);
КонецЕсли;
Возврат Буфер;
КонецФункции
Функция ФиктивноеЧисло(ОписаниеТипа)
МаксимальноеЗначение = 4294967295;
Если ОписаниеТипа.КвалификаторыЧисла.ДопустимыйЗнак = ДопустимыйЗнак.Неотрицательный ИЛИ ЮТТестовыеДанные.СлучайноеБулево() Тогда
МаксимальноеЗначение = ОписаниеТипа.ПривестиЗначение(МаксимальноеЗначение);
Значение = ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(МаксимальноеЗначение, ОписаниеТипа.КвалификаторыЧисла.РазрядностьДробнойЧасти);
Иначе
МаксимальноеЗначение = ОписаниеТипа.ПривестиЗначение(-МаксимальноеЗначение);
Значение = ЮТТестовыеДанные.СлучайноеОтрицательноеЧисло(МаксимальноеЗначение, ОписаниеТипа.КвалификаторыЧисла.РазрядностьДробнойЧасти);
КонецЕсли;
Возврат Значение;
КонецФункции
#КонецОбласти

View File

@ -163,6 +163,57 @@
КонецФункции
// Устанавливает настройку удаления созданных тестовых данных
// В отличии от использования транзакции:
//
// * Умеет работать с данными созданными на клиенте
// * Только удаляет созданные данные и не откатывает изменения объектов
// * Работает с данными созданными через API работы с тестовыми данными
// * Удаляет данные созданные вне теста (в обработчиках событий, например, ПередВсемиТестами и ПередТестовымНабором)
//
// Параметры:
// УдалятьСозданныеДанные - Булево
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
Функция УдалениеТестовыхДанных(УдалятьСозданныеДанные = Истина) Экспорт
НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().УдалениеТестовыхДанных, УдалятьСозданныеДанные);
Возврат ЮТТесты;
КонецФункции
// Устанавливает настройку переопределения обработчика события Перед...
//
// Параметры:
// ВыполнитьПеред - Строка - Имя обработчика события, который будет выполнен вместо основного
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
Функция Перед(ВыполнитьПеред = "") Экспорт
НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().Перед, ВыполнитьПеред);
Возврат ЮТТесты;
КонецФункции
// Устанавливает настройку переопределения обработчика события После...
//
// Параметры:
// ВыполнитьПосле - Строка - Имя обработчика события, который будет выполнен вместо основного
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
Функция После(ВыполнитьПосле = "") Экспорт
НастройкаИсполнения(ЮТФабрика.ПараметрыИсполненияТеста().После, ВыполнитьПосле);
Возврат ЮТТесты;
КонецФункции
// Устанавливает параметры вызова теста.
//
// * Если метод вызывается первый раз, то он устанавливает параметры теста.
@ -346,12 +397,15 @@
// Возвращаемое значение:
// Структура - Исполняемые сценарии:
// * ТестовыеНаборы - Массив из см. ЮТФабрика.ОписаниеТестовогоНабора - Тестовые наборы модуля
// * НастройкиВыполнения- Структура - Настройки исполнения теста
Функция ИсполняемыеСценарии(МетаданныеМодуля)
Структура = Новый Структура;
Структура.Вставить("ТестовыеНаборы", Новый Массив());
Структура.Вставить("НастройкиВыполнения", Новый Структура());
Набор = ЮТФабрика.ОписаниеТестовогоНабора(МетаданныеМодуля.Имя);
Набор.НастройкиВыполнения = Структура.НастройкиВыполнения; // Общие настройки с набором по умолчанию
Структура.ТестовыеНаборы.Добавить(Набор);
Возврат Структура;

View File

@ -0,0 +1,300 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
///////////////////////////////////////////////////////////////////
// Предоставляет методы для формирования утверждений проверяющих данные информационной базы.
//
// Например:
//
// ```bsl
// ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары")
// .СодержитЗаписи();
// ЮТест.ОжидаетЧтоТаблицаБазы("РегистрСведений.КурсыВалют")
// .СодержитЗаписи(ЮТест.Предикат()
// .Реквизит("Валюта").Равно(ДанныеРегистра.Валюта));
// ```
///////////////////////////////////////////////////////////////////
#Область ПрограммныйИнтерфейс
// Инициализирует модуль для проверки утверждений.
//
// * Запоминает/устанавливает имя проверяемой таблицы
// * Запоминает описание.
//
// Параметры:
// ИмяТаблицы - Строка - Имя проверяемой таблицы, например, Справочник.Товары, РегистрНакопления.ТоварыНаСкладах
// ОписаниеПроверки - Строка - Описание проверки, которое будет выведено при возникновении ошибки
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
// Примеры
// ЮТест.ОжидаетЧтоТаблицаБазы("Справочник.Товары").СодержитЗаписи();
//
Функция ЧтоТаблица(ИмяТаблицы, ОписаниеПроверки = "") Экспорт
Контекст = НовыйКонтекст(ИмяТаблицы);
Контекст.ПрефиксОшибки = ОписаниеПроверки;
ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекста(), Контекст);
Возврат ЮТУтвержденияИБ;
КонецФункции
// Проверяет наличие в таблице записей удовлетворяющих условиям
//
// Параметры:
// Предикат - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - Неопределено - Проверит, что таблица не пустая
// ОписаниеУтверждения - Строка - Описание конкретного утверждения
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция СодержитЗаписи(Знач Предикат = Неопределено, Знач ОписаниеУтверждения = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеУтверждения);
Результат = ЮТЗапросы.ТаблицаСодержитЗаписи(Контекст.ОбъектПроверки.Значение, Предикат);
Если Не Результат Тогда
Контекст = Контекст();
СгенерироватьОшибкуУтверждения(Контекст, Предикат, "содержит записи");
КонецЕсли;
Возврат ЮТУтвержденияИБ;
КонецФункции
// Проверяет отсутствие в таблице записей удовлетворяющих условиям
//
// Параметры:
// Предикат - ОбщийМодуль - Условия сформированные с использованием см. ЮТест.Предикат
// - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - Неопределено - Проверит, что таблица пустая
// ОписаниеУтверждения - Строка - Описание конкретного утверждения
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция НеСодержитЗаписи(Знач Предикат = Неопределено, Знач ОписаниеУтверждения = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеУтверждения);
Результат = НЕ ЮТЗапросы.ТаблицаСодержитЗаписи(Контекст.ОбъектПроверки.Значение, Предикат);
Если Не Результат Тогда
Контекст = Контекст();
СгенерироватьОшибкуУтверждения(Контекст, Предикат, "не содержит записи");
КонецЕсли;
Возврат ЮТУтвержденияИБ;
КонецФункции
// Проверяет наличие в таблице записей с указанным наименованием
//
// Параметры:
// ОжидаемоеНаименование - Строка
// ПроверятьПометкуУдаления - Булево - Проверять пометку удаления.
// + `Истина` - Подбираются только непомеченные на удаление записи.
// + `Ложь` - пометка на удаление игнорируется
//
// ОписаниеУтверждения - Строка - Описание конкретного утверждения
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция СодержитЗаписиСНаименованием(ОжидаемоеНаименование, ПроверятьПометкуУдаления = Истина, ОписаниеУтверждения = Неопределено) Экспорт
Условия = ПредикатПоискаПоРеквизиту("Наименование", ОжидаемоеНаименование, ПроверятьПометкуУдаления);
Возврат СодержитЗаписи(Условия, ОписаниеУтверждения);
КонецФункции
// Проверяет наличие в таблице записей с указанным кодом
//
// Параметры:
// ОжидаемыйКод - Строка
// ПроверятьПометкуУдаления - Булево - Проверять пометку удаления.
// + `Истина` - Подбираются только непомеченные на удаление записи.
// + `Ложь` - пометка на удаление игнорируется
//
// ОписаниеУтверждения - Строка - Описание конкретного утверждения
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция СодержитЗаписиСКодом(ОжидаемыйКод, ПроверятьПометкуУдаления = Истина, ОписаниеУтверждения = Неопределено) Экспорт
Условия = ПредикатПоискаПоРеквизиту("Код", ОжидаемыйКод, ПроверятьПометкуУдаления);
Возврат СодержитЗаписи(Условия, ОписаниеУтверждения);
КонецФункции
// Проверяет наличие в таблице записей с указанным номером
//
// Параметры:
// ОжидаемыйНомер - Строка
// ПроверятьПометкуУдаления - Булево - Проверять пометку удаления.
// + `Истина` - Подбираются только непомеченные на удаление записи.
// + `Ложь` - пометка на удаление игнорируется
//
// ОписаниеУтверждения - Строка - Описание конкретного утверждения
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция СодержитЗаписиСНомером(ОжидаемыйНомер, ПроверятьПометкуУдаления = Истина, ОписаниеУтверждения = Неопределено) Экспорт
Условия = ПредикатПоискаПоРеквизиту("Номер", ОжидаемыйНомер, ПроверятьПометкуУдаления);
Возврат СодержитЗаписи(Условия, ОписаниеУтверждения);
КонецФункции
// Проверяет отсутствие в таблице записей с указанным наименованием
//
// Параметры:
// ОжидаемоеНаименование - Строка
// ПроверятьПометкуУдаления - Булево - Проверять пометку удаления.
// + `Истина` - Подбираются только непомеченные на удаление записи.
// + `Ложь` - пометка на удаление игнорируется
//
// ОписаниеУтверждения - Строка - Описание конкретного утверждения
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция НеСодержитЗаписиСНаименованием(ОжидаемоеНаименование, ПроверятьПометкуУдаления = Истина, ОписаниеУтверждения = Неопределено) Экспорт
Условия = ПредикатПоискаПоРеквизиту("Наименование", ОжидаемоеНаименование, ПроверятьПометкуУдаления);
Возврат НеСодержитЗаписи(Условия, ОписаниеУтверждения);
КонецФункции
// Проверяет отсутствие в таблице записей с указанным кодом
//
// Параметры:
// ОжидаемыйКод - Строка
// ПроверятьПометкуУдаления - Булево - Проверять пометку удаления.
// + `Истина` - Подбираются только непомеченные на удаление записи.
// + `Ложь` - пометка на удаление игнорируется
//
// ОписаниеУтверждения - Строка - Описание конкретного утверждения
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция НеСодержитЗаписиСКодом(ОжидаемыйКод, ПроверятьПометкуУдаления = Истина, ОписаниеУтверждения = Неопределено) Экспорт
Условия = ПредикатПоискаПоРеквизиту("Код", ОжидаемыйКод, ПроверятьПометкуУдаления);
Возврат НеСодержитЗаписи(Условия, ОписаниеУтверждения);
КонецФункции
// Проверяет отсутствие в таблице записей с указанным номером
//
// Параметры:
// ОжидаемыйНомер - Строка
// ПроверятьПометкуУдаления - Булево - Проверять пометку удаления.
// + `Истина` - Подбираются только непомеченные на удаление записи.
// + `Ложь` - пометка на удаление игнорируется
//
// ОписаниеУтверждения - Строка - Описание конкретного утверждения
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция НеСодержитЗаписиСНомером(ОжидаемыйНомер, ПроверятьПометкуУдаления = Истина, ОписаниеУтверждения = Неопределено) Экспорт
Условия = ПредикатПоискаПоРеквизиту("Номер", ОжидаемыйНомер, ПроверятьПометкуУдаления);
Возврат НеСодержитЗаписи(Условия, ОписаниеУтверждения);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область Контекст
// Контекст.
//
// Возвращаемое значение:
// см. НовыйКонтекст
Функция Контекст()
//@skip-check constructor-function-return-section
Возврат ЮТКонтекст.ЗначениеКонтекста(ИмяКонтекста());
КонецФункции
// Инициализирует контекст
//
// Параметры:
// ИмяТаблицы - Строка
//
// Возвращаемое значение:
// см. ЮТФабрика.ОписаниеПроверки
Функция НовыйКонтекст(ИмяТаблицы)
Контекст = ЮТФабрика.ОписаниеПроверки(ИмяТаблицы);
Возврат Контекст;
КонецФункции
Функция ИмяКонтекста()
Возврат "КонтекстУтвержденияИБ";
КонецФункции
#КонецОбласти
Процедура СгенерироватьОшибкуУтверждения(Контекст, Предикат, Сообщение)
Если Предикат <> Неопределено Тогда
ПредставлениеПредиката = ЮТПредикатыКлиентСервер.ПредставлениеПредикатов(Предикат, ", ", "`%1`");
КонецЕсли;
Если ЗначениеЗаполнено(ПредставлениеПредиката) Тогда
СообщениеОбОшибке = СтрШаблон("%1 с %2", Сообщение, ПредставлениеПредиката);
Иначе
СообщениеОбОшибке = Сообщение;
КонецЕсли;
ЮТРегистрацияОшибок.СгенерироватьОшибкуУтверждения(Контекст, СообщениеОбОшибке, Неопределено, "проверяемая таблица");
КонецПроцедуры
Процедура УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки)
Контекст.ОписаниеПроверки = ОписаниеПроверки;
КонецПроцедуры
Функция ПредикатПоискаПоРеквизиту(ИмяРеквизита, ЗначениеРеквизита, ПроверятьПометкуУдаления)
Условия = ЮТПредикаты.Инициализировать()
.Реквизит(ИмяРеквизита).Равно(ЗначениеРеквизита);
Если ПроверятьПометкуУдаления Тогда
Условия.Реквизит("ПометкаУдаления").Равно(Ложь);
КонецЕсли;
Возврат Условия;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="4cee0d2d-0eb6-484c-9fd3-fcf877979da8">
<name>ЮТУтвержденияИБ</name>
<synonym>
<key>ru</key>
<value>Утверждения ИБ</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -63,11 +63,17 @@
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - Параметры исполнения теста:
// * ВТранзакции - Строка - Тест должен выполняться в транзакции
// * ВТранзакции - Строка - Тест должен выполняться в транзакции
// * УдалениеТестовыхДанных - Строка - Тест должен удалить созданные тестовые данные
// * Перед - Строка - Перед тестом должен выполниться указанный обработчик события вместо основного
// * После - Строка - После теста должен выполниться указанный обработчик события вместо основного
Функция ПараметрыИсполненияТеста() Экспорт
Параметры = Новый Структура();
Параметры.Вставить("ВТранзакции", "ВТранзакции");
Параметры.Вставить("УдалениеТестовыхДанных", "УдалениеТестовыхДанных");
Параметры.Вставить("Перед", "Перед");
Параметры.Вставить("После", "После");
Возврат Новый ФиксированнаяСтруктура(Параметры);
@ -196,12 +202,14 @@
// * МетаданныеМодуля - см. ЮТФабрика.ОписаниеМодуля
// * НаборыТестов - Массив из см. ЮТФабрика.ОписаниеТестовогоНабора
// * Ошибки - Массив из см. ЮТФабрика.ОписаниеВозникшейОшибки
// * НастройкиВыполнения- Структура - Настройки исполнения теста
Функция ОписаниеТестовогоМодуля(МетаданныеМодуля, НаборыТестов) Экспорт
Описание = Новый Структура;
Описание.Вставить("МетаданныеМодуля", МетаданныеМодуля);
Описание.Вставить("НаборыТестов", НаборыТестов);
Описание.Вставить("Ошибки", Новый Массив);
Описание.Вставить("НастройкиВыполнения", Новый Структура());
Возврат Описание;
@ -540,6 +548,50 @@
КонецФункции
// Формирует описание проверяемого значения.
// Используется в утверждения для формирования дружелюбного сообщения об ошибке.
//
// Параметры:
// ПроверяемоеЗначение - Произвольный - Проверяемое значение
//
// Возвращаемое значение:
// Структура - Описание проверяемого значения:
// * Значение - Произвольный
// * Представление - Строка - Представление объекта
// - Неопределено - Если не указано тогда используется платформенное предсталение (`Строка(Значение)`)
// * ИмяСвойства - Строка, Число, Неопределено - Имя проверяемого реквизита, индекса
Функция ОписаниеПроверяемогоЗначения(ПроверяемоеЗначение) Экспорт
Описание = Новый Структура();
Описание.Вставить("Значение", ПроверяемоеЗначение);
Описание.Вставить("Представление", Неопределено);
Описание.Вставить("ИмяСвойства", Неопределено);
Возврат Описание;
КонецФункции
// Описание проверки.
//
// Параметры:
// ПроверяемоеЗначение - Произвольный
//
// Возвращаемое значение:
// Структура - Описание проверки:
// * ОбъектПроверки - см. ОписаниеПроверяемогоЗначения
// * ПрефиксОшибки - Строка, Неопределено -
// * ОписаниеПроверки - Строка, Неопределено -
Функция ОписаниеПроверки(ПроверяемоеЗначение) Экспорт
Описание = Новый Структура();
Описание.Вставить("ОбъектПроверки", ОписаниеПроверяемогоЗначения(ПроверяемоеЗначение));
Описание.Вставить("ПрефиксОшибки", Неопределено);
Описание.Вставить("ОписаниеПроверки", Неопределено);
Возврат Описание;
КонецФункции
#КонецОбласти
#Область КонструкторыКонтекстов
@ -548,11 +600,20 @@
//
// Возвращаемое значение:
// Структура - Данные контекста исполнения:
// * Уровень - Строка
// * Уровень - Строка - Возможные значения см. УровниИсполнения
// * Модуль - Неопределено - Нет исполняемого модуля
// - см. ОписаниеТестовогоМодуля
// * Набор - Неопределено - Нет исполняемого тестового набора
// - см. ОписаниеИсполняемогоНабораТестов
// * Тест - Неопределено - Нет исполняемого теста
// - см. ОписаниеИсполняемогоТеста
Функция НовыйКонтекстИсполнения() Экспорт
Контекст = Новый Структура();
Контекст.Вставить("Уровень", "");
Контекст.Вставить("Модуль", Неопределено);
Контекст.Вставить("Набор", Неопределено);
Контекст.Вставить("Тест", Неопределено);
Возврат Контекст;
@ -588,10 +649,12 @@
// Структура - Выражение предиката:
// * ИмяРеквизита - Неопределено, Строка - Имя проверяемого реквизита
// * ВидСравнения - Строка
// * Значение - Произвольный
// * Значение - Произвольный, Неопределено - Операнд выражения
Функция ВыражениеПредиката(ВидСравнения, ИмяРеквизита = Неопределено, Значение = Неопределено) Экспорт
Выражение = Новый Структура();
ЮТОбщий.УказатьТипСтруктуры(Выражение, "Предикат");
Выражение.Вставить("ИмяРеквизита", ИмяРеквизита);
Выражение.Вставить("ВидСравнения", ВидСравнения);
Выражение.Вставить("Значение", Значение);

View File

@ -103,6 +103,49 @@
КонецФункции
// Удаляет файлы
//
// Параметры:
// Файлы - Массив из Файл
// - Массив из Строка
Процедура УдалитьВременныеФайлы(Файлы) Экспорт
Если НЕ ЗначениеЗаполнено(Файлы) Тогда
Возврат;
КонецЕсли;
Ошибки = Новый Массив();
Для Каждого УдаляемыйФайл Из Файлы Цикл
Если ТипЗнч(УдаляемыйФайл) = Тип("Строка") Тогда
УдаляемыйФайл = Новый Файл(УдаляемыйФайл);
КонецЕсли;
Попытка
Если УдаляемыйФайл.Существует() Тогда
Если УдаляемыйФайл.ПолучитьТолькоЧтение() Тогда
УдаляемыйФайл.УстановитьТолькоЧтение(Ложь);
КонецЕсли;
УдалитьФайлы(УдаляемыйФайл.ПолноеИмя);
КонецЕсли;
Исключение
Ошибки.Добавить(ЮТРегистрацияОшибок.ПредставлениеОшибки("Удаление файла " + УдаляемыйФайл, ИнформацияОбОшибке()));
КонецПопытки;
КонецЦикла;
Если ЗначениеЗаполнено(Ошибки) Тогда
ВызватьИсключение СтрСоединить(Ошибки, Символы.ПС);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -31,16 +31,15 @@
ЮТФильтрация.УстановитьКонтекст(ПараметрыЗапускаТестов);
Для Каждого ОписаниеМодуля Из ТестовыеМодули() Цикл
Для Каждого МетаданныеМодуля Из ТестовыеМодули() Цикл
НаборыТестов = ТестовыеНаборыМодуля(ОписаниеМодуля, ПараметрыЗапускаТестов);
ОписаниеТестовогоМодуля = ТестовыеНаборыМодуля(МетаданныеМодуля, ПараметрыЗапускаТестов);
Если НаборыТестов = Неопределено Тогда
Если ОписаниеТестовогоМодуля = Неопределено Тогда
Продолжить;
КонецЕсли;
ТестовыйМодуль = ЮТФабрика.ОписаниеТестовогоМодуля(ОписаниеМодуля, НаборыТестов);
Результат.Добавить(ТестовыйМодуль);
Результат.Добавить(ОписаниеТестовогоМодуля);
КонецЦикла;
@ -51,17 +50,19 @@
// ПрочитатьНаборТестов
// Читает набор тестов из модуля
// Параметры:
// ОписаниеМодуля - см. ЮТФабрика.ОписаниеМодуля
// МетаданныеМодуля - см. ЮТФабрика.ОписаниеМодуля
//
// Возвращаемое значение:
// Неопределено, Массив из см. ЮТФабрика.ОписаниеТестовогоНабора- Если прочитано, то будет возвращено описание наборов
Функция ИсполняемыеСценарииМодуля(ОписаниеМодуля) Экспорт
// - Неопределено - Если это не тестовый модуль
// - см. ЮТФабрика.ОписаниеТестовогоМодуля
Функция ИсполняемыеСценарииМодуля(МетаданныеМодуля) Экспорт
ЭтоТестовыйМодуль = Истина;
ОписаниеТестовогоМодуля = ЮТФабрика.ОписаниеТестовогоМодуля(МетаданныеМодуля, Неопределено);
ЮТТесты.ПередЧтениемСценариевМодуля(ОписаниеМодуля);
ЮТТесты.ПередЧтениемСценариевМодуля(МетаданныеМодуля);
ПолноеИмяМетода = ОписаниеМодуля.Имя + "." + ИмяМетодаСценариев();
ПолноеИмяМетода = МетаданныеМодуля.Имя + "." + ИмяМетодаСценариев();
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода);
Если Ошибка <> Неопределено Тогда
@ -81,26 +82,27 @@
Если Ошибка <> Неопределено Тогда
Данные = Новый Массив(); // Фиксируем, чтобы отобразить в отчете
Описание = ЮТФабрика.ОписаниеТестовогоНабора(ОписаниеМодуля.Имя);
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуЧтенияТестов(Описание, "Ошибка формирования списка тестовых методов", Ошибка);
Данные.Добавить(Описание);
НаборПоУмолчанию = ЮТФабрика.ОписаниеТестовогоНабора(МетаданныеМодуля.Имя);
ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуЧтенияТестов(НаборПоУмолчанию, "Ошибка формирования списка тестовых методов", Ошибка);
ОписаниеТестовогоМодуля.НаборыТестов.Добавить(НаборПоУмолчанию);
ИначеЕсли ЭтоТестовыйМодуль Тогда
ЮТТесты.ПослеЧтенияСценариевМодуля();
Сценарии = ЮТТесты.СценарииМодуля();
Данные = ЮТФильтрация.ОтфильтроватьТестовыеНаборы(Сценарии.ТестовыеНаборы, ОписаниеМодуля);
УдалитьНастройкиМодуляИзПервогоНабора(Сценарии); // TODO Нужен рефакторинг
ОписаниеТестовогоМодуля.НаборыТестов = ЮТФильтрация.ОтфильтроватьТестовыеНаборы(Сценарии.ТестовыеНаборы, МетаданныеМодуля);
ОписаниеТестовогоМодуля.НастройкиВыполнения = Сценарии.НастройкиВыполнения;
Иначе
Данные = Неопределено;
ОписаниеТестовогоМодуля = Неопределено;
КонецЕсли;
Возврат Данные;
Возврат ОписаниеТестовогоМодуля;
КонецФункции
@ -171,34 +173,46 @@
КонецФункции
Функция ТестовыеНаборыМодуля(Модуль, ПараметрыЗапуска)
Функция ТестовыеНаборыМодуля(МетаданныеМодуля, ПараметрыЗапуска)
// TODO Фильтрация по путям
НаборыТестов = Неопределено;
ОписаниеМодуля = Неопределено;
#Если ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если Модуль.КлиентОбычноеПриложение ИЛИ Модуль.КлиентУправляемоеПриложение Тогда
НаборыТестов = ИсполняемыеСценарииМодуля(Модуль);
ИначеЕсли Модуль.Сервер Тогда
НаборыТестов = ЮТЧитательСервер.ИсполняемыеСценарииМодуля(Модуль);
Если МетаданныеМодуля.КлиентОбычноеПриложение ИЛИ МетаданныеМодуля.КлиентУправляемоеПриложение Тогда
ОписаниеМодуля = ИсполняемыеСценарииМодуля(МетаданныеМодуля);
ИначеЕсли МетаданныеМодуля.Сервер Тогда
ОписаниеМодуля = ЮТЧитательСервер.ИсполняемыеСценарииМодуля(МетаданныеМодуля);
ЮТЛогирование.ВывестиСерверныеСообщения();
КонецЕсли;
#ИначеЕсли Сервер Тогда
Если Модуль.Сервер Тогда
НаборыТестов = ИсполняемыеСценарииМодуля(Модуль);
Если МетаданныеМодуля.Сервер Тогда
ОписаниеМодуля = ИсполняемыеСценарииМодуля(МетаданныеМодуля);
Иначе
ВызватьИсключение "Чтение списка тестов модуля в недоступном контексте";
КонецЕсли;
#ИначеЕсли Клиент Тогда
Если Модуль.КлиентУправляемоеПриложение Тогда
НаборыТестов = ИсполняемыеСценарииМодуля(Модуль);
ИначеЕсли Модуль.Сервер Тогда
НаборыТестов = ЮТЧитательСервер.ИсполняемыеСценарииМодуля(Модуль);
Если МетаданныеМодуля.КлиентУправляемоеПриложение Тогда
ОписаниеМодуля = ИсполняемыеСценарииМодуля(МетаданныеМодуля);
ИначеЕсли МетаданныеМодуля.Сервер Тогда
ОписаниеМодуля = ЮТЧитательСервер.ИсполняемыеСценарииМодуля(МетаданныеМодуля);
ЮТЛогирование.ВывестиСерверныеСообщения();
КонецЕсли;
#КонецЕсли
Возврат НаборыТестов;
Возврат ОписаниеМодуля;
КонецФункции
@ -221,4 +235,14 @@
КонецФункции
Процедура УдалитьНастройкиМодуляИзПервогоНабора(СценарииМодуля)
НастройкиВыполнения = ЮТОбщий.СкопироватьРекурсивно(СценарииМодуля.НастройкиВыполнения);
СценарииМодуля.НастройкиВыполнения.Очистить();
СценарииМодуля.НастройкиВыполнения = НастройкиВыполнения;
КонецПроцедуры
#КонецОбласти

View File

@ -24,7 +24,7 @@
// Возвращает API формирования утверждения для проверки теста.
//
// Параметры:
// ПроверяемоеЗначение - Произвольный - Проверяемое фактическое значение
// ПроверяемоеЗначение - Произвольный - Проверяемое фактическое значение
// Сообщение - Строка - Описание проверки, которое будет выведено при возникновении ошибки
//
// Возвращаемое значение:
@ -35,6 +35,20 @@
КонецФункции
// Возвращает API формирования утверждения для проверки данных базы.
//
// Параметры:
// ИмяТаблицы - Произвольный - Имя таблицы базы, например, `Справочник.Пользователи`, `Документ.ПКО`, `РегистрСведений.ИнформацияОбОшибках`
// Сообщение - Строка - Описание проверки, которое будет выведено при возникновении ошибки
//
// Возвращаемое значение:
// ОбщийМодуль - Утверждения для проверки данных базы, см. ЮТУтвержденияИБ
Функция ОжидаетЧтоТаблицаБазы(ИмяТаблицы, Сообщение = "") Экспорт
Возврат ЮТУтвержденияИБ.ЧтоТаблица(ИмяТаблицы, Сообщение);
КонецФункции
// Возвращает API для работы с тестовыми данными.
//
// Возвращаемое значение:
@ -115,6 +129,7 @@
// Неопределено - Если метод вызывается за рамками тестового набора
Функция КонтекстТестовогоНабора() Экспорт
//@skip-check constructor-function-return-section
Возврат ЮТКонтекст.КонтекстНабора();
КонецФункции
@ -126,8 +141,8 @@
//
// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеВсехТестов`.
// Возвращаемое значение:
// Структура - Контекст тестового модуля
// Неопределено - Если метод вызывается за рамками тестового модуля
// - Структура - Контекст тестового модуля
// - Неопределено - Если метод вызывается за рамками тестового модуля
Функция КонтекстМодуля() Экспорт
Возврат ЮТКонтекст.КонтекстМодуля();

Binary file not shown.

After

Width:  |  Height:  |  Size: 706 B

View File

@ -0,0 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonPicture xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="dcac48ee-163e-4b4b-b644-823ee4f0fe91">
<name>ЮТПодсистема</name>
<synonym>
<key>ru</key>
<value>Картинка подсистемы ЮТДвижок</value>
</synonym>
</mdclass:CommonPicture>

View File

@ -0,0 +1,33 @@
Рога и Копыта
Ромашка
Организатория
Содружество
Синергия
УспехПартнер
Стратегия+
Эволюция
ОргаLife
МастерОрг
ЛидерОрг
УспехОрг
Профессиональное Организованное Решение
Стратегическая Организация
Идеальная Организация
МастерПлан
Гений в Деталях
Успешная Система
Органайзер
Профессиональная Структура
Успешное будущее
Мастера организации
Профессиональные архитекторы
Организационный гений
АльпаБанк
ВТП
Пенькофф
Сперпанк
Азито
Ямтекс
Почта Рус Лимитед
Телепам
Система успеха

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="b62864af-5f2a-485b-bdfc-8af08bf11420">
<name>ЮТ_СловарьПодражателя_Компании_Наименования_ru</name>
<synonym>
<key>ru</key>
<value>Подражатель компании наименования ru</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -0,0 +1,12 @@
AO
ГУП
ЗАО
ИП
МУП
НКО
ОП
ООО
ОАО
ПАО
ТСЖ
ФГУП

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="ae9b2266-fff5-446d-9939-27554b28361e">
<name>ЮТ_СловарьПодражателя_Компании_ПрефиксыНаименований_ru</name>
<synonym>
<key>ru</key>
<value>Подражатель компании префиксы ru</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -0,0 +1,80 @@
Агата
Агафья
Акулина
Алевтина
Александра
Алина
Алла
Анастасия
Ангелина
Анжела
Анжелика
Анна
Антонина
Валентина
Валерия
Варвара
Василиса
Вера
Вероника
Виктория
Галина
Глафира
Дарья
Евгения
Евдокия
Евпраксия
Евфросиния
Екатерина
Елена
Елизавета
Жанна
Зинаида
Зоя
Иванна
Ираида
Ирина
Ия
Кира
Клавдия
Ксения
Лариса
Лидия
Лора
Лукия
Любовь
Людмила
Майя
Маргарита
Марина
Мария
Марфа
Милица
Надежда
Наина
Наталья
Нина
Нинель
Нонна
Оксана
Октябрина
Олимпиада
Ольга
Пелагея
Полина
Прасковья
Раиса
Регина
Светлана
Синклитикия
София
Таисия
Тамара
Татьяна
Ульяна
Фаина
Феврония
Фёкла
Элеонора
Эмилия
Юлия

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="7e545927-4eb6-4aa9-98d8-5f61fd1487d5">
<name>ЮТ_СловарьПодражателя_Люди_ЖенскиеИмена_ru</name>
<synonym>
<key>ru</key>
<value>Подражатель люди женские имена ru</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -0,0 +1,79 @@
Александровна
Андреевна
Архиповна
Алексеевна
Антоновна
Аскольдовна
Альбертовна
Аркадьевна
Афанасьевна
Анатольевна
Артемовна
Богдановна
Болеславовна
Борисовна
Вадимовна
Васильевна
Владимировна
Валентиновна
Вениаминовна
Владиславовна
Валериевна
Викторовна
Вячеславовна
Геннадиевна
Георгиевна
Геннадьевна
Григорьевна
Даниловна
Дмитриевна
Евгеньевна
Егоровна
Ефимовна
Ждановна
Захаровна
Ивановна
Игоревна
Ильинична
Кирилловна
Кузьминична
Константиновна
Леонидовна
Леоновна
Львовна
Макаровна
Матвеевна
Михайловна
Максимовна
Мироновна
Натановна
Никифоровна
Ниловна
Наумовна
Николаевна
Олеговна
Оскаровна
Павловна
Петровна
Робертовна
Рубеновна
Руслановна
Романовна
Рудольфовна
Святославовна
Сергеевна
Степановна
Семеновна
Станиславовна
Тарасовна
Тимофеевна
Тимуровна
Федоровна
Феликсовна
Филипповна
Харитоновна
Эдуардовна
Эльдаровна
Юльевна
Юрьевна
Яковлевна

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="33ef2225-46c0-453d-ae22-a29bbb30d672">
<name>ЮТ_СловарьПодражателя_Люди_ЖенскиеОтчества_ru</name>
<synonym>
<key>ru</key>
<value>Подражатель люди женские отчества ru</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -0,0 +1,250 @@
Смирнова
Иванова
Кузнецова
Попова
Соколова
Лебедева
Козлова
Новикова
Морозова
Петрова
Волкова
Соловьева
Васильева
Зайцева
Павлова
Семенова
Голубева
Виноградова
Богданова
Воробьева
Федорова
Михайлова
Беляева
Тарасова
Белова
Комарова
Орлова
Киселева
Макарова
Андреева
Ковалева
Ильина
Гусева
Титова
Кузьмина
Кудрявцева
Баранова
Куликова
Алексеева
Степанова
Яковлева
Сорокина
Сергеева
Романова
Захарова
Борисова
Королева
Герасимова
Пономарева
Григорьева
Лазарева
Медведева
Ершова
Никитина
Соболева
Рябова
Полякова
Цветкова
Данилова
Жукова
Фролова
Журавлева
Николаева
Крылова
Максимова
Сидорова
Осипова
Белоусова
Федотова
Дорофеева
Егорова
Матвеева
Боброва
Дмитриева
Калинина
Анисимова
Петухова
Антонова
Тимофеева
Никифорова
Веселова
Филиппова
Маркова
Большакова
Суханова
Миронова
Ширяева
Александрова
Коновалова
Шестакова
Казакова
Ефимова
Денисова
Громова
Фомина
Давыдова
Мельникова
Щербакова
Блинова
Колесникова
Карпова
Афанасьева
Власова
Маслова
Исакова
Тихонова
Аксенова
Гаврилова
Родионова
Котова
Горбунова
Кудряшова
Быкова
Зуева
Третьякова
Савельева
Панова
Рыбакова
Суворова
Абрамова
Воронова
Мухина
Архипова
Трофимова
Мартынова
Емельянова
Горшкова
Чернова
Овчинникова
Селезнева
Панфилова
Копылова
Михеева
Галкина
Назарова
Лобанова
Лукина
Белякова
Потапова
Некрасова
Хохлова
Жданова
Наумова
Шилова
Воронцова
Ермакова
Дроздова
Игнатьева
Савина
Логинова
Сафонова
Капустина
Кириллова
Моисеева
Елисеева
Кошелева
Костина
Горбачева
Орехова
Ефремова
Исаева
Евдокимова
Калашникова
Кабанова
Носкова
Юдина
Кулагина
Лапина
Прохорова
Нестерова
Харитонова
Агафонова
Муравьева
Ларионова
Федосеева
Зимина
Пахомова
Шубина
Игнатова
Филатова
Крюкова
Рогова
Кулакова
Терентьева
Молчанова
Владимирова
Артемьева
Гурьева
Зиновьева
Гришина
Кононова
Дементьева
Ситникова
Симонова
Мишина
Фадеева
Комиссарова
Мамонтова
Носова
Гуляева
Шарова
Устинова
Вишнякова
Евсеева
Лаврентьева
Брагина
Константинова
Корнилова
Авдеева
Зыкова
Бирюкова
Шарапова
Никонова
Щукина
Дьячкова
Одинцова
Сазонова
Якушева
Красильникова
Гордеева
Самойлова
Князева
Беспалова
Уварова
Шашкова
Бобылева
Доронина
Белозерова
Рожкова
Самсонова
Мясникова
Лихачева
Бурова
Сысоева
Фомичева
Русакова
Стрелкова
Гущина
Тетерина
Колобова
Субботина
Фокина
Блохина
Селиверстова
Пестова
Кондратьева
Силина
Меркушева
Лыткина
Турова

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="49d17d5c-11a3-438e-b865-995c382c6099">
<name>ЮТ_СловарьПодражателя_Люди_ЖенскиеФамилии_ru</name>
<synonym>
<key>ru</key>
<value>Подражатель люди женские фамилии ru</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -0,0 +1,321 @@
Август
Авдей
Аверкий
Аверьян
Авксентий
Автоном
Агап
Агафон
Аггей
Адам
Адриан
Азарий
Аким
Александр
Алексей
Амвросий
Амос
Ананий
Анатолий
Андрей
Андрон
Андроник
Аникей
Аникита
Анисим
Антип
Антонин
Аполлинарий
Аполлон
Арефий
Аристарх
Аркадий
Арсений
Артемий
Артем
Архип
Аскольд
Афанасий
Афиноген
Бажен
Богдан
Болеслав
Борис
Борислав
Боян
Бронислав
Будимир
Вадим
Валентин
Валерий
Валерьян
Варлаам
Варфоломей
Василий
Вацлав
Велимир
Венедикт
Вениамин
Викентий
Виктор
Викторин
Виссарион
Виталий
Владилен
Владлен
Владимир
Владислав
Влас
Всеволод
Всемил
Всеслав
Вышеслав
Вячеслав
Гаврила
Галактион
Гедеон
Геннадий
Георгий
Герасим
Герман
Глеб
Гордей
Гостомысл
Гремислав
Григорий
Гурий
Давыд
Данила
Дементий
Демид
Демьян
Денис
Дмитрий
Добромысл
Доброслав
Дорофей
Евгений
Евграф
Евдоким
Евлампий
Евсей
Евстафий
Евстигней
Егор
Елизар
Елисей
Емельян
Епифан
Еремей
Ермил
Ермолай
Ерофей
Ефим
Ефрем
Захар
Зиновий
Зосима
Иван
Игнатий
Игорь
Измаил
Изот
Изяслав
Иларион
Илья
Иннокентий
Иосиф
Ипат
Ипатий
Ипполит
Ираклий
Исай
Исидор
Казимир
Каллистрат
Капитон
Карл
Карп
Касьян
Ким
Кир
Кирилл
Клавдий
Климент
Кондрат
Кондратий
Конон
Константин
Корнил
Кузьма
Куприян
Лавр
Лаврентий
Ладимир
Ладислав
Лазарь
Лев
Леон
Леонид
Леонтий
Лонгин
Лука
Лукьян
Лучезар
Любим
Любомир
Любосмысл
Макар
Максим
Максимильян
Мариан
Марк
Мартын
Мартьян
Матвей
Мефодий
Мечислав
Милан
Милен
Милий
Милован
Мина
Мир
Мирон
Мирослав
Митофан
Михаил
Михей
Модест
Моисей
Мокей
Мстислав
Назар
Наркис
Натан
Наум
Нестор
Никандр
Никанор
Никита
Никифор
Никодим
Николай
Никон
Нифонт
Олег
Олимпий
Онуфрий
Орест
Осип
Остап
Остромир
Павел
Панкратий
Панкрат
Пантелеймон
Панфил
Парамон
Парфен
Пахом
Петр
Пимен
Платон
Поликарп
Порфирий
Потап
Пров
Прокл
Прокофий
Прохор
Радим
Радислав
Радован
Ратибор
Ратмир
Родион
Роман
Ростислав
Рубен
Руслан
Рюрик
Савва
Савватий
Савелий
Самсон
Самуил
Светозар
Святополк
Святослав
Севастьян
Селиван
Селиверст
Семен
Серафим
Сергей
Сигизмунд
Сидор
Сила
Силантий
Сильвестр
Симон
Сократ
Соломон
Софон
Софрон
Спартак
Спиридон
Станимир
Станислав
Степан
Стоян
Тарас
Твердислав
Творимир
Терентий
Тимофей
Тимур
Тит
Тихон
Трифон
Трофим
Ульян
Устин
Фадей
Федор
Федосий
Федот
Феликс
Феоктист
Феофан
Ферапонт
Филарет
Филимон
Филипп
Фирс
Флорентин
Фока
Фома
Фортунат
Фотий
Фрол
Харитон
Харлампий
Христофор
Чеслав
Эдуард
Эммануил
Эмиль
Эраст
Эрнест
Эрнст
Ювеналий
Юлиан
Юлий
Юрий
Яков
Ян
Якуб
Януарий
Ярополк
Ярослав

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="05112757-a04e-4ec0-a935-c6ed9fc9899f">
<name>ЮТ_СловарьПодражателя_Люди_МужскиеИмена_ru</name>
<synonym>
<key>ru</key>
<value>Подражатель люди мужские имена ru</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -0,0 +1,132 @@
Ааронович
Абрамович
Августович
Авдеевич
Аверьянович
Адамович
Адрианович
Аксёнович
Александрович
Алексеевич
Анатольевич
Андреевич
Анисимович
Антипович
Антонович
Ануфриевич
Арсенович
Арсеньевич
Артёмович
Артемьевич
Артурович
Архипович
Афанасьевич
Бенедиктович
Богданович
Бориславович
Борисович
Брониславович
Валентинович
Валерианович
Валерьевич
Валерьянович
Васильевич
Венедиктович
Викентьевич
Викторович
Виленович
Вилорович
Витальевич
Владиленович
Владиславович
Владленович
Власович
Всеволодович
Вячеславович
Гавриилович
Гаврилович
Геннадиевич
Георгиевич
Герасимович
Германович
Гертрудович
Глебович
Гордеевич
Григорьевич
Гурьевич
Давидович
Давыдович
Даниилович
Данилович
Демидович
Демьянович
Денисович
Димитриевич
Дмитриевич
Дорофеевич
Евсеевич
Евстигнеевич
Егорович
Елизарович
Елисеевич
Еремеевич
Ермилович
Ермолаевич
Ерофеевич
Ефимович
Ефимьевич
Ефремович
Ефстафьевич
Жанович
Жоресович
Захарьевич
Зиновьевич
Игнатович
Игнатьевич
Игоревич
Измаилович
Изотович
Иларионович
Ильич
Ильясович
Иосипович
Иосифович
Исидорович
Марсович
Матвеевич
Тарасович
Теймуразович
Терентьевич
Тимурович
Тихонович
Трифонович
Трофимович
Устинович
Фадеевич
Фёдорович
Федосеевич
Федосьевич
Федотович
Феликсович
Феодосьевич
Феоктистович
Феофанович
Филатович
Филимонович
Филиппович
Фокич
Фомич
Фролович
Харитонович
Харламович
Харлампович
Харлампьевич
Чеславович
Эдгардович
Эдгарович
Эдуардович
Юлианович
Юльевич
Яковлевич
Якубович
Ярославович

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="4037f89e-366d-40f6-a544-cb2aaa6595b4">
<name>ЮТ_СловарьПодражателя_Люди_МужскиеОтчества_ru</name>
<synonym>
<key>ru</key>
<value>Подражатель люди мужские отчества ru</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -0,0 +1,250 @@
Смирнов
Иванов
Кузнецов
Попов
Соколов
Лебедев
Козлов
Новиков
Морозов
Петров
Волков
Соловьев
Васильев
Зайцев
Павлов
Семенов
Голубев
Виноградов
Богданов
Воробьев
Федоров
Михайлов
Беляев
Тарасов
Белов
Комаров
Орлов
Киселев
Макаров
Андреев
Ковалев
Ильин
Гусев
Титов
Кузьмин
Кудрявцев
Баранов
Куликов
Алексеев
Степанов
Яковлев
Сорокин
Сергеев
Романов
Захаров
Борисов
Королев
Герасимов
Пономарев
Григорьев
Лазарев
Медведев
Ершов
Никитин
Соболев
Рябов
Поляков
Цветков
Данилов
Жуков
Фролов
Журавлев
Николаев
Крылов
Максимов
Сидоров
Осипов
Белоусов
Федотов
Дорофеев
Егоров
Матвеев
Бобров
Дмитриев
Калинин
Анисимов
Петухов
Антонов
Тимофеев
Никифоров
Веселов
Филиппов
Марков
Большаков
Суханов
Миронов
Ширяев
Александров
Коновалов
Шестаков
Казаков
Ефимов
Денисов
Громов
Фомин
Давыдов
Мельников
Щербаков
Блинов
Колесников
Карпов
Афанасьев
Власов
Маслов
Исаков
Тихонов
Аксенов
Гаврилов
Родионов
Котов
Горбунов
Кудряшов
Быков
Зуев
Третьяков
Савельев
Панов
Рыбаков
Суворов
Абрамов
Воронов
Мухин
Архипов
Трофимов
Мартынов
Емельянов
Горшков
Чернов
Овчинников
Селезнев
Панфилов
Копылов
Михеев
Галкин
Назаров
Лобанов
Лукин
Беляков
Потапов
Некрасов
Хохлов
Жданов
Наумов
Шилов
Воронцов
Ермаков
Дроздов
Игнатьев
Савин
Логинов
Сафонов
Капустин
Кириллов
Моисеев
Елисеев
Кошелев
Костин
Горбачев
Орехов
Ефремов
Исаев
Евдокимов
Калашников
Кабанов
Носков
Юдин
Кулагин
Лапин
Прохоров
Нестеров
Харитонов
Агафонов
Муравьев
Ларионов
Федосеев
Зимин
Пахомов
Шубин
Игнатов
Филатов
Крюков
Рогов
Кулаков
Терентьев
Молчанов
Владимиров
Артемьев
Гурьев
Зиновьев
Гришин
Кононов
Дементьев
Ситников
Симонов
Мишин
Фадеев
Комиссаров
Мамонтов
Носов
Гуляев
Шаров
Устинов
Вишняков
Евсеев
Лаврентьев
Брагин
Константинов
Корнилов
Авдеев
Зыков
Бирюков
Шарапов
Никонов
Щукин
Дьячков
Одинцов
Сазонов
Якушев
Красильников
Гордеев
Самойлов
Князев
Беспалов
Уваров
Шашков
Бобылев
Доронин
Белозеров
Рожков
Самсонов
Мясников
Лихачев
Буров
Сысоев
Фомичев
Русаков
Стрелков
Гущин
Тетерин
Колобов
Субботин
Фокин
Блохин
Селиверстов
Пестов
Кондратьев
Силин
Меркушев
Лыткин
Туров

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="e31c6720-ca35-41d5-beee-0f755d3440df">
<name>ЮТ_СловарьПодражателя_Люди_МужскиеФамилии_ru</name>
<synonym>
<key>ru</key>
<value>Подражатель люди мужские фамилии ru</value>
</synonym>
<templateType>TextDocument</templateType>
</mdclass:CommonTemplate>

View File

@ -1,16 +1,16 @@
# Описание свойств метаданных
| Имя | ИмяКоллекции | Конструктор | Группы | Ссылочный | Реквизиты | Измерения | Ресурсы | РеквизитыАдресации | ТабличныеЧасти |
|------------------------|-------------------------|----------------------|--------|-----------|-----------|-----------|---------|--------------------|----------------|
| Справочник | Справочники | СоздатьЭлемент | + | + | + | | | | + |
| Документ | Документы | СоздатьДокумент | | + | + | | | | + |
| ПланВидовХарактеристик | ПланыВидовХарактеристик | СоздатьЭлемент | + | + | + | | | | + |
| ПланСчетов | ПланыСчетов | СоздатьСчет | | + | + | | | | + |
| ПланВидовРасчета | ПланыВидовРасчета | СоздатьВидРасчета | | + | + | | | | + |
| ПланОбмена | ПланыОбмена | СоздатьУзел | | + | + | | | | + |
| РегистрСведений | РегистрыСведений | СоздатьНаборЗаписей | | | + | + | + | | |
| РегистрНакопления | РегистрыНакопления | СоздатьНаборЗаписей | | | + | + | + | | |
| РегистрБухгалтерии | РегистрыБухгалтерии | СоздатьНаборЗаписей | | | + | + | + | | |
| РегистрРасчета | РегистрыРасчета | СоздатьНаборЗаписей | | | + | + | + | | |
| БизнесПроцесс | БизнесПроцессы | СоздатьБизнесПроцесс | | + | + | | | | + |
| Задача | Задачи | СоздатьЗадачу | | + | + | | | + | + |
| Имя | ИмяКоллекции | Конструктор | Группы | Ссылочный | Реквизиты | Измерения | Ресурсы | РеквизитыАдресации | ТабличныеЧасти |
|------------------------|-------------------------|-----------------------|--------|-----------|-----------|-----------|---------|--------------------|----------------|
| Справочник | Справочники | СоздатьЭлемент | + | + | + | | | | + |
| Документ | Документы | СоздатьДокумент | | + | + | | | | + |
| ПланВидовХарактеристик | ПланыВидовХарактеристик | СоздатьЭлемент | + | + | + | | | | + |
| ПланСчетов | ПланыСчетов | СоздатьСчет | | + | + | | | | + |
| ПланВидовРасчета | ПланыВидовРасчета | СоздатьВидРасчета | | + | + | | | | + |
| ПланОбмена | ПланыОбмена | СоздатьУзел | | + | + | | | | + |
| РегистрСведений | РегистрыСведений | СоздатьМенеджерЗаписи | | | + | + | + | | |
| РегистрНакопления | РегистрыНакопления | | | | + | + | + | | |
| РегистрБухгалтерии | РегистрыБухгалтерии | | | | + | + | + | | |
| РегистрРасчета | РегистрыРасчета | | | | + | + | + | | |
| БизнесПроцесс | БизнесПроцессы | СоздатьБизнесПроцесс | | + | + | | | | + |
| Задача | Задачи | СоздатьЗадачу | | + | + | | | + | + |

View File

@ -16,7 +16,7 @@
<configurationExtensionCompatibilityMode>8.3.10</configurationExtensionCompatibilityMode>
<configurationExtensionPurpose>AddOn</configurationExtensionPurpose>
<scriptVariant>Russian</scriptVariant>
<version>23.04.0</version>
<version>23.07.0</version>
<languages uuid="b8fdae66-bc14-47de-9a8d-e0323e0d9ce8">
<name>Русский</name>
<objectBelonging>Adopted</objectBelonging>
@ -26,24 +26,37 @@
<languageCode>ru</languageCode>
</languages>
<subsystems>Subsystem.ЮТДвижок</subsystems>
<subsystems>Subsystem.ЮТПодражатель</subsystems>
<subsystems>Subsystem.ЮТФункциональность</subsystems>
<commonPictures>CommonPicture.ЮТНеизвестный</commonPictures>
<commonPictures>CommonPicture.ЮТОшибка</commonPictures>
<commonPictures>CommonPicture.ЮТПодсистема</commonPictures>
<commonPictures>CommonPicture.ЮТПропущен</commonPictures>
<commonPictures>CommonPicture.ЮТУпал</commonPictures>
<commonPictures>CommonPicture.ЮТУспешно</commonPictures>
<commonPictures>CommonPicture.ЮТЭлементыТестов</commonPictures>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Компании_Наименования_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Компании_ПрефиксыНаименований_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_ЖенскиеИмена_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_ЖенскиеОтчества_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_ЖенскиеФамилии_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеИмена_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеОтчества_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеФамилии_ru</commonTemplates>
<commonTemplates>CommonTemplate.ЮТОписаниеМетаданных</commonTemplates>
<commonModules>CommonModule.Мокито</commonModules>
<commonModules>CommonModule.МокитоОбучение</commonModules>
<commonModules>CommonModule.МокитоПроверки</commonModules>
<commonModules>CommonModule.МокитоСлужебный</commonModules>
<commonModules>CommonModule.ЮТест</commonModules>
<commonModules>CommonModule.ЮТЗапросы</commonModules>
<commonModules>CommonModule.ЮТЗапросыВызовСервера</commonModules>
<commonModules>CommonModule.ЮТЗапросыКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТИсполнительКлиент</commonModules>
<commonModules>CommonModule.ЮТИсполнительКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТИсполнительСервер</commonModules>
<commonModules>CommonModule.ЮТКонструкторВариантов</commonModules>
<commonModules>CommonModule.ЮТКонструкторТестовыхДанных</commonModules>
<commonModules>CommonModule.ЮТКонструкторТестовыхДанныхСлужебный</commonModules>
<commonModules>CommonModule.ЮТКонтекст</commonModules>
<commonModules>CommonModule.ЮТКонтекстКлиент</commonModules>
<commonModules>CommonModule.ЮТКонтекстСервер</commonModules>
@ -61,6 +74,13 @@
<commonModules>CommonModule.ЮТОтчетJUnit</commonModules>
<commonModules>CommonModule.ЮТПараметрыЗапуска</commonModules>
<commonModules>CommonModule.ЮТПовторногоИспользования</commonModules>
<commonModules>CommonModule.ЮТПодражатель</commonModules>
<commonModules>CommonModule.ЮТПодражатель_Банки</commonModules>
<commonModules>CommonModule.ЮТПодражатель_Компании</commonModules>
<commonModules>CommonModule.ЮТПодражатель_Люди</commonModules>
<commonModules>CommonModule.ЮТПодражательВызовСервера</commonModules>
<commonModules>CommonModule.ЮТПодражательПовтИсп</commonModules>
<commonModules>CommonModule.ЮТПодражательСлужебный</commonModules>
<commonModules>CommonModule.ЮТПредикаты</commonModules>
<commonModules>CommonModule.ЮТПредикатыКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТРасширения</commonModules>
@ -73,11 +93,13 @@
<commonModules>CommonModule.ЮТТестовыеДанныеСлужебный</commonModules>
<commonModules>CommonModule.ЮТТесты</commonModules>
<commonModules>CommonModule.ЮТУтверждения</commonModules>
<commonModules>CommonModule.ЮТУтвержденияИБ</commonModules>
<commonModules>CommonModule.ЮТФабрика</commonModules>
<commonModules>CommonModule.ЮТФайлы</commonModules>
<commonModules>CommonModule.ЮТФильтрация</commonModules>
<commonModules>CommonModule.ЮТЧитатель</commonModules>
<commonModules>CommonModule.ЮТЧитательСервер</commonModules>
<dataProcessors>DataProcessor.ЮТHTTPСервисЗапрос</dataProcessors>
<dataProcessors>DataProcessor.ЮТКонструкторТестовыхДанных</dataProcessors>
<dataProcessors>DataProcessor.ЮТЮнитТесты</dataProcessors>
</mdclass:Configuration>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="UTF-8"?>
<form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:form="http://g5.1c.ru/v8/dt/form">
<autoCommandBar>
<name>ФормаКоманднаяПанель</name>
<id>-1</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<horizontalAlign>Left</horizontalAlign>
<autoFill>true</autoFill>
</autoCommandBar>
<autoTitle>true</autoTitle>
<autoUrl>true</autoUrl>
<group>Vertical</group>
<autoFillCheck>true</autoFillCheck>
<enabled>true</enabled>
<showTitle>true</showTitle>
<showCloseButton>true</showCloseButton>
<commandInterface>
<navigationPanel/>
<commandBar/>
</commandInterface>
<extInfo xsi:type="form:ObjectFormExtInfo"/>
</form:Form>

View File

@ -0,0 +1,221 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// Copyright 2021-2023 BIA-Technologies Limited Liability Company
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
//©///////////////////////////////////////////////////////////////////////////©//
// BSLLS:NonStandardRegion-off
#Область ОписаниеПеременных
// см. ЮТКонструкторТестовыхДанныхСлужебный.НовыйКонтекстКонструктора
&НаКлиенте
Перем Контекст;
#КонецОбласти
#Область ПрограммныйИнтерфейс
// Устанавливает значение реквизита создаваемого объекта.
//
// Если метод вызывается после вызова см. ТабличнаяЧасть, то устанавливается значение реквизита строки табличной части
//
// Параметры:
// ИмяРеквизита - Строка - Имя реквизита объекта или табличной части
// Значение - Произвольный - Значение реквизита объекта или табличной части
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
Функция Установить(ИмяРеквизита, Значение) Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.Установить(Контекст, ИмяРеквизита, Значение);
Возврат ЭтотОбъект;
КонецФункции
// Устанавливает фиктивное значение реквизита создаваемого объекта.
//
// Если метод вызывается после вызова см. ТабличнаяЧасть, то устанавливается значение реквизита строки табличной части.
//
// На основании менеджера и имени реквизита вычисляется его тип, а по типу генерируется фиктивное значение.
//
// * Для примитивных значение генерируется случайное значение
// * Для ссылочных типов создается новый объект
// * Для перечислений (в том числе системных) выбирается случайно значение перечисления
//
// Параметры:
// ИмяРеквизита - Строка - Имя реквизита объекта или табличной части
// РеквизитыЗаполнения - Структура - Значения реквизитов заполнения создаваемого объекта базы
// - Неопределено
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено) Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения);
Возврат ЭтотОбъект;
КонецФункции
// Заполняет обязательные поля объекта фиктивными значениями
//
// Если метод вызывается после вызова см. ТабличнаяЧасть, то устанавливаются значения реквизитов строки табличной части.
//
// На основании метаданных определяются обязательные поля (Проверка заполнения = Выдавать ошибку),
// для них генерируются и устанавливаются фиктивные значение.
//
// * Для примитивных значение генерируется случайное значение
// * Для ссылочных типов создается новый объект
// * Для перечислений (в том числе системных) выбирается случайно значение перечисления
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
Функция ФикцияОбязательныхПолей() Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.ФикцияОбязательныхПолей(Контекст);
Возврат ЭтотОбъект;
КонецФункции
// Переключает конструктор на заполнение табличной части объекта.
//
// Параметры:
// ИмяТабличнойЧасти - Строка - Имя табличной части
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
Функция ТабличнаяЧасть(ИмяТабличнойЧасти) Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.ТабличнаяЧасть(Контекст, ИмяТабличнойЧасти);
Возврат ЭтотОбъект;
КонецФункции
// Добавляет новую строку табличной части объекта.
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
Функция ДобавитьСтроку() Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.ДобавитьСтроку(Контекст);
Возврат ЭтотОбъект;
КонецФункции
// Устанавливает дополнительное свойство объекта.
//
// Параметры:
// ИмяСвойства - Строка - Имя дополнительного свойства
// Значение - Произвольный - Значение дополнительного свойства
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
Функция УстановитьДополнительноеСвойство(ИмяСвойства, Значение = Неопределено) Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.УстановитьДополнительноеСвойство(Контекст, ИмяСвойства, Значение);
Возврат ЭтотОбъект;
КонецФункции
// Создает новый объект и возвращает его или ссылку.
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создаст множество одинаковых объектов.
// Если вы хотите создать полностью новый объект, необходимо по-новой инициировать конструктор.
//
// Параметры:
// ВернутьОбъект - Булево - Вернуть объект вместо ссылки
// ОбменДаннымиЗагрузка - Булево - Записать объект с признаком `ОбменДанными.Загрузка = Истина`
//
// Возвращаемое значение:
// Произвольный - Созданный объект или ссылка на него
&НаКлиенте
Функция Записать(ВернутьОбъект = Ложь, ОбменДаннымиЗагрузка = Ложь) Экспорт
Возврат ЮТКонструкторТестовыхДанныхСлужебный.Записать(Контекст, ВернутьОбъект, ОбменДаннымиЗагрузка);
КонецФункции
// Создает и возвращяет новый объект (не записывая его).
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создаст множество одинаковых объектов.
// Если вы хотите создать полностью новый объект, необходимо по-новой инициировать конструктор.
//
// Возвращаемое значение:
// Произвольный - Созданный объект.
&НаКлиенте
Функция НовыйОбъект() Экспорт
Возврат ЮТКонструкторТестовыхДанныхСлужебный.НовыйОбъект(Контекст);
КонецФункции
// Создает и проводит новый документ. Возвращает объект или или ссылку на него.
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создать множество объектов.
// Если вы хотите создать полностью новый объект, необходимо по-новой инициировать конструктор.
//
// Параметры:
// ВернутьОбъект - Булево - Вернуть объект вместо ссылки
//
// Возвращаемое значение:
// Произвольный - Созданный объект или ссылка на него
&НаКлиенте
Функция Провести(ВернутьОбъект = Ложь) Экспорт
Возврат ЮТКонструкторТестовыхДанныхСлужебный.Провести(Контекст, ВернутьОбъект);
КонецФункции
// Возвращает данные текущей строки табличной части объекта.
//
// Возвращаемое значение:
// Структура - Данные строки
// Неопределено - Если заполняется объект
&НаКлиенте
Функция ДанныеСтроки() Экспорт
Возврат ЮТКонструкторТестовыхДанныхСлужебный.ДанныеСтроки(Контекст);
КонецФункции
// Возвращает данные создаваемого объекта.
//
// Возвращаемое значение:
// Структура - Данные объекта
&НаКлиенте
Функция ДанныеОбъекта() Экспорт
Возврат ЮТКонструкторТестовыхДанныхСлужебный.ДанныеОбъекта(Контекст);
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
&НаКлиенте
Процедура Инициализировать(Менеджер) Экспорт
Контекст = ЮТКонструкторТестовыхДанныхСлужебный.НовыйКонтекстКонструктора(Менеджер);
КонецПроцедуры
#КонецОбласти
// BSLLS:NonStandardRegion-on

View File

@ -16,6 +16,15 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
#Область ОписаниеПеременных
// см. ЮТКонструкторТестовыхДанныхСлужебный.НовыйКонтекстКонструктора
Перем Контекст;
#КонецОбласти
#Область ПрограммныйИнтерфейс
// Устанавливает значение реквизита создаваемого объекта.
@ -30,17 +39,8 @@
// ОбщийМодуль - Конструктор
Функция Установить(ИмяРеквизита, Значение) Экспорт
Контекст = Контекст();
Если ЗначениеЗаполнено(Контекст.ТекущаяТабличнаяЧасть) Тогда
ТекущаяЗапись = ДанныеСтроки();
Иначе
ТекущаяЗапись = Контекст.Данные;
КонецЕсли;
ТекущаяЗапись.Вставить(ИмяРеквизита, Значение);
Возврат ЮТКонструкторТестовыхДанных;
ЮТКонструкторТестовыхДанныхСлужебный.Установить(Контекст, ИмяРеквизита, Значение);
Возврат ЭтотОбъект;
КонецФункции
@ -56,27 +56,35 @@
//
// Параметры:
// ИмяРеквизита - Строка - Имя реквизита объекта или табличной части
// Реквизиты - Структура - Значения реквизитов заполнения создаваемого объекта базы
// - Неопределено
// РеквизитыЗаполнения - Структура - Значения реквизитов заполнения создаваемого объекта базы
// - Неопределено
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
Функция Фикция(ИмяРеквизита, Реквизиты = Неопределено) Экспорт
Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено) Экспорт
Контекст = Контекст();
ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения);
Возврат ЭтотОбъект;
Если ЗначениеЗаполнено(Контекст.ТекущаяТабличнаяЧасть) Тогда
ОписаниеРеквизита = Контекст.Метаданные.ТабличныеЧасти[Контекст.ТекущаяТабличнаяЧасть][ИмяРеквизита];
ТекущаяЗапись = ДанныеСтроки();
Иначе
ОписаниеРеквизита = Контекст.Метаданные.Реквизиты[ИмяРеквизита];
ТекущаяЗапись = Контекст.Данные;
КонецЕсли;
КонецФункции
// Заполняет обязательные поля объекта фиктивными значениями
//
// Если метод вызывается после вызова см. ТабличнаяЧасть, то устанавливаются значения реквизитов строки табличной части.
//
// На основании метаданных определяются обязательные поля (Проверка заполнения = Выдавать ошибку),
// для них генерируются и устанавливаются фиктивные значение.
//
// * Для примитивных значение генерируется случайное значение
// * Для ссылочных типов создается новый объект
// * Для перечислений (в том числе системных) выбирается случайно значение перечисления
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
Функция ФикцияОбязательныхПолей() Экспорт
Значение = ЮТТестовыеДанныеСлужебный.Фикция(ОписаниеРеквизита.Тип);
ТекущаяЗапись.Вставить(ИмяРеквизита, Значение);
Возврат ЮТКонструкторТестовыхДанных;
ЮТКонструкторТестовыхДанныхСлужебный.ФикцияОбязательныхПолей(Контекст);
Возврат ЭтотОбъект;
КонецФункции
@ -89,11 +97,8 @@
// ОбщийМодуль - Конструктор
Функция ТабличнаяЧасть(ИмяТабличнойЧасти) Экспорт
Контекст = Контекст();
Контекст.ТекущаяТабличнаяЧасть = ИмяТабличнойЧасти;
Контекст.Данные.Вставить(ИмяТабличнойЧасти, Новый Массив());
Возврат ЮТКонструкторТестовыхДанных;
ЮТКонструкторТестовыхДанныхСлужебный.ТабличнаяЧасть(Контекст, ИмяТабличнойЧасти);
Возврат ЭтотОбъект;
КонецФункции
@ -103,12 +108,8 @@
// ОбщийМодуль - Конструктор
Функция ДобавитьСтроку() Экспорт
Контекст = Контекст();
Запись = Новый Структура();
ДанныеТабличнойЧасти(Контекст).Добавить(Запись);
Возврат ЮТКонструкторТестовыхДанных;
ЮТКонструкторТестовыхДанныхСлужебный.ДобавитьСтроку(Контекст);
Возврат ЭтотОбъект;
КонецФункции
@ -120,18 +121,16 @@
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
Функция УстановитьДополнительноеСвойство(ИмяСвойства, Значение) Экспорт
Функция УстановитьДополнительноеСвойство(ИмяСвойства, Значение = Неопределено) Экспорт
Контекст = Контекст();
Контекст.ДополнительныеСвойства.Вставить(ИмяСвойства, Значение);
Возврат ЮТКонструкторТестовыхДанных;
ЮТКонструкторТестовыхДанныхСлужебный.УстановитьДополнительноеСвойство(Контекст, ИмяСвойства, Значение);
Возврат ЭтотОбъект;
КонецФункции
// Создает новый объект и возвращает его или ссылку.
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создаст множество объектов.
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создаст множество одинаковых объектов.
// Если вы хотите создать полностью новый объект, необходимо по-новой инициировать конструктор.
//
// Параметры:
@ -142,16 +141,22 @@
// Произвольный - Созданный объект или ссылка на него
Функция Записать(ВернутьОбъект = Ложь, ОбменДаннымиЗагрузка = Ложь) Экспорт
Контекст = Контекст();
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства;
ПараметрыЗаписи.ОбменДаннымиЗагрузка = ОбменДаннымиЗагрузка;
Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
Возврат ЮТКонструкторТестовыхДанныхСлужебный.Записать(Контекст, ВернутьОбъект, ОбменДаннымиЗагрузка);
КонецФункции
// Создает и возвращяет новый объект (не записывая его).
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создаст множество одинаковых объектов.
// Если вы хотите создать полностью новый объект, необходимо по-новой инициировать конструктор.
//
// Возвращаемое значение:
// Произвольный - Созданный объект.
Функция НовыйОбъект() Экспорт
Возврат ЮТКонструкторТестовыхДанныхСлужебный.НовыйОбъект(Контекст);
КонецФункции
// Создает и проводит новый документ. Возвращает объект или или ссылку на него.
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создать множество объектов.
@ -164,13 +169,7 @@
// Произвольный - Созданный объект или ссылка на него
Функция Провести(ВернутьОбъект = Ложь) Экспорт
Контекст = Контекст();
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.ДополнительныеСвойства = Контекст.ДополнительныеСвойства;
ПараметрыЗаписи.РежимЗаписи = РежимЗаписиДокумента.Проведение;
Возврат ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Контекст.Менеджер, Контекст.Данные, ПараметрыЗаписи, ВернутьОбъект);
Возврат ЮТКонструкторТестовыхДанныхСлужебный.Провести(Контекст, ВернутьОбъект);
КонецФункции
@ -181,19 +180,7 @@
// Неопределено - Если заполняется объект
Функция ДанныеСтроки() Экспорт
Контекст = Контекст();
Если ПустаяСтрока(Контекст.ТекущаяТабличнаяЧасть) Тогда
Возврат Неопределено;
КонецЕсли;
ДанныеТабличнойЧасти = ДанныеТабличнойЧасти(Контекст);
Если ДанныеТабличнойЧасти.Количество() Тогда
Возврат ДанныеТабличнойЧасти[ДанныеТабличнойЧасти.ВГраница()];
Иначе
ВызватьИсключение "Сначала необходимо добавить строку табличной части";
КонецЕсли;
Возврат ЮТКонструкторТестовыхДанныхСлужебный.ДанныеСтроки(Контекст);
КонецФункции
@ -203,8 +190,7 @@
// Структура - Данные объекта
Функция ДанныеОбъекта() Экспорт
Контекст = Контекст();
Возврат Контекст.Данные;
Возврат ЮТКонструкторТестовыхДанныхСлужебный.ДанныеОбъекта(Контекст);
КонецФункции
@ -212,71 +198,12 @@
#Область СлужебныйПрограммныйИнтерфейс
// Инициализирует конструктор тестовых данных
//
// Параметры:
// Менеджер - Строка - Имя менеджера. Примеры: Справочники.Товары, Документы.ПриходТоваров
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
Функция Инициализировать(Менеджер) Экспорт
Процедура Инициализировать(Менеджер) Экспорт
Контекст = НовыйКонтекстКонструктора(Менеджер);
ЮТКонтекст.УстановитьЗначениеКонтекста(КлючКонтекста(), Контекст);
Контекст = ЮТКонструкторТестовыхДанныхСлужебный.НовыйКонтекстКонструктора(Менеджер);
Возврат ЮТКонструкторТестовыхДанных;
КонецФункции
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Контекст.
//
// Возвращаемое значение:
// см. НовыйКонтекстКонструктора
Функция Контекст()
Возврат ЮТКонтекст.ЗначениеКонтекста(КлючКонтекста());
КонецФункции
// Новый контекст конструктора.
//
// Параметры:
// Менеджер - Произвольный
//
// Возвращаемое значение:
// Структура - Новый контекст конструктора:
// * Менеджер - Произвольный
// * Данные - Структура
// * Метаданные - см. ЮТМетаданные.ОписаниеОбъектМетаданных
// * ТекущаяТабличнаяЧасть - Строка -
// * ДополнительныеСвойства - Структура
Функция НовыйКонтекстКонструктора(Менеджер)
Контекст = Новый Структура("Менеджер, Данные, Метаданные", Менеджер, Новый Структура());
Контекст.Вставить("Менеджер", Менеджер);
Контекст.Вставить("Данные", Новый Структура());
Контекст.Вставить("Метаданные", ЮТМетаданные.ОписаниеОбъектМетаданных(Менеджер));
Контекст.Вставить("ТекущаяТабличнаяЧасть", "");
Контекст.Вставить("ДополнительныеСвойства", Новый Структура());
Возврат Контекст;
КонецФункции
Функция КлючКонтекста()
Возврат "КонструкторТестовыхДанных";
КонецФункции
Функция ДанныеТабличнойЧасти(Контекст)
Возврат Контекст.Данные[Контекст.ТекущаяТабличнаяЧасть];
КонецФункции
#КонецОбласти
#КонецЕсли

View File

@ -0,0 +1,23 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:DataProcessor xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="d194ed15-c4ad-4920-8a01-1062507604ca">
<producedTypes>
<objectType typeId="feb4bd6a-59d7-4b74-98a7-c722b4300cc1" valueTypeId="4a6b9b50-8e10-4172-ab37-7ec247e39f1a"/>
<managerType typeId="6c763c70-caff-423c-a7db-0024c94f60ab" valueTypeId="5df0b0b8-38c5-4709-b2ea-865d8e990c86"/>
</producedTypes>
<name>ЮТКонструкторТестовыхДанных</name>
<synonym>
<key>ru</key>
<value>Конструктор тестовых данных</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<defaultForm>DataProcessor.ЮТКонструкторТестовыхДанных.Form.КлиентскийКонструктор</defaultForm>
<forms uuid="c0ef2e2b-96b6-4e4c-b41d-32d571d74653">
<name>КлиентскийКонструктор</name>
<synonym>
<key>ru</key>
<value>Клиентский конструктор</value>
</synonym>
<usePurposes>PersonalComputer</usePurposes>
<usePurposes>MobileDevice</usePurposes>
</forms>
</mdclass:DataProcessor>

View File

@ -1,20 +1,27 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="36bb00a3-9e36-423a-9421-935867c7993e">
<mdclass:Subsystem xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:core="http://g5.1c.ru/v8/dt/mcore" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="36bb00a3-9e36-423a-9421-935867c7993e">
<name>ЮТДвижок</name>
<synonym>
<key>ru</key>
<value>Юнит тесты</value>
</synonym>
<includeInCommandInterface>true</includeInCommandInterface>
<picture xsi:type="core:PictureRef">
<picture>CommonPicture.ЮТПодсистема</picture>
</picture>
<content>CommonModule.Мокито</content>
<content>CommonModule.МокитоОбучение</content>
<content>CommonModule.МокитоПроверки</content>
<content>CommonModule.МокитоСлужебный</content>
<content>CommonModule.ЮТест</content>
<content>CommonModule.ЮТЗапросы</content>
<content>CommonModule.ЮТЗапросыВызовСервера</content>
<content>CommonModule.ЮТЗапросыКлиентСервер</content>
<content>CommonModule.ЮТИсполнительКлиент</content>
<content>CommonModule.ЮТИсполнительКлиентСервер</content>
<content>CommonModule.ЮТИсполнительСервер</content>
<content>CommonModule.ЮТКонструкторВариантов</content>
<content>CommonModule.ЮТКонструкторТестовыхДанных</content>
<content>CommonModule.ЮТКонструкторТестовыхДанныхСлужебный</content>
<content>CommonModule.ЮТКонтекст</content>
<content>CommonModule.ЮТКонтекстКлиент</content>
<content>CommonModule.ЮТКонтекстСервер</content>
@ -24,6 +31,7 @@
<content>CommonModule.ЮТМетаданные</content>
<content>CommonModule.ЮТМетаданныеПовтИсп</content>
<content>CommonModule.ЮТМетаданныеСервер</content>
<content>CommonModule.ЮТНастройкиВыполнения</content>
<content>CommonModule.ЮТОбщий</content>
<content>CommonModule.ЮТОбщийВызовСервера</content>
<content>CommonModule.ЮТОтчет</content>
@ -31,15 +39,21 @@
<content>CommonModule.ЮТОтчетJUnit</content>
<content>CommonModule.ЮТПараметрыЗапуска</content>
<content>CommonModule.ЮТПовторногоИспользования</content>
<content>CommonModule.ЮТПредикаты</content>
<content>CommonModule.ЮТПредикатыКлиентСервер</content>
<content>CommonModule.ЮТРасширения</content>
<content>CommonModule.ЮТРегистрацияОшибок</content>
<content>CommonModule.ЮТСобытия</content>
<content>CommonModule.ЮТСравнениеКлиентСервер</content>
<content>CommonModule.ЮТСравнениеСервер</content>
<content>CommonModule.ЮТТестовыеДанные</content>
<content>CommonModule.ЮТТестовыеДанныеВызовСервера</content>
<content>CommonModule.ЮТТестовыеДанныеСлужебный</content>
<content>CommonModule.ЮТТесты</content>
<content>CommonModule.ЮТУтверждения</content>
<content>CommonModule.ЮТУтвержденияИБ</content>
<content>CommonModule.ЮТФабрика</content>
<content>CommonModule.ЮТФайлы</content>
<content>CommonModule.ЮТФильтрация</content>
<content>CommonModule.ЮТЧитатель</content>
<content>CommonModule.ЮТЧитательСервер</content>
@ -52,4 +66,6 @@
<content>DataProcessor.ЮТHTTPСервисЗапрос</content>
<content>DataProcessor.ЮТЮнитТесты</content>
<content>CommonTemplate.ЮТОписаниеМетаданных</content>
<content>CommonPicture.ЮТПодсистема</content>
<content>DataProcessor.ЮТКонструкторТестовыхДанных</content>
</mdclass:Subsystem>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="b5fd9106-1b76-4e21-987e-12d440e36400">
<name>ЮТПодражатель_Реализация_Банки</name>
<synonym>
<key>ru</key>
<value>ЮТПодражатель реализация банки</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<content>CommonModule.ЮТПодражатель_Банки</content>
<parentSubsystem>Subsystem.ЮТПодражатель.Subsystem.ЮТПодражательРеализации</parentSubsystem>
</mdclass:Subsystem>

View File

@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<cmi:CommandInterface xmlns:cmi="http://g5.1c.ru/v8/dt/cmi"/>

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="82c2f4c4-1684-4483-a709-67a48f14c63c">
<name>ЮТПодражатель_Реализация_Компании</name>
<synonym>
<key>ru</key>
<value>ЮТПодражатель реализация компании</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<content>CommonModule.ЮТПодражатель_Компании</content>
<content>CommonTemplate.ЮТ_СловарьПодражателя_Компании_Наименования_ru</content>
<content>CommonTemplate.ЮТ_СловарьПодражателя_Компании_ПрефиксыНаименований_ru</content>
<parentSubsystem>Subsystem.ЮТПодражатель.Subsystem.ЮТПодражательРеализации</parentSubsystem>
</mdclass:Subsystem>

Some files were not shown because too many files have changed in this diff Show More