Skip to content

Commit

Permalink
#1224 Проверяет отсутствие кода после асинхронного вызова (#1234)
Browse files Browse the repository at this point in the history
  • Loading branch information
iArtemv committed Apr 16, 2023
1 parent ec51b9f commit 283804d
Show file tree
Hide file tree
Showing 22 changed files with 879 additions and 21 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@

#### Код модулей

- Проверка отсутствия кода после асинхронного вызова
- Проверка использования метода ДанныеФормыВЗначение вместо РеквизитФормыВЗначение
- В проверку использования нерекомендуемых методов (use-non-recommended-method) добавлен метод ПолучитьФорму(GetForm)
- Использование устаревшего метода Найти
Expand Down Expand Up @@ -74,7 +75,6 @@
- Устаревшая процедура (функция) расположена вне области "УстаревшиеПроцедурыИФункции"
- Использован обработчик событий, подключаемый из кода и не содержащий префикса "Подключаемый_"


### Новые быстрые исправления (Quick-fix)

- Исправление превышения максимального количества допустимых пустых строк
Expand Down
1 change: 1 addition & 0 deletions bundles/com.e1c.v8codestyle.bsl/META-INF/MANIFEST.MF
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ Bundle-RequiredExecutionEnvironment: JavaSE-11
Automatic-Module-Name: com.e1c.v8codestyle.bsl
Bundle-ActivationPolicy: lazy
Import-Package: com._1c.g5.v8.bm.core;version="[7.0.0,8.0.0)",
com._1c.g5.v8.dt.bm.xtext;version="[14.1.100,15.0.0)",
com._1c.g5.v8.dt.bsl;version="[5.0.0,6.0.0)",
com._1c.g5.v8.dt.bsl.comment;version="[3.0.0,4.0.0)",
com._1c.g5.v8.dt.bsl.common;version="[6.0.0,7.0.0)",
Expand Down
24 changes: 24 additions & 0 deletions bundles/com.e1c.v8codestyle.bsl/markdown/code-after-async-call.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
# The asynchronous method is not followed by lines of code

In the asynchronous approach the method is called as usual, but control returns to the caller before the asynchronous
method is completed. After that, execution of the caller continues.

## Noncompliant Code Example

```bsl
Text = "Warning text";
ShowMessageBox( , Text);
Message("Warning is closed");
```

## Compliant Solution

```bsl
Text = "Warning text";
Await DoMessageBoxAsync(Text);
Message("Warning is closed");
```

## See

- [Synchronous and asynchronous operations](https://kb.1ci.com/1C_Enterprise_Platform/Guides/Developer_Guides/1C_Enterprise_8.3.19_Developer_Guide/Chapter_4._1C_Enterprise_language/4.7._Queries/4.7.9._Synchronous_and_asynchronous_operations/)
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
# Код расположен после асинхронного вызова

При асинхронном подходе вызов метода выполняется как обычно, но управление возвращается вызывающему коду до того,
как асинхронный метод завершит свою работу. После этого вызывающий код продолжает свое выполнение.
Особенность асинхронного выполнения: исполнение на стороне вызывающего кода продолжится до того,
как полностью закончилось исполнение вызванного метода.

Для правильного решения нужно вынести весь код, который должен быть выполнен после выполнения асинхронного действия,
в экспортный метод и указать его имя в обработке оповещения, которая будет вызвана после завершения асинхронного действия.
Или использовать асинхронность через обещания, например, Ждать ПредупреждениеАсинх(Текст).

## Неправильно

```bsl
Текст = "Текст предупреждения";
ПоказатьПредупреждение( , Текст);
Сообщить("Закрыли предупреждение");
```

```bsl
ПоказатьПредупреждение(,ТекстПредупреждения);
Отказ = Истина;
```

## Правильно

```bsl
Текст = "Текст предупреждения";
Ждать ПредупреждениеАсинх(Текст);
Сообщить("Закрыли предупреждение");
```

```bsl
&НаКлиенте
Процедура Команда1(Команда)
Оповещение = Новый ОписаниеОповещения("ПредупреждениеЗавершение", ЭтотОбъект);
Текст = "Текст предупреждения";
ПоказатьПредупреждение(Оповещение, Текст);
КонецПроцедуры
&НаКлиенте
Процедура ПредупреждениеЗавершение(ДополнительныеПараметры) Экспорт
Сообщить("Закрыли предупреждение");
КонецПроцедуры;
```

```bsl
Отказ = Истина;
ПоказатьПредупреждение(,ТекстПредупреждения);
```

## См.

- [Синхронные и асинхронные методы работы](https://its.1c.ru/db/v8319doc#bookmark:dev:TI000001505)
4 changes: 4 additions & 0 deletions bundles/com.e1c.v8codestyle.bsl/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -347,6 +347,10 @@
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.DeprecatedProcedureOutsideDeprecatedRegionCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.CodeAfterAsyncCallCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.UnknownFormParameterAccessCheck">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
/*******************************************************************************
* Copyright (C) 2023, 1C-Soft LLC and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* 1C-Soft LLC - initial API and implementation
*******************************************************************************/
package com.e1c.v8codestyle.bsl;

import java.util.Collection;
import java.util.Map;

import com._1c.g5.v8.dt.platform.version.Version;

/**
* Platform context asynchronous methods provider
*
* @author Artem Iliukhin
*/
public interface IAsyncInvocationProvider
{

/**
* Global context methods.
*
* @param version the version of platform, cannot be {@code null}
* @return the asynchronous invocation names
*/
Collection<String> getAsyncInvocationNames(Version version);

/**
* Methods with a list of types in which they are used.
*
* @param version the version of platform, cannot be {@code null}
* @return the asynchronous type method names
*/
Map<String, Collection<String>> getAsyncTypeMethodNames(Version version);

}
Loading

0 comments on commit 283804d

Please sign in to comment.