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

Merge branch 'release/24.01'

This commit is contained in:
Aleksey Ko 2024-01-15 19:46:32 +03:00
commit 4c5eaa5ad1
161 changed files with 4522 additions and 1683 deletions

View File

@ -8,11 +8,18 @@ on:
src_artifact_name:
type: string
required: true
required: false
default: designer-src
artifact_name:
type: string
required: true
required: false
default: build-artifacts
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event.number }}-build
cancel-in-progress: true
jobs:
build:
runs-on: windows-latest

View File

@ -9,6 +9,11 @@ on:
artifact_name:
type: string
required: true
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event.number }}-export
cancel-in-progress: true
jobs:
build:
runs-on: ubuntu-latest

View File

@ -6,7 +6,7 @@ on:
branches: [ develop ]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
group: ${{ github.workflow }}-${{ github.ref }}-${{ github.event.number }}
cancel-in-progress: true
permissions:
@ -29,29 +29,25 @@ jobs:
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
if: github.ref == 'refs/heads/develop'
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
if: github.ref == 'refs/heads/develop'
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:
@ -60,5 +56,13 @@ jobs:
needs: build_artifacts
with:
v8_version: 8.3.21.1895
artifact_name: build-artifacts
locale: ru_RU
secrets: inherit
tests_windows_en:
name: Tests Windows 8.3.21.1895 en_US
uses: ./.github/workflows/run-tests-windows.yml
needs: build_artifacts
with:
v8_version: 8.3.21.1895
locale: en_US
secrets: inherit

View File

@ -15,7 +15,8 @@ on:
artifact_name:
type: string
required: true
required: false
default: build-artifacts
fail_on_failure:
type: boolean
@ -28,7 +29,7 @@ permissions:
id-token: write
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.v8_version }}-${{ inputs.locale }}-Linux
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.v8_version }}-${{ inputs.locale }}-${{ github.event.number }}-Linux
cancel-in-progress: true
jobs:
@ -134,7 +135,9 @@ jobs:
"closeAfterTests": true,
"exitCode": "exit-code.txt",
"logging": {
"console": true
"enable": false,
"console": true,
"file": "execute.log"
}
}
@ -145,6 +148,10 @@ jobs:
DISPLAY: :99
LANG: "${{ inputs.locale }}.UTF-8"
# - name: view log
# if: always()
# run: cat ./execute.log
- name: view output
if: always()
run: cat ./output.log

View File

@ -15,7 +15,8 @@ on:
artifact_name:
type: string
required: true
required: false
default: build-artifacts
fail_on_failure:
type: boolean
@ -23,7 +24,7 @@ on:
default: true
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.v8_version }}-${{ inputs.locale }}-Windows
group: ${{ github.workflow }}-${{ github.ref }}-${{ inputs.v8_version }}-${{ inputs.locale }}-${{ github.event.number }}-Windows
cancel-in-progress: true
jobs:
@ -82,20 +83,26 @@ jobs:
"closeAfterTests": true,
"exitCode": "exit-code.txt",
"logging": {
"enable": false,
"console": true,
"file": "execute.log"
}
}
- uses: bhowell2/github-substring-action@1.0.2
id: short_locale
with:
value: ${{ inputs.locale }}
length_from_start: 2
- 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'
Start-Process -NoNewWindow -PassThru -Wait 1cv8c.exe -ArgumentList '/WS "http://localhost:8314" /C"RunUnitTests=unit.json" /L ${{ steps.short_locale.outputs.substring }} /VL ${{ inputs.locale }} /DisableStartupDialogs /DisableStartupMessages /DisableUnrecoverableErrorMessage /Out 1cv8c-output.log'
timeout-minutes: 10
- name: view output
if: always()
run: type execute.log
# - name: view log
# if: always()
# run: type execute.log
- name: view output
if: always()

View File

