diff --git a/.github/workflows/build-on-windows.yml b/.github/workflows/build-on-windows.yml
new file mode 100644
index 000000000..de527584a
--- /dev/null
+++ b/.github/workflows/build-on-windows.yml
@@ -0,0 +1,76 @@
+name: Build
+on:
+ workflow_call:
+ inputs:
+ v8_version:
+ type: string
+ required: true
+
+ src_artifact_name:
+ type: string
+ required: true
+
+ artifact_name:
+ type: string
+ required: true
+jobs:
+ build:
+ runs-on: windows-latest
+ defaults:
+ run:
+ shell: pwsh
+ steps:
+
+ - name: install Onec Platform
+ uses: alkoleft/onec-setup-build-env-action@develop
+ with:
+ type: onec
+ onec_version: ${{ inputs.v8_version }}
+ cache: true
+ env:
+ ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }}
+ ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }}
+ timeout-minutes: 10
+
+ - name: download artifact
+ uses: actions/download-artifact@v3
+ with:
+ name: ${{ inputs.src_artifact_name }}
+
+ - run: |
+ mkdir export
+ mkdir binary
+ cd export
+ 7z x ../export.7z -y
+
+ - name: create IB
+ run: ibcmd infobase create --db-path=file-db --import=export\configuration --apply --force
+ timeout-minutes: 5
+
+ - name: import yaxunit
+ run: ibcmd infobase config import --db-path=file-db --extension=YAXUNIT export\yaxunit
+ timeout-minutes: 5
+
+ - name: import tests
+ run: ibcmd infobase config import --db-path=file-db --extension=tests export\tests
+ timeout-minutes: 5
+
+ - name: save yaxunit
+ run: ibcmd infobase config save --db-path=file-db --extension=YAXUNIT binary\yaxunit.cfe
+ timeout-minutes: 5
+
+ - name: save tests
+ run: ibcmd infobase config save --db-path=file-db --extension=tests binary\tests.cfe
+ timeout-minutes: 5
+
+ - name: save configuration
+ run: ibcmd infobase config save --db-path=file-db binary\configuration.cf
+ timeout-minutes: 5
+
+ - name: upload-artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ inputs.artifact_name }}
+ path: binary\*.*
+ if-no-files-found: error
+ retention-days: 1
diff --git a/.github/workflows/deploy-documentation.yml b/.github/workflows/deploy-documentation.yml
index 42fa836f6..8c07ce64f 100644
--- a/.github/workflows/deploy-documentation.yml
+++ b/.github/workflows/deploy-documentation.yml
@@ -1,4 +1,4 @@
-name: Deploy to GitHub Pages
+name: Documentation
on:
push:
diff --git a/.github/workflows/export-xml.yml b/.github/workflows/export-xml.yml
new file mode 100644
index 000000000..7b59112e5
--- /dev/null
+++ b/.github/workflows/export-xml.yml
@@ -0,0 +1,66 @@
+name: Export to designer xml
+on:
+ workflow_call:
+ inputs:
+ edt_version:
+ type: string
+ required: true
+
+ artifact_name:
+ type: string
+ required: true
+jobs:
+ build:
+ runs-on: ubuntu-latest
+ steps:
+ - uses: actions/checkout@v3
+
+ - name: install EDT
+ uses: IT-Medved/onec-setup-build-env-action@develop
+ with:
+ type: edt
+ edt_version: ${{ inputs.edt_version }}
+ cache: true
+ env:
+ ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }}
+ ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }}
+ timeout-minutes: 10
+
+ - name: convert configuration src
+ uses: alkoleft/onec-edtcli-command-action@main
+ with:
+ export: true
+ from: fixtures/demo-configuration
+ to: export/configuration
+ timeout: 5
+ timeout-minutes: 10
+
+ - name: convert yaxunit src
+ uses: alkoleft/onec-edtcli-command-action@main
+ with:
+ export: true
+ from: exts/yaxunit
+ to: export/yaxunit
+ timeout: 5
+ timeout-minutes: 10
+
+ - name: convert tests src
+ uses: alkoleft/onec-edtcli-command-action@main
+ with:
+ export: true
+ from: tests
+ to: export/tests
+ timeout: 5
+ timeout-minutes: 10
+
+ - run: |
+ cd export
+ 7za a -t7z ../export.7z ./
+
+ - name: upload-artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: ${{ inputs.artifact_name }}
+ path: export.7z
+ if-no-files-found: error
+ retention-days: 1
diff --git a/.github/workflows/main-build.yml b/.github/workflows/main-build.yml
new file mode 100644
index 000000000..49fd1b6c5
--- /dev/null
+++ b/.github/workflows/main-build.yml
@@ -0,0 +1,64 @@
+name: Build and test
+on:
+ push:
+ branches: [ feature/**, develop ]
+ pull_request_target:
+ branches: [ develop ]
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}
+ cancel-in-progress: true
+
+permissions:
+ contents: read
+ checks: write
+ id-token: write
+
+jobs:
+ export_to_designer:
+ name: Export to designer xml
+ uses: ./.github/workflows/export-xml.yml
+ with:
+ edt_version: 2023.1.2
+ artifact_name: designer-src
+ secrets: inherit
+
+ build_artifacts:
+ name: Build artifacts
+ uses: ./.github/workflows/build-on-windows.yml
+ needs: export_to_designer
+ with:
+ v8_version: 8.3.21.1895
+ src_artifact_name: designer-src
+ artifact_name: build-artifacts
+ secrets: inherit
+
+ tests_linux_ru:
+ name: Tests Linux 8.3.21.1895 ru_RU
+ uses: ./.github/workflows/run-tests-linux.yml
+ needs: build_artifacts
+ with:
+ v8_version: 8.3.21.1895
+ artifact_name: build-artifacts
+ secrets: inherit
+
+ tests_linux_en:
+ name: Tests Linux 8.3.21.1895 en_US
+ uses: ./.github/workflows/run-tests-linux.yml
+ if: false
+ needs: build_artifacts
+ with:
+ v8_version: 8.3.21.1895
+ artifact_name: build-artifacts
+ locale: en_US
+ fail_on_failure: false
+ secrets: inherit
+
+ tests_windows_ru:
+ name: Tests Windows 8.3.21.1895 ru_RU
+ uses: ./.github/workflows/run-tests-windows.yml
+ needs: build_artifacts
+ with:
+ v8_version: 8.3.21.1895
+ artifact_name: build-artifacts
+ secrets: inherit
\ No newline at end of file
diff --git a/.github/workflows/run-tests-linux.yml b/.github/workflows/run-tests-linux.yml
new file mode 100644
index 000000000..eba2e54c4
--- /dev/null
+++ b/.github/workflows/run-tests-linux.yml
@@ -0,0 +1,167 @@
+name: Run tests on Linux
+
+on:
+ workflow_call:
+ inputs:
+ v8_version:
+ description: 'Platform version'
+ type: string
+ required: true
+
+ locale:
+ type: string
+ required: false
+ default: ru_RU
+
+ artifact_name:
+ type: string
+ required: true
+
+ fail_on_failure:
+ type: boolean
+ required: false
+ default: true
+
+permissions:
+ contents: read
+ checks: write
+ id-token: write
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.v8_version }}-${{ inputs.locale }}-Linux
+ cancel-in-progress: true
+
+jobs:
+ execute-tests:
+ runs-on: ubuntu-latest
+ steps:
+
+ - name: download artifact
+ uses: actions/download-artifact@v3
+ with:
+ name: ${{ inputs.artifact_name }}
+ path: binary
+
+ - name: prepare
+ run: |
+ sudo DEBIAN_FRONTEND=noninteractive apt-get install -y locales
+ sudo ln -s /usr/lib/x86_64-linux-gnu/libenchant-2.so.2 /usr/lib/libenchant.so.1
+ sudo localedef -i ${{ inputs.locale }} -c -f UTF-8 -A /usr/share/locale/locale.alias ${{ inputs.locale }}.UTF-8
+ mkdir reports -p
+
+ - name: install platform
+ uses: IT-Medved/onec-setup-build-env-action@develop
+ with:
+ type: onec
+ onec_version: ${{ inputs.v8_version }}
+ cache: false
+ env:
+ ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }}
+ ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }}
+ timeout-minutes: 10
+
+ - name: install x11
+ run: sudo apt-get install -y x11-xserver-utils
+ continue-on-error: true
+ timeout-minutes: 5
+
+ - name: install xserver-dummy
+ run: sudo apt-get install -y xserver-xorg-video-dummy
+ timeout-minutes: 5
+
+ - name: create dummy-config
+ uses: DamianReeves/write-file-action@master
+ with:
+ path: dummy-1920x1080.conf
+ contents: |
+ Section "Monitor"
+ Identifier "Monitor0"
+ HorizSync 28.0-80.0
+ VertRefresh 48.0-75.0
+ # https://arachnoid.com/modelines/
+ # 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
+ Modeline "1920x1080_60.00" 172.80 1920 2040 2248 2576 1080 1081 1084 1118 -HSync +Vsync
+ EndSection
+ Section "Device"
+ Identifier "Card0"
+ Driver "dummy"
+ VideoRam 256000
+ EndSection
+ Section "Screen"
+ DefaultDepth 24
+ Identifier "Screen0"
+ Device "Card0"
+ Monitor "Monitor0"
+ SubSection "Display"
+ Depth 24
+ Modes "1920x1080_60.00"
+ EndSubSection
+ EndSection
+
+ - name: start xserver
+ run: sudo X :99 -config dummy-1920x1080.conf &
+ timeout-minutes: 5
+
+ - name: create IB
+ run: ibcmd infobase create --db-path=file-db --load=binary/configuration.cf --apply --force
+ timeout-minutes: 5
+
+ - name: load yaxunit
+ run: |
+ ibcmd infobase config load --db-path=file-db --extension=YAXUNIT --force binary/yaxunit.cfe
+ ibcmd infobase config apply --db-path=file-db --extension=YAXUNIT --force
+ ibcmd infobase config extension update --db-path=file-db --name=YAXUNIT --safe-mode=no --unsafe-action-protection=no
+ timeout-minutes: 5
+
+ - name: load tests
+ run: |
+ ibcmd infobase config load --db-path=file-db --extension=tests --force binary/tests.cfe
+ ibcmd infobase config apply --db-path=file-db --extension=tests --force
+ ibcmd infobase config extension update --db-path=file-db --name=tests --safe-mode=no --unsafe-action-protection=no
+ timeout-minutes: 5
+
+ - name: run server
+ run: ibsrv --db-path=file-db --daemon
+
+ - name: create test-config
+ uses: DamianReeves/write-file-action@master
+ with:
+ path: unit.json
+ contents: |
+ {
+ "reportFormat": "jUnit",
+ "reportPath": "reports/report.xml",
+ "closeAfterTests": true,
+ "exitCode": "exit-code.txt",
+ "logging": {
+ "console": true
+ }
+ }
+
+ - name: run tests
+ run: 1cv8c /WS "http://localhost:8314" /C"RunUnitTests=${{github.workspace}}/unit.json" /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage /Out ${{github.workspace}}/output.log
+ timeout-minutes: 5
+ env:
+ DISPLAY: :99
+ LANG: "${{ inputs.locale }}.UTF-8"
+
+ - name: view output
+ if: always()
+ run: cat ./output.log
+
+ - name: upload-artifact
+ uses: actions/upload-artifact@v3
+ if: always()
+ with:
+ name: Tests report. Linux ${{ inputs.v8_version }} ${{ inputs.locale }}
+ path: reports/*.*
+
+ - name: Publish Test Report
+ uses: mikepenz/action-junit-report@v3
+ if: always()
+ with:
+ job_name: Tests Linux ${{ inputs.v8_version }} ${{ inputs.locale }}
+ check_name: Tests report. Linux ${{ inputs.v8_version }} ${{ inputs.locale }}
+ report_paths: reports/report.xml
+ fail_on_failure: ${{ inputs.fail_on_failure }}
+ require_passed_tests: true
\ No newline at end of file
diff --git a/.github/workflows/run-tests-windows.yml b/.github/workflows/run-tests-windows.yml
new file mode 100644
index 000000000..d5d2b62ba
--- /dev/null
+++ b/.github/workflows/run-tests-windows.yml
@@ -0,0 +1,117 @@
+name: Run tests on Windows
+
+on:
+ workflow_call:
+ inputs:
+ v8_version:
+ description: 'Platform version'
+ type: string
+ required: true
+
+ locale:
+ type: string
+ required: false
+ default: ru_RU
+
+ artifact_name:
+ type: string
+ required: true
+
+ fail_on_failure:
+ type: boolean
+ required: false
+ default: true
+
+concurrency:
+ group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.v8_version }}-${{ inputs.locale }}-Windows
+ cancel-in-progress: true
+
+jobs:
+ execute-tests:
+ runs-on: windows-latest
+ defaults:
+ run:
+ shell: pwsh
+
+ steps:
+
+ - name: download artifact
+ uses: actions/download-artifact@v3
+ with:
+ name: ${{ inputs.artifact_name }}
+ path: binary
+
+ - name: install platform
+ uses: alkoleft/onec-setup-build-env-action@develop
+ with:
+ type: onec
+ onec_version: ${{ inputs.v8_version }}
+ env:
+ ONEC_USERNAME: ${{ secrets.ONEC_USERNAME }}
+ ONEC_PASSWORD: ${{ secrets.ONEC_PASSWORD }}
+ timeout-minutes: 10
+
+ - name: create IB
+ run: |
+ mkdir data\data
+ ibcmd.exe infobase create --data=data --load=binary\configuration.cf --apply --force
+ timeout-minutes: 5
+
+ - name: load yaxunit
+ run: |
+ ibcmd.exe infobase config load --data=data --extension=YAXUNIT --force binary\yaxunit.cfe
+ ibcmd.exe infobase config apply --data=data --extension=YAXUNIT --force
+ ibcmd.exe infobase config extension update --data=data --name=YAXUNIT --safe-mode=no --unsafe-action-protection=no
+ timeout-minutes: 5
+
+ - name: load tests
+ run: |
+ ibcmd.exe infobase config load --data=data --extension=tests --force binary\tests.cfe
+ ibcmd.exe infobase config apply --data=data --extension=tests --force
+ ibcmd.exe infobase config extension update --data=data --name=tests --safe-mode=no --unsafe-action-protection=no
+ timeout-minutes: 5
+
+ - name: create test-config
+ uses: DamianReeves/write-file-action@master
+ with:
+ path: unit.json
+ contents: |
+ {
+ "reportFormat": "jUnit",
+ "reportPath": "reports\\report.xml",
+ "closeAfterTests": true,
+ "exitCode": "exit-code.txt",
+ "logging": {
+ "console": true,
+ "file": "execute.log"
+ }
+ }
+
+ - name: Test
+ run: |
+ Start-Process ibsrv.exe -ArgumentList "--data=data"
+ Start-Process -NoNewWindow -PassThru -Wait 1cv8c.exe -ArgumentList '/WS "http://localhost:8314" /C"RunUnitTests=unit.json" /L ru /VL ${{ inputs.locale }} /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage /Out 1cv8c-output.log'
+ timeout-minutes: 10
+
+ - name: view output
+ if: always()
+ run: type execute.log
+
+ - name: view output
+ if: always()
+ run: type 1cv8c-output.log
+
+ - name: upload-artifact
+ uses: actions/upload-artifact@v3
+ with:
+ name: Tests report. Windows ${{ inputs.v8_version }} ${{ inputs.locale }}
+ path: reports/
+
+ - name: Publish Test Report
+ uses: mikepenz/action-junit-report@v3
+ with:
+ job_name: Tests Windows ${{ inputs.v8_version }} ${{ inputs.locale }}
+ check_name: Tests report. Windows ${{ inputs.v8_version }} ${{ inputs.locale }}
+ report_paths: reports/report.xml
+ fail_on_failure: ${{ inputs.fail_on_failure }}
+ require_passed_tests: true
diff --git a/.github/workflows/sq.yml b/.github/workflows/sq.yml
index ec3173c6d..4fe09291b 100644
--- a/.github/workflows/sq.yml
+++ b/.github/workflows/sq.yml
@@ -43,7 +43,8 @@ jobs:
-Dsonar.host.url=https://sonar.openbsl.ru
-Dsonar.branch.name=${{ env.BRANCH_NAME }}
-Dsonar.projectVersion=${{ steps.extract_version.outputs.version }}
-
+ -Dsonar.qualitygate.wait=true
+ -Dsonar.qualitygate.timeout=300
# Анализ проекта в SonarQube (PR)
# https://docs.sonarqube.org/latest/analysis/pull-request/
- name: Анализ в SonarQube (pull-request)
@@ -57,3 +58,5 @@ jobs:
-Dsonar.pullrequest.branch=${{ github.event.pull_request.head.ref }}
-Dsonar.pullrequest.base=${{ github.event.pull_request.base.ref }}
-Dsonar.scm.revision=${{ github.event.pull_request.head.sha }}
+ -Dsonar.qualitygate.wait=true
+ -Dsonar.qualitygate.timeout=300
diff --git a/README.md b/README.md
index b4fb4ed77..7c0797b62 100644
--- a/README.md
+++ b/README.md
@@ -8,6 +8,9 @@
[![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)
+[![Build and test](https://github.com/bia-technologies/yaxunit/actions/workflows/main-build.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions/workflows/main-build.yml)
+[![Build ocumentation](https://github.com/bia-technologies/yaxunit/actions/workflows/deploy-documentation.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions/workflows/deploy-documentation.yml)
+
Обсудить в [Telegram чате](https://t.me/BIAOpenTools/12)
----
diff --git a/documentation/blog/2023/09/05-engine-release.md b/documentation/blog/2023/09/05-engine-release.md
new file mode 100644
index 000000000..82821100f
--- /dev/null
+++ b/documentation/blog/2023/09/05-engine-release.md
@@ -0,0 +1,38 @@
+---
+title: YaxUnit. Версия 23.08
+authors: alkoleft
+tags: [releases, yaxunit]
+---
+
+[Release 23.08](https://github.com/bia-technologies/edt-test-runner/releases/tag/23.08)
+
+## Новое в версии
+
+### Тестовые данные
+
+* Загрузка данных из табличного документа или таблицы markdown [#133](https://github.com/bia-technologies/yaxunit/issues/133), [документация](https://bia-technologies.github.io/yaxunit/docs/user-api/test-data/#%D0%B7%D0%B0%D0%B3%D1%80%D1%83%D0%B7%D0%BA%D0%B0-%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85-%D0%B8%D0%B7-%D0%BC%D0%B0%D0%BA%D0%B5%D1%82%D0%BE%D0%B2). Спасибо [@dlyubanevich](https://github.com/dlyubanevich)
+* Добавить возможность указывать тип фикции [#121](https://github.com/bia-technologies/yaxunit/issues/121)
+* Добавить возможность получать случайное значение перечисления [#132](https://github.com/bia-technologies/yaxunit/issues/132)
+* Тестовые данные, добавить метод СлучайныйИдентификатор [#102](https://github.com/bia-technologies/yaxunit/issues/102)
+
+### Утверждения
+
+* Добавить в ассерты и предикаты поддержку проверки по регулярному выражению [#138](https://github.com/bia-technologies/yaxunit/issues/138). Спасибо [@Daabramov](https://github.com/Daabramov)
+
+### Прочее
+
+* Запуск и перезапуск тестов из предприятия [#49](https://github.com/bia-technologies/yaxunit/issues/49), [документация](https://bia-technologies.github.io/yaxunit/docs/yaxunit-ui)
+* Пауза [#136](https://github.com/bia-technologies/yaxunit/issues/136)
+* Унифицированный механизм подключения внешних компонент - тихая установка, работа с отключенными синхронными вызовами.
+
+### CI
+
+* Github CI, реализовано автотестирование движка под windows и linux [#142](https://github.com/bia-technologies/yaxunit/pull/142)
+* Вывод лога выполнения тестирования в консоль [#144](https://github.com/bia-technologies/yaxunit/issues/144)
+
+## Исправленные ошибки
+
+### Прочее
+
+* Подтягиваются глобальные общие модули [#148](https://github.com/bia-technologies/yaxunit/pull/148). Спасибо [@SeiOkami](https://github.com/SeiOkami)
+* Исправлены выявленные ошибки [#130](https://github.com/bia-technologies/yaxunit/pull/130). Спасибо [@potoyalo](https://github.com/potoyalo)
diff --git a/documentation/docs/images/config-ui.png b/documentation/docs/images/config-ui.png
index 07bc130eb..65b527746 100644
Binary files a/documentation/docs/images/config-ui.png and b/documentation/docs/images/config-ui.png differ
diff --git a/documentation/docs/images/ui-run-menu.png b/documentation/docs/images/ui-run-menu.png
new file mode 100644
index 000000000..1f1bd4a5c
Binary files /dev/null and b/documentation/docs/images/ui-run-menu.png differ
diff --git a/documentation/docs/images/ui-run-tests.png b/documentation/docs/images/ui-run-tests.png
new file mode 100644
index 000000000..811e7fb74
Binary files /dev/null and b/documentation/docs/images/ui-run-tests.png differ
diff --git a/documentation/docs/run/configuration.md b/documentation/docs/run/configuration.md
index 5bdfe4be4..1c60a92a9 100644
--- a/documentation/docs/run/configuration.md
+++ b/documentation/docs/run/configuration.md
@@ -31,7 +31,8 @@
| Имя параметра | Тип | Значение по умолчанию | Описание |
|---------------|-----------|-----------------------|-----------------------------------------------------------------------------------------------------------------------------|
| `file` | `String` | `""` | Путь к файлу лога |
-| `enable` | `Boolean` | `Null` | Признак использования логирования. Если не указан, зависит от параметра `file`, если он указан - вкл, если не указан - выкл |
+| `enable` | `Boolean` | `Null` | Использование логирвания.
Если не указан, зависит от параметра `file` и `console`, если установлены - вкл, если нет - выкл |
+| `console` | `Boolean` | `false` | Вывод лога в stdout (консоль) |
| `level` | `String` | `"debug"` | Уровень детализации лога. Возможные значения: `"debug"`, `"info"`, `"error"` |
Примеры:
diff --git a/documentation/docs/run/run.md b/documentation/docs/run/run.md
index 130632a7c..11e44b1b5 100644
--- a/documentation/docs/run/run.md
+++ b/documentation/docs/run/run.md
@@ -20,10 +20,18 @@
![Конфигуратор](images/from-configurator.png)
* Воспользоваться [интерфейсом настройки](../yaxunit-ui.md#интерфейс-настройки-конфигурации)
+## Запуск из предприятия
+
+Для запуска тестов из предприятия необходимо воспользоваться командой [Запуск тестирования](../yaxunit-ui.md#запуск-тестов)
+
+![Запуск тестов](../images/ui-run-tests.png)
+
## Строка запуска предприятия
`[путь к клиенту 1С] ENTERPRISE [Параметры подключения к ИБ] [Параметры авторизации] /C RunUnitTests=/путь/к/конфигурационному/файлу`
+Для формирования строки запуска можно воспользоваться [интерфейсом настройки](../yaxunit-ui.md#интерфейс-настройки-конфигурации)
+
Пример:
`"C:\Program Files\1cv8\8.3.18.1698\bin\1cv8c.exe" ENTERPRISE /IBName MyInfoBase /N Admin /C RunUnitTests=C:\tmp\test-config.json`
diff --git a/documentation/docs/user-api/assertions/assertions-base.md b/documentation/docs/user-api/assertions/assertions-base.md
index 84d7c4dfd..6501b876c 100644
--- a/documentation/docs/user-api/assertions/assertions-base.md
+++ b/documentation/docs/user-api/assertions/assertions-base.md
@@ -8,7 +8,7 @@ tags: [Начало, Утверждения]
Доступ к утверждениям обеспечивает метод `ЮТест.ОжидаетЧто`, который возвращает инициализированный модуль `ЮТУтверждения`, реализующий работу с утверждениями.
-:::tip
+:::tip
Не рекомендуется обращаться к модулю `ЮТУтверждения` напрямую, используйте `ЮТест.ОжидаетЧто`
:::
@@ -29,63 +29,89 @@ tags: [Начало, Утверждения]
## Доступные методы
-* Сравнить значение используя
- * `Равно` - проверка на равенство конкретному значению. Для сериализуемых объектов идет сравнение по значению
- * `НеРавно` - проверка на не равенство конкретному значению. Для сериализуемых объектов идет сравнение по значению
- * `Больше` - проверяемое значение должно быть больше указанного
- * `БольшеИлиРавно` - проверяемое значение должно быть больше или равно указанному
- * `Меньше` - проверяемое значение должно быть меньше указанного
- * `МеньшеИлиРавно` - проверяемое значение должно быть меньше или равно указанному
- * `ЭтоНеопределено` - проверяемое значение должно быть равно `Неопределено`
- * `ЭтоНеНеопределено` - проверяемое значение должно быть не равно `Неопределено`
- * `ЭтоNull` - проверяемое значение должно быть равно `Null`
- * `ЭтоНеNull` - проверяемое значение должно быть не равно `Null`
- * `ЭтоИстина` - проверяемое значение должно быть истиной
- * `ЭтоНеИстина` - проверяемое значение не должно быть истиной
- * `ЭтоЛожь` - проверяемое значение должно быть ложью
- * `ЭтоНеЛожь` - проверяемое значение не должно быть ложью
-* Проверить заполненность
- * `Заполнено` - проверяет заполненность значения
- * `НеЗаполнено` - проверяет незаполненность значения
- * `Существует` - проверяет существование (не равно `Null` и `Неопределено`) значения
- * `НеСуществует` - проверяет не существование (не равно `Null` и `Неопределено`) значения
-* Проверить длину строки (размер коллекции)
- * `ИмеетДлину` - проверяет, что значение имеет указанную длину (размер)
- * `ИмеетДлинуБольше` - проверяет, что значение имеет длину (размер), которая больше указанной
- * `ИмеетДлинуМеньше` - проверяет, что значение имеет длину (размер), которая меньше указанной
- * `НеИмеетДлину` - проверяет, что длина (размер) значения не равна указанной
-* Проверить вхождения подстроки
- * `Содержит` - проверяемая строка содержит указанную подстроку
- * `НеСодержит` - проверяемая строка не содержит указанную подстроку
- * `НачинаетсяС` - проверяемая строка начинается с указанной строки
- * `ЗаканчиваетсяНа` - проверяемая строка заканчивается на указанную строку
-* Проверить вхождения значения в интервал
- * `МеждуВключаяГраницы` - проверяемое значение находиться в указанному интервале (включая границы)
- * `МеждуИсключаяГраницы` - проверяемое значение находиться в указанному интервале (исключая границы)
- * `МеждуВключаяНачалоГраницы` - проверяемое значение находиться в указанному интервале (включая левую границу и исключая правую)
- * `МеждуВключаяОкончаниеГраницы` - проверяемое значение находиться в указанному интервале (исключая левую границу и включая правую)
-* Проверить тип значения
- * `ИмеетТип` - проверяемое значение должно иметь указанный тип
- * `НеИмеетТип` - тип проверяемого значения должен отличаться от указанного
-* Проверить выполнение метода
- * `ВыбрасываетИсключение` - проверят, что указанный метод объекта выбрасывает исключение
- * `НеВыбрасываетИсключение` - проверят, что указанный метод объекта не выбрасывает исключение
-* Проверить наличие свойств/реквизитов
- * `ИмеетСвойство` - проверяемый объект должен содержать указанное свойство
- * `НеИмеетСвойства` - проверяемый объект не содержит указанное свойство
- * `ИмеетСвойстваРавные` - проверяемый объект должен содержать указанный набор свойств/реквизитов и значений
-* Проверить элементы коллекции
- * `Содержит` - проверяемая коллекция должна содержать указанный элемент
- * `НеСодержит` - проверяемая коллекция не должна содержать указанный элемент
- * `КаждыйЭлементСодержитСвойство` - проверяет, что каждый элемент коллекции имеет указанное свойство
- * `КаждыйЭлементСодержитСвойствоСоЗначением` - проверяет, что каждый элемент коллекции имеет указанное свойство, которое равно ожидаемому значению
- * `ЛюбойЭлементСодержитСвойство` - проверяет, что в коллекции есть элемент содержащий указанное свойство
- * `ЛюбойЭлементСодержитСвойствоСоЗначением` - проверяет, что в коллекции есть элемент содержащий указанное свойство, которое равно ожидаемому значению
-
:::tip
Полный и актуальный набор методов смотрите в описании API
:::
+### Сравнение значений
+
+* `Равно` - проверка на равенство конкретному значению. Для сериализуемых объектов идет сравнение по значению
+* `НеРавно` - проверка на не равенство конкретному значению. Для сериализуемых объектов идет сравнение по значению
+* `Больше` - проверяемое значение должно быть больше указанного
+* `БольшеИлиРавно` - проверяемое значение должно быть больше или равно указанному
+* `Меньше` - проверяемое значение должно быть меньше указанного
+* `МеньшеИлиРавно` - проверяемое значение должно быть меньше или равно указанному
+* `ЭтоНеопределено` - проверяемое значение должно быть равно `Неопределено`
+* `ЭтоНеНеопределено` - проверяемое значение должно быть не равно `Неопределено`
+* `ЭтоNull` - проверяемое значение должно быть равно `Null`
+* `ЭтоНеNull` - проверяемое значение должно быть не равно `Null`
+* `ЭтоИстина` - проверяемое значение должно быть истиной
+* `ЭтоНеИстина` - проверяемое значение не должно быть истиной
+* `ЭтоЛожь` - проверяемое значение должно быть ложью
+* `ЭтоНеЛожь` - проверяемое значение не должно быть ложью
+
+### Проверка заполненности
+
+* `Заполнено` - проверяет заполненность значения
+* `НеЗаполнено` - проверяет незаполненность значения
+* `Существует` - проверяет существование (не равно `Null` и `Неопределено`) значения
+* `НеСуществует` - проверяет не существование (не равно `Null` и `Неопределено`) значения
+
+### Проверка строк
+
+* `ИмеетДлину` - проверяет, что строка имеет указанную длину
+* `ИмеетДлинуБольше` - проверяет, что длин строки больше указанной
+* `ИмеетДлинуМеньше` - проверяет, что длина строки меньше указанной
+* `НеИмеетДлину` - проверяет, что длина строки отличается от указанной
+* `Содержит` - проверяемая строка содержит указанную подстроку
+* `НеСодержит` - проверяемая строка не содержит указанную подстроку
+* `НачинаетсяС` - проверяемая строка начинается с указанной строки
+* `ЗаканчиваетсяНа` - проверяемая строка заканчивается на указанную строку
+* `СодержитСтрокуПоШаблону` - проверяемая строка содержит подстроку, соответствующую регулярному выражению
+* `НеСодержитСтрокуПоШаблону` - проверяемая строка не содержит подстроку, соответствующую регулярному выражению
+
+### Проверка вхождения значения в интервал
+
+* `МеждуВключаяГраницы` - проверяемое значение находиться в указанному интервале (включая границы)
+* `МеждуИсключаяГраницы` - проверяемое значение находиться в указанному интервале (исключая границы)
+* `МеждуВключаяНачалоГраницы` - проверяемое значение находиться в указанному интервале (включая левую границу и исключая правую)
+* `МеждуВключаяОкончаниеГраницы` - проверяемое значение находиться в указанному интервале (исключая левую границу и включая правую)
+
+### Проверка типа значения
+
+* `ИмеетТип` - проверяемое значение должно иметь указанный тип
+* `НеИмеетТип` - тип проверяемого значения должен отличаться от указанного
+
+### Проверка выполнения метода
+
+* `ВыбрасываетИсключение` - проверят, что указанный метод объекта выбрасывает исключение
+* `НеВыбрасываетИсключение` - проверят, что указанный метод объекта не выбрасывает исключение
+
+### Проверка наличия свойств/реквизитов
+
+* `ИмеетСвойство` - проверяемый объект должен содержать указанное свойство
+* `НеИмеетСвойства` - проверяемый объект не содержит указанное свойство
+* `ИмеетСвойстваРавные` - проверяемый объект должен содержать указанный набор свойств/реквизитов и значений
+
+### Проверка коллекции
+
+* `ИмеетДлину` - проверяет, что коллекция имеет указанный размер
+* `ИмеетДлинуБольше` - проверяет, что коллекция имеет размер, который больше указанного
+* `ИмеетДлинуМеньше` - проверяет, что коллекция имеет размер, который меньше указанного
+* `НеИмеетДлину` - проверяет, что размер коллекции отличается от указанного
+* `Содержит` - проверяемая коллекция должна содержать указанный элемент
+* `НеСодержит` - проверяемая коллекция не должна содержать указанный элемент
+* `КаждыйЭлементСодержитСвойство` - проверяет, что каждый элемент коллекции имеет указанное свойство
+* `КаждыйЭлементСодержитСвойствоСоЗначением` - проверяет, что каждый элемент коллекции имеет указанное свойство, которое равно ожидаемому значению
+* `ЛюбойЭлементСодержитСвойство` - проверяет, что в коллекции есть элемент содержащий указанное свойство
+* `ЛюбойЭлементСодержитСвойствоСоЗначением` - проверяет, что в коллекции есть элемент содержащий указанное свойство, которое равно ожидаемому значению
+* `КаждыйЭлементСоответствуетПредикату` - проверяет, что элементы коллекции соответствуют переданным условиям
+* `ЛюбойЭлементСоответствуетПредикату` - проверяет, что коллекция содержит элемент, который соответствует переданным условиям
+
+### Проверка на соответствие набору условий, предикату
+
+* `СоответствуетПредикату` - проверяет, что объект или его свойство соответствует набору условий
+
### Проверка методов объекта
Для проверки работы методов объекта есть набор утверждений среди описанных выше (`ВыбрасываетИсключение` и `НеВыбрасываетИсключение`), но для их работы необходимо выполнить предварительные настройки.
@@ -106,53 +132,98 @@ tags: [Начало, Утверждения]
## Примеры
-1. Базовые проверки
-
- ```bsl
- ЮТест.ОжидаетЧто(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение
- .ИмеетТип("Число") // Проверим тип
- .Заполнено() // Заполненность проверяемого значения
- .Больше(0) // Сравним с нулем
- .Равно(5); // Проверим ожидаемый результат
- ```
-
-2. Проверка сложного объекта
-
- ```bsl
- Объект = ЮТОбщий.ЗначениеВМассиве("1", "2", "3");
- ЮТУтверждения.Что(Объект, "Проверка элементов массива")
- .Содержит("1")
- .НеСодержит(1)
- .Элемент(0).Равно("1")
- .Элемент(1).Равно("2")
- .Элемент(-1).Равно("3")
- .Свойство("[00]").Равно("1")
- .Свойство("[1]").Равно("2")
- .Свойство("[-1]").Равно("3")
- .НетСвойства(3)
- .НеИмеетСвойства("[3]");
-
- Объект.Добавить(Новый Структура("Первый, Второй", 1, ЮТОбщий.ЗначениеВМассиве(2)));
- ЮТУтверждения.Что(Объект, "Проверка свойства элемента массива")
- .Свойство("[3].Первый").Равно(1)
- .Свойство("[3].Второй[-1]").Равно(2)
- .Свойство("[3].Второй[0]").Равно(2)
- ```
-
-3. Проверка вызова метода
-
- ```bsl
- ЮТУтверждения.Что(ОМ_ЮТУтверждения)
- .Метод("МетодБезИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение"))
- .НеВыбрасываетИсключение()
- .НеВыбрасываетИсключение("Ожидаемое исключение");
- ЮТУтверждения.Что(ОМ_ЮТУтверждения)
- .Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение", 2))
- .ВыбрасываетИсключение("Слишком много фактических параметров");
- ЮТУтверждения.Что(ОМ_ЮТУтверждения)
- .Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение"))
- .ВыбрасываетИсключение("Исключение");
- ЮТУтверждения.Что(ОМ_ЮТУтверждения)
- .Метод("МетодБезИсключение")
- .ВыбрасываетИсключение("Недостаточно фактических параметров");
- ```
+### Базовые проверки
+
+```bsl
+ЮТест.ОжидаетЧто(2 + 3, "2 + 3") // Используя модуль утверждений установим проверяемое значение и пояснение
+ .ИмеетТип("Число") // Проверим тип
+ .Заполнено() // Заполненность проверяемого значения
+ .Больше(0) // Сравним с нулем
+ .Равно(5); // Проверим ожидаемый результат
+```
+
+### Проверка сложного объекта
+
+```bsl
+Объект = ЮТОбщий.ЗначениеВМассиве("1", "2", "3");
+ЮТУтверждения.Что(Объект, "Проверка элементов массива")
+ .Содержит("1")
+ .НеСодержит(1)
+ .Элемент(0).Равно("1")
+ .Элемент(1).Равно("2")
+ .Элемент(-1).Равно("3")
+ .Свойство("[00]").Равно("1")
+ .Свойство("[1]").Равно("2")
+ .Свойство("[-1]").Равно("3")
+ .НетСвойства(3)
+ .НеИмеетСвойства("[3]");
+
+Объект.Добавить(Новый Структура("Первый, Второй", 1, ЮТОбщий.ЗначениеВМассиве(2)));
+ЮТУтверждения.Что(Объект, "Проверка свойства элемента массива")
+ .Свойство("[3].Первый").Равно(1)
+ .Свойство("[3].Второй[-1]").Равно(2)
+ .Свойство("[3].Второй[0]").Равно(2)
+```
+
+### Проверка вызова метода
+
+```bsl
+ЮТУтверждения.Что(ОМ_ЮТУтверждения)
+ .Метод("МетодБезИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение"))
+ .НеВыбрасываетИсключение()
+ .НеВыбрасываетИсключение("Ожидаемое исключение");
+ЮТУтверждения.Что(ОМ_ЮТУтверждения)
+ .Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение", 2))
+ .ВыбрасываетИсключение("Слишком много фактических параметров");
+ЮТУтверждения.Что(ОМ_ЮТУтверждения)
+ .Метод("МетодИсключение", ЮТОбщий.ЗначениеВМассиве("Исключение"))
+ .ВыбрасываетИсключение("Исключение");
+ЮТУтверждения.Что(ОМ_ЮТУтверждения)
+ .Метод("МетодБезИсключение")
+ .ВыбрасываетИсключение("Недостаточно фактических параметров");
+```
+
+### Проверка соответствия предикату
+
+```bsl
+Дата = ЮТест.Данные().СлучайнаяДата();
+
+Объект = Новый Структура;
+Объект.Вставить("Число", 1);
+Объект.Вставить("Строка", "1");
+Объект.Вставить("Дата", Дата);
+Объект.Вставить("Массив", ЮТОбщий.ЗначениеВМассиве(1, "1"));
+
+ПроверкаЧисла = ЮТест.Предикат().Реквизит("Число")
+ .ИмеетТип(Тип("Число"))
+ .БольшеИлиРавно(1)
+ .МеньшеИлиРавно(10)
+ .Получить();
+ПроверкаДаты = ЮТест.Предикат().Реквизит("Дата")
+ .ИмеетТип(Новый ОписаниеТипов("Дата"))
+ .Равно(Дата)
+ .Получить();
+
+ЮТест.ОжидаетЧто(Объект)
+ .СоответствуетПредикату(ЮТест.Предикат()
+ .Заполнено()
+ .ИмеетТип("Структура"))
+ .СоответствуетПредикату(ПроверкаЧисла)
+ .СоответствуетПредикату(ПроверкаДаты)
+;
+```
+
+### Проверка элементов коллекции на соответствие предикату
+
+```bsl
+ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C1:R5C11", ОписанияТипов);
+Ютест.ОжидаетЧто(ТаблицаРезультатов)
+ .ИмеетТип("Массив")
+ .ИмеетДлину(3)
+ .КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат()
+ .Реквизит("Товар").Заполнено().ИмеетТип("СправочникСсылка.Товары")
+ .Реквизит("Период").Заполнено().ИмеетТип("Дата")
+ .Реквизит("Количество").Заполнено().ИмеетТип("Число")
+ .Реквизит("Цена").Заполнено().ИмеетТип("Число")
+ )
+```
diff --git a/documentation/docs/user-api/test-data/test-data.md b/documentation/docs/user-api/test-data/test-data.md
index bcb33d2e5..fca9b6acc 100644
--- a/documentation/docs/user-api/test-data/test-data.md
+++ b/documentation/docs/user-api/test-data/test-data.md
@@ -24,7 +24,7 @@ tags: [Начало, Тестовые данные]
В текущей версии тестовый движок предоставляет api для программного создания тестовых данных. За это отвечает общий модуль `ЮТТестовыеДанные`, к которому можно обратиться через метод `ЮТест.Данные()`.
-:::tip
+:::tip
Не рекомендуется обращаться к модулю `ЮТТестовыеДанные` напрямую, используйте `ЮТест.Данные()`
:::
@@ -35,100 +35,101 @@ tags: [Начало, Тестовые данные]
* Автоматически удалять созданные данные (для этого необходимо включить настройку теста `УдалениеТестовыхДанных()`)
* Работать с файлами
* Использовать таблицы markdown в качестве макетов данных
+* Генерировать таблицы значений из табличных документов и таблиц markdown
-Примеры
+## Примеры
-1. Генерация фейкового документа
+### Генерация фейкового документа
- ```bsl
- #Если Сервер Тогда
- Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
- #Иначе
- Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара");
- #КонецЕсли
+```bsl
+#Если Сервер Тогда
+ Конструктор = ЮТест.Данные().КонструкторОбъекта(Документы.ПриходТовара);
+#Иначе
+ Конструктор = ЮТест.Данные().КонструкторОбъекта("Документы.ПриходТовара");
+#КонецЕсли
- Конструктор
- .Фикция("Поставщик")
- .Фикция("Склад")
- .Фикция("Валюта")
- .Установить("Организация", ЮТест.Данные().КонструкторОбъекта("Справочники.Организации").Установить("КакойТоТамУчет", Истина))
- .ТабличнаяЧасть("Товары");
-
- Для Инд1 = 1 По ЮТест.Данные().СлучайноеЧисло(1, 5) Цикл
- Конструктор.ДобавитьСтроку()
- .Фикция("Товар")
- .Установить("Цена", ЮТест.Данные().СлучайноеПоложительноеЧисло(9999, 2))
- .Установить("Количество", ЮТест.Данные().СлучайноеПоложительноеЧисло(20))
- .Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество)
- КонецЦикла;
+ Конструктор
+ .Фикция("Поставщик")
+ .Фикция("Склад")
+ .Фикция("Валюта")
+ .Установить("Организация", ЮТест.Данные().КонструкторОбъекта("Справочники.Организации").Установить("КакойТоТамУчет", Истина))
+ .ТабличнаяЧасть("Товары");
+
+ Для Инд1 = 1 По ЮТест.Данные().СлучайноеЧисло(1, 5) Цикл
+ Конструктор.ДобавитьСтроку()
+ .Фикция("Товар")
+ .Установить("Цена", ЮТест.Данные().СлучайноеПоложительноеЧисло(9999, 2))
+ .Установить("Количество", ЮТест.Данные().СлучайноеПоложительноеЧисло(20))
+ .Установить("Сумма", Конструктор.ДанныеСтроки().Цена * Конструктор.ДанныеСтроки().Количество)
+ КонецЦикла;
- Ссылка = Конструктор.Провести();
- ```
+ Ссылка = Конструктор.Провести();
+```
-2. Генерация произвольных фейковых данных
+### Генерация произвольных фейковых данных
- ```bsl
- Функция ОписаниеСервера(Знач Идентификатор = Неопределено) Экспорт
-
- Описание = БазовоеОписаниеОбъекта(Идентификатор, "СРВ");
-
- Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес());
- Описание.Вставить("ЧастотаЯдра", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(4, 3));
- Описание.Вставить("КоличествоЯдер", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(10));
- Описание.Вставить("КоличествоПотоков", Описание.КоличествоЯдер * 2);
- Описание.Вставить("ПроизводительностьПроцессора", Описание.ЧастотаЯдра * Описание.КоличествоЯдер);
- Описание.Вставить("ОбъемПамяти", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(1024, 3));
- Описание.Вставить("Диски", Новый Массив());
- Описание.Вставить("Кластер");
-
- Для Инд = 1 По ЮТТестовыеДанные.СлучайноеЧисло(1, 3) Цикл
- Описание.Диски.Добавить(ОписаниеДиска());
- КонецЦикла;
-
- Возврат Описание;
-
- КонецФункции
+```bsl
+Функция ОписаниеСервера(Знач Идентификатор = Неопределено) Экспорт
+
+ Описание = БазовоеОписаниеОбъекта(Идентификатор, "СРВ");
+
+ Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес());
+ Описание.Вставить("ЧастотаЯдра", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(4, 3));
+ Описание.Вставить("КоличествоЯдер", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(10));
+ Описание.Вставить("КоличествоПотоков", Описание.КоличествоЯдер * 2);
+ Описание.Вставить("ПроизводительностьПроцессора", Описание.ЧастотаЯдра * Описание.КоличествоЯдер);
+ Описание.Вставить("ОбъемПамяти", ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(1024, 3));
+ Описание.Вставить("Диски", Новый Массив());
+ Описание.Вставить("Кластер");
+
+ Для Инд = 1 По ЮТТестовыеДанные.СлучайноеЧисло(1, 3) Цикл
+ Описание.Диски.Добавить(ОписаниеДиска());
+ КонецЦикла;
+
+ Возврат Описание;
+
+КонецФункции
- Функция ОписаниеЗаявкиНаСозданиеВМ() Экспорт
-
- Описание = Новый Структура();
-
- Описание.Вставить("Наименование", "req-" + ЮТТестовыеДанные.СлучайнаяСтрока());
- Описание.Вставить("ДатаДобавления", глПолучитьМосковскоеВремя());
- Описание.Вставить("ДатаОкончанияАренды", глДобавитьКДате(глПолучитьМосковскоеВремя(), "ДЕНЬ", 2));
- Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес());
-
- Описание.Вставить("Проект", Проект());
- Описание.Вставить("Мейнтейнер", ПараметрыСеанса.Сотрудник);
-
- Описание.Вставить("КоличествоCPU", ЮТТестовыеДанные.СлучайноеЧисло(1, 4));
- Описание.Вставить("КоличествоПамяти", ЮТТестовыеДанные.СлучайноеЧисло(1, 16));
- Описание.Вставить("КоличествоДисков", ЮТТестовыеДанные.СлучайноеЧисло(1, 16));
- Описание.Вставить("ОперационнаяСистема", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОперационныеСистемы));
-
- Описание.Вставить("СредаЭксплуатации", "");
- Описание.Вставить("Назначение", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.НазначенияВиртуальныхМашин));
- Описание.Вставить("ТипСреды", Справочники.ТипыИнформационныхСред.BETA);
- Описание.Вставить("КодСервиса", ЮТТестовыеДанные.СлучайнаяСтрока(1));
-
- Возврат Описание;
-
- КонецФункции
+Функция ОписаниеЗаявкиНаСозданиеВМ() Экспорт
+
+ Описание = Новый Структура();
+
+ Описание.Вставить("Наименование", "req-" + ЮТТестовыеДанные.СлучайнаяСтрока());
+ Описание.Вставить("ДатаДобавления", глПолучитьМосковскоеВремя());
+ Описание.Вставить("ДатаОкончанияАренды", глДобавитьКДате(глПолучитьМосковскоеВремя(), "ДЕНЬ", 2));
+ Описание.Вставить("Адрес", ЮТТестовыеДанные.СлучайныйIPАдрес());
+
+ Описание.Вставить("Проект", Проект());
+ Описание.Вставить("Мейнтейнер", ПараметрыСеанса.Сотрудник);
+
+ Описание.Вставить("КоличествоCPU", ЮТТестовыеДанные.СлучайноеЧисло(1, 4));
+ Описание.Вставить("КоличествоПамяти", ЮТТестовыеДанные.СлучайноеЧисло(1, 16));
+ Описание.Вставить("КоличествоДисков", ЮТТестовыеДанные.СлучайноеЧисло(1, 16));
+ Описание.Вставить("ОперационнаяСистема", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОперационныеСистемы));
+
+ Описание.Вставить("СредаЭксплуатации", "");
+ Описание.Вставить("Назначение", ЮТТестовыеДанные.СоздатьЭлемент(Справочники.НазначенияВиртуальныхМашин));
+ Описание.Вставить("ТипСреды", Справочники.ТипыИнформационныхСред.BETA);
+ Описание.Вставить("КодСервиса", ЮТТестовыеДанные.СлучайнаяСтрока(1));
+
+ Возврат Описание;
+
+КонецФункции
- Функция НовыйОбразDocker(Версия, ПоУмолчанию = Истина) Экспорт
-
- Данные = Новый Структура("Адрес, ВерсияПлатформы, ТипПлатформы, ИспользоватьПоУмолчанию");
- Данные.Адрес = "gitlab.ru/orais/ci_cd/1cws-apache24:" + Версия;
- Данные.ВерсияПлатформы = Версия;
- Данные.ТипПлатформы = Перечисления.ТипыСоединенияИсточникаДанных.Соединение1СПредприятие83Сервер;
- Данные.ИспользоватьПоУмолчанию = ПоУмолчанию;
-
- Возврат ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОбразыDocker, Версия, Данные);
-
- КонецФункции
- ```
+Функция НовыйОбразDocker(Версия, ПоУмолчанию = Истина) Экспорт
+
+ Данные = Новый Структура("Адрес, ВерсияПлатформы, ТипПлатформы, ИспользоватьПоУмолчанию");
+ Данные.Адрес = "gitlab.ru/orais/ci_cd/1cws-apache24:" + Версия;
+ Данные.ВерсияПлатформы = Версия;
+ Данные.ТипПлатформы = Перечисления.ТипыСоединенияИсточникаДанных.Соединение1СПредприятие83Сервер;
+ Данные.ИспользоватьПоУмолчанию = ПоУмолчанию;
+
+ Возврат ЮТТестовыеДанные.СоздатьЭлемент(Справочники.ОбразыDocker, Версия, Данные);
+
+КонецФункции
+```
-3. Чтение из таблицы Markdown
+### Чтение из таблицы Markdown
```bsl
Макет =
@@ -172,3 +173,342 @@ tags: [Начало, Тестовые данные]
Возврат ТипыМетаданных;
```
+
+### Загрузка данных из макетов
+
+Для загрузки данных из макетов подойдет метод `ЮТест.Данные().ЗагрузитьИзМакета`
+
+Он позволяет:
+
+* Загружать данные из табличных макет (`ТабличныйДокумент` или `ТекстовыйДокумент` с таблицей markdown)
+* Загружать данные на клиенте и на сервер
+* Загружать не весь макет, а конкретную область (в одном макете может находится несколько таблиц данных)
+* Приводить значения к указанным типам и создавать записи в базе данных
+
+Пример табличного документа:
+
+| Товар | Товар.Поставщик | Товар.Вид | Цена | Количество | Сумма |
+|---------|-----------------|-----------|-------|------------|-------|
+| Товар 1 | Поставщик 1 | Товар | 100 | 1 | 100 |
+| Товар 1 | | | 100 | 2 | 200 |
+| Товар 1 | Поставщик 2 | Товар | 100 | 3 | 300 |
+| Товар 2 | Поставщик 1 | Товар | 2 000 | 1 | 2000 |
+| Услуга | | Услуга | 300,5 | 1 | 300.5 |
+
+Особенности:
+
+* Создание данных
+ * Данные в базе всегда создаются, не выполняется поиск уже существующих ссылок. При необходимости вы можете найти данные сами и передать в параметрах `ЗаменяемыеЗначения` или `КэшЗначений`
+ :::tip
+ При преобразовании табличного документа в таблицу значений существующие объекты метаданных не изменяются, только создаются новые. Нужно проявлять внимательность в случаях, если в базе уже имеются данные с тем же кодом/наименованием (и по ним используется контроль уникальности), что и в табличном документе.
+ :::
+ * Можно указывать значения вложенных реквизитов в других колонках, например для колонки `Товар` можно добавить колонки с поставщиком и видом товара `Товар.Поставщик` и `Товар.Вид`, в которых указать нужные значения
+ * Переиспользование созданных данных, используется `КэшЗначений`, в который помещаются все созданные данные, если кэш содержит данные подходящего типа с указанным идентификатором, то используется ранее созданное значение из кэша. Например, в примере выше, для первой строки будет создан товар с идентификатором `Товар 1`. В строках 2 и 3 будет использовано значение из кэша - `Товар 1`, в 4й и 5й строке - созданы новые товары.
+
+ :::tip
+ Значение в колонке "Товар" является идентификатором ссылки. Для справочника значение этой колонки по умолчанию записывается в реквизит "Наименование" или "Код", в зависимости от того, какой из этих реквизитов является основным представлением. Для документа это значение никуда не записывается, оно лишь является идентификатором. Таким образом, если одному значению в колонке "Товар" соответствуют различные значения в других колонках, то в элемент справочника запишутся реквизиты из первой строки, а для других строк ссылка на этот элемент будет проставлена по соответствующему идентификатору
+ :::
+
+#### Загрузка всего макета
+
+В качестве источника данных можно использовать весь табличный документ. В этом случае будет получена таблица значений, начиная с 1-ой строки и 1-ой колонки табличного документа до первой пустой строки.
+
+:::info
+Этот код работает и на клиенте и на сервер. Для сервера результатом будет таблица значений, для клиента - массив структур
+:::
+
+_Исходные данные_
+
+| Товар | Товар.Поставщик | Товар.Вид | Цена | Количество | Сумма |
+|---------|-----------------|-----------|-------|------------|-------|
+| Товар 1 | Поставщик 1 | Товар | 100 | 1 | 100 |
+| Товар 1 | | | 100 | 2 | 200 |
+| Товар 1 | Поставщик 2 | Товар | 100 | 3 | 300 |
+| Товар 2 | Поставщик 1 | Товар | 2 000 | 1 | 2000 |
+| Услуга | | Услуга | 300,5 | 1 | 300.5 |
+
+```bsl
+ОписанияТипов = Новый Соответствие;
+ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
+ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число"));
+ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
+ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число"));
+
+ТаблицаТоваров = ЮТест.Данные().ЗагрузитьИзМакета("ОбщийМакет.ЮТ_МакетТестовыхДанных", ОписанияТипов);
+
+Ютест.ОжидаетЧто(ТаблицаТоваров)
+ .ИмеетТип("ТаблицаЗначений")
+ .ИмеетДлину(5)
+ .Свойство("[0].Товар.Наименование").Равно("Товар 1")
+ .Свойство("[0].Товар.Поставщик.Наименование").Равно("Поставщик")
+ .Свойство("[0].Товар.Вид").Равно(Перечисления.ВидыТоваров.Товар)
+ .Свойство("[0].Количество").Равно(1)
+ .Свойство("[0].Цена").Равно(100)
+ .Свойство("[0].Сумма").Равно(100)
+ .Свойство("[1].Товар").Равно(ТаблицаТоваров[0].Товар)
+ .Свойство("[1].Количество").Равно(2)
+ .Свойство("[1].Цена").Равно(100)
+ .Свойство("[1].Сумма").Равно(200)
+ .Свойство("[2].Товар").Равно(ТаблицаТоваров[0].Товар)
+ .Свойство("[2].Количество").Равно(3)
+ .Свойство("[2].Цена").Равно(100)
+ .Свойство("[2].Сумма").Равно(300)
+ .Свойство("[3].Товар.Наименование").Равно("Товар 2")
+ .Свойство("[3].Товар.Поставщик.Наименование").Равно("Поставщик")
+ .Свойство("[3].Товар.Вид").Равно(Перечисления.ВидыТоваров.Товар)
+ .Свойство("[3].Количество").Равно(1)
+ .Свойство("[3].Цена").Равно(2000)
+ .Свойство("[3].Сумма").Равно(2000)
+ .Свойство("[4].Товар.Наименование").Равно("Услуга")
+ .Свойство("[4].Товар.Поставщик").НеЗаполнено()
+ .Свойство("[4].Товар.Вид").Равно(Перечисления.ВидыТоваров.Услуга)
+ .Свойство("[4].Количество").Равно(1)
+ .Свойство("[4].Цена").Равно(300.5)
+ .Свойство("[4].Сумма").Равно(300.5);
+```
+
+#### Загрузка области из макета
+
+Можно получить отдельную область из табличного документа и использовать ее в качестве источника данных для таблицы значений. Таким образом в одном табличном документе можно хранить несколько таблиц.
+
+Пример юнит-теста для проверки работы метода. На входе он получает таблицу значений, которую заполняет и/или возвращает. В одной области табличного документа - исходные данные, передаваемые в качестве входящего параметра, а в другой - таблица с ожидаемым значением.
+
+_Исходные данные_
+
+| Товар | Товар.Поставщик | Товар.Вид | Количество |
+|---------|-----------------|------------|------------|
+| Товар 1 | Поставщик 1 | Товар | 1 |
+| Товар 2 | Поставщик 1 | Товар | 1 |
+| Услуга | | Услуга | 1 |
+| Товар | Цена | Количество | Сумма |
+| Товар 1 | 100 | 1 | 100 |
+| Товар 2 | 2 000 | 1 | 2000 |
+| Услуга | 300,5 | 1 | 300.5 |
+
+```bsl
+ОписанияТипов = Новый Соответствие;
+ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
+ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число"));
+ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
+ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число"));
+
+// Для общего использования созданных значений используется переменная КешЗначений.
+// В двух табличных документах одинаковый состав товаров.
+// Чтобы в обеих таблицах этому товару соответствовало одно значение справочника -
+// нужно передавать в параметре функции переменную, в которой будут храниться соответствия
+// наименований к ссылкам на объекты.
+КэшЗначений = Новый Соответствие;
+
+ТаблицаИсходныхДанных = ЮТест.Данные().ЗагрузитьИзМакета(
+ "ОбщийМакет.ЮТ_МакетТестовыхДанных.R1C1R4C4",
+ ОписанияТипов,
+ КэшЗначений
+);
+
+ТаблицаИсходныхДанных = ЮТест.Данные().ЗагрузитьИзМакета(
+ "ОбщийМакет.ЮТ_МакетТестовыхДанных.R1C1R4C4",
+ ОписанияТипов,
+ КэшЗначений
+);
+
+ТаблицаОжидаемыхЗначений = ЮТест.Данные().ЗагрузитьИзМакета(
+ "ОбщийМакет.ЮТ_МакетТестовыхДанных.R5C1R8C4",
+ ОписанияТипов,
+ КэшЗначений
+);
+
+ТаблицаРезультата = ОбщийМодуль1.ТаблицаТоваровСЦенамиИзОстатков(ТаблицаИсходныхДанных);
+
+Ютест.ОжидаетЧто(ТаблицаРезультата)
+ .Равно(ТаблицаОжидаемыхЗначений);
+```
+
+#### Загрузка документа с табличной частью и проверка движений
+
+Интеграционный-тест для проверки формирования движений документа по некоторому регистру. В первой таблице - табличная часть документа. Во второй - реквизиты самого документа. В третьей - ожидаемые движения по регистру, который нужно протестировать.
+
+В макете мы создадим три именованные области с таблицами
+
+Область `Реквизиты_документа`
+
+| ПриходТовара | Дата | Поставщик | Валюта | Склад | Организация |
+|--------------|------|-------------|--------|-------|-------------|
+| Документ 1 | Дата | Поставщик 1 | Валюта | Склад | Организация |
+
+Область `Табличная_часть_документа`
+
+| Документ | Товар | Товар.Поставщик | Товар.Вид | Цена | Количество | Сумма |
+|------------|---------|-----------------|-----------|-------|------------|-------|
+| Документ 1 | Товар 1 | Поставщик 1 | Товар | 100 | 1 | 100 |
+| Документ 1 | Товар 2 | Поставщик 1 | Товар | 2 000 | 1 | 2000 |
+| Документ 1 | Услуга | | Услуга | 300,5 | 1 | 300.5 |
+
+Область `Ожидаемые_движения`
+
+| Период | Активность | ВидДвижения | Регистратор | Склад | Товар | Количество |
+|--------|------------|-------------|-------------|-------|---------|------------|
+| Дата | Истина | Приход | Документ 1 | Склад | Товар 1 | 1 |
+| Дата | Истина | Приход | Документ 1 | Склад | Товар 2 | 1 |
+| Дата | Истина | Приход | Документ 1 | Склад | Услуга | 1 |
+
+```bsl
+КэшЗначений = Новый Соответствие;
+
+Организация = Ютест.КонтекстМодуля().Организация;
+Поставщик = ЮТест.Данные().СоздатьЭлемент(Справочники.Контрагенты, "Поставщик");
+ДатаДокумента = НачалоДня(ТекущаяДатаСеанса());
+
+// Если нужно не создавать новое значение, а использовать существующее,
+// например, созданное ранее, то можно использовать соответствие -
+// значение из табличного документа к нужному значению.
+ЗаменяемыеЗначения = Новый Соответствие;
+ЗаменяемыеЗначения.Вставить("Организация", Организация);
+ЗаменяемыеЗначения.Вставить("Поставщик 1", Поставщик);
+ЗаменяемыеЗначения.Вставить("Дата", ДатаДокумента);
+
+ОписанияТипов = Новый Соответствие;
+ОписанияТипов.Вставить("ПриходТовара", Новый ОписаниеТипов("ДокументСсылка.ПриходТовара"));
+ОписанияТипов.Вставить("Дата", Новый ОписаниеТипов("Дата"));
+ОписанияТипов.Вставить("Организация", Новый ОписаниеТипов("СправочникСсылка.Организации"));
+ОписанияТипов.Вставить("Поставщик", Новый ОписаниеТипов("СправочникСсылка.Контрагенты"));
+ОписанияТипов.Вставить("Склад", Новый ОписаниеТипов("СправочникСсылка.Склады"));
+ОписанияТипов.Вставить("Валюта", Новый ОписаниеТипов("СправочникСсылка.Валюты"));
+
+ТаблицаДокументов = ЮТест.Данные().ЗагрузитьИзМакета(
+ "ОбщийМакет.ЮТ_МакетТестовыхДанных.Реквизиты_документа"
+ ОписанияТипов,
+ КэшЗначений,
+ ЗаменяемыеЗначения
+);
+
+ОписанияТипов = Новый Соответствие;
+ОписанияТипов.Вставить("Документ", Новый ОписаниеТипов("ДокументСсылка.ПриходТовара"));
+ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
+ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число"));
+ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
+ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число"));
+
+ТаблицаТоваров = ЮТест.Данные().ЗагрузитьИзМакета(
+ "ОбщийМакет.ЮТ_МакетТестовыхДанных.Табличная_часть_документа",
+ ОписанияТипов,
+ КэшЗначений,
+ ЗаменяемыеЗначения
+);
+
+ОписанияТипов = Новый Соответствие;
+ОписанияТипов.Вставить("Период", Новый ОписаниеТипов("Дата"));
+ОписанияТипов.Вставить("Активность", Новый ОписаниеТипов("Булево"));
+ОписанияТипов.Вставить("ВидДвижения", Новый ОписаниеТипов("ВидДвиженияНакопления"));
+ОписанияТипов.Вставить("Регистратор", Новый ОписаниеТипов("ДокументСсылка.ПриходТовара"));
+ОписанияТипов.Вставить("Склад", Новый ОписаниеТипов("СправочникСсылка.Склады"));
+ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
+ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
+
+ТаблицаДвижений = ЮТест.Данные().ЗагрузитьИзМакета(
+ "ОбщийМакет.ЮТ_МакетТестовыхДанных.Ожидаемые_движения",
+ ОписанияТипов,
+ КэшЗначений,
+ ЗаменяемыеЗначения
+);
+
+Для Каждого ДанныеДокументов Из ТаблицаДокументов Цикл
+
+ Отбор = Новый Структура("Документ", ДанныеДокументов.ПриходТовара);
+ ТоварыДокумента = ТаблицаТоваров.Скопировать(Отбор);
+
+ ДокументОбъект = ДанныеДокументов.Документ.ПолучитьОбъект();
+ ДокументОбъект.Товары.Загрузить(ТоварыДокумента);
+ ДокументОбъект.Записать(РежимЗаписиДокумента.Проведение);
+
+ ТоварныеЗапасы = ДокументОбъект.Движения.ТоварныеЗапасы;
+ ТоварныеЗапасы.Прочитать();
+ ТаблицаТоварныхЗапасов = ТоварныеЗапасы.Выгрузить();
+
+ Отбор = Новый Структура("Регистратор", ДанныеДокументов.ПриходТовара);
+ ОжидаемыеТоварныеЗапасы = ТаблицаДвижений.Скопировать(Отбор);
+
+ Ютест.ОжидаетЧто(ТаблицаТоварныхЗапасов)
+ .Равно(ОжидаемыеТоварныеЗапасы);
+
+КонецЦикла;
+```
+
+#### Заменяемые значения
+
+Создание и заполнение объектов двойной вложенности и более (например, "Товар.Поставщик.ВидКонтрагента") не поддерживается. Если есть такая потребность, следует использовать переменную "ЗаменяемыеЗначения". Т.е. следует создать и заполнять нужный объект перед преобразованием табличного документа в таблицу значений, а затем передать его в функцию получения таблицы значений.
+
+```bsl
+Поставщик = ЮТест.Данные().КонструкторОбъекта(Справочники.Контрагенты)
+ .Установить("ВидКонтрагента", ВидКонтрагента)
+ .Записать();
+
+// В табличном документе должна быть колонка [Товар.Поставщик] со значением "Некий поставщик".
+// В этом случае в таблицу значений проставится значение, полученное из соответствия
+ЗаменяемыеЗначения = Новый Соответствие;
+ЗаменяемыеЗначения.Вставить("Некий поставщик", Поставщик);
+
+ТаблицаЗначений = ЮТест.Данные().ЗагрузитьИзМакета(
+ ТабличныйДокумент,
+ ОписанияТипов,
+ Неопределено,
+ ЗаменяемыеЗначения
+);
+
+ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .Свойство("[0].Товар.Поставщик.ВидКонтрагента").Равно(ВидКонтрагента);
+```
+
+#### Заменяемые значения и составные типы
+
+Можно использовать составные типы в колонках таблицы значений, но создание объектов метаданных для такой колонки не поддерживается. Можно воспользоваться соответствием "ЗаменяемыеЗначения", если потребуется в одну колонку записать значения разных типов.
+
+```bsl
+ТипАналитики = Новый ОписаниеТипов("СправочникСсылка.Товары,СправочникСсылка.Контрагенты");
+
+ОписанияТипов = Новый Соответствие;
+ОписанияТипов.Вставить("Аналитика", ТипАналитики);
+
+Поставщик = ЮТест.Данные().СоздатьЭлемент(Справочники.Контрагенты);
+Товар = ЮТест.Данные().СоздатьЭлемент(Справочники.Товары);
+
+ЗаменяемыеЗначения = Новый Соответствие;
+ЗаменяемыеЗначения.Вставить("Аналитика (Поставщик)", Поставщик);
+ЗаменяемыеЗначения.Вставить("Аналитика (Товар)", Товар);
+
+ТаблицаЗначений = ЮТест.Данные().ЗагрузитьИзМакета(
+ ТабличныйДокумент,
+ ОписанияТипов,
+ Неопределено,
+ ЗаменяемыеЗначения
+);
+
+ЮТест.ОжидаетЧто(ТаблицаЗначений)
+ .Свойство("[0].Аналитика").Равно(Поставщик)
+ .Свойство("[1].Аналитика").Равно(Товар)
+;
+```
+
+#### Inline макеты, загрузка из Markdown
+
+При необходимости вы можете разместить таблицу с данными прямо в коде.
+
+:::tip
+Если вы используете EDT, то удобнее редактировать многострочные строки в `Редакторе запроса`
+:::
+
+```bsl
+ТаблицаMarkDown =
+"| Товар | Цена | Количество | Сумма |
+||---------|-------|------------|-------|
+|| Товар 1 | 100 | 1 | 100 |
+|| Товар 2 | 2 000 | 1 | 2000 |
+|| Услуга | 300,9 | 1 | 300,9 |";
+
+ОписанияТипов = Новый Соответствие;
+ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
+ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число"));
+ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
+ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число"));
+
+Данные = ЮТест.Данные().ЗагрузитьИзМакета(ТаблицаMarkDown, ОписанияТипов);
+```
diff --git a/documentation/docs/yaxunit-ui.md b/documentation/docs/yaxunit-ui.md
index 7de903996..4e19a8022 100644
--- a/documentation/docs/yaxunit-ui.md
+++ b/documentation/docs/yaxunit-ui.md
@@ -1,27 +1,24 @@
# Графический интерфейс
-## Интерфейс отчета
+Расширение добавляет в командный интерфейс конфигурации новый раздел "Юнит тест".
+
+Из него вы можете интерактивно запускать тесты или сформировать файл конфигурации запуска.
+
+## Запуск тестов
+
+Для запуска и отладки тестов вы можете воспользоваться командой "Запуск тестов"
+
+Будут автоматически загружены все тесты и выведены в виде дерева сгруппированного по тестовым наборам (модулям).
-Для просмотра результатов тестирования в режиме 1С:Предприятие, вам необходимо в параметрах запуска указать [настройку](run) `showReport`
-Например, создав файла настроек
-
-```json
-{
- "reportPath": "/tmp/settings/",
- "filter": {
- "extensions": [
- "tests"
- ]
- },
- "settings": {
- "ВТранзакции": false
- },
- "reportFormat": "jUnit",
- "showReport": true
-}
-```
-
-Мы получим примерно такой результат
+![Запуск тестов](images/ui-run-tests.png)
+
+Из этой формы вы можете запустить нужные тесты.
+
+![Меню запуска](images/ui-run-menu.png)
+
+И сразу же увидеть результат прогона.
+
+## Интерфейс отчета
![Отчет](images/report-ui.png)
diff --git a/documentation/src/pages/index.md b/documentation/src/pages/index.md
index ec54d86a0..b908f6416 100644
--- a/documentation/src/pages/index.md
+++ b/documentation/src/pages/index.md
@@ -13,6 +13,9 @@ 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)
+[![Build and test](https://github.com/bia-technologies/yaxunit/actions/workflows/main-build.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions/workflows/main-build.yml)
+[![Build ocumentation](https://github.com/bia-technologies/yaxunit/actions/workflows/deploy-documentation.yml/badge.svg)](https://github.com/bia-technologies/yaxunit/actions/workflows/deploy-documentation.yml)
+
Обсудить в [Telegram чате](https://t.me/BIAOpenTools/12)
----
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
new file mode 100644
index 000000000..e50f685bc
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
@@ -0,0 +1,80 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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() Экспорт
+
+ Возврат Новый ОписаниеОповещения("ПустойОбработчик1", ЭтотОбъект);
+
+КонецФункции
+
+Процедура ПустойОбработчик1(Параметр1) Экспорт
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.mdo"
new file mode 100644
index 000000000..40696a31d
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\220\321\201\320\270\320\275\321\205\321\200\320\276\320\275\320\275\320\260\321\217\320\236\320\261\321\200\320\260\320\261\320\276\321\202\320\272\320\260\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271\320\232\320\273\320\270\320\265\320\275\321\202.mdo"
@@ -0,0 +1,10 @@
+
+
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент
+
+ ru
+ Асинхронная обработка служебный
+
+ true
+ true
+
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\227\320\260\320\277\321\200\320\276\321\201\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\227\320\260\320\277\321\200\320\276\321\201\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
index 638979098..7bc722d23 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\227\320\260\320\277\321\200\320\276\321\201\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\227\320\260\320\277\321\200\320\276\321\201\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
@@ -116,7 +116,7 @@
Если ОдинРеквизит Тогда
Возврат Неопределено;
Иначе
- Реквизиты = СтрСоединить(ПсеводнимыВыбираемыхПолей(ОписаниеЗапроса), ",");
+ Реквизиты = СтрСоединить(ПсевдонимыВыбираемыхПолей(ОписаниеЗапроса), ",");
Возврат Новый Структура(Реквизиты);
КонецЕсли;
КонецЕсли;
@@ -245,7 +245,7 @@
КонецФункции
-Функция ПсеводнимыВыбираемыхПолей(ОписаниеЗапроса)
+Функция ПсевдонимыВыбираемыхПолей(ОписаниеЗапроса)
Псевдонимы = Новый Массив;
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
index f2a096b02..a7d1c724a 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
@@ -25,24 +25,94 @@
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьПараметры");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикАнализПараметровЗапуска");
+ ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикПодключитьКомпоненты");
+ ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикИнициализация");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьОтчет");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикСохранитьКодВозврата");
ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗавершить");
- ВызватьСледующийОбработчик(ПараметрыИсполнения);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
-Процедура ВызватьОбработчик(Обработчик, Результат = Неопределено) Экспорт
+Процедура ВыполнитьМодульноеТестированиеПоНастройке(ПараметрыЗапуска, ОбработчикЗавершения) Экспорт
- Если Обработчик <> Неопределено Тогда
- ВыполнитьОбработкуОповещения(Обработчик, Результат);
- КонецЕсли;
+ ПараметрыИсполнения = ПараметрыИсполнения();
+ ПараметрыИсполнения.ПараметрыЗапуска = ПараметрыЗапуска;
+
+ ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикИнициализация");
+ ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикЗагрузитьТесты");
+ ДобавитьОбработчикЦепочки(ПараметрыИсполнения, "ОбработчикВыполнитьТестирование");
+ ПараметрыИсполнения.Цепочка.Добавить(ОбработчикЗавершения);
+
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыИсполнения);
КонецПроцедуры
+Функция ПараметрыИсполнения() Экспорт
+
+ Параметры = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ЦепочкаАсинхроннойОбработки();
+ Параметры.Вставить("АргументыЗапуска");
+ Параметры.Вставить("ПараметрыЗапуска");
+ Параметры.Вставить("ИсполняемыеТестовыеМодули");
+ Параметры.Вставить("РезультатыТестирования");
+
+ Возврат Параметры;
+
+КонецФункции
+
+Функция ВыполнитьТестыМодуля(ТестовыйМодуль) Экспорт
+
+ Результаты = Новый Массив();
+
+ КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения();
+
+ КлиентскиеНаборы = Новый Массив();
+ СерверныеНаборы = Новый Массив();
+ ПропущенныеНаборы = Новый Массив();
+
+ Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
+
+ Если НЕ Набор.Выполнять Тогда
+ ПропущенныеНаборы.Добавить(Набор);
+ Продолжить;
+ КонецЕсли;
+
+ РежимИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим);
+
+ Если РежимИсполнения = КонтекстыИсполнения.Клиент Тогда
+ КлиентскиеНаборы.Добавить(Набор);
+ ИначеЕсли РежимИсполнения = КонтекстыИсполнения.Сервер Тогда
+ СерверныеНаборы.Добавить(Набор);
+ Иначе
+ ПропущенныеНаборы.Добавить(Набор);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ ТестовыйМодульОблегченный = ЮТОбщий.СкопироватьСтруктуру(ТестовыйМодуль);
+ ТестовыйМодульОблегченный.НаборыТестов = Новый Массив();
+
+ Если ЗначениеЗаполнено(КлиентскиеНаборы) Тогда
+ Результаты = ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(КлиентскиеНаборы, ТестовыйМодульОблегченный);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(СерверныеНаборы) Тогда
+ Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(СерверныеНаборы, ТестовыйМодульОблегченный);
+ ЮТЛогирование.ВывестиСерверныеСообщения();
+ ЮТОбщий.ДополнитьМассив(Результаты, Результат);
+ КонецЕсли;
+
+ ЮТОбщий.ДополнитьМассив(Результаты, ПропущенныеНаборы);
+
+ ТестовыйМодульОблегченный.НаборыТестов = Результаты;
+
+ Возврат ТестовыйМодульОблегченный;
+
+КонецФункции
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -57,7 +127,7 @@
Процедура ОбработчикЗагрузитьПараметры(Результат, ДополнительныеПараметры) Экспорт
- Обработчик = СледующийОбработчик(ДополнительныеПараметры);
+ Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры);
ЮТПараметрыЗапуска.ПараметрыЗапуска(ДополнительныеПараметры.АргументыЗапуска, Обработчик);
КонецПроцедуры
@@ -70,70 +140,66 @@
Возврат;
КонецЕсли;
- ВызватьСледующийОбработчик(ДополнительныеПараметры);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
-Процедура ОбработчикЗагрузитьТесты(Результат, ДополнительныеПараметры) Экспорт
+Процедура ОбработчикИнициализация(Результат, ДополнительныеПараметры) Экспорт
- Параметры = ДополнительныеПараметры.ПараметрыЗапуска;
+ ЮТСобытия.Инициализация(ДополнительныеПараметры.ПараметрыЗапуска);
- ЮТКонтекст.ИнициализироватьКонтекст();
- ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(Параметры.settings);
- ЮТСобытия.Инициализация(Параметры);
- // Повторно сохраним для передачи на сервер
- ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(ЮТКонтекст.ГлобальныеНастройкиВыполнения());
- ЮТКонтекст.УстановитьКонтекстИсполнения(ЮТФабрика.НовыйКонтекстИсполнения());
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
+
+КонецПроцедуры
+
+Процедура ОбработчикЗагрузитьТесты(Результат, ДополнительныеПараметры) Экспорт
ЮТСобытия.ПередЧтениеСценариев();
- ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(Параметры);
+
+ ТестовыеМодули = ЮТЧитатель.ЗагрузитьТесты(ДополнительныеПараметры.ПараметрыЗапуска);
ЮТСобытия.ПослеЧтенияСценариев(ТестовыеМодули);
- КоллекцияКатегорийНаборов = Новый Массив();
+ ИсполняемыеТестовыеМодули = Новый Массив();
Для Каждого ТестовыйМодуль Из ТестовыеМодули Цикл
- КатегорииНаборов = КатегорииНаборовТестовМодуля(ТестовыйМодуль);
- КоллекцияКатегорийНаборов.Добавить(КатегорииНаборов);
+ ИсполняемыйТестовыйМодуль = ИсполняемыйТестовыйМодуль(ТестовыйМодуль);
+ ИсполняемыеТестовыеМодули.Добавить(ИсполняемыйТестовыйМодуль);
КонецЦикла;
- ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов);
- ДополнительныеПараметры.КоллекцияКатегорийНаборов = КоллекцияКатегорийНаборов;
+ ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули);
+ ДополнительныеПараметры.ИсполняемыеТестовыеМодули = ИсполняемыеТестовыеМодули;
- ВызватьСледующийОбработчик(ДополнительныеПараметры);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры, ИсполняемыеТестовыеМодули);
КонецПроцедуры
Процедура ОбработчикВыполнитьТестирование(Результат, ДополнительныеПараметры) Экспорт
+ ЮТСобытия.ПередВыполнениемТестов(ДополнительныеПараметры.ИсполняемыеТестовыеМодули);
+
РезультатыТестирования = Новый Массив();
- КоллекцияКатегорийНаборов = ДополнительныеПараметры.КоллекцияКатегорийНаборов;
- Для Каждого КатегорииНаборов Из КоллекцияКатегорийНаборов Цикл
-
- Результат = ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Клиентские, КатегорииНаборов.ТестовыйМодуль);
- ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат);
-
- Результат = ЮТИсполнительСервер.ВыполнитьГруппуНаборовТестов(КатегорииНаборов.Серверные, КатегорииНаборов.ТестовыйМодуль);
- ЮТЛогирование.ВывестиСерверныеСообщения();
-
- ЮТОбщий.ДополнитьМассив(РезультатыТестирования, Результат);
+ Для Каждого ТестовыйМодуль Из ДополнительныеПараметры.ИсполняемыеТестовыеМодули Цикл
- ЮТОбщий.ДополнитьМассив(РезультатыТестирования, КатегорииНаборов.Пропущенные);
+ РезультатыПрогонаМодуля = ВыполнитьТестыМодуля(ТестовыйМодуль);
+ РезультатыТестирования.Добавить(РезультатыПрогонаМодуля);
КонецЦикла;
+ ЮТСобытия.ПослеВыполненияТестов(РезультатыТестирования);
+
ДополнительныеПараметры.РезультатыТестирования = РезультатыТестирования;
- ВызватьСледующийОбработчик(ДополнительныеПараметры);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры, РезультатыТестирования);
КонецПроцедуры
Процедура ОбработчикСохранитьОтчет(Результат, ДополнительныеПараметры) Экспорт
Если ЗначениеЗаполнено(ДополнительныеПараметры.ПараметрыЗапуска.reportPath) Тогда
- Обработчик = СледующийОбработчик(ДополнительныеПараметры);
+ Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры);
ЮТОтчет.СформироватьОтчет(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска, Обработчик);
Иначе
- ВызватьСледующийОбработчик(ДополнительныеПараметры);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецЕсли;
КонецПроцедуры
@@ -141,7 +207,7 @@
Процедура ОбработчикСохранитьКодВозврата(Результат, ДополнительныеПараметры) Экспорт
ЗаписатьКодВозврата(ДополнительныеПараметры.РезультатыТестирования, ДополнительныеПараметры.ПараметрыЗапуска);
- ВызватьСледующийОбработчик(ДополнительныеПараметры);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
КонецПроцедуры
@@ -158,25 +224,37 @@
КонецПроцедуры
+Процедура ОбработчикПодключитьКомпоненты(Результат, ДополнительныеПараметры) Экспорт
+
+ Если ДополнительныеПараметры.ПараметрыЗапуска.ПодключатьВнешниеКомпоненты Тогда
+ Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ДополнительныеПараметры);
+ ЮТКомпонентыКлиент.ТихаяУстановкаКомпонент(Обработчик);
+ Иначе
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ДополнительныеПараметры);
+ КонецЕсли;
+
+КонецПроцедуры
+
#КонецОбласти
-Процедура ВызватьСледующийОбработчик(ПараметрыИсполнения, Результат = Неопределено)
+#Область ОбработчикиСобытий
+
+Процедура Инициализация(Параметры) Экспорт
- Обработчик = СледующийОбработчик(ПараметрыИсполнения);
- ЮТЛогирование.Отладка("Вызов обработчика исполнителя: " + Обработчик.ИмяПроцедуры);
- ВыполнитьОбработкуОповещения(Обработчик, Результат);
+ ЮТКонтекст.ИнициализироватьКонтекст();
+ ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(Параметры.settings);
+ // Повторно сохраним для передачи на сервер
+ ЮТКонтекст.УстановитьГлобальныеНастройкиВыполнения(ЮТКонтекст.ГлобальныеНастройкиВыполнения());
КонецПроцедуры
-Функция СледующийОбработчик(ПараметрыИсполнения)
-
- ПараметрыИсполнения.ИндексСледующегоОбработчика = ПараметрыИсполнения.ИндексСледующегоОбработчика + 1;
- Обработчик = ПараметрыИсполнения.Цепочка[ПараметрыИсполнения.ИндексСледующегоОбработчика];
- ЮТЛогирование.Отладка("Следующий обработчик исполнителя: " + Обработчик.ИмяПроцедуры);
+Процедура ПередВыполнениемТестов(ИсполняемыеМодули) Экспорт
- Возврат Обработчик;
+ ЮТКонтекст.УстановитьКонтекстИсполнения(ЮТФабрика.НовыйКонтекстИсполнения());
-КонецФункции
+КонецПроцедуры
+
+#КонецОбласти
Процедура ДобавитьОбработчикЦепочки(ПараметрыИсполнения, ИмяМетода)
@@ -185,25 +263,46 @@
КонецПроцедуры
-Функция ПараметрыИсполнения()
+Функция ИсполняемыйТестовыйМодуль(ТестовыйМодуль)
- Параметры = Новый Структура();
- Параметры.Вставить("АргументыЗапуска");
- Параметры.Вставить("ПараметрыЗапуска");
- Параметры.Вставить("Цепочка", Новый Массив());
- Параметры.Вставить("ИндексСледующегоОбработчика", -1);
- Параметры.Вставить("КоллекцияКатегорийНаборов");
- Параметры.Вставить("РезультатыТестирования");
+ ИсполняемыйТестовыйМодуль = ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля(ТестовыйМодуль);
- Возврат Параметры;
+ КонтекстыПриложения = ЮТФабрика.КонтекстыПриложения();
+ КонтекстыМодуля = ЮТФабрика.КонтекстыМодуля(ТестовыйМодуль.МетаданныеМодуля);
+ КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения();
+
+ ИсполняемыйТестовыйМодуль.НаборыТестов = ИсполняемыеНаборыМодуля(ТестовыйМодуль);
+
+ Для Каждого Набор Из ИсполняемыйТестовыйМодуль.НаборыТестов Цикл
+
+ КонтекстИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим);
+
+ ОшибкаКонтекста = Неопределено;
+ Если КонтекстыПриложения.Найти(Набор.Режим) = Неопределено Тогда
+ ОшибкаКонтекста = "Неподдерживаемый режим запуска";
+ ИначеЕсли КонтекстыМодуля.Найти(Набор.Режим) = Неопределено Тогда
+ ОшибкаКонтекста = "Модуль не доступен в этом контексте";
+ ИначеЕсли КонтекстИсполнения <> КонтекстыИсполнения.Сервер И КонтекстИсполнения <> КонтекстыИсполнения.Клиент Тогда
+ ОшибкаКонтекста = "Неизвестный контекст/режим исполнения";
+ КонецЕсли;
+
+ Если ОшибкаКонтекста <> Неопределено Тогда
+ Набор.Выполнять = Ложь;
+ ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Набор, ОшибкаКонтекста);
+ Для Каждого Тест Из Набор.Тесты Цикл
+ ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Тест, ОшибкаКонтекста);
+ КонецЦикла;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат ИсполняемыйТестовыйМодуль;
КонецФункции
-Функция КатегорииНаборовТестовМодуля(ТестовыйМодуль)
-
- КатегорииНаборов = ЮТФабрика.ОписаниеКатегорияНабораТестов(ТестовыйМодуль);
+Функция ИсполняемыеНаборыМодуля(ТестовыйМодуль)
- ИсполняемыеТестовыеНаборы = Новый Массив;
+ Результат = Новый Массив();
Для Каждого ТестовыйНабор Из ТестовыйМодуль.НаборыТестов Цикл
@@ -233,68 +332,21 @@
Если НаборыКонтекстов.Количество() Тогда
Для Каждого Элемент Из НаборыКонтекстов Цикл
- ИсполняемыеТестовыеНаборы.Добавить(Элемент.Значение);
+ Результат.Добавить(Элемент.Значение);
КонецЦикла;
- Иначе
-
- // TODO. Корякин А. 2021.11.24 А надо ли добавлять при отсутствии тестов
- ИсполняемыеТестовыеНаборы.Добавить(ЮТФабрика.ОписаниеИсполняемогоНабораТестов(ТестовыйНабор, ТестовыйМодуль));
-
КонецЕсли;
КонецЦикла;
- КонтекстыПриложения = ЮТФабрика.КонтекстыПриложения();
- КонтекстыМодуля = ЮТФабрика.КонтекстыМодуля(ТестовыйМодуль.МетаданныеМодуля);
- КонтекстыИсполнения = ЮТФабрика.КонтекстыИсполнения();
-
- Для Каждого Набор Из ИсполняемыеТестовыеНаборы Цикл
-
- КонтекстИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим);
-
- ОшибкаКонтекста = Неопределено;
- Если КонтекстыПриложения.Найти(Набор.Режим) = Неопределено Тогда
- ОшибкаКонтекста = "Неподдерживаемый режим запуска";
- ИначеЕсли КонтекстыМодуля.Найти(Набор.Режим) = Неопределено Тогда
- ОшибкаКонтекста = "Модуль не доступен в этом контексте";
- ИначеЕсли КонтекстИсполнения <> КонтекстыИсполнения.Сервер И КонтекстИсполнения <> КонтекстыИсполнения.Клиент Тогда
- ОшибкаКонтекста = "Неизвестный контекст/режим исполнения";
- КонецЕсли;
-
- Если ОшибкаКонтекста <> Неопределено Тогда
- Набор.Выполнять = Ложь;
- ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Набор, ОшибкаКонтекста);
- Для Каждого Тест Из Набор.Тесты Цикл
- ЮТРегистрацияОшибок.ЗарегистрироватьОшибкуРежимаВыполнения(Тест, ОшибкаКонтекста);
- КонецЦикла;
- КонецЕсли;
-
- Если НЕ Набор.Выполнять Тогда
- КатегорииНаборов.Пропущенные.Добавить(Набор);
- Продолжить;
- КонецЕсли;
-
- Если КонтекстИсполнения = КонтекстыИсполнения.Сервер Тогда
-
- КатегорииНаборов.Серверные.Добавить(Набор);
-
- ИначеЕсли КонтекстИсполнения = КонтекстыИсполнения.Клиент Тогда
-
- КатегорииНаборов.Клиентские.Добавить(Набор);
-
- КонецЕсли;
-
- КонецЦикла;
-
- Возврат КатегорииНаборов;
+ Возврат Результат;
КонецФункции
Процедура ПоказатьОтчет(РезультатыТестирования, Параметры)
Данные = Новый Структура("РезультатыТестирования, ПараметрыЗапуска", РезультатыТестирования, Параметры);
- АдресДанных = ПоместитьВоВременноеХранилище(Данные);
+ АдресДанных = ПоместитьВоВременноеХранилище(Данные, Новый УникальныйИдентификатор());
ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.Основная", Новый Структура("АдресХранилища", АдресДанных));
@@ -303,7 +355,7 @@
// Записать код возврата.
//
// Параметры:
-// РезультатыТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
+// РезультатыТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
// Параметры - см. ЮТФабрика.ПараметрыЗапуска
Процедура ЗаписатьКодВозврата(РезультатыТестирования, Параметры)
@@ -313,20 +365,28 @@
Возврат;
КонецЕсли;
- Для Каждого Набор Из РезультатыТестирования Цикл
-
- Если ЗначениеЗаполнено(Набор.Ошибки) Тогда
- Успешно = Ложь;
- Прервать;
- КонецЕсли;
+ Для Каждого Модуль Из РезультатыТестирования Цикл
- Для Каждого Тест Из Набор.Тесты Цикл
+ Для Каждого Набор Из Модуль.НаборыТестов Цикл
- Если ЗначениеЗаполнено(Тест.Ошибки) Тогда
+ Если ЗначениеЗаполнено(Набор.Ошибки) Тогда
Успешно = Ложь;
Прервать;
КонецЕсли;
+ Для Каждого Тест Из Набор.Тесты Цикл
+
+ Если ЗначениеЗаполнено(Тест.Ошибки) Тогда
+ Успешно = Ложь;
+ Прервать;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если НЕ Успешно Тогда
+ Прервать;
+ КонецЕсли;
+
КонецЦикла;
Если НЕ Успешно Тогда
@@ -345,4 +405,20 @@
КонецПроцедуры
+Функция НаборыТестовРежима(ТестовыйМодуль, ОжидаемыйРежимИсполнения)
+
+ Результат = Новый Массив();
+
+ Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
+
+ Если Набор.Выполнять И ЮТФабрика.КонтекстИсполнения(Набор.Режим) = ОжидаемыйРежимИсполнения Тогда
+ Результат.Добавить(Набор);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат Результат;
+
+КонецФункции
+
#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
index 52f420d5f..5ca0daa8d 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\230\321\201\320\277\320\276\320\273\320\275\320\270\321\202\320\265\320\273\321\214\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -21,7 +21,7 @@
// Выполняет тесты группы наборов, соответствующих одному режиму выполнения (клиент/сервер)
// Параметры:
// Наборы - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Наборы тестов модуля
-// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
+// ТестовыйМодуль - см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
//
// Возвращаемое значение:
// Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Результат прогона наборов тестов с заполненной информацией о выполнении
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Module.bsl"
new file mode 100644
index 000000000..29aa27ece
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/Module.bsl"
@@ -0,0 +1,160 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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.
+//
+//©///////////////////////////////////////////////////////////////////////////©//
+
+#Область ПрограммныйИнтерфейс
+
+// Возвращает внешнюю компоненту, реализующую паузу
+// Предоставляет метод `Ожидать`, `Sleep`
+//
+// Возвращаемое значение:
+// ВнешнийОбъект
+Функция Пауза() Экспорт
+
+ Возврат СоздатьКомпоненту(ОписаниеКомпонентыПауза(), Истина);
+
+КонецФункции
+
+// Возвращает внешнюю компоненту, реализующую вывод в консоль
+// Предоставляет метод `Напечатать`, `Print`
+//
+// Возвращаемое значение:
+// ВнешнийОбъект
+Функция Консоль() Экспорт
+
+ Возврат СоздатьКомпоненту(ОписаниеКомпонентыПауза(), Истина);
+
+КонецФункции
+
+// Возвращает внешнюю компоненту, реализующую функциональность регулярных выражений
+// Подробнее с документацией можно ознакомиться по ссылке: https://github.com/alexkmbk/RegEx1CAddin
+//
+// Возвращаемое значение:
+// ВнешнийОбъект
+Функция РегулярныеВыражения() Экспорт
+
+#Если НЕ Сервер Тогда
+ Если НЕ ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда
+ ВызватьИсключение "Компонента регулярных выражений не доступна на клиенте при отключении синхронных вызовов";
+ КонецЕсли;
+#КонецЕсли
+
+ Компонента = СоздатьКомпоненту(ОписаниеКомпонентыРегулярныхВыражений());
+ Компонента.ВызыватьИсключения = Истина;
+ Возврат Компонента;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+// Создает внешнюю компоненту по описанию
+//
+// Параметры:
+// ОписаниеКомпоненты - см. ОписаниеКомпоненты
+// Кэшировать - Булево - Кэшировать созданную компоненту
+//
+// Возвращаемое значение:
+// ВнешнийОбъект
+Функция СоздатьКомпоненту(ОписаниеКомпоненты, Кэшировать = Ложь) Экспорт
+
+ Если Кэшировать Тогда
+ Возврат ЮТПовторногоИспользования.СоздатьКомпоненту(ОписаниеКомпоненты);
+ КонецЕсли;
+
+#Если Сервер Тогда
+ Подключена = ПодключитьКомпоненту(ОписаниеКомпоненты.ИмяМакета, ОписаниеКомпоненты.ИмяКомпоненты, Истина);
+#Иначе
+ Если ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда
+ Подключена = ПодключитьКомпоненту(ОписаниеКомпоненты.ИмяМакета, ОписаниеКомпоненты.ИмяКомпоненты, Истина);
+ Иначе
+ Подключена = Истина; // Подключены при старте системы
+ КонецЕсли;
+#КонецЕсли
+
+ Если Подключена Тогда
+ Возврат Новый (ОписаниеКомпоненты.ИмяКласса);
+ Иначе
+ ВызватьИсключение "Не удалось подключить внешнюю компоненту " + ОписаниеКомпоненты.ИмяКласса;
+ КонецЕсли;
+
+КонецФункции
+
+// Подключает внещнюю компоненту из макета
+//
+// Параметры:
+// ИмяМакета - Строка - Имя макета, в котором хранится компонента
+// ИмяКомпоненты - Строка - Имя компоненты
+// Кэшировать - Булево - Кэшировать создание компоненты
+//
+// Возвращаемое значение:
+// Булево - Успешность подключения
+Функция ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты, Кэшировать) Экспорт
+
+ Если Кэшировать Тогда
+ Возврат ЮТПовторногоИспользования.ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты);
+ КонецЕсли;
+
+ Возврат ПодключитьВнешнююКомпоненту(ИмяМакета, ИмяКомпоненты, ТипВнешнейКомпоненты.Native);
+
+КонецФункции
+
+// Описание компоненты реализующей паузу.
+//
+// Возвращаемое значение:
+// см. ОписаниеКомпоненты
+Функция ОписаниеКомпонентыПауза() Экспорт
+
+ Возврат ОписаниеКомпоненты("ОбщийМакет.ЮТYaxUnitAddIn", "YaxUnitAddin", "Common");
+
+КонецФункции
+
+// Описание компоненты реализующей функциональность регулярных выражений.
+//
+// Возвращаемое значение:
+// см. ОписаниеКомпоненты
+Функция ОписаниеКомпонентыРегулярныхВыражений() Экспорт
+
+ Возврат ОписаниеКомпоненты("ОбщийМакет.ЮТRegEx1CAddin", "RegEx1CAddin", "RegEx");
+
+КонецФункции
+
+// Описание внешней компоненты.
+//
+// Параметры:
+// ИмяМакета - Строка - Имя макета, в котором хранится компонента
+// ИмяКомпоненты - Строка -Имя компоненты
+// ИмяКласса - Строка - Имя класса, по которому создается компонента
+//
+// Возвращаемое значение:
+// Структура - Описание компоненты:
+// * ИмяМакета - Строка - Имя макета, в котором хранится компонента
+// * ИмяКомпоненты - Строка -Имя компоненты
+// * ИмяКласса - Строка - Имя класса
+Функция ОписаниеКомпоненты(ИмяМакета, ИмяКомпоненты, ИмяКласса) Экспорт
+
+ Описание = Новый Структура;
+ Описание.Вставить("ИмяМакета", ИмяМакета);
+ Описание.Вставить("ИмяКомпоненты", ИмяКомпоненты);
+ Описание.Вставить("ИмяКласса", СтрШаблон("AddIn.%1.%2", ИмяКомпоненты, ИмяКласса));
+
+ Возврат Описание;
+
+КонецФункции
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213.mdo"
new file mode 100644
index 000000000..2a4b2c61b
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213.mdo"
@@ -0,0 +1,11 @@
+
+
+ ЮТКомпоненты
+
+ ru
+ Компоненты
+
+ true
+ true
+ true
+
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
new file mode 100644
index 000000000..ec01d6304
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
@@ -0,0 +1,108 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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.
+//
+//©///////////////////////////////////////////////////////////////////////////©//
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Функция ФайлКомпоненты(Знач ИмяМакета, Знач ОперационнаяСистема, Знач Архитектура) Экспорт
+
+ Данные = ЮТОбщийВызовСервера.Макет(ИмяМакета);
+ ЧтениеАрхива = Новый ЧтениеZipФайла();
+ ЧтениеАрхива.Открыть(Данные.ОткрытьПотокДляЧтения());
+
+ ИмяФайлаКомпоненты = ИмяФайлаКомпоненты(ЧтениеАрхива, ОперационнаяСистема, Архитектура);
+
+ Если ИмяФайлаКомпоненты = Неопределено Тогда
+ ВызватьИсключение "Компонента не поддерживает клиентское окружение";
+ КонецЕсли;
+
+ Данные = ДвоичныеДанныеЭлемента(ЧтениеАрхива, ИмяФайлаКомпоненты);
+
+ Возврат Новый ФиксированнаяСтруктура("ИмяФайла, Данные", ИмяФайлаКомпоненты, Данные);
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ИмяФайлаКомпоненты(ЧтениеАрхива, ОперационнаяСистема, Архитектура)
+
+ Данные = ДвоичныеДанныеЭлемента(ЧтениеАрхива, "MANIFEST.XML");
+
+ Если Данные = Неопределено Тогда
+ ВызватьИсключение "Архив компоненты не содержит манифеста";
+ КонецЕсли;
+
+ ЧтениеXML = Новый ЧтениеXML();
+ ЧтениеXML.ОткрытьПоток(Данные.ОткрытьПотокДляЧтения());
+
+ ИмяФайлаКомпоненты = Неопределено;
+
+ Пока ЧтениеXML.Прочитать() Цикл
+
+ Если ЭтоПодходящийУзел(ЧтениеXML, ОперационнаяСистема, Архитектура) Тогда
+ ИмяФайлаКомпоненты = ЧтениеXML.ЗначениеАтрибута("path");
+ Прервать;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ ЧтениеXML.Закрыть();
+
+ Возврат ИмяФайлаКомпоненты;
+
+КонецФункции
+
+Функция ЭтоПодходящийУзел(ЧтениеXML, ОперационнаяСистема, Архитектура)
+
+ Если ЧтениеXML.ТипУзла <> ТипУзлаXML.НачалоЭлемента ИЛИ СтрСравнить(ЧтениеXML.Имя, "component") <> 0 Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ ОперационнаяСистемаУзла = ЧтениеXML.ЗначениеАтрибута("os");
+ АрхитектураУзла = ЧтениеXML.ЗначениеАтрибута("arch");
+
+ Возврат ОперационнаяСистема = ОперационнаяСистемаУзла И Архитектура = АрхитектураУзла;
+
+КонецФункции
+
+Функция ДвоичныеДанныеЭлемента(ЧтениеАрхива, ИмяФайла)
+
+ ЭлементФайла = Неопределено;
+
+ Для Каждого Элемент Из ЧтениеАрхива.Элементы Цикл
+ Если СтрСравнить(Элемент.ПолноеИмя, ИмяФайла) = 0 Тогда
+ ЭлементФайла = Элемент;
+ КонецЕсли;
+ КонецЦикла;
+
+ Если ЭлементФайла = Неопределено Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
+ ЧтениеАрхива.Извлечь(ЭлементФайла, ИмяВременногоФайла, РежимВосстановленияПутейФайловZIP.НеВосстанавливать);
+
+ Данные = Новый ДвоичныеДанные(ЮТФайлы.ОбъединитьПути(ИмяВременногоФайла, ИмяФайла));
+ УдалитьФайлы(ИмяВременногоФайла);
+
+ Возврат Данные;
+
+КонецФункции
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo"
new file mode 100644
index 000000000..2fdf4a25f
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260.mdo"
@@ -0,0 +1,10 @@
+
+
+ ЮТКомпонентыВызовСервера
+
+ ru
+ Компоненты вызов сервера
+
+ true
+ true
+
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
new file mode 100644
index 000000000..5480d3b5c
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/Module.bsl"
@@ -0,0 +1,217 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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.
+//
+//©///////////////////////////////////////////////////////////////////////////©//
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Процедура ТихаяУстановкаКомпонент(ОбработчикЗавершения) Экспорт
+
+ ПараметрыТихойУстановки = ПараметрыТихойУстановки();
+ ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыПауза());
+ ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыРегулярныхВыражений());
+
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки,
+ ЭтотОбъект,
+ "УстановитьПараметрыОкружения");
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки,
+ ЭтотОбъект,
+ "ТихаяУстановкаВнешнихКомпонент");
+
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки,
+ ЭтотОбъект,
+ "ТихаяУстановкаВнешнихКомпонент");
+ Если НЕ ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки,
+ ЭтотОбъект,
+ "ПодключениеВнешнихКомпонент");
+ КонецЕсли;
+
+ ПараметрыТихойУстановки.Цепочка.Добавить(ОбработчикЗавершения);
+
+ Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.СледующийОбработчик(ПараметрыТихойУстановки);
+ НачатьПолучениеРабочегоКаталогаДанныхПользователя(Обработчик);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ПараметрыТихойУстановки()
+
+ ПараметрыТихойУстановки = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ЦепочкаАсинхроннойОбработки();
+ ПараметрыТихойУстановки.Вставить("Компоненты", Новый Массив());
+ ПараметрыТихойУстановки.Вставить("РабочийКаталог", "");
+ ПараметрыТихойУстановки.Вставить("ОперационнаяСистема", "");
+ ПараметрыТихойУстановки.Вставить("Архитектура", "");
+ ПараметрыТихойУстановки.Вставить("ДанныеРеестра", "");
+ ПараметрыТихойУстановки.Вставить("ИзмененРеестр", Ложь);
+ ПараметрыТихойУстановки.Вставить("ПодключенныеКомпоненты", Новый Массив());
+
+ Возврат ПараметрыТихойУстановки;
+
+КонецФункции
+
+Процедура УстановитьПараметрыОкружения(Результат, ПараметрыТихойУстановки) Экспорт
+
+ КорневойКаталог = ЮТФайлы.ОбъединитьПути(Результат, "..", "..", "..");
+ КаталогКомпонент = ЮТФайлы.ОбъединитьПути(КорневойКаталог, "ExtCompT");
+
+ ПараметрыТихойУстановки.РабочийКаталог = КаталогКомпонент;
+ Информация = Новый СистемнаяИнформация();
+ ОперационнаяСистема = Неопределено;
+ Архитектура = Неопределено;
+
+ Linux = "Linux";
+ Windows = "Windows";
+ MacOS = "MacOS";
+
+ x86 = "i386";
+ x64 = "x86_64";
+
+ ТипКлиентскойПлатформы = Информация.ТипПлатформы;
+
+ Если ТипКлиентскойПлатформы = ТипПлатформы.Linux_x86 Тогда
+ ОперационнаяСистема = Linux;
+ Архитектура = x86;
+ ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Linux_x86_64 Тогда
+ ОперационнаяСистема = Linux;
+ Архитектура = x64;
+ ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Windows_x86 Тогда
+ ОперационнаяСистема = Windows;
+ Архитектура = x86;
+ ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.Windows_x86_64 Тогда
+ ОперационнаяСистема = Windows;
+ Архитектура = x64;
+ ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.MacOS_x86 Тогда
+ ОперационнаяСистема = MacOS;
+ Архитектура = x86;
+ ИначеЕсли ТипКлиентскойПлатформы = ТипПлатформы.MacOS_x86_64 Тогда
+ ОперационнаяСистема = MacOS;
+ Архитектура = x64;
+ Иначе
+ ЮТИсполнительКлиент.ОбработкаОшибки("Неподдерживаемый тип платформы");
+ КонецЕсли;
+
+ ПараметрыТихойУстановки.ОперационнаяСистема = ОперационнаяСистема;
+ ПараметрыТихойУстановки.Архитектура = Архитектура;
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыТихойУстановки);
+
+КонецПроцедуры
+
+Процедура ПрочитатьФайлRegistry(ПараметрыТихойУстановки) Экспорт
+
+#Если ВебКлиент Тогда
+ ЮТИсполнительКлиент.ОбработкаОшибки(ЮТОбщий.МетодНеДоступен("ЮТКомпонентыКлиент.ПрочитатьФайлRegistry"));
+ Возврат;
+#Иначе
+ ФайлРеестра = ЮТФайлы.ОбъединитьПути(ПараметрыТихойУстановки.РабочийКаталог, "registry.xml");
+ Чтение = Новый ЧтениеТекста(ФайлРеестра);
+ Данные = Чтение.Прочитать();
+ Чтение.Закрыть();
+ ПараметрыТихойУстановки.ДанныеРеестра = Данные;
+
+#КонецЕсли
+
+КонецПроцедуры
+
+Процедура ЗаписатьФайлRegistry(ПараметрыТихойУстановки) Экспорт
+
+#Если ВебКлиент Тогда
+ ЮТИсполнительКлиент.ОбработкаОшибки(ЮТОбщий.МетодНеДоступен("ЮТКомпонентыКлиент.ЗаписатьФайлRegistry"));
+ Возврат;
+#Иначе
+ Если ПараметрыТихойУстановки.ИзмененРеестр Тогда
+ ФайлРеестра = ЮТФайлы.ОбъединитьПути(ПараметрыТихойУстановки.РабочийКаталог, "registry.xml");
+ Запись = Новый ЗаписьТекста(ФайлРеестра);
+ Запись.Записать(ПараметрыТихойУстановки.ДанныеРеестра);
+ Запись.Закрыть();
+ КонецЕсли;
+#КонецЕсли
+
+КонецПроцедуры
+
+Процедура ТихаяУстановкаВнешнихКомпонент(Результат, ПараметрыТихойУстановки) Экспорт
+
+ ПрочитатьФайлRegistry(ПараметрыТихойУстановки);
+
+ Для Каждого Компонента Из ПараметрыТихойУстановки.Компоненты Цикл
+ ТихаяУстановкаВнешнейКомпоненты(Компонента, ПараметрыТихойУстановки);
+ КонецЦикла;
+
+ ЗаписатьФайлRegistry(ПараметрыТихойУстановки);
+
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыТихойУстановки);
+
+КонецПроцедуры
+
+Процедура ПодключениеВнешнихКомпонент(Результат, ПараметрыТихойУстановки) Экспорт
+
+ КомпонентаДляПодключения = Неопределено;
+
+ Для Каждого Компонента Из ПараметрыТихойУстановки.Компоненты Цикл
+ Если ПараметрыТихойУстановки.ПодключенныеКомпоненты.Найти(Компонента) = Неопределено Тогда
+ КомпонентаДляПодключения = Компонента;
+ Прервать;
+ КонецЕсли;
+ КонецЦикла;
+
+ Если КомпонентаДляПодключения = Неопределено Тогда
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыТихойУстановки);
+ КонецЕсли;
+
+ ПараметрыТихойУстановки.ПодключенныеКомпоненты.Добавить(КомпонентаДляПодключения);
+ Обработчик = ЮТАсинхроннаяОбработкаСлужебныйКлиент.ТекущийОбработчик(ПараметрыТихойУстановки);
+ НачатьПодключениеВнешнейКомпоненты(Обработчик,
+ КомпонентаДляПодключения.ИмяМакета,
+ КомпонентаДляПодключения.ИмяКомпоненты,
+ ТипВнешнейКомпоненты.Native);
+
+КонецПроцедуры
+
+Процедура ТихаяУстановкаВнешнейКомпоненты(Компонента, Параметры)
+
+ ДанныеФайла = ЮТКомпонентыВызовСервера.ФайлКомпоненты(Компонента.ИмяМакета, Параметры.ОперационнаяСистема, Параметры.Архитектура);
+
+ Если ЗаписатьВРеестр(Параметры.ДанныеРеестра, ДанныеФайла.ИмяФайла) Тогда
+ Параметры.ИзмененРеестр = Истина;
+ КонецЕсли;
+
+ ФайлКомпоненты = ЮТФайлы.ОбъединитьПути(Параметры.РабочийКаталог, ДанныеФайла.ИмяФайла);
+ ДанныеФайла.Данные.Записать(ФайлКомпоненты);
+
+КонецПроцедуры
+
+Функция ЗаписатьВРеестр(ДанныеРеестра, ИмяФайла)
+
+ Если СтрНайти(ДанныеРеестра, "
+ |
+ |
+ |", ИмяФайла);
+ ИначеЕсли СтрНайти(ДанныеРеестра, СтрШаблон("path=""%1""", ИмяФайла)) <> 0 Тогда // Компонента уже зарегистрированна
+ Возврат Ложь;
+ Иначе // Добавляем компоненту
+ Запись = СтрШаблон(" ", ИмяФайла);
+ ДанныеРеестра = СтрЗаменить(ДанныеРеестра, "", Запись + Символы.ПС + "");
+ КонецЕсли;
+
+ Возврат Истина;
+
+КонецФункции
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202.mdo"
new file mode 100644
index 000000000..3a4492e06
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202/\320\256\320\242\320\232\320\276\320\274\320\277\320\276\320\275\320\265\320\275\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202.mdo"
@@ -0,0 +1,10 @@
+
+
+ ЮТКомпонентыКлиент
+
+ ru
+ Компоненты клиент
+
+ true
+ true
+
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
index bb9daf196..0cfef8464 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
@@ -30,7 +30,9 @@
КонецПроцедуры
-Процедура Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения = Неопределено) Экспорт
+Процедура Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения, Знач ОграничениеТипа) Экспорт
+
+ ЮТПроверкиСлужебный.ПроверитьТипПараметра(ОграничениеТипа, "Тип, ОписаниеТипов, Строка", "Фикция", "ЮТКонструкторТестовыхДанных", Истина);
Если ЗначениеЗаполнено(Контекст.ТекущаяТабличнаяЧасть) Тогда
ОписаниеРеквизита = Контекст.Метаданные.ТабличныеЧасти[Контекст.ТекущаяТабличнаяЧасть][ИмяРеквизита];
@@ -40,7 +42,14 @@
ТекущаяЗапись = Контекст.Данные;
КонецЕсли;
- Значение = ЮТТестовыеДанныеСлужебный.Фикция(ОписаниеРеквизита.Тип, РеквизитыЗаполнения);
+ Если ОграничениеТипа <> Неопределено Тогда
+ ПолноеИмяРеквизита = ЮТОбщий.ДобавитьСтроку(Контекст.ТекущаяТабличнаяЧасть, ИмяРеквизита, ".");
+ ТипЗначения = ПересечениеТипов(ОписаниеРеквизита.Тип, ОграничениеТипа, ПолноеИмяРеквизита);
+ Иначе
+ ТипЗначения = ОписаниеРеквизита.Тип;
+ КонецЕсли;
+
+ Значение = ЮТТестовыеДанныеСлужебный.Фикция(ТипЗначения, РеквизитыЗаполнения);
ТекущаяЗапись.Вставить(ИмяРеквизита, Значение);
КонецПроцедуры
@@ -175,7 +184,7 @@
// Структура - Новый контекст конструктора:
// * Менеджер - Произвольный
// * Данные - Структура
-// * Метаданные - см. ЮТМетаданные.ОписаниеОбъектМетаданных
+// * Метаданные - см. ЮТМетаданные.ОписаниеОбъектаМетаданных
// * ТекущаяТабличнаяЧасть - Строка
// * ДополнительныеСвойства - Структура
Функция НовыйКонтекстКонструктора(Менеджер) Экспорт
@@ -183,7 +192,7 @@
Контекст = Новый Структура("Менеджер, Данные, Метаданные", Менеджер, Новый Структура());
Контекст.Вставить("Менеджер", Менеджер);
Контекст.Вставить("Данные", Новый Структура());
- Контекст.Вставить("Метаданные", ЮТМетаданные.ОписаниеОбъектМетаданных(Менеджер));
+ Контекст.Вставить("Метаданные", ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер));
Контекст.Вставить("ТекущаяТабличнаяЧасть", "");
Контекст.Вставить("ДополнительныеСвойства", Новый Структура());
@@ -197,4 +206,39 @@
КонецФункции
+Функция ПересечениеТипов(Знач ОписаниеТипов, Знач ОграничениеТипов, ИмяРеквизита)
+
+ ТипОграничения = ТипЗнч(ОграничениеТипов);
+
+ Если ТипОграничения = Тип("Строка") Тогда
+ ОграничениеТипов = Новый ОписаниеТипов(ОграничениеТипов);
+ ТипОграничения = Тип("ОписаниеТипов");
+ КонецЕсли;
+
+ Если ТипОграничения = Тип("Тип") И ОписаниеТипов.СодержитТип(ОграничениеТипов) И ОграничениеТипов <> Тип("Неопределено") Тогда
+ Результат = ЮТОбщий.ЗначениеВМассиве(ОграничениеТипов);
+ ИначеЕсли ТипОграничения = Тип("ОписаниеТипов") Тогда
+ Результат = ЮТОбщий.ПересечениеМассивов(ОписаниеТипов.Типы(), ОграничениеТипов.Типы());
+ Иначе
+ Результат = Неопределено;
+ КонецЕсли;
+
+ Если НЕ ЗначениеЗаполнено(Результат) Тогда
+
+ Сообщение = СтрШаблон("Исправьте ограничение типов для реквизита `%1` (`%2`), оно не входит в множество типов реквизита (`%3`)",
+ ИмяРеквизита,
+ ОграничениеТипов,
+ ОписаниеТипов);
+ ВызватьИсключение Сообщение;
+
+ КонецЕсли;
+
+ Возврат Новый ОписаниеТипов(Результат,
+ ОписаниеТипов.КвалификаторыЧисла,
+ ОписаниеТипов.КвалификаторыСтроки,
+ ОписаниеТипов.КвалификаторыДаты,
+ ОписаниеТипов.КвалификаторыДвоичныхДанных);
+
+КонецФункции
+
#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\242\320\265\321\201\321\202\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\242\320\265\321\201\321\202\320\260/Module.bsl"
index c447efb9e..e852d7cb1 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\242\320\265\321\201\321\202\320\260/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\232\320\276\320\275\321\202\320\265\320\272\321\201\321\202\320\242\320\265\321\201\321\202\320\260/Module.bsl"
@@ -16,7 +16,7 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
-#Область СлужебныйПрограммныйИнтерфейс
+#Область ПрограммныйИнтерфейс
// Возвращает значение контекста
//
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/Module.bsl"
index abb848b40..ad386ced4 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265/Module.bsl"
@@ -62,12 +62,12 @@
#Если Клиент Тогда
Контекст = Контекст();
- Если Контекст = Неопределено ИЛИ НЕ Контекст.Включено ИЛИ Контекст.ДоступенНаСервере Тогда
+ Если Контекст = Неопределено ИЛИ НЕ Контекст.Включено ИЛИ Контекст.ФайлЛогаДоступенНаСервере Тогда
Возврат;
КонецЕсли;
Сообщения = ЮТЛогированиеВызовСервера.НакопленныеСообщенияЛогирования(Истина);
- ЗаписатьСообщения(Контекст.ФайлЛога, Сообщения);
+ ЗаписатьСообщения(Контекст, Сообщения);
#Иначе
ВызватьИсключение "Метод вывода серверных сообщений в лог должен вызываться с клиента";
#КонецЕсли
@@ -86,13 +86,16 @@
// ПараметрыЗапуска - см. ЮТФабрика.ПараметрыЗапуска
Процедура Инициализация(ПараметрыЗапуска) Экспорт
+ УровниЛога = УровниЛога();
+
ДанныеКонтекста = НовыйДанныеКонтекста();
- ДанныеКонтекста.ФайлЛога = ПараметрыЗапуска.logging.file;
+ ДанныеКонтекста.ФайлЛога = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.logging, "file");
+ ДанныеКонтекста.ВыводВКонсоль = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.logging, "console", Ложь);
+ ДанныеКонтекста.Включено = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.logging, "enable", Неопределено);
+ УровеньЛога = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.logging, "level", УровниЛога.Отладка);
- Если ПараметрыЗапуска.logging.enable = Неопределено Тогда
- ДанныеКонтекста.Включено = ЗначениеЗаполнено(ДанныеКонтекста.ФайлЛога);
- Иначе
- ДанныеКонтекста.Включено = ПараметрыЗапуска.logging.enable;
+ Если ДанныеКонтекста.Включено = Неопределено Тогда
+ ДанныеКонтекста.Включено = ДанныеКонтекста.ВыводВКонсоль ИЛИ ЗначениеЗаполнено(ДанныеКонтекста.ФайлЛога);
КонецЕсли;
Если НЕ ДанныеКонтекста.Включено Тогда
@@ -100,24 +103,24 @@
Возврат;
КонецЕсли;
- УровниЛога = УровниЛога();
-
- Если СтрСравнить(ПараметрыЗапуска.logging.level, УровниЛога.Ошибка) = 0 Тогда
+ Если СтрСравнить(УровеньЛога, УровниЛога.Ошибка) = 0 Тогда
ДанныеКонтекста.УровеньЛога = 2;
- ИначеЕсли СтрСравнить(ПараметрыЗапуска.logging.level, УровниЛога.Информация) = 0 Тогда
+ ИначеЕсли СтрСравнить(УровеньЛога, УровниЛога.Информация) = 0 Тогда
ДанныеКонтекста.УровеньЛога = 1;
Иначе
ДанныеКонтекста.УровеньЛога = 0;
КонецЕсли;
ЗначениеПроверки = Строка(Новый УникальныйИдентификатор());
- ЗаписатьСообщения(ДанныеКонтекста.ФайлЛога, ЮТОбщий.ЗначениеВМассиве(ЗначениеПроверки), Ложь);
- ДанныеКонтекста.ДоступенНаСервере = ЮТЛогированиеВызовСервера.ФайлЛогаДоступенНаСервере(ДанныеКонтекста.ФайлЛога, ЗначениеПроверки);
+ ЗаписатьСообщения(ДанныеКонтекста, ЮТОбщий.ЗначениеВМассиве(ЗначениеПроверки), Ложь);
+
+ ДанныеКонтекста.ФайлЛогаДоступенНаСервере = ЮТЛогированиеВызовСервера.ФайлЛогаДоступенНаСервере(ДанныеКонтекста.ФайлЛога, ЗначениеПроверки);
ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаЛогирования(), ДанныеКонтекста, Истина);
Разделитель = "------------------------------------------------------";
- ЗаписатьСообщения(ДанныеКонтекста.ФайлЛога, ЮТОбщий.ЗначениеВМассиве(Разделитель), Ложь);
+ ЗаписатьСообщения(ДанныеКонтекста, ЮТОбщий.ЗначениеВМассиве(Разделитель), Ложь);
+
Информация("Старт");
КонецПроцедуры
@@ -162,19 +165,19 @@
// Обработка события "ПослеФормированияИсполняемыхНаборовТестов"
// Параметры:
-// КоллекцияКатегорийНаборов - Массив из см. ЮТФабрика.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов
-Процедура ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов) Экспорт
+// ИсполняемыеТестовыеМодули - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля - Набор исполняемых наборов
+Процедура ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули) Экспорт
Количество = 0;
- Для Каждого Наборы Из КоллекцияКатегорийНаборов Цикл
-
- Для Каждого Набор Из Наборы.Клиентские Цикл
- ЮТОбщий.Инкремент(Количество, Набор.Тесты.Количество());
- КонецЦикла;
+ Для Каждого ТестовыйМодуль Из ИсполняемыеТестовыеМодули Цикл
- Для Каждого Набор Из Наборы.Серверные Цикл
- ЮТОбщий.Инкремент(Количество, Набор.Тесты.Количество());
+ Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
+
+ Если Набор.Выполнять Тогда
+ ЮТОбщий.Инкремент(Количество, Набор.Тесты.Количество());
+ КонецЕсли;
+
КонецЦикла;
КонецЦикла;
@@ -228,6 +231,10 @@
Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
Контекст = Контекст();
+ Если НЕ ЛогированиеВключено(Контекст) Тогда
+ Возврат;
+ КонецЕсли;
+
ЮТОбщий.Инкремент(Контекст.КоличествоВыполненныхТестов);
Информация(СтрШаблон("%1 Завершен тест `%2`", Прогресс(), ОписаниеСобытия.Тест.Имя));
@@ -249,9 +256,12 @@
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
Процедура ПослеВсехТестов(ОписаниеСобытия) Экспорт
+ Контекст = Контекст();
+ Если НЕ ЛогированиеВключено(Контекст) Тогда
+ Возврат;
+ КонецЕсли;
#Если Клиент Тогда
- Прогресс = Контекст().КоличествоВыполненныхТестов;
- ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаЛогирования() + ".КоличествоВыполненныхТестов", Прогресс, Истина);
+ ЮТКонтекст.УстановитьЗначениеКонтекста(ИмяКонтекстаЛогирования() + ".КоличествоВыполненныхТестов", Контекст.КоличествоВыполненныхТестов, Истина);
#КонецЕсли
Информация(СтрШаблон("Завершен модуль `%1`", ОписаниеСобытия.Модуль.МетаданныеМодуля.ПолноеИмя));
@@ -284,7 +294,8 @@
// Структура - Новый данные контекста:
// * Включено - Булево - Логирование включено
// * ФайлЛога - Неопределено - Файл вывода лога
-// * ДоступенНаСервере - Булево - Файл лога доступен на сервере
+// * ВыводВКонсоль- Булево - Вывод лога в консоль
+// * ФайлЛогаДоступенНаСервере - Булево - Файл лога доступен на сервере
// * НакопленныеЗаписи - Массив из Строка - Буфер для серверных сообщений
// * ОбщееКоличествоТестов - Число
// * КоличествоВыполненныхТестов - Число
@@ -294,7 +305,8 @@
ДанныеКонтекста = Новый Структура();
ДанныеКонтекста.Вставить("Включено", Ложь);
ДанныеКонтекста.Вставить("ФайлЛога", Неопределено);
- ДанныеКонтекста.Вставить("ДоступенНаСервере", Ложь);
+ ДанныеКонтекста.Вставить("ВыводВКонсоль", Ложь);
+ ДанныеКонтекста.Вставить("ФайлЛогаДоступенНаСервере", Ложь);
ДанныеКонтекста.Вставить("НакопленныеЗаписи", Новый Массив());
ДанныеКонтекста.Вставить("ОбщееКоличествоТестов", 0);
ДанныеКонтекста.Вставить("КоличествоВыполненныхТестов", 0);
@@ -308,6 +320,16 @@
#Область Запись
+Функция ЛогированиеВключено(Знач Контекст = Неопределено, Приоритет = Неопределено)
+
+ Если Контекст = Неопределено Тогда
+ Контекст = Контекст();
+ КонецЕсли;
+
+ Возврат Контекст <> Неопределено И Контекст.Включено И (Приоритет = Неопределено ИЛИ Контекст.УровеньЛога <= Приоритет);
+
+КонецФункции
+
Функция НакопленныеСообщенияЛогирования(Очистить = Ложь) Экспорт
Контекст = Контекст();
@@ -325,7 +347,7 @@
Процедура Записать(УровеньЛога, Сообщение, Приоритет)
Контекст = Контекст();
- Если Контекст = Неопределено ИЛИ НЕ Контекст.Включено ИЛИ Контекст.УровеньЛога > Приоритет Тогда
+ Если НЕ ЛогированиеВключено(Контекст, Приоритет) Тогда
Возврат;
КонецЕсли;
@@ -336,10 +358,10 @@
#КонецЕсли
Текст = СтрШаблон("%1 [%2][%3]: %4", ЮТОбщий.ПредставлениеУниверсальнойДата(), КонтекстИсполнения, УровеньЛога, Сообщение);
#Если Клиент Тогда
- ЗаписатьСообщения(Контекст.ФайлЛога, ЮТОбщий.ЗначениеВМассиве(Текст));
+ ЗаписатьСообщения(Контекст, ЮТОбщий.ЗначениеВМассиве(Текст));
#Иначе
- Если Контекст.ДоступенНаСервере Тогда
- ЗаписатьСообщения(Контекст.ФайлЛога, ЮТОбщий.ЗначениеВМассиве(Текст));
+ Если Контекст.ФайлЛогаДоступенНаСервере Тогда
+ ЗаписатьСообщения(Контекст, ЮТОбщий.ЗначениеВМассиве(Текст));
Иначе
Контекст.НакопленныеЗаписи.Добавить(Текст);
КонецЕсли;
@@ -347,11 +369,30 @@
КонецПроцедуры
-Процедура ЗаписатьСообщения(ФайлЛога, Сообщения, Дописывать = Истина)
+Процедура ЗаписатьСообщения(Контекст, Сообщения, Дописывать = Истина)
#Если ВебКлиент Тогда
ВызватьИсключение "Метод записи лога не доступен в web-клиенте";
#Иначе
+
+ Если Контекст.ВыводВКонсоль Тогда
+ ЗаписатьЛогВКонсоль(Сообщения);
+ КонецЕсли;
+
+ Если ЗначениеЗаполнено(Контекст.ФайлЛога) Тогда
+ ЗаписатьЛогВФайл(Контекст.ФайлЛога, Сообщения, Дописывать);
+ КонецЕсли;
+
+#КонецЕсли
+
+КонецПроцедуры
+
+Процедура ЗаписатьЛогВФайл(ФайлЛога, Сообщения, Дописывать = Истина)
+
+#Если ВебКлиент Тогда
+ ВызватьИсключение "Метод записи лога не доступен в web-клиенте";
+#Иначе
+
Запись = Новый ЗаписьТекста(ФайлЛога, КодировкаТекста.UTF8, , Дописывать);
Для Каждого Сообщение Из Сообщения Цикл
@@ -363,6 +404,22 @@
КонецПроцедуры
+Процедура ЗаписатьЛогВКонсоль(Сообщения)
+
+#Если ВебКлиент Тогда
+ ВызватьИсключение "Метод записи лога не доступен в web-клиенте";
+#Иначе
+
+ Попытка
+ Для Каждого Сообщение Из Сообщения Цикл
+ ЮТОбщий.ВывестиВКонсоль(Сообщение);
+ КонецЦикла;
+ Исключение
+ КонецПопытки;
+#КонецЕсли
+
+КонецПроцедуры
+
Функция Прогресс()
Контекст = Контекст();
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
index c3009acda..fb73b8d57 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\233\320\276\320\263\320\270\321\200\320\276\320\262\320\260\320\275\320\270\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
@@ -30,6 +30,8 @@
Чтение = Новый ЧтениеТекста(ИмяФайла);
Строка = Чтение.ПрочитатьСтроку();
+ Чтение.Закрыть();
+
Возврат Строка = ЗначениеПроверки;
Исключение
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl"
index 3187cd915..53e1606c5 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl"
@@ -23,45 +23,82 @@
// Подсистема должна находится в подсистеме "ЮТФункциональность"
// Параметры:
// ИмяПодсистемы - Строка - Имя подсистемы
-//
+// Серверные - Булево - Возвращять модули доступные на сервере
+// Клиентские - Булево - Возвращять модули доступные на клиенте
// Возвращаемое значение:
// Массив из Строка - Имена модулей входящих в подсистему
-Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт
+Функция МодулиПодсистемы(ИмяПодсистемы, Серверные = Истина, Клиентские = Истина) Экспорт
- Возврат ЮТМетаданныеПовтИсп.МодулиПодсистемы(ИмяПодсистемы);
+ Возврат ЮТМетаданныеПовтИсп.МодулиПодсистемы(ИмяПодсистемы, Серверные, Клиентские);
КонецФункции
-// Описание менеджера.
+// Описание объекта метаданных.
//
// Параметры:
-// Значение - Произвольный
+// Значение - ОбъектМетаданных
+// - Тип - Тип объекта информационной базы
+// - Строка - Полное имя объекта метаданных
+// - см. ОписаниеОбъектаМетаданных
+// - Произвольный - Объект информационной базы
//
// Возвращаемое значение:
// Структура - Описание менеджера:
// * ОписаниеТипа - см. ЮТМетаданныеСервер.ОписаниеТипаМетаданных
-// * Реквизиты - Структура из см. ЮТМетаданныеСервер.ОписаниеРеквизита
+// * Реквизиты - Структура из см. ЮТФабрика.ОписаниеРеквизита
// * ТабличныеЧасти - Структура из Структура -
-Функция ОписаниеОбъектМетаданных(Знач Значение) Экспорт
+Функция ОписаниеОбъектаМетаданных(Знач Значение) Экспорт
ТипЗначения = ТипЗнч(Значение);
+ Если ТипЗначения = Тип("Структура") И ЭтоОписаниеОбъектаМетаданных(Значение) Тогда
+ Возврат Значение;
+ КонецЕсли;
+
+#Если Сервер Тогда
+ Если ТипЗначения = Тип("ОбъектМетаданных") Тогда
+ Значение = Значение.ПолноеИмя();
+ ТипЗначения = Тип("Строка");
+ КонецЕсли;
+#КонецЕсли
+
Если ТипЗначения <> Тип("Тип") И ТипЗначения <> Тип("Строка") Тогда
Значение = ТипЗнч(Значение);
ТипЗначения = Тип("Тип");
КонецЕсли;
Если ТипЗначения = Тип("Тип") Тогда
- Возврат ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(Значение);
+ ИдентификаторТипа = ЮТТипыДанныхСлужебный.ИдентификаторТипа(Значение); // Для работы кэширования
+ Возврат ЮТМетаданныеПовтИсп.ОписаниеОбъектаМетаданныхПоИдентификаторуТипа(ИдентификаторТипа);
Иначе
- Возврат ЮТМетаданныеПовтИсп.ОписаниеОбъектМетаданных(Значение);
+ Возврат ЮТМетаданныеПовтИсп.ОписаниеОбъектаМетаданных(Значение);
КонецЕсли;
КонецФункции
+Функция ЭтоОписаниеОбъектаМетаданных(Параметры) Экспорт
+
+ Возврат ЮТОбщий.ЭтаСтруктураИмеетТип(Параметры, "ОписаниеОбъектаМетаданных");
+
+КонецФункции
+
Функция ТипыМетаданных() Экспорт
- Возврат ЮТМетаданныеСервер.ТипыМетаданных();
+ Возврат ЮТМетаданныеПовтИсп.ТипыМетаданных();
+
+КонецФункции
+
+Функция ЭтоПеречисление(Значение) Экспорт
+
+ Описание = ОписаниеОбъектаМетаданных(Значение);
+
+ Возврат Описание <> Неопределено И Описание.ОписаниеТипа.Имя = "Перечисление";
+
+КонецФункции
+
+Функция РазрешеныСинхронныеВызовы() Экспорт
+
+ Возврат ЮТМетаданныеПовтИсп.РазрешеныСинхронныеВызовы();
КонецФункции
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl"
index 37613b03c..c19d62a08 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\237\320\276\320\262\321\202\320\230\321\201\320\277/Module.bsl"
@@ -18,15 +18,22 @@
#Область СлужебныйПрограммныйИнтерфейс
-Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт
+Функция МодулиПодсистемы(ИмяПодсистемы, Серверные, Клиентские) Экспорт
- Возврат ЮТМетаданныеСервер.МодулиПодсистемы(ИмяПодсистемы);
+ Возврат ЮТМетаданныеСервер.МодулиПодсистемы(ИмяПодсистемы, Серверные, Клиентские);
КонецФункции
-Функция ОписаниеОбъектМетаданных(Знач Менеджер) Экспорт
+Функция ОписаниеОбъектаМетаданных(Знач Менеджер) Экспорт
- Возврат ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(Менеджер);
+ Возврат ЮТМетаданныеСервер.ОписаниеОбъектаМетаданных(Менеджер);
+
+КонецФункции
+
+Функция ОписаниеОбъектаМетаданныхПоИдентификаторуТипа(Знач ИдентификаторТипа) Экспорт
+
+ Тип = ЮТТипыДанныхСлужебный.ТипПоИдентификатору(ИдентификаторТипа);
+ Возврат ЮТМетаданныеСервер.ОписаниеОбъектаМетаданных(Тип);
КонецФункции
@@ -36,4 +43,10 @@
КонецФункции
+Функция РазрешеныСинхронныеВызовы() Экспорт
+
+ Возврат ЮТМетаданныеСервер.РазрешеныСинхронныеВызовы();
+
+КонецФункции
+
#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
index edce53984..4ec4f6186 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -49,10 +49,12 @@
// Подсистема должна находится в подсистеме "ЮТФункциональность"
// Параметры:
// ИмяПодсистемы - Строка - Имя подсистемы
+// Серверные - Булево - Возвращять модули доступные на сервере
+// Клиентские - Булево - Возвращять модули доступные на клиенте
//
// Возвращаемое значение:
// Массив из Строка - Имена модулей входящих в подсистему
-Функция МодулиПодсистемы(ИмяПодсистемы) Экспорт
+Функция МодулиПодсистемы(Знач ИмяПодсистемы, Знач Серверные, Знач Клиентские) Экспорт
Подсистема = Метаданные.Подсистемы.ЮТФункциональность.Подсистемы.Найти(ИмяПодсистемы);
@@ -68,7 +70,14 @@
Если Метаданные.ОбщиеМодули.Содержит(Объект) Тогда
- Модули.Добавить(Объект.Имя);
+ Добавить = (Серверные И Клиентские)
+ ИЛИ (Серверные И (Объект.Сервер))
+ ИЛИ (Клиентские И (Объект.КлиентУправляемоеПриложение Или Объект.ВызовСервера));
+ // КлиентОбычноеПриложение сознательно не анализируется, он должен идти в паре с другой настройкой
+
+ Если Добавить Тогда
+ Модули.Добавить(Объект.Имя);
+ КонецЕсли;
КонецЕсли;
@@ -78,14 +87,6 @@
КонецФункции
-// МетаданныеМодуля
-// Создает описание метаданных модуля
-//
-// Параметры:
-// Модуль - ОбъектМетаданныхОбщийМодуль, Структура, Строка - Общий модуль либо структура с аналогичными атрибутами или имя модуля
-//
-// Возвращаемое значение:
-// Структура - см. ЮТФабрика.ОписаниеМодуля
Функция МетаданныеМодуля(Знач Модуль) Экспорт
Если ТипЗнч(Модуль) = Тип("Строка") Тогда
@@ -101,6 +102,7 @@
Описание.Имя = Модуль.Имя;
Описание.КлиентУправляемоеПриложение = Модуль.КлиентУправляемоеПриложение;
Описание.КлиентОбычноеПриложение = Модуль.КлиентОбычноеПриложение;
+ Описание.Глобальный = Модуль.Глобальный;
Описание.Сервер = Модуль.Сервер;
Описание.ВызовСервера = Модуль.ВызовСервера;
Описание.Расширение = Модуль.РасширениеКонфигурации().Имя;
@@ -110,7 +112,7 @@
КонецФункции
-Функция ОписаниеОбъектМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт
+Функция ОписаниеОбъектаМетаданных(Знач Значение, ЗаполнятьРеквизиты = Истина) Экспорт
МетаданныеОбъекта = ОбъектМетаданных(Значение);
ОписаниеТипа = ОписаниеТипаМетаданных(МетаданныеОбъекта);
@@ -120,6 +122,7 @@
ОписаниеОбъект.Вставить("ОписаниеТипа", ОписаниеТипа);
ОписаниеОбъект.Вставить("Реквизиты", Новый Структура());
ОписаниеОбъект.Вставить("ТабличныеЧасти", Новый Структура());
+ ЮТОбщий.УказатьТипСтруктуры(ОписаниеОбъект, "ОписаниеОбъектаМетаданных");
Если НЕ ЗаполнятьРеквизиты Тогда
Возврат ОписаниеОбъект;
@@ -219,6 +222,13 @@
КонецФункции
+Функция РазрешеныСинхронныеВызовы() Экспорт
+
+ Возврат Метаданные.РежимИспользованияСинхронныхВызововРасширенийПлатформыИВнешнихКомпонент
+ = Метаданные.СвойстваОбъектов.РежимИспользованияСинхронныхВызововРасширенийПлатформыИВнешнихКомпонент.Использовать;
+
+КонецФункции
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -238,12 +248,15 @@
ИначеЕсли ТипЗначение = Тип("Строка") Тогда
ЧастиСтроки = СтрРазделить(Значение, ".");
+
Если ЧастиСтроки.Количество() = 2 Тогда
+
ТипыМетаданных = ЮТМетаданные.ТипыМетаданных();
ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]];
Если ОписаниеТипа <> Неопределено Тогда
ОбъектМетаданных = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]];
КонецЕсли;
+
КонецЕсли;
Иначе
@@ -273,22 +286,10 @@
ЭтоКлюч = ИменаКлючевыхПолей.Найти(Реквизит.Имя) <> Неопределено;
КонецЕсли;
- КоллекцияОписаний.Вставить(Реквизит.Имя, ОписаниеРеквизита(Реквизит, ЭтоКлюч));
+ КоллекцияОписаний.Вставить(Реквизит.Имя, ЮТФабрика.ОписаниеРеквизита(Реквизит, ЭтоКлюч));
КонецЦикла;
КонецПроцедуры
-Функция ОписаниеРеквизита(Реквизит, ЭтоКлюч) Экспорт
-
- Описание = Новый Структура();
- Описание.Вставить("Имя", Реквизит.Имя);
- Описание.Вставить("Тип", Реквизит.Тип);
- Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку);
- Описание.Вставить("ЭтоКлюч", ЭтоКлюч);
-
- Возврат Описание;
-
-КонецФункции
-
#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271/Module.bsl"
index b36354853..698ce9cd6 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271/Module.bsl"
@@ -109,11 +109,14 @@
// Параметры:
// Значение - Число
// Шаг - Число
-Процедура Инкремент(Значение, Знач Шаг = 1) Экспорт
+// Возвращаемое значение:
+// Число - Результат инкремента
+Функция Инкремент(Значение, Знач Шаг = 1) Экспорт
Значение = Значение + Шаг;
+ Возврат Значение;
-КонецПроцедуры
+КонецФункции
Функция ЧислоВСтроку(Значение) Экспорт
@@ -135,7 +138,7 @@
Функция ПредставлениеПродолжительности(Знач Продолжительность) Экспорт
Представление = ЧислоВСтроку(Цел(Продолжительность / 1000));
- Представление = ДобавитьСтроку(Представление, Продолжительность % 1000, ".");
+ Представление = ДобавитьСтроку(Представление, Формат(Продолжительность % 1000, "ЧЦ=3; ЧВН=;"), ".");
Инкремент(Представление, " сек");
@@ -683,14 +686,18 @@
КонецПроцедуры
-Функция СтрокаJSON(Значение) Экспорт
+Функция СтрокаJSON(Значение, ИспользоватьСериализатор = Истина) Экспорт
#Если ВебКлиент Тогда
ВызватьИсключение МетодНеДоступен("ЮТОбщий.СтрокаJSON");
#Иначе
ЗаписьJSON = Новый ЗаписьJSON();
ЗаписьJSON.УстановитьСтроку();
- СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение);
+ Если ИспользоватьСериализатор Тогда
+ СериализаторXDTO.ЗаписатьJSON(ЗаписьJSON, Значение);
+ Иначе
+ ЗаписатьJSON(ЗаписьJSON, Значение);
+ КонецЕсли;
Возврат ЗаписьJSON.Закрыть();
#КонецЕсли
@@ -709,23 +716,13 @@
Функция ПредставлениеТипа(Тип) Экспорт
-#Если ВебКлиент Тогда
- ВызватьИсключение МетодНеДоступен("ЮТОбщий.ПредставлениеТипа");
-#Иначе
- ТипXML = СериализаторXDTO.XMLТип(Тип);
-
- Если ТипXML = Неопределено Тогда
- Возврат Строка(Тип);
- Иначе
- Возврат ТипXML.ИмяТипа;
- КонецЕсли;
-#КонецЕсли
+ Возврат ЮТТипыДанныхСлужебный.ПредставлениеТипа(Тип);
КонецФункции
Функция МетодНеДоступен(ИмяМетода, ИмяКонтекста = "веб-клиенте") Экспорт
- Возврат СтрШаблон("Метод `%1` не доступен в %2", ИмяМетода, ИмяКонтекста);
+ Возврат СтрШаблон("Метод `%1` не доступен в/на %2", ИмяМетода, ИмяКонтекста);
КонецФункции
@@ -825,7 +822,11 @@
Функция Менеджер(Знач Менеджер) Экспорт
+#Если Сервер Тогда
Возврат ЮТОбщийВызовСервера.Менеджер(Менеджер);
+#Иначе
+ ВызватьИсключение МетодНеДоступен("ЮТОбщий.Менеджер", "клиенте");
+#КонецЕсли
КонецФункции
@@ -835,12 +836,73 @@
КонецФункции
+Функция ЭтаСтруктураИмеетТип(Структура, ИмяТипа) Экспорт
+
+ Возврат ТипСтруктуры(Структура) = ИмяТипа;
+
+КонецФункции
+
Процедура УказатьТипСтруктуры(Структура, ИмяТипа) Экспорт
Структура.Вставить("__type__", ИмяТипа);
КонецПроцедуры
+// Преостанавливает поток выполнения на указанное количество секунд
+//
+// Параметры:
+// Время - Число - Продолжительность паузы в секундах, возможно указывать дробное значение
+Процедура Пауза(Время) Экспорт
+
+ Задержка = Цел(1000 * Время);
+ Компонента = ЮТКомпоненты.Пауза();
+#Если Сервер Тогда
+ Компонента.Ожидать(Задержка);
+#Иначе
+ Если ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда
+ Компонента.Ожидать(Задержка);
+ Иначе
+ ВызватьИсключение "Пауза не работает на клиенте при отключенных синхронных вызовах";
+ КонецЕсли;
+#КонецЕсли
+
+КонецПроцедуры
+
+// Выводит сообщение в консоль (stdout) приложения
+//
+// Параметры:
+// Сообщение - Строка - Выводимое сообщение
+Процедура ВывестиВКонсоль(Сообщение) Экспорт
+
+ Компонента = ЮТКомпоненты.Консоль();
+#Если Сервер Тогда
+ Компонента.Напечатать(Сообщение);
+#Иначе
+ Если ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда
+ Компонента.Напечатать(Сообщение);
+ Иначе
+ Компонента.НачатьВызовНапечатать(ЮТАсинхроннаяОбработкаСлужебныйКлиент.НовыйПустойОбработчик1(), Сообщение);
+ КонецЕсли;
+#КонецЕсли
+
+КонецПроцедуры
+
+// Возвращяет макет
+//
+// Параметры:
+// ИмяМакета - Строка - Возможные значения
+// * Общий макет, например, ОбщийМакет.ЮТМетаданные
+// * Макет объекта метаданных, например, Справочник.Товары.ПечатнаяФорма
+// * Область макета, например, Справочник.Товары.ПечатнаяФорма.Шапка, ОбщийМакет.ЮТМетаданные.Заголовок
+//
+// Возвращаемое значение:
+// ТабличныйДокумент, ТекстовыйДокумент, ДвоичныеДанные - Макет или его область
+Функция Макет(ИмяМакета) Экспорт
+
+ Возврат ЮТОбщийВызовСервера.Макет(ИмяМакета);
+
+КонецФункции
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
index 0b4dd2ee1..7cd9bb788 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\320\261\321\211\320\270\320\271\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
@@ -27,7 +27,7 @@
|");
Возврат СериализаторXDTO.ПрочитатьXML(ЧтениеXML);
-
+
КонецФункции
Функция УстановленБезопасныйРежим() Экспорт
@@ -38,11 +38,47 @@
Функция Менеджер(Знач Менеджер) Экспорт
- Если ТипЗнч(Менеджер) = Тип("Строка") Тогда
- Менеджер = ЮТОбщий.ВычислитьБезопасно(Менеджер);
+ Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер);
+
+ Если Описание = Неопределено Тогда
+ ВызватьИсключение "Несуществующий объект метаданных, либо " + ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТОбщийВызовСервера.Менеджер", Менеджер);
+ КонецЕсли;
+
+ ИмяТипа = СтрШаблон("%1Менеджер.%2", Описание.ОписаниеТипа.Имя, Описание.Имя);
+
+ Возврат Новый(ИмяТипа);
+
+КонецФункции
+
+Функция Макет(ИмяМакета) Экспорт
+
+ ЧастиИмени = СтрРазделить(ИмяМакета, ".");
+
+ КоличествоБлоковДляОбщегоМакета = 2;
+ КоличествоБлоковМакетаМенеджера = 3;
+
+ Если ЧастиИмени.Количество() < КоличествоБлоковДляОбщегоМакета Тогда
+ ВызватьИсключение СтрШаблон("Некорректное имя макет, если вы хотите получить данные общего макета необходимо указать `ОбщийМакет.%1`",
+ ИмяМакета);
+ КонецЕсли;
+
+ ИндексОбласти = 0;
+ Если СтрСравнить(ЧастиИмени[0], "ОбщийМакет") = 0 Тогда
+ Макет = ПолучитьОбщийМакет(ЧастиИмени[1]);
+ ИндексОбласти = КоличествоБлоковДляОбщегоМакета;
+ ИначеЕсли ЧастиИмени.Количество() >= КоличествоБлоковМакетаМенеджера Тогда
+ Менеджер = Менеджер(СтрШаблон("%1.%2", ЧастиИмени[0], ЧастиИмени[1]));
+ Макет = Менеджер.ПолучитьМакет(ЧастиИмени[КоличествоБлоковМакетаМенеджера - 1]);
+ ИндексОбласти = КоличествоБлоковМакетаМенеджера;
+ Иначе
+ ВызватьИсключение СтрШаблон("Некорректное имя макета `%1`", ИмяМакета);
+ КонецЕсли;
+
+ Если ЧастиИмени.Количество() > ИндексОбласти Тогда
+ Макет = Макет.ПолучитьОбласть(ЧастиИмени[ИндексОбласти]);
КонецЕсли;
- Возврат Менеджер;
+ Возврат Макет;
КонецФункции
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202/Module.bsl"
index 693865690..68d11ef90 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202/Module.bsl"
@@ -21,7 +21,7 @@
// СформироватьОтчет
// Формирует отчет о результатах тестирования по заданным параметрам
// Параметры:
-// РезультатВыполнения - Массив - Коллекция результатов выполнения, каждый элемент - структура, см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
+// РезультатВыполнения - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
// ПараметрыЗапуска - Структура - Параметры запуска, см. ЮТФабрика.ПараметрыЗапуска
// Обработчик - ОписаниеОповещения
Процедура СформироватьОтчет(РезультатВыполнения, ПараметрыЗапуска, Обработчик) Экспорт
@@ -85,7 +85,7 @@
ДанныеОтчета.Записать(ИмяФайлаОтчета);
КонецЕсли;
- ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Параметры.Обработчик);
КонецПроцедуры
@@ -98,7 +98,7 @@
ИмяФайла = ПутьКОтчету;
КонецЕсли;
- ЮТИсполнительКлиент.ВызватьОбработчик(Параметры.Обработчик, ИмяФайла);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Параметры.Обработчик, ИмяФайла);
КонецПроцедуры
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JSON/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JSON/Module.bsl"
index b8a4ce2de..0a34775ae 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JSON/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JSON/Module.bsl"
@@ -30,6 +30,13 @@
КонецФункции
+// Формирует отчет в формате JSON
+//
+// Параметры:
+// РезультатВыполнения - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
+//
+// Возвращаемое значение:
+// ДвоичныеДанные - Данные отчета
Функция ДанныеОтчета(РезультатВыполнения) Экспорт
#Если ВебКлиент Тогда
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JUnit/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JUnit/Module.bsl"
index 55ec07dd0..83927d3cf 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JUnit/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\236\321\202\321\207\320\265\321\202JUnit/Module.bsl"
@@ -30,6 +30,13 @@
КонецФункции
+// Формирует отчет в формате jUnit
+//
+// Параметры:
+// РезультатВыполнения - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
+//
+// Возвращаемое значение:
+// ДвоичныеДанные - Данные отчета
Функция ДанныеОтчета(Знач РезультатВыполнения) Экспорт
Возврат СформироватьОтчетОТестировании(РезультатВыполнения);
@@ -44,7 +51,7 @@
// Формирует отчет (xml-файл) и возвращает его в виде двоичных данных
//
// Параметры:
-// РезультатТестирования - Массив - результаты всех сценариев теста
+// РезультатТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
// Возвращаемое значение:
// ДвоичныеДанные - полученный отчет
Функция СформироватьОтчетОТестировании(РезультатТестирования) Экспорт
@@ -58,9 +65,15 @@
Номер = 0;
- Для Каждого Набор Из РезультатТестирования Цикл
- ЗаписатьНабор(ЗаписьXML, Набор, Номер);
- Номер = Номер + 1;
+ Для Каждого Модуль Из РезультатТестирования Цикл
+
+ Для Каждого Набор Из Модуль.НаборыТестов Цикл
+
+ ЗаписатьНабор(ЗаписьXML, Набор, Номер);
+ Номер = Номер + 1;
+
+ КонецЦикла;
+
КонецЦикла;
ЗаписатьСвойства(ЗаписьXML, Новый Структура("executor, reportDate", "BIA YAXUnit", ТекущаяДатаСеанса()));
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260/Module.bsl"
index 26bdc456f..e42b7e5f0 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\227\320\260\320\277\321\203\321\201\320\272\320\260/Module.bsl"
@@ -69,7 +69,7 @@
Параметры = ЮТФабрика.ПараметрыЗапуска();
Если Не ЗначениеЗаполнено(ПараметрыЗапускаСтрокой) Тогда
- ЮТИсполнительКлиент.ВызватьОбработчик(Обработчик, Параметры);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Обработчик, Параметры);
Возврат Параметры;
КонецЕсли;
@@ -94,7 +94,8 @@
Если ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Булево") Тогда
Параметры.ВыполнятьМодульноеТестирование = ЗначениеКлючаЗапуска;
- Возврат Параметры;
+ Параметры.showReport = Истина;
+ Параметры.closeAfterTests = Ложь;
ИначеЕсли ТипЗнч(ЗначениеКлючаЗапуска) = Тип("Строка") Тогда
@@ -110,7 +111,7 @@
КонецЕсли;
- ЮТИсполнительКлиент.ВызватьОбработчик(Обработчик, Параметры);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Обработчик, Параметры);
Возврат Параметры;
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\263\320\276\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\263\320\276\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl"
index 7d64a2308..ca68d9757 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\263\320\276\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\262\321\202\320\276\321\200\320\275\320\276\320\263\320\276\320\230\321\201\320\277\320\276\320\273\321\214\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl"
@@ -42,4 +42,29 @@
КонецФункции
+Функция ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты) Экспорт
+
+ Возврат ЮТКомпоненты.ПодключитьКомпоненту(ИмяМакета, ИмяКомпоненты, Ложь);
+
+КонецФункции
+
+Функция СоздатьКомпоненту(ОписаниеКомпоненты) Экспорт
+
+ Возврат ЮТКомпоненты.СоздатьКомпоненту(ОписаниеКомпоненты, Ложь);
+
+КонецФункции
+
+Функция ПримитивныеТипы() Экспорт
+
+ Типы = Новый Массив();
+ Типы.Добавить(Тип("Строка"));
+ Типы.Добавить(Тип("Число"));
+ Типы.Добавить(Тип("Дата"));
+ Типы.Добавить(Тип("Булево"));
+ Типы.Добавить(Тип("УникальныйИдентификатор"));
+
+ Возврат Новый ФиксированныйМассив(Типы);
+
+КонецФункции
+
#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\264\321\200\320\260\320\266\320\260\321\202\320\265\320\273\321\214_\320\233\321\216\320\264\320\270/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\264\321\200\320\260\320\266\320\260\321\202\320\265\320\273\321\214_\320\233\321\216\320\264\320\270/Module.bsl"
index 670035af2..935d73e6c 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\264\321\200\320\260\320\266\320\260\321\202\320\265\320\273\321\214_\320\233\321\216\320\264\320\270/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\320\276\320\264\321\200\320\260\320\266\320\260\321\202\320\265\320\273\321\214_\320\233\321\216\320\264\320\270/Module.bsl"
@@ -134,7 +134,7 @@
ЧастиСнилс[0],
ЧастиСнилс[1],
ЧастиСнилс[2],
- Формат(КонтрольноеЧисло, "ЧЦ=2; ЧВН=;")
+ Формат(КонтрольноеЧисло, "ЧЦ=2; ЧН=00; ЧВН=;")
);
КонецФункции
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213/Module.bsl"
index b1409ce07..7fb765c39 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213/Module.bsl"
@@ -267,6 +267,34 @@
КонецФункции
+// Добавляет предикат, проверяющий, что строка соответствует указанному регулярному выражению
+//
+// Параметры:
+// Значение - Строка
+//
+// Возвращаемое значение:
+// ОбщийМодуль - Этот модуль для замыкания
+Функция СодержитСтрокуПоШаблону(Значение) Экспорт
+
+ ДобавитьПредикат(Выражения().СодержитСтрокуПоШаблону, Значение);
+ Возврат ЮТПредикаты;
+
+КонецФункции
+
+// Добавляет предикат, проверяющий, что строка не соответствует указанному регулярному выражению
+//
+// Параметры:
+// Значение - Строка
+//
+// Возвращаемое значение:
+// ОбщийМодуль - Этот модуль для замыкания
+Функция НеСодержитСтрокуПоШаблону(Значение) Экспорт
+
+ ДобавитьПредикат(Выражения().НеСодержитСтрокуПоШаблону, Значение);
+ Возврат ЮТПредикаты;
+
+КонецФункции
+
// Возвращает набор сформированных утверждений.
//
// Рекомендуется использовать этот метод, если планируется отложенная проверка предикатов. Например, вы хотите сформировать два набору предикатов
@@ -316,6 +344,8 @@
Выражения.Вставить("НеИмеетСвойство", "НеИмеетСвойство");
Выражения.Вставить("Содержит", "Содержит");
Выражения.Вставить("НеСодержит", "НеСодержит");
+ Выражения.Вставить("СодержитСтрокуПоШаблону", "СодержитСтрокуПоШаблону");
+ Выражения.Вставить("НеСодержитСтрокуПоШаблону", "НеСодержитСтрокуПоШаблону");
Возврат Новый ФиксированнаяСтруктура(Выражения);
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
index 50de087d1..b212083c6 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -151,6 +151,8 @@
Шаблон = "содержит свойство `%1`";
ИначеЕсли Выражение = Выражения.Содержит Тогда
Шаблон = "содержит `%1`";
+ ИначеЕсли Выражение = Выражения.СодержитСтрокуПоШаблону Тогда
+ Шаблон = "содержит подстроку соответствующую шаблону `%1`";
Иначе
ВызватьИсключение "Не описан шаблон сообщения для выражения предиката " + Выражение;
КонецЕсли;
@@ -279,6 +281,10 @@
ЮТСравнениеКлиентСервер.ПроверитьСодержит(СтатусПроверки, ПараметрыПроверки);
+ ИначеЕсли ВидСравненияВыражения = ВидыСравнения.СодержитСтрокуПоШаблону Тогда
+
+ ЮТСравнениеКлиентСервер.ПроверитьСоответствуетШаблону(СтатусПроверки, ПараметрыПроверки);
+
Иначе
ВызватьИсключение СтрШаблон("Неизвестное выражение предиката `%1`", Выражение.ВидСравнения);
@@ -290,23 +296,21 @@
Функция ЭтоПредикатОбщийМодуль(ТипПредикатов, Предикаты)
- Возврат ТипПредикатов = Тип("ОбщийМодуль")
- И Предикаты = ЮТПредикаты;
+ Возврат ТипПредикатов = Тип("ОбщийМодуль") И Предикаты = ЮТПредикаты;
-КонецФункции
+КонецФункции
Функция ЭтоПредикатМассив(ТипПредикатов, Предикаты)
- Возврат ТипПредикатов = Тип("Массив")
- И Предикаты.Количество()
- И ЭтоПредикатСтруктура(ТипЗнч(Предикаты[0]), Предикаты[0]);
+ Возврат ТипПредикатов = Тип("Массив")
+ И Предикаты.Количество()
+ И ЭтоПредикатСтруктура(ТипЗнч(Предикаты[0]), Предикаты[0]);
КонецФункции
Функция ЭтоПредикатСтруктура(ТипПредикатов, Предикаты)
- Возврат ТипПредикатов = Тип("Структура")
- И ЮТОбщий.ТипСтруктуры(Предикаты) = "Предикат";
+ Возврат ТипПредикатов = Тип("Структура") И ЮТОбщий.ТипСтруктуры(Предикаты) = "Предикат";
КонецФункции
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl"
new file mode 100644
index 000000000..72a70e3d2
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/Module.bsl"
@@ -0,0 +1,153 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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;
+ ЗначениеКолонки = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст;
+
+ КонецЦикла;
+
+ НомерСтроки = НомерСтроки + 1;
+
+ Пока ЕстьЗначенияВСтроке(ТабличныйДокумент, НомерСтроки, СведенияКолонок) Цикл
+
+ Структура = Новый Структура;
+
+ Для Каждого Сведения Из СведенияКолонок Цикл
+ Значение = СокрЛП(ТабличныйДокумент.Область(НомерСтроки, Сведения.НомерКолонки).Текст);
+ Структура.Вставить(Сведения.ИмяКолонки, Значение);
+ КонецЦикла;
+
+ МассивДанных.Добавить(Структура);
+
+ НомерСтроки = НомерСтроки + 1;
+
+ КонецЦикла;
+
+ Возврат МассивДанных;
+
+КонецФункции
+
+Функция ПривестиЗначениеКДате(ОписаниеТипа, Знач Значение) Экспорт
+
+ Результат = ОписаниеТипа.ПривестиЗначение(Значение);
+ Если ЗначениеЗаполнено(Результат) Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ МассивРазделителей = Новый Массив;
+ МассивРазделителей.Добавить(".");
+ МассивРазделителей.Добавить("/");
+ МассивРазделителей.Добавить("-");
+
+ СтрокаДаты = Неопределено;
+
+ КоличествоБлоковДаты = 3;
+ ДлинаГода = 4;
+
+ Для Каждого Разделитель Из МассивРазделителей Цикл
+
+ Если ЗначениеЗаполнено(СтрокаДаты) Тогда
+ Прервать;
+ КонецЕсли;
+
+ МассивЧастейДат = СтрРазделить(Значение, Разделитель);
+
+ Если МассивЧастейДат.Количество() = КоличествоБлоковДаты Тогда
+
+ Если СтрДлина(МассивЧастейДат[2]) = ДлинаГода Тогда
+ СтрокаДаты = МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0];
+ ИначеЕсли СтрДлина(МассивЧастейДат[0]) = ДлинаГода Тогда
+ СтрокаДаты = МассивЧастейДат[0] + МассивЧастейДат[1] + МассивЧастейДат[2];
+ Иначе
+ СтрокаДаты = "20" + МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0];
+ КонецЕсли;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Результат = ОписаниеТипа.ПривестиЗначение(СтрокаДаты);
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция ПривестиЗначениеКЧислу(ОписаниеТипа, Знач Значение) Экспорт
+
+ Результат = ОписаниеТипа.ПривестиЗначение(Значение);
+ Если ЗначениеЗаполнено(Результат) Тогда
+ Возврат Результат;
+ КонецЕсли;
+
+ Значение = СтрЗаменить(Значение, " ", "");
+ Результат = ОписаниеТипа.ПривестиЗначение(Значение);
+
+ Возврат Результат;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция ЕстьЗначенияВСтроке(ТабличныйДокумент, НомерСтроки, СведенияКолонок)
+
+ ЕстьЗаполненныеЗначения = Ложь;
+
+ Для Каждого Сведения Из СведенияКолонок Цикл
+ Если ЕстьЗаполненныеЗначения Тогда
+ Прервать;
+ КонецЕсли;
+ НомерКолонки = Сведения.НомерКолонки;
+ ЕстьЗаполненныеЗначения = ЗначениеЗаполнено(ТабличныйДокумент.Область(НомерСтроки, НомерКолонки).Текст);
+ КонецЦикла;
+
+ Возврат ЕстьЗаполненныеЗначения;
+
+КонецФункции
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217.mdo"
new file mode 100644
index 000000000..543964086
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217/\320\256\320\242\320\237\321\200\320\265\320\276\320\261\321\200\320\260\320\267\320\276\320\262\320\260\320\275\320\270\321\217.mdo"
@@ -0,0 +1,9 @@
+
+
+ ЮТПреобразования
+
+ ru
+ Преобразования
+
+ true
+
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
new file mode 100644
index 000000000..a2f4bf796
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
@@ -0,0 +1,73 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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`, а получили `%4` (%5)",
+ ИмяПараметра,
+ ИмяМетода,
+ ОжидаемыйТип,
+ ТипЗнч(Значение),
+ Значение);
+ ВызватьИсключение ТекстОшибки;
+ КонецЕсли;
+
+КонецПроцедуры
+
+Функция ТипЗначенияСоответствует(Значение, ОжидаемыйТип) Экспорт
+
+ ТипОжидаемогоТипа = ТипЗнч(ОжидаемыйТип);
+
+ Если ТипОжидаемогоТипа = Тип("Строка") Тогда
+ Если СтрНайти(ОжидаемыйТип, ",") Тогда
+ ОжидаемыйТип = Новый ОписаниеТипов(ОжидаемыйТип);
+ ТипОжидаемогоТипа = Тип("ОписаниеТипов");
+ Иначе
+ ОжидаемыйТип = Тип(ОжидаемыйТип);
+ ТипОжидаемогоТипа = Тип("Тип");
+ КонецЕсли;
+ КонецЕсли;
+
+ ТипЗначения = ТипЗнч(Значение);
+
+ Если ТипОжидаемогоТипа = Тип("ОписаниеТипов") Тогда
+ // СодержитТип не подходит, всегда выдает истину если проверяем Тип("Неопределено")
+ Соответствует = ОжидаемыйТип.Типы().Найти(ТипЗначения) <> Неопределено
+ И ОжидаемыйТип.ПривестиЗначение(Значение) = Значение;
+ Иначе
+ Соответствует = ТипЗначения = ОжидаемыйТип;
+ КонецЕсли;
+
+ Возврат Соответствует;
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo"
new file mode 100644
index 000000000..895017eb2
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\237\321\200\320\276\320\262\320\265\321\200\320\272\320\270\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo"
@@ -0,0 +1,11 @@
+
+
+ ЮТПроверкиСлужебный
+
+ ru
+ Проверки служебный
+
+ true
+ true
+ true
+
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/Module.bsl"
index 4b7022828..4ef579240 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\240\320\260\321\201\321\210\320\270\321\200\320\265\320\275\320\270\321\217/Module.bsl"
@@ -26,7 +26,17 @@
Функция ОбработчикиСобытий() Экспорт
- Возврат ЮТМетаданные.МодулиПодсистемы("ЮТОбработчикиСобытий");
+ Серверные = Ложь;
+ Клиентские = Ложь;
+#Если Сервер Тогда
+ Серверные = Истина;
+#КонецЕсли
+
+#Если Клиент Тогда
+ Клиентские = Истина;
+#КонецЕсли
+
+ Возврат ЮТМетаданные.МодулиПодсистемы("ЮТОбработчикиСобытий", Серверные, Клиентские);
КонецФункции
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\320\276\320\261\321\213\321\202\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\320\276\320\261\321\213\321\202\320\270\321\217/Module.bsl"
index 2508fd171..d785f2fd3 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\320\276\320\261\321\213\321\202\320\270\321\217/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\320\276\320\261\321\213\321\202\320\270\321\217/Module.bsl"
@@ -155,6 +155,28 @@
КонецПроцедуры
+// Перед выполнением тестов.
+//
+// Параметры:
+// ИсполняемыеМодули - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
+Процедура ПередВыполнениемТестов(ИсполняемыеМодули) Экспорт
+
+ Параметры = ЮТОбщий.ЗначениеВМассиве(ИсполняемыеМодули);
+ ВызватьОбработчикРасширения("ПередВыполнениемТестов", Параметры);
+
+КонецПроцедуры
+
+// После выполнения тестов.
+//
+// Параметры:
+// РезультатТестирования - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля
+Процедура ПослеВыполненияТестов(РезультатТестирования) Экспорт
+
+ Параметры = ЮТОбщий.ЗначениеВМассиве(РезультатТестирования);
+ ВызватьОбработчикРасширения("ПослеВыполненияТестов", Параметры);
+
+КонецПроцедуры
+
#КонецОбласти
#Область СобытияЗагрузкиТестов
@@ -202,10 +224,10 @@
// Обработка события "ПослеФормированияИсполняемыхНаборовТестов"
// Параметры:
-// КоллекцияКатегорийНаборов - Массив из см. ЮТФабрика.ОписаниеКатегорияНабораТестов - Набор исполняемых наборов
-Процедура ПослеФормированияИсполняемыхНаборовТестов(КоллекцияКатегорийНаборов) Экспорт
+// ИсполняемыеТестовыеМодули - Массив из см. ЮТФабрика.ОписаниеИсполняемогоТестовогоМодуля - Набор исполняемых наборов
+Процедура ПослеФормированияИсполняемыхНаборовТестов(ИсполняемыеТестовыеМодули) Экспорт
- Параметры = ЮТОбщий.ЗначениеВМассиве(КоллекцияКатегорийНаборов);
+ Параметры = ЮТОбщий.ЗначениеВМассиве(ИсполняемыеТестовыеМодули);
ВызватьОбработчикРасширения("ПослеФормированияИсполняемыхНаборовТестов", Параметры);
КонецПроцедуры
@@ -307,7 +329,7 @@
ИначеЕсли ОбработчикСобытияПереопределен Тогда
ТекстИсключения = СтрШаблон("Не найден обработчик тестового модуля %1", Команда);
- ВызватьИсключение ТекстИсключения
+ ВызватьИсключение ТекстИсключения;
КонецЕсли;
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\265\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\265\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
index f7e130db8..4612c28fd 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\265\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\200\320\260\320\262\320\275\320\265\320\275\320\270\320\265\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -143,7 +143,7 @@
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
- Результат = ТипЗначенияСоответствует(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение);
+ Результат = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение);
Реверс(Результат, ПараметрыПроверки);
@@ -249,6 +249,30 @@
КонецПроцедуры
+Процедура ПроверитьСоответствуетШаблону(РезультатПроверки, ПараметрыПроверки) Экспорт
+
+ Если НЕ ПроверитьТипЗначения(РезультатПроверки, ПараметрыПроверки.ОжидаемоеЗначение, "Строка") Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
+ СоответствуетШаблону = СоответствуетШаблону(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение);
+
+ Если СоответствуетШаблону = Неопределено Тогда
+ ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
+ ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки);
+ Возврат;
+ КонецЕсли;
+
+ Результат = СоответствуетШаблону;
+ Реверс(Результат, ПараметрыПроверки);
+
+ Если НЕ Результат Тогда
+ ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ПроверяемоеЗначение);
+ КонецЕсли;
+
+КонецПроцедуры
+
// Параметры проверки.
//
// Параметры:
@@ -360,7 +384,7 @@
Возврат Истина;
КонецЕсли;
- Соответствует = ТипЗначенияСоответствует(Значение, ОжидаемыйТип);
+ Соответствует = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(Значение, ОжидаемыйТип);
Если НЕ Соответствует Тогда
ТекстОшибки = СтрШаблон("Не верный тип %1 (`%2`), должен быть `%3`%4",
@@ -375,34 +399,6 @@
КонецФункции
-Функция ТипЗначенияСоответствует(Значение, ОжидаемыйТип)
-
- ТипОжидаемогоТипа = ТипЗнч(ОжидаемыйТип);
-
- Если ТипОжидаемогоТипа = Тип("Строка") Тогда
- Если СтрНайти(ОжидаемыйТип, ",") Тогда
- ОжидаемыйТип = Новый ОписаниеТипов(ОжидаемыйТип);
- ТипОжидаемогоТипа = Тип("ОписаниеТипов");
- Иначе
- ОжидаемыйТип = Тип(ОжидаемыйТип);
- ТипОжидаемогоТипа = Тип("Тип");
- КонецЕсли;
- КонецЕсли;
-
- ТипЗначения = ТипЗнч(Значение);
-
- Если ТипОжидаемогоТипа = Тип("ОписаниеТипов") Тогда
- // СодержитТип не подходит, всегда выдает истину если проверяем Тип("Неопределено")
- Соответствует = ОжидаемыйТип.Типы().Найти(ТипЗначения) <> Неопределено
- И ОжидаемыйТип.ПривестиЗначение(Значение) = Значение;
- Иначе
- Соответствует = ТипЗначения = ОжидаемыйТип;
- КонецЕсли;
-
- Возврат Соответствует;
-
-КонецФункции
-
Функция СравнитьПоЗначению(Значение1, Значение2)
Попытка
@@ -602,6 +598,24 @@
КонецФункции
+Функция СоответствуетШаблону(ПроверяемаяСтрока, РегулярноеВыражение)
+
+ Если ТипЗнч(ПроверяемаяСтрока) <> Тип("Строка") Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ РегулярныеВыражения = ЮТКомпоненты.РегулярныеВыражения();
+
+ Попытка
+ Результат = РегулярныеВыражения.Совпадает(ПроверяемаяСтрока, РегулярноеВыражение);
+ Исключение
+ ВызватьИсключение РегулярныеВыражения.ОписаниеОшибки;
+ КонецПопытки;
+
+ Возврат Результат;
+
+КонецФункции
+
Функция НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение)
ТипПроверяемогоЗначения = ТипЗнч(ПроверяемоеЗначение);
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/Module.bsl"
new file mode 100644
index 000000000..e05741f15
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/Module.bsl"
@@ -0,0 +1,57 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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.
+//
+//©///////////////////////////////////////////////////////////////////////////©//
+
+#Область ПрограммныйИнтерфейс
+
+Функция РусскиеБуквы(НижнийРегистр = Истина, ВерхнийРегистр = Ложь) Экспорт
+
+ Возврат Буквы("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", НижнийРегистр, ВерхнийРегистр);
+
+КонецФункции
+
+Функция АнглийскиеБуквы(НижнийРегистр = Истина, ВерхнийРегистр = Ложь) Экспорт
+
+ Возврат Буквы("abcdefghijklmnopqrstuvwxyz", НижнийРегистр, ВерхнийРегистр);
+
+КонецФункции
+
+Функция Цифры() Экспорт
+
+ Возврат "1234567890";
+
+КонецФункции
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+Функция Буквы(Буквы, НижнийРегистр, ВерхнийРегистр)
+
+ Если НижнийРегистр И ВерхнийРегистр Тогда
+ Возврат Буквы + ВРег(Буквы);
+ ИначеЕсли НижнийРегистр Тогда
+ Возврат Буквы;
+ ИначеЕсли ВерхнийРегистр Тогда
+ Возврат ВРег(Буквы);
+ Иначе
+ Возврат "";
+ КонецЕсли;
+
+КонецФункции
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270.mdo"
new file mode 100644
index 000000000..e92381266
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270/\320\256\320\242\320\241\321\202\321\200\320\276\320\272\320\270.mdo"
@@ -0,0 +1,11 @@
+
+
+ ЮТСтроки
+
+ ru
+ Строки
+
+ true
+ true
+ true
+
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl"
index 09092d1c8..07bae0617 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl"
@@ -98,6 +98,8 @@
КонецФункции
+#Область ГенерацияСлучайныхЗначений
+
// Генерирует и возвращает случайное число.
//
// Параметры:
@@ -166,28 +168,26 @@
// Генерирует и возвращает случайную строку указанной длины, строка может содержать цифры, английские и русские буквы в разных регистрах.
//
// Параметры:
-// Длина - Число - Длина генерируемой строки, без учета префикса
+// Длина - Число - Длина генерируемой строки с учетом префикса
// Префикс - Строка - Префикс строки
-// ДопустимыеСимволы - Строка - Допустимые символы из которая будет формироваться случайно строка
+// ДопустимыеСимволы - Строка - Допустимые символы из которая будет формироваться случайная строка
//
// Возвращаемое значение:
// Строка - Случайная строка
-Функция СлучайнаяСтрока(Знач Длина = 10, Префикс = "", ДопустимыеСимволы = Неопределено) Экспорт
+Функция СлучайнаяСтрока(Знач Длина = 10, Префикс = "", Знач ДопустимыеСимволы = Неопределено) Экспорт
Если ДопустимыеСимволы = Неопределено Тогда
- Строка = "1234567890абвгдеёжзийклмнопрстуфхцчшщъыьэюяАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
- Иначе
- Строка = ДопустимыеСимволы;
+ ДопустимыеСимволы = ЮТСтроки.РусскиеБуквы(Истина, Истина) + ЮТСтроки.АнглийскиеБуквы(Истина, Истина) + ЮТСтроки.Цифры();
КонецЕсли;
Результат = "";
- КоличествоСимволов = СтрДлина(Строка);
+ КоличествоСимволов = СтрДлина(ДопустимыеСимволы);
Длина = Длина - СтрДлина(Префикс);
Для Инд = 1 По Длина Цикл
- Результат = Результат + Сред(Строка, СлучайноеЧисло(1, КоличествоСимволов), 1);
+ Результат = Результат + Сред(ДопустимыеСимволы, СлучайноеЧисло(1, КоличествоСимволов), 1);
КонецЦикла;
@@ -195,6 +195,28 @@
КонецФункции
+// Возвращяет случайный валидный идентификатор
+//
+// Параметры:
+// Длина - Число - Длина генерируемой строки с учетом префикса
+// Префикс - Строка - Префикс строки
+//
+// Возвращаемое значение:
+// Строка - Случайный идентификатор
+Функция СлучайныйИдентификатор(Знач Длина = 10, Знач Префикс = "") Экспорт
+
+ НаборСимволов = "_" + ЮТСтроки.РусскиеБуквы(Истина, Истина) + ЮТСтроки.АнглийскиеБуквы(Истина, Истина);
+
+ Если ПустаяСтрока(Префикс) Тогда
+ Префикс = СлучайнаяСтрока(1, "", НаборСимволов);
+ КонецЕсли;
+
+ НаборСимволов = НаборСимволов + ЮТСтроки.Цифры();
+
+ Возврат СлучайнаяСтрока(Длина, Префикс, НаборСимволов);
+
+КонецФункции
+
// Генерирует и возвращает случайную дату в указанном интервале (если не указан используется `0001-01-01 - 3999-12-31`).
//
// Параметры:
@@ -237,19 +259,6 @@
КонецФункции
-// Генерирует и возвращает уникальную строку, формируется из уникального идентификатора.
-//
-// Параметры:
-// Префикс - Строка - Префикс строки
-//
-// Возвращаемое значение:
-// Строка - Уникальная строка
-Функция УникальнаяСтрока(Префикс = "") Экспорт
-
- Возврат Префикс + Новый УникальныйИдентификатор();
-
-КонецФункции
-
// Возвращает случайный элемент списка.
//
// Параметры:
@@ -275,6 +284,35 @@
КонецФункции
+// Возвращает случайное значение перечисления
+//
+// Параметры:
+// Перечисление - ПеречислениеМенеджер - Менеджер
+// - Строка - Имя объекта метаданных
+//
+// Возвращаемое значение:
+// ПеречислениеСсылка
+Функция СлучайноеЗначениеПеречисления(Перечисление) Экспорт
+
+ Возврат ЮТТестовыеДанныеВызовСервера.СлучайноеЗначениеПеречисления(Перечисление);
+
+КонецФункции
+
+#КонецОбласти
+
+// Генерирует и возвращает уникальную строку, формируется из уникального идентификатора.
+//
+// Параметры:
+// Префикс - Строка - Префикс строки
+//
+// Возвращаемое значение:
+// Строка - Уникальная строка
+Функция УникальнаяСтрока(Префикс = "") Экспорт
+
+ Возврат Префикс + Новый УникальныйИдентификатор();
+
+КонецФункции
+
// Создает новый файл, который будет удален после теста
//
// Параметры:
@@ -480,7 +518,53 @@
// Возвращаемое значение:
// ОбщийМодуль - Подражатель
Функция Подражатель() Экспорт
+
Возврат ЮТПодражательСлужебный.Инициализировать();
+
+КонецФункции
+
+// Возвращает таблицу значений из табличного документа
+//
+// Параметры:
+// Макет - ТабличныйДокумент - Исходный табличный документ
+// ОписанияТипов - Соответствие из ОписаниеТипов - Соответствие имен колонок таблицы к типам значений
+// КэшЗначений - Соответствие из Произвольный - Соответствие для хранения создаваемых значений
+// ЗаменяемыеЗначения - Соответствие из Произвольный - Значения, использующиеся для замены
+// ПараметрыСозданияОбъектов - Структура - Настройки создание объектов:
+// * ФикцияОбязательныхПолей - Булево - По умолчанию, Ложь
+// * ОбменДаннымиЗагрузка - Булево - По умолчанию, Истина
+// Возвращаемое значение:
+// ТаблицаЗначений - Для сервера, данные загруженные из макета
+// Массив из Структура - Для клиента, данные загруженные из макета
+Функция ЗагрузитьИзМакета(Макет,
+ ОписанияТипов,
+ КэшЗначений = Неопределено,
+ ЗаменяемыеЗначения = Неопределено,
+ ПараметрыСозданияОбъектов = Неопределено) Экспорт
+
+#Если Сервер Тогда
+ ТаблицаЗначений = Истина;
+#Иначе
+ ТаблицаЗначений = Ложь;
+#КонецЕсли
+
+ Если Макет = Неопределено Тогда
+ ВызватьИсключение "Укажите источник данных (Макет)";
+ КонецЕсли;
+
+ Если НЕ ЗначениеЗаполнено(ОписанияТипов) Тогда
+ ВызватьИсключение "Укажите описание загружаемых колонок (ОписанияТипов)";
+ КонецЕсли;
+
+ ЮТПроверкиСлужебный.ПроверитьТипПараметра(ОписанияТипов, "Структура, Соответствие", "ЮТТестовыеДанные.ЗагрузитьИзМакета", "ОписанияТипов");
+
+ Возврат ЮТТестовыеДанныеСлужебный.ЗагрузитьИзМакета(Макет,
+ ОписанияТипов,
+ КэшЗначений,
+ ЗаменяемыеЗначения,
+ ПараметрыСозданияОбъектов,
+ ТаблицаЗначений);
+
КонецФункции
#Если Сервер Тогда
@@ -493,6 +577,7 @@
Возврат Обработки.ЮТHTTPСервисЗапрос.Создать();
КонецФункции
+
#КонецЕсли
#КонецОбласти
@@ -518,4 +603,4 @@
КонецПроцедуры
-#КонецОбласти
\ No newline at end of file
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/Module.bsl"
new file mode 100644
index 000000000..f43d0389c
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/Module.bsl"
@@ -0,0 +1,578 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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, Инд).Текст;
+ КолонкиМакета.Добавить(ИмяКолонки);
+ КонецЦикла;
+
+ ПараметрыЗагрузки = ПараметрыЗагрузки(КолонкиМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения);
+
+ Выборка = ВыборкаИзТабличногоДокумента(ДанныеМакета);
+
+ Пока Выборка.Следующий() Цикл
+
+ Строка = ПараметрыЗагрузки.Таблица.Добавить();
+
+ Для Каждого ОписаниеКолонки Из ПараметрыЗагрузки.ОписаниеКолонок Цикл
+
+ ЗначениеПредставления = Выборка[ОписаниеКолонки.Индекс];
+
+ Если ПустаяСтрока(ЗначениеПредставления) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Значение = ЗначениеЯчейки(Выборка,
+ ЗначениеПредставления,
+ ОписаниеКолонки,
+ ЗаменяемыеЗначения,
+ КэшЗначений,
+ ПараметрыЗагрузки.ПараметрыСоздания);
+ Строка[ОписаниеКолонки.Имя] = Значение;
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ Возврат ПараметрыЗагрузки.Таблица;
+
+КонецФункции
+
+Функция ЗагрузитьДанныеИзСтроки(ДанныеМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения)
+
+ Разделитель = "|";
+ ПараметрыИтератора = ПараметрыИтератора(ДанныеМакета);
+
+ Пока СледующаяСтрока(ПараметрыИтератора) Цикл
+
+ Строка = СокрЛП(ПараметрыИтератора.Строка);
+
+ Если НЕ СтрНачинаетсяС(Строка, Разделитель) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ КолонкиМакета = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, Истина);
+
+ СледующаяСтрока(ПараметрыИтератора);
+ Прервать;
+
+ КонецЦикла;
+
+ ПараметрыЗагрузки = ПараметрыЗагрузки(КолонкиМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения);
+
+ Пока СледующаяСтрока(ПараметрыИтератора) Цикл
+
+ Строка = СокрЛП(ПараметрыИтератора.Строка);
+
+ Если ПустаяСтрока(Строка) Тогда
+ Продолжить;
+ ИначеЕсли НЕ СтрНачинаетсяС(Строка, Разделитель) Тогда
+ Прервать;
+ КонецЕсли;
+
+ СтрокаДанных = ПараметрыЗагрузки.Таблица.Добавить();
+ Блоки = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, Истина);
+
+ Для Каждого ОписаниеКолонки Из ПараметрыЗагрузки.ОписаниеКолонок Цикл
+
+ ЗначениеПредставления = Блоки[ОписаниеКолонки.Индекс];
+
+ Если ПустаяСтрока(ЗначениеПредставления) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Значение = ЗначениеЯчейки(Блоки,
+ ЗначениеПредставления,
+ ОписаниеКолонки,
+ ЗаменяемыеЗначения,
+ КэшЗначений,
+ ПараметрыЗагрузки.ПараметрыСоздания);
+ СтрокаДанных[ОписаниеКолонки.Имя] = Значение;
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ Возврат ПараметрыЗагрузки.Таблица;
+
+КонецФункции
+
+Функция ПараметрыИтератора(Источник)
+
+ ПараметрыЧтения = Новый Структура;
+
+ ПараметрыЧтения.Вставить("ИзТекстовогоДокумента", Ложь);
+ ПараметрыЧтения.Вставить("ИзЧтенияТекста", Ложь);
+ ПараметрыЧтения.Вставить("ИзВыборки", Ложь);
+ ПараметрыЧтения.Вставить("ДостиглиКонца", Ложь);
+ ПараметрыЧтения.Вставить("Строка", Неопределено);
+
+ ТипЗначения = ТипЗнч(Источник);
+
+ Если ТипЗначения = Тип("ТекстовыйДокумент") Тогда
+ ПараметрыЧтения.ИзТекстовогоДокумента = Истина;
+ ПараметрыЧтения.Вставить("ТекстовыйДокумент", Источник);
+ ПараметрыЧтения.Вставить("КоличествоСтрок", Источник.КоличествоСтрок());
+ ПараметрыЧтения.Вставить("ИндексСтроки", 0);
+ ИначеЕсли ТипЗначения = Тип("Строка") Тогда
+ ПараметрыЧтения.ИзЧтенияТекста = Истина;
+ Кодировка = КодировкаТекста.UTF8;
+ Поток = ПолучитьДвоичныеДанныеИзСтроки(Источник, Кодировка).ОткрытьПотокДляЧтения();
+ Чтение = Новый ЧтениеТекста(Поток, Кодировка);
+ ПараметрыЧтения.Вставить("Чтение", Чтение);
+ ПараметрыЧтения.Вставить("Поток", Поток);
+ ИначеЕсли ТипЗначения = Тип("ВыборкаДанных") Тогда
+ ПараметрыЧтения.ИзВыборки = Истина;
+ ПараметрыЧтения.Вставить("Выборка", Источник);
+ Иначе
+ ВызватьИсключение "Неподдерживаемый параметр";
+ КонецЕсли;
+
+ Возврат ПараметрыЧтения;
+
+КонецФункции
+
+Функция СледующаяСтрока(ПараметрыЧтения)
+
+ Если ПараметрыЧтения.ДостиглиКонца Тогда
+ ВызватьИсключение "Построчное чтение уже завершено. Обнаружена попытка чтения завершенного потока";
+ КонецЕсли;
+
+ Если ПараметрыЧтения.ИзТекстовогоДокумента Тогда
+
+ ЮТОбщий.Инкремент(ПараметрыЧтения.ИндексСтроки);
+ Если ПараметрыЧтения.ИндексСтроки > ПараметрыЧтения.КоличествоСтрок Тогда
+ ПараметрыЧтения.ДостиглиКонца = Истина;
+ Возврат Ложь;
+ КонецЕсли;
+ ПараметрыЧтения.Строка = ПараметрыЧтения.ТекстовыйДокумент.ПолучитьСтроку(ПараметрыЧтения.ИндексСтроки);
+
+ ИначеЕсли ПараметрыЧтения.ИзЧтенияТекста Тогда
+
+ ПараметрыЧтения.Строка = ПараметрыЧтения.Чтение.ПрочитатьСтроку();
+
+ Если ПараметрыЧтения.Строка = Неопределено Тогда
+ ПараметрыЧтения.Чтение.Закрыть();
+ ПараметрыЧтения.Поток.Закрыть();
+ ПараметрыЧтения.ДостиглиКонца = Истина;
+ Возврат Ложь;
+ КонецЕсли;
+
+ ИначеЕсли ПараметрыЧтения.ИзВыборки Тогда
+
+ Если ПараметрыЧтения.Выборка.Следующий() Тогда
+ ПараметрыЧтения.Строка = ПараметрыЧтения.Выборка;
+ Иначе
+ ПараметрыЧтения.ДостиглиКонца = Истина;
+ ПараметрыЧтения.Строка = Неопределено;
+ Возврат Ложь;
+ КонецЕсли;
+
+ Иначе
+
+ ВызватьИсключение "Некорректные/неподдерживаемые параметры чтения";
+
+ КонецЕсли;
+
+ Возврат Истина;
+
+КонецФункции
+
+Функция ВыборкаИзТабличногоДокумента(ТабличныйДокумент)
+
+ ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы;
+ ВсегоКолонок = ТабличныйДокумент.ШиринаТаблицы;
+
+ Область = ТабличныйДокумент.Область(1, 1, ВсегоСтрок, ВсегоКолонок);
+
+ ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
+ ПостроительОтчета = Новый ПостроительОтчета;
+ ПостроительОтчета.ИсточникДанных = ИсточникДанных;
+ ПостроительОтчета.Выполнить();
+
+ Возврат ПостроительОтчета.Результат.Выбрать();
+
+КонецФункции
+
+Функция ДанныеМакета(Знач Макет)
+
+ ТипПараметра = ТипЗнч(Макет);
+ ДанныеМакета = Неопределено;
+
+ ПараметрыСодержитДанные = ТипПараметра = Тип("ТабличныйДокумент")
+ Или ТипПараметра = Тип("ТекстовыйДокумент")
+ Или ТипПараметра = Тип("Строка")
+ И СтрНачинаетсяС(Макет, "|");
+
+ Если ПараметрыСодержитДанные Тогда
+ ДанныеМакета = Макет;
+ ИначеЕсли ТипПараметра = Тип("Строка") Тогда
+ ДанныеМакета = ЮТОбщийВызовСервера.Макет(Макет);
+ Иначе
+ ВызватьИсключение ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТТестовыеДанныеВызовСервера.ДанныеМакета", Макет);
+ КонецЕсли;
+
+ Возврат ДанныеМакета;
+
+КонецФункции
+
+Функция ЗначениеЯчейки(СтрокаДанных, ЗначениеПредставления, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания)
+
+ Значение = ЗаменяемыеЗначения[ЗначениеПредставления];
+
+ КэшироватьЗначение = Значение = Неопределено И ОписаниеКолонки.Менеджер <> Неопределено;
+
+ Если КэшироватьЗначение Тогда
+ Если КэшЗначений[ОписаниеКолонки.Менеджер] = Неопределено Тогда
+ КэшЗначений.Вставить(ОписаниеКолонки.Менеджер, Новый Соответствие());
+ Иначе
+ Значение = КэшЗначений[ОписаниеКолонки.Менеджер][ЗначениеПредставления];
+ КонецЕсли;
+ КонецЕсли;
+
+ Если Значение <> Неопределено Тогда
+ Возврат Значение;
+ КонецЕсли;
+
+ ЗначенияРеквизитов = ЗначенияРеквизитов(СтрокаДанных, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, ПараметрыСоздания);
+ Значение = ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыСоздания);
+
+ Если КэшироватьЗначение Тогда
+ КэшЗначений[ОписаниеКолонки.Менеджер].Вставить(ЗначениеПредставления, Значение);
+ КонецЕсли;
+
+ Возврат Значение;
+
+КонецФункции
+
+Процедура ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, Колонки)
+
+ Если ЗаменяемыеЗначения = Неопределено Тогда
+ ЗаменяемыеЗначения = Новый Соответствие;
+ КонецЕсли;
+
+ Если Не ЗначениеЗаполнено(КэшЗначений) Тогда
+ КэшЗначений = Новый Соответствие;
+ КонецЕсли;
+
+ Для Каждого Колонка Из Колонки Цикл
+
+ Если НЕ Колонка.Ссылочный Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если КэшЗначений[Колонка.Менеджер] = Неопределено Тогда
+ КэшЗначений.Вставить(Колонка.Менеджер, Новый Соответствие);
+ КонецЕсли;
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+Функция ЗначенияРеквизитов(СтрокаТаблицы, ОписаниеКолонки, ЗаменяемыеЗначения, КэшЗначений, Параметры)
+
+ ЗначенияРеквизитов = Новый Структура();
+
+ Для Каждого ОписаниеВложеннойКолонки Из ОписаниеКолонки.ДополнительныеРеквизиты Цикл
+
+ ПредставлениеЗначения = СтрокаТаблицы[ОписаниеВложеннойКолонки.Индекс];
+ Если ПустаяСтрока(ПредставлениеЗначения) Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Значение = ЗначениеЯчейки(СтрокаТаблицы, ПредставлениеЗначения, ОписаниеВложеннойКолонки, ЗаменяемыеЗначения, КэшЗначений, Параметры);
+ ЗначенияРеквизитов.Вставить(ОписаниеВложеннойКолонки.Имя, Значение);
+
+ КонецЦикла;
+
+ ОписаниеОбъектаМетаданных = ОписаниеКолонки.ОписаниеОбъектаМетаданных;
+
+ Если ОписаниеОбъектаМетаданных <> Неопределено И ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя = "Справочник" Тогда
+ ИмяРеквизита = "Наименование";
+ Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизита) = Неопределено Тогда
+ ИмяРеквизита = "Код";
+ КонецЕсли;
+ ЗначенияРеквизитов.Вставить(ИмяРеквизита, СтрокаТаблицы[ОписаниеКолонки.Индекс]);
+ КонецЕсли;
+
+ Возврат ЗначенияРеквизитов;
+
+КонецФункции
+
+Функция ПривестиЗначениеКолонки(ОписаниеКолонки, ЗначениеПредставления, ЗначенияРеквизитов, ПараметрыЗаписи)
+
+ Если ОписаниеКолонки.ЭтоПеречисление Тогда
+ Значение = ОписаниеКолонки.Менеджер[ЗначениеПредставления];
+ ИначеЕсли ОписаниеКолонки.Ссылочный Тогда
+ Значение = СоздатьНовуюЗапись(ОписаниеКолонки, ЗначенияРеквизитов, ПараметрыЗаписи);
+ ИначеЕсли ОписаниеКолонки.ЭтоДата Тогда
+ Значение = ЮТПреобразования.ПривестиЗначениеКДате(ОписаниеКолонки.ОписаниеТипа, ЗначениеПредставления);
+ ИначеЕсли ОписаниеКолонки.ЭтоЧисло Тогда
+ Значение = ЮТПреобразования.ПривестиЗначениеКЧислу(ОписаниеКолонки.ОписаниеТипа, ЗначениеПредставления);
+ Иначе
+ Значение = ОписаниеКолонки.ОписаниеТипа.ПривестиЗначение(ЗначениеПредставления);
+ КонецЕсли;
+
+ Возврат Значение;
+
+КонецФункции
+
+Функция СоздатьНовуюЗапись(ОписаниеКолонки, ЗначенияРеквизитов, ПараметрыЗаписи)
+
+ Конструктор = ЮТТестовыеДанные.КонструкторОбъекта(ОписаниеКолонки.Менеджер);
+
+ Если ЗначениеЗаполнено(ЗначенияРеквизитов) Тогда
+ Для Каждого ДанныеЗначения Из ЗначенияРеквизитов Цикл
+ Конструктор.Установить(ДанныеЗначения.Ключ, ДанныеЗначения.Значение);
+ КонецЦикла;
+ КонецЕсли;
+
+ Если ПараметрыЗаписи.ФикцияОбязательныхПолей Тогда
+ Конструктор.ФикцияОбязательныхПолей();
+ КонецЕсли;
+
+ Возврат Конструктор.Записать(, ПараметрыЗаписи.ПараметрыЗаписи.ОбменДаннымиЗагрузка);
+
+КонецФункции
+
+Функция НоваяТаблица(ОписаниеКолонок)
+
+ ТаблицаЗначений = Новый ТаблицаЗначений();
+
+ Для Каждого ОписаниеКолонки Из ОписаниеКолонок Цикл
+ ТаблицаЗначений.Колонки.Добавить(ОписаниеКолонки.Имя, ОписаниеКолонки.ОписаниеТипа);
+ КонецЦикла;
+
+ Возврат ТаблицаЗначений;
+
+КонецФункции
+
+Функция ПараметрыЗагрузки(КолонкиМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения)
+
+ ОписаниеКолонок = ОписаниеКолонок(КолонкиМакета, ОписанияТипов);
+ ПодготовитьПараметрыЗаполненияТаблицы(КэшЗначений, ЗаменяемыеЗначения, ПараметрыЗаполнения, ОписаниеКолонок);
+ ПараметрыСоздания = ПараметрыЗаполнения.СозданиеОбъектовМетаданных;
+
+ ТаблицаЗначений = НоваяТаблица(ОписаниеКолонок);
+
+ ПараметрыЗагрузки = Новый Структура;
+
+ ПараметрыЗагрузки.Вставить("ОписаниеКолонок", ОписаниеКолонок);
+ ПараметрыЗагрузки.Вставить("ПараметрыСоздания", ПараметрыСоздания);
+ ПараметрыЗагрузки.Вставить("Таблица", ТаблицаЗначений);
+
+ Возврат ПараметрыЗагрузки;
+
+КонецФункции
+
+#Область ОписаниеКолонок
+
+Функция ОписаниеКолонок(КолонкиМакета, ОписанияТипов)
+
+ ОсновныеКолонки = ОсновныеКолонкиМакета(КолонкиМакета);
+
+ Для Каждого Элемент Из ОписанияТипов Цикл
+
+ Если НЕ ОсновныеКолонки.Свойство(Элемент.Ключ) Тогда
+
+ Сообщение = СтрШаблон("Макет не содержит колонку `%1`", Элемент.Ключ);
+ ВызватьИсключение Сообщение;
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если ТипЗнч(ОписанияТипов) = Тип("Структура") Тогда
+ ОписанияТипов = ЮТОбщий.ВСоответствие(ОписанияТипов, "Ключ", "Значение");
+ КонецЕсли;
+
+ ЗагружаемыеКолонки = Новый Массив();
+
+ Для Каждого Элемент Из ОсновныеКолонки Цикл
+
+ ОписаниеТиповКолонки = ОписанияТипов[Элемент.Ключ];
+
+ Если ОписаниеТиповКолонки = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ОсновнаяКолонка = Элемент.Значение;
+ ЗагружаемыеКолонки.Добавить(ОсновнаяКолонка);
+
+ ОсновнаяКолонка.ОписаниеТипа = ОписаниеТиповКолонки;
+ ДозаполнитьОписаниеКолонки(ОсновнаяКолонка);
+
+ ДополнительныеКолонки = ОсновнаяКолонка.ДополнительныеРеквизиты;
+ ОсновнаяКолонка.ДополнительныеРеквизиты = Новый Массив();
+
+ Для Каждого ВложеннаяКолонка Из ДополнительныеКолонки Цикл
+
+ ВложеннаяКолонка.ОписаниеТипа = ОписаниеТипаВложеннойКолонки(ОписанияТипов, ОсновнаяКолонка, ВложеннаяКолонка);
+
+ Если ВложеннаяКолонка.ОписаниеТипа = Неопределено Тогда
+ Продолжить;
+ КонецЕсли;
+
+ ОсновнаяКолонка.ДополнительныеРеквизиты.Добавить(ВложеннаяКолонка);
+ ДозаполнитьОписаниеКолонки(ВложеннаяКолонка);
+
+ КонецЦикла;
+
+ ОсновнаяКолонка.Составное = ЗначениеЗаполнено(ОсновнаяКолонка.ДополнительныеРеквизиты);
+
+ КонецЦикла;
+
+ Возврат ЗагружаемыеКолонки;
+
+КонецФункции
+
+Функция ОписаниеТипаВложеннойКолонки(ОписанияТипов, ОсновнаяКолонка, ВложеннаяКолонка)
+
+ ПолноеИмя = СтрШаблон("%1.%2", ОсновнаяКолонка.Имя, ВложеннаяКолонка.Имя);
+ ОписаниеТипа = ОписанияТипов[ПолноеИмя];
+
+ Если ОписаниеТипа = Неопределено Тогда
+ Реквизиты = ОсновнаяКолонка.ОписаниеОбъектаМетаданных.Реквизиты;
+
+ Если Реквизиты.Свойство(ВложеннаяКолонка.Имя) Тогда
+ ОписаниеТипа = Реквизиты[ВложеннаяКолонка.Имя].Тип;
+ КонецЕсли;
+ КонецЕсли;
+
+ Возврат ОписаниеТипа;
+
+КонецФункции
+
+Функция ОписаниеКолонки(Индекс)
+
+ ОписаниеКолонки = Новый Структура;
+ ОписаниеКолонки.Вставить("Индекс", Индекс);
+ ОписаниеКолонки.Вставить("Имя", "");
+
+ ОписаниеКолонки.Вставить("ОписаниеТипа", Неопределено);
+ ОписаниеКолонки.Вставить("ТипЗначения", Неопределено);
+ ОписаниеКолонки.Вставить("Ссылочный", Ложь);
+ ОписаниеКолонки.Вставить("ДополнительныеРеквизиты", Новый Массив());
+ ОписаниеКолонки.Вставить("Составное", Ложь);
+ ОписаниеКолонки.Вставить("Менеджер", Неопределено);
+ ОписаниеКолонки.Вставить("ОписаниеОбъектаМетаданных", Неопределено);
+ ОписаниеКолонки.Вставить("ЭтоПеречисление", Ложь);
+ ОписаниеКолонки.Вставить("ЭтоЧисло", Ложь);
+ ОписаниеКолонки.Вставить("ЭтоДата", Ложь);
+
+ Возврат ОписаниеКолонки;
+
+КонецФункции
+
+Функция ОсновныеКолонкиМакета(КолонкиМакета)
+
+ ОсновныеКолонки = Новый Структура();
+
+ ВторойУровеньВложенности = 2;
+
+ // Сначала соберем основные колонки
+ Для Инд = 0 По КолонкиМакета.ВГраница() Цикл
+
+ ИмяКолонки = КолонкиМакета[Инд];
+ ЧастиИмени = СтрРазделить(ИмяКолонки, ".");
+
+ Если ПустаяСтрока(ИмяКолонки) ИЛИ ЧастиИмени.Количество() = ВторойУровеньВложенности Тогда
+ Продолжить;
+ ИначеЕсли ЧастиИмени.Количество() > ВторойУровеньВложенности Тогда
+ Сообщение = СтрШаблон("Некорректное имя колонки макета `%1`, доступно использовать максимум 1 уровень вложенности", ИмяКолонки);
+ ВызватьИсключение Сообщение;
+ Иначе
+ ОписаниеКолонки = ОписаниеКолонки(Инд);
+ ОписаниеКолонки.Имя = ИмяКолонки;
+
+ ОсновныеКолонки.Вставить(ИмяКолонки, ОписаниеКолонки);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Для Инд = 0 По КолонкиМакета.ВГраница() Цикл
+
+ ЧастиИмени = СтрРазделить(КолонкиМакета[Инд], ".");
+
+ Если ЧастиИмени.Количество() <> ВторойУровеньВложенности Тогда
+ Продолжить;
+ КонецЕсли;
+
+ Если НЕ ОсновныеКолонки.Свойство(ЧастиИмени[0]) Тогда
+ Сообщение = СтрШаблон("Для колонки `%1` не найдена в макете основная колонка с именем `%2`", ИмяКолонки, ЧастиИмени[0]);
+ ВызватьИсключение Сообщение;
+ КонецЕсли;
+
+ ОсновнаяКолонка = ОсновныеКолонки[ЧастиИмени[0]];
+ ОписаниеКолонки = ОписаниеКолонки(Инд);
+ ОписаниеКолонки.Имя = ЧастиИмени[1];
+
+ ОсновнаяКолонка.ДополнительныеРеквизиты.Добавить(ОписаниеКолонки);
+
+ КонецЦикла;
+
+ Возврат ОсновныеКолонки;
+
+КонецФункции
+
+Процедура ДозаполнитьОписаниеКолонки(ОписаниеКолонки)
+
+ ТипЗначения = ОписаниеКолонки.ОписаниеТипа.Типы()[0];
+ ОписаниеКолонки.ТипЗначения = ТипЗначения;
+
+ ОписаниеКолонки.Ссылочный = ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипЗначения);
+ ОписаниеКолонки.ЭтоЧисло = ТипЗначения = Тип("Число");
+ ОписаниеКолонки.ЭтоДата = ТипЗначения = Тип("Дата");
+
+ Если ОписаниеКолонки.Ссылочный Тогда
+ ОписаниеКолонки.ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(ТипЗначения);
+ ОписаниеКолонки.ЭтоПеречисление = ЮТМетаданные.ЭтоПеречисление(ОписаниеКолонки.ОписаниеОбъектаМетаданных);
+ ОписаниеКолонки.Менеджер = ЮТОбщий.Менеджер(ОписаниеКолонки.ОписаниеОбъектаМетаданных);
+ КонецЕсли;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.mdo"
new file mode 100644
index 000000000..6c6dc00b0
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265_\320\242\320\260\320\261\320\273\320\270\321\206\321\213\320\227\320\275\320\260\321\207\320\265\320\275\320\270\320\271.mdo"
@@ -0,0 +1,10 @@
+
+
+ ЮТТестовыеДанные_ТаблицыЗначений
+
+ ru
+ Тестовые данные таблицы значений
+
+ true
+ true
+
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
index 62f44cdc7..b77cd5e8e 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
@@ -32,7 +32,7 @@
Объект = НовыйОбъект(Менеджер, Данные, ПараметрыЗаписи.ДополнительныеСвойства);
- ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектМетаданных(ТипЗнч(Менеджер));
+ ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер);
РежимЗаписи = ?(СтрСравнить(ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя, "Документ") = 0, ПараметрыЗаписи.РежимЗаписи, Неопределено);
КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи.ОбменДаннымиЗагрузка, РежимЗаписи);
@@ -58,7 +58,7 @@
Менеджер = ЮТОбщий.Менеджер(Менеджер);
- ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектМетаданных(ТипЗнч(Менеджер));
+ ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер);
Объект = СоздатьОбъект(Менеджер, ОписаниеОбъектаМетаданных.ОписаниеТипа, Данные);
ЗаполнитьЗначенияСвойств(Объект, Данные);
@@ -114,7 +114,7 @@
Объект.Удалить();
КонецЕсли;
Иначе
- Менеджер = Менеджер(ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗначения, Ложь));
+ Менеджер = ЮТОбщий.Менеджер(ТипЗначения);
Запись = Менеджер.СоздатьМенеджерЗаписи();
ЗаполнитьЗначенияСвойств(Запись, Ссылка);
Запись.Прочитать();
@@ -146,13 +146,11 @@
Если Метаданные.Перечисления.Содержит(ОбъектМетаданных) Тогда
- Менеджер = Новый ("ПеречислениеМенеджер." + ОбъектМетаданных.Имя);
- НомерЗначения = ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(Менеджер.Количество());
- Возврат Менеджер.Получить(НомерЗначения - 1);
+ Возврат СлучайноеЗначениеПеречисления(ОбъектМетаданных);
КонецЕсли;
- ОписаниеОбъектаМетаданных = ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ОбъектМетаданных);
+ ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(ОбъектМетаданных);
ОписаниеТипа = ОписаниеОбъектаМетаданных.ОписаниеТипа;
ИмяТипаМенеджера = СтрШаблон("%1Менеджер.%2", ОписаниеТипа.Имя, ОбъектМетаданных.Имя);
@@ -170,6 +168,45 @@
КонецФункции
+Функция ЗагрузитьИзМакета(Знач Макет,
+ Знач ОписанияТипов,
+ Знач КэшЗначений,
+ Знач ЗаменяемыеЗначения,
+ Знач ПараметрыЗаполнения,
+ Знач ТаблицаЗначений) Экспорт
+
+ Таблица = ЮТТестовыеДанные_ТаблицыЗначений.ЗагрузитьИзМакета(Макет,
+ ОписанияТипов,
+ КэшЗначений,
+ ЗаменяемыеЗначения,
+ ПараметрыЗаполнения);
+
+ Если ТаблицаЗначений Тогда
+ Возврат Таблица;
+ КонецЕсли;
+
+ Реквизиты = СтрСоединить(ЮТОбщий.ВыгрузитьЗначения(Таблица.Колонки, "Имя"), ",");
+ Результат = Новый Массив(Таблица.Количество());
+
+ Для Инд = 0 По Таблица.Количество() - 1 Цикл
+ Запись = Новый Структура(Реквизиты);
+ ЗаполнитьЗначенияСвойств(Запись, Таблица[Инд]);
+ Результат[Инд] = Запись;
+ КонецЦикла;
+
+ Возврат Результат;
+
+КонецФункции
+
+Функция СлучайноеЗначениеПеречисления(Знач Перечисление) Экспорт
+
+ Менеджер = ЮТОбщий.Менеджер(Перечисление);
+
+ НомерЗначения = ЮТТестовыеДанные.СлучайноеПоложительноеЧисло(Менеджер.Количество());
+ Возврат Менеджер.Получить(НомерЗначения - 1);
+
+КонецФункции
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -179,7 +216,7 @@
// Параметры: ОписаниеМенеджера -
// См. ОписаниеМенеджера
// Менеджер - Произвольный - Менеджер
-// ОписаниеТипа - см. ЮТМетаданные.ОписаниеОбъектМетаданных
+// ОписаниеТипа - см. ЮТМетаданные.ОписаниеОбъектаМетаданных
// Данные - Структура
// Возвращаемое значение:
// Произвольный - Создать объект
@@ -283,7 +320,7 @@
ИначеЕсли СтрНайти(ПредставлениеТипа, "менеджер записи:") Тогда // TODO
- Описание = ЮТМетаданныеСервер.ОписаниеОбъектМетаданных(ТипЗнч(Объект));
+ Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Объект);
КлючевыеРеквизиты = Новый Структура();
Для Каждого Реквизит Из Описание.Реквизиты Цикл
@@ -292,7 +329,7 @@
КонецЕсли;
КонецЦикла;
- Менеджер = Менеджер(Описание);
+ Менеджер = ЮТОбщий.Менеджер(Описание);
Возврат Менеджер.СоздатьКлючЗаписи(КлючевыеРеквизиты);
Иначе
@@ -304,8 +341,4 @@
КонецФункции
-Функция Менеджер(ОписаниеОбъектМетаданных)
- Возврат Новый(СтрШаблон("%1Менеджер.%2", ОписаниеОбъектМетаданных.ОписаниеТипа.Имя, ОписаниеОбъектМетаданных.Имя));
-КонецФункции
-
#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
index 33662e438..60019a164 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
@@ -58,7 +58,7 @@
Значение = ЮТТестовыеДанные.СлучайноеБулево();
- ИначеЕсли ЭтоСистемноеПеречисление(Тип) Тогда
+ ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоСистемноеПеречисление(Тип) Тогда
Значение = СлучайноЗначениеСистемногоПеречисления(Тип);
@@ -116,6 +116,18 @@
КонецПроцедуры
+// Возвращает соответствие с подстроками поиска и замены
+// Возвращаемое значение:
+// Соответствие из Строка
+Функция ПодстрокиДляЗаменыВИменахСвойств() Экспорт
+
+ ЗаменяемыеПодстроки = Новый Соответствие;
+ ЗаменяемыеПодстроки.Вставить(".", "_tchk_");
+
+ Возврат ЗаменяемыеПодстроки;
+
+КонецФункции
+
#Область ОбработчикиСобытий
Процедура ПослеКаждогоТеста(ОписаниеСобытия) Экспорт
@@ -138,44 +150,26 @@
#КонецОбласти
-#КонецОбласти
-
-#Область СлужебныеПроцедурыИФункции
-
-Функция ЭтоСистемноеПеречисление(Тип)
+Функция ЗагрузитьИзМакета(Макет, ОписанияТипов, КэшЗначений, ЗаменяемыеЗначения, ПараметрыСозданияОбъектов, ТаблицаЗначений) Экспорт
- Возврат ТипыСистемныхПеречислений().СодержитТип(Тип);
+ ПараметрыЗаполнения = ЮТФабрика.ПараметрыЗаполненияТаблицыЗначений(ПараметрыСозданияОбъектов);
-КонецФункции
-
-Функция ТипыСистемныхПеречислений()
-
- Возврат Новый ОписаниеТипов(
- "ВидДвиженияБухгалтерии,
- |ВидДвиженияНакопления,
- |ВидПериодаРегистраРасчета,
- |ВидСчета,
- |ВидТочкиМаршрутаБизнесПроцесса,
- |ИспользованиеГруппИЭлементов,
- |ИспользованиеСреза,
- |ИспользованиеРежимаПроведения,
- |РежимАвтоВремя,
- |РежимЗаписиДокумента,
- |РежимПроведенияДокумента,
- |ПериодичностьАгрегатаРегистраНакопления,
- |ИспользованиеАгрегатаРегистраНакопления");
+ Возврат ЮТТестовыеДанныеВызовСервера.ЗагрузитьИзМакета(Макет,
+ ОписанияТипов,
+ КэшЗначений,
+ ЗаменяемыеЗначения,
+ ПараметрыЗаполнения,
+ ТаблицаЗначений);
КонецФункции
-Функция ИмяСистемногоПеречисления(Тип)
-
- Возврат Строка(Тип);
-
-КонецФункции
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
Функция СлучайноЗначениеСистемногоПеречисления(Тип)
- Менеджер = ЮТОбщий.ВычислитьБезопасно(ИмяСистемногоПеречисления(Тип));
+ Менеджер = ЮТОбщий.ВычислитьБезопасно(ЮТТипыДанныхСлужебный.ИмяСистемногоПеречисления(Тип));
Значения = Новый Массив();
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
new file mode 100644
index 000000000..4b5cde52d
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
@@ -0,0 +1,171 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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 Undefined variable
+ ТипXML = СериализаторXDTO.XMLТип(Тип);
+
+ Если ТипXML = Неопределено Тогда
+ Возврат Строка(Тип);
+ Иначе
+ Возврат ТипXML.ИмяТипа;
+ КонецЕсли;
+#КонецЕсли
+
+КонецФункции
+
+Функция ИдентификаторТипа(Тип) Экспорт
+
+#Если ВебКлиент Тогда
+ ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа");
+#ИначеЕсли Сервер Тогда
+ Возврат ЗначениеВСтрокуВнутр(Тип); // Не все серверные типы сериализуются через СериализаторXDTO
+#Иначе
+ Попытка
+ Запись = Новый ЗаписьJSON();
+ Запись.УстановитьСтроку();
+ СериализаторXDTO.ЗаписатьJSON(Запись, Тип);
+ Возврат Запись.Закрыть();
+ Исключение
+ ВызватьИсключение СтрШаблон("Не удалось определить индетификатор типа для `%1`
+ |%2", Тип, ОписаниеОшибки());
+ КонецПопытки;
+#КонецЕсли
+
+КонецФункции
+
+Функция ТипПоИдентификатору(ИдентификаторТипа) Экспорт
+
+#Если ВебКлиент Тогда
+ ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа");
+#ИначеЕсли Сервер Тогда
+ Если СтрНачинаетсяС(ИдентификаторТипа, "{") Тогда
+ Возврат ЗначениеИзСтрокиВнутр(ИдентификаторТипа);
+ КонецЕсли;
+#КонецЕсли
+
+ Возврат ТипПоПредставлению(ИдентификаторТипа);
+
+КонецФункции
+
+Функция ТипПоПредставлению(ПредставлениеТипа) Экспорт
+
+#Если ВебКлиент Тогда
+ ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ТипПоПредставлению");
+#Иначе
+ Чтение = Новый ЧтениеJSON();
+ Чтение.УстановитьСтроку(ПредставлениеТипа);
+ Результат = СериализаторXDTO.ПрочитатьJSON(Чтение, Тип("Тип"));
+
+ Если Результат = Неопределено Тогда
+ ВызватьИсключение СтрШаблон("Не удалось определить тип по представлению `%1`", ПредставлениеТипа);
+ КонецЕсли;
+
+ Возврат Результат;
+#КонецЕсли
+
+КонецФункции
+
+Функция ЭтоСсылочныйТип(Тип) Экспорт
+
+ Возврат Тип <> Неопределено И ЮТОбщий.ОписаниеТиповЛюбаяСсылка().СодержитТип(Тип);
+
+КонецФункции
+
+#Область СистемныеПеречисления
+
+Функция ЭтоСистемноеПеречисление(Тип) Экспорт
+
+ Возврат ТипыСистемныхПеречислений().СодержитТип(Тип);
+
+КонецФункции
+
+Функция ТипыСистемныхПеречислений() Экспорт
+
+ Возврат Новый ОписаниеТипов(
+ "ВидДвиженияБухгалтерии,
+ |ВидДвиженияНакопления,
+ |ВидПериодаРегистраРасчета,
+ |ВидСчета,
+ |ВидТочкиМаршрутаБизнесПроцесса,
+ |ИспользованиеГруппИЭлементов,
+ |ИспользованиеСреза,
+ |ИспользованиеРежимаПроведения,
+ |РежимАвтоВремя,
+ |РежимЗаписиДокумента,
+ |РежимПроведенияДокумента,
+ |ПериодичностьАгрегатаРегистраНакопления,
+ |ИспользованиеАгрегатаРегистраНакопления");
+
+КонецФункции
+
+Функция ИмяСистемногоПеречисления(Тип) Экспорт
+
+ Возврат Строка(Тип);
+
+КонецФункции
+
+Функция ЭтоКоллекцияПримитивныхТипов(Типы) Экспорт
+
+ Для Каждого Тип Из Типы Цикл
+
+ Если НЕ ЭтоПримитивныйТип(Тип) Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат Истина;
+
+КонецФункции
+
+Функция ЭтоПримитивныйТип(Тип) Экспорт
+
+ ПримитивныеТипы = ЮТПовторногоИспользования.ПримитивныеТипы();
+
+ ТипПараметра = ТипЗнч(Тип);
+
+ Если ТипПараметра = Тип("Тип") Тогда
+ Возврат ПримитивныеТипы.Найти(Тип) <> Неопределено;
+ КонецЕсли;
+
+ Для Каждого Тип Из Тип.Типы() Цикл
+
+ Если ПримитивныеТипы.Найти(Тип) = Неопределено Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат Истина;
+
+КонецФункции
+
+#КонецОбласти
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo"
new file mode 100644
index 000000000..539418b45
--- /dev/null
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo"
@@ -0,0 +1,11 @@
+
+
+ ЮТТипыДанныхСлужебный
+
+ ru
+ Типы данных
+
+ true
+ true
+ true
+
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl"
index 9b647dbd4..b8b6ebe97 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl"
@@ -696,6 +696,40 @@
КонецФункции
+// Проверяет установленное значение Контекста (или его свойство) на наличие подстроки, соответствующей регулярному выражению
+//
+// Параметры:
+// Шаблон - Строка - Регулярное выражение, по которому ищем подстроку
+// ОписаниеПроверки - Строка - Описание конкретной проверки
+//
+// Возвращаемое значение:
+// ОбщийМодуль - Этот модуль для замыкания
+Функция СодержитСтрокуПоШаблону(Знач Шаблон, Знач ОписаниеПроверки = Неопределено) Экспорт
+
+ Контекст = Контекст();
+ УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
+ ПроверитьСоответствиеШаблону(Контекст, Шаблон, Ложь);
+ Возврат ЮТУтверждения;
+
+КонецФункции
+
+// Проверяет установленное значение Контекста (или его свойство) на отсутствие подстроки, соответствующей регулярному выражению
+//
+// Параметры:
+// Шаблон - Строка - Регулярное выражение, по которому ищем подстроку
+// ОписаниеПроверки - Строка - Описание конкретной проверки
+//
+// Возвращаемое значение:
+// ОбщийМодуль - Этот модуль для замыкания
+Функция НеСодержитСтрокуПоШаблону(Знач Шаблон, Знач ОписаниеПроверки = Неопределено) Экспорт
+
+ Контекст = Контекст();
+ УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
+ ПроверитьСоответствиеШаблону(Контекст, Шаблон, Истина);
+ Возврат ЮТУтверждения;
+
+КонецФункции
+
// Проверяет установленное значение Контекста (или его свойство) на длину или размер коллекции.
//
// Проверка поддерживается для следующих типов проверяемого значения:
@@ -1547,6 +1581,10 @@
ИскомоеЗначениеНайдено = ПроверяемоеЗначение.НайтиПоЗначению(ОжидаемоеЗначение) <> Неопределено;
+ ИначеЕсли ПроверяемоеЗначение <> Неопределено И ЮТОбщий.МетодМодуляСуществует(ПроверяемоеЗначение, "Найти", , Ложь) Тогда
+
+ ИскомоеЗначениеНайдено = ПроверяемоеЗначение.Найти(ОжидаемоеЗначение) <> Неопределено;
+
КонецЕсли;
Возврат ИскомоеЗначениеНайдено;
@@ -1622,7 +1660,7 @@
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
ПроверитьТипЗначения(Контекст, ОжидаемоеЗначение, Новый ОписаниеТипов("ОписаниеТипов, Тип, Строка"));
- Результат = ТипЗначенияСоответствует(ПроверяемоеЗначение, ОжидаемоеЗначение);
+ Результат = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(ПроверяемоеЗначение, ОжидаемоеЗначение);
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
@@ -1643,7 +1681,7 @@
Возврат;
КонецЕсли;
- Соответствует = ТипЗначенияСоответствует(Значение, ОжидаемыйТип);
+ Соответствует = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(Значение, ОжидаемыйТип);
Если НЕ Соответствует Тогда
ТекстОшибки = СтрШаблон("Не верный тип %1 (`%2`), должен быть `%3`%4",
@@ -1656,34 +1694,6 @@
КонецПроцедуры
-Функция ТипЗначенияСоответствует(Значение, ОжидаемыйТип)
-
- ТипОжидаемогоТипа = ТипЗнч(ОжидаемыйТип);
-
- Если ТипОжидаемогоТипа = Тип("Строка") Тогда
- Если СтрНайти(ОжидаемыйТип, ",") Тогда
- ОжидаемыйТип = Новый ОписаниеТипов(ОжидаемыйТип);
- ТипОжидаемогоТипа = Тип("ОписаниеТипов");
- Иначе
- ОжидаемыйТип = Тип(ОжидаемыйТип);
- ТипОжидаемогоТипа = Тип("Тип");
- КонецЕсли;
- КонецЕсли;
-
- ТипЗначения = ТипЗнч(Значение);
-
- Если ТипОжидаемогоТипа = Тип("ОписаниеТипов") Тогда
- // СодержитТип не подходит, всегда выдает истину если проверяем Тип("Неопределено")
- Соответствует = ОжидаемыйТип.Типы().Найти(ТипЗначения) <> Неопределено
- И ОжидаемыйТип.ПривестиЗначение(Значение) = Значение;
- Иначе
- Соответствует = ТипЗначения = ОжидаемыйТип;
- КонецЕсли;
-
- Возврат Соответствует;
-
-КонецФункции
-
Функция ЭтоТипМассива(Тип)
Возврат Тип = Тип("Массив") Или Тип = Тип("ФиксированныйМассив");
@@ -1774,6 +1784,25 @@
КонецПроцедуры
+Процедура ПроверитьСоответствиеШаблону(Контекст, ОжидаемоеЗначение, Реверс)
+
+ Попытка
+ ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
+ Результат = ВыполнитьПроверкуСоответствуетШаблону(ПроверяемоеЗначение, ОжидаемоеЗначение);
+ Исключение
+ ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
+ КонецПопытки;
+
+ Если Результат = Неопределено Тогда
+ ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
+ ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки, Контекст);
+ КонецЕсли;
+
+ Сообщение = СтрШаблон("содержит подстроку соответствующую шаблону `%1`", ОжидаемоеЗначение);
+ ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ПроверяемоеЗначение, ОжидаемоеЗначение);
+
+КонецПроцедуры
+
Функция ДлинаПроверяемогоЗначения(Контекст)
Попытка
@@ -1956,4 +1985,22 @@
КонецПроцедуры
+Функция ВыполнитьПроверкуСоответствуетШаблону(ПроверяемаяСтрока, РегулярноеВыражение)
+
+ Если ТипЗнч(ПроверяемаяСтрока) <> Тип("Строка") Тогда
+ Возврат Неопределено;
+ КонецЕсли;
+
+ РегулярныеВыражения = ЮТКомпоненты.РегулярныеВыражения();
+
+ Попытка
+ Результат = РегулярныеВыражения.Совпадает(ПроверяемаяСтрока, РегулярноеВыражение);
+ Исключение
+ ВызватьИсключение РегулярныеВыражения.ОписаниеОшибки;
+ КонецПопытки;
+
+ Возврат Результат;
+
+КонецФункции
+
#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\261\321\200\320\270\320\272\320\260/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\261\321\200\320\270\320\272\320\260/Module.bsl"
index c577469cc..6688db3d3 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\261\321\200\320\270\320\272\320\260/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\261\321\200\320\270\320\272\320\260/Module.bsl"
@@ -161,7 +161,6 @@
ТипыОшибок = Новый Массив();
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ТестНеРеализован", "Не реализован", Статусы.НеРеализован));
- ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ТестНеРеализован", "Не реализован", Статусы.НеРеализован));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ОшибкаСравнения", "Ошибка сравнения", Статусы.Ошибка));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "ОшибкаОбработкиСобытия", "Ошибка обработки события", Статусы.Сломан));
ТипыОшибок.Добавить(Новый Структура(Реквизиты, "Утверждений", "Ошибка утверждений", Статусы.Ошибка));
@@ -279,12 +278,36 @@
КонецФункции
+// Описание исполняемого тестового модуля.
+// Содержит всю необходимую информацию для прогона тестов, а также данные результата
+// Параметры:
+// ТестовыйМодуль - см. ОписаниеТестовогоМодуля
+//
+// Возвращаемое значение:
+// Структура - Описание тестового модуля:
+// * МетаданныеМодуля - см. ЮТФабрика.ОписаниеМодуля
+// * НаборыТестов - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
+// * Ошибки - Массив из см. ЮТФабрика.ОписаниеВозникшейОшибки
+// * НастройкиВыполнения- Структура - Настройки исполнения теста
+Функция ОписаниеИсполняемогоТестовогоМодуля(ТестовыйМодуль) Экспорт
+
+ Описание = Новый Структура;
+
+ Описание.Вставить("МетаданныеМодуля", ТестовыйМодуль.МетаданныеМодуля);
+ Описание.Вставить("НаборыТестов", Новый Массив);
+ Описание.Вставить("Ошибки", ЮТОбщий.СкопироватьМассив(ТестовыйМодуль.Ошибки));
+ Описание.Вставить("НастройкиВыполнения", ЮТОбщий.СкопироватьСтруктуру(ТестовыйМодуль.НастройкиВыполнения));
+
+ Возврат Описание;
+
+КонецФункции
+
// ОписаниеИсполняемогоНабораТестов
// Возвращает описание исполняемого тестового набора.
// Содержит данные необходимые для выполнения прогона тестов
// Параметры:
-// НаборТестов - Массив из см. ОписаниеТеста - Коллекция зарегистрированных тестовых наборов, см. ОписаниеТестовогоНабора
-// ТестовыйМодуль - Структура - Описание тестового модуля, см. ЮТФабрика.ОписаниеМодуля
+// НаборТестов - См. ОписаниеТестовогоНабора
+// ТестовыйМодуль - См. ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Структура - Описание исполняемого набора тестов:
@@ -308,6 +331,7 @@
Описание.Вставить("Теги", НаборТестов.Теги);
Описание.Вставить("Ошибки", ЮТОбщий.СкопироватьМассив(НаборТестов.Ошибки));
Описание.Вставить("Режим", "");
+ Описание.Вставить("ТестовыйМодуль", ТестовыйМодуль);
Описание.Вставить("МетаданныеМодуля", ТестовыйМодуль.МетаданныеМодуля);
Описание.Вставить("Тесты", Новый Массив);
Описание.Вставить("Выполнять", Описание.Ошибки.Количество() = 0);
@@ -324,9 +348,9 @@
// Содержит данные необходимые для выполнения прогона тестов
//
// Параметры:
-// Тест - Структура из см. ОписаниеТеста - Описание зарегистрированного теста, см. ОписаниеТеста
-// Режим - Строка - Режим исполнения, см. КонтекстыВызова
-// ТестовыйМодуль - Структура - Описание тестового модуля, см. ЮТФабрика.ОписаниеМодуля
+// Тест - См. ОписаниеТеста
+// Режим - См. КонтекстыВызова
+// ТестовыйМодуль - См. ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Структура - Описание исполняемого теста:
@@ -378,7 +402,10 @@
// * logging - см. ПараметрыЛогирования
// * showReport - Булево - Признак необходмости отобразить отчет в 1с по окончании тестирования
// * exitCode - Строка - Путь к файлу, в который будет записан коды выхода
-Функция ПараметрыЗапуска() Экспорт
+// * ПодключатьВнешниеКомпоненты - Булево - Выполнять установку и подключение внешних компонент при старте.
+// Если выключено и включен запрет синхронных вызовов, то компоненты не будут доступы в тонком клиенте.
+// Если выключено и разрешены синхронные вызовы, то компоненты можно установить вручную и тогда они будут доступны на клиенте.
+ Функция ПараметрыЗапуска() Экспорт
Параметры = Новый Структура;
@@ -393,6 +420,8 @@
Параметры.Вставить("logging", ПараметрыЛогирования());
Параметры.Вставить("exitCode", "");
+ Параметры.Вставить("ПодключатьВнешниеКомпоненты", Истина);
+
Возврат Параметры;
КонецФункции
@@ -426,6 +455,7 @@
// * КлиентОбычноеПриложение - Булево - Доступность контекста
// * Сервер - Булево - Доступность контекста
// * ВызовСервера - Булево - Доступность контекста
+// * Глобальный - Булево - Доступность контекста
Функция ОписаниеМодуля() Экспорт
Описание = Новый Структура;
@@ -436,6 +466,7 @@
Описание.Вставить("КлиентОбычноеПриложение", Ложь);
Описание.Вставить("Сервер", Ложь);
Описание.Вставить("ВызовСервера", Ложь);
+ Описание.Вставить("Глобальный", Ложь);
Возврат Описание;
@@ -592,6 +623,30 @@
КонецФункции
+// Описание реквизита объекта метаданных
+//
+// Параметры:
+// Реквизит - ОбъектМетаданных
+// ЭтоКлюч - Булево - Это ключевой реквизит (ссылка, измерение)
+//
+// Возвращаемое значение:
+// Структура - Описание реквизита:
+// * Имя - Строка
+// * Тип - ОписаниеТипов
+// * Обязательный - Булево
+// * ЭтоКлюч - Булево
+Функция ОписаниеРеквизита(Знач Реквизит, Знач ЭтоКлюч) Экспорт
+
+ Описание = Новый Структура();
+ Описание.Вставить("Имя", Реквизит.Имя);
+ Описание.Вставить("Тип", Реквизит.Тип);
+ Описание.Вставить("Обязательный", Реквизит.ПроверкаЗаполнения = ПроверкаЗаполнения.ВыдаватьОшибку);
+ Описание.Вставить("ЭтоКлюч", ЭтоКлюч);
+
+ Возврат Описание;
+
+КонецФункции
+
#КонецОбласти
#Область КонструкторыКонтекстов
@@ -668,10 +723,10 @@
// КонтекстыМодуля
// Возвращает коллекцию доступных контекстов выполнения модуля
// Параметры:
-// Модуль Модуль
+// Модуль - См. ОписаниеМодуля
//
// Возвращаемое значение:
-// Массив - Контексты модуля
+// Массив из Строка - Контексты модуля, возможные значения см. КонтекстыВызова
Функция КонтекстыМодуля(Модуль) Экспорт
Контексты = КонтекстыВызова();
@@ -697,7 +752,7 @@
// КонтекстыПриложения
// Возвращает коллекцию доступных контекстов приложения
// Возвращаемое значение:
-// Массив из см. КонтекстыВызова - Контексты приложения
+// Массив из Строка - Контексты приложения, возможные значения см. КонтекстыВызова
Функция КонтекстыПриложения() Экспорт
#Если НЕ Клиент Тогда
@@ -771,6 +826,34 @@
КонецФункции
+Функция ПараметрыСозданияОбъектов(Знач ПараметрыЗаписи = Неопределено, ФикцияОбязательныхПолей = Ложь) Экспорт
+
+ Если ПараметрыЗаписи = Неопределено Тогда
+ ПараметрыЗаписи = ПараметрыЗаписи();
+ Иначе
+ ВходныеПараметрыЗаписи = ПараметрыЗаписи;
+ ПараметрыЗаписи = ПараметрыЗаписи();
+ ЗаполнитьЗначенияСвойств(ПараметрыЗаписи, ВходныеПараметрыЗаписи);
+ КонецЕсли;
+
+ Возврат Новый ФиксированнаяСтруктура("ФикцияОбязательныхПолей, ПараметрыЗаписи", ФикцияОбязательныхПолей, ПараметрыЗаписи);
+
+КонецФункции
+
+Функция ПараметрыЗаполненияТаблицыЗначений(Знач ПараметрыСозданияОбъектов = Неопределено) Экспорт
+
+ Если ПараметрыСозданияОбъектов = Неопределено Тогда
+ ПараметрыСозданияОбъектов = ПараметрыСозданияОбъектов();
+ Иначе
+ ВходныеПараметрыСозданияОбъектов = ПараметрыСозданияОбъектов;
+ ПараметрыСозданияОбъектов = ПараметрыСозданияОбъектов();
+ ЗаполнитьЗначенияСвойств(ПараметрыСозданияОбъектов, ВходныеПараметрыСозданияОбъектов);
+ КонецЕсли;
+
+ Возврат Новый ФиксированнаяСтруктура("СозданиеОбъектовМетаданных", ПараметрыСозданияОбъектов);
+
+КонецФункции
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@@ -814,10 +897,9 @@
Функция НастройкиВыполнения() Экспорт
- ПараметрыИсполнения = ПараметрыИсполненияТеста();
-
Настройки = Новый Структура();
+ ПараметрыИсполнения = ПараметрыИсполненияТеста();
Настройки.Вставить(ПараметрыИсполнения.ВТранзакции, Ложь);
Возврат Настройки;
@@ -828,6 +910,7 @@
Параметры = Новый Структура();
Параметры.Вставить("file", "");
+ Параметры.Вставить("console", Ложь);
Параметры.Вставить("enable", Неопределено);
Параметры.Вставить("level", ЮТЛогирование.УровниЛога().Отладка);
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\271\320\273\321\213/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\271\320\273\321\213/Module.bsl"
index 249d5d762..528c0fe52 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\271\320\273\321\213/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\244\320\260\320\271\320\273\321\213/Module.bsl"
@@ -77,26 +77,28 @@
// Параметры:
// Путь1 - Строка - базовый путь к каталогу
// Путь2 - Строка - относительный путь к вложенному элементу
+// Путь3 - Строка - относительный путь к вложенному элементу
+// Путь4 - Строка - относительный путь к вложенному элементу
+// Путь5 - Строка - относительный путь к вложенному элементу
//
// Возвращаемое значение:
// Строка - Объединенный путь
-Функция ОбъединитьПути(Путь1, Путь2) Экспорт
+Функция ОбъединитьПути(Путь1, Путь2, Путь3 = Неопределено, Путь4 = Неопределено, Путь5 = Неопределено) Экспорт
- Результат = Неопределено;
+ Разделитель = ПолучитьРазделительПути();
- Если ЗначениеЗаполнено(Путь1) И ЗначениеЗаполнено(Путь2) Тогда
- Разделитель = ПолучитьРазделительПути();
-
- Если НЕ СтрЗаканчиваетсяНа(Путь1, Разделитель) И НЕ СтрНачинаетсяС(Разделитель, Путь2) Тогда
- Результат = СтрШаблон("%1%2%3", Путь1, Разделитель, Путь2);
- Иначе
- Результат = Путь1 + Путь2;
- КонецЕсли;
-
- ИначеЕсли ЗначениеЗаполнено(Путь1) Тогда
- Результат = Путь1;
- Иначе
- Результат = Путь2;
+ Результат = ДополнитьПуть(Путь1, Путь2, Разделитель);
+
+ Если Путь3 <> Неопределено Тогда
+ Результат = ДополнитьПуть(Результат, Путь3, Разделитель);
+ КонецЕсли;
+
+ Если Путь4 <> Неопределено Тогда
+ Результат = ДополнитьПуть(Результат, Путь4, Разделитель);
+ КонецЕсли;
+
+ Если Путь5 <> Неопределено Тогда
+ Результат = ДополнитьПуть(Результат, Путь5, Разделитель);
КонецЕсли;
Возврат Результат;
@@ -163,7 +165,7 @@
Процедура ПолучитьАтрибутФайла(Результат, Параметры) Экспорт
Если НЕ Результат Тогда
- ВыполнитьОбработкуОповещения(Параметры.Обработчик, Параметры.ЗначениеПоУмолчанию);
+ ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьОбработчик(Параметры.Обработчик, Параметры.ЗначениеПоУмолчанию);
Возврат;
КонецЕсли;
@@ -174,4 +176,26 @@
КонецПроцедуры
#КонецЕсли
+Функция ДополнитьПуть(Путь1, Путь2, Разделитель)
+
+ Результат = Неопределено;
+
+ Если ЗначениеЗаполнено(Путь1) И ЗначениеЗаполнено(Путь2) Тогда
+
+ Если НЕ СтрЗаканчиваетсяНа(Путь1, Разделитель) И НЕ СтрНачинаетсяС(Разделитель, Путь2) Тогда
+ Результат = СтрШаблон("%1%2%3", Путь1, Разделитель, Путь2);
+ Иначе
+ Результат = Путь1 + Путь2;
+ КонецЕсли;
+
+ ИначеЕсли ЗначениеЗаполнено(Путь1) Тогда
+ Результат = Путь1;
+ Иначе
+ Результат = Путь2;
+ КонецЕсли;
+
+ Возврат Результат;
+
+КонецФункции
+
#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl"
index 8c6be621b..1710a2124 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl"
@@ -58,7 +58,7 @@
Функция ИсполняемыеСценарииМодуля(МетаданныеМодуля) Экспорт
ЭтоТестовыйМодуль = Истина;
- ОписаниеТестовогоМодуля = ЮТФабрика.ОписаниеТестовогоМодуля(МетаданныеМодуля, Неопределено);
+ ОписаниеТестовогоМодуля = ЮТФабрика.ОписаниеТестовогоМодуля(МетаданныеМодуля, Новый Массив);
ЮТТесты.ПередЧтениемСценариевМодуля(МетаданныеМодуля);
@@ -115,6 +115,10 @@
// Булево - Этот модуль содержит тесты
Функция ЭтоТестовыйМодуль(МетаданныеМодуля) Экспорт
+ Если МетаданныеМодуля.Глобальный Тогда
+ Возврат Ложь;
+ КонецЕсли;
+
#Если Сервер Тогда
Возврат ЮТОбщий.МетодМодуляСуществует(МетаданныеМодуля.Имя, ИмяМетодаСценариев());
#КонецЕсли
diff --git "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\265\321\201\321\202/Module.bsl" "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\265\321\201\321\202/Module.bsl"
index 6453e191e..5def9d1bd 100644
--- "a/exts/yaxunit/src/CommonModules/\320\256\320\242\320\265\321\201\321\202/Module.bsl"
+++ "b/exts/yaxunit/src/CommonModules/\320\256\320\242\320\265\321\201\321\202/Module.bsl"
@@ -38,7 +38,7 @@
// Возвращает API формирования утверждения для проверки данных базы.
//
// Параметры:
-// ИмяТаблицы - Произвольный - Имя таблицы базы, например, `Справочник.Пользователи`, `Документ.ПКО`, `РегистрСведений.ИнформацияОбОшибках`
+// ИмяТаблицы - Строка - Имя таблицы базы, например, `Справочник.Пользователи`, `Документ.ПКО`, `РегистрСведений.ИнформацияОбОшибках`
// Сообщение - Строка - Описание проверки, которое будет выведено при возникновении ошибки
//
// Возвращаемое значение:
@@ -83,6 +83,13 @@
КонецФункции
+// Умный контекст, в который можно сохранять и получать из него промежуточные данные
+// Этот контекст работает с см. КонтекстТеста, см. КонтекстТестовогоНабора и см. КонтекстМодуля.
+// При получении значения оно ущется во всех 3 контекста поочереди.
+// При установке значения, оно устанавливается в текущий контекст, например, в событии перед тестовым наборов в м. КонтекстТестовогоНабора
+//
+// Возвращаемое значение:
+// ОбщийМодуль - Контекст теста, см. ЮТКонтекстТеста
Функция Контекст() Экспорт
Возврат ЮТКонтекстТеста;
@@ -149,4 +156,24 @@
КонецФункции
+// Преостанавливает поток выполнения на указанное количество секунд
+//
+// Параметры:
+// Время - Число - Продолжительность паузы в секундах, возможно указывать дробное значение
+Процедура Пауза(Время) Экспорт
+
+ ЮТОбщий.Пауза(Время);
+
+КонецПроцедуры
+
+// Выводит сообщение в консоль (stdout) приложения
+//
+// Параметры:
+// Сообщение - Строка - Выводимое сообщение
+Процедура ВывестиВКонсоль(Сообщение) Экспорт
+
+ ЮТОбщий.ВывестиВКонсоль(Сообщение);
+
+КонецПроцедуры
+
#КонецОбласти
diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/Template.addin" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/Template.addin"
new file mode 100644
index 000000000..3e59669eb
Binary files /dev/null and "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/Template.addin" differ
diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/\320\256\320\242RegEx1CAddin.mdo" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/\320\256\320\242RegEx1CAddin.mdo"
new file mode 100644
index 000000000..2ce9212dd
--- /dev/null
+++ "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242RegEx1CAddin/\320\256\320\242RegEx1CAddin.mdo"
@@ -0,0 +1,9 @@
+
+
+ ЮТRegEx1CAddin
+
+ ru
+ Reg ex1 c addin
+
+ AddIn
+
diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/Template.addin" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/Template.addin"
new file mode 100644
index 000000000..c65129374
Binary files /dev/null and "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/Template.addin" differ
diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/\320\256\320\242YaxUnitAddIn.mdo" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/\320\256\320\242YaxUnitAddIn.mdo"
new file mode 100644
index 000000000..23825ac97
--- /dev/null
+++ "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242YaxUnitAddIn/\320\256\320\242YaxUnitAddIn.mdo"
@@ -0,0 +1,9 @@
+
+
+ ЮТYaxUnitAddIn
+
+ ru
+ ЮТYax unit add in
+
+ AddIn
+
diff --git "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205/Template.txt" "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205/Template.txt"
index 31e02b130..b8c822dd0 100644
--- "a/exts/yaxunit/src/CommonTemplates/\320\256\320\242\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205/Template.txt"
+++ "b/exts/yaxunit/src/CommonTemplates/\320\256\320\242\320\236\320\277\320\270\321\201\320\260\320\275\320\270\320\265\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\321\205/Template.txt"
@@ -14,3 +14,4 @@
| РегистрРасчета | РегистрыРасчета | | | | + | + | + | | |
| БизнесПроцесс | БизнесПроцессы | СоздатьБизнесПроцесс | | + | + | | | | + |
| Задача | Задачи | СоздатьЗадачу | | + | + | | | + | + |
+| Перечисление | Перечисления | | | + | | | | | |
diff --git a/exts/yaxunit/src/Configuration/Configuration.mdo b/exts/yaxunit/src/Configuration/Configuration.mdo
index 3bdcd3a19..d46ee9259 100644
--- a/exts/yaxunit/src/Configuration/Configuration.mdo
+++ b/exts/yaxunit/src/Configuration/Configuration.mdo
@@ -16,7 +16,7 @@
8.3.10
AddOn
Russian
- 23.07.0
+ 23.08.0
Русский
Adopted
@@ -43,11 +43,14 @@
CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеИмена_ru
CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеОтчества_ru
CommonTemplate.ЮТ_СловарьПодражателя_Люди_МужскиеФамилии_ru
+ CommonTemplate.ЮТRegEx1CAddin
+ CommonTemplate.ЮТYaxUnitAddIn
CommonTemplate.ЮТОписаниеМетаданных
CommonModule.Мокито
CommonModule.МокитоОбучение
CommonModule.МокитоПроверки
CommonModule.МокитоСлужебный
+ CommonModule.ЮТАсинхроннаяОбработкаСлужебныйКлиент
CommonModule.ЮТест
CommonModule.ЮТЗапросы
CommonModule.ЮТЗапросыВызовСервера
@@ -55,6 +58,9 @@
CommonModule.ЮТИсполнительКлиент
CommonModule.ЮТИсполнительКлиентСервер
CommonModule.ЮТИсполнительСервер
+ CommonModule.ЮТКомпоненты
+ CommonModule.ЮТКомпонентыВызовСервера
+ CommonModule.ЮТКомпонентыКлиент
CommonModule.ЮТКонструкторВариантов
CommonModule.ЮТКонструкторТестовыхДанныхСлужебный
CommonModule.ЮТКонтекст
@@ -83,15 +89,20 @@
CommonModule.ЮТПодражательСлужебный
CommonModule.ЮТПредикаты
CommonModule.ЮТПредикатыКлиентСервер
+ CommonModule.ЮТПреобразования
+ CommonModule.ЮТПроверкиСлужебный
CommonModule.ЮТРасширения
CommonModule.ЮТРегистрацияОшибок
CommonModule.ЮТСобытия
CommonModule.ЮТСравнениеКлиентСервер
CommonModule.ЮТСравнениеСервер
+ CommonModule.ЮТСтроки
CommonModule.ЮТТестовыеДанные
+ CommonModule.ЮТТестовыеДанные_ТаблицыЗначений
CommonModule.ЮТТестовыеДанныеВызовСервера
CommonModule.ЮТТестовыеДанныеСлужебный
CommonModule.ЮТТесты
+ CommonModule.ЮТТипыДанныхСлужебный
CommonModule.ЮТУтверждения
CommonModule.ЮТУтвержденияИБ
CommonModule.ЮТФабрика
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\232\320\273\320\270\320\265\320\275\321\202\321\201\320\272\320\270\320\271\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200/Module.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\232\320\273\320\270\320\265\320\275\321\202\321\201\320\272\320\270\320\271\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200/Module.bsl"
index 432a61896..91fc4eaa5 100644
--- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\232\320\273\320\270\320\265\320\275\321\202\321\201\320\272\320\270\320\271\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200/Module.bsl"
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Forms/\320\232\320\273\320\270\320\265\320\275\321\202\321\201\320\272\320\270\320\271\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200/Module.bsl"
@@ -59,13 +59,15 @@
// ИмяРеквизита - Строка - Имя реквизита объекта или табличной части
// РеквизитыЗаполнения - Структура - Значения реквизитов заполнения создаваемого объекта базы
// - Неопределено
+// ОграничениеТипа - Тип, ОписаниеТипов - Испольуется для ограничения типа составного реквизита, будет сгерерировано значение указанного типа
+// - Неопределено - Будет сгенерировано значение, на основании типа реквизита, если реквизит составной, то будет использован случайный тип
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
-Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено) Экспорт
+Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено, ОграничениеТипа = Неопределено) Экспорт
- ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения);
+ ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения, ОграничениеТипа);
Возврат ЭтотОбъект;
КонецФункции
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/ObjectModule.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/ObjectModule.bsl"
index 78f8800ee..3858f0e7b 100644
--- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/ObjectModule.bsl"
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/ObjectModule.bsl"
@@ -58,12 +58,14 @@
// ИмяРеквизита - Строка - Имя реквизита объекта или табличной части
// РеквизитыЗаполнения - Структура - Значения реквизитов заполнения создаваемого объекта базы
// - Неопределено
+// ОграничениеТипа - Тип, ОписаниеТипов - Испольуется для ограничения типа составного реквизита, будет сгерерировано значение указанного типа
+// - Неопределено - Будет сгенерировано значение, на основании типа реквизита, если реквизит составной, то будет использован случайный тип
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
-Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено) Экспорт
+Функция Фикция(ИмяРеквизита, РеквизитыЗаполнения = Неопределено, ОграничениеТипа = Неопределено) Экспорт
- ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения);
+ ЮТКонструкторТестовыхДанныхСлужебный.Фикция(Контекст, ИмяРеквизита, РеквизитыЗаполнения, ОграничениеТипа);
Возврат ЭтотОбъект;
КонецФункции
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo"
index 19c994e55..f1fd944d9 100644
--- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo"
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo"
@@ -9,7 +9,6 @@
ru
Конструктор тестовых данных
- true
DataProcessor.ЮТКонструкторТестовыхДанных.Form.КлиентскийКонструктор
КлиентскийКонструктор
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\227\320\260\320\277\321\203\321\201\320\272\320\242\320\265\321\201\321\202\320\276\320\262/CommandModule.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\227\320\260\320\277\321\203\321\201\320\272\320\242\320\265\321\201\321\202\320\276\320\262/CommandModule.bsl"
new file mode 100644
index 000000000..df1cbfc5a
--- /dev/null
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\227\320\260\320\277\321\203\321\201\320\272\320\242\320\265\321\201\321\202\320\276\320\262/CommandModule.bsl"
@@ -0,0 +1,35 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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.
+//
+//©///////////////////////////////////////////////////////////////////////////©//
+
+#Область ОбработчикиСобытий
+
+&НаКлиенте
+Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
+
+ ПараметрыОткрытия = Новый Структура("ЗагрузитьТесты", Истина);
+
+ ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.Основная",
+ ПараметрыОткрытия,
+ ПараметрыВыполненияКоманды.Источник,
+ ПараметрыВыполненияКоманды.Уникальность,
+ ПараметрыВыполненияКоманды.Окно,
+ ПараметрыВыполненияКоманды.НавигационнаяСсылка);
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\241\321\204\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217/CommandModule.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\241\321\204\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217/CommandModule.bsl"
new file mode 100644
index 000000000..e8a3aa1d6
--- /dev/null
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Commands/\320\241\321\204\320\276\321\200\320\274\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217/CommandModule.bsl"
@@ -0,0 +1,33 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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.
+//
+//©///////////////////////////////////////////////////////////////////////////©//
+
+#Область ОбработчикиСобытий
+
+&НаКлиенте
+Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды)
+
+ ОткрытьФорму("Обработка.ЮТЮнитТесты.Форма.СозданиеНастройки",
+ ,
+ ПараметрыВыполненияКоманды.Источник,
+ ПараметрыВыполненияКоманды.Уникальность,
+ ПараметрыВыполненияКоманды.Окно,
+ ПараметрыВыполненияКоманды.НавигационнаяСсылка);
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/ConditionalAppearance.dcssca" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/ConditionalAppearance.dcssca"
index 2f5f3c51a..6913bcce3 100644
--- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/ConditionalAppearance.dcssca"
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/ConditionalAppearance.dcssca"
@@ -126,7 +126,7 @@
-
ДеревоТестов.ВремяВыполнения
Greater
- 1
+ 1000
-
@@ -139,7 +139,7 @@
-
ДеревоТестов.ВремяВыполнения
Greater
- 10
+ 10000
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Form.form" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Form.form"
index 471d5e806..c18a45d3a 100644
--- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Form.form"
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Form.form"
@@ -3,9 +3,233 @@
ОсновнаяКоманднаяПанель
122
+
+ ГруппаЗапуск
+ 140
+
+ ЗапуститьВсеТестыОсновная
+ 138
+ true
+ true
+
+ true
+
+
+ ЗапуститьВсеТестыОсновнаяРасширеннаяПодсказка
+ 139
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.Command.ЗапуститьВсеТесты
+ Auto
+ true
+ true
+ UserCmds
+ Auto
+
+
+ ГруппаМенюЗапуск
+ 134
+
+ ПерезапуститьУпавшиеТесты
+ 136
+
+ ru
+ Упавшие тесты
+
+ true
+ true
+
+ true
+
+
+ ПерезапуститьУпавшиеТестыРасширеннаяПодсказка
+ 137
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.Command.ПерезапуститьУпавшиеТесты
+ Auto
+ true
+ true
+ UserCmds
+ Auto
+
+
+ ЗапуститьВсеТесты
+ 126
+
+ ru
+ Все тесты
+
+ true
+ true
+
+ true
+
+
+ ЗапуститьВсеТестыРасширеннаяПодсказка
+ 127
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.Command.ЗапуститьВсеТесты
+ Auto
+ true
+ true
+ UserCmds
+ Auto
+
+
+ ЗапуститьВыделенныеТесты
+ 142
+ true
+ true
+
+ true
+
+
+ ЗапуститьВыделенныеТестыРасширеннаяПодсказка
+ 143
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.Command.ЗапуститьВыделенныеТесты
+ Auto
+ true
+ true
+ UserCmds
+ Auto
+
+
+ ЗамерВремениВыполнения
+ 128
+ true
+ true
+
+ true
+
+
+ ЗамерВремениВыполненияРасширеннаяПодсказка
+ 129
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.Command.ЗамерВремениВыполнения
+ Auto
+ true
+ true
+ true
+ UserCmds
+ Auto
+
+ true
+ true
+
+ true
+
+
+ ru
+
+
+
+ ГруппаМенюЗапускРасширеннаяПодсказка
+ 135
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Popup
+
+
+
+
+ true
+ true
+
+ true
+
+
+ ru
+ Группа1
+
+
+ ГруппаЗапускРасширеннаяПодсказка
+ 141
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ Compact
+
+
ФормаСформироватьНастройки
- 125
+ 17
true
true
@@ -596,12 +820,45 @@
ДеревоТестовКонтекстноеМеню
31
+
+ ДеревоТестовКонтекстноеМенюЗапуститьВыделенныеТесты
+ 130
+
+ ru
+ Запустить выбранные тесты
+
+ true
+ true
+
+ true
+
+
+ ДеревоТестовКонтекстноеМенюЗапуститьВыделенныеТестыРасширеннаяПодсказка
+ 131
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+ Form.Command.ЗапуститьВыделенныеТесты
+ Auto
+ true
+ true
+ UserCmds
+ Auto
+
true
true
true
- true
Tree
true
@@ -625,6 +882,8 @@
CommonPicture.ЮТЭлементыТестов
+ None
+ None
ГруппаДанныеОшибок
@@ -1106,6 +1365,10 @@
OnCreateAtServer
ПриСозданииНаСервере
+
+ OnOpen
+ ПриОткрытии
+
true
true
Vertical
@@ -1150,7 +1413,7 @@
ru
Представление
- 4
+ 12
String
@@ -1168,7 +1431,7 @@
ru
Состояние
- 6
+ 20
String
@@ -1403,10 +1666,10 @@
- АдресДанных
+ АдресОтчета
ru
- Адрес данных
+ Адрес отчета
16
@@ -1440,6 +1703,23 @@
true
+
+ ЗагрузитьТестыПриОткрытии
+
+ ru
+ Загрузить тесты при открытии
+
+ 125
+
+ Boolean
+
+
+ true
+
+
+ true
+
+
Сравнить
@@ -1471,11 +1751,99 @@
+
+ StdPicture.ReportSettings
+
СформироватьНастройки
+ TextPicture
+ DontUse
+
+
+ ЗапуститьВсеТесты
+
+ ru
+ Запустить все тесты
+
+ 3
+
+
+ StdPicture.GenerateReport
+
+
+
+ ЗапуститьВсеТесты
+
+
+ TextPicture
+ DontUse
+
+
+ ЗамерВремениВыполнения
+
+ ru
+ Замер времени выполнения
+
+ 4
+
+
+ StdPicture.BusinessProcessStart
+
+
+
+ ЗамерВремениВыполнения
+
+
+ TextPicture
+ DontUse
+
+
+ ЗапуститьВыделенныеТесты
+
+ ru
+ Выбранные тесты
+
+ 5
+
+
+ StdPicture.GenerateReport
+
+
+
+ ЗапуститьВыделенныеТесты
+
+
+ TextPicture
+ DontUse
+
+
+ ПерезапуститьУпавшиеТесты
+
+ ru
+ Перезапустить упавшие тесты
+
+ 6
+
+
+ CommonPicture.ЮТУпал
+
+
+
+ ПерезапуститьУпавшиеТесты
+
+
+ TextPicture
DontUse
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Module.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Module.bsl"
index 11be3a052..d86639e43 100644
--- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Module.bsl"
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\236\321\201\320\275\320\276\320\262\320\275\320\260\321\217/Module.bsl"
@@ -16,22 +16,40 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
+#Область ОписаниеПеременных
+
+&НаКлиенте
+Перем ИсполняемыеТестовыеМодули;
+
+&НаКлиенте
+Перем ПараметрыЗапускаТестирования;
+
+#КонецОбласти
+
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Параметры.Свойство("АдресХранилища") И ЭтоАдресВременногоХранилища(Параметры.АдресХранилища) Тогда
-
- ОтобразитьРезультатыТестирования(Параметры.АдресХранилища);
-
+ АдресОтчета = Параметры.АдресХранилища;
КонецЕсли;
+ Параметры.Свойство("ЗагрузитьТесты", ЗагрузитьТестыПриОткрытии);
+
КонецПроцедуры
-#КонецОбласти
-
-#Область ОбработчикиСобытийЭлементовШапкиФормы
+&НаКлиенте
+Процедура ПриОткрытии(Отказ)
+
+ Если ЗначениеЗаполнено(АдресОтчета) Тогда
+ ДанныеОтчета = ДанныеОтчета(АдресОтчета);
+ ПослеЗагрузкиТестов(ДанныеОтчета.РезультатыТестирования, ДанныеОтчета.ПараметрыЗапуска);
+ ИначеЕсли ЗагрузитьТестыПриОткрытии Тогда
+ ЗагрузитьТесты();
+ КонецЕсли;
+
+КонецПроцедуры
#КонецОбласти
@@ -90,67 +108,114 @@
КонецПроцедуры
+&НаКлиенте
+Процедура ЗамерВремениВыполнения(Команда)
+
+ Обработчик = Новый ОписаниеОповещения("ПослеВодаКоличестваИтерацийЗамера", ЭтотОбъект);
+ ПоказатьВводЧисла(Обработчик, 100, "Укажите количество итераций замера", 3, 0);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗапуститьВсеТесты(Команда)
+
+ ВыполнитьТестовыеМодули(ИсполняемыеТестовыеМодули);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПерезапуститьУпавшиеТесты(Команда)
+
+ СтатусыИсполненияТеста = ЮТФабрика.СтатусыИсполненияТеста();
+ Статусы = ЮТОбщий.ЗначениеВМассиве(СтатусыИсполненияТеста.Ошибка, СтатусыИсполненияТеста.Сломан);
+
+ Модули = МодулиСоответствующиеСтатусу(Статусы);
+ ВыполнитьТестовыеМодули(Модули);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ЗапуститьВыделенныеТесты(Команда)
+
+ Модули = ВыделенныеТестовыеМодули();
+ ВыполнитьТестовыеМодули(Модули);
+
+КонецПроцедуры
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
-&НаСервере
-Процедура ОтобразитьРезультатыТестирования(АдресХранилища)
+#Область ВыводОтчета
+
+&НаСервереБезКонтекста
+Функция ДанныеОтчета(Знач АдресХранилища)
Данные = ПолучитьИзВременногоХранилища(АдресХранилища);
УдалитьИзВременногоХранилища(АдресХранилища);
- РезультатТестирования = Данные.РезультатыТестирования;
+ Возврат Данные;
+
+КонецФункции
+
+&НаКлиенте
+Процедура ОтобразитьРезультатТеста(СтрокаТеста, Тест, Набор)
+
+ СтрокаТеста.Представление = Тест.Имя;
+ СтрокаТеста.Контекст = НормализоватьКонтекст(Набор.Режим);
+ СтрокаТеста.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Тест.Длительность);
+ СтрокаТеста.ВремяВыполнения = Тест.Длительность;
+ СтрокаТеста.Состояние = Тест.Статус;
+ СтрокаТеста.ТипОбъекта = 3;
+ СтрокаТеста.Иконка = КартинкаСтатуса(Тест.Статус);
+
+ ЗаполнитьОшибки(СтрокаТеста, Тест);
+
+КонецПроцедуры
+
+&НаКлиенте
+Функция ОбновитьСтатистикуНабора(СтрокаНабора)
+
+ СтатистикаНабора = СтатистикаНабора(СтрокаНабора);
Статусы = ЮТФабрика.СтатусыИсполненияТеста();
+ Если СтатистикаНабора.Сломано Тогда
+ СтрокаНабора.Состояние = Статусы.Сломан;
+ ИначеЕсли СтатистикаНабора.Упало Тогда
+ СтрокаНабора.Состояние = Статусы.Ошибка;
+ ИначеЕсли СтатистикаНабора.Пропущено Тогда
+ СтрокаНабора.Состояние = Статусы.Пропущен;
+ ИначеЕсли СтатистикаНабора.Неизвестно Тогда
+ СтрокаНабора.Состояние = Статусы.Ошибка;
+ ИначеЕсли СтатистикаНабора.Ожидание Тогда
+ СтрокаНабора.Состояние = Статусы.Ожидание;
+ Иначе
+ СтрокаНабора.Состояние = Статусы.Успешно;
+ КонецЕсли;
+
+ СтрокаНабора.Прогресс = ГрафическоеПредставлениеСтатистики(СтатистикаНабора);
+ СтрокаНабора.Иконка = КартинкаСтатуса(СтрокаНабора.Состояние);
+
+ СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(СтатистикаНабора.Продолжительность);
+ СтрокаНабора.ВремяВыполнения = СтатистикаНабора.Продолжительность;
+
+ Возврат СтатистикаНабора;
+
+КонецФункции
+
+&НаКлиенте
+Процедура ОбновитьОбщуюСтатистику(ОбновлятьСтатистикуНаборов)
+
ОбщаяСтатистика = Статистика();
- Для Каждого Набор Из РезультатТестирования Цикл
-
- СтрокаНабора = ДеревоТестов.ПолучитьЭлементы().Добавить();
- СтрокаНабора.Набор = Истина;
- СтрокаНабора.Представление = Набор.Представление;
- СтрокаНабора.Контекст = НормализоватьКонтекст(Набор.Режим);
- СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Набор.Длительность);
- СтрокаНабора.ВремяВыполнения = Набор.Длительность / 1000;
- СтрокаНабора.ТипОбъекта = 2;
-
- ЗаполнитьОшибки(СтрокаНабора, Набор);
-
- СтатистикаНабора = Статистика();
-
- Для Каждого Тест Из Набор.Тесты Цикл
-
- СтрокаТеста = СтрокаНабора.ПолучитьЭлементы().Добавить();
- СтрокаТеста.Представление = Тест.Имя;
- СтрокаТеста.Контекст = НормализоватьКонтекст(Набор.Режим);
- СтрокаТеста.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Тест.Длительность);
- СтрокаТеста.ВремяВыполнения = Тест.Длительность / 1000;
- СтрокаТеста.Состояние = Тест.Статус;
- СтрокаТеста.ТипОбъекта = 3;
-
- СтрокаТеста.Иконка = КартинкаСтатуса(Тест.Статус);
- ЗаполнитьОшибки(СтрокаТеста, Тест);
- ИнкрементСтатистики(СтатистикаНабора, Тест.Статус, Статусы);
-
- КонецЦикла;
+ Для Каждого СтрокаНабора Из ДеревоТестов.ПолучитьЭлементы() Цикл
- Если СтатистикаНабора.Сломано Тогда
- СтрокаНабора.Состояние = Статусы.Сломан;
- ИначеЕсли СтатистикаНабора.Упало Тогда
- СтрокаНабора.Состояние = Статусы.Ошибка;
- ИначеЕсли СтатистикаНабора.Пропущено Тогда
- СтрокаНабора.Состояние = Статусы.Пропущен;
- ИначеЕсли СтатистикаНабора.Неизвестно Тогда
- СтрокаНабора.Состояние = Статусы.Ошибка;
+ Если ОбновлятьСтатистикуНаборов Тогда
+ СтатистикаНабора = ОбновитьСтатистикуНабора(СтрокаНабора);
Иначе
- СтрокаНабора.Состояние = Статусы.Успешно;
+ СтатистикаНабора = СтатистикаНабора(СтрокаНабора);
КонецЕсли;
- СтрокаНабора.Прогресс = ГрафическоеПредставлениеСтатистики(СтатистикаНабора);
-
- СтрокаНабора.Иконка = КартинкаСтатуса(СтрокаНабора.Состояние);
-
Для Каждого Элемент Из СтатистикаНабора Цикл
ЮТОбщий.Инкремент(ОбщаяСтатистика[Элемент.Ключ], Элемент.Значение);
КонецЦикла;
@@ -158,10 +223,27 @@
КонецЦикла;
Элементы.СтатистикаВыполнения.Заголовок = ПредставлениеСтатистики(ОбщаяСтатистика);
-
+
КонецПроцедуры
-&НаСервереБезКонтекста
+&НаКлиенте
+Функция СтатистикаНабора(СтрокаНабора)
+
+ СтатистикаНабора = Статистика();
+ Статусы = ЮТФабрика.СтатусыИсполненияТеста();
+
+ Для Каждого СтрокаТеста Из СтрокаНабора.ПолучитьЭлементы() Цикл
+
+ ИнкрементСтатистики(СтатистикаНабора, СтрокаТеста.Состояние, Статусы);
+ ЮТОбщий.Инкремент(СтатистикаНабора.Продолжительность, СтрокаТеста.ВремяВыполнения);
+
+ КонецЦикла;
+
+ Возврат СтатистикаНабора;
+
+КонецФункции
+
+&НаКлиентеНаСервереБезКонтекста
Процедура ЗаполнитьОшибки(СтрокаДерева, ОписаниеОбъекта)
Для Каждого Ошибка Из ОписаниеОбъекта.Ошибки Цикл
@@ -176,7 +258,7 @@
КонецПроцедуры
-&НаСервереБезКонтекста
+&НаКлиенте
Функция Статистика()
Статистика = Новый Структура();
@@ -185,13 +267,15 @@
Статистика.Вставить("Упало", 0);
Статистика.Вставить("Сломано", 0);
Статистика.Вставить("Пропущено", 0);
+ Статистика.Вставить("Ожидание", 0);
Статистика.Вставить("Неизвестно", 0);
+ Статистика.Вставить("Продолжительность", 0);
Возврат Статистика;
КонецФункции
-&НаСервереБезКонтекста
+&НаКлиентеНаСервереБезКонтекста
Функция НормализоватьКонтекст(Контекст)
Если СтрНачинаетсяС(Контекст, "Клиент") Тогда
@@ -202,7 +286,7 @@
КонецФункции
-&НаСервереБезКонтекста
+&НаКлиентеНаСервереБезКонтекста
Процедура ИнкрементСтатистики(Статистика, Статус, Знач Статусы = Неопределено)
Если Статусы = Неопределено Тогда
@@ -227,6 +311,10 @@
ЮТОбщий.Инкремент(Статистика.Пропущено);
+ ИначеЕсли Статус = Статусы.Ожидание Тогда
+
+ ЮТОбщий.Инкремент(Статистика.Ожидание);
+
Иначе
ЮТОбщий.Инкремент(Статистика.Неизвестно);
@@ -235,6 +323,8 @@
КонецПроцедуры
+#КонецОбласти
+
#Область Интерфейсное
&НаСервереБезКонтекста
@@ -272,7 +362,13 @@
БлокиСтатистики = Новый Массив();
Разделитель = "; ";
- БлокиСтатистики.Добавить(СтрШаблон("Тестов: %1/%2", Статистика.Всего, Статистика.Всего - Статистика.Пропущено));
+ БлокиСтатистики.Добавить(СтрШаблон("Тестов: %1/%2", Статистика.Всего - Статистика.Пропущено - Статистика.Ожидание, Статистика.Всего));
+
+ Если Статистика.Ожидание Тогда
+ БлокиСтатистики.Добавить(Разделитель);
+ БлокиСтатистики.Добавить(БиблиотекаКартинок.ЮТНеизвестный);
+ БлокиСтатистики.Добавить(" Ожидание: " + Статистика.Ожидание);
+ КонецЕсли;
Если Статистика.Пропущено Тогда
БлокиСтатистики.Добавить(Разделитель);
@@ -298,6 +394,9 @@
БлокиСтатистики.Добавить(" Неизвестно: " + Статистика.Неизвестно);
КонецЕсли;
+ БлокиСтатистики.Добавить(Разделитель);
+ БлокиСтатистики.Добавить(" Время выполнения: " + ЮТОбщий.ПредставлениеПродолжительности(Статистика.Продолжительность));
+
Возврат Новый ФорматированнаяСтрока(БлокиСтатистики);
КонецФункции
@@ -315,11 +414,14 @@
Функция БлокиСтатистики(Статистика)
Блоки = Новый Массив();
- Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Успешно, "25AE88"));
- Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Пропущено, "999999"));
- Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Упало, "EFCE4A"));
- Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Сломано, "D75A4A"));
- Блоки.Добавить(Новый Структура("Количество, Цвет", Статистика.Неизвестно, "9400d3"));
+ Ключи = "Количество, Цвет";
+
+ Блоки.Добавить(Новый Структура(Ключи, Статистика.Успешно, "25AE88"));
+ Блоки.Добавить(Новый Структура(Ключи, Статистика.Пропущено, "999999"));
+ Блоки.Добавить(Новый Структура(Ключи, Статистика.Упало, "EFCE4A"));
+ Блоки.Добавить(Новый Структура(Ключи, Статистика.Сломано, "D75A4A"));
+ Блоки.Добавить(Новый Структура(Ключи, Статистика.Ожидание, "BBBBBB"));
+ Блоки.Добавить(Новый Структура(Ключи, Статистика.Неизвестно, "9400d3"));
Сдвиг = 0;
Высота = 20;
@@ -348,6 +450,233 @@
#КонецОбласти
+#Область ЗагрузкаТестов
+
+&НаКлиенте
+Процедура ЗагрузитьТесты()
+
+ ПараметрыЗапуска = ПараметрыЗапуска();
+
+ ПараметрыЗагрузки = ЮТИсполнительКлиент.ПараметрыИсполнения();
+ ПараметрыЗагрузки.Цепочка.Добавить(Новый ОписаниеОповещения("ПослеЗагрузкиТестов", ЭтотОбъект, ПараметрыЗапуска));
+ ПараметрыЗагрузки.ПараметрыЗапуска = ПараметрыЗапуска;
+
+ ЮТСобытия.Инициализация(ПараметрыЗагрузки.ПараметрыЗапуска);
+ ЮТИсполнительКлиент.ОбработчикЗагрузитьТесты(Неопределено, ПараметрыЗагрузки);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПослеЗагрузкиТестов(Результат, ПараметрыЗапуска) Экспорт
+
+ ИсполняемыеТестовыеМодули = Результат;
+ ПараметрыЗапускаТестирования = ПараметрыЗапуска;
+
+ Для Каждого ТестовыйМодуль Из ИсполняемыеТестовыеМодули Цикл
+
+ Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
+
+ СтрокаНабора = ДеревоТестов.ПолучитьЭлементы().Добавить();
+ СтрокаНабора.Набор = Истина;
+ СтрокаНабора.Представление = Набор.Представление;
+ СтрокаНабора.Контекст = НормализоватьКонтекст(Набор.Режим);
+ СтрокаНабора.ПредставлениеВремяВыполнения = ЮТОбщий.ПредставлениеПродолжительности(Набор.Длительность);
+ СтрокаНабора.ВремяВыполнения = Набор.Длительность;
+ СтрокаНабора.ТипОбъекта = 2;
+
+ ЗаполнитьОшибки(СтрокаНабора, Набор);
+
+ Набор.Вставить("Идентификатор", СтрокаНабора.ПолучитьИдентификатор());
+
+ Для Каждого Тест Из Набор.Тесты Цикл
+
+ СтрокаТеста = СтрокаНабора.ПолучитьЭлементы().Добавить();
+
+ ОтобразитьРезультатТеста(СтрокаТеста, Тест, Набор);
+
+ Тест.Вставить("Идентификатор", СтрокаТеста.ПолучитьИдентификатор());
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ ОбновитьОбщуюСтатистику(Истина);
+
+ ЮТКонтекст.УдалитьКонтекст();
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ЗапускТестов
+
+&НаКлиенте
+Процедура ВыполнитьТестовыеМодули(Модули)
+
+ Если Модули.Количество() = 0 Тогда
+ ПоказатьПредупреждение(, "Нет тестов для запуска");
+ Возврат;
+ КонецЕсли;
+
+ ОповещениеПользователю("Прогон тестов", "Запушено выполнение тестов");
+
+ ЮТСобытия.Инициализация(ПараметрыЗапускаТестирования);
+ ЮТСобытия.ПослеФормированияИсполняемыхНаборовТестов(Модули);
+ ЮТСобытия.ПередВыполнениемТестов(Модули);
+
+ Для Каждого Модуль Из Модули Цикл
+
+ Результат = ЮТИсполнительКлиент.ВыполнитьТестыМодуля(Модуль);
+
+ Для Каждого Набор Из Результат.НаборыТестов Цикл
+
+ Для Каждого Тест Из Набор.Тесты Цикл
+
+ Строка = ДеревоТестов.НайтиПоИдентификатору(Тест.Идентификатор);
+ ОтобразитьРезультатТеста(Строка, Тест, Набор);
+
+ КонецЦикла;
+
+ Строка = ДеревоТестов.НайтиПоИдентификатору(Набор.Идентификатор);
+ ОбновитьСтатистикуНабора(Строка);
+
+ КонецЦикла;
+
+ КонецЦикла;
+
+ ОбновитьОбщуюСтатистику(Ложь);
+
+ ЮТКонтекст.УдалитьКонтекст();
+
+ ОповещениеПользователю("Прогон тестов завершен", "Завершено выполнение тестов");
+
+КонецПроцедуры
+
+&НаКлиенте
+Функция ВыделенныеТестовыеМодули()
+
+ МодулиКЗапуску = Новый Массив();
+
+ ВыделенныеСтроки = Элементы.ДеревоТестов.ВыделенныеСтроки;
+
+ Если ВыделенныеСтроки.Количество() = 0 Тогда
+ Возврат МодулиКЗапуску;
+ КонецЕсли;
+
+ Для Каждого Модуль Из ИсполняемыеТестовыеМодули Цикл
+
+ НаборыКЗапуску = Новый Массив();
+
+ Для Каждого Набор Из Модуль.НаборыТестов Цикл
+
+ Если ВыделенныеСтроки.Найти(Набор.Идентификатор) <> Неопределено Тогда
+ НаборыКЗапуску.Добавить(Набор);
+ Продолжить;
+ КонецЕсли;
+
+ ТестыКЗапуску = Новый Массив();
+
+ Для Каждого Тест Из Набор.Тесты Цикл
+ Если ВыделенныеСтроки.Найти(Тест.Идентификатор) <> Неопределено Тогда
+ ТестыКЗапуску.Добавить(Тест);
+ КонецЕсли;
+ КонецЦикла;
+
+ Если ТестыКЗапуску.Количество() Тогда
+ ЗапускаемыйНабор = ЮТОбщий.СкопироватьСтруктуру(Набор);
+ ЗапускаемыйНабор.Тесты = ТестыКЗапуску;
+ НаборыКЗапуску.Добавить(ЗапускаемыйНабор);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если НаборыКЗапуску.Количество() Тогда
+
+ ЗапускаемыйМодуль = ЮТОбщий.СкопироватьСтруктуру(Модуль);
+ ЗапускаемыйМодуль.НаборыТестов = НаборыКЗапуску;
+ МодулиКЗапуску.Добавить(ЗапускаемыйМодуль);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат МодулиКЗапуску;
+
+КонецФункции
+
+&НаКлиенте
+Функция МодулиСоответствующиеСтатусу(Статусы)
+
+ МодулиКЗапуску = Новый Массив();
+
+ ВыделенныеСтроки = Элементы.ДеревоТестов.ВыделенныеСтроки;
+
+ Если ВыделенныеСтроки.Количество() = 0 Тогда
+ Возврат МодулиКЗапуску;
+ КонецЕсли;
+
+ Для Каждого Модуль Из ИсполняемыеТестовыеМодули Цикл
+
+ НаборыКЗапуску = Новый Массив();
+
+ Для Каждого Набор Из Модуль.НаборыТестов Цикл
+
+ ТестыКЗапуску = Новый Массив();
+
+ Для Каждого Тест Из Набор.Тесты Цикл
+ Если Статусы.Найти(Тест.Статус) <> Неопределено Тогда
+ ТестыКЗапуску.Добавить(Тест);
+ КонецЕсли;
+ КонецЦикла;
+
+ Если ТестыКЗапуску.Количество() Тогда
+ ЗапускаемыйНабор = ЮТОбщий.СкопироватьСтруктуру(Набор);
+ ЗапускаемыйНабор.Тесты = ТестыКЗапуску;
+ НаборыКЗапуску.Добавить(ЗапускаемыйНабор);
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Если НаборыКЗапуску.Количество() Тогда
+
+ ЗапускаемыйМодуль = ЮТОбщий.СкопироватьСтруктуру(Модуль);
+ ЗапускаемыйМодуль.НаборыТестов = НаборыКЗапуску;
+ МодулиКЗапуску.Добавить(ЗапускаемыйМодуль);
+
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Возврат МодулиКЗапуску;
+
+КонецФункции
+
+&НаКлиенте
+Процедура ВыполнитьЗапускТестовПоПараметрам(ПараметрыЗапуска, Обработчик)
+
+ ЮТИсполнительКлиент.ВыполнитьМодульноеТестированиеПоНастройке(ПараметрыЗапуска, Обработчик);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область ПараметрыЗапуска
+
+&НаКлиенте
+Функция ПараметрыЗапуска()
+
+ ПараметрыЗапуска = ЮТФабрика.ПараметрыЗапуска();
+ ПараметрыЗапуска.closeAfterTests = Ложь;
+ ПараметрыЗапуска.showReport = Ложь;
+ ПараметрыЗапуска.ВыполнятьМодульноеТестирование = Истина;
+
+ Возврат ПараметрыЗапуска;
+
+КонецФункции
+
+#КонецОбласти
&НаКлиенте
Процедура ОбновитьДоступностьСравнения()
@@ -356,4 +685,74 @@
КонецПроцедуры
+&НаКлиенте
+Процедура ПослеВодаКоличестваИтерацийЗамера(Результат, ДополнительныеПараметры) Экспорт
+
+ Если НЕ ЗначениеЗаполнено(Результат) Тогда
+ Возврат;
+ КонецЕсли;
+
+ ПараметрыЗамера = Новый Структура();
+ ПараметрыЗамера.Вставить("ПараметрыЗапуска", ПараметрыЗапуска());
+ ПараметрыЗамера.Вставить("КоличествоИтераций", Результат);
+ ПараметрыЗамера.Вставить("ТекущаяИтерация", 0);
+ ПараметрыЗамера.Вставить("Замеры", Новый Массив());
+ ПараметрыЗамера.Вставить("НачалоИтерации");
+
+ ПослеВыполненияИтерации(Неопределено, ПараметрыЗамера);
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ПослеВыполненияИтерации(Результат, ПараметрыЗамера) Экспорт
+
+ Если ПараметрыЗамера.ТекущаяИтерация > 0 Тогда
+ Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - ПараметрыЗамера.НачалоИтерации;
+ ПараметрыЗамера.Замеры.Добавить(Длительность);
+ КонецЕсли;
+
+ Если ЮТОбщий.Инкремент(ПараметрыЗамера.ТекущаяИтерация) <= ПараметрыЗамера.КоличествоИтераций Тогда
+
+ Обработчик = Новый ОписаниеОповещения("ПослеВыполненияИтерации", ЭтотОбъект, ПараметрыЗамера);
+ ПараметрыЗамера.НачалоИтерации = ТекущаяУниверсальнаяДатаВМиллисекундах();
+ ВыполнитьЗапускТестовПоПараметрам(ПараметрыЗамера.ПараметрыЗапуска, Обработчик);
+
+ Иначе
+
+ ОбщееВремя = 0;
+ Для Каждого Замер Из ПараметрыЗамера.Замеры Цикл
+ ЮТОбщий.Инкремент(ОбщееВремя, Замер);
+ КонецЦикла;
+
+ Список = Новый СписокЗначений();
+ Список.ЗагрузитьЗначения(ПараметрыЗамера.Замеры);
+ Список.СортироватьПоЗначению();
+
+ ОбщееВремя = Окр(ОбщееВремя / 1000, 2);
+ СреднееВремя = Окр(ОбщееВремя / ПараметрыЗамера.Замеры.Количество(), 2);
+ МедианноеВремя = Окр(Список[Цел(Список.Количество() / 2) + 1].Значение / 1000, 2);
+
+ Сообщение = СтрШаблон("Количество итераций: %1
+ |Общее время: %2 сек
+ |Среднее время: %3 сек
+ |Медианное время: %4 сек", ПараметрыЗамера.Замеры.Количество(), ОбщееВремя, СреднееВремя, МедианноеВремя);
+
+ ЮТОбщий.СообщитьПользователю(Сообщение);
+
+ КонецЕсли;
+
+КонецПроцедуры
+
+&НаКлиенте
+Процедура ОповещениеПользователю(Текст, Пояснение)
+
+ ПоказатьОповещениеПользователя(Текст,
+ ,
+ Пояснение,
+ БиблиотекаКартинок.ЮТПодсистема,
+ СтатусОповещенияПользователя.Важное,
+ УникальныйИдентификатор);
+
+КонецПроцедуры
+
#КонецОбласти
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Form.form" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Form.form"
index 8520786b0..f0763784d 100644
--- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Form.form"
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Form.form"
@@ -517,7 +517,7 @@
ВыводЛога
- 66
+ 26
true
true
@@ -659,6 +659,49 @@
DontUse
+
+ ЛогированиеВКонсоль
+ 84
+ true
+ true
+
+ true
+
+
+ ЛогированиеВКонсоль
+
+
+ ЛогированиеВКонсольРасширеннаяПодсказка
+ 86
+ true
+ true
+
+ true
+
+ Label
+ true
+ true
+
+ Left
+
+
+
+ ЛогированиеВКонсольКонтекстноеМеню
+ 85
+ true
+ true
+
+ true
+
+ true
+
+ CheckBoxField
+ Enter
+ true
+ Left
+ true
+
+
ФайлКонфигурации
55
@@ -1073,7 +1116,7 @@
ИмяФайлаЛога
ru
- Отладочные сообщения
+ Логирование в файл
61
@@ -1152,6 +1195,23 @@
ИмяФайлаОтчета
+
+ ЛогированиеВКонсоль
+
+ ru
+ Логирование в консоль
+
+ 66
+
+ Boolean
+
+
+ true
+
+
+ true
+
+
УстановитьФлажки
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Module.bsl" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Module.bsl"
index f690eacaf..f5386f475 100644
--- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Module.bsl"
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/Forms/\320\241\320\276\320\267\320\264\320\260\320\275\320\270\320\265\320\235\320\260\321\201\321\202\321\200\320\276\320\271\320\272\320\270/Module.bsl"
@@ -323,8 +323,7 @@
#КонецЕсли
ПутьЗапускаемогоКлиента = ЮТФайлы.ОбъединитьПути(КаталогПрограммы(), Файл);
- Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнформация.ТипПлатформы
- = ТипПлатформы.Windows_x86_64 Тогда
+ Если СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86 Или СистемнаяИнформация.ТипПлатформы = ТипПлатформы.Windows_x86_64 Тогда
ПутьЗапускаемогоКлиента = ПутьЗапускаемогоКлиента + ".exe";
КонецЕсли;
@@ -427,8 +426,8 @@
Конфигурация.closeAfterTests = Истина;
Конфигурация.reportPath = ИмяФайлаОтчета;
- Конфигурация.logging.enable = ЗначениеЗаполнено(ИмяФайлаЛога);
Конфигурация.logging.file = ИмяФайлаЛога;
+ Конфигурация.logging.console = ЛогированиеВКонсоль;
Если ЗначениеЗаполнено(ИмяФайлаКодаВозврата) Тогда
Конфигурация.exitCode = ИмяФайлаКодаВозврата;
@@ -538,6 +537,7 @@
ДобавитьОтмеченныеТесты(Строка.ПолучитьЭлементы(), Тесты);
КонецЕсли;
КонецЦикла;
+
КонецПроцедуры
#КонецОбласти
diff --git "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213.mdo" "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213.mdo"
index d1cb4e19f..943d35224 100644
--- "a/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213.mdo"
+++ "b/exts/yaxunit/src/DataProcessors/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213/\320\256\320\242\320\256\320\275\320\270\321\202\320\242\320\265\321\201\321\202\321\213.mdo"
@@ -1,5 +1,5 @@
-
+
@@ -7,9 +7,8 @@
ЮТЮнитТесты
ru
- Юнит тесты
+ Юнит-тесты
- true
DataProcessor.ЮТЮнитТесты.Form.Основная
Основная
@@ -54,4 +53,25 @@
TextDocument
+
+ ЗапускТестов
+
+ ru
+ Запуск тестирования
+
+ NavigationPanelImportant
+ PictureAndText
+
+ CommonPicture.ЮТПодсистема
+
+
+
+ СформироватьНастройкиТестирования
+
+ ru
+ Сформировать настройки тестирования
+
+ NavigationPanelOrdinary
+ Auto
+
diff --git "a/exts/yaxunit/src/Subsystems/\320\256\320\242\320\244\321\203\320\275\320\272\321\206\320\270\320\276\320\275\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\214/Subsystems/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.mdo" "b/exts/yaxunit/src/Subsystems/\320\256\320\242\320\244\321\203\320\275\320\272\321\206\320\270\320\276\320\275\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\214/Subsystems/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.mdo"
index 0e0a76b65..8d6ab383c 100644
--- "a/exts/yaxunit/src/Subsystems/\320\256\320\242\320\244\321\203\320\275\320\272\321\206\320\270\320\276\320\275\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\214/Subsystems/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.mdo"
+++ "b/exts/yaxunit/src/Subsystems/\320\256\320\242\320\244\321\203\320\275\320\272\321\206\320\270\320\276\320\275\320\260\320\273\321\214\320\275\320\276\321\201\321\202\321\214/Subsystems/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271/\320\256\320\242\320\236\320\261\321\200\320\260\320\261\320\276\321\202\321\207\320\270\320\272\320\270\320\241\320\276\320\261\321\213\321\202\320\270\320\271.mdo"
@@ -8,6 +8,7 @@
true
true
CommonModule.МокитоСлужебный
+ CommonModule.ЮТИсполнительКлиент
CommonModule.ЮТЛогирование
CommonModule.ЮТТестовыеДанныеСлужебный
CommonModule.ЮТУтверждения
diff --git a/fixtures/demo-configuration/src/Configuration/Configuration.mdo b/fixtures/demo-configuration/src/Configuration/Configuration.mdo
index 5e9368721..f6eaab094 100644
--- a/fixtures/demo-configuration/src/Configuration/Configuration.mdo
+++ b/fixtures/demo-configuration/src/Configuration/Configuration.mdo
@@ -91,199 +91,199 @@
Subsystem.Финансы
Subsystem.ТоварныеЗапасы
Subsystem.Интеграция
- StyleItem.ЦветТекстаСущественныхИзмененийДанных
+ StyleItem.ЦветТекстаВажнойИнформации
StyleItem.ЦветТекстаНормальногоСостояния
StyleItem.ЦветТекстаОшибочногоСостояния
+ StyleItem.ЦветТекстаСущественныхИзмененийДанных
StyleItem.ШрифтВажнойИнформации
- StyleItem.ЦветТекстаВажнойИнформации
+ CommonPicture.ВыделитьВажное
+ CommonPicture.КоллекцияВидыАктивныхПользователей
+ CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации
+ CommonPicture.КоллекцияДляПомеченныхНаУдалениеОбъектов
+ CommonPicture.ОткрытьХранимыйФайл
+ CommonPicture.ОтправитьСМС
CommonPicture.ПодсистемаЗакупки
CommonPicture.ПодсистемаПредприятие
CommonPicture.ПодсистемаПродажи
CommonPicture.ПодсистемаТоварныеЗапасы
CommonPicture.ПодсистемаФинансы
- CommonPicture.КоллекцияВидыАктивныхПользователей
- CommonPicture.КоллекцияВидыСобытийЖурналаРегистрации
- CommonPicture.КоллекцияДляПомеченныхНаУдалениеОбъектов
+ CommonPicture.Позвонить
CommonPicture.ПолнотекстовыйПоискДалее
CommonPicture.ПолнотекстовыйПоискНазад
- CommonPicture.ОткрытьХранимыйФайл
- CommonPicture.ВыделитьВажное
CommonPicture.ПроверитьПочту
CommonPicture.СписокЗаказов
- CommonPicture.Позвонить
CommonPicture.ШтрихКод
- CommonPicture.ОтправитьСМС
SessionParameter.ТекущийПользователь
SessionParameter.ЯщикIMAP
Role.Администратор
Role.МенеджерПоЗакупкам
Role.МенеджерПоПродажам
- Role.Продавец
Role.Помощник
+ Role.Продавец
CommonTemplate.ДрайверСканераШтрихкодов
- CommonTemplate.КомпонентаПечатиШтрихкодовWindows32
- CommonTemplate.КомпонентаПечатиШтрихкодовWindows64
CommonTemplate.КомпонентаПечатиШтрихкодовLinux32
CommonTemplate.КомпонентаПечатиШтрихкодовLinux64
+ CommonTemplate.КомпонентаПечатиШтрихкодовWindows32
+ CommonTemplate.КомпонентаПечатиШтрихкодовWindows64
FilterCriterion.ДокументыКонтрагента
- CommonModule.РаботаСТорговымОборудованием
- CommonModule.РаботаСПолнотекстовымПоиском
- CommonModule.РаботаСХранилищемОбщихНастроек
- CommonModule.РегламентныеЗаданияАгрегатов
- CommonModule.СервисныеМеханизмы
- CommonModule.РаботаСПочтой
- CommonModule.РаботаСПочтойВызовСервера
+ CommonModule.ГеопозиционированиеКлиент
+ CommonModule.ГеопозиционированиеСервер
+ CommonModule.Интеграция
+ CommonModule.ИнтеграцияМагазин
CommonModule.ОбменМобильныеОбщее
CommonModule.ОбменМобильныеПереопределяемый
CommonModule.Пользователи
- CommonModule.РаботаСПанельюЗадач
CommonModule.Помощник
CommonModule.ПомощникКлиент
CommonModule.РаботаСИсториейДанных
- CommonModule.ГеопозиционированиеКлиент
- CommonModule.ГеопозиционированиеСервер
+ CommonModule.РаботаСПанельюЗадач
+ CommonModule.РаботаСПолнотекстовымПоиском
+ CommonModule.РаботаСПочтой
+ CommonModule.РаботаСПочтойВызовСервера
+ CommonModule.РаботаСТорговымОборудованием
+ CommonModule.РаботаСХранилищемОбщихНастроек
+ CommonModule.РегистрацияОшибок
+ CommonModule.РегламентныеЗаданияАгрегатов
+ CommonModule.СервисныеМеханизмы
CommonModule.УведомленияКлиент
CommonModule.УведомленияСервер
- CommonModule.Интеграция
- CommonModule.ИнтеграцияМагазин
- CommonModule.РегистрацияОшибок
ExchangePlan.Мобильные
XDTOPackage.ОбменСМобильнымУстройством
WebService.MAExchange
- HTTPService.Товары
HTTPService.ОписанияТоваров
- ScheduledJob.ОбновлениеИндексаППД
- ScheduledJob.СлияниеИндексаППД
+ HTTPService.Товары
ScheduledJob.ОбновлениеАгрегатовПродаж
+ ScheduledJob.ОбновлениеИндексаППД
+ ScheduledJob.ОбновлениеИсторииДанных
ScheduledJob.ПерестроениеАгрегатовПродаж
ScheduledJob.ПомощникНеотработанныеЗаказы
- ScheduledJob.ОбновлениеИсторииДанных
+ ScheduledJob.СлияниеИндексаППД
SettingsStorage.ХранилищеВариантовОтчетов
+ FunctionalOption.ВалютныйУчет
FunctionalOption.РаботаСТорговымОборудованием
FunctionalOption.УчетПоСкладам
- FunctionalOption.ВалютныйУчет
FunctionalOptionsParameter.Организация
- CommonCommand.УстановитьСканерШтрихкодов
CommonCommand.НастроитьСканерШтрихКодов
- CommonCommand.УстановитьРасширениеРаботыСФайлами
- CommonCommand.УстановитьРасширениеРаботыСКриптографией
- CommonCommand.УстановитьВидимостьОбъектовЧерезODataAPI
CommonCommand.ОбщиеНастройки
+ CommonCommand.УстановитьВидимостьОбъектовЧерезODataAPI
+ CommonCommand.УстановитьРасширениеРаботыСКриптографией
+ CommonCommand.УстановитьРасширениеРаботыСФайлами
+ CommonCommand.УстановитьСканерШтрихкодов
CommandGroup.Информация
CommandGroup.Печать
- Constant.РаботаСТорговымОборудованием
- Constant.УчетПоСкладам
- Constant.АдресSMTPСервера
- Constant.ПортSMTP
- Constant.ПользовательSMTP
- Constant.ПарольSMTP
- Constant.АдресPOP3Сервера
- Constant.ПортPOP3
- Constant.ПользовательPOP3
- Constant.ПарольPOP3
- Constant.ТаймаутИнтернетПочты
- Constant.ИмяОтправителяПочтовогоСообщения
- Constant.ПользовательIMAP
- Constant.ПарольIMAP
- Constant.АдресIMAPСервера
- Constant.ПортIMAP
Constant.SSLIMAP
- Constant.ИспользоватьIMAP
Constant.SSLPOP3
Constant.SSLSMTP
- Constant.ТолькоЗащищеннаяАутентификацияIMAP
- Constant.ТолькоЗащищеннаяАутентификацияPOP3
- Constant.ТолькоЗащищеннаяАутентификацияSMTP
- Constant.КодНовогоУзлаПланаОбмена
- Constant.ИспользоватьPushУведомления
+ Constant.АдресIMAPСервера
+ Constant.АдресPOP3Сервера
+ Constant.АдресSMTPСервера
+ Constant.ВоспроизводитьТекстУведомления
+ Constant.ВыборПровайдераГеопозиционирования
+ Constant.ИдентификаторПриложенияWNS
+ Constant.ИмяОтправителяПочтовогоСообщения
+ Constant.ИмяПровайдера
Constant.ИспользоватьAPNS
- Constant.СертификатМобильногоПриложенияIOS
Constant.ИспользоватьGCM
- Constant.НомерПриложенияGoogleCloud
- Constant.КлючCервераОтправителяGCM
+ Constant.ИспользоватьIMAP
+ Constant.ИспользоватьPushУведомления
Constant.ИспользоватьWNS
+ Constant.ИспользоватьСетьПередачиДанных
+ Constant.ИспользоватьСотовуюСеть
+ Constant.ИспользоватьСпутники
+ Constant.КлючCервераОтправителяGCM
Constant.КлючПриложенияWNS
- Constant.МаркерДоступаWNS
- Constant.ИдентификаторПриложенияWNS
+ Constant.КодНовогоУзлаПланаОбмена
Constant.ЛогинСервисаПередачиPushУведомлений
+ Constant.МаркерДоступаWNS
+ Constant.НомерПриложенияGoogleCloud
+ Constant.ПарольIMAP
+ Constant.ПарольPOP3
+ Constant.ПарольSMTP
Constant.ПериодПроверкиНеотработанныхЗаказов
- Constant.ВоспроизводитьТекстУведомления
- Constant.ВыборПровайдераГеопозиционирования
- Constant.ИмяПровайдера
+ Constant.ПользовательIMAP
+ Constant.ПользовательPOP3
+ Constant.ПользовательSMTP
+ Constant.ПортIMAP
+ Constant.ПортPOP3
+ Constant.ПортSMTP
+ Constant.РаботаСТорговымОборудованием
+ Constant.СертификатМобильногоПриложенияIOS
+ Constant.ТаймаутИнтернетПочты
Constant.ТолькоБесплатные
- Constant.ИспользоватьСотовуюСеть
- Constant.ИспользоватьСетьПередачиДанных
- Constant.ИспользоватьСпутники
- CommonForm.ОбщиеНастройки
- CommonForm.НастройкиМобильногоУстройства
+ Constant.ТолькоЗащищеннаяАутентификацияIMAP
+ Constant.ТолькоЗащищеннаяАутентификацияPOP3
+ Constant.ТолькоЗащищеннаяАутентификацияSMTP
+ Constant.УчетПоСкладам
+ CommonForm.Звонок
+ CommonForm.НастройкаPushУведомлений
+ CommonForm.НастройкаПомощникаНеотработанныхЗаказов
CommonForm.НастройкаПочты
+ CommonForm.НастройкиМобильногоУстройства
+ CommonForm.ОбщиеНастройки
CommonForm.ФормаПодбора
- CommonForm.НастройкаПомощникаНеотработанныхЗаказов
- CommonForm.НастройкаPushУведомлений
CommonForm.ФормаПодбораМобильная
- CommonForm.Звонок
- Catalog.Товары
- Catalog.Контрагенты
- Catalog.Склады
+ Catalog.Банки
Catalog.Валюты
- Catalog.Регионы
Catalog.ВидыЦен
- Catalog.РасчетныеСчетаКонтрагентов
- Catalog.ЗначенияХарактеристик
- Catalog.Банки
- Catalog.РасчетныеСчета
- Catalog.ХранимыеФайлы
- Catalog.НастройкиТорговогоОборудования
- Catalog.ХранилищеВариантовОтчетов
- Catalog.Организации
+ Catalog.Встречи
Catalog.ВходящиеПисьма
+ Catalog.ЗначенияХарактеристик
Catalog.ИсходящиеПисьма
- Catalog.ПочтовыеВложения
- Catalog.Пользователи
- Catalog.Встречи
+ Catalog.Контрагенты
Catalog.МобильныеУстройства
Catalog.НастройкиИнтеграции
- Document.ПриходТовара
- Document.РасходТовара
+ Catalog.НастройкиТорговогоОборудования
+ Catalog.Организации
+ Catalog.Пользователи
+ Catalog.ПочтовыеВложения
+ Catalog.РасчетныеСчета
+ Catalog.РасчетныеСчетаКонтрагентов
+ Catalog.Регионы
+ Catalog.Склады
+ Catalog.Товары
+ Catalog.ХранилищеВариантовОтчетов
+ Catalog.ХранимыеФайлы
+ Document.Заказ
+ Document.ОперацияПоУчетуТоваров
Document.Оплата
Document.ПоступлениеДенег
- Document.ОперацияПоУчетуТоваров
- Document.Заказ
- DocumentJournal.ФинансовыеДокументы
+ Document.ПриходТовара
+ Document.РасходТовара
DocumentJournal.ДокументыПродаж
- Enum.ВидыТоваров
- Enum.НазначениеХарактеристик
+ DocumentJournal.ФинансовыеДокументы
+ Enum.PushУведомления
Enum.ВидНастройкиАутентификацииSMTP
- Enum.ВидыМобильныхОтчетов
- Enum.СостоянияЗаказов
Enum.ВидСодержимогоВходящегоПисьма
- Enum.PushУведомления
+ Enum.ВидыМобильныхОтчетов
+ Enum.ВидыТоваров
Enum.ИспользоватьПровайдерГеопозиционирования
- Report.ОстаткиТоваровНаСкладах
+ Enum.НазначениеХарактеристик
+ Enum.СостоянияЗаказов
+ Report.ВзаимосвязьПродажТоваров
Report.ДинамикаПродаж
- Report.ОтчетПоВзаиморасчетам
Report.ДокументыОплата
- Report.ВзаимосвязьПродажТоваров
- DataProcessor.УправлениеПолнотекстовымПоиском
+ Report.ОстаткиТоваровНаСкладах
+ Report.ОтчетПоВзаиморасчетам
DataProcessor.АдминистративныйСервис
+ DataProcessor.ЖурналРегистрации
+ DataProcessor.НастройкиПользователя
DataProcessor.ПроведениеДокументов
DataProcessor.Путеводитель
DataProcessor.СписокАктивныхПользователей
- DataProcessor.ЖурналРегистрации
DataProcessor.УдалениеПомеченныхОбъектов
- DataProcessor.УправлениеНастройкамиФорм
- DataProcessor.НастройкиПользователя
DataProcessor.УправлениеАгрегатамиПродаж
- DataProcessor.ЭлектроннаяПочта
+ DataProcessor.УправлениеНастройкамиФорм
+ DataProcessor.УправлениеПолнотекстовымПоиском
DataProcessor.УправлениеСистемойВзаимодействия
+ DataProcessor.ЭлектроннаяПочта
InformationRegister.КурсыВалют
- InformationRegister.Характеристики
- InformationRegister.ЦеныТоваров
+ InformationRegister.МобильныеОтчеты
InformationRegister.СостояниеВходящихПисем
InformationRegister.СостояниеИсходящихПисем
- InformationRegister.МобильныеОтчеты
- AccumulationRegister.ТоварныеЗапасы
+ InformationRegister.Характеристики
+ InformationRegister.ЦеныТоваров
AccumulationRegister.Взаиморасчеты
AccumulationRegister.Продажи
+ AccumulationRegister.ТоварныеЗапасы
ChartOfCharacteristicTypes.ВидыХарактеристик
diff --git a/sonar-project.properties b/sonar-project.properties
index 2b3a6eee6..95289ab94 100644
--- a/sonar-project.properties
+++ b/sonar-project.properties
@@ -7,7 +7,7 @@ sonar.projectName=YAxUnit
# Since SonarQube 4.2, this property is optional if sonar.modules is set.
# If not set, SonarQube starts looking for source code from the directory containing
# the sonar-project.properties file.
-sonar.sources=./
+sonar.sources=./exts/yaxunit/src
sonar.inclusions=**/*.bsl, **/*.os
# Encoding of the source code. Default is default system encoding
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\236\320\261\321\211\320\270\320\271/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\236\320\261\321\211\320\270\320\271/Module.bsl"
index 2178a095c..a154d3527 100644
--- "a/tests/src/CommonModules/\320\236\320\234_\320\236\320\261\321\211\320\270\320\271/Module.bsl"
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\236\320\261\321\211\320\270\320\271/Module.bsl"
@@ -25,10 +25,32 @@
.ДобавитьТест("ОбъединитьВСтруктуру")
.ДобавитьТест("СформироватьСтрокуСимволов")
.ДобавитьТест("ДанныеСовпадают")
+ .ДобавитьТест("Пауза")
+ .ДобавитьТест("ВывестиВКонсоль")
+ .ДобавитьСерверныйТест("Менеджер")
;
КонецПроцедуры
+Процедура Пауза() Экспорт
+
+ Начало = ТекущаяУниверсальнаяДатаВМиллисекундах();
+ ЮТОбщий.Пауза(1);
+ ЮТОбщий.Пауза(1);
+ ЮТОбщий.Пауза(1);
+ Дельта = ТекущаяУниверсальнаяДатаВМиллисекундах() - Начало;
+
+ ЮТест.ОжидаетЧто(Дельта)
+ .МеждуИсключаяГраницы(3000, 3200);
+
+КонецПроцедуры
+
+Процедура ВывестиВКонсоль() Экспорт
+
+ ЮТОбщий.ВывестиВКонсоль(ТекущаяДата());
+
+КонецПроцедуры
+
Процедура ДобавитьСтроку() Экспорт
Варианты = ЮТест.Варианты("Исходная, Дополнение, Разделитель, Результат")
@@ -111,6 +133,31 @@
КонецПроцедуры
+#Если Сервер Тогда
+Процедура Менеджер() Экспорт
+
+ Варианты = ЮТест.Варианты("Параметр, Результат")
+ .Добавить("Справочник.Товары", Справочники.Товары)
+ .Добавить("Справочники.Товары", Справочники.Товары)
+ .Добавить(Справочники.Товары, Справочники.Товары)
+ .Добавить(Справочники.Товары.ПустаяСсылка(), Справочники.Товары)
+ .Добавить(Тип("СправочникМенеджер.Товары"), Справочники.Товары)
+ .Добавить(Тип("СправочникСсылка.Товары"), Справочники.Товары)
+ .Добавить(ЮТМетаданные.ОписаниеОбъектаМетаданных("Справочник.Товары"), Справочники.Товары)
+ .Добавить("РегистрыНакопления.Взаиморасчеты", РегистрыНакопления.Взаиморасчеты)
+ ;
+
+ Для Каждого Вариант Из Варианты.СписокВариантов() Цикл
+
+ Описание = СтрШаблон("%1 (%2)", Вариант.Параметр, ТипЗнч(Вариант.Параметр));
+ ЮТест.ОжидаетЧто(ЮТОбщий.Менеджер(Вариант.Параметр), Описание)
+ .Равно(Вариант.Результат);
+
+ КонецЦикла;
+
+КонецПроцедуры
+#КонецЕсли
+
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Module.bsl"
index 89f752a91..de98b8db6 100644
--- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Module.bsl"
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\232\320\276\320\275\321\201\321\202\321\200\321\203\320\272\321\202\320\276\321\200\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Module.bsl"
@@ -24,6 +24,7 @@
.ДобавитьТест("ЗаполнитьСправочник")
.ДобавитьТест("ЗаполнитьДокумент")
.ДобавитьТест("Фикция")
+ .ДобавитьТест("Фикция_Типизированная")
.ДобавитьТест("ФикцияОбязательныхПолей")
.ДобавитьТест("СоздатьГруппу")
;
@@ -145,6 +146,48 @@
КонецПроцедуры
+Процедура Фикция_Типизированная() Экспорт
+
+ ИмяТипа = "ПланОбменаСсылка.Мобильные";
+ Тип = Тип(ИмяТипа);
+
+ Варианты = ЮТест.Варианты("Тип, ОжилаемыйТип, Описание")
+ .Добавить(ИмяТипа, Тип, "По представлению типа")
+ .Добавить(Тип, Тип, "По типу")
+ .Добавить(Новый ОписаниеТипов(ИмяТипа), Тип, "По описаниею типов")
+ .Добавить("Строка", Тип("Строка"), "Другой тип")
+ ;
+
+ Для Каждого Вариант Из Варианты.СписокВариантов() Цикл
+
+ Данные = ЮТест.Данные().КонструкторОбъекта("Справочник.МобильныеУстройства")
+ .Фикция("Подписчик", , Вариант.Тип)
+ .ДанныеОбъекта();
+
+ ЮТест.ОжидаетЧто(Данные, Вариант.Описание).Свойство("Подписчик")
+ .Заполнено()
+ .ИмеетТип(Вариант.ОжилаемыйТип);
+
+ КонецЦикла;
+//
+ Варианты = ЮТест.Варианты("Тип, Описание")
+ .Добавить("Дата", "Неподходящий тип")
+ .Добавить(Новый ОписаниеТипов("Число, Дата"), "Неподходящее описание типов")
+ .Добавить("Неопределено", "Неопределено")
+ .Добавить(Тип("Неопределено"), "Тип Неопределено")
+ ;
+
+ Конструктор = ЮТест.Данные().КонструкторОбъекта("Справочник.МобильныеУстройства");
+
+ Для Каждого Вариант Из Варианты.СписокВариантов() Цикл
+
+ ЮТест.ОжидаетЧто(Конструктор, Вариант.Описание).Метод("Фикция", ЮТОбщий.ЗначениеВМассиве("Подписчик", Неопределено, Вариант.Тип))
+ .ВыбрасываетИсключение("Исправьте ограничение типов для реквизита `Подписчик`");
+
+ КонецЦикла;
+
+КонецПроцедуры
+
Процедура ФикцияОбязательныхПолей() Экспорт
Данные = ЮТест.Данные().КонструкторОбъекта("Справочники.Контрагенты")
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl"
new file mode 100644
index 000000000..53888a4e3
--- /dev/null
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/Module.bsl"
@@ -0,0 +1,53 @@
+//©///////////////////////////////////////////////////////////////////////////©//
+//
+// 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.
+//
+//©///////////////////////////////////////////////////////////////////////////©//
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Процедура ИсполняемыеСценарии() Экспорт
+
+ ЮТТесты
+ .ДобавитьТест("ОписаниеОбъектаМетаданных")
+ ;
+
+КонецПроцедуры
+
+Процедура ОписаниеОбъектаМетаданных() Экспорт
+
+#Если Сервер Тогда
+ ДляСервера = Истина;
+#Иначе
+ ДляСервера = Ложь;
+#КонецЕсли
+
+ Данные = ПомощникТестированияВызовСервера.ТестовыеДанныеДляОписаниеОбъектаМетаданных(ДляСервера);
+
+ Для Каждого Значение Из Данные Цикл
+
+ Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Значение);
+
+ ЮТест.ОжидаетЧто(Описание).Заполнено();
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265.mdo" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265.mdo"
new file mode 100644
index 000000000..a987a69b3
--- /dev/null
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265/\320\236\320\234_\320\256\320\242\320\234\320\265\321\202\320\260\320\264\320\260\320\275\320\275\321\213\320\265.mdo"
@@ -0,0 +1,11 @@
+
+
+ ОМ_ЮТМетаданные
+
+ ru
+ ЮТМетаданные
+
+ true
+ true
+ true
+
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
index 8400530e5..ec0e6ef9f 100644
--- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\237\321\200\320\265\320\264\320\270\320\272\320\260\321\202\321\213\320\232\320\273\320\270\320\265\320\275\321\202\320\241\320\265\321\200\320\262\320\265\321\200/Module.bsl"
@@ -81,6 +81,8 @@
.Добавить(Выражения.НеИмеетСвойство, "Число", "не содержит свойство `Число`", "ВложенныйОбъект")
.Добавить(Выражения.Содержит, "4", "содержит `4`", "Строка")
.Добавить(Выражения.НеСодержит, "2", "не содержит `2`", "Строка")
+ .Добавить(Выражения.СодержитСтрокуПоШаблону, "\D{3}", "содержит подстроку соответствующую шаблону `\D{3}`", "Строка")
+ .Добавить(Выражения.НеСодержитСтрокуПоШаблону, "\d{3}", "не содержит подстроку соответствующую шаблону `\d{3}`", "Строка")
;
Для Каждого Вариант Из Варианты.СписокВариантов() Цикл
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl"
index 4aa6e819e..372f3994c 100644
--- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl"
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265/Module.bsl"
@@ -26,6 +26,12 @@
.ДобавитьТест("Удалить")
.ДобавитьТест("ВариантыПараметров")
.ДобавитьТест("СоздатьГруппу")
+ .ДобавитьТест("ЗагрузитьИзМакета_ТабличныйДокумент")
+ .ДобавитьТест("ЗагрузитьИзМакета_MarkDown")
+ .ДобавитьТест("ЗагрузитьИзМакета_ЧастичнаяЗагрузкаДанных")
+ .ДобавитьТест("ЗагрузитьИзМакета_Проверки")
+ .ДобавитьТест("СлучайныйИдентификатор")
+ .ДобавитьТест("СлучайноеЗначениеПеречисления")
;
КонецПроцедуры
@@ -88,5 +94,250 @@
КонецПроцедуры
-#КонецОбласти
+Процедура СлучайныйИдентификатор() Экспорт
+
+ Проверка = Новый Структура();
+
+ Для Инд = 1 По 100 Цикл
+
+ Идентификатор = ЮТест.Данные().СлучайныйИдентификатор(Инд);
+
+ ЮТест.ОжидаетЧто(Проверка)
+ .Метод("Вставить").Параметр(Идентификатор)
+ .НеВыбрасываетИсключение(, "Сформирован не валидный идентификатор: " + Идентификатор);
+
+ КонецЦикла;
+
+КонецПроцедуры
+Процедура ЗагрузитьИзМакета_ТабличныйДокумент() Экспорт
+
+ // Подготовка тестового окружения
+
+ ОписанияТипов = Новый Соответствие;
+ ОписанияТипов.Вставить("Период", Новый ОписаниеТипов("Дата"));
+ ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
+ ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число"));
+ ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
+
+ КэшЗначений = Неопределено;
+
+ Поставщик = ЮТест.Данные().СоздатьЭлемент("Справочники.Контрагенты", "Поставщик");
+
+ ЗаменяемыеЗначения = Новый Соответствие;
+ ЗаменяемыеЗначения.Вставить("Поставщик 1", Поставщик);
+
+ ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C1:R5C11",
+ ОписанияТипов,
+ КэшЗначений,
+ ЗаменяемыеЗначения
+ );
+
+ // Проверка поведения и результатов
+
+#Если Сервер Тогда
+ Ютест.ОжидаетЧто(ТаблицаРезультатов)
+ .ИмеетТип("ТаблицаЗначений")
+ .ИмеетДлину(3)
+ .Свойство("[0].Товар.Поставщик").Равно(Поставщик)
+ .Свойство("[0].Товар.Артикул").Равно("Артикул 1")
+ .Свойство("[0].Товар.Вид").Равно(ПредопределенноеЗначение("Перечисление.ВидыТоваров.Товар"))
+ .Свойство("[0].Товар.Описание").Заполнено()
+ .Свойство("[0].Количество").Равно(1)
+ .Свойство("[0].Цена").Равно(100.55)
+ .Свойство("[1].Товар.Поставщик").Заполнено().НеРавно(Поставщик)
+ .Свойство("[1].Товар.Артикул").Равно("Артикул 2")
+ .Свойство("[1].Товар.Вид").Равно(ПредопределенноеЗначение("Перечисление.ВидыТоваров.Товар"))
+ .Свойство("[1].Товар.Описание").НеЗаполнено()
+ .Свойство("[1].Количество").Равно(1)
+ .Свойство("[1].Цена").Равно(1500.2)
+ .Свойство("[2].Товар.Поставщик").НеЗаполнено()
+ .Свойство("[2].Товар.Артикул").Равно("Артикул 3")
+ .Свойство("[2].Товар.Вид").Равно(ПредопределенноеЗначение("Перечисление.ВидыТоваров.Услуга"))
+ .Свойство("[2].Товар.Описание").Заполнено()
+ .Свойство("[2].Количество").Равно(1)
+ .Свойство("[2].Цена").Равно(1000000)
+ ;
+#Иначе
+ Ютест.ОжидаетЧто(ТаблицаРезультатов)
+ .ИмеетТип("Массив")
+ .ИмеетДлину(3)
+ .КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат()
+ .Реквизит("Товар").Заполнено().ИмеетТип("СправочникСсылка.Товары")
+ .Реквизит("Период").Заполнено().ИмеетТип("Дата")
+ .Реквизит("Количество").Заполнено().ИмеетТип("Число")
+ .Реквизит("Цена").Заполнено().ИмеетТип("Число")
+ )
+ .Свойство("[0].Количество").Равно(1)
+ .Свойство("[0].Цена").Равно(100.55)
+ .Свойство("[1].Количество").Равно(1)
+ .Свойство("[1].Цена").Равно(1500.2)
+ .Свойство("[2].Количество").Равно(1)
+ .Свойство("[2].Цена").Равно(1000000)
+ ;
+#КонецЕсли
+
+КонецПроцедуры
+
+Процедура ЗагрузитьИзМакета_MarkDown() Экспорт
+
+ ИмяМакета = "ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown";
+ Макет = ЮТОбщий.Макет(ИмяМакета);
+
+ Варианты = ЮТест.Варианты("Данные, Описание")
+ .Добавить(ИмяМакета, "По имени макета")
+ .Добавить(Макет, "Из текстового документа")
+ .Добавить(Макет.ПолучитьТекст(), "Из строки")
+ ;
+
+ Для Каждого Вариант Из Варианты.СписокВариантов() Цикл
+
+ ОписанияТипов = Новый Соответствие;
+ ОписанияТипов.Вставить("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары"));
+ ОписанияТипов.Вставить("Цена", Новый ОписаниеТипов("Число"));
+ ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
+ ОписанияТипов.Вставить("Сумма", Новый ОписаниеТипов("Число"));
+
+ // Вызов тестируемого сценария
+
+ ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета(
+ Вариант.Данные,
+ ОписанияТипов
+ );
+
+ // Проверка поведения и результатов
+
+#Если Сервер Тогда
+ Ютест.ОжидаетЧто(ТаблицаРезультатов, Вариант.Описание)
+ .ИмеетТип("ТаблицаЗначений")
+ .ИмеетДлину(3)
+ .Свойство("[0].Товар.Наименование").Равно("Товар 1")
+ .Свойство("[0].Количество").Равно(1)
+ .Свойство("[0].Цена").Равно(100)
+ .Свойство("[0].Сумма").Равно(100)
+ .Свойство("[1].Товар.Наименование").Равно("Товар 2")
+ .Свойство("[1].Количество").Равно(1)
+ .Свойство("[1].Цена").Равно(2000)
+ .Свойство("[1].Сумма").Равно(2000)
+ .Свойство("[2].Товар.Наименование").Равно("Услуга")
+ .Свойство("[2].Количество").Равно(1)
+ .Свойство("[2].Цена").Равно(300.9)
+ .Свойство("[2].Сумма").Равно(300.9)
+ ;
+#Иначе
+ Ютест.ОжидаетЧто(ТаблицаРезультатов, Вариант.Описание)
+ .ИмеетТип("Массив")
+ .ИмеетДлину(3)
+ .КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат()
+ .Реквизит("Товар").Заполнено().ИмеетТип("СправочникСсылка.Товары")
+ .Реквизит("Количество").Равно(1)
+ .Реквизит("Цена").Заполнено().ИмеетТип("Число")
+ .Реквизит("Сумма").Заполнено().ИмеетТип("Число"))
+ .Свойство("[0].Количество").Равно(1)
+ .Свойство("[0].Цена").Равно(100)
+ .Свойство("[0].Сумма").Равно(100)
+ .Свойство("[1].Цена").Равно(2000)
+ .Свойство("[1].Сумма").Равно(2000)
+ .Свойство("[2].Цена").Равно(300.9)
+ .Свойство("[2].Сумма").Равно(300.9)
+ ;
+#КонецЕсли
+ КонецЦикла;
+
+КонецПроцедуры
+
+Процедура ЗагрузитьИзМакета_ЧастичнаяЗагрузкаДанных() Экспорт
+
+ ОписанияТипов = Новый Структура;
+ ОписанияТипов.Вставить("Период", Новый ОписаниеТипов("Дата"));
+ ОписанияТипов.Вставить("Количество", Новый ОписаниеТипов("Число"));
+
+ ТаблицаРезультатов = ЮТест.Данные().ЗагрузитьИзМакета("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C1:R5C11", ОписанияТипов);
+
+#Если Сервер Тогда
+ Ютест.ОжидаетЧто(ТаблицаРезультатов)
+ .ИмеетДлину(3)
+ .Свойство("Колонки").ИмеетДлину(2)
+ .Содержит("Период")
+ .Содержит("Количество")
+ ;
+#Иначе
+ Ютест.ОжидаетЧто(ТаблицаРезультатов)
+ .ИмеетТип("Массив")
+ .ИмеетДлину(3)
+ .КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат()
+ .ИмеетДлину(2)
+ .ИмеетСвойство("Период")
+ .ИмеетСвойство("Количество")
+ )
+ ;
+#КонецЕсли
+КонецПроцедуры
+
+Процедура ЗагрузитьИзМакета_Проверки() Экспорт
+
+ ЮТест.ОжидаетЧто(ЮТест.Данные())
+ .Метод("ЗагрузитьИзМакета")
+ .Параметр(Неопределено)
+ .Параметр(Новый Массив)
+ .ВыбрасываетИсключение("Укажите источник данных (Макет)");
+
+ ЮТест.ОжидаетЧто(ЮТест.Данные())
+ .Метод("ЗагрузитьИзМакета")
+ .Параметр("ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown")
+ .Параметр(Новый Массив)
+ .ВыбрасываетИсключение("Укажите описание загружаемых колонок (ОписанияТипов)");
+
+ ЮТест.ОжидаетЧто(ЮТест.Данные())
+ .Метод("ЗагрузитьИзМакета")
+ .Параметр("ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown")
+ .Параметр(1)
+ .ВыбрасываетИсключение("Некорректный тип параметра `ОписанияТипов` метода `ЮТТестовыеДанные.ЗагрузитьИзМакета`. Метод принимает `Соответствие, Структура`, а получили `Число` (1)");
+
+ ЮТест.ОжидаетЧто(ЮТест.Данные())
+ .Метод("ЗагрузитьИзМакета")
+ .Параметр("ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown")
+ .Параметр(Новый Структура("Количество, Резерв", Новый ОписаниеТипов("Число"), Новый ОписаниеТипов("Число")))
+ .ВыбрасываетИсключение("Макет не содержит колонку `Резерв`");
+
+ ЮТест.ОжидаетЧто(ЮТест.Данные())
+ .Метод("ЗагрузитьИзМакета")
+ .Параметр("ОбщийМакет.ЮТ_ТестовыеДанныеMarkdown")
+ .Параметр(Новый Структура("Количество, Резерв", Новый ОписаниеТипов("Число"), Новый ОписаниеТипов("Число")))
+ .ВыбрасываетИсключение("Макет не содержит колонку `Резерв`");
+
+ ЮТест.ОжидаетЧто(ЮТест.Данные())
+ .Метод("ЗагрузитьИзМакета")
+ .Параметр("ОбщийМакет.ЮТ_МакетТестовыхДанных.R2C4:R5C5")
+ .Параметр(Новый Структура("Товар", Новый ОписаниеТипов("СправочникСсылка.Товары")))
+ .ВыбрасываетИсключение("не найдена в макете основная колонка с именем `Товар`");
+
+ ЮТест.ОжидаетЧто(ЮТест.Данные())
+ .Метод("ЗагрузитьИзМакета")
+ .Параметр("ОбщийМакет.ЮТ_МакетТестовыхДанных.ОсновнаяТаблица")
+ .Параметр(Новый Структура("Цена", Новый ОписаниеТипов("Дата")))
+ .ВыбрасываетИсключение("Область не найдена: ОсновнаяТаблица");
+
+КонецПроцедуры
+
+Процедура СлучайноеЗначениеПеречисления() Экспорт
+
+ Варианты = ЮТест.Варианты("Перечисление, Описание")
+ .Добавить("Перечисление.PushУведомления", "По имени")
+ .Добавить("Перечисления.PushУведомления", "По имени коллекции")
+#Если Сервер Тогда
+ .Добавить(Перечисления.PushУведомления, "Через менеджер")
+#КонецЕсли
+ ;
+
+ Для Каждого Вариант Из Варианты.СписокВариантов() Цикл
+
+ ЮТест.ОжидаетЧто(ЮТест.Данные().СлучайноеЗначениеПеречисления(Вариант.Перечисление))
+ .Заполнено()
+ .ИмеетТип("ПеречислениеСсылка.PushУведомления");
+
+ КонецЦикла;
+
+КонецПроцедуры
+
+#КонецОбласти
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
new file mode 100644
index 000000000..0fd8bf4cd
--- /dev/null
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/Module.bsl"
@@ -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.
+//
+//©///////////////////////////////////////////////////////////////////////////©//
+
+#Область СлужебныйПрограммныйИнтерфейс
+
+Процедура ИсполняемыеСценарии() Экспорт
+
+ ЮТТесты
+ .ДобавитьТест("ЭтоСистемноеПеречисление")
+ .СПараметрами(Тип("ВидДвиженияБухгалтерии"), Истина)
+ .СПараметрами(Тип("Дата"), Ложь)
+ .СПараметрами(Тип("ПеречислениеСсылка.PushУведомления"), Ложь)
+ .ДобавитьТест("ТипыСистемныхПеречислений")
+ .ДобавитьТест("ИмяСистемногоПеречисления")
+ .СПараметрами(Тип("ВидДвиженияБухгалтерии"), "ВидДвиженияБухгалтерии")
+ .ДобавитьТест("ЭтоПримитивныйТип")
+ .СПараметрами(Тип("ПеречислениеСсылка.PushУведомления"), Ложь)
+ .СПараметрами(Тип("Строка"), Истина)
+ .СПараметрами(Тип("Число"), Истина)
+ .СПараметрами(Тип("Неопределено"), Ложь)
+ .СПараметрами(Новый ОписаниеТипов("УникальныйИдентификатор"), Истина)
+ .СПараметрами(Новый ОписаниеТипов("Число, Дата"), Истина)
+ .СПараметрами(Новый ОписаниеТипов("Число, ПеречислениеСсылка.PushУведомления, Дата"), Ложь)
+ .ДобавитьТест("ЭтоКоллекцияПримитивныхТипов")
+ .СПараметрами(ЮТОбщий.ЗначениеВМассиве(Тип("Строка"), Тип("Дата")), Истина)
+ .СПараметрами(ЮТОбщий.ЗначениеВМассиве(Тип("Строка"), Тип("Дата"), Тип("ПеречислениеСсылка.PushУведомления")), Ложь)
+
+ ;
+
+КонецПроцедуры
+
+Процедура ЭтоСистемноеПеречисление(Тип, ОжидаемыйРезультат) Экспорт
+
+ ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ЭтоСистемноеПеречисление(Тип))
+ .Равно(ОжидаемыйРезультат);
+
+КонецПроцедуры
+
+Процедура ТипыСистемныхПеречислений() Экспорт
+
+ ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ТипыСистемныхПеречислений())
+ .ИмеетТип("ОписаниеТипов")
+ .Что(ЮТТипыДанныхСлужебный.ТипыСистемныхПеречислений().Типы())
+ .Содержит(Тип("ВидДвиженияБухгалтерии"))
+ .Содержит(Тип("ИспользованиеАгрегатаРегистраНакопления"));
+
+КонецПроцедуры
+
+Процедура ИмяСистемногоПеречисления(Тип, ОжидаемыйРезультат) Экспорт
+
+ ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ИмяСистемногоПеречисления(Тип))
+ .Равно(ОжидаемыйРезультат);
+
+КонецПроцедуры
+
+Процедура ЭтоПримитивныйТип(Тип, ОжидаемыйРезультат) Экспорт
+
+ ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ЭтоПримитивныйТип(Тип))
+ .Равно(ОжидаемыйРезультат);
+
+КонецПроцедуры
+
+Процедура ЭтоКоллекцияПримитивныхТипов(Тип, ОжидаемыйРезультат) Экспорт
+
+ ЮТест.ОжидаетЧто(ЮТТипыДанныхСлужебный.ЭтоКоллекцияПримитивныхТипов(Тип))
+ .Равно(ОжидаемыйРезультат);
+
+КонецПроцедуры
+
+#КонецОбласти
+
+#Область СлужебныеПроцедурыИФункции
+
+#КонецОбласти
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo"
new file mode 100644
index 000000000..cacbdb5e1
--- /dev/null
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271/\320\236\320\234_\320\256\320\242\320\242\320\270\320\277\321\213\320\224\320\260\320\275\320\275\321\213\321\205\320\241\320\273\321\203\320\266\320\265\320\261\320\275\321\213\320\271.mdo"
@@ -0,0 +1,9 @@
+
+
+ ОМ_ЮТТипыДанныхСлужебный
+
+ ru
+ Типы данных служебный
+
+ true
+
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl"
index ea7060214..057605e24 100644
--- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl"
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\243\321\202\320\262\320\265\321\200\320\266\320\264\320\265\320\275\320\270\321\217/Module.bsl"
@@ -49,6 +49,8 @@
.ДобавитьТест("НеИмеетТип")
.ДобавитьТест("Содержит")
.ДобавитьТест("НеСодержит")
+ .ДобавитьТест("СодержитСтрокуПоШаблону")
+ .ДобавитьТест("НеСодержитСтрокуПоШаблону")
.ДобавитьТест("ИмеетДлину")
.ДобавитьТест("НеИмеетДлину")
.ДобавитьТест("ВыбрасываетИсключение")
@@ -1358,6 +1360,48 @@
КонецПроцедуры
+Процедура СодержитСтрокуПоШаблону() Экспорт
+
+ // Позитивные тесты
+ ЮТУтверждения.Что("123321")
+ .СодержитСтрокуПоШаблону("\d{3}")
+ .СодержитСтрокуПоШаблону(".{6}")
+ ;
+
+ // Негативные тесты
+ Попытка
+ Ошибка = Неопределено;
+ ЮТУтверждения.Что("123321")
+ .СодержитСтрокуПоШаблону(".{7}");
+ Исключение
+ Ошибка = ИнформацияОбОшибке();
+ КонецПопытки;
+ ПроверитьОшибкуУтверждения(Ошибка, "Ожидали, что проверяемое значение `123321` содержит подстроку соответствующую шаблону `.{7}`, но это не так");
+ ПроверитьДанныеОшибкиСравнения("123321", ".{7}");
+
+КонецПроцедуры
+
+Процедура НеСодержитСтрокуПоШаблону() Экспорт
+
+ // Позитивные тесты
+ ЮТУтверждения.Что("123321")
+ .НеСодержитСтрокуПоШаблону("\D{3}")
+ .НеСодержитСтрокуПоШаблону(".{7}")
+ ;
+
+ // Негативные тесты
+ Попытка
+ Ошибка = Неопределено;
+ ЮТУтверждения.Что("123321")
+ .НеСодержитСтрокуПоШаблону(".{6}");
+ Исключение
+ Ошибка = ИнформацияОбОшибке();
+ КонецПопытки;
+ ПроверитьОшибкуУтверждения(Ошибка, "Ожидали, что проверяемое значение `123321` не содержит подстроку соответствующую шаблону `.{6}`, но это не так");
+ ПроверитьДанныеОшибкиСравнения("123321", ".{6}");
+
+КонецПроцедуры
+
Процедура ИмеетДлину() Экспорт
// Позитивные тесты
diff --git "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl" "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl"
index 27220fd09..3062ad3ce 100644
--- "a/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl"
+++ "b/tests/src/CommonModules/\320\236\320\234_\320\256\320\242\320\247\320\270\321\202\320\260\321\202\320\265\320\273\321\214/Module.bsl"
@@ -93,7 +93,7 @@
Наборы = ЮТЧитатель.ЗагрузитьТесты(ПараметрыЗапуска);
ЮТест.ОжидаетЧто(Наборы, "Прочитанные наборы расширения tests")
- .ИмеетДлину(21);
+ .ИмеетДлину(23);
КонецПроцедуры
@@ -158,4 +158,4 @@
КонецПроцедуры
-#КонецОбласти
\ No newline at end of file
+#КонецОбласти
diff --git "a/tests/src/CommonModules/\320\237\320\276\320\274\320\276\321\211\320\275\320\270\320\272\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl" "b/tests/src/CommonModules/\320\237\320\276\320\274\320\276\321\211\320\275\320\270\320\272\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
index 33e7ec306..5181d8616 100644
--- "a/tests/src/CommonModules/\320\237\320\276\320\274\320\276\321\211\320\275\320\270\320\272\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
+++ "b/tests/src/CommonModules/\320\237\320\276\320\274\320\276\321\211\320\275\320\270\320\272\320\242\320\265\321\201\321\202\320\270\321\200\320\276\320\262\320\260\320\275\320\270\321\217\320\222\321\213\320\267\320\276\320\262\320\241\320\265\321\200\320\262\320\265\321\200\320\260/Module.bsl"
@@ -71,4 +71,37 @@
КонецПроцедуры
+Функция ТестовыеДанныеДляОписаниеОбъектаМетаданных(ДляСервера) Экспорт
+
+ Данные = Новый Массив();
+
+ Вид = "Справочник";
+
+ Для Каждого Справочник Из Метаданные.Справочники Цикл
+
+ Данные.Добавить(Справочник.ПолноеИмя());
+ Данные.Добавить(Тип(СтрШаблон("%1Ссылка.%2", Вид, Справочник.Имя)));
+ Данные.Добавить(Новый(СтрШаблон("%1Ссылка.%2", Вид, Справочник.Имя)));
+
+ Если ДляСервера Тогда
+ Данные.Добавить(Справочник);
+ Данные.Добавить(Новый(СтрШаблон("%1Менеджер.%2", Вид, Справочник.Имя)));
+ Данные.Добавить(Новый(СтрШаблон("%1Объект.%2", Вид, Справочник.Имя)));
+ Данные.Добавить(Тип(СтрШаблон("%1Объект.%2", Вид, Справочник.Имя)));
+ Данные.Добавить(Тип(СтрШаблон("%1Менеджер.%2", Вид, Справочник.Имя)));
+ КонецЕсли;
+
+ КонецЦикла;
+
+ Количество = Данные.Количество();
+ Для Инд = 0 По Количество - 1 Цикл
+ Данные.Добавить(Данные[Инд]);
+ Данные.Добавить(Данные[Инд]);
+ Данные.Добавить(Данные[Инд]);
+ КонецЦикла;
+
+ Возврат Данные;
+
+КонецФункции
+
#КонецОбласти
diff --git "a/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Template.mxlx" "b/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Template.mxlx"
new file mode 100644
index 000000000..6e67f1c6a
--- /dev/null
+++ "b/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/Template.mxlx"
@@ -0,0 +1,1005 @@
+
+
+
+ ru
+ #
+
+ ru
+ Русский
+
+
+
+ 11
+
+ 0
+
+ 1
+
+
+
+ 1
+
+ 2
+
+
+
+ 2
+
+ 3
+
+
+
+ 3
+
+ 4
+
+
+
+ 4
+
+ 5
+
+
+
+ 5
+
+ 6
+
+
+
+ 7
+
+ 7
+
+
+
+ 6
+
+ 8
+
+
+
+ 8
+
+ 9
+
+
+
+ 9
+
+ 10
+
+
+
+ 10
+
+ 9
+
+
+
+
+ 0
+
+
+
+ 11
+
+
+ ru
+ Исходная таблица
+
+
+
+
+
+
+ 0
+
+
+
+
+
+ 1
+
+
+
+ 12
+
+
+ ru
+ Период
+
+
+
+
+
+
+ 13
+
+
+ ru
+ Активность
+
+
+
+
+
+
+ 13
+
+
+ ru
+ Товар
+
+
+
+
+
+
+ 14
+
+
+ ru
+ Товар.Артикул
+
+
+
+
+
+
+ 15
+
+
+ ru
+ Товар.Поставщик
+
+
+
+
+
+
+ 16
+
+
+ ru
+ Товар.Вид
+
+
+
+
+
+
+ 17
+
+
+ ru
+ Товар.Описание
+
+
+
+
+
+
+ 17
+
+
+ ru
+ Товар.ОтсутствующийРеквизит
+
+
+
+
+
+
+ 18
+
+
+ ru
+ Цена
+
+
+
+
+
+
+ 18
+
+
+ ru
+ Количество
+
+
+
+
+
+
+ 19
+
+
+ ru
+ Сумма
+
+
+
+
+
+
+
+ 2
+
+
+
+ 20
+
+
+ ru
+ 01.01.2023 0:00:00
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Да
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Товар 1
+
+
+
+
+
+
+ 21
+
+
+ ru
+ Артикул 1
+
+
+
+
+
+
+ 22
+
+
+ ru
+ Поставщик 1
+
+
+
+
+
+
+ 23
+
+
+ ru
+ Товар
+
+
+
+
+
+
+ 24
+
+
+ ru
+ Некоторое описание товара
+
+
+
+
+
+
+ 25
+
+
+ ru
+ Значение
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 100,55
+
+
+
+
+
+
+ 26
+
+
+ ru
+ 1
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 100,55
+
+
+
+
+
+
+
+ 3
+
+
+
+ 20
+
+
+ ru
+ 2023-01-01
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Истина
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Товар 2
+
+
+
+
+
+
+ 21
+
+
+ ru
+ Артикул 2
+
+
+
+
+
+
+ 22
+
+
+ ru
+ Поставщик 2
+
+
+
+
+
+
+ 23
+
+
+ ru
+ Товар
+
+
+
+
+
+
+ 24
+
+
+
+
+ 24
+
+
+ ru
+ Значение
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 1 500.2
+
+
+
+
+
+
+ 26
+
+
+ ru
+ 1
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 1 500.2
+
+
+
+
+
+
+
+ 4
+
+
+
+ 20
+
+
+ ru
+ 01/01/23
+
+
+
+
+
+
+ 20
+
+
+ ru
+ false
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Услуга
+
+
+
+
+
+
+ 21
+
+
+ ru
+ Артикул 3
+
+
+
+
+
+
+ 22
+
+
+
+
+ 23
+
+
+ ru
+ Услуга
+
+
+
+
+
+
+ 24
+
+
+ ru
+ Некоторое описание услуги
+
+
+
+
+
+
+ 25
+
+
+
+
+ 20
+
+
+ ru
+ 1 000 000
+
+
+
+
+
+
+ 26
+
+
+ ru
+ 1
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 1 000 000
+
+
+
+
+
+
+
+ 6
+
+
+
+ 0
+
+
+ ru
+ Ожидаемое значение
+
+
+
+
+
+
+
+ 7
+
+
+
+ 13
+
+
+ ru
+ Период
+
+
+
+
+
+
+ 13
+
+
+ ru
+ Активность
+
+
+
+
+
+
+ 13
+
+
+ ru
+ Товар
+
+
+
+
+
+
+ 14
+
+
+ ru
+ Цена
+
+
+
+
+
+
+ 18
+
+
+ ru
+ Количество
+
+
+
+
+
+
+ 16
+
+
+ ru
+ Сумма
+
+
+
+
+
+
+
+ 8
+
+
+
+ 20
+
+
+ ru
+ 01.01.2023 0:00:00
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Истина
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Товар 1
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 100.55
+
+
+
+
+
+
+ 26
+
+
+ ru
+ 1
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 100.55
+
+
+
+
+
+
+
+ 9
+
+
+
+ 27
+
+
+ ru
+ 01.01.2023 0:00:00
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Истина
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Товар 2
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 1500.2
+
+
+
+
+
+
+ 26
+
+
+ ru
+ 1
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 1500.2
+
+
+
+
+
+
+
+ 10
+
+
+
+ 27
+
+
+ ru
+ 01.01.2023 0:00:00
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Ложь
+
+
+
+
+
+
+ 20
+
+
+ ru
+ Услуга
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 1000000
+
+
+
+
+
+
+ 26
+
+
+ ru
+ 1
+
+
+
+
+
+
+ 20
+
+
+ ru
+ 1000000
+
+
+
+
+
+
+ true
+ 11
+ 11
+
+ Solid
+
+
+
+ 123
+
+
+ 83
+
+
+ 56
+
+
+ 105
+
+
+ 122
+
+
+ 77
+
+
+ 209
+
+
+ 176
+
+
+ 65
+
+
+ 86
+
+
+ 147
+
+
+ 0
+ 0
+ 95
+ Center
+
+
+ 0
+ 0
+ 95
+ Center
+
+
+ 0
+ 0
+ 147
+ Center
+
+
+ 0
+ 0
+ 163
+ Center
+
+
+ 0
+ 0
+ 120
+ Center
+
+
+ 0
+ 0
+ 176
+ Center
+
+
+ 0
+ 0
+ 81
+ Center
+
+
+ 0
+ 0
+ Center
+
+
+ 0
+ 95
+
+
+ 0
+ 147
+
+
+ 0
+ 163
+
+
+ 0
+ 120
+
+
+ 0
+ 176
+
+
+ 0
+ 209
+
+
+ 0
+ 81
+
+
+ 0
+
+
\ No newline at end of file
diff --git "a/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo" "b/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo"
new file mode 100644
index 000000000..a56bd4a93
--- /dev/null
+++ "b/tests/src/CommonTemplates/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205/\320\256\320\242_\320\234\320\260\320\272\320\265\321\202\320\242\320\265\321\201\321\202\320\276\320\262\321\213\321\205\320\224\320\260\320\275\320\275\321\213\321\205.mdo"
@@ -0,0 +1,8 @@
+
+
+ ЮТ_МакетТестовыхДанных
+
+ ru
+ Ю т макет тестовых данных
+
+
diff --git "a/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/Template.txt" "b/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/Template.txt"
new file mode 100644
index 000000000..d22550824
--- /dev/null
+++ "b/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/Template.txt"
@@ -0,0 +1,5 @@
+| Товар | Цена | Количество | Сумма |
+|---------|-------|------------|-------|
+| Товар 1 | 100 | 1 | 100 |
+| Товар 2 | 2 000 | 1 | 2000 |
+| Услуга | 300,9 | 1 | 300,9 |
\ No newline at end of file
diff --git "a/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown.mdo" "b/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown.mdo"
new file mode 100644
index 000000000..3cb336705
--- /dev/null
+++ "b/tests/src/CommonTemplates/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown/\320\256\320\242_\320\242\320\265\321\201\321\202\320\276\320\262\321\213\320\265\320\224\320\260\320\275\320\275\321\213\320\265Markdown.mdo"
@@ -0,0 +1,9 @@
+
+
+ ЮТ_ТестовыеДанныеMarkdown
+
+ ru
+ Ю т тестовые данные markdown
+
+ TextDocument
+
diff --git a/tests/src/Configuration/Configuration.mdo b/tests/src/Configuration/Configuration.mdo
index 53a0bfc48..02b5d323b 100644
--- a/tests/src/Configuration/Configuration.mdo
+++ b/tests/src/Configuration/Configuration.mdo
@@ -22,6 +22,8 @@
ru
+ CommonTemplate.ЮТ_МакетТестовыхДанных
+ CommonTemplate.ЮТ_ТестовыеДанныеMarkdown
CommonModule.Интеграция
CommonModule.Обр_ЮТHTTPСервисЗапрос
CommonModule.ОМ_Мокито
@@ -32,6 +34,7 @@
CommonModule.ОМ_ЮТестПереопределяемый
CommonModule.ОМ_ЮТЗапросы
CommonModule.ОМ_ЮТКонструкторТестовыхДанных
+ CommonModule.ОМ_ЮТМетаданные
CommonModule.ОМ_ЮТПодражатель_Банки
CommonModule.ОМ_ЮТПодражатель_Компании
CommonModule.ОМ_ЮТПодражатель_Люди
@@ -40,6 +43,7 @@
CommonModule.ОМ_ЮТТестовыеДанные
CommonModule.ОМ_ЮТТестовыеДанныеСлужебный
CommonModule.ОМ_ЮТТесты
+ CommonModule.ОМ_ЮТТипыДанныхСлужебный
CommonModule.ОМ_ЮТУтверждения
CommonModule.ОМ_ЮТУтвержденияИБ
CommonModule.ОМ_ЮТФильтрация