@ -33,6 +33,6 @@
## Лицензия
Copyright © 2022 [BIA-Technologies Limited Liability Company](http://bia-tech.ru/)
Copyright © 2023 [BIA-Technologies Limited Liability Company](http://bia-tech.ru/)
Distributed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html)

View File

@ -0,0 +1,67 @@
---
title: YaxUnit. Версия 24.01
authors: alkoleft
tags: [releases, yaxunit]
---
[Release 24.01](https://github.com/bia-technologies/edt-test-runner/releases/tag/24.01)
## Новое в версии
### Тестовые данные
* Добавить возможность передать дополнительные свойства и режим загрузки в методы СоздатьЭлемент и СоздатьДокумент [#181](https://github.com/bia-technologies/yaxunit/issues/181) Спасибо [@SeiOkami](https://github.com/SeiOkami)
* Конструктор тестовых данных. Добавить метод перехода с заполнения табличной части на объект [#167](https://github.com/bia-technologies/yaxunit/issues/167)
* Конструктор тестовых данных, добавить метод создания записи, который возвращает сам конструктор. [#243](https://github.com/bia-technologies/yaxunit/issues/243)
### Утверждения
* Новое утверждение `ОжидаетЧто(Объект).ИмеетМетод(ИмяМетода)` [#224](https://github.com/bia-technologies/yaxunit/issues/224)
* Добавить поддержку передачи значения по умолчанию [#207](https://github.com/bia-technologies/yaxunit/issues/207) Спасибо [@stolya](https://github.com/stolya)
* Утверждения. Добавить поддержку проверки форматированных строк [#199](https://github.com/bia-technologies/yaxunit/issues/199)
* Доработать утверждения ИБ для проверки строк неограниченной длины [#187](https://github.com/bia-technologies/yaxunit/issues/187)
* Добавить поддержку предикатов в Утверждения.Содержит И Утверждения.НеСодержит [#179](https://github.com/bia-technologies/yaxunit/issues/179)
* Утверждения для проверки исключений методов выполнять в транзакции [#172](https://github.com/bia-technologies/yaxunit/issues/172)
* Перевод утверждений на использование предикатов [#162](https://github.com/bia-technologies/yaxunit/issues/162)
* Сравнение табличных документов по содержимому [#36](https://github.com/bia-technologies/yaxunit/issues/36)
### Мокирование
* Мокито. Навести порядок с мокированием ссылочных объектов. [#231](https://github.com/bia-technologies/yaxunit/issues/231)
* Настройка мокирования. Сократить настройку мокирования цепочки вызовов одного метода. [#223](https://github.com/bia-technologies/yaxunit/issues/223)
### Прочее
* Поддержка англоязычных конфигураций [#238](https://github.com/bia-technologies/yaxunit/issues/238) Спасибо [@RichardTheLionJokes](https://github.com/RichardTheLionJokes)
* Вынести в ППИ метод получения свойства по по пути [#214](https://github.com/bia-technologies/yaxunit/issues/214)
* Добавить метод получения движений документа [#170](https://github.com/bia-technologies/yaxunit/issues/170)
* Сократить сообщение для сломанных тестов [#169](https://github.com/bia-technologies/yaxunit/issues/169)
* Небольшые правки [#165](https://github.com/bia-technologies/yaxunit/issues/165)
* Метод установки реквизита ссылки [#158](https://github.com/bia-technologies/yaxunit/issues/158)
* Проверка зависших транзакций [#143](https://github.com/bia-technologies/yaxunit/issues/143)
## Исправленные ошибки
### Запуск
* Ошибка при чтении параметров запуска [#241](https://github.com/bia-technologies/yaxunit/issues/241) Спасибо [@1cgh](https://github.com/1cgh)
* Добавить поддержку работу инструмента под не полноправным пользователем [#212](https://github.com/bia-technologies/yaxunit/issues/212) Спасибо [@stolya](https://github.com/stolya)
* Добавить возможность внутри тестов создавать внешнюю обработку по имени [#193](https://github.com/bia-technologies/yaxunit/issues/193) Спасибо [@SeiOkami](https://github.com/SeiOkami)
* Ошибка запуска тестов из файла настроек при запрещенных синхронных вызовах [#188](https://github.com/bia-technologies/yaxunit/issues/188)
### Мокирование
* Не работает мокирование методов обработки, при обучении через менеджер [#217](https://github.com/bia-technologies/yaxunit/issues/217)
### Тестовые данные
* Ошибка генерации случайного отрицательного числа без параметров [#211](https://github.com/bia-technologies/yaxunit/issues/211)
### CI
* Починить тесты движка для английской локали [#160](https://github.com/bia-technologies/yaxunit/issues/160)
### Прочее
* При поломке контекста движка в рамках теста возникает необработаная ошибка [#234](https://github.com/bia-technologies/yaxunit/issues/234)

View File

@ -6,6 +6,14 @@ sidebar_position: 1
Здесь будут собраны материалы по доработке тестового движка.
## Окружение
- Разработка ведется с использованием [1С:Enterprise Development Tools](https://edt.1c.ru/) актуальной релизной версии
- После клонирования репозитория, необходимо подключить `precommit4onec`
- Установить [oscript](https://oscript.io/)
- Установить precommit4onec `opm install precommit4onec`
- Подключить precommit4onec к репозиторию `precommit4onec install -source-dir "exts" /путь/к/склонированному/репозиторию`. Например: путь к склонированному репозиторию '/home/valery/reps/yaxunit', то команда будет `precommit4onec install -source-dir "exts" ~/reps/yaxunit`
## Тестирование
Для прогона тестов используется [доработанная демо-конфигурация](https://github.com/bia-technologies/yaxunit/tree/develop/fixtures/demo-configuration) от фирмы [](https://github.com/1C-Company).

View File

@ -111,6 +111,10 @@ tags: [Начало, Утверждения]
### Проверка на соответствие набору условий, предикату
* `СоответствуетПредикату` - проверяет, что объект или его свойство соответствует набору условий
* `КаждыйЭлементСоответствуетПредикату` - проверяет, что элементы коллекции соответствуют переданным условиям
* `ЛюбойЭлементСоответствуетПредикату` - проверяет, что коллекция содержит элемент, который соответствует переданным условиям
* `Содержит` - проверяемая коллекция должна содержать элемент, который соответствует переданным условиям
* `НеСодержит` - проверяемая коллекция не должна содержать элемент, который соответствует переданным условиям
### Проверка методов объекта

View File

@ -9,29 +9,29 @@ tags: [Начало, Предикаты, Утверждения, Запросы,
```bsl
Процедура АктуализацияУведомлений() Экспорт
ИмяРегистра = "РегистрСведений.ОповещенияПользователя";
Объект = ТестовыеДанные.Объект();
УсловиеУведомления = ЮТест.Предикат()
.Реквизит("Источник").Равно(Объект)
.Реквизит("ТипОповещения").Равно(Справочники.ТипыОповещенийПользователя.Уведомление1)
.Получить();
ЮТест.ОжидаетЧтоТаблицаБазы(ИмяРегистра)
.НеСодержитЗаписи(УсловиеУведомления);
УведомленияВызовСервера.АктуализацияУведомлений();
ЮТест.ОжидаетЧтоТаблицаБазы(ИмяРегистра)
.СодержитЗаписи(УсловиеУведомления);
ДанныеУведомления = ЮТЗапросы.Запись(ИмяРегистра, УсловиеУведомления);
ЮТест.ОжидаетЧто(ДанныеУведомления)
.Свойство("Прочитано").ЭтоЛожь()
.Свойство("Пользователь").Равно(Справочники.ГруппыОповещенийПользователей.Инженер);
ИмяРегистра = "РегистрСведений.ОповещенияПользователя";
Объект = ТестовыеДанные.Объект();
УсловиеУведомления = ЮТест.Предикат()
.Реквизит("Источник").Равно(Объект)
.Реквизит("ТипОповещения").Равно(Справочники.ТипыОповещенийПользователя.Уведомление1)
.Получить();
ЮТест.ОжидаетЧтоТаблицаБазы(ИмяРегистра)
.НеСодержитЗаписи(УсловиеУведомления);
УведомленияВызовСервера.АктуализацияУведомлений();
ЮТест.ОжидаетЧтоТаблицаБазы(ИмяРегистра)
.СодержитЗаписи(УсловиеУведомления);
ДанныеУведомления = ЮТЗапросы.Запись(ИмяРегистра, УсловиеУведомления);
ЮТест.ОжидаетЧто(ДанныеУведомления)
.Свойство("Прочитано").ЭтоЛожь()
.Свойство("Пользователь").Равно(Справочники.ГруппыОповещенийПользователей.Инженер);
КонецПроцедуры
```
@ -49,10 +49,19 @@ tags: [Начало, Предикаты, Утверждения, Запросы,
ЮТест.ОжидаетЧто(Коллекция)
.ЛюбойЭлементСоответствуетПредикату(ЮТест.Предикат()
.Реквизит("Число").Равно(2)); // Проверят, что в коллекции есть элементы с реквизитом `Число`, которое равно `2`
ЮТест.ОжидаетЧто(Коллекция)
.Содержит(ЮТест.Предикат()
.Реквизит("Число").Равно(2)); // Тоже самое, что и проверка выше
ЮТест.ОжидаетЧто(Коллекция)
.КаждыйЭлементСоответствуетПредикату(ЮТест.Предикат()
.Заполнено().ИмеетТип("Массив")); // Проверят, что каждый элемент коллекции это заполненный массив
ЮТест.ОжидаетЧто(Коллекция)
.НеСодержит(ЮТест.Предикат()
.Реквизит("Число").Равно(2)); // Проверят, что в коллекции нет элементов с реквизитом `Число`, которое равно `2`
```
* Описания параметров метода при мокировании
@ -131,6 +140,6 @@ tags: [Начало, Предикаты, Утверждения, Запросы,
### Особенности реализации
Сам модуль предикатов используется только для формирования утверждений/условий.
Сам модуль предикатов используется только для формирования утверждений/условий.
Реализацией проверок и формированием условий занимаются другие модули и возможна ситуация, когда некоторые предикаты еще не реализованы или не поддерживаются каким-либо механизмом. Например, проверка заполненности не поддерживается запросами.
Реализацией проверок и формированием условий занимаются другие модули и возможна ситуация, когда некоторые предикаты еще не реализованы или не поддерживаются каким-либо механизмом. Например, проверка заполненности не поддерживается запросами.

View File

@ -20,14 +20,15 @@ slug: /
----
- [Назначение](#назначение)
- [Возможности](#возможности)
- [Пример тестового модуля](#пример-тестового-модуля)
- [Запуск](#запуск)
- [Запуск из EDT](#запуск-из-edt)
- [Запуск вне EDT](#запуск-вне-edt)
- [Благодарности](#благодарности)
- [Лицензия](#лицензия)
- [YAXUnit. Расширение для запуска тестов](#yaxunit-расширение-для-запуска-тестов)
- [Назначение](#назначение)
- [Возможности](#возможности)
- [Пример тестового модуля](#пример-тестового-модуля)
- [Запуск](#запуск)
- [Запуск из EDT](#запуск-из-edt)
- [Запуск вне EDT](#запуск-вне-edt)
- [Благодарности](#благодарности)
- [Лицензия](#лицензия)
## Назначение
@ -195,6 +196,6 @@ slug: /
## Лицензия
Copyright © 2022 [BIA-Technologies Limited Liability Company](http://bia-tech.ru/)
Copyright © 2023 [BIA-Technologies Limited Liability Company](http://bia-tech.ru/)
Distributed under the [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0.html)

View File

@ -16,6 +16,8 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
// BSLLS:CommentedCode-off
///////////////////////////////////////////////////////////////////
// Расширяет возможности тестирования, позволяет легко менять логику работы системы:
//
@ -44,6 +46,9 @@
// КонецФункции
// ```
///////////////////////////////////////////////////////////////////
// BSLLS:CommentedCode-on
#Область ПрограммныйИнтерфейс
// Начинает обучение (настройку) Мокито.
@ -87,15 +92,15 @@
//
// Параметры:
// Объект - Произвольный - Устанавливает проверяемый объект, вызовы методов которого будем проверять.
//
// Описание - Строка - Описание проверки, которое будет выведено при возникновении ошибки
// Возвращаемое значение:
// ОбщийМодуль - см. МокитоПроверки
Функция Проверить(Объект) Экспорт
Функция Проверить(Объект, Описание = Неопределено) Экспорт
Режимы = МокитоСлужебный.РежимыРаботы();
МокитоСлужебный.УстановитьРежим(Режимы.Проверка);
Возврат МокитоПроверки.Проверить(Объект);
Возврат МокитоПроверки.Проверить(Объект, Описание);
КонецФункции
@ -179,6 +184,9 @@
//
// Возвращаемое значение:
// Массив из Произвольный - Массив параметров
//@skip-check method-too-many-params
// BSLLS:NumberOfOptionalParams-off
// BSLLS:NumberOfParams-off
Функция МассивПараметров(Параметр1 = "_!%*",
Параметр2 = "_!%*",
Параметр3 = "_!%*",
@ -189,7 +197,7 @@
Параметр8 = "_!%*",
Параметр9 = "_!%*",
Параметр10 = "_!%*") Экспорт
Возврат ЮТОбщий.ЗначениеВМассиве(Параметр1,
Параметр2,
Параметр3,
@ -203,6 +211,27 @@
КонецФункции
// BSLLS:NumberOfParams-on
// BSLLS:NumberOfOptionalParams-on
// Возврщает идентификатор значения входного параметра по умолчанию.
//
// Возвращаемое значение:
// Строка
//
// Примеры:
//
// ЮТТесты.ДобавитьТест("Тест1")
// .СПараметрами(
// Мокито.ПараметрПоУмолчанию(),
// 2); // Будет зарегистрирован один тест с параметрами <значение по умолчанию>, 2
//
Функция ПараметрПоУмолчанию() Экспорт
Возврат "<[ЗначениеВходногоПараметраПоУмолчанию]>";
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.Мокито">
<suppressions key="com.e1c.v8codestyle.md:extension-md-object-prefix" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -36,7 +36,7 @@
Функция Обучение(Объект, СброситьСтарыеНастройки = Истина) Экспорт
УстановитьПараметрыОбучения(Объект);
МокитоСлужебный.ЗарегистрироватьПерехватОбъекта(Объект, СброситьСтарыеНастройки);
МокитоСлужебный.ДобавитьНастройкуПерехватаВызововОбъекта(Объект, СброситьСтарыеНастройки);
Возврат МокитоОбучение;
@ -164,15 +164,22 @@
Процедура ЗарегистрироватьПерехватВыражения(ИмяМетода, ПараметрыВызова)
Объект = ОбучаемыйОбъект();
ДанныеПерехвата = МокитоСлужебный.ДанныеПерехвата(Объект);
ПереданаСтруктураВызоваМетода = МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода);
Если ПереданаСтруктураВызоваМетода Тогда
Объект = ИмяМетода.Объект;
Иначе
Объект = ОбучаемыйОбъект();
КонецЕсли;
ДанныеПерехвата = МокитоСлужебный.НастройкиПерехватаОбъекта(Объект);
Если ДанныеПерехвата = Неопределено Тогда
Сообщение = СтрШаблон("Не найдены настройки перехвата для %1. Необходимо предварительно вызвать метод Мокито.Обучение(Объект)", Объект);
ВызватьИсключение Сообщение;
КонецЕсли;
Если МокитоСлужебный.ЭтоСтруктураВызоваМетода(ИмяМетода) Тогда
Если ПереданаСтруктураВызоваМетода Тогда
СтруктураВызоваМетода = ИмяМетода;
Иначе
СтруктураВызоваМетода = МокитоСлужебный.СтруктураВызоваМетода(Объект, ИмяМетода, ПараметрыВызова);
@ -186,9 +193,12 @@
Реакция = СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода);
Методы[СтруктураВызоваМетода.ИмяМетода].Реакции.Добавить(Реакция);
РеакцииМетода = Методы[СтруктураВызоваМетода.ИмяМетода].Реакции;
РеакцииМетода.Добавить(Реакция);
ПараметрыОбучения().РеакцияТекущегоВыражения = Реакция;
ПараметрыОбучения = ПараметрыОбучения();
ПараметрыОбучения.РеакцияТекущегоВыражения = Реакция;
ПараметрыОбучения.Реакции = РеакцииМетода;
КонецПроцедуры
@ -200,10 +210,18 @@
#Область Реакции
Функция ОписаниеУсловнойРеакции()
Возврат Новый Структура("УсловиеРеакции, Действие");
КонецФункции
Функция СоздатьОписаниеУсловнойРеакции(СтруктураВызоваМетода)
Условия = МокитоСлужебный.УсловиеИзПараметров(СтруктураВызоваМетода.Параметры);
Возврат Новый Структура("УсловиеРеакции, Действие", Условия, Неопределено);
ОписаниеУсловнойРеакции = ОписаниеУсловнойРеакции();
ОписаниеУсловнойРеакции.УсловиеРеакции = Условия;
Возврат ОписаниеУсловнойРеакции;
КонецФункции
@ -213,33 +231,38 @@
Функция ОбучаемыйОбъект()
ПараметрыОбучения = ПараметрыОбучения();
Возврат ПараметрыОбучения.ОбучаемыйОбъект;
Возврат ПараметрыОбучения().ОбучаемыйОбъект;
КонецФункции
Функция ПараметрыОбучения()
Параметры = МокитоСлужебный.Настройки().ПараметрыОбучения;
Возврат Параметры;
Возврат МокитоСлужебный.Настройки().ПараметрыОбучения;
КонецФункции
Процедура УстановитьПараметрыОбучения(Объект)
ПараметрыОбучения = Новый Структура("ОбучаемыйОбъект, РеакцияТекущегоВыражения", Объект, Неопределено);
ПараметрыОбучения = Новый Структура("ОбучаемыйОбъект, РеакцияТекущегоВыражения, Реакции", Объект, Неопределено);
МокитоСлужебный.Настройки().ПараметрыОбучения = ПараметрыОбучения;
КонецПроцедуры
Процедура ЗарегистрироватьРеакцию(Действие)
Параметры = ПараметрыОбучения();
Действие.Вставить("Обработано", Ложь);
ПараметрыОбучения().РеакцияТекущегоВыражения.Действие = Действие;
Если Параметры.РеакцияТекущегоВыражения.Действие = Неопределено Тогда
Параметры.РеакцияТекущегоВыражения.Действие = Действие;
Иначе
НоваяРеакция = ОписаниеУсловнойРеакции();
ЗаполнитьЗначенияСвойств(НоваяРеакция, Параметры.РеакцияТекущегоВыражения);
НоваяРеакция.Действие = Действие;
Параметры.РеакцияТекущегоВыражения = НоваяРеакция;
Параметры.Реакции.Добавить(НоваяРеакция);
КонецЕсли;
КонецПроцедуры

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.МокитоОбучение">
<suppressions key="com.e1c.v8codestyle.md:extension-md-object-prefix" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -19,9 +19,9 @@
#Область ПрограммныйИнтерфейс
// см. Мокито.Проверить
Функция Проверить(Объект) Экспорт
Функция Проверить(Объект, Описание) Экспорт
УстановитьПараметрыПроверки(Объект);
УстановитьПараметрыПроверки(Объект, Описание);
Возврат МокитоПроверки;
КонецФункции
@ -70,11 +70,13 @@
// ОбщийМодуль - Этот же модуль, для замыкания
Функция Равно(Количество, Знач Описание = Неопределено) Экспорт
Настройки = ПараметрыПроверки();
Статистика = СтатистикаВызовов();
ЮТУтверждения
.Что(Статистика, Описание)
.Что(Статистика, Настройки.Описание)
.ИмеющееПредставление(ОписаниеПроверяемогоОбъекта())
.ИмеетДлину(Количество);
.ИмеетДлину(Количество, Описание);
Возврат МокитоПроверки;
@ -168,17 +170,18 @@
// Структура:
// * ПроверяемыйОбъект - Произвольный
// * СтруктураВызоваМетода - см. МокитоСлужебный.СтруктураВызоваМетода
// * Описание - Строка
Функция ПараметрыПроверки()
Параметры = МокитоСлужебный.Настройки().ПараметрыПроверки;
Возврат Параметры;
//@skip-check constructor-function-return-section
Возврат МокитоСлужебный.Настройки().ПараметрыПроверки;
КонецФункции
Процедура УстановитьПараметрыПроверки(Объект = Неопределено, СтруктураВызоваМетода = Неопределено)
Процедура УстановитьПараметрыПроверки(Объект, Описание)
ПараметрыОбучения = Новый Структура("ПроверяемыйОбъект, СтруктураВызоваМетода", Объект, СтруктураВызоваМетода);
МокитоСлужебный.Настройки().ПараметрыПроверки = ПараметрыОбучения;
ПараметрыПроверки = Новый Структура("ПроверяемыйОбъект, Описание, СтруктураВызоваМетода", Объект, Описание);
МокитоСлужебный.Настройки().ПараметрыПроверки = ПараметрыПроверки;
КонецПроцедуры
@ -195,47 +198,45 @@
Возврат Новый Массив();
КонецЕсли;
Если ЗначениеЗаполнено(СтруктураВызоваМетода.Параметры) Тогда
УсловияПроверки = МокитоСлужебный.УсловиеИзПараметров(СтруктураВызоваМетода.Параметры);
Результат = Новый Массив();
Для Каждого ВызовМетода Из ВызовыМетода Цикл
Если ВызовМетода.Параметры.Количество() < СтруктураВызоваМетода.Параметры.Количество() Тогда
ВызватьИсключение "Сигнатура метода содержит меньше параметров";
КонецЕсли;
КоличествоУсловий = УсловияПроверки.Количество();
Успешно = Истина;
Для Инд = 0 По КоличествоУсловий - 1 Цикл
Параметр = ВызовМетода.Параметры[Инд];
Условие = УсловияПроверки[Инд];
Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие);
Если НЕ Успешно Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если Успешно Тогда
Результат.Добавить(ВызовМетода);
Если Первый Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
ВызовыМетода = Результат;
Если НЕ ЗначениеЗаполнено(СтруктураВызоваМетода.Параметры) Тогда
Возврат ВызовыМетода;
КонецЕсли;
Возврат ВызовыМетода;
УсловияПроверки = МокитоСлужебный.УсловиеИзПараметров(СтруктураВызоваМетода.Параметры);
Результат = Новый Массив();
Для Каждого ВызовМетода Из ВызовыМетода Цикл
Если ВызовМетода.Параметры.Количество() < СтруктураВызоваМетода.Параметры.Количество() Тогда
ВызватьИсключение "Сигнатура метода содержит меньше параметров";
КонецЕсли;
КоличествоУсловий = УсловияПроверки.Количество();
Успешно = Истина;
Для Инд = 0 По КоличествоУсловий - 1 Цикл
Параметр = ВызовМетода.Параметры[Инд];
Условие = УсловияПроверки[Инд];
Успешно = МокитоСлужебный.ПроверитьПараметр(Параметр, Условие);
Если НЕ Успешно Тогда
Прервать;
КонецЕсли;
КонецЦикла;
Если Успешно Тогда
Результат.Добавить(ВызовМетода);
Если Первый Тогда
Прервать;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.МокитоПроверки">
<suppressions key="com.e1c.v8codestyle.md:extension-md-object-prefix" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -20,7 +20,9 @@
Функция Включен() Экспорт
Возврат ЮТКонтекст.ДанныеКонтекста() <> Неопределено;
ДанныеКонтекста = ЮТКонтекст.ДанныеКонтекста();
Настройки = Неопределено;
Возврат ДанныеКонтекста <> Неопределено И ДанныеКонтекста.Свойство(КлючНастроек(), Настройки) И Настройки <> Неопределено;
КонецФункции
@ -35,24 +37,16 @@
// Настройки.
//
// Возвращаемое значение:
// Структура - Настройки:
// * Метод - Строка
// * Реакция - Строка
// * Настройки - Строка
// * Перехват - Строка
// * Режим - Строка - см. РежимыРаботы
// * Статистика - Структура - Статистика вызовов:
// * Вызовы - Соответствие из Структура
// * ПараметрыОбучения - Структура
// * ПараметрыПроверки - Структура
// см. НовыеНастройки
Функция Настройки() Экспорт
Настройки = ЮТКонтекст.ЗначениеКонтекста(КлючНастроек());
Настройки = ЮТКонтекст.ЗначениеКонтекста(КлючНастроек());
Если Настройки = Неопределено Тогда
ВызватьИсключение "Что-то пошло не так, настройки Мокито не инициализированы";
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат Настройки;
КонецФункции
@ -94,7 +88,11 @@
Настройки = Настройки();
ПараметрыПерехвата = ДанныеПерехвата(Объект);
Если НЕ ЗначениеЗаполнено(Настройки.Перехват) Или Настройки.ТипыПерехватываемыхОбъектов[ТипЗнч(Объект)] = Неопределено Тогда
Возврат Неопределено;
КонецЕсли;
ПараметрыПерехвата = ДанныеПерехвата(Объект, Настройки);
Если ПараметрыПерехвата = Неопределено Тогда
Возврат Неопределено;
@ -116,12 +114,15 @@
КонецЕсли;
Возврат Неопределено;
КонецФункции
// Структура вызова метода.
//
// Параметры:
// Объект - Произвольный - Объект, которому принадлежит метод
// Объект - Произвольный - Объект, которому принадлежит метод
// - Структура - см. СтруктураВызоваМетода
// ИмяМетода - Строка - Имя вызванного метода
// ПараметрыМетода - Массив из Произвольный - Набор параметров, с которыми был вызван метод
//
@ -140,6 +141,7 @@
СтруктураВызоваМетода = Новый Структура("Объект, ИмяМетода, Параметры", Объект, ИмяМетода, ПараметрыМетода);
СтруктураВызоваМетода.Вставить("Контекст");
//@skip-check constructor-function-return-section
Возврат СтруктураВызоваМетода;
КонецФункции
@ -235,16 +237,32 @@
КонецФункции
Функция НастройкиПерехватаОбъекта(Объект) Экспорт
ПараметрыПерехвата = ПараметрыПерехвата();
Возврат ПараметрыПерехвата[Объект];
КонецФункции
// Данные перехвата.
//
// Параметры:
// Объект - Произвольный
// Настройки - см. НовыеНастройки
//
// Возвращаемое значение:
// см. МокитоСлужебный.ОписаниеПараметровПерехватаОбъекта
Функция ДанныеПерехвата(Объект) Экспорт
// см. ОписаниеПараметровПерехватаОбъекта
Функция ДанныеПерехвата(Объект, Настройки = Неопределено) Экспорт
ПараметрыПерехвата = ПараметрыПерехвата();
Если Настройки = Неопределено Тогда
ПараметрыПерехвата = ПараметрыПерехвата();
Иначе
ПараметрыПерехвата = Настройки.Перехват;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ПараметрыПерехвата) Тогда
Возврат Неопределено;
КонецЕсли;
Если ТипЗнч(Объект) = Тип("Структура") Тогда
Ключ = Объект.Объект;
@ -253,39 +271,79 @@
КонецЕсли;
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ];
ТипЗначения = ТипЗнч(Ключ);
Если ПараметрыПерехватаОбъекта = Неопределено И ЭтоОбъект(Ключ) Тогда
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ.Ссылка];
Если ПараметрыПерехватаОбъекта = Неопределено Тогда
Если ПараметрыПерехватаОбъекта = Неопределено Тогда
Если ЮТТипыДанныхСлужебный.ЭтоТипОбъектаОбработкиОтчета(ТипЗначения) Или ЮТТипыДанныхСлужебный.ЭтоТипНабораЗаписей(ТипЗначения) Тогда
ПолноеИмя = СтрРазделить(Ключ.Метаданные().ПолноеИмя(), ".");
Менеджер = Новый(СтрШаблон("%1Менеджер.%2", ПолноеИмя[0], ПолноеИмя[1]));
Менеджер = ЮТОбщий.Менеджер(ТипЗначения);
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Менеджер];
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипОбъекта(ТипЗначения) Тогда
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Ключ.Ссылка];
Если ПараметрыПерехватаОбъекта = Неопределено Тогда
Менеджер = ЮТОбщий.Менеджер(ТипЗначения);
ПараметрыПерехватаОбъекта = ПараметрыПерехвата[Менеджер];
КонецЕсли;
КонецЕсли;
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат ПараметрыПерехватаОбъекта;
КонецФункции
Процедура ЗарегистрироватьПерехватОбъекта(Знач Объект, СброситьСтарыеНастройки = Истина) Экспорт
Процедура ДобавитьНастройкуПерехватаВызововОбъекта(Знач Объект, СброситьСтарыеНастройки = Истина) Экспорт
Если ЭтоОбъект(Объект) Тогда
Объект = Объект.Ссылка;
Настройки = Настройки();
Если СброситьСтарыеНастройки ИЛИ Настройки.Перехват[Объект] = Неопределено Тогда
Настройки.Перехват.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект));
КонецЕсли;
ПараметрыПерехвата = ПараметрыПерехвата();
ТипОбъекта = ТипЗнч(Объект);
Если СброситьСтарыеНастройки ИЛИ ПараметрыПерехвата[Объект] = Неопределено Тогда
ПараметрыПерехвата.Вставить(Объект, ОписаниеПараметровПерехватаОбъекта(Объект));
Настройки.ТипыПерехватываемыхОбъектов.Вставить(ТипОбъекта, Истина);
Если ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипОбъекта) Тогда
ТипОбъекта = ЮТТипыДанныхСлужебный.ТипОбъектаСсылки(ТипОбъекта);
Настройки.ТипыПерехватываемыхОбъектов.Вставить(ТипОбъекта, Истина);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипМенеджера(ТипОбъекта) Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(ТипОбъекта);
Если Описание <> Неопределено Тогда
Если Описание.ОписаниеТипа.Ссылочный Или Описание.ОписаниеТипа.ОбработкаОтчет Тогда
ТипОбъекта = Тип(СтрШаблон("%1Объект.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
ИначеЕсли Описание.ОписаниеТипа.Регистр Тогда
ТипОбъекта = Тип(СтрШаблон("%1НаборЗаписей.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
КонецЕсли;
Настройки.ТипыПерехватываемыхОбъектов.Вставить(ТипОбъекта, Истина);
КонецЕсли;
#КонецЕсли
КонецЕсли;
КонецПроцедуры
// Описание параметров перехвата объекта.
//
// Параметры:
// Объект - Произвольный - Объект
//
// Возвращаемое значение:
// Структура - Описание параметров перехвата объекта:
// * Объект - Произвольный
// * Методы - Структура
Функция ОписаниеПараметровПерехватаОбъекта(Объект) Экспорт
Возврат Новый Структура("Объект, Методы", Объект, Новый Структура);
@ -298,17 +356,23 @@
Функция СтатистикаВызовов(Знач Объект, ИмяМетода) Экспорт
Если ЭтоОбъект(Объект) Тогда
Объект = Объект.Ссылка;
Вызовы = Настройки().Статистика.Вызовы;
СтатистикаВызововМетода = Новый Массив();
Статистика = Вызовы[Объект];
ТипОбъекта = ТипЗнч(Объект);
Если Статистика <> Неопределено И Статистика.Свойство(ИмяМетода) Тогда
СтатистикаВызововМетода = Статистика[ИмяМетода];
ИначеЕсли Статистика = Неопределено И ЮТТипыДанныхСлужебный.ЭтоСсылочныйТип(ТипОбъекта) Тогда
СтатистикаВызововМетода = СтатистикаВызововПоСсылке(Вызовы, Объект, ИмяМетода);
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоТипМенеджера(ТипОбъекта) Тогда
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
СтатистикаВызововМетода = СтатистикаВызововПоМенеджеру(Вызовы, Объект, ИмяМетода);
#КонецЕсли
КонецЕсли;
Статистика = Настройки().Статистика.Вызовы[Объект];
Если Статистика = Неопределено ИЛИ НЕ Статистика.Свойство(ИмяМетода) Тогда
Возврат Неопределено;
КонецЕсли;
Возврат Статистика[ИмяМетода];
Возврат СтатистикаВызововМетода;
КонецФункции
@ -343,35 +407,6 @@
#Область ОбработкаВызовов
// Зарегистрировать вызов метода.
//
// Параметры:
// Настройки - см. ИнициализироватьНастройки
// ПараметрыПерехвата - см. ДанныеПерехвата
// СтруктураВызоваМетода - см. СтруктураВызоваМетода
Процедура ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода)
Объект = ПараметрыПерехвата.Объект;
ИмяМетода = СтруктураВызоваМетода.ИмяМетода;
Статистика = Настройки.Статистика.Вызовы[Объект];
Если Статистика = Неопределено Тогда
Статистика = Новый Структура;
Настройки.Статистика.Вызовы.Вставить(Объект, Статистика);
КонецЕсли;
Если НЕ Статистика.Свойство(ИмяМетода) Тогда
Статистика.Вставить(ИмяМетода, Новый Массив);
КонецЕсли;
Статистика[ИмяМетода].Добавить(СтруктураВызоваМетода);
КонецПроцедуры
Функция ПерехватитьВызовМетода(ПараметрыПерехвата, СтруктураВызоваМетода, ПрерватьВыполнение)
Если НЕ ПараметрыПерехвата.Методы.Свойство(СтруктураВызоваМетода.ИмяМетода) Тогда
@ -416,6 +451,7 @@
КонецЕсли;
Возврат Неопределено;
КонецФункции
#КонецОбласти
@ -495,20 +531,40 @@
Процедура ИнициализироватьНастройки() Экспорт
ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), НовыеНастройки(), Истина);
КонецПроцедуры
// Новые настройки.
//
// Возвращаемое значение:
// Структура - Настройки:
// * Метод - Строка
// * Реакция - Строка
// * Перехват - Соответствие Из Произвольный
// * ТипыПерехватываемыхОбъектов - Соответствие Из Тип
// * Режим - Строка - см. РежимыРаботы
// * Статистика - Структура - Статистика вызовов:
// * Вызовы - Соответствие из Структура
// * ПараметрыОбучения - Структура
// * ПараметрыПроверки - Структура
Функция НовыеНастройки()
Настройки = Новый Структура;
Настройки.Вставить("Метод");
Настройки.Вставить("Реакция");
Настройки.Вставить("Настройки");
Настройки.Вставить("Перехват", Новый Соответствие);
Настройки.Вставить("ТипыПерехватываемыхОбъектов", Новый Соответствие);
Настройки.Вставить("Режим", "НеУстановлен");
Настройки.Вставить("Статистика", Новый Структура("Вызовы", Новый Соответствие));
Настройки.Вставить("ПараметрыОбучения", Неопределено);
Настройки.Вставить("ПараметрыПроверки", Неопределено);
ЮТКонтекст.УстановитьЗначениеКонтекста(КлючНастроек(), Настройки, Истина);
//@skip-check constructor-function-return-section
Возврат Настройки;
КонецПроцедуры
КонецФункции
Процедура ОчиститьНастройки() Экспорт
@ -539,39 +595,6 @@
#КонецОбласти
Функция ЭтоСсылка(Значение) Экспорт
Если Значение <> Неопределено Тогда
ТипыСсылок = ЮТОбщий.ОписаниеТиповЛюбаяСсылка();
Результат = ТипыСсылок.СодержитТип(ТипЗнч(Значение));
Иначе
Результат = Ложь;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ЭтоОбъект(Значение) Экспорт
Если Значение <> Неопределено И ЮТОбщий.ПеременнаяСодержитСвойство(Значение, "Ссылка") Тогда
Возврат ЭтоСсылка(Значение.Ссылка);
Иначе
Результат = Ложь;
КонецЕсли;
Возврат Результат;
КонецФункции
Функция УсловиеИзПараметров(Параметры) Экспорт
Если Параметры = Неопределено Тогда
@ -608,4 +631,84 @@
КонецФункции
#Область Статистика
// Зарегистрировать вызов метода.
//
// Параметры:
// Настройки - см. ИнициализироватьНастройки
// ПараметрыПерехвата - см. ДанныеПерехвата
// СтруктураВызоваМетода - см. СтруктураВызоваМетода
Процедура ЗарегистрироватьВызовМетода(Настройки, ПараметрыПерехвата, СтруктураВызоваМетода)
Объект = СтруктураВызоваМетода.Объект;
ИмяМетода = СтруктураВызоваМетода.ИмяМетода;
Статистика = Настройки.Статистика.Вызовы[Объект];
Если Статистика = Неопределено Тогда
Статистика = Новый Структура;
Настройки.Статистика.Вызовы.Вставить(Объект, Статистика);
КонецЕсли;
Если НЕ Статистика.Свойство(ИмяМетода) Тогда
Статистика.Вставить(ИмяМетода, Новый Массив);
КонецЕсли;
Статистика[ИмяМетода].Добавить(СтруктураВызоваМетода);
КонецПроцедуры
Функция СтатистикаВызововПоСсылке(Вызовы, Ссылка, ИмяМетода)
СтатистикаВызововМетода = Новый Массив();
ТипОбъекта = ЮТТипыДанныхСлужебный.ТипОбъектаСсылки(ТипЗнч(Ссылка));
Для Каждого Элемент Из Вызовы Цикл
ПодходящийЭлемент = ТипЗнч(Элемент.Ключ) = ТипОбъекта
И Элемент.Ключ.Ссылка = Ссылка
И Элемент.Значение.Свойство(ИмяМетода);
Если ПодходящийЭлемент Тогда
ЮТОбщий.ДополнитьМассив(СтатистикаВызововМетода, Элемент.Значение[ИмяМетода]);
КонецЕсли;
КонецЦикла;
Возврат СтатистикаВызововМетода;
КонецФункции
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ТолстыйКлиентУправляемоеПриложение Тогда
Функция СтатистикаВызововПоМенеджеру(Вызовы, Менеджер, ИмяМетода)
СтатистикаВызововМетода = Новый Массив();
Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер);
Если Описание = Неопределено Тогда
Возврат СтатистикаВызововМетода;
КонецЕсли;
Если Описание.ОписаниеТипа.Ссылочный Или Описание.ОписаниеТипа.ОбработкаОтчет Тогда
ТипОбъекта = Тип(СтрШаблон("%1Объект.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
ИначеЕсли Описание.ОписаниеТипа.Регистр Тогда
ТипОбъекта = Тип(СтрШаблон("%1НаборЗаписей.%2", Описание.ОписаниеТипа.Имя, Описание.Имя));
КонецЕсли;
Для Каждого Элемент Из Вызовы Цикл
ПодходящийЭлемент = ТипЗнч(Элемент.Ключ) = ТипОбъекта
И Элемент.Значение.Свойство(ИмяМетода);
Если ПодходящийЭлемент Тогда
ЮТОбщий.ДополнитьМассив(СтатистикаВызововМетода, Элемент.Значение[ИмяМетода]);
КонецЕсли;
КонецЦикла;
Возврат СтатистикаВызововМетода;
КонецФункции
#КонецЕсли
#КонецОбласти
#КонецОбласти

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.МокитоСлужебный">
<suppressions key="com.e1c.v8codestyle.md:extension-md-object-prefix" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -67,14 +67,34 @@
КонецФункции
Функция НовыйПустойОбработчик1() Экспорт
Функция НовыйПустойОбработчик(КоличествоПараметров = 1) Экспорт
Возврат Новый ОписаниеОповещения("ПустойОбработчик1", ЭтотОбъект);
МаксимальноеДопустимоеЧислоПараметров = 3;
Если КоличествоПараметров >= 1 И КоличествоПараметров <= МаксимальноеДопустимоеЧислоПараметров Тогда
Возврат Новый ОписаниеОповещения("ПустойОбработчик" + КоличествоПараметров, ЭтотОбъект);
Иначе
ВызватьИсключение СтрШаблон("Пустой обработчик с %1 параметрами не реализован", КоличествоПараметров);
КонецЕсли;
КонецФункции
//@skip-check module-empty-method
//@skip-check doc-comment-parameter-section
Процедура ПустойОбработчик1(Параметр1) Экспорт
КонецПроцедуры
//@skip-check module-empty-method
//@skip-check doc-comment-parameter-section
Процедура ПустойОбработчик2(Параметр1, Параметр2) Экспорт
КонецПроцедуры
//@skip-check module-empty-method
//@skip-check doc-comment-parameter-section
Процедура ПустойОбработчик3(Параметр1, Параметр2, Параметр3) Экспорт
КонецПроцедуры
#КонецОбласти

View File

@ -60,7 +60,7 @@
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Структура, Неопределено - Содержит все данные записи, включая табличный части
Функция Запись(ИмяТаблицы, Предикат) Экспорт
@ -78,7 +78,7 @@
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Массив из Структура - Найденные записи, включая табличный части
Функция Записи(ИмяТаблицы, Предикат) Экспорт
@ -134,7 +134,7 @@
// Предикат - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор условий, см. ЮТПредикаты.Получить
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// - Неопределено - Проверит, что таблица не пустая
// - Неопределено - Проверит, что таблица не пустая
// Возвращаемое значение:
// Булево - Таблица содержит записи
Функция ТаблицаСодержитЗаписи(ИмяТаблицы, Предикат = Неопределено) Экспорт
@ -179,11 +179,12 @@
//
// Возвращаемое значение:
// Структура - Описание запроса:
// * ИмяТаблицы - Строка -
// * ВыбираемыеПоля - Массив из Строка
// * ИмяТаблицы - Строка - Имя таблицы, из которой нужно получить данные
// * ВыбираемыеПоля - Массив из Строка - Выражения выбираемых полей
// * КоличествоЗаписей - Число, Неопределено - Ограничение количества выбираемых записей
// * Условия - Массив из Строка - Коллекция выражений условий, которые будут объединены через `И`
// * ЗначенияПараметров - Структура - Набор параметров запроса
// * Порядок - Массив из Строка - Поля сортировки
Функция ОписаниеЗапроса() Экспорт
Описание = Новый Структура();
@ -191,6 +192,7 @@
Описание.Вставить("ВыбираемыеПоля", Новый Массив);
Описание.Вставить("КоличествоЗаписей", Неопределено);
Описание.Вставить("Условия", Новый Массив());
Описание.Вставить("Порядок", Новый Массив());
Описание.Вставить("ЗначенияПараметров", Новый Структура());
//@skip-check constructor-function-return-section
@ -198,4 +200,33 @@
КонецФункции
// Возвращает коллекцию движений документа
//
// Параметры:
// Документ - ДокументСсылка
// ИмяРегистра - Строка - Короткое или полное имя регистра движений
//
// Возвращаемое значение:
// Массив из Структура - Движения документа для клиента
// ТаблицаЗначений - Движения документа для сервера
Функция ДвиженияДокумента(Документ, Знач ИмяРегистра) Экспорт
Если СтрНайти(ИмяРегистра, ".") = 0 Тогда
РегистрыДвижения = ЮТМетаданные.РегистрыДвиженийДокумента(Документ);
Если НЕ РегистрыДвижения.Свойство(ИмяРегистра) Тогда
ВызватьИсключение "Документ не делает движений по регистру " + ИмяРегистра;
КонецЕсли;
ИмяРегистра = РегистрыДвижения[ИмяРегистра];
КонецЕсли;
Предикат = ЮТест.Предикат().Реквизит("Регистратор").Равно(Документ);
ОписаниеЗапроса = ЮТЗапросыКлиентСервер.ОписаниеЗапроса(ИмяРегистра, Предикат, "*");
ОписаниеЗапроса.Порядок.Добавить("НомерСтроки");
Возврат ЮТЗапросыВызовСервера.Записи(ОписаниеЗапроса, Ложь);
КонецФункции
#КонецОбласти

View File

@ -18,7 +18,7 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция РезультатЗапроса(ОписаниеЗапроса, ДляКлиента) Экспорт
Функция РезультатЗапроса(Знач ОписаниеЗапроса, Знач ДляКлиента) Экспорт
Запрос = Запрос(ОписаниеЗапроса);
РезультатЗапроса = Запрос.Выполнить();
@ -53,7 +53,7 @@
// Возвращаемое значение:
// - Структура Из Произвольный - Значения реквизитов ссылки при получении значений множества реквизитов
// - Произвольный - Значение реквизита ссылки при получении значения одного реквизита
Функция ЗначенияРеквизитов(Ссылка, ИменаРеквизитов, ОдинРеквизит) Экспорт
Функция ЗначенияРеквизитов(Знач Ссылка, Знач ИменаРеквизитов, Знач ОдинРеквизит) Экспорт
ИмяТаблицы = Ссылка.Метаданные().ПолноеИмя();
@ -77,7 +77,7 @@
//
// Возвращаемое значение:
// Массив из Структура, Структура, Неопределено - Записи
Функция Записи(ОписаниеЗапроса, ОднаЗапись) Экспорт
Функция Записи(Знач ОписаниеЗапроса, Знач ОднаЗапись) Экспорт
Если ОднаЗапись Тогда
ОписаниеЗапроса.КоличествоЗаписей = 1;
@ -108,7 +108,7 @@
// - Структура Из Произвольный - Значения множества реквизитов записи
// - Произвольный - Значение одного реквизита записи
//
Функция ЗначенияРеквизитовЗаписи(ОписаниеЗапроса, ОдинРеквизит) Экспорт
Функция ЗначенияРеквизитовЗаписи(Знач ОписаниеЗапроса, Знач ОдинРеквизит) Экспорт
Запись = Записи(ОписаниеЗапроса, Истина);
@ -122,7 +122,7 @@
КонецЕсли;
Если ОдинРеквизит Тогда
Для каждого КлючЗнач Из Запись Цикл
Для Каждого КлючЗнач Из Запись Цикл
Возврат КлючЗнач.Значение;
КонецЦикла;
Иначе
@ -144,6 +144,8 @@
// Запрос
Функция Запрос(ОписаниеЗапроса)
Запрос = Новый Запрос;
Строки = Новый Массив();
Строки.Добавить("ВЫБРАТЬ ");
@ -159,14 +161,21 @@
Строки.Добавить(СтрСоединить(ВыбираемыеПоля, "," + Символы.ПС));
Строки.Добавить("ИЗ " + ОписаниеЗапроса.ИмяТаблицы);
Условия = СформироватьУсловия(ОписаниеЗапроса.Условия, ОписаниеЗапроса.ИмяТаблицы, Запрос);
Если ОписаниеЗапроса.Условия.Количество() Тогда
Если Условия.Количество() Тогда
Строки.Добавить("ГДЕ (");
Строки.Добавить(СтрСоединить(ОписаниеЗапроса.Условия, ") И (" + Символы.ПС));
Строки.Добавить(СтрСоединить(Условия, ") И (" + Символы.ПС));
Строки.Добавить(")");
КонецЕсли;
Запрос = Новый Запрос(СтрСоединить(Строки, Символы.ПС));
Если ОписаниеЗапроса.Порядок.Количество() Тогда
Строки.Добавить("УПОРЯДОЧИТЬ ПО ");
Строки.Добавить(СтрСоединить(ОписаниеЗапроса.Порядок, ","));
КонецЕсли;
Запрос.Текст = СтрСоединить(Строки, Символы.ПС);
ЮТОбщий.ОбъединитьВСтруктуру(Запрос.Параметры, ОписаниеЗапроса.ЗначенияПараметров);
Возврат Запрос;
@ -254,8 +263,8 @@
СхемаЗапроса = Новый СхемаЗапроса();
СхемаЗапроса.УстановитьТекстЗапроса(Запрос.Текст);
Для каждого ЗапросСЗ Из СхемаЗапроса.ПакетЗапросов Цикл
Для каждого КолонкаСЗ Из ЗапросСЗ.Колонки Цикл
Для Каждого ЗапросСЗ Из СхемаЗапроса.ПакетЗапросов Цикл
Для Каждого КолонкаСЗ Из ЗапросСЗ.Колонки Цикл
Псевдонимы.Добавить(КолонкаСЗ.Псевдоним);
КонецЦикла;
КонецЦикла;
@ -264,4 +273,123 @@
КонецФункции
Функция ШаблонУсловия(ВыражениеПредиката, ВыраженияПредикатов, ТипРеквизита)
Выражение = ВыражениеПредиката.ВидСравнения;
Отрицание = ЮТПредикатыКлиентСервер.ЭтоВыраженияОтрицания(Выражение);
Если Отрицание Тогда
Выражение = ЮТПредикатыКлиентСервер.ВыраженияБезОтрицания(Выражение);
КонецЕсли;
Если Выражение = ВыраженияПредикатов.Равно Тогда
Если ЭтоСтрокаНеограниченнойДлинны(ТипРеквизита) Тогда
Шаблон = СтрШаблон("ВЫРАЗИТЬ(%%1 КАК Строка(%1)) = &%%2", XMLСтрока(СтрДлина(ВыражениеПредиката.Значение) + 1));
Иначе
Шаблон = "%1 = &%2";
КонецЕсли;
ИначеЕсли Выражение = ВыраженияПредикатов.Больше Тогда
Шаблон = "%1 > &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.БольшеРавно Тогда
Шаблон = "%1 >= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Меньше Тогда
Шаблон = "%1 < &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.МеньшеРавно Тогда
Шаблон = "%1 <= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.ИмеетТип Тогда
Шаблон = "ТИПЗНАЧЕНИЯ(%1) = &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Содержит Тогда
Шаблон = "%1 ПОДОБНО ""%%"" + &%2 + ""%%""";
ИначеЕсли Выражение = ВыраженияПредикатов.Заполнено Тогда
// TODO Реализовать
ВызватьИсключение "Проверка заполненности пока не поддерживается";
Иначе
ВызватьИсключение "Неподдерживаемое выражения предикатов " + Выражение;
КонецЕсли;
Если Отрицание Тогда
Шаблон = СтрШаблон("НЕ (%1)", Шаблон);
КонецЕсли;
Возврат Шаблон;
КонецФункции
Функция ТипыРеквизитов(ИмяТаблицы, Предикаты)
Результат = Новый Соответствие();
Реквизиты = Новый Массив();
ПсевдонимТаблицы = ЮТТестовыеДанные.СлучайныйИдентификатор() + СтрЗаменить(ИмяТаблицы, ".", "");
ДлинаПсевдонима = СтрДлина(ПсевдонимТаблицы);
Для Каждого ВыражениеПредиката Из Предикаты Цикл
Если ЮТПредикатыКлиентСервер.ЭтоПредикат(ВыражениеПредиката) И ЗначениеЗаполнено(ВыражениеПредиката.ИмяРеквизита) Тогда
Реквизиты.Добавить(СтрШаблон("%1.%2 КАК _%3", ПсевдонимТаблицы, ВыражениеПредиката.ИмяРеквизита, Реквизиты.Количество()));
КонецЕсли;
КонецЦикла;
Если НЕ ЗначениеЗаполнено(Реквизиты) Тогда
Возврат Результат;
КонецЕсли;
Схема = Новый СхемаЗапроса();
Попытка
Схема.УстановитьТекстЗапроса(СтрШаблон("ВЫБРАТЬ %1 ИЗ %2 КАК %3", СтрСоединить(Реквизиты, ","), ИмяТаблицы, ПсевдонимТаблицы));
Исключение
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки("Не удалось получить типы реквизитов отбора.
|Возможно имена реквизитов заданы неверно");
ВызватьИсключение;
КонецПопытки;
Для Каждого Колонка Из Схема.ПакетЗапросов[0].Колонки Цикл
Выражение = Строка(Колонка.Поля[0]);
Результат.Вставить(Сред(Выражение, ДлинаПсевдонима + 2), Новый ОписаниеТипов(Колонка.ТипЗначения, , "Null"));
КонецЦикла;
Возврат Результат;
КонецФункции
Функция ЭтоСтрокаНеограниченнойДлинны(ТипРеквизита)
Возврат ТипРеквизита <> Неопределено
И ТипРеквизита.СодержитТип(Тип("Строка"))
И ТипРеквизита.КвалификаторыСтроки.Длина = 0;
КонецФункции
Функция СформироватьУсловия(Условия, ИмяТаблицы, Запрос) Экспорт
Результат = Новый Массив();
Если НЕ ЗначениеЗаполнено(Условия) Тогда
Возврат Результат;
КонецЕсли;
ТипыРеквизитов = ТипыРеквизитов(ИмяТаблицы, Условия);
ВидыСравнения = ЮТПредикаты.Выражения();
Для Каждого Условие Из Условия Цикл
Если НЕ ЮТПредикатыКлиентСервер.ЭтоПредикат(Условие) Тогда
Результат.Добавить(Условие);
Продолжить;
КонецЕсли;
ИмяПараметра = "Параметр_" + ЮТОбщий.ЧислоВСтроку(Запрос.Параметры.Количество() + 1);
ТипРеквизита = ТипыРеквизитов[Условие.ИмяРеквизита];
Шаблон = ШаблонУсловия(Условие, ВидыСравнения, ТипРеквизита);
ТекстУсловия = СтрШаблон(Шаблон, Условие.ИмяРеквизита, ИмяПараметра);
Результат.Добавить(ТекстУсловия);
Запрос.Параметры.Вставить(ИмяПараметра, Условие.Значение);
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти

View File

@ -28,81 +28,24 @@
ЗаполнитьВыбираемыеПоля(Описание, ВыбираемыеПоля);
КонецЕсли;
СформироватьУсловия(ПредикатыУсловия, Описание.Условия, Описание.ЗначенияПараметров);
Если ПредикатыУсловия <> Неопределено Тогда
Описание.Условия = ЮТПредикатыКлиентСервер.НаборПредикатов(ПредикатыУсловия);
КонецЕсли;
Возврат Описание;
КонецФункции
Процедура СформироватьУсловия(Предикат, КоллекцияУсловий, ЗначенияПараметров) Экспорт
Если Предикат = Неопределено Тогда
Возврат;
КонецЕсли;
Предикаты = ЮТПредикатыКлиентСервер.НаборПредикатов(Предикат);
ВидыСравнения = ЮТПредикаты.Выражения();
Для Каждого ВыражениеПредиката Из Предикаты Цикл
ИмяПараметра = "Параметр_" + ЮТОбщий.ЧислоВСтроку(ЗначенияПараметров.Количество() + 1);
Шаблон = ШаблонУсловия(ВыражениеПредиката.ВидСравнения, ВидыСравнения);
Условие = СтрШаблон(Шаблон, ВыражениеПредиката.ИмяРеквизита, ИмяПараметра);
КоллекцияУсловий.Добавить(Условие);
ЗначенияПараметров.Вставить(ИмяПараметра, ВыражениеПредиката.Значение);
КонецЦикла;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ШаблонУсловия(Знач Выражение, ВыраженияПредикатов)
Отрицание = ЮТПредикатыКлиентСервер.ЭтоВыраженияОтрицания(Выражение);
Если Отрицание Тогда
Выражение = ЮТПредикатыКлиентСервер.ВыраженияБезОтрицания(Выражение);
КонецЕсли;
Если Выражение = ВыраженияПредикатов.Равно Тогда
Шаблон = "%1 = &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Больше Тогда
Шаблон = "%1 > &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.БольшеРавно Тогда
Шаблон = "%1 >= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Меньше Тогда
Шаблон = "%1 < &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.МеньшеРавно Тогда
Шаблон = "%1 <= &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.ИмеетТип Тогда
Шаблон = "ТИПЗНАЧЕНИЯ(%1) = &%2";
ИначеЕсли Выражение = ВыраженияПредикатов.Содержит Тогда
Шаблон = "%1 ПОДОБНО ""%%"" + &%2 + ""%%""";
ИначеЕсли Выражение = ВыраженияПредикатов.Заполнено Тогда
// TODO Реализовать
ВызватьИсключение "Проверка заполненности пока не поддерживается";
Иначе
ВызватьИсключение "Неподдерживаемое выражения предикатов " + Выражение;
КонецЕсли;
Если Отрицание Тогда
Шаблон = СтрШаблон("НЕ (%1)", Шаблон);
КонецЕсли;
Возврат Шаблон;
КонецФункции
Процедура ЗаполнитьВыбираемыеПоля(ОписаниеЗапроса, Знач ВыбираемыеПоля)
ТипПараметра = ТипЗнч(ВыбираемыеПоля);
Если ТипПараметра = Тип("Строка") Тогда
ВыбираемыеПоля = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(ВыбираемыеПоля, ",", Истина);
ВыбираемыеПоля = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(ВыбираемыеПоля, ",");
ТипПараметра = Тип("Массив");
КонецЕсли;

View File

@ -0,0 +1,27 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// 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.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Процедура ЮТВыполнитьМодульноеТестирование() Экспорт
ЮТИсполнительКлиент.ВыполнитьМодульноеТестирование();
КонецПроцедуры
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="c71e5399-4012-43dd-8025-379f4211a16a">
<name>ЮТИсполнительГлобальный</name>
<synonym>
<key>ru</key>
<value>Исполнитель клиент глоб</value>
</synonym>
<global>true</global>
<clientManagedApplication>true</clientManagedApplication>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -113,13 +113,17 @@
КонецФункции
Процедура ОбработкаОшибки(ТекстОшибки) Экспорт
ВызватьИсключение ТекстОшибки;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область ОбработчикиЦепочкиДействий
Процедура ОбработчикОшибки(ИнформацияОбОшибки, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
Процедура ОбработчикОшибки(ИнформацияОбОшибке, СтандартнаяОбработка, ДополнительныеПараметры) Экспорт
// TODO Подумать надо ли и как реализовать нормально
@ -277,13 +281,14 @@
КонтекстИсполнения = ЮТФабрика.КонтекстИсполнения(Набор.Режим);
ОшибкаКонтекста = Неопределено;
Если КонтекстыПриложения.Найти(Набор.Режим) = Неопределено Тогда
ОшибкаКонтекста = "Неподдерживаемый режим запуска";
ИначеЕсли КонтекстыМодуля.Найти(Набор.Режим) = Неопределено Тогда
ОшибкаКонтекста = "Модуль не доступен в этом контексте";
ИначеЕсли КонтекстИсполнения <> КонтекстыИсполнения.Сервер И КонтекстИсполнения <> КонтекстыИсполнения.Клиент Тогда
ОшибкаКонтекста = "Неизвестный контекст/режим исполнения";
Иначе
ОшибкаКонтекста = Неопределено;
КонецЕсли;
Если ОшибкаКонтекста <> Неопределено Тогда
@ -405,20 +410,4 @@
КонецПроцедуры
Функция НаборыТестовРежима(ТестовыйМодуль, ОжидаемыйРежимИсполнения)
Результат = Новый Массив();
Для Каждого Набор Из ТестовыйМодуль.НаборыТестов Цикл
Если Набор.Выполнять И ЮТФабрика.КонтекстИсполнения(Набор.Режим) = ОжидаемыйРежимИсполнения Тогда
Результат.Добавить(Набор);
КонецЕсли;
КонецЦикла;
Возврат Результат;
КонецФункции
#КонецОбласти

View File

@ -76,15 +76,17 @@
Результаты = Новый Массив();
Для Каждого Тест Из Набор.Тесты Цикл
ВТранзакции = Ложь;
ПередКаждымТестом(ТестовыйМодуль, Набор, Тест, ВТранзакции);
Тест.ДатаСтарта = ТекущаяУниверсальнаяДатаВМиллисекундах();
ЮТСобытия.ПередКаждымТестом(ТестовыйМодуль, Набор, Тест);
ВыполнитьТестовыйМетод(Тест);
ЮТСобытия.ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест);
Тест.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Тест.ДатаСтарта;
ОбработатьЗавершениеТеста(Тест);
ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест, ВТранзакции);
Тест.Статус = ЮТРегистрацияОшибок.СтатусВыполненияТеста(Тест);
Результаты.Добавить(Тест);
КонецЦикла;
@ -97,10 +99,48 @@
КонецФункции
Процедура ОбработатьЗавершениеТеста(Тест)
Процедура ПередКаждымТестом(ТестовыйМодуль, Набор, Тест, ВТранзакции)
Тест.Длительность = ТекущаяУниверсальнаяДатаВМиллисекундах() - Тест.ДатаСтарта;
Тест.Статус = ЮТРегистрацияОшибок.СтатусВыполненияТеста(Тест);
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
ВТранзакции = ЮТНастройкиВыполнения.ВТранзакции();
Если ВТранзакции Тогда
НачатьТранзакцию();
КонецЕсли;
#КонецЕсли
ЮТСобытия.ПередКаждымТестом(ТестовыйМодуль, Набор, Тест);
КонецПроцедуры
Процедура ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест, ВТранзакции)
Если ЮТКонтекст.ДанныеКонтекста() = Неопределено Тогда // Сломан контекст
ОбновитьПовторноИспользуемыеЗначения();
ОтменитьТранзакциюТеста(Тест, ВТранзакции);
ЮТСобытия.ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест);
Иначе
ЮТСобытия.ПослеКаждогоТеста(ТестовыйМодуль, Набор, Тест);
ОтменитьТранзакциюТеста(Тест, ВТранзакции);
КонецЕсли;
КонецПроцедуры
Процедура ОтменитьТранзакциюТеста(Тест, ВТранзакции)
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если ВТранзакции Тогда
Если ТранзакцияАктивна() Тогда
ОтменитьТранзакцию();
Иначе
ЮТРегистрацияОшибок.ЗарегистрироватьПростуюОшибкуВыполнения(Тест, "Обнаружено лишне закрытие транзакции");
КонецЕсли;
КонецЕсли;
Пока ТранзакцияАктивна() Цикл
ОтменитьТранзакцию();
ЮТРегистрацияОшибок.ЗарегистрироватьПростуюОшибкуВыполнения(Тест, "Обнаружена незакрытая транзакция");
КонецЦикла;
#КонецЕсли
КонецПроцедуры

View File

@ -22,11 +22,11 @@
// Выполняет тесты наборов модуля. Возвращает результат прогона
// Это обертка для прогона на сервере
// Параметры:
// Наборы - Массив - Наборы исполняемых тестов, структуру набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// Наборы - Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Наборы исполняемых тестов, структуру набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// ТестовыйМодуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
//
// Возвращаемое значение:
// Массив - Результат прогона наборов тестов, структура набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// Массив из см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов - Результат прогона наборов тестов, структура набора см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
Функция ВыполнитьГруппуНаборовТестов(Знач Наборы, Знач ТестовыйМодуль) Экспорт
Возврат ЮТИсполнительКлиентСервер.ВыполнитьГруппуНаборовТестов(Наборы, ТестовыйМодуль);

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.ЮТИсполнительСервер">
<suppressions key="com.e1c.v8codestyle.md:common-module-name-server-call" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -25,7 +25,7 @@
// ВнешнийОбъект
Функция Пауза() Экспорт
Возврат СоздатьКомпоненту(ОписаниеКомпонентыПауза(), Истина);
Возврат СоздатьКомпоненту(ОписаниеКомпонентыСервисногоНазначения(), Истина);
КонецФункции
@ -36,7 +36,7 @@
// ВнешнийОбъект
Функция Консоль() Экспорт
Возврат СоздатьКомпоненту(ОписаниеКомпонентыПауза(), Истина);
Возврат СоздатьКомпоненту(ОписаниеКомпонентыСервисногоНазначения(), Истина);
КонецФункции
@ -114,11 +114,11 @@
КонецФункции
// Описание компоненты реализующей паузу.
// Описание компоненты, реализующей паузу, консоль и другие
//
// Возвращаемое значение:
// см. ОписаниеКомпоненты
Функция ОписаниеКомпонентыПауза() Экспорт
Функция ОписаниеКомпонентыСервисногоНазначения() Экспорт
Возврат ОписаниеКомпоненты("ОбщийМакет.ЮТYaxUnitAddIn", "YaxUnitAddin", "Common");

View File

@ -21,7 +21,7 @@
Процедура ТихаяУстановкаКомпонент(ОбработчикЗавершения) Экспорт
ПараметрыТихойУстановки = ПараметрыТихойУстановки();
ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыПауза());
ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыСервисногоНазначения());
ПараметрыТихойУстановки.Компоненты.Добавить(ЮТКомпоненты.ОписаниеКомпонентыРегулярныхВыражений());
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ДобавитьОбработчикЦепочки(ПараметрыТихойУстановки,
@ -80,7 +80,9 @@
Windows = "Windows";
MacOS = "MacOS";
//@skip-check bsl-variable-name-invalid
x86 = "i386";
//@skip-check bsl-variable-name-invalid
x64 = "x86_64";
ТипКлиентскойПлатформы = Информация.ТипПлатформы;
@ -172,6 +174,7 @@
Если КомпонентаДляПодключения = Неопределено Тогда
ЮТАсинхроннаяОбработкаСлужебныйКлиент.ВызватьСледующийОбработчик(ПараметрыТихойУстановки);
Возврат;
КонецЕсли;
ПараметрыТихойУстановки.ПодключенныеКомпоненты.Добавить(КомпонентаДляПодключения);

View File

@ -50,6 +50,7 @@
//
// Возвращаемое значение:
// ОбщийМодуль - Этот же модуль, для замыкания
//@skip-check method-too-many-params
Функция Добавить(Параметр1,
Параметр2 = Неопределено,
Параметр3 = Неопределено,

View File

@ -66,7 +66,7 @@
Для Каждого Элемент Из Реквизиты Цикл
Реквизит = Элемент.Значение;
Если Реквизит.Обязательный И НЕ Контекст.Данные.Свойство(Реквизит.Имя) Тогда
Если Реквизит.Обязательный И НЕ ТекущаяЗапись.Свойство(Реквизит.Имя) Тогда
Значение = ЮТТестовыеДанныеСлужебный.Фикция(Реквизит.Тип);
ТекущаяЗапись.Вставить(Реквизит.Имя, Значение);
КонецЕсли;
@ -77,7 +77,10 @@
Процедура ТабличнаяЧасть(Контекст, ИмяТабличнойЧасти) Экспорт
Контекст.ТекущаяТабличнаяЧасть = ИмяТабличнойЧасти;
Контекст.Данные.Вставить(ИмяТабличнойЧасти, Новый Массив());
Если ИмяТабличнойЧасти <> Неопределено Тогда
Контекст.Данные.Вставить(ИмяТабличнойЧасти, Новый Массив());
КонецЕсли;
КонецПроцедуры
@ -162,9 +165,11 @@
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Тогда
Конструктор = Обработки.ЮТКонструкторТестовыхДанных.Создать();
#Иначе
//@skip-check use-non-recommended-method
Конструктор = ПолучитьФорму("Обработка.ЮТКонструкторТестовыхДанных.Форма.КлиентскийКонструктор"); // BSLLS:GetFormMethod-off
#КонецЕсли
//@skip-check unknown-method-property
Конструктор.Инициализировать(Менеджер);
Возврат Конструктор;
@ -196,6 +201,7 @@
Контекст.Вставить("ТекущаяТабличнаяЧасть", "");
Контекст.Вставить("ДополнительныеСвойства", Новый Структура());
//@skip-check constructor-function-return-section
Возврат Контекст;
КонецФункции

View File

@ -42,6 +42,7 @@
#Если Клиент Тогда
Возврат ЮТКонтекстКлиент.ДанныеКонтекста();
#Иначе
//@skip-check constructor-function-return-section
Возврат ЮТКонтекстСервер.ДанныеКонтекста();
#КонецЕсли
@ -53,7 +54,8 @@
// ИмяРеквизита - Строка - Имя реквизита/вложенного контекста
// ПолучитьССервера - Булево - Получить значение из серверного контекста
// Возвращаемое значение:
// Структура, Неопределено - Значение реквизита/вложенного контекста
// - Структура - Значение реквизита/вложенного контекста
// - Неопределено
Функция ЗначениеКонтекста(ИмяРеквизита, ПолучитьССервера = Ложь) Экспорт
#Если Клиент Тогда
@ -236,6 +238,20 @@
КонецФункции
// КонтекстОшибки
// Возвращает служебный контекст, содержит дополнительные детали ошибки теста
// Параметры:
// ПолучитьССервера - Булево - Получить значение из серверного контекста
//
// Возвращаемое значение:
// Неопределено, Массив из Строка- Детали ошибки
Функция КонтекстДеталиОшибки(ПолучитьССервера = Ложь) Экспорт
//@skip-check constructor-function-return-section
Возврат ЗначениеКонтекста(ИмяКонтекстаДеталиОшибки(), ПолучитьССервера);
КонецФункции
Функция ОписаниеКонтекста() Экспорт
Описание = Новый Структура;
@ -293,6 +309,12 @@
КонецПроцедуры
Процедура УстановитьКонтекстДеталиОшибки(Знач ДанныеКонтекста) Экспорт
УстановитьЗначениеКонтекста(ИмяКонтекстаДеталиОшибки(), ДанныеКонтекста);
КонецПроцедуры
Процедура УдалитьКонтекст() Экспорт
#Если Клиент Тогда
@ -354,4 +376,10 @@
КонецФункции
Функция ИмяКонтекстаДеталиОшибки()
Возврат "ДеталиОшибки";
КонецФункции
#КонецОбласти

View File

@ -20,7 +20,7 @@
Процедура ИнициализироватьКонтекст() Экспорт
ЮТДанныеКонтекста = ЮТКонтекст.ОписаниеКонтекста();
ЮТДанныеКонтекста = ЮТКонтекст.ОписаниеКонтекста(); // BSLLS:UnusedLocalVariable-off
КонецПроцедуры
@ -32,7 +32,7 @@
Процедура УдалитьКонтекст() Экспорт
ЮТДанныеКонтекста = Неопределено;
ЮТДанныеКонтекста = Неопределено; // BSLLS:UnusedLocalVariable-off
КонецПроцедуры

View File

@ -84,7 +84,9 @@
Если ЭтоАдресВременногоХранилища(Адрес) Тогда
УдалитьИзВременногоХранилища(Адрес);
УстановитьПривилегированныйРежим(Истина);
ХранилищеОбщихНастроек.Удалить(КлючНастроекКонтекста(), "АдресХранилища", Неопределено);
УстановитьПривилегированныйРежим(Ложь);
ОбновитьПовторноИспользуемыеЗначения();
КонецЕсли;

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.ЮТКонтекстСервер">
<suppressions key="com.e1c.v8codestyle.md:common-module-name-server-call" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -92,6 +92,10 @@
КонецПроцедуры
// Текущий контекст исполнения теста
//
// Возвращаемое значение:
// Неопределено, Структура, Произвольный - Текущий контекст
Функция ТекущийКонтекст() Экспорт
Уровень = ЮТКонтекст.КонтекстИсполнения().Уровень;

View File

@ -410,11 +410,13 @@
ВызватьИсключение "Метод записи лога не доступен в web-клиенте";
#Иначе
//@skip-check empty-except-statement
Попытка
Для Каждого Сообщение Из Сообщения Цикл
ЮТОбщий.ВывестиВКонсоль(Сообщение);
КонецЦикла;
Исключение
// Игнорируем ошибку
КонецПопытки;
#КонецЕсли

View File

@ -0,0 +1,50 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// 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.
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область СлужебныйПрограммныйИнтерфейс
Функция ЛокальПлатформы() Экспорт
Возврат ТекущийЯзыкСистемы();
КонецФункции
Функция ЭтоАнглийскаяЛокальПлатформы() Экспорт
Возврат ЛокальПлатформы() = "en";
КонецФункции
Функция ЭтоРусскаяЛокальПлатформы() Экспорт
Возврат ЛокальПлатформы() = "ru";
КонецФункции
Функция ЛокальИнтерфейса() Экспорт
#Если Клиент Тогда
Возврат ТекущийЯзык();
#Иначе
Возврат ТекущийЯзык().КодЯзыка;
#КонецЕсли
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="42c4db6a-d038-4614-a7a3-46c5c74ccfbb">
<name>ЮТЛокальСлужебный</name>
<synonym>
<key>ru</key>
<value>Локаль служебный</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -20,7 +20,7 @@
// Модули подсистемы.
// Возвращает список модулей подсистемы
// Подсистема должна находится в подсистеме "ЮТФункциональность"
// Подсистема должна находится в подсистеме "ЮТДинамическиПодключаемые"
// Параметры:
// ИмяПодсистемы - Строка - Имя подсистемы
// Серверные - Булево - Возвращять модули доступные на сервере
@ -55,6 +55,7 @@
Возврат Значение;
КонецЕсли;
ТипТип = Тип("Тип");
#Если Сервер Тогда
Если ТипЗначения = Тип("ОбъектМетаданных") Тогда
Значение = Значение.ПолноеИмя();
@ -62,12 +63,12 @@
КонецЕсли;
#КонецЕсли
Если ТипЗначения <> Тип("Тип") И ТипЗначения <> Тип("Строка") Тогда
Если ТипЗначения <> ТипТип И ТипЗначения <> Тип("Строка") Тогда
Значение = ТипЗнч(Значение);
ТипЗначения = Тип("Тип");
ТипЗначения = ТипТип;
КонецЕсли;
Если ТипЗначения = Тип("Тип") Тогда
Если ТипЗначения = ТипТип Тогда
ИдентификаторТипа = ЮТТипыДанныхСлужебный.ИдентификаторТипа(Значение); // Для работы кэширования
Возврат ЮТМетаданныеПовтИсп.ОписаниеОбъектаМетаданныхПоИдентификаторуТипа(ИдентификаторТипа);
Иначе
@ -102,4 +103,26 @@
КонецФункции
// Возвращяет набор регистров движений документа
//
// Параметры:
// Документ - ОбъектМетаданных
// - Тип - Тип объекта информационной базы
// - Строка - Полное имя объекта метаданных
// - см. ОписаниеОбъектаМетаданных
// - ДокументСсылка, ДокументОбъект - Объект информационной базы
// - ДокументМенеджер - Менеджер вида документа
//
// Возвращаемое значение:
// Структура - Регистры движений документа. Ключи - Имя регистра, Значение - Полное имя регистра
Функция РегистрыДвиженийДокумента(Документ) Экспорт
ОписаниеОбъектаМетаданных = ОписаниеОбъектаМетаданных(Документ);
ПолноеИмя = СтрШаблон("%1.%2", ОписаниеОбъектаМетаданных.ОписаниеТипа.ИмяКоллекции, ОписаниеОбъектаМетаданных.Имя);
Возврат ЮТМетаданныеПовтИсп.РегистрыДвиженийДокумента(ПолноеИмя);
КонецФункции
#КонецОбласти

View File

@ -49,4 +49,16 @@
КонецФункции
Функция РегистрыДвиженийДокумента(ПолноеИмя) Экспорт
Возврат ЮТМетаданныеСервер.РегистрыДвиженийДокумента(ПолноеИмя);
КонецФункции
Функция ВариантВстроенногоЯзыка() Экспорт
Возврат ЮТМетаданныеСервер.ВариантВстроенногоЯзыка();
КонецФункции
#КонецОбласти

View File

@ -46,7 +46,7 @@
// Модули подсистемы.
// Возвращает список модулей подсистемы
// Подсистема должна находится в подсистеме "ЮТФункциональность"
// Подсистема должна находится в подсистеме "ЮТДинамическиПодключаемые"
// Параметры:
// ИмяПодсистемы - Строка - Имя подсистемы
// Серверные - Булево - Возвращять модули доступные на сервере
@ -56,7 +56,7 @@
// Массив из Строка - Имена модулей входящих в подсистему
Функция МодулиПодсистемы(Знач ИмяПодсистемы, Знач Серверные, Знач Клиентские) Экспорт
Подсистема = Метаданные.Подсистемы.ЮТФункциональность.Подсистемы.Найти(ИмяПодсистемы);
Подсистема = Метаданные.Подсистемы.ЮТДинамическиПодключаемые.Подсистемы.Найти(ИмяПодсистемы);
Если Подсистема = Неопределено Тогда
@ -128,7 +128,9 @@
Возврат ОписаниеОбъект;
КонецЕсли;
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты, "Ссылка, Период");
Если ОписаниеТипа.СтандартныеРеквизиты Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.СтандартныеРеквизиты, ОписаниеОбъект.Реквизиты, "Ссылка, Период");
КонецЕсли;
Если ОписаниеТипа.Измерения Тогда
ДобавитьОписанияРеквизитов(МетаданныеОбъекта.Измерения, ОписаниеОбъект.Реквизиты, Истина);
@ -173,6 +175,9 @@
// * Конструктор - Строка
// * Группы - Булево
// * Ссылочный - Булево
// * Регистр - Булево
// * ОбработкаОтчет - Булево
// * СтандартныеРеквизиты - Булево
// * Реквизиты - Булево
// * Измерения - Булево
// * Ресурсы - Булево
@ -188,7 +193,12 @@
ЧастиИмени = СтрРазделить(ПолноеИмя, ".");
Типы = ЮТМетаданные.ТипыМетаданных();
Возврат Типы[ЧастиИмени[0]];
Если Типы.Свойство(ЧастиИмени[0]) Тогда
Возврат Типы[ЧастиИмени[0]];
Иначе
Сообщение = СтрШаблон("Получение описания для '%1' не поддерживается, либо не реализовано", ЧастиИмени[0]);
ВызватьИсключение Сообщение;
КонецЕсли;
КонецФункции
@ -212,6 +222,9 @@
Описание.Вставить("Ресурсы", Запись.Ресурсы = "+");
Описание.Вставить("РеквизитыАдресации", Запись.РеквизитыАдресации = "+");
Описание.Вставить("ТабличныеЧасти", Запись.ТабличныеЧасти = "+");
Описание.Вставить("СтандартныеРеквизиты", Запись.СтандартныеРеквизиты = "+");
Описание.Вставить("ОбработкаОтчет", Запись.Имя = "Обработка" ИЛИ Запись.Имя = "Отчет");
Описание.Вставить("Регистр", СтрНачинаетсяС(Запись.Имя, "Регистр"));
ТипыМетаданных.Вставить(Описание.Имя, Описание);
ТипыМетаданных.Вставить(Описание.ИмяКоллекции, Описание);
@ -229,6 +242,32 @@
КонецФункции
Функция РегистрыДвиженийДокумента(ПолноеИмя) Экспорт
ОбъектМетаданных = ОбъектМетаданных(ПолноеИмя);
Если НЕ Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда
ВызватьИсключение "Движения доступны только для документов. Не поддерживается получение движений для " + ПолноеИмя;
КонецЕсли;
Регистры = Новый Структура;
Для Каждого Регистр Из ОбъектМетаданных.Движения Цикл
Регистры.Вставить(Регистр.Имя, Регистр.ПолноеИмя());
КонецЦикла;
Возврат Регистры;
КонецФункции
Функция ВариантВстроенногоЯзыка() Экспорт
Возврат String(Metadata.ScriptVariant);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -247,17 +286,11 @@
ИначеЕсли ТипЗначение = Тип("Строка") Тогда
ЧастиСтроки = СтрРазделить(Значение, ".");
ОбъектМетаданных = ОбъектМетаданныхИзСтроки(Значение);
Если ЧастиСтроки.Количество() = 2 Тогда
ТипыМетаданных = ЮТМетаданные.ТипыМетаданных();
ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]];
Если ОписаниеТипа <> Неопределено Тогда
ОбъектМетаданных = Метаданные[ОписаниеТипа.ИмяКоллекции][ЧастиСтроки[1]];
КонецЕсли;
КонецЕсли;
ИначеЕсли ТипЗначение = Тип("Структура") И Значение.Свойство("ОписаниеТипа") И Значение.Свойство("Имя") Тогда
ОбъектМетаданных = Метаданные[Значение.ОписаниеТипа.ИмяКоллекции][Значение.Имя];
Иначе
@ -274,6 +307,29 @@
КонецФункции
Функция ОбъектМетаданныхИзСтроки(Значение)
ЧастиСтроки = СтрРазделить(Значение, ".");
Если ЧастиСтроки.Количество() = 2 Тогда
ТипыМетаданных = ЮТМетаданные.ТипыМетаданных();
ОписаниеТипа = ТипыМетаданных[ЧастиСтроки[0]];
Если ОписаниеТипа <> Неопределено Тогда
ОбъектМетаданных = Метаданные[ОписаниеТипа.ИмяКоллекции].Найти(ЧастиСтроки[1]);
Если ОбъектМетаданных = Неопределено Тогда
ВызватьИсключение "Не найден объект метаданных " + Значение;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Возврат ОбъектМетаданных;
КонецФункции
Процедура ДобавитьОписанияРеквизитов(КоллекцияРеквизитов, КоллекцияОписаний, Знач ЭтоКлюч)
Если ТипЗнч(ЭтоКлюч) = Тип("Строка") Тогда

View File

@ -16,6 +16,47 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
#Область ПрограммныйИнтерфейс
// Возвращает значение свойства объекта.
// Возможно получение "глубоко" вложенных свойство и элементов коллекции по индексу
//
// Параметры:
// Объект - Произвольный
// ИмяСвойства - Строка - Путь к свойству. Примеры: "ИмяСвойства.ИмяВложенногоСвойства", "[2].ИмяСвойства", "ИмяСвойства[2].ИмяВложенногоСвойства"
// - Число - Индекс элемента. Возможен выбор элемента с конца, для этого нужно указывать отрицательный номер элемента с конца,
// например: '-1' - последний элемент, '-2' - предпоследний
// Возвращаемое значение:
// Произвольный
Функция ЗначениеСвойства(Объект, ИмяСвойства) Экспорт
Путь = ЧастиПути(ИмяСвойства);
Значение = Объект;
Для Каждого Часть Из Путь Цикл
Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда
#Если ВебКлиент Или ТонкийКлиент Тогда
Значение = ЮТОбщийВызовСервера.ИзХранилищаЗначений(Значение);
#Иначе
Значение = Значение.Получить();
#КонецЕсли
КонецЕсли;
Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда
Часть = Значение.Количество() + Часть;
КонецЕсли;
Значение = Значение[Часть];
КонецЦикла;
Возврат Значение;
КонецФункции
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
#Область Строки
@ -57,13 +98,11 @@
// Параметры:
// Значение - Строка - преобразуемая строка
// Разделитель - Строка - строка-разделитель
// УдалятьКонцевыеПробелы - Булево - удалять или нет концевые пробелы между элементами в строке
// Фиксированный - Булево - возвращать фиксированный или обычный массив
//
// Возвращаемое значение:
// Массив Из Строка - массив строк
//
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Разделитель = ";", УдалятьКонцевыеПробелы = Ложь) Экспорт
Функция РазложитьСтрокуВМассивПодстрок(Знач Значение, Разделитель = ";") Экспорт
КодУниверсальногоРазделителя = 5855;
УниверсальныйРазделитель = Символ(КодУниверсальногоРазделителя);
@ -72,15 +111,11 @@
МассивСтрок = ?(МодифицированнаяСтрока = "", Новый Массив, СтрРазделить(МодифицированнаяСтрока,
УниверсальныйРазделитель));
Если УдалятьКонцевыеПробелы Тогда
Для Индекс = 0 По МассивСтрок.ВГраница() Цикл
Для Индекс = 0 По МассивСтрок.ВГраница() Цикл
МассивСтрок[Индекс] = СокрЛП(МассивСтрок[Индекс]);
КонецЦикла;
МассивСтрок[Индекс] = СокрЛП(МассивСтрок[Индекс]);
КонецЕсли;
КонецЦикла;
Возврат МассивСтрок;
@ -155,7 +190,7 @@
Дата = '00010101' + УниверсальнаяДатаВМиллисекундах / 1000;
Дата = МестноеВремя(Дата);
Возврат СтрШаблон("%1.%2", Дата, Формат(УниверсальнаяДатаВМиллисекундах%1000, "ЧЦ=3; ЧН=000; ЧВН=; ЧГ=0;"));
Возврат СтрШаблон("%1.%2", Дата, Формат(УниверсальнаяДатаВМиллисекундах % 1000, "ЧЦ=3; ЧН=000; ЧВН=; ЧГ=0;"));
КонецФункции
@ -212,6 +247,7 @@
Коллекция1 = СкопироватьСтруктуру(Коллекция1);
КонецЕсли;
//@skip-check constructor-function-return-section
Возврат ДобавитьКлючИЗначениеВКоллекцию(Коллекция1, Коллекция2);
КонецФункции
@ -330,12 +366,15 @@
//
Функция СкопироватьМассив(МассивИсточник) Экспорт
МассивРезультат = Новый Массив;
Если НЕ ЗначениеЗаполнено(МассивИсточник) Тогда
Возврат Новый Массив;
КонецЕсли;
Для Каждого Элемент Из МассивИсточник Цикл
МассивРезультат.Добавить(СкопироватьРекурсивно(Элемент));
Размер = МассивИсточник.Количество();
МассивРезультат = Новый Массив(Размер);
Для Инд = 0 По Размер - 1 Цикл
МассивРезультат[Инд] = СкопироватьРекурсивно(МассивИсточник[Инд]);
КонецЦикла;
Возврат МассивРезультат;
@ -398,6 +437,23 @@
КонецФункции
// Создает массив с переданными значениями
//
// Параметры:
// Значение - Произвольный
// Значение2 - Произвольный
// Значение3 - Произвольный
// Значение4 - Произвольный
// Значение5 - Произвольный
// Значение6 - Произвольный
// Значение7 - Произвольный
// Значение8 - Произвольный
// Значение9 - Произвольный
// Значение10 - Произвольный
//
// Возвращаемое значение:
// Массив из Произвольный
//@skip-check method-too-many-params
Функция ЗначениеВМассиве(Значение,
Значение2 = "_!%*",
Значение3 = "_!%*",
@ -409,70 +465,45 @@
Значение9 = "_!%*",
Значение10 = "_!%*") Экспорт
Массив = Новый Массив;
Массив.Добавить(Значение);
ФлагОкончания = "_!%*";
Значения = Новый Массив;
Если Значение <> ФлагОкончания Тогда
Значения.Добавить(Значение);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение) Тогда
Возврат Значения;
КонецЕсли;
Если Значение2 <> ФлагОкончания Тогда
Значения.Добавить(Значение2);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение2) Тогда
Возврат Значения;
КонецЕсли;
Если Значение3 <> ФлагОкончания Тогда
Значения.Добавить(Значение3);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение3) Тогда
Возврат Значения;
КонецЕсли;
Если Значение4 <> ФлагОкончания Тогда
Значения.Добавить(Значение4);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение4) Тогда
Возврат Значения;
КонецЕсли;
Если Значение5 <> ФлагОкончания Тогда
Значения.Добавить(Значение5);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение5) Тогда
Возврат Значения;
КонецЕсли;
Если Значение6 <> ФлагОкончания Тогда
Значения.Добавить(Значение6);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение6) Тогда
Возврат Значения;
КонецЕсли;
Если Значение7 <> ФлагОкончания Тогда
Значения.Добавить(Значение7);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение7) Тогда
Возврат Значения;
КонецЕсли;
Если Значение8 <> ФлагОкончания Тогда
Значения.Добавить(Значение8);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение8) Тогда
Возврат Значения;
КонецЕсли;
Если Значение9 <> ФлагОкончания Тогда
Значения.Добавить(Значение9);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение9) Тогда
Возврат Значения;
КонецЕсли;
Если Значение10 <> ФлагОкончания Тогда
Значения.Добавить(Значение10);
Иначе
Если Не ДобавитьНеПоследнее(Значения, Значение10) Тогда
Возврат Значения;
КонецЕсли;
@ -539,7 +570,9 @@
КонецФункции
// см. ЮТСравнениеКлиентСервер.ЗначенияРавны
// Deprecate
// Устарела.
//@skip-check doc-comment-export-function-return-section
//@skip-check doc-comment-parameter-section
Функция ДанныеСовпадают(Данные1, Данные2) Экспорт
ВызовУстаревшегоМетода("ЮТОбщий.ДанныеСовпадают", "ЮТСравнениеКлиентСервер.ЗначенияРавны");
@ -582,8 +615,10 @@
#КонецОбласти
#Область ПроверкаМетодов
// МетодМодуляСуществует
// Проверяет существование публичного (экспортного) метода у объекта
// Проверяет существование публичного (экспортного) метода у модуля
//
// Параметры:
// ИмяМодуля - Строка - Имя модуля, метод которого нужно поискать
@ -595,20 +630,54 @@
// Булево - Метод найден
Функция МетодМодуляСуществует(ИмяМодуля, ИмяМетода, КоличествоПараметров = 0, Кешировать = Истина) Экспорт
ЮТПроверкиСлужебный.ПроверитьТипПараметра(ИмяМодуля, Тип("Строка"), "ЮТОбщий.МетодМодуляСуществует", "ИмяМодуля");
ЮТПроверкиСлужебный.ПроверитьТипПараметра(ИмяМетода, Тип("Строка"), "ЮТОбщий.МетодМодуляСуществует", "ИмяМетода");
Если Кешировать Тогда
Возврат ЮТПовторногоИспользования.МетодМодуляСуществует(ИмяМодуля, ИмяМетода, КоличествоПараметров);
КонецЕсли;
Алгоритм = СтрШаблон("%1.%2(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)", ИмяМодуля, ИмяМетода);
ПолноеИмяМетода = СтрШаблон("%1.%2", ИмяМодуля, ИмяМетода);
Алгоритм = ПолноеИмяМетода + "(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)";
Ошибка = ВыполнитьМетод(Алгоритм);
МетодСуществует = СтрНайти(НРег(Ошибка.Описание), "(" + НРег(ИмяМетода) + ")") = 0;
Возврат МетодСуществует;
ТипОшибки = ЮТРегистрацияОшибок.ТипОшибки(Ошибка, ПолноеИмяМетода);
Возврат ТипОшибки = ЮТФабрика.ТипыОшибок().МногоПараметров;
КонецФункции
Функция ВыполнитьМетод(ПолноеИмяМетода, Параметры = Неопределено) Экспорт
// Проверяет существование публичного (экспортного) метода у объекта
//
// Параметры:
// Объект - Произвольный - Объект, метод которого нужно поискать
// ИмяМетода - Строка - Имя метода, который ищем
//
// Возвращаемое значение:
// Булево - Метод найден
Функция МетодОбъектаСуществует(Объект, ИмяМетода) Экспорт
#Если ВебКлиент Тогда
ВызватьИсключение МетодНеДоступен("ЮТОбщий.МетодОбъектаСуществует");
#Иначе
ЮТПроверкиСлужебный.ПроверитьТипПараметра(ИмяМетода, Тип("Строка"), "ЮТОбщий.МетодМодуляСуществует", "ИмяМетода");
ПолноеИмяМетода = СтрШаблон("Объект.%1", ИмяМетода);
Алгоритм = ПолноеИмяМетода + "(,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,)";
Ошибка = ВыполнитьМетод(Алгоритм, , Объект);
ТипОшибки = ЮТРегистрацияОшибок.ТипОшибки(Ошибка, ПолноеИмяМетода);
Возврат ТипОшибки = ЮТФабрика.ТипыОшибок().МногоПараметров;
#КонецЕсли
КонецФункции
#КонецОбласти
#Область ВызовМетодов
Функция ВыполнитьМетод(ПолноеИмяМетода, Параметры = Неопределено, Объект = Неопределено) Экспорт
#Если ВебКлиент Тогда
ВызватьИсключение МетодНеДоступен("ЮТОбщий.ВыполнитьМетод");
@ -621,16 +690,13 @@
Алгоритм = ПолноеИмяМетода + "()";
ИначеЕсли ТипЗнч(Параметры) = Тип("Массив") Тогда
Алгоритм = СтрШаблон("%1(%2)", ПолноеИмяМетода, СтрокаПараметровМетода(Параметры, "Параметры"));
Иначе
Алгоритм = "";
Для Инд = 0 По Параметры.ВГраница() Цикл
Алгоритм = ДобавитьСтроку(Алгоритм, СтрШаблон("Параметры[%1]", Инд), ", ");
КонецЦикла;
Алгоритм = СтрШаблон("%1(%2)", ПолноеИмяМетода, Алгоритм);
ВызватьИсключение СтрШаблон("Не верный тип параметров `%1` для вызова метода, должен быть массив", ТипЗнч(Параметры));
КонецЕсли;
@ -646,6 +712,28 @@
КонецФункции
Функция ВычислитьБезопасно(Выражение) Экспорт
#Если НЕ ВебКлиент И НЕ ТонкийКлиент Тогда
УстановитьБезопасныйРежим(Истина);
Попытка
Значение = Вычислить(Выражение);
Исключение
УстановитьБезопасныйРежим(Ложь);
ВызватьИсключение;
КонецПопытки;
УстановитьБезопасныйРежим(Ложь);
#Иначе
Значение = Вычислить(Выражение);
#КонецЕсли
Возврат Значение;
КонецФункции
#КонецОбласти
// ПеременнаяСодержитСвойство
// функция проверяет наличие свойства у значения любого типа данных. Если передано НЕОПРЕДЕЛЕНО, то ф-ия всегда вернет Ложь
//
@ -726,26 +814,6 @@
КонецФункции
Функция ВычислитьБезопасно(Выражение) Экспорт
#Если НЕ ВебКлиент И НЕ ТонкийКлиент Тогда
УстановитьБезопасныйРежим(Истина);
Попытка
Значение = Вычислить(Выражение);
Исключение
УстановитьБезопасныйРежим(Ложь);
ВызватьИсключение;
КонецПопытки;
УстановитьБезопасныйРежим(Ложь);
#Иначе
Значение = Вычислить(Выражение);
#КонецЕсли
Возврат Значение;
КонецФункции
// Параметры записи объекта
//
// Возвращаемое значение:
@ -753,12 +821,13 @@
// * ОбменДаннымиЗагрузка - Булево
// * ДополнительныеСвойства - Структура
// * РежимЗаписи - РежимЗаписиДокумента
// - Неопределено
Функция ПараметрыЗаписи() Экспорт
ПараметрыЗаписи = Новый Структура();
ПараметрыЗаписи.Вставить("ОбменДаннымиЗагрузка", Ложь);
ПараметрыЗаписи.Вставить("ДополнительныеСвойства", Новый Структура);
ПараметрыЗаписи.Вставить("РежимЗаписи", РежимЗаписиДокумента.Запись);
ПараметрыЗаписи.Вставить("РежимЗаписи", Неопределено);
Возврат ПараметрыЗаписи;
@ -881,7 +950,7 @@
Если ЮТМетаданные.РазрешеныСинхронныеВызовы() Тогда
Компонента.Напечатать(Сообщение);
Иначе
Компонента.НачатьВызовНапечатать(ЮТАсинхроннаяОбработкаСлужебныйКлиент.НовыйПустойОбработчик1(), Сообщение);
Компонента.НачатьВызовНапечатать(ЮТАсинхроннаяОбработкаСлужебныйКлиент.НовыйПустойОбработчик(3), Сообщение);
КонецЕсли;
#КонецЕсли
@ -985,4 +1054,91 @@
КонецФункции
Функция ЧастиПути(Цепочка) Экспорт
ПутьКСвойству = Новый Массив();
ТипПути = ТипЗнч(Цепочка);
Если ТипПути = Тип("Строка") Тогда
Части = СтрРазделить(Цепочка, ".");
Для Каждого Часть Из Части Цикл
Если СодержитИндекс(Часть) Тогда
ИзвлечьИндекс(Часть, ПутьКСвойству);
Иначе
ПутьКСвойству.Добавить(Часть);
КонецЕсли;
КонецЦикла;
Иначе
ПутьКСвойству.Добавить(Цепочка);
КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off
Возврат ПутьКСвойству;
КонецФункции
Функция СодержитИндекс(ИмяСвойства)
Возврат СтрНайти(ИмяСвойства, "[") > 0 И СтрЗаканчиваетсяНа(ИмяСвойства, "]") ;
КонецФункции
Процедура ИзвлечьИндекс(ИмяСвойства, БлокиПути)
ПозицияИндекса = СтрНайти(ИмяСвойства, "[");
Если ПозицияИндекса > 1 Тогда
БлокиПути.Добавить(Лев(ИмяСвойства, ПозицияИндекса - 1));
КонецЕсли;
Пока ПозицияИндекса > 0 Цикл
ЗакрывающаяПозиция = СтрНайти(ИмяСвойства, "]", , ПозицияИндекса);
ИндексСтрокой = Сред(ИмяСвойства, ПозицияИндекса + 1, ЗакрывающаяПозиция - ПозицияИндекса - 1);
Индекс = Число(ИндексСтрокой);
БлокиПути.Добавить(Индекс);
ПозицияИндекса = СтрНайти(ИмяСвойства, "[", , ЗакрывающаяПозиция);
КонецЦикла;
КонецПроцедуры
Функция СтрокаПараметровМетода(Параметры, ИмяПеременнойСПараметрами)
СписокПараметров = Новый Массив();
Для Инд = 0 По Параметры.ВГраница() Цикл
Если Параметры[Инд] = Мокито.ПараметрПоУмолчанию() Тогда
СписокПараметров.Добавить("");
Иначе
СписокПараметров.Добавить(СтрШаблон("%1[%2]", ИмяПеременнойСПараметрами, Инд));
КонецЕсли;
КонецЦикла;
Возврат СтрСоединить(СписокПараметров, ", ");
КонецФункции
Функция ДобавитьНеПоследнее(Значения, Значение, ФлагОкончания = "_!%*")
Если Значение <> ФлагОкончания Тогда
Значения.Добавить(Значение);
Возврат Истина;
КонецЕсли;
Возврат Ложь;
КонецФункции
#КонецОбласти

View File

@ -44,7 +44,12 @@
ВызватьИсключение "Несуществующий объект метаданных, либо " + ЮТОбщий.НеподдерживаемыйПараметрМетода("ЮТОбщийВызовСервера.Менеджер", Менеджер);
КонецЕсли;
ИмяТипа = СтрШаблон("%1Менеджер.%2", Описание.ОписаниеТипа.Имя, Описание.Имя);
ИмяТипа = "";
Если ЭтоАнглийскийВстроенныйЯзык() Тогда
ИмяТипа = СтрШаблон("%1Manager.%2", Описание.ОписаниеТипа.Имя, Описание.Имя);
Иначе
ИмяТипа = СтрШаблон("%1Менеджер.%2", Описание.ОписаниеТипа.Имя, Описание.Имя);
КонецЕсли;
Возврат Новый(ИмяТипа);
@ -82,4 +87,52 @@
КонецФункции
Функция ВыборкаИзТабличногоДокумента(ТабличныйДокумент) Экспорт
Возврат ЗапросКТабличномуДокументу(ТабличныйДокумент).Выбрать();
КонецФункции
Функция ТаблицаИзТабличногоДокумента(ТабличныйДокумент) Экспорт
Возврат ЗапросКТабличномуДокументу(ТабличныйДокумент).Выгрузить();
КонецФункции
Функция ИзХранилищаЗначений(Знач ХранилищеЗначений) Экспорт
Возврат ХранилищеЗначений.Получить();
КонецФункции
Функция ЭтоАнглийскийВстроенныйЯзык() Экспорт
Возврат ЮТМетаданныеПовтИсп.ВариантВстроенногоЯзыка() = "English";
КонецФункции
Функция ЭтоРусскийВстроенныйЯзык() Экспорт
Возврат ЮТМетаданныеПовтИсп.ВариантВстроенногоЯзыка() = "Русский";
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Функция ЗапросКТабличномуДокументу(ТабличныйДокумент)
ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы;
ВсегоКолонок = ТабличныйДокумент.ШиринаТаблицы;
Область = ТабличныйДокумент.Область(1, 1, ВсегоСтрок, ВсегоКолонок);
ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
Возврат ПостроительОтчета.Результат;
КонецФункции
#КонецОбласти

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.ЮТОтчет">
<suppressions key="com.e1c.v8codestyle.md:common-module-name-client" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.ЮТОтчетJSON">
<suppressions key="com.e1c.v8codestyle.md:common-module-name-client" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -73,13 +73,17 @@
Возврат Параметры;
КонецЕсли;
ПарыКлючЗначение = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(ПараметрыЗапускаСтрокой, ";", Истина);
ПарыКлючЗначение = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(ПараметрыЗапускаСтрокой, ";");
ПараметрыЗапуска = Новый Структура;
Для Каждого Пара Из ПарыКлючЗначение Цикл
КлючЗначение = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Пара, "=", Истина);
Если ПустаяСтрока(Пара) Тогда
Продолжить;
КонецЕсли;
КлючЗначение = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Пара, "=");
Если КлючЗначение.Количество() = 1 Тогда
ПараметрыЗапуска.Вставить(КлючЗначение[0], Истина);
@ -137,8 +141,8 @@
Исключение
Ошибка = ПодробноеПредставлениеОшибки(ИнформацияОбОшибке());
ВызватьИсключение СтрШаблон("Ошибка загрузки настроек из файла: '%1'", Ошибка);
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки("Ошибка загрузки настроек из файла");
ВызватьИсключение;
КонецПопытки;

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.ЮТПараметрыЗапуска">
<suppressions key="com.e1c.v8codestyle.md:common-module-name-client" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -16,8 +16,6 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
// @strict-types
#Область ПрограммныйИнтерфейс
// Локализация.
@ -38,14 +36,26 @@
#Область Реализации
// Подражатель для людей
//
// Возвращаемое значение:
// CommonModule.ЮТПодражатель_Люди - Люди
Функция Люди() Экспорт
Возврат ЮТПодражатель_Люди;
КонецФункции
// Подражатель для компаний
//
// Возвращаемое значение:
// CommonModule.ЮТПодражатель_Компании - Компании
Функция Компании() Экспорт
Возврат ЮТПодражатель_Компании;
КонецФункции
// Подражатель для банков
//
// Возвращаемое значение:
// CommonModule.ЮТПодражатель_Банки - Банки
Функция Банки() Экспорт
Возврат ЮТПодражатель_Банки;
КонецФункции

View File

@ -78,10 +78,6 @@
#Область СлужебныеПроцедурыИФункции
Функция ИмяРеализации()
Возврат "Банки";
КонецФункции
Функция ВесовыеКоэффициентаДляРасчетаКонтрольнойСуммыСчета()
Возврат СтрРазделить("7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1,3,7,1", ",");
КонецФункции

View File

@ -141,6 +141,12 @@
#Область ФабрикаПеречислений
// Варианты биологического пола человека (не путать с гендером)
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - Пол человека:
// * Мужской - Строка -
// * Женский - Строка -
Функция ПолЧеловека() Экспорт
Результат = Новый Структура();

View File

@ -36,7 +36,3 @@
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -16,9 +16,6 @@
//
//©///////////////////////////////////////////////////////////////////////////©//
// @strict-types
#Область СлужебныйПрограммныйИнтерфейс
// Получает список из словаря с учетом установленной локализации

View File

@ -27,9 +27,9 @@
//
// Возвращаемое значение:
// ФиксированныйМассив из Строка
Функция Словарь(ИмяРеализации, ИмяСловаря, КодЛокализации = Неопределено) Экспорт
_КодЛокализации = ?(КодЛокализации = Неопределено, ЮТПодражатель.Локализация(), КодЛокализации);
Возврат ЮТПодражательПовтИсп.Словарь(ИмяРеализации, ИмяСловаря, _КодЛокализации);
Функция Словарь(ИмяРеализации, ИмяСловаря, Знач КодЛокализации = Неопределено) Экспорт
КодЛокализации = ?(КодЛокализации = Неопределено, ЮТПодражатель.Локализация(), КодЛокализации);
Возврат ЮТПодражательПовтИсп.Словарь(ИмяРеализации, ИмяСловаря, КодЛокализации);
КонецФункции
// Случайное значение из словаря.
@ -75,15 +75,11 @@
//
// Возвращаемое значение:
// Структура - Новый контекст:
// * Локализация - Строка - Установленная локализация
// * Локализация - см. ЮТЛокальСлужебный.ЛокальИнтерфейса
Функция НовыйКонтекст()
Описание = Новый Структура;
#Если Клиент Тогда
Описание.Вставить("Локализация", ТекущийЯзык());
#Иначе
Описание.Вставить("Локализация", ТекущийЯзык().КодЯзыка);
#КонецЕсли
Описание.Вставить("Локализация", ЮТЛокальСлужебный.ЛокальИнтерфейса());
Возврат Описание;
КонецФункции

View File

@ -40,7 +40,7 @@
Предикаты = НаборПредикатов(Предикаты);
Для Каждого Выражение Из Предикаты Цикл
ПроверитьВыражениеПредиката(Значение, Выражение, Результат, ПараметрыСообщенийОбОшибке, ПараметрыСравнения);
ЮТСравнениеКлиентСервер.ПроверитьВыражениеПредиката(Значение, Выражение, Результат, ПараметрыСообщенийОбОшибке, ПараметрыСравнения);
Если НЕ Результат.Успешно Тогда
Прервать;
КонецЕсли;
@ -54,9 +54,9 @@
// Набор предикатов.
//
// Параметры:
// Предикаты - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор утверждений. см. ЮТПредикаты.Получить, см. ЮТест.Предикат
// Предикаты - Массив из см. ЮТФабрика.ВыражениеПредиката - Набор утверждений. см. ЮТест.Предикат
// - см. ЮТФабрика.ВыражениеПредиката
// - ОбщийМодуль.ЮТПредикаты - Модуль настройки предикатов, см. ЮТест.Предикат
// - CommonModule.ЮТПредикаты - Модуль настройки предикатов, см. ЮТест.Предикат
//
// Возвращаемое значение:
// Массив из см. ЮТФабрика.ВыражениеПредиката - Набор предикатов
@ -99,28 +99,17 @@
Представления = Новый Массив();
Предикаты = НаборПредикатов(Предикаты);
ИмяРеквизита = Неопределено;
Для Каждого Выражение Из Предикаты Цикл
Представления.Добавить(ПредставлениеПредиката(Выражение, ШаблонСвойства));
НеДобавлятьИмяРеквизита = ИмяРеквизита = Выражение.ИмяРеквизита;
ИмяРеквизита = Выражение.ИмяРеквизита;
Представления.Добавить(ПредставлениеПредиката(Выражение, ШаблонСвойства, НеДобавлятьИмяРеквизита));
КонецЦикла;
Возврат СтрСоединить(Представления, Разделитель);
КонецФункции
Функция ПредставлениеПредиката(ВыражениеПредиката, ШаблонСвойства) Экспорт
Если ВыражениеПредиката.ИмяРеквизита = Неопределено Тогда
ПроверяемоеЗначение = "";
Иначе
ПроверяемоеЗначение = СтрШаблон(ШаблонСвойства, ВыражениеПредиката.ИмяРеквизита) + " ";
КонецЕсли;
Выражение = СтрШаблон(ШаблонВыражения(ВыражениеПредиката.ВидСравнения), ВыражениеПредиката.Значение);
Возврат СтрШаблон("%1%2", ПроверяемоеЗначение, Выражение);
КонецФункции
Функция ШаблонВыражения(Знач Выражение) Экспорт
Отрицание = СтрНачинаетсяС(Выражение, "Не");
@ -193,10 +182,12 @@
ТекстПроверяемоеЗначение = "проверяемое значение",
ПредставлениеПроверяемогоЗначения = Неопределено) Экспорт
Возврат Новый Структура("ОписаниеПроверки, ТекстПроверяемоеЗначение, ПредставлениеПроверяемогоЗначения",
ОписаниеПроверки,
ТекстПроверяемоеЗначение,
ПредставлениеПроверяемогоЗначения);
Параметры = Новый Структура;
Параметры.Вставить("ОписаниеПроверки", ОписаниеПроверки);
Параметры.Вставить("ТекстПроверяемоеЗначение", ТекстПроверяемоеЗначение);
Параметры.Вставить("ПредставлениеПроверяемогоЗначения", ПредставлениеПроверяемогоЗначения);
Возврат Параметры;
КонецФункции
@ -204,95 +195,19 @@
#Область СлужебныеПроцедурыИФункции
Процедура ПроверитьВыражениеПредиката(Значение, Выражение, СтатусПроверки, ПараметрыСообщенийОбОшибке, ПараметрыСравнения)
Функция ПредставлениеПредиката(ВыражениеПредиката, ШаблонСвойства, НеДобавлятьИмяРеквизита)
Попытка
ВызватьОбработчикПредиката(Значение, Выражение, СтатусПроверки, ПараметрыСообщенийОбОшибке, ПараметрыСравнения);
Исключение
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(СтатусПроверки, ИнформацияОбОшибке());
КонецПопытки;
КонецПроцедуры
// Вычислить выражение предиката.
//
// Параметры:
// Значение - Произвольный - Значение
// Выражение - см. ЮТФабрика.ВыражениеПредиката
// СтатусПроверки - см. ЮТФабрика.ОписаниеРезультатаПроверки
// ПараметрыСообщенийОбОшибке - см. ПараметрыСообщенийОбОшибке
// ПараметрыСравнения - Неопределено
// - Структура - Параметры сравнения значений, для разных выражений испльзуются свои параметры
Процедура ВызватьОбработчикПредиката(Значение, Выражение, СтатусПроверки, ПараметрыСообщенийОбОшибке, ПараметрыСравнения)
// BSLLS:CognitiveComplexity-off
ВидыСравнения = ЮТПредикаты.Выражения();
ПараметрыПроверки = ЮТСравнениеКлиентСервер.ПараметрыПроверки(Выражение.ВидСравнения, Значение, Выражение.ИмяРеквизита, Выражение.Значение, Ложь);
ПараметрыПроверки.ОписаниеПроверки = ПараметрыСообщенийОбОшибке.ОписаниеПроверки;
ПараметрыПроверки.ТекстПроверяемоеЗначение = ПараметрыСообщенийОбОшибке.ТекстПроверяемоеЗначение;
ПараметрыПроверки.ОбъектПроверки.Представление = ПараметрыСообщенийОбОшибке.ПредставлениеПроверяемогоЗначения;
Если СтрНачинаетсяС(Выражение.ВидСравнения, "Не") И ВидыСравнения.Свойство(Сред(Выражение.ВидСравнения, 3)) Тогда
ПараметрыПроверки.Реверс = Истина;
ВидСравненияВыражения = Сред(Выражение.ВидСравнения, 3);
Если НеДобавлятьИмяРеквизита ИЛИ ВыражениеПредиката.ИмяРеквизита = Неопределено Тогда
ПроверяемоеЗначение = "";
Иначе
ВидСравненияВыражения = Выражение.ВидСравнения;
ПроверяемоеЗначение = СтрШаблон(ШаблонСвойства, ВыражениеПредиката.ИмяРеквизита) + " ";
КонецЕсли;
Если ВидСравненияВыражения = ВидыСравнения.Равно Тогда
ЮТСравнениеКлиентСервер.ПроверитьРавенствоЗначений(СтатусПроверки, ПараметрыПроверки, ПараметрыСравнения);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.Заполнено Тогда
ЮТСравнениеКлиентСервер.ПроверитьЗаполненность(СтатусПроверки, ПараметрыПроверки);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.Больше Тогда
ЮТСравнениеКлиентСервер.ПроверитьНеравенство(СтатусПроверки, ПараметрыПроверки, Истина);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.БольшеРавно Тогда
ЮТСравнениеКлиентСервер.ПроверитьНеравенство(СтатусПроверки, ПараметрыПроверки, Истина, , Истина);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.Меньше Тогда
ЮТСравнениеКлиентСервер.ПроверитьНеравенство(СтатусПроверки, ПараметрыПроверки, , Истина);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.МеньшеРавно Тогда
ЮТСравнениеКлиентСервер.ПроверитьНеравенство(СтатусПроверки, ПараметрыПроверки, , Истина, Истина);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.ИмеетТип Тогда
ЮТСравнениеКлиентСервер.ПроверитьТипПараметра(СтатусПроверки, ПараметрыПроверки);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.ИмеетСвойство Тогда
ЮТСравнениеКлиентСервер.ПроверитьНаличиеСвойства(СтатусПроверки, ПараметрыПроверки);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.ИмеетДлину Тогда
ЮТСравнениеКлиентСервер.ПроверитьДлину(СтатусПроверки, ПараметрыПроверки);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.Содержит Тогда
ЮТСравнениеКлиентСервер.ПроверитьСодержит(СтатусПроверки, ПараметрыПроверки);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.СодержитСтрокуПоШаблону Тогда
ЮТСравнениеКлиентСервер.ПроверитьСоответствуетШаблону(СтатусПроверки, ПараметрыПроверки);
Иначе
ВызватьИсключение СтрШаблон("Неизвестное выражение предиката `%1`", Выражение.ВидСравнения);
КонецЕсли;
// BSLLS:CognitiveComplexity-on
Выражение = СтрШаблон(ШаблонВыражения(ВыражениеПредиката.ВидСравнения), ВыражениеПредиката.Значение);
КонецПроцедуры
Возврат СтрШаблон("%1%2", ПроверяемоеЗначение, Выражение);
КонецФункции
Функция ЭтоПредикатОбщийМодуль(ТипПредикатов, Предикаты)

View File

@ -73,44 +73,82 @@
Функция ПривестиЗначениеКДате(ОписаниеТипа, Знач Значение) Экспорт
Результат = ОписаниеТипа.ПривестиЗначение(Значение);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
ДатаМассив = СтрРазделить(Значение, ".,:T-/ ");
НетВремени = 3;
ЕстьВремя = 7;
Полдень = 12;
ДлинаДеньМесяц = 2;
ДлинаГод = 4;
ДатаИзСтроки_ПроверкаДлиныДаты(ДатаМассив.Количество(), НетВремени, ЕстьВремя);
/////////////////////////////////////////////////////////////////////////////////
ДатаИзСтроки_ОбработкаМассиваДаты(ДатаМассив); // если вдруг кто-то забыл вставить что-то между разделителями.
ДатаИзСтроки_ПроверкаМесяца(ДатаМассив[1]); // проверка месяца, корректно или нет
Если ДатаМассив.Количество() = ЕстьВремя Тогда // время формата HH:mm:ss tt или H:mm:ss tt
ВГр = ДатаМассив.ВГраница();
ПозЧас = 3;
ДатаМассив[ВГр] = ВРег(ДатаМассив[ВГр]);
ЧасДоп = ?(ДатаМассив[ВГр] = "PM", Полдень, 0);
ДатаМассив.Удалить(ВГр);
ЧасовВСутках = 24;
// если все-таки решили вписать не существующий формат попробуем его воспринять адекватно.
ДатаМассив[ПозЧас] = Строка(?(Число(ДатаМассив[ПозЧас]) + ЧасДоп >= ЧасовВСутках, ДатаМассив[ПозЧас], Число(ДатаМассив[ПозЧас]) + ЧасДоп));
КонецЕсли;
МассивРазделителей = Новый Массив;
МассивРазделителей.Добавить(".");
МассивРазделителей.Добавить("/");
МассивРазделителей.Добавить("-");
СтрокаДаты = Неопределено;
КоличествоБлоковДаты = 3;
ДлинаГода = 4;
Для Каждого Разделитель Из МассивРазделителей Цикл
Для Индекс = 0 По ДатаМассив.ВГраница() Цикл // добавляем ведущие нули в маски d.M.yy, yy.M.d, H:mm:ss
Если ЗначениеЗаполнено(СтрокаДаты) Тогда
Прервать;
КонецЕсли;
МассивЧастейДат = СтрРазделить(Значение, Разделитель);
Если МассивЧастейДат.Количество() = КоличествоБлоковДаты Тогда
Если СтрДлина(МассивЧастейДат[2]) = ДлинаГода Тогда
СтрокаДаты = МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0];
ИначеЕсли СтрДлина(МассивЧастейДат[0]) = ДлинаГода Тогда
СтрокаДаты = МассивЧастейДат[0] + МассивЧастейДат[1] + МассивЧастейДат[2];
Иначе
СтрокаДаты = "20" + МассивЧастейДат[2] + МассивЧастейДат[1] + МассивЧастейДат[0];
КонецЕсли;
КонецЕсли;
ДатаМассив[Индекс] = Формат(Число(ДатаМассив[Индекс]), "ЧЦ=" + ?(СтрДлина(ДатаМассив[Индекс]) > ДлинаДеньМесяц, "4", "2") + "; ЧВН=; ЧГ=0; ЧН=00");
КонецЦикла;
Результат = ОписаниеТипа.ПривестиЗначение(СтрокаДаты);
ПозГод = 2;
ПозМесяц = 1;
ПозДень = 0;
// Проверка гггг.мм.дд или дд.мм.гггг
Если СтрДлина(ДатаМассив[ПозГод]) = ДлинаГод Тогда
ВремДата = ДатаМассив[ПозДень];
ДатаМассив[ПозДень] = ДатаМассив[ПозГод];
ДатаМассив[ПозГод] = ВремДата;
КонецЕсли;
// обработка масок dd.MM.yy и yy.MM.dd, первая маска в приоритете.
Если СтрДлина(ДатаМассив[0]) = ДлинаДеньМесяц И СтрДлина(ДатаМассив[ПозГод]) = ДлинаДеньМесяц Тогда
УсловнаяГраница = 66; // что больше, то 20 век, что меньше - 21
Год = ?(Число(ДатаМассив[ПозГод]) > УсловнаяГраница, "19", "20");
Попытка // попытаемся превратить ее в дату
// Собственно - проверка, попытка получить дату
//@skip-check module-unused-local-variable - Необходима для помещения результата получения даты из строки.
ТестоваяДата = Дата(Год + ДатаМассив[ПозГод] + ДатаМассив[ПозМесяц] + ДатаМассив[ПозДень]);
ВремДата = ДатаМассив[ПозДень];
ДатаМассив[ПозДень] = (Год + ДатаМассив[ПозГод]);
ДатаМассив[ПозГод] = ВремДата;
Исключение // если не получилось, значит маска yy.MM.dd
ДатаМассив[ПозДень] = (Год + ДатаМассив[ПозДень]);
КонецПопытки;
КонецЕсли;
Результат = ОписаниеТипа.ПривестиЗначение(СтрСоединить(ДатаМассив));
Возврат Результат;
@ -118,6 +156,7 @@
Функция ПривестиЗначениеКЧислу(ОписаниеТипа, Знач Значение) Экспорт
Значение = СтрЗаменить(Значение, ",", ".");
Результат = ОписаниеТипа.ПривестиЗначение(Значение);
Если ЗначениеЗаполнено(Результат) Тогда
Возврат Результат;
@ -150,4 +189,46 @@
КонецФункции
Процедура ДатаИзСтроки_ПроверкаДлиныДаты(ДлинаСтроки, ДлинаБезВремени = 0, ДлинаСВременем = 0, ДатаСтрока = "")
Если ДлинаБезВремени = 0 ИЛИ ДлинаСВременем = 0 Тогда
ДлинаБезВремени = 6;
ДлинаСВременем = 22;
КонецЕсли;
// Временные зоны не поддерживаются, однако формат даты в нулевой зоне попадает в допустимую длину других поддерживаемых форматов.
ДлинаДатыВНулевойЗоне = 20;
ЭтоНулеваяЗона = ДлинаСтроки = ДлинаДатыВНулевойЗоне И СтрЗаканчиваетсяНа(ДатаСтрока, "Z");
Если ДлинаСтроки < ДлинаБезВремени Или ДлинаСтроки > ДлинаСВременем Или ЭтоНулеваяЗона Тогда
ВызватьИсключение "Дата в строке не подходит ни под одну маску.";
КонецЕсли;
КонецПроцедуры
Процедура ДатаИзСтроки_ОбработкаМассиваДаты(ДатаМассив)
Для Индекс = 0 По ДатаМассив.ВГраница() Цикл
ДатаМассив[Индекс] = ?(СтрДлина(ДатаМассив[Индекс]) = 0, "0", ДатаМассив[Индекс]);
КонецЦикла;
КонецПроцедуры
Процедура ДатаИзСтроки_ПроверкаМесяца(МесяцСтрокой)
МесяцевВГоду = 12;
Если Число(МесяцСтрокой) > МесяцевВГоду Или Число(МесяцСтрокой) = 0 Тогда
ВызватьИсключение "Месяц выходит за границы диапазона.";
КонецЕсли;
КонецПроцедуры
#КонецОбласти

View File

@ -67,7 +67,3 @@
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -26,10 +26,11 @@
// ИмяСобытия - Строка
// ОписаниеСобытия - см. ЮТФабрика.ОписаниеСобытияИсполненияТестов
// Ошибка - ИнформацияОбОшибке
// - Строка
Процедура ЗарегистрироватьОшибкуСобытияИсполнения(ИмяСобытия, ОписаниеСобытия, Ошибка) Экспорт
ТипОшибки = ЮТФабрика.ТипыОшибок().ОшибкаОбработкиСобытия;
Пояснение = СтрШаблон("%1 '%2': %3", ТипОшибки, ИмяСобытия, Ошибка.Описание);
Пояснение = ЮТСообщенияСлужебный.СообщениеОбОшибкеСобытия(ИмяСобытия, Ошибка);
ДанныеОшибки = ДанныеОшибки(Ошибка, Пояснение, ТипОшибки);
Если ОписаниеСобытия.Тест <> Неопределено Тогда
@ -70,13 +71,24 @@
ИначеЕсли ТипОшибки = ЮТФабрика.ТипыОшибок().Пропущен Тогда
ДанныеОшибки = ДанныеОшибкиПропуска(Ошибка);
Иначе
ДанныеОшибки = ДанныеОшибки(Ошибка, Ошибка.Описание, ТипОшибки);
ДанныеОшибки = ДанныеОшибки(Ошибка, ЮТСообщенияСлужебный.КраткоеСообщениеОшибки(Ошибка), ТипОшибки);
КонецЕсли;
Тест.Ошибки.Добавить(ДанныеОшибки);
КонецПроцедуры
// Регистрирует ошибку выполнения теста
// Параметры:
// Объект - см. ЮТФабрика.ОписаниеИсполняемогоТеста
// Сообщение - Строка
Процедура ЗарегистрироватьПростуюОшибкуВыполнения(Объект, Сообщение) Экспорт
ДанныеОшибки = ДанныеОшибки(Неопределено, Сообщение, ЮТФабрика.ТипыОшибок().Исполнения);
Объект.Ошибки.Добавить(ДанныеОшибки);
КонецПроцедуры
// Регистрирует ошибку режима выполнения теста
// Параметры:
// Объект - см. ЮТФабрика.ОписаниеИсполняемогоТеста
@ -120,7 +132,7 @@
ОбъектПроверки = "проверяемое значение") Экспорт
УстановитьДанныеОшибкиСравнения(ПроверяемоеЗначение, ОжидаемоеЗначение);
ТекстСообщения = ФорматированныйТекстОшибкиУтверждения(ОписаниеПроверки, Сообщение, ОбъектПроверки);
ТекстСообщения = ЮТСообщенияСлужебный.ФорматированныйТекстОшибкиУтверждения(ОписаниеПроверки, Сообщение, ОбъектПроверки);
ВызватьОшибкуПроверки(ТекстСообщения, ОписаниеПроверки);
КонецПроцедуры
@ -136,7 +148,7 @@
Процедура СгенерироватьОшибкуУтверждения(ОписаниеПроверки, Сообщение, ПроверяемоеЗначение, ОбъектПроверки = "проверяемое значение") Экспорт
УстановитьДанныеОшибкиУтверждения(ПроверяемоеЗначение);
ТекстСообщения = ФорматированныйТекстОшибкиУтверждения(ОписаниеПроверки, Сообщение, ОбъектПроверки);
ТекстСообщения = ЮТСообщенияСлужебный.ФорматированныйТекстОшибкиУтверждения(ОписаниеПроверки, Сообщение, ОбъектПроверки);
ВызватьОшибкуПроверки(ТекстСообщения, ОписаниеПроверки);
КонецПроцедуры
@ -175,7 +187,7 @@
Процедура ЗарегистрироватьОшибкуИнициализацииДвижка(Ошибка, Описание) Экспорт
Ошибка(Ошибка, Описание);
СообщитьОбОшибке(Ошибка, Описание);
КонецПроцедуры
@ -195,16 +207,18 @@
ИмяМетода = Сред(ИмяВызываемогоМетода, СтрНайти(ИмяВызываемогоМетода, ".") + 1);
Если Описание = СтрШаблон("Метод объекта не обнаружен (%1)", ИмяМетода)
Тексты = ТекстыОшибокВызоваМетода(ИмяМетода);
Если Описание = Тексты.МетодНеОбнаружен
И СтрНачинаетсяС(Ошибка.ИсходнаяСтрока, ИмяВызываемогоМетода) Тогда
ТипОшибки = ТипыОшибок.ТестНеРеализован;
ИначеЕсли Описание = "Слишком мало фактических параметров" И СтрНачинаетсяС(Ошибка.ИсходнаяСтрока, ИмяВызываемогоМетода) Тогда
ИначеЕсли Описание = Тексты.МалоПараметров И СтрНачинаетсяС(Ошибка.ИсходнаяСтрока, ИмяВызываемогоМетода) Тогда
ТипОшибки = ТипыОшибок.МалоПараметров;
ИначеЕсли Описание = "Слишком много фактических параметров" И СтрНачинаетсяС(Ошибка.ИсходнаяСтрока, ИмяВызываемогоМетода) Тогда
ИначеЕсли Описание = Тексты.МногоПараметров И СтрНачинаетсяС(Ошибка.ИсходнаяСтрока, ИмяВызываемогоМетода) Тогда
ТипОшибки = ТипыОшибок.МногоПараметров;
@ -313,42 +327,6 @@
КонецПроцедуры
// Форматированный текст ошибки утверждения.
//
// Параметры:
// ОписаниеПроверки - см. ЮТФабрика.ОписаниеПроверки
// ТекстОжидания - Строка - Описание ожидания
// ОбъектПроверки - Строка - Объект проверки
//
// Возвращаемое значение:
// Строка - Форматированный текст ошибки утверждения
Функция ФорматированныйТекстОшибкиУтверждения(Знач ОписаниеПроверки, ТекстОжидания, ОбъектПроверки) Экспорт
Если ЗначениеЗаполнено(ОписаниеПроверки.ОбъектПроверки.ИмяСвойства) Тогда
ВставкаСвойство = СтрШаблон(" содержит свойство `%1`, которое", ОписаниеПроверки.ОбъектПроверки.ИмяСвойства);
Иначе
ВставкаСвойство = "";
КонецЕсли;
Если ЗначениеЗаполнено(ОписаниеПроверки.ОбъектПроверки.Представление) Тогда
ПредставлениеЗначения = ОписаниеПроверки.ОбъектПроверки.Представление;
Иначе
ПредставлениеЗначения = СтрШаблон("`%1`", ОписаниеПроверки.ОбъектПроверки.Значение);
КонецЕсли;
// Заголовок сообщения
ТекстСообщения = "";
// Тело сообщения
ТекстСообщения = СтрШаблон("ожидали, что %1 %2%3 %4, но это не так.",
ОбъектПроверки,
ПредставлениеЗначения,
ВставкаСвойство,
ТекстОжидания);
Возврат ТекстСообщения;
КонецФункции
Функция ДобавитьОписания(ТекстОшибки, ОписаниеПроверки = Неопределено) Экспорт
Если ОписаниеПроверки <> Неопределено Тогда
@ -363,10 +341,15 @@
КонецФункции
Процедура ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, Ошибка) Экспорт
Процедура ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, Знач Ошибка, ОписаниеПроверки = Неопределено) Экспорт
Если ТипЗнч(Ошибка) = Тип("ИнформацияОбОшибке") Тогда
Ошибка = ПодробноеПредставлениеОшибки(Ошибка);
КонецЕсли;
ТекстОшибки = ДобавитьОписания(Ошибка, ОписаниеПроверки);
РезультатПроверки.Успешно = Ложь;
РезультатПроверки.Сообщения.Добавить(Ошибка);
РезультатПроверки.Сообщения.Добавить(ТекстОшибки);
КонецПроцедуры
@ -383,18 +366,60 @@
КонецПроцедуры
Процедура ДобавитьПояснениеОшибки(Пояснение) Экспорт
Детали = ЮТКонтекст.КонтекстДеталиОшибки();
Установить = Детали = Неопределено;
Если Установить Тогда
Детали = Новый Массив();
КонецЕсли;
Детали.Добавить(Пояснение);
Если Установить Тогда
ЮТКонтекст.УстановитьКонтекстДеталиОшибки(Детали);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#Область КонструкторыОписанийОшибки
Функция ДанныеОшибки(Ошибка, Сообщение, ТипОшибки)
Функция ДанныеОшибки(Ошибка, Знач Сообщение, ТипОшибки)
#Если Сервер Тогда
Детали = ЮТКонтекст.КонтекстДеталиОшибки(Истина);
#Иначе
ДеталиСервер = ЮТКонтекст.КонтекстДеталиОшибки(Истина);
ДеталиКлиент = ЮТКонтекст.КонтекстДеталиОшибки();
Если ЗначениеЗаполнено(ДеталиКлиент) И ЗначениеЗаполнено(ДеталиСервер) Тогда
ЮТОбщий.ДополнитьМассив(ДеталиСервер, ДеталиКлиент);
Детали = ДеталиСервер;
ИначеЕсли ЗначениеЗаполнено(ДеталиКлиент) Тогда
Детали = ДеталиКлиент;
ИначеЕсли ЗначениеЗаполнено(ДеталиСервер) Тогда
Детали = ДеталиСервер;
Иначе
Детали = Неопределено;
КонецЕсли;
#КонецЕсли
Если ЗначениеЗаполнено(Детали) Тогда
ЮТКонтекст.УстановитьКонтекстДеталиОшибки(Новый Массив());
Детали.Добавить(Сообщение);
Сообщение = СтрСоединить(Детали, Символы.ПС);
КонецЕсли;
ДанныеОшибки = ЮТФабрика.ОписаниеВозникшейОшибки(ТипОшибки + ": " + Сообщение);
Если Ошибка <> Неопределено Тогда
ДанныеОшибки.Стек = ПодробноеПредставлениеОшибки(Ошибка);
ДанныеОшибки.Стек = СтекОшибки(Ошибка);
КонецЕсли;
ДанныеОшибки.ТипОшибки = ТипОшибки;
ДобавитьСообщенияПользователю(ДанныеОшибки);
@ -403,13 +428,23 @@
КонецФункции
Функция СтекОшибки(Ошибка)
Если ТипЗнч(Ошибка) = Тип("ИнформацияОбОшибке") Тогда
Возврат ПодробноеПредставлениеОшибки(Ошибка);
Иначе
Возврат Неопределено;
КонецЕсли;
КонецФункции
Функция ДанныеОшибкиУтверждений(Ошибка)
Описание = ИзвлечьТекстОшибки(Ошибка, ПрефиксОшибкиУтверждений());
ДанныеОшибки = ЮТФабрика.ОписаниеОшибкиСравнения(Описание);
ДанныеОшибки.Стек = ПодробноеПредставлениеОшибки(Ошибка);
ДанныеОшибки.Стек = СтекОшибки(Ошибка);
ДобавитьСообщенияПользователю(ДанныеОшибки);
СтруктураОшибки = ЮТКонтекст.КонтекстОшибки();
@ -456,10 +491,9 @@
КонецФункции
Процедура Ошибка(Ошибка, Описание)
Процедура СообщитьОбОшибке(Ошибка, Описание)
ТекстОшибки = ПредставлениеОшибки(Описание, Ошибка);
ЮТОбщий.СообщитьПользователю(ТекстОшибки);
ЮТОбщий.СообщитьПользователю(ПредставлениеОшибки(Описание, Ошибка));
КонецПроцедуры
@ -560,4 +594,22 @@
КонецФункции
Функция ТекстыОшибокВызоваМетода(ИмяМетода)
Тексты = Новый Структура("МетодНеОбнаружен, МногоПараметров, МалоПараметров");
Если ЮТЛокальСлужебный.ЭтоАнглийскаяЛокальПлатформы() Тогда
Тексты.МетодНеОбнаружен = СтрШаблон("Object method not found (%1)", ИмяМетода);
Тексты.МногоПараметров = "Too many actual parameters";
Тексты.МалоПараметров = "Not enough actual parameters";
Иначе
Тексты.МетодНеОбнаружен = СтрШаблон("Метод объекта не обнаружен (%1)", ИмяМетода);
Тексты.МногоПараметров = "Слишком много фактических параметров";
Тексты.МалоПараметров = "Недостаточно фактических параметров";
КонецЕсли;
Возврат Тексты;
КонецФункции
#КонецОбласти

View File

@ -84,12 +84,6 @@
ПолучитьСообщенияПользователю(Истина);
#КонецЕсли
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если ЮТНастройкиВыполнения.ВТранзакции() Тогда
НачатьТранзакцию();
КонецЕсли;
#КонецЕсли
ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПередКаждымТестом", "ПередТестом"), ОписаниеСобытия);
КонецПроцедуры
@ -106,16 +100,6 @@
ВызватьОбработкуСобытий(ЮТОбщий.ЗначениеВМассиве("ПослеТеста", "ПослеКаждогоТеста"), ОписаниеСобытия);
#Если Сервер ИЛИ ТолстыйКлиентОбычноеПриложение ИЛИ ТолстыйКлиентУправляемоеПриложение Тогда
Если ЮТНастройкиВыполнения.ВТранзакции() Тогда
ОтменитьТранзакцию();
Пока ТранзакцияАктивна() Цикл
ОтменитьТранзакцию();
ЮТОбщий.СообщитьПользователю("Обнаружена незакрытая транзакция");
КонецЦикла;
КонецЕсли;
#КонецЕсли
Уровни = ЮТФабрика.УровниИсполнения();
КонтекстИсполнения = ЮТКонтекст.КонтекстИсполнения();
КонтекстИсполнения.Уровень = Уровни.НаборТестов;

View File

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

View File

@ -0,0 +1,11 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonModule xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="12de2656-e7f8-42f9-b620-006310aa949e">
<name>ЮТСообщенияСлужебный</name>
<synonym>
<key>ru</key>
<value>Сообщения служебный</value>
</synonym>
<clientManagedApplication>true</clientManagedApplication>
<server>true</server>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -63,6 +63,10 @@
Результат = МассивыРавны(Данные1, Данные2);
ИначеЕсли ТипЗначения = Тип("ТабличныйДокумент") Тогда
Результат = ЮТСравнениеСервер.ТабличныеДокументыРавны(Данные1, Данные2);
ИначеЕсли ЭтоПримитивныйТип(ТипЗначения) ИЛИ ЮТОбщий.ОписаниеТиповЛюбаяСсылка().СодержитТип(ТипЗначения) Тогда
// Возвращаем ложь, так как для этих типов должно сработать обычное равенство
Результат = Ложь;
@ -92,186 +96,25 @@
КонецФункции
// Проверить равенство значений.
//
// Параметры:
// РезультатПроверки - см. ЮТФабрика.ОписаниеРезультатаПроверки
// ПараметрыПроверки - см. ПараметрыПроверки
// ПараметрыСравнения - Структура - Параметры проверки:
// * ГлубокийАнализ - Булево - Использовать сериализацию и прочие алгоритмы сравнения
Процедура ПроверитьРавенствоЗначений(РезультатПроверки, ПараметрыПроверки, ПараметрыСравнения) Экспорт
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
Результат = ЗначенияРавны(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение, ПараметрыСравнения);
Реверс(Результат, ПараметрыПроверки);
Если НЕ Результат Тогда
ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ПроверяемоеЗначение);
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьНеравенство(РезультатПроверки, ПараметрыПроверки, Больше = Ложь, Меньше = Ложь, Равно = Ложь) Экспорт
Функция ПроверитьНеравенство(ПроверяемоеЗначение, ОжидаемоеЗначение, Больше = Ложь, Меньше = Ложь, Равно = Ложь) Экспорт
Результат = Ложь;
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
Если Больше Тогда
Результат = ПроверяемоеЗначение > ПараметрыПроверки.ОжидаемоеЗначение;
Результат = ПроверяемоеЗначение > ОжидаемоеЗначение;
КонецЕсли;
Если Меньше Тогда
Результат = Результат ИЛИ ПроверяемоеЗначение < ПараметрыПроверки.ОжидаемоеЗначение;
Результат = Результат ИЛИ ПроверяемоеЗначение < ОжидаемоеЗначение;
КонецЕсли;
Если Равно Тогда
Результат = Результат ИЛИ ПроверяемоеЗначение = ПараметрыПроверки.ОжидаемоеЗначение;
КонецЕсли;
Если НЕ Результат Тогда
ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ПроверяемоеЗначение);
Результат = Результат ИЛИ ПроверяемоеЗначение = ОжидаемоеЗначение;
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьТипПараметра(РезультатПроверки, ПараметрыПроверки) Экспорт
Возврат Результат;
Если НЕ ПроверитьТипЗначения(РезультатПроверки, ПараметрыПроверки.ОжидаемоеЗначение, Новый ОписаниеТипов("ОписаниеТипов, Тип, Строка")) Тогда
Возврат;
КонецЕсли;
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
Результат = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение);
Реверс(Результат, ПараметрыПроверки);
Если НЕ Результат Тогда
ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ТипЗнч(ПроверяемоеЗначение));
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьНаличиеСвойства(РезультатПроверки, ПараметрыПроверки) Экспорт
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
Значение = ПроверяемоеЗначение;
ПутьКСвойству = ЧастиПути(ПараметрыПроверки.ОжидаемоеЗначение);
ПройденныйПуть = Новый Массив();
Для Каждого Часть Из ПутьКСвойству Цикл
ПройденныйПуть.Добавить(Часть);
Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда
Значение = Значение.Получить();
КонецЕсли;
Попытка
ЕстьСвойство = ЗначениеИмеетСвойство(Значение, Часть);
Исключение
ЕстьСвойство = Ложь;
КонецПопытки;
Если ЕстьСвойство Тогда
Значение = Значение[Часть];
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Успешно = ЕстьСвойство;
Реверс(Успешно, ПараметрыПроверки);
Если НЕ Успешно Тогда
ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ПроверяемоеЗначение);
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьЗаполненность(РезультатПроверки, ПараметрыПроверки) Экспорт
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
Результат = ЗначениеЗаполнено(ПроверяемоеЗначение);
Реверс(Результат, ПараметрыПроверки);
Если НЕ Результат Тогда
ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ПроверяемоеЗначение);
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьДлину(РезультатПроверки, ПараметрыПроверки) Экспорт
Если НЕ ПроверитьТипЗначения(РезультатПроверки, ПараметрыПроверки.ОжидаемоеЗначение, "Число") Тогда
Возврат;
КонецЕсли;
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
ФактическаяДлина = ДлинаЗначения(ПроверяемоеЗначение);
Если ФактическаяДлина = Неопределено Тогда
ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки);
Возврат;
КонецЕсли;
Результат = ФактическаяДлина = ПараметрыПроверки.ОжидаемоеЗначение;
Реверс(Результат, ПараметрыПроверки);
Если НЕ Результат Тогда
ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ФактическаяДлина);
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСодержит(РезультатПроверки, ПараметрыПроверки) Экспорт
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
Результат = НайтиЗначение(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение);
Если Результат = Неопределено Тогда
ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки);
Возврат;
КонецЕсли;
Реверс(Результат, ПараметрыПроверки);
Если НЕ Результат Тогда
ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ПроверяемоеЗначение);
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьСоответствуетШаблону(РезультатПроверки, ПараметрыПроверки) Экспорт
Если НЕ ПроверитьТипЗначения(РезультатПроверки, ПараметрыПроверки.ОжидаемоеЗначение, "Строка") Тогда
Возврат;
КонецЕсли;
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
СоответствуетШаблону = СоответствуетШаблону(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение);
Если СоответствуетШаблону = Неопределено Тогда
ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки);
Возврат;
КонецЕсли;
Результат = СоответствуетШаблону;
Реверс(Результат, ПараметрыПроверки);
Если НЕ Результат Тогда
ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ПроверяемоеЗначение);
КонецЕсли;
КонецПроцедуры
КонецФункции
// Параметры проверки.
//
@ -288,7 +131,7 @@
// * ПрефиксОшибки - Строка, Неопределено -
// * ОписаниеПроверки - Строка, Неопределено -
// * ВидСравнения - Строка
// * ОжидаемоеЗначение - Произвольный
// * ОжидаемоеЗначение - Произвольный, Неопределено -
// * Реверс - Булево
// * ТекстПроверяемоеЗначение - Строка
Функция ПараметрыПроверки(ВидСравнения, ПроверяемоеЗначение, ИмяСвойства, ОжидаемоеЗначение, Реверс = Ложь) Экспорт
@ -413,67 +256,6 @@
#КонецОбласти
Функция ЧастиПути(Цепочка)
ПутьКСвойству = Новый Массив();
ТипПути = ТипЗнч(Цепочка);
Если ТипПути = Тип("Строка") Тогда
Части = СтрРазделить(Цепочка, ".");
Для Каждого Часть Из Части Цикл
Если СодержитИндекс(Часть) Тогда
ИзвлечьИндекс(Часть, ПутьКСвойству);
Иначе
ПутьКСвойству.Добавить(Часть);
КонецЕсли;
КонецЦикла;
Иначе
ПутьКСвойству.Добавить(Цепочка);
КонецЕсли; // BSLLS:IfElseIfEndsWithElse-off
Возврат ПутьКСвойству;
КонецФункции
Функция СодержитИндекс(ИмяСвойства)
Возврат СтрНайти(ИмяСвойства, "[") > 0 И СтрЗаканчиваетсяНа(ИмяСвойства, "]") ;
КонецФункции
Процедура ИзвлечьИндекс(ИмяСвойства, БлокиПути)
ПозицияИндекса = СтрНайти(ИмяСвойства, "[");
Если ПозицияИндекса > 1 Тогда
БлокиПути.Добавить(Лев(ИмяСвойства, ПозицияИндекса - 1));
КонецЕсли;
Пока ПозицияИндекса > 0 Цикл
ЗакрывающаяПозиция = СтрНайти(ИмяСвойства, "]", , ПозицияИндекса);
ИндексСтрокой = Сред(ИмяСвойства, ПозицияИндекса + 1, ЗакрывающаяПозиция - ПозицияИндекса - 1);
Индекс = Число(ИндексСтрокой);
БлокиПути.Добавить(Индекс);
ПозицияИндекса = СтрНайти(ИмяСвойства, "[", , ЗакрывающаяПозиция);
КонецЦикла;
КонецПроцедуры
Функция ЗначениеИмеетСвойство(Значение, Свойство)
Результат = Ложь;
@ -511,21 +293,6 @@
КонецФункции
Процедура ОбработатьРезультатСравнения(РезультатПроверки, ПараметрыПроверки, ФактическоеЗначение)
ШаблонСообщения = ЮТПредикатыКлиентСервер.ШаблонВыражения(ПараметрыПроверки.ВидСравнения);
Сообщение = СтрШаблон(ШаблонСообщения, ПараметрыПроверки.ОжидаемоеЗначение);
ТекстОшибки = ЮТРегистрацияОшибок.ФорматированныйТекстОшибкиУтверждения(ПараметрыПроверки, Сообщение, ПараметрыПроверки.ТекстПроверяемоеЗначение);
ТекстОшибки = ЮТРегистрацияОшибок.ДобавитьОписания(ТекстОшибки, ПараметрыПроверки);
ЮТРегистрацияОшибок.ДобавитьОшибкуСравненияКРезультатуПроверки(РезультатПроверки,
ТекстОшибки,
ФактическоеЗначение,
ПараметрыПроверки.ОжидаемоеЗначение);
КонецПроцедуры
// Параметры проверки.
//
// Параметры:
@ -536,7 +303,7 @@
Функция ПроверяемоеЗначение(ПараметрыПроверки)
Если ПараметрыПроверки.ОбъектПроверки.ИмяСвойства <> Неопределено Тогда
Значение = ЗначениеСвойства(ПараметрыПроверки.ОбъектПроверки.Значение, ПараметрыПроверки.ОбъектПроверки.ИмяСвойства);
Значение = ЮТОбщий.ЗначениеСвойства(ПараметрыПроверки.ОбъектПроверки.Значение, ПараметрыПроверки.ОбъектПроверки.ИмяСвойства);
Иначе
Значение = ПараметрыПроверки.ОбъектПроверки.Значение;
КонецЕсли;
@ -545,42 +312,11 @@
КонецФункции
Функция ЗначениеСвойства(Объект, ИмяСвойства)
Путь = ЧастиПути(ИмяСвойства);
Значение = Объект;
Для Каждого Часть Из Путь Цикл
Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда
Значение = Значение.Получить();
КонецЕсли;
Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда
Часть = Значение.Количество() + Часть;
КонецЕсли;
Значение = Значение[Часть];
КонецЦикла;
Возврат Значение;
КонецФункции
Процедура Реверс(Значение, ПараметрыПроверки)
Если ПараметрыПроверки.Реверс Тогда
Значение = НЕ Значение;
КонецЕсли;
КонецПроцедуры
Функция ДлинаЗначения(ПроверяемоеЗначение)
ТипПроверяемогоЗначения = ТипЗнч(ПроверяемоеЗначение);
Если ТипПроверяемогоЗначения = Тип("Строка") Тогда
Если ТипПроверяемогоЗначения = Тип("Строка") ИЛИ ТипПроверяемогоЗначения = Тип("ФорматированнаяСтрока") Тогда
ФактическаяДлина = СтрДлина(ПроверяемоеЗначение);
@ -600,27 +336,25 @@
Функция СоответствуетШаблону(ПроверяемаяСтрока, РегулярноеВыражение)
Если ТипЗнч(ПроверяемаяСтрока) <> Тип("Строка") Тогда
Возврат Неопределено;
КонецЕсли;
РегулярныеВыражения = ЮТКомпоненты.РегулярныеВыражения();
Попытка
Результат = РегулярныеВыражения.Совпадает(ПроверяемаяСтрока, РегулярноеВыражение);
Результат = РегулярныеВыражения.Совпадает(Строка(ПроверяемаяСтрока), РегулярноеВыражение);
Исключение
ВызватьИсключение РегулярныеВыражения.ОписаниеОшибки;
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки("Ошибка проверки строки по шаблону " + РегулярноеВыражение);
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки(РегулярныеВыражения.ОписаниеОшибки);
ВызватьИсключение;
КонецПопытки;
Возврат Результат;
КонецФункции
Функция НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение)
ТипПроверяемогоЗначения = ТипЗнч(ПроверяемоеЗначение);
Если ТипПроверяемогоЗначения = Тип("Строка") Тогда
Если ТипПроверяемогоЗначения = Тип("Строка") Или ТипПроверяемогоЗначения = Тип("ФорматированнаяСтрока") Тогда
ИскомоеЗначениеНайдено = СтрНайти(ПроверяемоеЗначение, ОжидаемоеЗначение) > 0;
@ -645,6 +379,10 @@
ИскомоеЗначениеНайдено = ПроверяемоеЗначение.НайтиПоЗначению(ОжидаемоеЗначение) <> Неопределено;
ИначеЕсли ПроверяемоеЗначение <> Неопределено И ЮТОбщий.МетодОбъектаСуществует(ПроверяемоеЗначение, "Найти") Тогда
ИскомоеЗначениеНайдено = ПроверяемоеЗначение.Найти(ОжидаемоеЗначение) <> Неопределено;
Иначе
ИскомоеЗначениеНайдено = Неопределено; // Обрабатывается вызывающим методом
@ -688,4 +426,243 @@
КонецФункции
#Область РеализацияПредикатор
Процедура ПроверитьВыражениеПредиката(Значение, Выражение, СтатусПроверки, ПараметрыСообщенийОбОшибке, ПараметрыСравнения) Экспорт
Попытка
ВызватьОбработчикПредиката(Значение, Выражение, СтатусПроверки, ПараметрыСообщенийОбОшибке, ПараметрыСравнения);
Исключение
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(СтатусПроверки, ИнформацияОбОшибке());
КонецПопытки;
КонецПроцедуры
// Вычислить выражение предиката.
//
// Параметры:
// Значение - Произвольный - Значение
// Выражение - см. ЮТФабрика.ВыражениеПредиката
// СтатусПроверки - см. ЮТФабрика.ОписаниеРезультатаПроверки
// ПараметрыСообщенийОбОшибке - см. ПараметрыСообщенийОбОшибке
// ПараметрыСравнения - Неопределено
// - Структура - Параметры сравнения значений, для разных выражений испльзуются свои параметры
Процедура ВызватьОбработчикПредиката(Значение, Выражение, СтатусПроверки, ПараметрыСообщенийОбОшибке, ПараметрыСравнения)
// BSLLS:CognitiveComplexity-off
ВидыСравнения = ЮТПредикаты.Выражения();
ПараметрыПроверки = ПараметрыПроверки(Выражение.ВидСравнения, Значение, Выражение.ИмяРеквизита, Выражение.Значение, Ложь);
ПараметрыПроверки.ОписаниеПроверки = ПараметрыСообщенийОбОшибке.ОписаниеПроверки;
ПараметрыПроверки.ТекстПроверяемоеЗначение = ПараметрыСообщенийОбОшибке.ТекстПроверяемоеЗначение;
ПараметрыПроверки.ОбъектПроверки.Представление = ПараметрыСообщенийОбОшибке.ПредставлениеПроверяемогоЗначения;
Если СтрНачинаетсяС(Выражение.ВидСравнения, "Не") И ВидыСравнения.Свойство(Сред(Выражение.ВидСравнения, 3)) Тогда
ПараметрыПроверки.Реверс = Истина;
ВидСравненияВыражения = Сред(Выражение.ВидСравнения, 3);
Иначе
ВидСравненияВыражения = Выражение.ВидСравнения;
КонецЕсли;
Результат = Неопределено;
ОжидаемоеЗначение = Выражение.Значение;
ПроверяемоеЗначение = ПроверяемоеЗначение(ПараметрыПроверки);
Если ВидСравненияВыражения = ВидыСравнения.Равно Тогда
Результат = ЗначенияРавны(ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыСравнения);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.Заполнено Тогда
Результат = ЗначениеЗаполнено(ПроверяемоеЗначение);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.Больше Тогда
Результат = ПроверитьНеравенство(ПроверяемоеЗначение, ОжидаемоеЗначение, Истина);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.БольшеРавно Тогда
Результат = ПроверитьНеравенство(ПроверяемоеЗначение, ОжидаемоеЗначение, Истина, , Истина);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.Меньше Тогда
Результат = ПроверитьНеравенство(ПроверяемоеЗначение, ОжидаемоеЗначение, , Истина);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.МеньшеРавно Тогда
Результат = ПроверитьНеравенство(ПроверяемоеЗначение, ОжидаемоеЗначение, , Истина, Истина);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.ИмеетТип Тогда
ПроверитьТипПараметра(СтатусПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.ИмеетСвойство Тогда
Результат = ПроверитьНаличиеСвойства(СтатусПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.ИмеетДлину Тогда
ПроверитьДлину(СтатусПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.Содержит Тогда
Результат = ПроверитьСодержит(СтатусПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки);
ИначеЕсли ВидСравненияВыражения = ВидыСравнения.СодержитСтрокуПоШаблону Тогда
Результат = ПроверитьСоответствуетШаблону(СтатусПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки);
Иначе
ВызватьИсключение СтрШаблон("Неизвестное выражение предиката `%1`", Выражение.ВидСравнения);
КонецЕсли;
// BSLLS:CognitiveComplexity-on
Если Результат = Неопределено Тогда
Возврат;
КонецЕсли;
Если ПараметрыПроверки.Реверс Тогда
Результат = НЕ Результат;
КонецЕсли;
ОбработатьРезультатСравнения(Результат, СтатусПроверки, ПараметрыПроверки, ПроверяемоеЗначение);
КонецПроцедуры
Процедура ОбработатьРезультатСравнения(Результат, РезультатПроверки, ПараметрыПроверки, ФактическоеЗначение)
Если Результат Тогда
Возврат;
КонецЕсли;
ШаблонСообщения = ЮТПредикатыКлиентСервер.ШаблонВыражения(ПараметрыПроверки.ВидСравнения);
Сообщение = СтрШаблон(ШаблонСообщения, ПараметрыПроверки.ОжидаемоеЗначение);
ТекстОшибки = ЮТСообщенияСлужебный.ФорматированныйТекстОшибкиУтверждения(ПараметрыПроверки, Сообщение, ПараметрыПроверки.ТекстПроверяемоеЗначение);
ТекстОшибки = ЮТРегистрацияОшибок.ДобавитьОписания(ТекстОшибки, ПараметрыПроверки);
ЮТРегистрацияОшибок.ДобавитьОшибкуСравненияКРезультатуПроверки(РезультатПроверки,
ТекстОшибки,
ФактическоеЗначение,
ПараметрыПроверки.ОжидаемоеЗначение);
КонецПроцедуры
Процедура ПроверитьТипПараметра(РезультатПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки)
Если НЕ ПроверитьТипЗначения(РезультатПроверки, ОжидаемоеЗначение, Новый ОписаниеТипов("ОписаниеТипов, Тип, Строка")) Тогда
Возврат;
КонецЕсли;
Результат = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(ПроверяемоеЗначение, ПараметрыПроверки.ОжидаемоеЗначение);
Если ПараметрыПроверки.Реверс Тогда
Результат = НЕ Результат;
КонецЕсли;
ОбработатьРезультатСравнения(Результат, РезультатПроверки, ПараметрыПроверки, ТипЗнч(ПроверяемоеЗначение));
КонецПроцедуры
Функция ПроверитьНаличиеСвойства(РезультатПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение)
Значение = ПроверяемоеЗначение;
ПутьКСвойству = ЮТОбщий.ЧастиПути(ОжидаемоеЗначение);
ПройденныйПуть = Новый Массив();
Для Каждого Часть Из ПутьКСвойству Цикл
ПройденныйПуть.Добавить(Часть);
Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда
#Если ВебКлиент Или ТонкийКлиент Тогда
Значение = ЮТОбщийВызовСервера.ИзХранилищаЗначений(Значение);
#Иначе
Значение = Значение.Получить();
#КонецЕсли
КонецЕсли;
Попытка
ЕстьСвойство = ЗначениеИмеетСвойство(Значение, Часть);
Исключение
ЕстьСвойство = Ложь;
КонецПопытки;
Если ЕстьСвойство Тогда
Значение = Значение[Часть];
Иначе
Прервать;
КонецЕсли;
КонецЦикла;
Возврат ЕстьСвойство;
КонецФункции
Процедура ПроверитьДлину(РезультатПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки)
Если НЕ ПроверитьТипЗначения(РезультатПроверки, ОжидаемоеЗначение, "Число") Тогда
Возврат;
КонецЕсли;
ФактическаяДлина = ДлинаЗначения(ПроверяемоеЗначение);
Если ФактическаяДлина = Неопределено Тогда
ТекстОшибки = СтрШаблон("тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки, ПараметрыПроверки);
Возврат;
КонецЕсли;
Результат = ФактическаяДлина = ПараметрыПроверки.ОжидаемоеЗначение;
Если ПараметрыПроверки.Реверс Тогда
Результат = НЕ Результат;
КонецЕсли;
ОбработатьРезультатСравнения(Результат, РезультатПроверки, ПараметрыПроверки, ФактическаяДлина);
КонецПроцедуры
Функция ПроверитьСодержит(РезультатПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки)
Результат = НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение);
Если Результат = Неопределено Тогда
ТекстОшибки = СтрШаблон("тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки, ПараметрыПроверки);
КонецЕсли;
Возврат Результат;
КонецФункции
Функция ПроверитьСоответствуетШаблону(РезультатПроверки, ПроверяемоеЗначение, ОжидаемоеЗначение, ПараметрыПроверки)
ТипыПараметровСоответствуют = ПроверитьТипЗначения(РезультатПроверки, ОжидаемоеЗначение, "Строка")
И ПроверитьТипЗначения(РезультатПроверки, ПроверяемоеЗначение, "Строка, ФорматированнаяСтрока", "проверяемого значения");
Если Не ТипыПараметровСоответствуют Тогда
Возврат Неопределено;
КонецЕсли;
СоответствуетШаблону = СоответствуетШаблону(ПроверяемоеЗначение, ОжидаемоеЗначение);
Если СоответствуетШаблону = Неопределено Тогда
ТекстОшибки = СтрШаблон("тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.ДобавитьОшибкуКРезультатуПроверки(РезультатПроверки, ТекстОшибки, ПараметрыПроверки);
КонецЕсли;
Возврат СоответствуетШаблону;
КонецФункции
#КонецОбласти
#КонецОбласти

View File

@ -18,7 +18,7 @@
#Область СлужебныйПрограммныйИнтерфейс
Функция ТаблицыРавны(Данные1, Данные2) Экспорт
Функция ТаблицыРавны(Знач Данные1, Знач Данные2) Экспорт
Если Данные1.Количество() <> Данные2.Количество() Тогда
Возврат Ложь;
@ -46,4 +46,74 @@
КонецФункции
Функция ТабличныеДокументыРавны(Знач ТабличныйДокумент1, Знач ТабличныйДокумент2) Экспорт
Данные1 = ПолучитьТаблицуЗначенийИзТабличногоДокумента(ТабличныйДокумент1);
Данные2 = ПолучитьТаблицуЗначенийИзТабличногоДокумента(ТабличныйДокумент2);
Возврат ТаблицыРавны(Данные1, Данные2);
КонецФункции
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// https://github.com/vanessa-opensource/add
// портирован из Functest
Функция ПолучитьТаблицуЗначенийИзТабличногоДокумента(ТабличныйДокумент, УчитыватьТолькоВидимыеКолонки = Ложь, УчитыватьТолькоВидимыеСтроки = Ложь)
ТипТабличногоДокумента = ТипЗнч(ТабличныйДокумент);
Если ТипТабличногоДокумента <> Тип("ТабличныйДокумент") И ТипТабличногоДокумента <> Тип("ПолеТабличногоДокумента") Тогда
ВызватьИсключение "ПолучитьТаблицуЗначенийИзТабличногоДокумента: Требуется тип ТабличныйДокумент или ПолеТабличногоДокумента";
КонецЕсли;
Если УчитыватьТолькоВидимыеКолонки И УчитыватьТолькоВидимыеСтроки Тогда
ЮТОбщийВызовСервера.ТаблицаИзТабличногоДокумента(ТипТабличногоДокумента);
КонецЕсли;
НомерПоследнейКолонки = ТабличныйДокумент.ШиринаТаблицы;
НомерПоследнейСтроки = ТабличныйДокумент.ВысотаТаблицы;
НоваяТаблицаЗначений = Новый ТаблицаЗначений;
Колонки = НоваяТаблицаЗначений.Колонки;
ТипСтрока = Новый ОписаниеТипов("Строка");
// TODO При определении видимости не учитывается наличие нескольких форматов строк, сейчас видимоcть колонки определяется по формату первой строки
УчитываемыеКолонки = Новый Массив;
Для НомерКолонки = 1 По НомерПоследнейКолонки Цикл
ОбластьКолонки = ТабличныйДокумент.Область(0, НомерКолонки, 1, НомерКолонки);
УчитыватьКолонку = Не УчитыватьТолькоВидимыеКолонки Или ОбластьКолонки.Видимость;
Если УчитыватьКолонку Тогда
УчитываемыеКолонки.Добавить(НомерКолонки);
ШиринаКолонки = ОбластьКолонки.ШиринаКолонки;
Если ШиринаКолонки <= 1 Тогда
ШиринаКолонки = 1;
КонецЕсли;
ИмяКолонки = "К" + Формат(Колонки.Количество() + 1, "ЧН=; ЧГ=0");
Колонки.Добавить(ИмяКолонки, ТипСтрока, ИмяКолонки, ШиринаКолонки);
КонецЕсли;
КонецЦикла;
ГраницаКолонок = УчитываемыеКолонки.ВГраница();
Для НомерСтроки = 1 По НомерПоследнейСтроки Цикл
Если УчитыватьТолькоВидимыеСтроки И Не ТабличныйДокумент.Область(НомерСтроки, , НомерСтроки).Видимость Тогда
Продолжить;
КонецЕсли;
НоваяСтрока = НоваяТаблицаЗначений.Добавить();
Для Индекс = 0 По ГраницаКолонок Цикл
НомерКолонки = УчитываемыеКолонки[Индекс];
Область = ТабличныйДокумент.Область(НомерСтроки, НомерКолонки, НомерСтроки, НомерКолонки);
НоваяСтрока[Индекс] = Область.Текст;
КонецЦикла;
КонецЦикла;
Возврат НоваяТаблицаЗначений;
КонецФункции
#КонецОбласти

View File

@ -6,4 +6,5 @@
<value>Сравнение сервер</value>
</synonym>
<server>true</server>
<serverCall>true</serverCall>
</mdclass:CommonModule>

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.ЮТСравнениеСервер">
<suppressions key="com.e1c.v8codestyle.md:common-module-name-server-call" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -18,18 +18,38 @@
#Область ПрограммныйИнтерфейс
// Строка с символами русского алфавита
//
// Параметры:
// НижнийРегистр - Булево - добавить символы в нижнем регистре
// ВерхнийРегистр - Булево - добавить символы в верхнем регистре
//
// Возвращаемое значение:
// Строка
Функция РусскиеБуквы(НижнийРегистр = Истина, ВерхнийРегистр = Ложь) Экспорт
Возврат Буквы("абвгдеёжзийклмнопрстуфхцчшщъыьэюя", НижнийРегистр, ВерхнийРегистр);
КонецФункции
// Строка с символами английского алфавита
//
// Параметры:
// НижнийРегистр - Булево - добавить символы в нижнем регистре
// ВерхнийРегистр - Булево - добавить символы в верхнем регистре
//
// Возвращаемое значение:
// Строка
Функция АнглийскиеБуквы(НижнийРегистр = Истина, ВерхнийРегистр = Ложь) Экспорт
Возврат Буквы("abcdefghijklmnopqrstuvwxyz", НижнийРегистр, ВерхнийРегистр);
КонецФункции
// Строка с числами
//
// Возвращаемое значение:
// Строка
Функция Цифры() Экспорт
Возврат "1234567890";

View File

@ -24,10 +24,11 @@
// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд.
// Наименование - Строка, Неопределено - Наименование элемента
// Реквизиты - Структура, Неопределено - Значения реквизитов элемента
// ПараметрыЗаписи - см. ЮТОбщий.ПараметрыЗаписи
//
// Возвращаемое значение:
// ЛюбаяСсылка - Ссылка на созданный объект
Функция СоздатьЭлемент(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено) Экспорт
Функция СоздатьЭлемент(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено, Знач ПараметрыЗаписи = Неопределено) Экспорт
Если Реквизиты <> Неопределено Тогда
Данные = Реквизиты;
@ -36,10 +37,14 @@
КонецЕсли;
Если ЗначениеЗаполнено(Наименование) Тогда
Данные.Вставить("Наименование", Наименование);
Если ЮТОбщийВызовСервера.ЭтоАнглийскийВстроенныйЯзык() Тогда
Данные.Вставить("Description", Наименование);
Иначе
Данные.Вставить("Наименование", Наименование);
КонецЕсли;
КонецЕсли;
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Менеджер, Данные, Неопределено, Ложь);
Ссылка = ЮТТестовыеДанныеВызовСервера.СоздатьЗапись(Менеджер, Данные, ПараметрыЗаписи, Ложь);
ЮТТестовыеДанныеСлужебный.ДобавитьТестовуюЗапись(Ссылка);
Возврат Ссылка;
@ -51,10 +56,11 @@
// Параметры:
// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд.
// Реквизиты - Структура, Неопределено - Значения реквизитов элемента
// ПараметрыЗаписи - см. ЮТОбщий.ПараметрыЗаписи
//
// Возвращаемое значение:
// ДокументСсылка - Ссылка на созданный объект
Функция СоздатьДокумент(Менеджер, Реквизиты = Неопределено) Экспорт
Функция СоздатьДокумент(Менеджер, Реквизиты = Неопределено, Знач ПараметрыЗаписи = Неопределено) Экспорт
Если Реквизиты <> Неопределено Тогда
Данные = Реквизиты;
@ -62,7 +68,7 @@
Данные = Новый Структура;
КонецЕсли;
Если Данные.Свойство("РежимЗаписи") Тогда
Если ПараметрыЗаписи = Неопределено И Данные.Свойство("РежимЗаписи") Тогда
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ПараметрыЗаписи.РежимЗаписи = Данные.РежимЗаписи;
Данные.Удалить("РежимЗаписи");
@ -81,10 +87,11 @@
// Менеджер - Произвольный - Менеджер справочника/ПВХ и тд.
// Наименование - Строка, Неопределено - Наименование элемента
// Реквизиты - Структура, Неопределено - Значения реквизитов элемента
// ПараметрыЗаписи - см. ЮТОбщий.ПараметрыЗаписи
//
// Возвращаемое значение:
// ЛюбаяСсылка - Ссылка на созданную группу
Функция СоздатьГруппу(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено) Экспорт
Функция СоздатьГруппу(Менеджер, Наименование = Неопределено, Реквизиты = Неопределено, Знач ПараметрыЗаписи = Неопределено) Экспорт
Если Реквизиты <> Неопределено Тогда
Данные = Реквизиты;
@ -94,7 +101,7 @@
Данные.Вставить("ЭтоГруппа", Истина);
Возврат СоздатьЭлемент(Менеджер, Наименование, Данные);
Возврат СоздатьЭлемент(Менеджер, Наименование, Данные, ПараметрыЗаписи);
КонецФункции
@ -159,9 +166,13 @@
//
// Возвращаемое значение:
// Число - Случайное отрицательное число
Функция СлучайноеОтрицательноеЧисло(Минимум = Неопределено, ЗнаковПослеЗапятой = 0) Экспорт
Функция СлучайноеОтрицательноеЧисло(Знач Минимум = Неопределено, ЗнаковПослеЗапятой = 0) Экспорт
Возврат -СлучайноеЧисло(0, -Минимум, ЗнаковПослеЗапятой);
Если Минимум <> Неопределено Тогда
Минимум = -Минимум;
КонецЕсли;
Возврат -СлучайноеЧисло(0, Минимум, ЗнаковПослеЗапятой);
КонецФункции
@ -280,7 +291,7 @@
// Булево - Случайное булево
Функция СлучайноеБулево() Экспорт
Возврат СлучайноеЧисло() %2 = 0;
Возврат СлучайноеЧисло() % 2 = 0;
КонецФункции
@ -313,6 +324,8 @@
КонецФункции
#Если Не ВебКлиент Тогда
// Создает новый файл, который будет удален после теста
//
// Параметры:
@ -342,7 +355,7 @@
Возврат Результат;
КонецФункции
// Возвращает имя нового файла.
// По окончании выполнения теста этот файл будет удален.
//
@ -449,6 +462,8 @@
КонецФункции
#КонецЕсли
// Формирует массив различных комбиначий параметров
//
// Предназначено для формирования таблицы возможных значений параметров для краш теста метода.
@ -534,8 +549,8 @@
// * ФикцияОбязательныхПолей - Булево - По умолчанию, Ложь
// * ОбменДаннымиЗагрузка - Булево - По умолчанию, Истина
// Возвращаемое значение:
// ТаблицаЗначений - Для сервера, данные загруженные из макета
// Массив из Структура - Для клиента, данные загруженные из макета
// - ТаблицаЗначений - Для сервера, данные загруженные из макета
// - Массив из Структура - Для клиента, данные загруженные из макета
Функция ЗагрузитьИзМакета(Макет,
ОписанияТипов,
КэшЗначений = Неопределено,
@ -574,12 +589,43 @@
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Функция HTTPСервисЗапрос() Экспорт
Возврат Обработки.ЮТHTTPСервисЗапрос.Создать();
Если ЮТОбщийВызовСервера.ЭтоАнглийскийВстроенныйЯзык() Тогда
Возврат Обработки.ЮТHTTPServiceRequest.Создать();
Иначе
Возврат Обработки.ЮТHTTPСервисЗапрос.Создать();
КонецЕсли;
КонецФункции
#КонецЕсли
// Устанавливает значение реквизита ссылки
//
// Параметры:
// Ссылка - ЛюбаяСсылка
// ИмяРеквизита - Строка
// ЗначениеРеквизита - Произвольный
// ПараметрыЗаписи - см. ЮТФабрика.ПараметрыЗаписи
Процедура УстановитьЗначениеРеквизита(Ссылка, ИмяРеквизита, ЗначениеРеквизита, ПараметрыЗаписи = Неопределено) Экспорт
Значения = Новый Соответствие();
Значения.Вставить(ИмяРеквизита, ЗначениеРеквизита);
УстановитьЗначенияРеквизитов(Ссылка, Значения, ПараметрыЗаписи);
КонецПроцедуры
// Устанавливает значения реквизитов ссылки.
//
// Параметры:
// Ссылка - ЛюбаяСсылка - Ссылка
// ЗначенияРеквизитов - Структура, Соответствие из Произвольный - Значения реквизитов
// ПараметрыЗаписи - см. ЮТФабрика.ПараметрыЗаписи
Процедура УстановитьЗначенияРеквизитов(Ссылка, ЗначенияРеквизитов, ПараметрыЗаписи = Неопределено) Экспорт
ЮТТестовыеДанныеВызовСервера.УстановитьЗначенияРеквизитов(Ссылка, ЗначенияРеквизитов);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции

View File

@ -49,7 +49,7 @@
ПараметрыЗагрузки = ПараметрыЗагрузки(КолонкиМакета, ОписанияТипов, ЗаменяемыеЗначения, КэшЗначений, ПараметрыЗаполнения);
Выборка = ВыборкаИзТабличногоДокумента(ДанныеМакета);
Выборка = ЮТОбщийВызовСервера.ВыборкаИзТабличногоДокумента(ДанныеМакета);
Пока Выборка.Следующий() Цикл
@ -92,7 +92,7 @@
Продолжить;
КонецЕсли;
КолонкиМакета = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, Истина);
КолонкиМакета = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель);
СледующаяСтрока(ПараметрыИтератора);
Прервать;
@ -112,7 +112,7 @@
КонецЕсли;
СтрокаДанных = ПараметрыЗагрузки.Таблица.Добавить();
Блоки = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель, Истина);
Блоки = ЮТОбщий.РазложитьСтрокуВМассивПодстрок(Строка, Разделитель);
Для Каждого ОписаниеКолонки Из ПараметрыЗагрузки.ОписаниеКолонок Цикл
@ -219,22 +219,6 @@
КонецФункции
Функция ВыборкаИзТабличногоДокумента(ТабличныйДокумент)
ВсегоСтрок = ТабличныйДокумент.ВысотаТаблицы;
ВсегоКолонок = ТабличныйДокумент.ШиринаТаблицы;
Область = ТабличныйДокумент.Область(1, 1, ВсегоСтрок, ВсегоКолонок);
ИсточникДанных = Новый ОписаниеИсточникаДанных(Область);
ПостроительОтчета = Новый ПостроительОтчета;
ПостроительОтчета.ИсточникДанных = ИсточникДанных;
ПостроительОтчета.Выполнить();
Возврат ПостроительОтчета.Результат.Выбрать();
КонецФункции
Функция ДанныеМакета(Знач Макет)
ТипПараметра = ТипЗнч(Макет);

View File

@ -21,21 +21,11 @@
Функция СоздатьЗапись(Знач Менеджер, Знач Данные, Знач ПараметрыЗаписи, Знач ВернутьОбъект) Экспорт
Менеджер = ЮТОбщий.Менеджер(Менеджер);
Если ПараметрыЗаписи = Неопределено Тогда
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
Иначе
ПереданныеПараметрыЗаписи = ПараметрыЗаписи;
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ЗаполнитьЗначенияСвойств(ПараметрыЗаписи, ПереданныеПараметрыЗаписи);
КонецЕсли;
ПараметрыЗаписи = ПараметрыЗаписи(ПараметрыЗаписи);
Объект = НовыйОбъект(Менеджер, Данные, ПараметрыЗаписи.ДополнительныеСвойства);
ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(Менеджер);
РежимЗаписи = ?(СтрСравнить(ОписаниеОбъектаМетаданных.ОписаниеТипа.Имя, "Документ") = 0, ПараметрыЗаписи.РежимЗаписи, Неопределено);
КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи.ОбменДаннымиЗагрузка, РежимЗаписи);
КлючЗаписи = ЗаписатьОбъект(Объект, ПараметрыЗаписи);
Если ВернутьОбъект Тогда
Возврат Объект;
@ -153,7 +143,11 @@
ОписаниеОбъектаМетаданных = ЮТМетаданные.ОписаниеОбъектаМетаданных(ОбъектМетаданных);
ОписаниеТипа = ОписаниеОбъектаМетаданных.ОписаниеТипа;
ИмяТипаМенеджера = СтрШаблон("%1Менеджер.%2", ОписаниеТипа.Имя, ОбъектМетаданных.Имя);
Если ЮТОбщийВызовСервера.ЭтоАнглийскийВстроенныйЯзык() Тогда
ИмяТипаМенеджера = СтрШаблон("%1Manager.%2", ОписаниеТипа.Имя, ОбъектМетаданных.Имя);
Иначе
ИмяТипаМенеджера = СтрШаблон("%1Менеджер.%2", ОписаниеТипа.Имя, ОбъектМетаданных.Имя);
КонецЕсли;
Менеджер = Новый (ИмяТипаМенеджера);
Объект = СоздатьОбъект(Менеджер, ОписаниеТипа, РеквизитыЗаполнения);
@ -164,7 +158,7 @@
ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных);
Возврат ЗаписатьОбъект(Объект);
Возврат ЗаписатьОбъект(Объект, ПараметрыЗаписи());
КонецФункции
@ -207,6 +201,19 @@
КонецФункции
Процедура УстановитьЗначенияРеквизитов(Знач Ссылка, Знач ЗначенияРеквизитов, Знач ПараметрыЗаписи = Неопределено) Экспорт
Объект = Ссылка.ПолучитьОбъект();
ПараметрыЗаписи = ПараметрыЗаписи(ПараметрыЗаписи);
Для Каждого Элемент Из ЗначенияРеквизитов Цикл
Объект[Элемент.Ключ] = Элемент.Значение;
КонецЦикла;
ЗаписатьОбъект(Объект, ПараметрыЗаписи);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
@ -255,21 +262,33 @@
КонецФункции
Функция ЗаписатьОбъект(Объект, ОбменДаннымиЗагрузка = Ложь, РежимЗаписи = Неопределено)
// Записать объект.
//
// Параметры:
// Объект - Произвольный - Объект
// ПараметрыЗаписи - см. ЮТОбщий.ПараметрыЗаписи
//
// Возвращаемое значение:
// ЛюбаяСсылка
Функция ЗаписатьОбъект(Объект, ПараметрыЗаписи)
Если ОбменДаннымиЗагрузка Тогда
Если ПараметрыЗаписи.ОбменДаннымиЗагрузка Тогда
Объект.ОбменДанными.Загрузка = Истина;
КонецЕсли;
Если ЗначениеЗаполнено(ПараметрыЗаписи.ДополнительныеСвойства) Тогда
ЮТОбщий.ОбъединитьВСтруктуру(Объект.ДополнительныеСвойства, ПараметрыЗаписи.ДополнительныеСвойства);
КонецЕсли;
Попытка
Если РежимЗаписи <> Неопределено Тогда
Объект.Записать(РежимЗаписи);
Если ПараметрыЗаписи.РежимЗаписи <> Неопределено Тогда
Объект.Записать(ПараметрыЗаписи.РежимЗаписи);
Иначе
Объект.Записать();
КонецЕсли;
Если ОбменДаннымиЗагрузка Тогда
Если ПараметрыЗаписи.ОбменДаннымиЗагрузка Тогда
Объект.ОбменДанными.Загрузка = Ложь;
КонецЕсли;
@ -277,9 +296,8 @@
Исключение
Сообщение = СтрШаблон("Не удалось записать объект `%1` (%2)
|%3", Объект, ТипЗнч(Объект), ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
ВызватьИсключение Сообщение;
ЮТРегистрацияОшибок.ДобавитьПояснениеОшибки(СтрШаблон("Не удалось записать объект `%1` (%2)", Объект, ТипЗнч(Объект)));
ВызватьИсключение;
КонецПопытки;
@ -287,8 +305,13 @@
Процедура ЗаполнитьБазовыеРеквизиты(Объект, ОписаниеОбъектаМетаданных)
АнглийскийЯзык = ЮТОбщийВызовСервера.ЭтоАнглийскийВстроенныйЯзык();
ИмяТипаДокумент = ?(АнглийскийЯзык,"Document","Документ");
ИмяРеквизитаКод = ?(АнглийскийЯзык,"Code","Код");
ИмяРеквизитаНаименование = ?(АнглийскийЯзык,"Description","Наименование");
ОписаниеТипа = ОписаниеОбъектаМетаданных.ОписаниеТипа;
Если ОписаниеТипа.Имя = "Документ" Тогда
Если ОписаниеТипа.Имя = ИмяТипаДокумент Тогда
Если НЕ ЗначениеЗаполнено(Объект.Дата) Тогда
Объект.Дата = ТекущаяДатаСеанса();
КонецЕсли;
@ -297,14 +320,14 @@
КонецЕсли;
КонецЕсли;
Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство("Код")
И ОписаниеОбъектаМетаданных.Реквизиты.Код.Обязательный
Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизитаКод)
И ОписаниеОбъектаМетаданных.Реквизиты[ИмяРеквизитаКод].Обязательный
И Не ЗначениеЗаполнено(Объект.Код) Тогда
Объект.УстановитьНовыйКод();
КонецЕсли;
Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство("Наименование")
И ОписаниеОбъектаМетаданных.Реквизиты.Наименование.Обязательный
Если ОписаниеОбъектаМетаданных.Реквизиты.Свойство(ИмяРеквизитаНаименование)
И ОписаниеОбъектаМетаданных.Реквизиты[ИмяРеквизитаНаименование].Обязательный
И Не ЗначениеЗаполнено(Объект.Наименование) Тогда
Объект.Наименование = ЮТТестовыеДанные.СлучайнаяСтрока();
КонецЕсли;
@ -313,12 +336,13 @@
Функция КлючЗаписи(Объект)
ПредставлениеТипа = ЮТОбщий.ПредставлениеТипа(ТипЗнч(Объект));
Если СтрНайти(ПредставлениеТипа, "Object.") Тогда
ТипЗначения = ТипЗнч(Объект);
Если ЮТТипыДанныхСлужебный.ЭтоТипОбъекта(ТипЗначения) Тогда
Возврат Объект.Ссылка;
ИначеЕсли СтрНайти(ПредставлениеТипа, "менеджер записи:") Тогда // TODO
ИначеЕсли ЮТТипыДанныхСлужебный.ЭтоМенеджерЗаписи(ТипЗначения) Тогда
Описание = ЮТМетаданные.ОписаниеОбъектаМетаданных(Объект);
@ -341,4 +365,16 @@
КонецФункции
Функция ПараметрыЗаписи(ВходящиеПараметрыЗаписи = Неопределено)
Если ВходящиеПараметрыЗаписи = Неопределено Тогда
Возврат ЮТОбщий.ПараметрыЗаписи();
Иначе
ПараметрыЗаписи = ЮТОбщий.ПараметрыЗаписи();
ЗаполнитьЗначенияСвойств(ПараметрыЗаписи, ВходящиеПараметрыЗаписи);
Возврат ПараметрыЗаписи;
КонецЕсли;
КонецФункции
#КонецОбласти

View File

@ -52,7 +52,9 @@
ИначеЕсли Тип = Тип("Дата") Тогда
Значение = ЮТТестовыеДанные.СлучайнаяДата(ТекущаяДата() - 315360000, ТекущаяДата() + 315360000); // +/- 10 лет
//@skip-check use-non-recommended-method
Значение = ЮТТестовыеДанные.СлучайнаяДата(ТекущаяДата() - 315360000, ТекущаяДата() + 315360000); // BSLLS:DeprecatedCurrentDate-off
// +/- 10 лет
ИначеЕсли Тип = Тип("Булево") Тогда
@ -77,6 +79,8 @@
КонецФункции
#Если Не ВебКлиент Тогда
// см. ЮТТестовыеДанные.НовоеИмяВременногоФайла
Функция НовоеИмяВременногоФайла(Расширение = Неопределено) Экспорт
@ -87,6 +91,8 @@
КонецФункции
#КонецЕсли
Процедура ДобавитьВременныйФайл(Файл) Экспорт
БуферВременныеФайлы().Добавить(Файл);

View File

@ -241,6 +241,7 @@
// .СПараметрами(1)
// .СПараметрами(2); // Будет зарегистрировано два теста, первый с параметром 1 и второй с параметром 2
//
//@skip-check method-too-many-params
Функция СПараметрами(Параметр1 = "_!%*",
Параметр2 = "_!%*",
Параметр3 = "_!%*",

View File

@ -23,14 +23,7 @@
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа");
#Иначе
//@skip-check Undefined variable
ТипXML = СериализаторXDTO.XMLТип(Тип);
Если ТипXML = Неопределено Тогда
Возврат Строка(Тип);
Иначе
Возврат ТипXML.ИмяТипа;
КонецЕсли;
Возврат ИдентификаторТипа(Тип);
#КонецЕсли
КонецФункции
@ -39,18 +32,20 @@
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа");
#ИначеЕсли Сервер Тогда
Возврат ЗначениеВСтрокуВнутр(Тип); // Не все серверные типы сериализуются через СериализаторXDTO
#Иначе
Попытка
Запись = Новый ЗаписьJSON();
Запись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьJSON(Запись, Тип);
Возврат Запись.Закрыть();
Исключение
ВызватьИсключение СтрШаблон("Не удалось определить индетификатор типа для `%1`
|%2", Тип, ОписаниеОшибки());
КонецПопытки;
ЮТПроверкиСлужебный.ПроверитьТипПараметра(Тип, Тип("Тип"), "ЮТТипыДанныхСлужебный.ИдентификаторТипа", "Тип");
Если Тип = Тип("Дата") Тогда
ИдентификаторТипа = "date";
ИначеЕсли Тип = Тип("Число") Тогда
ИдентификаторТипа = "number";
Иначе
//@skip-check Undefined variable
ИмяТипаСПространствомИмен = СериализаторXDTO.ЗаписатьXDTO(Тип).ЛексическоеЗначение;
ИдентификаторТипа = СтрРазделить(ИмяТипаСПространствомИмен, "}")[1];
КонецЕсли;
Возврат ИдентификаторТипа;
#КонецЕсли
КонецФункции
@ -59,30 +54,8 @@
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ПредставлениеТипа");
#ИначеЕсли Сервер Тогда
Если СтрНачинаетсяС(ИдентификаторТипа, "{") Тогда
Возврат ЗначениеИзСтрокиВнутр(ИдентификаторТипа);
КонецЕсли;
#КонецЕсли
Возврат ТипПоПредставлению(ИдентификаторТипа);
КонецФункции
Функция ТипПоПредставлению(ПредставлениеТипа) Экспорт
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ТипПоПредставлению");
#Иначе
Чтение = Новый ЧтениеJSON();
Чтение.УстановитьСтроку(ПредставлениеТипа);
Результат = СериализаторXDTO.ПрочитатьJSON(Чтение, Тип("Тип"));
Если Результат = Неопределено Тогда
ВызватьИсключение СтрШаблон("Не удалось определить тип по представлению `%1`", ПредставлениеТипа);
КонецЕсли;
Возврат Результат;
Возврат Тип(ИдентификаторТипа);
#КонецЕсли
КонецФункции
@ -93,6 +66,54 @@
КонецФункции
Функция ЭтоМенеджерЗаписи(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНайти(ПредставлениеТипа, "RecordManager.") > 0;
КонецФункции
Функция ЭтоТипОбъекта(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНайти(ПредставлениеТипа, "Object.") > 0;
КонецФункции
Функция ЭтоТипНабораЗаписей(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНайти(ПредставлениеТипа, "RecordSet.") > 0;
КонецФункции
Функция ЭтоТипОбъектаОбработкиОтчета(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНачинаетсяС(ПредставлениеТипа, "DataProcessorObject.") Или СтрНачинаетсяС(ПредставлениеТипа, "ReportObject.");
КонецФункции
Функция ЭтоТипМенеджера(ТипЗначения) Экспорт
ПредставлениеТипа = ПредставлениеТипа(ТипЗначения);
Возврат СтрНайти(ПредставлениеТипа, "Manager.") > 0;
КонецФункции
Функция ТипОбъектаСсылки(ТипСсылки) Экспорт
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТТипыДанныхСлужебный.ТипОбъектаСсылки");
#Иначе
ТипXML = СериализаторXDTO.XMLТип(ТипСсылки);
ИмяТипа = СтрЗаменить(ТипXML.ИмяТипа, "Ref.", "Object.");
Возврат СериализаторXDTO.ИзXMLТипа(ИмяТипа, ТипXML.URIПространстваИмен);
#КонецЕсли
КонецФункции
#Область СистемныеПеречисления
Функция ЭтоСистемноеПеречисление(Тип) Экспорт
@ -165,7 +186,3 @@
#КонецОбласти
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
#КонецОбласти

View File

@ -205,11 +205,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция ИмеетСвойство(Знач ИмяСвойства, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
НормализованныйПутьКСвойству(ПроверяемоеЗначение, ИмяСвойства, Истина);
ПроверитьПредикат(ЮТПредикаты.Выражения().ИмеетСвойство, ИмяСвойства, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -226,14 +222,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция НеИмеетСвойства(Знач ИмяСвойства, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Если ЗначениеСодержитСвойство(ПроверяемоеЗначение, ИмяСвойства) Тогда
СгенерироватьОшибкуСравнения(СтрШаблон("не содержит свойство `%1`", ИмяСвойства), Неопределено, ИмяСвойства);
КонецЕсли;
ПроверитьПредикат(ЮТПредикаты.Выражения().НеИмеетСвойство, ИмяСвойства, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -338,9 +327,8 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция Равно(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
СравнитьЗначения(Контекст, ОжидаемоеЗначение, Ложь, СтрШаблон("равно `%1`", ОжидаемоеЗначение));
ПараметрыСравнения = Новый Структура("ГлубокийАнализ", Истина);
ПроверитьПредикат(ЮТПредикаты.Выражения().Равно, ОжидаемоеЗначение, ОписаниеПроверки, ПараметрыСравнения);
Возврат ЮТУтверждения;
КонецФункции
@ -358,9 +346,8 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция НеРавно(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
СравнитьЗначения(Контекст, ОжидаемоеЗначение, Истина, СтрШаблон("равно `%1`", ОжидаемоеЗначение));
ПараметрыСравнения = Новый Структура("ГлубокийАнализ", Истина);
ПроверитьПредикат(ЮТПредикаты.Выражения().НеРавно, ОжидаемоеЗначение, ОписаниеПроверки, ПараметрыСравнения);
Возврат ЮТУтверждения;
КонецФункции
@ -375,19 +362,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция Больше(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Результат = ПроверяемоеЗначение > ОжидаемоеЗначение;
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
Если Не Результат Тогда
СгенерироватьОшибкуСравнения(СтрШаблон("больше чем `%1`", ОжидаемоеЗначение), ПроверяемоеЗначение, ОжидаемоеЗначение);
КонецЕсли;
ПроверитьПредикат(ЮТПредикаты.Выражения().Больше, ОжидаемоеЗначение, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -402,19 +377,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция БольшеИлиРавно(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Результат = ПроверяемоеЗначение >= ОжидаемоеЗначение;
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
Если Не Результат Тогда
СгенерироватьОшибкуСравнения(СтрШаблон("больше или равно `%1`", ОжидаемоеЗначение), ПроверяемоеЗначение, ОжидаемоеЗначение);
КонецЕсли;
ПроверитьПредикат(ЮТПредикаты.Выражения().БольшеРавно, ОжидаемоеЗначение, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -429,19 +392,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция Меньше(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Результат = ПроверяемоеЗначение < ОжидаемоеЗначение;
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
Если Не Результат Тогда
СгенерироватьОшибкуСравнения(СтрШаблон("меньше чем `%1`", ОжидаемоеЗначение), ПроверяемоеЗначение, ОжидаемоеЗначение);
КонецЕсли;
ПроверитьПредикат(ЮТПредикаты.Выражения().Меньше, ОжидаемоеЗначение, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -456,20 +407,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция МеньшеИлиРавно(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Результат = ПроверяемоеЗначение <= ОжидаемоеЗначение;
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
Если Не Результат Тогда
Сообщение = СтрШаблон("меньше или равно `%1`", ОжидаемоеЗначение);
СгенерироватьОшибкуСравнения(Сообщение, ПроверяемоеЗначение, ОжидаемоеЗначение);
КонецЕсли;
ПроверитьПредикат(ЮТПредикаты.Выражения().МеньшеРавно, ОжидаемоеЗначение, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -483,9 +421,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция Заполнено(Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьЗаполненность(Контекст, Ложь);
ПроверитьПредикат(ЮТПредикаты.Выражения().Заполнено, , ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -499,9 +435,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция НеЗаполнено(Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьЗаполненность(Контекст, Истина);
ПроверитьПредикат(ЮТПредикаты.Выражения().НеЗаполнено, , ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -612,9 +546,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция ИмеетТип(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьТипПараметра(Контекст, ОжидаемоеЗначение, Ложь);
ПроверитьПредикат(ЮТПредикаты.Выражения().ИмеетТип, ОжидаемоеЗначение, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -629,9 +561,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция НеИмеетТип(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьТипПараметра(Контекст, ОжидаемоеЗначение, Истина);
ПроверитьПредикат(ЮТПредикаты.Выражения().НеИмеетТип, ОжидаемоеЗначение, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -648,20 +578,25 @@
// - ФиксированныйМассив - по наличию равного значения
// - ФиксированнаяСтруктура - по наличию равного значения
// - ФиксированноеСоответствие - по наличию равного значения
// - Произвольный итерируемый объект для проверки на соответствие предикату
//
// При сравнении также проверяется совпадение типов
//
// Параметры:
// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) содержит указанное значение
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// ОписаниеПроверки - Строка - Описание конкретной проверки
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция Содержит(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьСодержание(Контекст, ОжидаемоеЗначение, Ложь);
Если ЮТПредикатыКлиентСервер.ЭтоПредикат(ОжидаемоеЗначение) Тогда
ПроверитьСодержаниеПредиката(ОжидаемоеЗначение, ОписаниеПроверки, Ложь);
Иначе
ПроверитьПредикат(ЮТПредикаты.Выражения().Содержит, ОжидаемоеЗначение, ОписаниеПроверки);
КонецЕсли;
Возврат ЮТУтверждения;
КонецФункции
@ -678,20 +613,25 @@
// - ФиксированныйМассив - по отсутствию равного значения
// - ФиксированнаяСтруктура - по отсутствию равного значения
// - ФиксированноеСоответствие - по отсутствию равного значения
// - Произвольный итерируемый объект для проверки на соответствие предикату
//
// При сравнении также проверяется совпадение типов
//
// Параметры:
// ОжидаемоеЗначение - Произвольный - Ожидается, что значение Контекста (или его свойство) НЕ содержит указанное
// - ОбщийМодуль - Модуль настройки предикатов, см. ЮТест.Предикат
// ОписаниеПроверки - Строка - Описание конкретной проверки
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция НеСодержит(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьСодержание(Контекст, ОжидаемоеЗначение, Истина);
Если ЮТПредикатыКлиентСервер.ЭтоПредикат(ОжидаемоеЗначение) Тогда
ПроверитьСодержаниеПредиката(ОжидаемоеЗначение, ОписаниеПроверки, Истина);
Иначе
ПроверитьПредикат(ЮТПредикаты.Выражения().НеСодержит, ОжидаемоеЗначение, ОписаниеПроверки);
КонецЕсли;
Возврат ЮТУтверждения;
КонецФункции
@ -706,9 +646,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция СодержитСтрокуПоШаблону(Знач Шаблон, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьСоответствиеШаблону(Контекст, Шаблон, Ложь);
ПроверитьПредикат(ЮТПредикаты.Выражения().СодержитСтрокуПоШаблону, Шаблон, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -723,9 +661,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция НеСодержитСтрокуПоШаблону(Знач Шаблон, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьСоответствиеШаблону(Контекст, Шаблон, Истина);
ПроверитьПредикат(ЮТПредикаты.Выражения().НеСодержитСтрокуПоШаблону, Шаблон, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -751,9 +687,7 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция ИмеетДлину(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьДлину(Контекст, ОжидаемоеЗначение, Ложь);
ПроверитьПредикат(ЮТПредикаты.Выражения().ИмеетДлину, ОжидаемоеЗначение, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
@ -847,28 +781,29 @@
// ОбщийМодуль - Этот модуль для замыкания
Функция НеИмеетДлину(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверитьДлину(Контекст, ОжидаемоеЗначение, Истина);
ПроверитьПредикат(ЮТПредикаты.Выражения().НеИмеетДлину, ОжидаемоеЗначение, ОписаниеПроверки);
Возврат ЮТУтверждения;
КонецФункции
#Область ПроверкаМетодов
// Проверяет установленный для проверки метод Контекста на то, что метод упадет по исключению, далее текст исключения проверяется на ожидаемый.
//
// Параметры:
// ОжидаемоеЗначение - Строка - Ожидается, что сообщение об ошибке будет содержать данный текст
// ОписаниеПроверки - Строка - Описание конкретной проверки
// ВТранзакции - Булево - Вызов метода выполняется в трананзакции
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция ВыбрасываетИсключение(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено) Экспорт
Функция ВыбрасываетИсключение(Знач ОжидаемоеЗначение, Знач ОписаниеПроверки = Неопределено, ВТранзакции = Ложь) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
Попытка
Модуль = ПроверяемоеЗначение(Контекст);
Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода);
Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода, ВТранзакции);
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
@ -884,10 +819,10 @@
Результат.ТекстИсключения);
ЮТРегистрацияОшибок.УстановитьДанныеОшибкиСравнения(Результат.ТекстИсключения, ОжидаемоеЗначение);
ЮТРегистрацияОшибок.ВызватьОшибкуПроверки(ТекстОшибки, Контекст);
Иначе
Возврат ЮТУтверждения;
КонецЕсли;
Возврат ЮТУтверждения;
КонецФункции
// Проверяет установленный для проверки метод Контекста на то, что метод не упадет по исключению
@ -896,16 +831,17 @@
// Параметры:
// ОжидаемоеЗначение - Строка - Ожидается, что сообщение об ошибке НЕ будет содержать данный текст
// ОписаниеПроверки - Строка - Описание конкретной проверки
// ВТранзакции - Булево - Вызов метода выполняется в трананзакции
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция НеВыбрасываетИсключение(Знач ОжидаемоеЗначение = Неопределено, Знач ОписаниеПроверки = Неопределено) Экспорт
Функция НеВыбрасываетИсключение(Знач ОжидаемоеЗначение = Неопределено, Знач ОписаниеПроверки = Неопределено, ВТранзакции = Ложь) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
Попытка
Модуль = ПроверяемоеЗначение(Контекст);
Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода)
Результат = ВызватьМетод(Модуль, Контекст.ИмяМетода, Контекст.ПараметрыМетода, ВТранзакции);
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
@ -926,6 +862,32 @@
КонецФункции
// Проверяет, что установленное значение Контекста (или его свойство) имеет указанный экспортный метод.
//
//
// Параметры:
// ИмяМетода - Строка - Имя метода, наличие которого нужно проверить
// ОписаниеПроверки - Строка - Описание конкретной проверки
//
// Возвращаемое значение:
// ОбщийМодуль - Этот модуль для замыкания
Функция ИмеетМетод(ИмяМетода, ОписаниеПроверки = Неопределено) Экспорт
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
Модуль = ПроверяемоеЗначение(Контекст);
Результат = ЮТОбщий.МетодОбъектаСуществует(Модуль, ИмяМетода);
Если Не Результат Тогда
Сообщение = СтрШаблон("имеет метод `%1`", ИмяМетода);
СгенерироватьОшибкуСравнения(Сообщение, Модуль, ИмяМетода);
КонецЕсли;
Возврат ЮТУтверждения;
КонецФункции
#КонецОбласти
// Проверяет установленное значение Контекста (или его свойство), ожидается что оно начинается на указанное значение.
//
// При этом проверяемое значение должно быть строкой.
@ -941,7 +903,7 @@
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
ПроверитьТипЗначения(Контекст, ПроверяемоеЗначение, "Строка", "проверяемого значения");
ПроверитьТипЗначения(Контекст, ПроверяемоеЗначение, "Строка, ФорматированнаяСтрока", "проверяемого значения");
ПроверитьТипЗначения(Контекст, СтрокаПоиска, "Строка", "ожидаемого значения");
ПроверитьЗаполненностьЗначения(Контекст, СтрокаПоиска, "ожидаемое значение");
@ -971,7 +933,7 @@
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
ПроверитьТипЗначения(Контекст, ПроверяемоеЗначение, "Строка", "проверяемого значения");
ПроверитьТипЗначения(Контекст, ПроверяемоеЗначение, "Строка, ФорматированнаяСтрока", "проверяемого значения");
ПроверитьТипЗначения(Контекст, СтрокаПоиска, "Строка", "ожидаемого значения");
ПроверитьЗаполненностьЗначения(Контекст, СтрокаПоиска, "ожидаемое значение");
@ -1406,7 +1368,11 @@
Для Каждого Часть Из НормализованныйПутьКСвойству Цикл
Если ТипЗнч(Значение) = Тип("ХранилищеЗначения") Тогда
#Если ВебКлиент Или ТонкийКлиент Тогда
Значение = ЮТОбщийВызовСервера.ИзХранилищаЗначений(Значение);
#Иначе
Значение = Значение.Получить();
#КонецЕсли
КонецЕсли;
Если ТипЗнч(Часть) = Тип("Число") И Часть < 0 И ТипЗнч(Значение) <> Тип("Соответствие") Тогда
@ -1551,46 +1517,6 @@
КонецФункции
Функция НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение)
ТипПроверяемогоЗначения = ТипЗнч(ПроверяемоеЗначение);
ИскомоеЗначениеНайдено = Неопределено;
Если ТипПроверяемогоЗначения = Тип("Строка") Тогда
ИскомоеЗначениеНайдено = СтрНайти(ПроверяемоеЗначение, ОжидаемоеЗначение) > 0;
ИначеЕсли ЭтоТипМассива(ТипПроверяемогоЗначения) Тогда
Индекс = ПроверяемоеЗначение.Найти(ОжидаемоеЗначение);
ИскомоеЗначениеНайдено = Индекс <> Неопределено;
ИначеЕсли ЭтоТипКлючЗначение(ТипПроверяемогоЗначения) Тогда
ИскомоеЗначениеНайдено = Ложь;
ТипОжидаемогоЗначения = ТипЗнч(ОжидаемоеЗначение);
Для Каждого КлючЗначение Из ПроверяемоеЗначение Цикл
Если КлючЗначение.Значение = ОжидаемоеЗначение И ТипЗнч(КлючЗначение.Значение) = ТипОжидаемогоЗначения Тогда
ИскомоеЗначениеНайдено = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
ИначеЕсли ТипПроверяемогоЗначения = Тип("СписокЗначений") Тогда
ИскомоеЗначениеНайдено = ПроверяемоеЗначение.НайтиПоЗначению(ОжидаемоеЗначение) <> Неопределено;
ИначеЕсли ПроверяемоеЗначение <> Неопределено И ЮТОбщий.МетодМодуляСуществует(ПроверяемоеЗначение, "Найти", , Ложь) Тогда
ИскомоеЗначениеНайдено = ПроверяемоеЗначение.Найти(ОжидаемоеЗначение) <> Неопределено;
КонецЕсли;
Возврат ИскомоеЗначениеНайдено;
КонецФункции
Функция ДлинаЗначения(ПроверяемоеЗначение)
ТипПроверяемогоЗначения = ТипЗнч(ПроверяемоеЗначение);
@ -1613,7 +1539,7 @@
КонецФункции
Функция ВызватьМетод(Модуль, ИмяМетода, ПараметрыМетода)
Функция ВызватьМетод(Модуль, ИмяМетода, ПараметрыМетода, ВТранзакции)
#Если ВебКлиент Тогда
ВызватьИсключение ЮТОбщий.МетодНеДоступен("ЮТУтверждения.ВызватьМетод");
@ -1622,31 +1548,40 @@
ВызватьИсключение "ИмяМетода не заполнено в контексте. Воспользуйтесь предварительно методом интерфейса `Метод(ИмяМетода)`";
КонецЕсли;
СтрокаПараметры = "";
Если ЭтоТипМассива(ТипЗнч(ПараметрыМетода)) Тогда
Для Сч = 0 По ПараметрыМетода.ВГраница() Цикл
СтрокаПараметры = ЮТОбщий.ДобавитьСтроку(СтрокаПараметры, СтрШаблон("ПараметрыМетода[%1]", Сч), ", ");
КонецЦикла;
ИначеЕсли ЗначениеЗаполнено(ПараметрыМетода) Тогда
ВызватьИсключение СтрШаблон("Не верный тип параметров `%1`, должен быть массив", ТипЗнч(ПараметрыМетода));
#Если НЕ Сервер Тогда
Если ВТранзакции Тогда
ВызватьИсключение "Использование транзакции доступно только на сервере (толстом клиенте)";
КонецЕсли;
#КонецЕсли
Если Модуль <> Неопределено Тогда
СтрокаДляВыполнения = СтрШаблон("Модуль.%1(%2)", ИмяМетода, СтрокаПараметры);
ПолноеИмяМетода = СтрШаблон("Объект.%1", ИмяМетода);
Иначе
СтрокаДляВыполнения = СтрШаблон("%1(%2)", ИмяМетода, СтрокаПараметры);
ПолноеИмяМетода = СтрШаблон("%1", ИмяМетода);
КонецЕсли;
Результат = Новый Структура("ИсключениеВозникло, ТекстИсключения", Ложь);
Попытка
//@skip-check server-execution-safe-mode
Выполнить(СтрокаДляВыполнения);
Исключение
#Если Сервер Тогда
Если ВТранзакции Тогда
Если ТранзакцияАктивна() Тогда
ВызватьИсключение "Использование транзакции внутри транзакции при проверке метода недопустимо";
КонецЕсли;
НачатьТранзакцию(); // BSLLS:PairingBrokenTransaction-off BSLLS:BeginTransactionBeforeTryCatch-off
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода, ПараметрыМетода, Модуль);
ОтменитьТранзакцию(); // BSLLS:WrongUseOfRollbackTransactionMethod-off
Иначе
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода, ПараметрыМетода, Модуль);
КонецЕсли;
#Иначе
Ошибка = ЮТОбщий.ВыполнитьМетод(ПолноеИмяМетода, ПараметрыМетода, Модуль);
#КонецЕсли
Если Ошибка <> Неопределено Тогда
Результат.ТекстИсключения = КраткоеПредставлениеОшибки(Ошибка);
Результат.ИсключениеВозникло = Истина;
Результат.ТекстИсключения = ОписаниеОшибки();
КонецПопытки;
КонецЕсли;
Возврат Результат;
#КонецЕсли
@ -1655,21 +1590,6 @@
#Область ПроверкаТипов
Процедура ПроверитьТипПараметра(Контекст, Знач ОжидаемоеЗначение, Реверс = Ложь)
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
ПроверитьТипЗначения(Контекст, ОжидаемоеЗначение, Новый ОписаниеТипов("ОписаниеТипов, Тип, Строка"));
Результат = ЮТПроверкиСлужебный.ТипЗначенияСоответствует(ПроверяемоеЗначение, ОжидаемоеЗначение);
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
Сообщение = СтрШаблон("имеет тип `%1`", ОжидаемоеЗначение);
ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ТипЗнч(ПроверяемоеЗначение), ОжидаемоеЗначение);
КонецПроцедуры
Процедура ПроверитьТипЗначения(Контекст,
Значение,
Знач ОжидаемыйТип,
@ -1694,19 +1614,6 @@
КонецПроцедуры
Функция ЭтоТипМассива(Тип)
Возврат Тип = Тип("Массив") Или Тип = Тип("ФиксированныйМассив");
КонецФункции
Функция ЭтоТипКлючЗначение(Тип)
Возврат Тип = Тип("Структура") Или Тип = Тип("ФиксированнаяСтруктура")
Или Тип = Тип("Соответствие") Или Тип = Тип("ФиксированноеСоответствие");
КонецФункции
#КонецОбласти
Функция СравнитьПоЗначению(Значение1, Значение2)
@ -1740,19 +1647,6 @@
КонецПроцедуры
Процедура ПроверитьЗаполненность(Контекст, Реверс)
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Результат = ЗначениеЗаполнено(ПроверяемоеЗначение);
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
ОбработатьРезультатСравнения(Результат, "является заполненным", Реверс, ПроверяемоеЗначение, Неопределено);
КонецПроцедуры
Процедура ПроверитьСуществование(Контекст, Реверс)
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
@ -1765,44 +1659,6 @@
КонецПроцедуры
Процедура ПроверитьСодержание(Контекст, ОжидаемоеЗначение, Реверс)
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Результат = НайтиЗначение(ПроверяемоеЗначение, ОжидаемоеЗначение);
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
Если Результат = Неопределено Тогда
ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки, Контекст);
КонецЕсли;
Сообщение = СтрШаблон("содержит `%1`", ОжидаемоеЗначение);
ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ПроверяемоеЗначение, ОжидаемоеЗначение);
КонецПроцедуры
Процедура ПроверитьСоответствиеШаблону(Контекст, ОжидаемоеЗначение, Реверс)
Попытка
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Результат = ВыполнитьПроверкуСоответствуетШаблону(ПроверяемоеЗначение, ОжидаемоеЗначение);
Исключение
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ИнформацияОбОшибке(), Контекст);
КонецПопытки;
Если Результат = Неопределено Тогда
ТекстОшибки = СтрШаблон("Тип проверяемого значения `%1` не обрабатывается утверждением", ТипЗнч(ПроверяемоеЗначение));
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(ТекстОшибки, Контекст);
КонецЕсли;
Сообщение = СтрШаблон("содержит подстроку соответствующую шаблону `%1`", ОжидаемоеЗначение);
ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ПроверяемоеЗначение, ОжидаемоеЗначение);
КонецПроцедуры
Функция ДлинаПроверяемогоЗначения(Контекст)
Попытка
@ -1821,18 +1677,6 @@
КонецФункции
Процедура ПроверитьДлину(Контекст, ОжидаемоеЗначение, Реверс)
ПроверитьТипЗначения(Контекст, ОжидаемоеЗначение, "Число");
ФактическаяДлина = ДлинаПроверяемогоЗначения(Контекст);
Результат = ФактическаяДлина = ОжидаемоеЗначение;
Сообщение = СтрШаблон("имеет длину (размер) `%1`", ОжидаемоеЗначение);
ОбработатьРезультатСравнения(Результат, Сообщение, Реверс, ФактическаяДлина, ОжидаемоеЗначение);
КонецПроцедуры
Процедура ОбработатьРезультатСравнения(Знач Результат, Знач Сообщение, Реверс, ПроверяемоеЗначение, ОжидаемоеЗначение)
Если Реверс Тогда
@ -1896,7 +1740,7 @@
КонецЕсли;
КонецПроцедуры
Процедура ОбъектыРавны(Объект, ОбъектЭталон) Экспорт
Процедура ОбъектыРавны(Объект, ОбъектЭталон)
Ключи = ЮТОбщий.ВыгрузитьЗначения(ОбъектЭталон, "Ключ");
@ -1985,22 +1829,81 @@
КонецПроцедуры
Функция ВыполнитьПроверкуСоответствуетШаблону(ПроверяемаяСтрока, РегулярноеВыражение)
#Область Предикаты
Процедура ПроверитьПредикат(Выражение, ОжидаемоеЗначение, ОписаниеПроверки, ПараметрыСравнения = Неопределено)
Если ТипЗнч(ПроверяемаяСтрока) <> Тип("Строка") Тогда
Возврат Неопределено;
Контекст = Контекст();
Предикат = ЮТФабрика.ВыражениеПредиката(Выражение, Контекст.ОбъектПроверки.ИмяСвойства, ОжидаемоеЗначение);
ПолноеОписаниеПроверки = ЮТОбщий.ДобавитьСтроку(Контекст.ПрефиксОшибки, ОписаниеПроверки, " ");
ПараметрыСообщенийОбОшибке = ЮТПредикатыКлиентСервер.ПараметрыСообщенийОбОшибке(ПолноеОписаниеПроверки, , Контекст.ОбъектПроверки.Представление);
Результат = ЮТПредикатыКлиентСервер.ПроверитьПредикаты(Контекст.ОбъектПроверки.Значение, Предикат, ПараметрыСообщенийОбОшибке, ПараметрыСравнения);
ОбработатьРезультатПроверкиПредиката(Результат);
КонецПроцедуры
Процедура ОбработатьРезультатПроверкиПредиката(Результат)
Если НЕ Результат.Успешно Тогда
Для Каждого Сообщение Из Результат.Сообщения Цикл
Если ТипЗнч(Сообщение) = Тип("Структура") Тогда
ЮТРегистрацияОшибок.УстановитьДанныеОшибкиСравнения(Сообщение.ПроверяемоеЗначение, Сообщение.ОжидаемоеЗначение);
ТекстИсключения = СтрШаблон("%1 <%2>", ЮТРегистрацияОшибок.ПрефиксОшибкиУтверждений(), Сообщение.Сообщение);
ВызватьИсключение ТекстИсключения;
Иначе
ЮТРегистрацияОшибок.СгенерироватьОшибкуВыполнения(Сообщение);
КонецЕсли;
КонецЦикла;
ВызватьИсключение "Провальный результат проверки не содержит сообщения";
КонецЕсли;
РегулярныеВыражения = ЮТКомпоненты.РегулярныеВыражения();
КонецПроцедуры
Процедура ПроверитьСодержаниеПредиката(Предикат, ОписаниеПроверки, Реверс)
Попытка
Результат = РегулярныеВыражения.Совпадает(ПроверяемаяСтрока, РегулярноеВыражение);
Исключение
ВызватьИсключение РегулярныеВыражения.ОписаниеОшибки;
КонецПопытки;
Контекст = Контекст();
УстановитьОписаниеПроверки(Контекст, ОписаниеПроверки);
ПроверяемоеЗначение = ПроверяемоеЗначение(Контекст);
Возврат Результат;
ПараметрыСообщенийОбОшибке = ПараметрыСообщенийОбОшибке(ПроверяемоеЗначение, ОписаниеПроверки);
КонецФункции
Успешно = Ложь;
Для Каждого Элемент Из ПроверяемоеЗначение Цикл
РезультатПроверки = ЮТПредикатыКлиентСервер.ПроверитьПредикаты(Элемент, Предикат, ПараметрыСообщенийОбОшибке);
Если РезультатПроверки.Успешно Тогда
Успешно = Истина;
Прервать;
КонецЕсли;
КонецЦикла;
Если Реверс Тогда
Успешно = НЕ Успешно;
КонецЕсли;
Если НЕ Успешно Тогда
Сообщение = "содержит элемент, значение которого " + ЮТПредикатыКлиентСервер.ПредставлениеПредикатов(Предикат, " и ");
Если Реверс Тогда
Сообщение = "не " + Сообщение;
КонецЕсли;
СгенерироватьОшибкуУтверждения(Сообщение, ПроверяемоеЗначение);
КонецЕсли;
КонецПроцедуры
#КонецОбласти
#КонецОбласти

View File

@ -82,9 +82,12 @@
#Область Перечисления
// КонтекстыИсполнения
// Возвращает перечисление возможных контекстов исполнения тестов
// Возвращает перечисление возможных контекстов исполнения тестов
//
// Возвращаемое значение:
// ФиксированнаяСтруктура - Контексты исполнения
// ФиксированнаяСтруктура - Контексты исполнения:
// * Клиент - Строка
// * Сервер - Строка
Функция КонтекстыИсполнения() Экспорт
Контексты = Новый Структура();
@ -321,7 +324,8 @@
// * Выполнять - Булево - Признак, что можно выполнить прогон набора (нет ошибок блокирующих запуск)
// * ДатаСтарта - Число - Дата запуска набора
// * Длительность - Число - Продолжительность выполнения набора
// * НастройкиВыполнения- Структура - Настройки исполнения теста
// * НастройкиВыполнения - Структура - Настройки исполнения теста
// * ТестовыйМодуль - См. ОписаниеТестовогоМодуля
Функция ОписаниеИсполняемогоНабораТестов(НаборТестов, ТестовыйМодуль) Экспорт
Описание = Новый Структура();
@ -364,6 +368,7 @@
// * Статус - Строка - Статус выполнения теста, см. СтатусыИсполненияТеста
// * Ошибки - Массив из см. ЮТФабрика.ОписаниеВозникшейОшибки - Описания ошибок выполнения теста, см. ЮТФабрика.ОписаниеВозникшейОшибки
// * НастройкиВыполнения- Структура - Настройки исполнения теста
// * Параметры - см. ПредставлениеТеста
Функция ОписаниеИсполняемогоТеста(Тест, Режим, ТестовыйМодуль) Экспорт
ПолноеИмяМетода = СтрШаблон("%1.%2", ТестовыйМодуль.МетаданныеМодуля.Имя, Тест.Имя);
@ -382,6 +387,7 @@
ОписаниеТеста.Вставить("НастройкиВыполнения", Тест.НастройкиВыполнения);
ОписаниеТеста.Вставить("Параметры", Тест.Параметры);
//@skip-check constructor-function-return-section
Возврат ОписаниеТеста;
КонецФункции
@ -440,6 +446,7 @@
Описание.Вставить("ОшибкаУтверждения", Ложь);
Описание.Вставить("Сообщение", "");
//@skip-check constructor-function-return-section
Возврат Описание;
КонецФункции
@ -485,7 +492,7 @@
// * ТипОшибки - Строка - Тип возникшей ошибки. Доступные значения см. ЮТФабрика.ТипыОшибок
Функция ОписаниеВозникшейОшибки(Сообщение) Экспорт
Возврат Новый Структура("Сообщение, Стек, ТипОшибки", Сообщение);
Возврат Новый Структура("Сообщение, Стек, ТипОшибки", Сообщение, "", "");
КонецФункции
@ -508,6 +515,7 @@
Описание.Вставить("ПроверяемоеЗначение");
Описание.Вставить("ОжидаемоеЗначение");
//@skip-check constructor-function-return-section
Возврат Описание;
КонецФункции
@ -536,14 +544,14 @@
//
// Параметры:
// Модуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
// Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста
// Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста
//
// Возвращаемое значение:
// Структура - Описание события исполнения тестов:
// * Модуль - см. ЮТФабрика.ОписаниеТестовогоМодуля
// * Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста
// * Набор - см. ЮТФабрика.ОписаниеИсполняемогоНабораТестов
// * Тест - см. ЮТФабрика.ОписаниеИсполняемогоТеста
Функция ОписаниеСобытияИсполненияТестов(Модуль, Набор = Неопределено, Тест = Неопределено) Экспорт
Описание = Новый Структура();
@ -551,7 +559,8 @@
Описание.Вставить("Набор", Набор);
Описание.Вставить("Тест", Тест);
Возврат Описание;
//@skip-check constructor-function-return-section
Возврат Описание;
КонецФункции
@ -883,13 +892,13 @@
Функция ПараметрыФильтрации() Экспорт
Параметры = Новый Структура;
Параметры.Вставить("extensions");
Параметры.Вставить("modules");
Параметры.Вставить("suites");
Параметры.Вставить("tags");
Параметры.Вставить("contexts");
Параметры.Вставить("paths");
Параметры.Вставить("tests");
Параметры.Вставить("extensions", Неопределено);
Параметры.Вставить("modules", Неопределено);
Параметры.Вставить("suites", Неопределено);
Параметры.Вставить("tags", Неопределено);
Параметры.Вставить("contexts", Неопределено);
Параметры.Вставить("paths", Неопределено);
Параметры.Вставить("tests", Неопределено);
Возврат Параметры;

View File

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

View File

@ -146,8 +146,10 @@
// * Теги - Массив из Строка
// * Контексты - Массив из Строка - Контексты вызова тестовых методов
// * Тесты - Массив из см. ОписаниеИмениТеста - Список путей к тестовым методам
// * Пути - Массив из Строка
Функция Фильтр() Экспорт
//@skip-check structure-consructor-too-many-keys
Фильтр = Новый Структура("Расширения, Модули, Наборы, Теги, Контексты, Пути, Тесты");
Фильтр.Расширения = Новый Структура();
@ -158,6 +160,7 @@
Фильтр.Пути = Новый Массив();
Фильтр.Тесты = Новый Массив();
//@skip-check constructor-function-return-section
Возврат Фильтр;
КонецФункции

View File

@ -55,7 +55,7 @@
// Возвращаемое значение:
// - Неопределено - Если это не тестовый модуль
// - см. ЮТФабрика.ОписаниеТестовогоМодуля
Функция ИсполняемыеСценарииМодуля(МетаданныеМодуля) Экспорт
Функция ИсполняемыеСценарииМодуля(Знач МетаданныеМодуля) Экспорт
ЭтоТестовыйМодуль = Истина;
ОписаниеТестовогоМодуля = ЮТФабрика.ОписаниеТестовогоМодуля(МетаданныеМодуля, Новый Массив);
@ -136,6 +136,7 @@
#КонецЕсли
Если МетаданныеМодуля.Сервер Тогда
//@skip-check unknown-method-property
Возврат ЮТЧитательСервер.ЭтоТестовыйМодуль(МетаданныеМодуля);
Иначе
Возврат Ложь;
@ -161,6 +162,7 @@
ТестовыеМодули = Новый Массив;
//@skip-check unknown-method-property
МодулиРасширения = ЮТМетаданныеСервер.МодулиРасширений();
Для Каждого ОписаниеМодуля Из МодулиРасширения Цикл
@ -220,25 +222,6 @@
КонецФункции
Функция Фильтр(ПараметрыЗапуска)
Фильтр = Новый Структура("Расширения, Модули, Наборы, Теги, Контексты, Пути");
Фильтр.Расширения = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "extensions");
Фильтр.Модули = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "modules");
Фильтр.Теги = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "tags");
Фильтр.Контексты = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "contexts");
// TODO: Подумать в каком формате задать наборы - ИмяМодуля.Набор, Набор или другой вариант
Фильтр.Наборы = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "suites");
// TODO: Обработка путей в формате: Модуль.ИмяТеста, ИмяТеста - метод, параметры, контекст
// ОМ_ЮТУтверждения.Что[0: 1].Сервер, ОМ_ЮТУтверждения.Что[1: Структура].Сервер
Фильтр.Пути = ЮТОбщий.ЗначениеСтруктуры(ПараметрыЗапуска.filter, "paths");
Возврат Фильтр;
КонецФункции
Процедура УдалитьНастройкиМодуляИзПервогоНабора(СценарииМодуля)
НастройкиВыполнения = ЮТОбщий.СкопироватьРекурсивно(СценарииМодуля.НастройкиВыполнения);

View File

@ -19,9 +19,9 @@
#Область СлужебныйПрограммныйИнтерфейс
// См. ЮТЧитатель.ИсполняемыеСценарииМодуля
Функция ИсполняемыеСценарииМодуля(Знач ОписаниеМодуля) Экспорт
Функция ИсполняемыеСценарииМодуля(Знач МетаданныеМодуля) Экспорт
Возврат ЮТЧитатель.ИсполняемыеСценарииМодуля(ОписаниеМодуля);
Возврат ЮТЧитатель.ИсполняемыеСценарииМодуля(МетаданныеМодуля);
КонецФункции

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="CommonModule.ЮТЧитательСервер">
<suppressions key="com.e1c.v8codestyle.md:common-module-name-server-call" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -113,10 +113,11 @@
//
// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеКаждогоТеста`.
// Возвращаемое значение:
// Структура - Контекст теста
// Неопределено - Если метод вызывается за рамками теста
// - Структура - Контекст теста
// - Неопределено - Если метод вызывается за рамками теста
Функция КонтекстТеста() Экспорт
//@skip-check constructor-function-return-section
Возврат ЮТКонтекст.КонтекстТеста();
КонецФункции
@ -132,8 +133,8 @@
//
// Например, в контекст можно помещать создаваемые данные, что бы освободить/удалить их в обработчике `ПослеКаждогоТеста`.
// Возвращаемое значение:
// Структура - Контекст набора тестов
// Неопределено - Если метод вызывается за рамками тестового набора
// - Структура - Контекст набора тестов
// - Неопределено - Если метод вызывается за рамками тестового набора
Функция КонтекстТестовогоНабора() Экспорт
//@skip-check constructor-function-return-section
@ -152,6 +153,7 @@
// - Неопределено - Если метод вызывается за рамками тестового модуля
Функция КонтекстМодуля() Экспорт
//@skip-check constructor-function-return-section
Возврат ЮТКонтекст.КонтекстМодуля();
КонецФункции

View File

@ -1,17 +1,34 @@
# Описание свойств метаданных
| Имя | ИмяКоллекции | Конструктор | Группы | Ссылочный | Реквизиты | Измерения | Ресурсы | РеквизитыАдресации | ТабличныеЧасти |
|------------------------|-------------------------|-----------------------|--------|-----------|-----------|-----------|---------|--------------------|----------------|
| Справочник | Справочники | СоздатьЭлемент | + | + | + | | | | + |
| Документ | Документы | СоздатьДокумент | | + | + | | | | + |
| ПланВидовХарактеристик | ПланыВидовХарактеристик | СоздатьЭлемент | + | + | + | | | | + |
| ПланСчетов | ПланыСчетов | СоздатьСчет | | + | + | | | | + |
| ПланВидовРасчета | ПланыВидовРасчета | СоздатьВидРасчета | | + | + | | | | + |
| ПланОбмена | ПланыОбмена | СоздатьУзел | | + | + | | | | + |
| РегистрСведений | РегистрыСведений | СоздатьМенеджерЗаписи | | | + | + | + | | |
| РегистрНакопления | РегистрыНакопления | | | | + | + | + | | |
| РегистрБухгалтерии | РегистрыБухгалтерии | | | | + | + | + | | |
| РегистрРасчета | РегистрыРасчета | | | | + | + | + | | |
| БизнесПроцесс | БизнесПроцессы | СоздатьБизнесПроцесс | | + | + | | | | + |
| Задача | Задачи | СоздатьЗадачу | | + | + | | | + | + |
| Перечисление | Перечисления | | | + | | | | | |
| Имя | ИмяКоллекции | Конструктор | Группы | Ссылочный | Реквизиты | Измерения | Ресурсы | РеквизитыАдресации | ТабличныеЧасти | СтандартныеРеквизиты |
|----------------------------|-----------------------------|-----------------------|--------|-----------|-----------|-----------|---------|--------------------|----------------|----------------------|
| Справочник | Справочники | СоздатьЭлемент | + | + | + | | | | + | + |
| Документ | Документы | СоздатьДокумент | | + | + | | | | + | + |
| ПланВидовХарактеристик | ПланыВидовХарактеристик | СоздатьЭлемент | + | + | + | | | | + | + |
| ПланСчетов | ПланыСчетов | СоздатьСчет | | + | + | | | | + | + |
| ПланВидовРасчета | ПланыВидовРасчета | СоздатьВидРасчета | | + | + | | | | + | + |
| ПланОбмена | ПланыОбмена | СоздатьУзел | | + | + | | | | + | + |
| РегистрСведений | РегистрыСведений | СоздатьМенеджерЗаписи | | | + | + | + | | | + |
| РегистрНакопления | РегистрыНакопления | | | | + | + | + | | | + |
| РегистрБухгалтерии | РегистрыБухгалтерии | | | | + | + | + | | | + |
| РегистрРасчета | РегистрыРасчета | | | | + | + | + | | | + |
| БизнесПроцесс | БизнесПроцессы | СоздатьБизнесПроцесс | | + | + | | | | + | + |
| Задача | Задачи | СоздатьЗадачу | | + | + | | | + | + | + |
| Перечисление | Перечисления | | | + | | | | | | + |
| Отчет | Отчеты | | | | + | | | | + | |
| Обработка | Обработки | | | | + | | | | + | |
| Catalog | Catalogs | СоздатьЭлемент | + | + | + | | | | + | + |
| Document | Documents | СоздатьДокумент | | + | + | | | | + | + |
| ChartOfCharacteristicTypes | ChartsOfCharacteristicTypes | СоздатьЭлемент | + | + | + | | | | + | + |
| ChartOfAccounts | ChartsOfAccounts | СоздатьСчет | | + | + | | | | + | + |
| ChartOfCalculationTypes | ChartsOfCalculationTypes | СоздатьВидРасчета | | + | + | | | | + | + |
| ExchangePlan | ExchangePlans | СоздатьУзел | | + | + | | | | + | + |
| InformationRegister | InformationRegisters | СоздатьМенеджерЗаписи | | | + | + | + | | | + |
| AccumulationRegister | AccumulationRegisters | | | | + | + | + | | | + |
| AccountingRegister | AccountingRegisters | | | | + | + | + | | | + |
| CalculationRegister | CalculationRegisters | | | | + | + | + | | | + |
| BusinessProcess | BusinessProcesses | СоздатьБизнесПроцесс | | + | + | | | | + | + |
| Task | Tasks | СоздатьЗадачу | | + | + | | | + | + | + |
| Enum | Enums | | | + | | | | | | + |
| Report | Reports | | | | + | | | | + | |
| DataProcessor | DataProcessors | | | | + | | | | + | |

View File

@ -1,6 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" xmlns:mdclassExtension="http://g5.1c.ru/v8/dt/metadata/mdclass/extension" uuid="8ebe57d7-1182-4eea-bdda-375c1e0262e4">
<name>YAXUNIT</name>
<synonym>
<key>ru</key>
<value>YAxUnit</value>
</synonym>
<objectBelonging>Adopted</objectBelonging>
<extension xsi:type="mdclassExtension:ConfigurationExtension">
<managedApplicationModule>Extended</managedApplicationModule>
@ -16,7 +20,7 @@
<configurationExtensionCompatibilityMode>8.3.10</configurationExtensionCompatibilityMode>
<configurationExtensionPurpose>AddOn</configurationExtensionPurpose>
<scriptVariant>Russian</scriptVariant>
<version>23.08.0</version>
<version>24.01.1</version>
<languages uuid="b8fdae66-bc14-47de-9a8d-e0323e0d9ce8">
<name>Русский</name>
<objectBelonging>Adopted</objectBelonging>
@ -26,8 +30,8 @@
<languageCode>ru</languageCode>
</languages>
<subsystems>Subsystem.ЮТДвижок</subsystems>
<subsystems>Subsystem.ЮТПодражатель</subsystems>
<subsystems>Subsystem.ЮТФункциональность</subsystems>
<subsystems>Subsystem.ЮТДинамическиПодключаемые</subsystems>
<subsystems>Subsystem.ЮТПубличный</subsystems>
<commonPictures>CommonPicture.ЮТНеизвестный</commonPictures>
<commonPictures>CommonPicture.ЮТОшибка</commonPictures>
<commonPictures>CommonPicture.ЮТПодсистема</commonPictures>
@ -55,6 +59,7 @@
<commonModules>CommonModule.ЮТЗапросы</commonModules>
<commonModules>CommonModule.ЮТЗапросыВызовСервера</commonModules>
<commonModules>CommonModule.ЮТЗапросыКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТИсполнительГлобальный</commonModules>
<commonModules>CommonModule.ЮТИсполнительКлиент</commonModules>
<commonModules>CommonModule.ЮТИсполнительКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТИсполнительСервер</commonModules>
@ -69,6 +74,7 @@
<commonModules>CommonModule.ЮТКонтекстТеста</commonModules>
<commonModules>CommonModule.ЮТЛогирование</commonModules>
<commonModules>CommonModule.ЮТЛогированиеВызовСервера</commonModules>
<commonModules>CommonModule.ЮТЛокальСлужебный</commonModules>
<commonModules>CommonModule.ЮТМетаданные</commonModules>
<commonModules>CommonModule.ЮТМетаданныеПовтИсп</commonModules>
<commonModules>CommonModule.ЮТМетаданныеСервер</commonModules>
@ -94,6 +100,7 @@
<commonModules>CommonModule.ЮТРасширения</commonModules>
<commonModules>CommonModule.ЮТРегистрацияОшибок</commonModules>
<commonModules>CommonModule.ЮТСобытия</commonModules>
<commonModules>CommonModule.ЮТСообщенияСлужебный</commonModules>
<commonModules>CommonModule.ЮТСравнениеКлиентСервер</commonModules>
<commonModules>CommonModule.ЮТСравнениеСервер</commonModules>
<commonModules>CommonModule.ЮТСтроки</commonModules>
@ -110,6 +117,7 @@
<commonModules>CommonModule.ЮТФильтрация</commonModules>
<commonModules>CommonModule.ЮТЧитатель</commonModules>
<commonModules>CommonModule.ЮТЧитательСервер</commonModules>
<dataProcessors>DataProcessor.ЮТHTTPServiceRequest</dataProcessors>
<dataProcessors>DataProcessor.ЮТHTTPСервисЗапрос</dataProcessors>
<dataProcessors>DataProcessor.ЮТКонструкторТестовыхДанных</dataProcessors>
<dataProcessors>DataProcessor.ЮТЮнитТесты</dataProcessors>

View File

@ -32,11 +32,19 @@
/////////////////////////////////////////////////////////////////////////////////
// Используется для перехвата управления расширением после отработки запуска приложения
//@skip-check not-allowed-pragma
&После("ПриНачалеРаботыСистемы")
Процедура ЮТПриНачалеРаботыСистемы()
ЮТИсполнительКлиент.ВыполнитьМодульноеТестирование();
ПодключитьОбработчикОжидания("ЮТВыполнитьМодульноеТестирование", 0.1, Истина);
КонецПроцедуры
&After("OnStart")
Procedure ЮТOnStart()
ЮТИсполнительКлиент.ВыполнитьМодульноеТестирование();
EndProcedure
#КонецОбласти

View File

@ -32,6 +32,7 @@
/////////////////////////////////////////////////////////////////////////////////
// Используется для перехвата управления расширением после отработки запуска приложения
//@skip-check not-allowed-pragma
&После("ПриНачалеРаботыСистемы")
Процедура ЮТПриНачалеРаботыСистемы()

View File

@ -0,0 +1,252 @@
//©///////////////////////////////////////////////////////////////////////////©//
//
// 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 object-module-export-variable
Var HTTPMethod Export;
//@skip-check object-module-export-variable
Var BaseURL Export;
//@skip-check object-module-export-variable
Var Headers Export;
//@skip-check object-module-export-variable
Var RelativeURL Export;
//@skip-check object-module-export-variable
Var URLParameters Export;
//@skip-check object-module-export-variable
Var QueryOptions Export;
Var Body;
#КонецОбласти
#Область ПрограммныйИнтерфейс
// Возвращает тело как двоичные данные.
//
// Возвращаемое значение:
// ДвоичныеДанные - Тело
Function GetBodyAsBinaryData() Export
BodyType = TypeOf(Body);
If Body = Undefined Then
Return GetBinaryDataFromBase64String("");
ElsIf BodyType = Type("BinaryData") Then
Return Body;
ElsIf BodyType = Type("String") Then
Return GetBinaryDataFromString(Body);
EndIf;
EndFunction
// Возвращает тело как поток.
//
// Возвращаемое значение:
// Поток - Тело
Function GetBodyAsStream() Export
Return GetBodyAsBinaryData().OpenStreamForRead();
EndFunction
// Возвращает тело как строку.
//
// Параметры:
// Кодировка - КодировкаТекста, Строка - Кодировка
//
// Возвращаемое значение:
// Строка - Тело
Function GetBodyAsString(Encoding = Undefined) Export
BodyType = TypeOf(Body);
If Body = Undefined Then
Return "";
ElsIf BodyType = Тип("BinaryData") Then
Return GetStringFromBinaryData(Body, Encoding);
ElsIf BodyType = Тип("String") Then
Return Body;
EndIf;
EndFunction
// Устанавливает тело как двоичные данные.
// При получении тела в другом формате происходит конвертация
//
// Параметры:
// Данные - ДвоичныеДанные
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Function УстановитьТелоКакДвоичныеДанные(Data) Export
Body = Data;
Return ThisObject;
EndFunction
// Устанавливает тело как строку.
// При получении тела в другом формате происходит конвертация
//
// Параметры:
// Строка - Строка
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Function УстановитьТелоКакСтроку(String) Export
Body = String;
Return ThisObject;
EndFunction
// Устанавливает тело как строку JSON.
// Сериализует переданный объект в строку JSON и сохраняет в тело
// При получении тела в другом формате происходит конвертация
//
// Параметры:
// Данные - Произвольный
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Function УстановитьТелоКакСтрокуJSON(Data) Export
JSONWriter = Новый JSONWriter();
JSONWriter.SetString();
WriteJSON(JSONWriter, Data);
Body = JSONWriter.Close();
Return ThisObject;
EndFunction
// Добавляет заголовок.
//
// Параметры:
// ИмяЗаголовка - Строка
// Значение - Строка
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Function ДобавитьЗаголовок(HeaderName, Value) Export
Headers.Insert(HeaderName, Value);
Return ThisObject;
EndFunction
// Добавляет параметр запроса.
//
// Параметры:
// ИмяПараметра - Строка
// Значение - Строка
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Function ДобавитьПараметрЗапроса(ParameterName, Value) Export
QueryOptions.Insert(ParameterName, Value);
Return ThisObject;
EndFunction
// Добавляет параметр URL.
//
// Параметры:
// ИмяПараметра - Строка
// Значение - Строка
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Function ДобавитьПараметрURL(ParameterName, Value) Export
URLParameters.Insert(ParameterName, Value);
Return ThisObject;
EndFunction
// Устанавливает HTTP метод
//
// Параметры:
// Значение - Строка - Имя http метода
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Function Метод(Value) Export
HTTPMethod = Value;
Return ThisObject;
EndFunction
// Устанавливает базовый URL.
//
// Параметры:
// Значение - Строка - базовый URL
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Function БазовыйURL(Value) Export
BaseURL = Value;
Return ThisObject;
EndFunction
// Устанавливает относительный URL.
//
// Параметры:
// Значение - Строка - относительный URL
//
// Возвращаемое значение:
// ОбработкаОбъект.ЮТHTTPСервисЗапрос - Мок
Function ОтносительныйURL(Value) Export
RelativeURL = Value;
Return ThisObject;
EndFunction
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
Процедура Initialize()
HTTPMethod = "GET";
BaseURL = "";
Headers = New Map();
RelativeURL = "";
URLParameters = New Map();
QueryOptions = New Map();
КонецПроцедуры
#КонецОбласти
#Область Инициализация
Initialize();
#КонецОбласти
#КонецЕсли

View File

@ -0,0 +1,13 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:DataProcessor xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="01df8cc1-cb96-4cda-a18f-0641bca9f212">
<producedTypes>
<objectType typeId="852c0b16-4887-4def-83f9-18821d77f310" valueTypeId="d40cfd7c-5781-4c8f-9ec6-d59b29f9380a"/>
<managerType typeId="8710c3c0-b550-4cce-816c-3e4364c212ca" valueTypeId="82b2c6e6-4ea3-473c-90d5-4c2e17fa50de"/>
</producedTypes>
<name>ЮТHTTPServiceRequest</name>
<synonym>
<key>ru</key>
<value>Мок для HTTP Service request</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
</mdclass:DataProcessor>

View File

@ -25,6 +25,7 @@
#КонецОбласти
//@skip-check module-structure-top-region
#Область ПрограммныйИнтерфейс
// Устанавливает значение реквизита создаваемого объекта.
@ -108,6 +109,18 @@
КонецФункции
// Переключает конструктор на заполнение объекта.
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
Функция Объект() Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.ТабличнаяЧасть(Контекст, Неопределено);
Возврат ЭтотОбъект;
КонецФункции
// Добавляет новую строку табличной части объекта.
//
// Возвращаемое значение:
@ -154,6 +167,25 @@
КонецФункции
// Создает новый объект.
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создаст множество одинаковых объектов.
// Если вы хотите создать полностью новый объект, необходимо по-новой инициировать конструктор.
//
// Параметры:
// ОбменДаннымиЗагрузка - Булево - Записать объект с признаком `ОбменДанными.Загрузка = Истина`
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
&НаКлиенте
Функция ДобавитьЗапись(ОбменДаннымиЗагрузка = Ложь) Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.Записать(Контекст, Ложь, ОбменДаннымиЗагрузка);
Возврат ЭтотОбъект;
КонецФункции
// Создает и возвращяет новый объект (не записывая его).
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создаст множество одинаковых объектов.
@ -188,8 +220,8 @@
// Возвращает данные текущей строки табличной части объекта.
//
// Возвращаемое значение:
// Структура - Данные строки
// Неопределено - Если заполняется объект
// - Структура - Данные строки
// - Неопределено - Если заполняется объект
&НаКлиенте
Функция ДанныеСтроки() Экспорт
@ -210,6 +242,7 @@
#КонецОбласти
//@skip-check module-structure-top-region
#Область СлужебныйПрограммныйИнтерфейс
&НаКлиенте

View File

@ -104,6 +104,17 @@
КонецФункции
// Переключает конструктор на заполнение объекта.
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
Функция Объект() Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.ТабличнаяЧасть(Контекст, Неопределено);
Возврат ЭтотОбъект;
КонецФункции
// Добавляет новую строку табличной части объекта.
//
// Возвращаемое значение:
@ -147,6 +158,24 @@
КонецФункции
// Создает новый объект.
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создаст множество одинаковых объектов.
// Если вы хотите создать полностью новый объект, необходимо по-новой инициировать конструктор.
//
// Параметры:
// ОбменДаннымиЗагрузка - Булево - Записать объект с признаком `ОбменДанными.Загрузка = Истина`
//
// Возвращаемое значение:
// ОбщийМодуль - Конструктор
Функция ДобавитьЗапись(ОбменДаннымиЗагрузка = Ложь) Экспорт
ЮТКонструкторТестовыхДанныхСлужебный.Записать(Контекст, Ложь, ОбменДаннымиЗагрузка);
Возврат ЭтотОбъект;
КонецФункции
// Создает и возвращяет новый объект (не записывая его).
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создаст множество одинаковых объектов.
@ -159,6 +188,7 @@
Возврат ЮТКонструкторТестовыхДанныхСлужебный.НовыйОбъект(Контекст);
КонецФункции
// Создает и проводит новый документ. Возвращает объект или или ссылку на него.
//
// Важно, после создания данные не очищаются, поэтому многократный вызов метода создать множество объектов.
@ -178,8 +208,8 @@
// Возвращает данные текущей строки табличной части объекта.
//
// Возвращаемое значение:
// Структура - Данные строки
// Неопределено - Если заполняется объект
// - Структура - Данные строки
// - Неопределено - Если заполняется объект
Функция ДанныеСтроки() Экспорт
Возврат ЮТКонструкторТестовыхДанныхСлужебный.ДанныеСтроки(Контекст);

View File

@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<suppress:SuppressGenericObject xmlns:suppress="http://g5.1c.ru/v8/dt/check/suppress/model" fqn="DataProcessor.ЮТЮнитТесты.Form.Основная.Form">
<suppressions key="com.e1c.v8codestyle.form:data-composition-conditional-appearance-use" value="true"/>
</suppress:SuppressGenericObject>

View File

@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="1f90d482-0035-4c3c-82d4-2e21ca70d72e">
<name>ЮТИсполнитель</name>
<synonym>
<key>ru</key>
<value>Исполнитель</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<explanation>
<key>ru</key>
<value>Функциональность запуска тестирования</value>
</explanation>
<content>CommonModule.ЮТИсполнительГлобальный</content>
<content>CommonModule.ЮТИсполнительКлиент</content>
<content>CommonModule.ЮТИсполнительКлиентСервер</content>
<content>CommonModule.ЮТИсполнительСервер</content>
<content>CommonModule.ЮТЧитатель</content>
<content>CommonModule.ЮТЧитательСервер</content>
<content>CommonModule.ЮТФильтрация</content>
<content>CommonModule.ЮТПараметрыЗапуска</content>
<parentSubsystem>Subsystem.ЮТДвижок</parentSubsystem>
</mdclass:Subsystem>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="de4a422d-6943-4fa5-8a70-1a301c2cbaa1">
<name>ЮТКонтекст</name>
<synonym>
<key>ru</key>
<value>Контекст</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<explanation>
<key>ru</key>
<value>Функциональность работы с контекстами</value>
</explanation>
<content>CommonModule.ЮТКонтекст</content>
<content>CommonModule.ЮТКонтекстКлиент</content>
<content>CommonModule.ЮТКонтекстТеста</content>
<content>CommonModule.ЮТКонтекстСервер</content>
<parentSubsystem>Subsystem.ЮТДвижок</parentSubsystem>
</mdclass:Subsystem>

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="24bbebcb-477b-4067-8d46-44f28817e2eb">
<name>ЮТМокирование</name>
<synonym>
<key>ru</key>
<value>Мокирование</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<explanation>
<key>ru</key>
<value>Содержит функциональности мокирования данных</value>
</explanation>
<content>CommonModule.МокитоОбучение</content>
<content>CommonModule.МокитоПроверки</content>
<content>CommonModule.МокитоСлужебный</content>
<content>DataProcessor.ЮТHTTPСервисЗапрос</content>
<parentSubsystem>Subsystem.ЮТДвижок</parentSubsystem>
</mdclass:Subsystem>

View File

@ -0,0 +1,44 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Subsystem xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="0de5fcbf-9941-4e24-99ae-7a92e46760fd">
<name>ЮТСервис</name>
<synonym>
<key>ru</key>
<value>Сервис</value>
</synonym>
<includeHelpInContents>true</includeHelpInContents>
<explanation>
<key>ru</key>
<value>Сервисная функциональность работы движка</value>
</explanation>
<content>CommonModule.ЮТЛогированиеВызовСервера</content>
<content>CommonModule.ЮТАсинхроннаяОбработкаСлужебныйКлиент</content>
<content>CommonModule.ЮТФабрика</content>
<content>CommonModule.ЮТФайлы</content>
<content>CommonModule.ЮТТипыДанныхСлужебный</content>
<content>CommonModule.ЮТСообщенияСлужебный</content>
<content>CommonModule.ЮТСобытия</content>
<content>CommonModule.ЮТРегистрацияОшибок</content>
<content>CommonModule.ЮТРасширения</content>
<content>CommonModule.ЮТПроверкиСлужебный</content>
<content>CommonTemplate.ЮТRegEx1CAddin</content>
<content>CommonTemplate.ЮТYaxUnitAddIn</content>
<content>CommonPicture.ЮТНеизвестный</content>
<content>CommonPicture.ЮТОшибка</content>
<content>CommonPicture.ЮТПодсистема</content>
<content>CommonPicture.ЮТПропущен</content>
<content>CommonPicture.ЮТУпал</content>
<content>CommonPicture.ЮТУспешно</content>
<content>CommonPicture.ЮТЭлементыТестов</content>
<content>CommonModule.ЮТКомпоненты</content>
<content>CommonModule.ЮТКомпонентыВызовСервера</content>
<content>CommonModule.ЮТКомпонентыКлиент</content>
<content>CommonModule.ЮТЛокальСлужебный</content>
<content>CommonModule.ЮТМетаданныеПовтИсп</content>
<content>CommonModule.ЮТМетаданныеСервер</content>
<content>CommonModule.ЮТОбщийВызовСервера</content>
<content>CommonModule.ЮТПовторногоИспользования</content>
<content>CommonTemplate.ЮТОписаниеМетаданных</content>
<content>CommonModule.ЮТНастройкиВыполнения</content>
<content>CommonModule.ЮТОтчет</content>
<parentSubsystem>Subsystem.ЮТДвижок</parentSubsystem>
</mdclass:Subsystem>

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