Skip to content

Commit 7309f82

Browse files
authored
Превышена максимальная длина числовых данных (31 знак). #82 (#1387)
1 parent acb67c8 commit 7309f82

File tree

18 files changed

+523
-2
lines changed

18 files changed

+523
-2
lines changed

CHANGELOG.md

+2
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@
1010

1111
#### Метаданные
1212

13+
- Превышена максимальная длина числовых данных (31 знак). #82
14+
1315

1416
#### Формы
1517

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# Numeric data maximum length exceeded (31 symbols)
2+
3+
Application should equally work with all DBs, operation systems, web-browsers
4+
and various modes of work which 1C:Enterprise supports.
5+
6+
## Noncompliant Code Example
7+
8+
Maximum length of numeric data - 38 symbols
9+
10+
## Compliant Solution
11+
12+
[8.3. IBM Db2](https://its.1c.ru/db/v83doc#bookmark:dev:TI000001288)
13+
14+
15+
> 8.3. Server IBM DB2
16+
> ● Maximum length of numeric data – 31 symbols (not 38).
17+
18+
## See
19+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Превышена максимальная длина числовых данных (31 знак)
2+
3+
Конфигурация должна быть одинаково рассчитана на работу со всеми
4+
СУБД, операционными системами, веб-браузерами и различными режимами
5+
работы, которые поддерживает платформа 1С:Предприятие.
6+
7+
8+
## Неправильно
9+
10+
Максимальная длина числовых данных – 38 знак
11+
12+
13+
## Правильно
14+
15+
16+
Соблюдение стандартов "Приложение 8. Особенности работы с различными
17+
СУБД"
18+
19+
[8.3. IBM Db2](https://its.1c.ru/db/v83doc#bookmark:dev:TI000001288)
20+
21+
22+
> 8.3. Сервер IBM DB2
23+
> ● Максимальная длина числовых данных – 31 знак (а не 38).
24+
25+
26+
27+
## См.
28+
29+
- [Общие требования к конфигурации](https://its.1c.ru/db/v8std#content:467:hdoc)

bundles/com.e1c.v8codestyle.md/plugin.xml

+4
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,10 @@
9090
category="com.e1c.v8codestyle.md"
9191
class="com.e1c.v8codestyle.md.check.DbObjectAnyRefTypeCheck">
9292
</check>
93+
<check
94+
category="com.e1c.v8codestyle.md"
95+
class="com.e1c.v8codestyle.md.check.DbObjectMaxNumberLengthCheck">
96+
</check>
9397
<check
9498
category="com.e1c.v8codestyle.md"
9599
class="com.e1c.v8codestyle.md.check.UnsafePasswordStorageCheck">
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
/*******************************************************************************
2+
* Copyright (C) 2023, 1C-Soft LLC and others.
3+
*
4+
* This program and the accompanying materials are made
5+
* available under the terms of the Eclipse Public License 2.0
6+
* which is available at https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* 1C-Soft LLC - initial API and implementation
12+
*******************************************************************************/
13+
package com.e1c.v8codestyle.md.check;
14+
15+
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.NUMBER_QUALIFIERS;
16+
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.NUMBER_QUALIFIERS__PRECISION;
17+
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.TYPE_DESCRIPTION;
18+
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.TYPE_DESCRIPTION__NUMBER_QUALIFIERS;
19+
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.TYPE_DESCRIPTION__TYPES;
20+
import static com._1c.g5.v8.dt.metadata.mdclass.MdClassPackage.Literals.BASIC_DB_OBJECT;
21+
22+
import java.text.MessageFormat;
23+
import java.util.Objects;
24+
import java.util.function.Supplier;
25+
26+
import org.eclipse.core.runtime.IProgressMonitor;
27+
import org.eclipse.emf.ecore.EObject;
28+
import org.eclipse.emf.ecore.EStructuralFeature;
29+
30+
import com._1c.g5.v8.dt.mcore.NumberQualifiers;
31+
import com._1c.g5.v8.dt.mcore.TypeDescription;
32+
import com._1c.g5.v8.dt.mcore.util.McoreUtil;
33+
import com._1c.g5.v8.dt.metadata.mdclass.BasicFeature;
34+
import com._1c.g5.v8.dt.metadata.mdclass.DefinedType;
35+
import com._1c.g5.v8.dt.platform.IEObjectTypeNames;
36+
import com.e1c.g5.v8.dt.check.CheckComplexity;
37+
import com.e1c.g5.v8.dt.check.ICheckParameters;
38+
import com.e1c.g5.v8.dt.check.components.BasicCheck;
39+
import com.e1c.g5.v8.dt.check.settings.IssueSeverity;
40+
import com.e1c.g5.v8.dt.check.settings.IssueType;
41+
import com.e1c.v8codestyle.check.StandardCheckExtension;
42+
import com.e1c.v8codestyle.internal.md.CorePlugin;
43+
44+
/**
45+
* The check that the DB attribute has number type and it is not more then 31.
46+
*
47+
*  @author Dmitriy Marmyshev
48+
*
49+
*/
50+
public final class DbObjectMaxNumberLengthCheck
51+
extends BasicCheck
52+
{
53+
54+
private static final String CHECK_ID = "db-object-max-number-length"; //$NON-NLS-1$
55+
56+
public static final String MAX_LENGTH = "maxNumberLength"; //$NON-NLS-1$
57+
58+
public static final String MAX_LENGTH_DEFAULT = "31"; //$NON-NLS-1$
59+
60+
@Override
61+
public String getCheckId()
62+
{
63+
return CHECK_ID;
64+
}
65+
66+
@Override
67+
protected void configureCheck(CheckConfigurer builder)
68+
{
69+
builder.title(Messages.DbObjectMaxNumberLengthCheck_title)
70+
.description(Messages.DbObjectMaxNumberLengthCheck_description)
71+
.complexity(CheckComplexity.NORMAL)
72+
.severity(IssueSeverity.MAJOR)
73+
.issueType(IssueType.PORTABILITY)
74+
.extension(new StandardCheckExtension(467, getCheckId(), CorePlugin.PLUGIN_ID))
75+
.extension(new SkipAdoptedInExtensionMdObjectExtension())
76+
.parameter(MAX_LENGTH, Integer.class, MAX_LENGTH_DEFAULT, Messages.DbObjectMaxNumberLengthCheck_parameter);
77+
78+
builder.topObject(BASIC_DB_OBJECT)
79+
.containment(TYPE_DESCRIPTION)
80+
.features(TYPE_DESCRIPTION__TYPES, TYPE_DESCRIPTION__NUMBER_QUALIFIERS);
81+
82+
builder.topObject(BASIC_DB_OBJECT).containment(NUMBER_QUALIFIERS).features(NUMBER_QUALIFIERS__PRECISION);
83+
}
84+
85+
@Override
86+
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
87+
IProgressMonitor monitor)
88+
{
89+
if (object instanceof TypeDescription)
90+
{
91+
check((TypeDescription)object, resultAceptor, parameters, monitor);
92+
}
93+
else if (object instanceof NumberQualifiers)
94+
{
95+
check((NumberQualifiers)object, resultAceptor, parameters, monitor);
96+
}
97+
}
98+
99+
private void check(TypeDescription object, ResultAcceptor resultAceptor, ICheckParameters parameters,
100+
IProgressMonitor monitor)
101+
{
102+
103+
if (!(object.eContainer() instanceof BasicFeature) || object.getTypes().size() != 1
104+
|| !IEObjectTypeNames.DEFINED_TYPE.equals(McoreUtil.getTypeCategory(object.getTypes().get(0))))
105+
{
106+
return;
107+
}
108+
109+
TypeDescription typeDescription = object;
110+
EObject definedType = typeDescription.getTypes().get(0).eContainer();
111+
while (definedType != null && !(definedType instanceof DefinedType))
112+
{
113+
definedType = definedType.eContainer();
114+
}
115+
if (definedType instanceof DefinedType)
116+
{
117+
typeDescription = ((DefinedType)definedType).getType();
118+
}
119+
120+
checkAndAddIssue(typeDescription, () -> {
121+
BasicFeature basicFeature = (BasicFeature)object.eContainer();
122+
return basicFeature.getName();
123+
}, resultAceptor, object, TYPE_DESCRIPTION__TYPES, parameters, monitor);
124+
125+
}
126+
127+
private void check(NumberQualifiers object, ResultAcceptor resultAceptor, ICheckParameters parameters,
128+
IProgressMonitor monitor)
129+
{
130+
131+
if (!(object.eContainer() instanceof TypeDescription)
132+
|| !(object.eContainer().eContainer() instanceof BasicFeature))
133+
{
134+
return;
135+
}
136+
TypeDescription typeDescription = (TypeDescription)object.eContainer();
137+
138+
checkAndAddIssue(typeDescription, () -> {
139+
BasicFeature basicFeature = (BasicFeature)typeDescription.eContainer();
140+
return basicFeature.getName();
141+
}, resultAceptor, object, NUMBER_QUALIFIERS__PRECISION, parameters, monitor);
142+
}
143+
144+
private void checkAndAddIssue(TypeDescription typeDescription, Supplier<String> basicFeatureName,
145+
ResultAcceptor resultAceptor, EObject object, EStructuralFeature feature, ICheckParameters parameters,
146+
IProgressMonitor monitor)
147+
{
148+
if (monitor.isCanceled() || typeDescription.getNumberQualifiers() == null
149+
|| typeDescription.getTypes()
150+
.stream()
151+
.map(McoreUtil::getTypeName)
152+
.filter(Objects::nonNull)
153+
.noneMatch(IEObjectTypeNames.NUMBER::equals))
154+
{
155+
return;
156+
}
157+
158+
int maxPrecision = parameters.getInt(MAX_LENGTH);
159+
int precision = typeDescription.getNumberQualifiers().getPrecision();
160+
161+
if (precision > maxPrecision)
162+
{
163+
resultAceptor.addIssue(MessageFormat.format(Messages.DbObjectMaxNumberLengthCheck_message,
164+
basicFeatureName.get(), maxPrecision), object, feature);
165+
}
166+
}
167+
}

bundles/com.e1c.v8codestyle.md/src/com/e1c/v8codestyle/md/check/Messages.java

+4
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ final class Messages
6565
public static String DbObjectAnyRefCheck_AnyRef;
6666
public static String DbObjectAnyRefCheck_Description;
6767
public static String DbObjectAnyRefCheck_Title;
68+
public static String DbObjectMaxNumberLengthCheck_description;
69+
public static String DbObjectMaxNumberLengthCheck_message;
70+
public static String DbObjectMaxNumberLengthCheck_parameter;
71+
public static String DbObjectMaxNumberLengthCheck_title;
6872
public static String DocumentPostInPrivilegedModeCheck_description;
6973
public static String DocumentPostInPrivilegedModeCheck_message_Post_in_privileged_mode;
7074
public static String DocumentPostInPrivilegedModeCheck_message_Unpost_in_privileged_mode;

bundles/com.e1c.v8codestyle.md/src/com/e1c/v8codestyle/md/check/messages.properties

+8
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ DbObjectAnyRefCheck_Description = Do not use composite types AnyRef, CatalogRef,
5353

5454
DbObjectAnyRefCheck_Title = Restrictions on the use of any ref type attributes
5555

56+
DbObjectMaxNumberLengthCheck_description = Numeric DB field maximum length is 31
57+
58+
DbObjectMaxNumberLengthCheck_message = Numeric field "{0}" length is more than {1}
59+
60+
DbObjectMaxNumberLengthCheck_parameter = Numeric field maximum length
61+
62+
DbObjectMaxNumberLengthCheck_title = Numeric DB field maximum length is 31
63+
5664
DbObjectRefNonRefTypesCheck_Description = Composite type attributes used in join conditions, filters, and for ordering must contain only reference attribute types (CatalogRef. ..., DocumentRef. ..., and other). Do not include any other non-reference types in this type. For example: String, Number, Date, UUID, Boolean, and ValueStorage.
5765

5866
DbObjectRefNonRefTypesCheck_Ref_and_other = Composite type attributes used in join conditions, filters, and for ordering must contain only reference attribute types (CatalogRef. ..., DocumentRef. ..., and other). Do not include any other non-reference types in this type.

bundles/com.e1c.v8codestyle.md/src/com/e1c/v8codestyle/md/check/messages_ru.properties

+10-2
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,14 @@ DbObjectAnyRefCheck_Description = Для типизированных объек
5454

5555
DbObjectAnyRefCheck_Title = Использование составного типа, содержащего ЛюбаяСсылка и аналогичные.
5656

57+
DbObjectMaxNumberLengthCheck_description = Максимальная длина числовых данных 31 знак
58+
59+
DbObjectMaxNumberLengthCheck_message = Длинна числового поля "{0}" больше чем {1}
60+
61+
DbObjectMaxNumberLengthCheck_parameter = Максимальная длинна числового поля
62+
63+
DbObjectMaxNumberLengthCheck_title = Максимальная длина числовых данных 31 знак
64+
5765
DbObjectRefNonRefTypesCheck_Description = Реквизиты составного типа, используемые в условиях соединений, отборах, а также для упорядочивания, должны содержать только ссылочные типы (СправочникСсылка.…, ДокументСсылка.… и пр.). В состав их типов не рекомендуется включать никаких других нессылочных типов, например: Строка, Число, Дата, УникальныйИдентификатор, Булево, а также ХранилищеЗначения.
5866

5967
DbObjectRefNonRefTypesCheck_Ref_and_other = Реквизиты составного типа, используемые в условиях соединений, отборах, а также для упорядочивания, должны содержать только ссылочные типы (СправочникСсылка.…, ДокументСсылка.… и пр.). В состав их типов не рекомендуется включать никаких других нессылочных типов.
@@ -74,10 +82,10 @@ ExtensionMdObjectNamePrefixCheck_Object_0_should_have_1_prefix = Имя объе
7482

7583
ExtensionMdObjectNamePrefixCheck_Title = Имя объекта в расширении должно содержать префикс расширения
7684

77-
FunctionalOptionPrivilegedGetModeCheck_message = В функциональной опции не установлен флаг "Привилегированный режим при получении"
78-
7985
FunctionalOptionPrivilegedGetModeCheck_description = В функциональной опции не установлен флаг "Привилегированный режим при получении"
8086

87+
FunctionalOptionPrivilegedGetModeCheck_message = В функциональной опции не установлен флаг "Привилегированный режим при получении"
88+
8189
FunctionalOptionPrivilegedGetModeCheck_title = В функциональной опции не установлен флаг "Привилегированный режим при получении"
8290

8391
MdListObjectPresentationCheck_Neither_Object_presentation_nor_List_presentation_is_not_filled = Не заполнено ни представление объекта, ни представление списка
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*******************************************************************************
2+
* Copyright (C) 2023, 1C-Soft LLC and others.
3+
*
4+
* This program and the accompanying materials are made
5+
* available under the terms of the Eclipse Public License 2.0
6+
* which is available at https://www.eclipse.org/legal/epl-2.0/
7+
*
8+
* SPDX-License-Identifier: EPL-2.0
9+
*
10+
* Contributors:
11+
* 1C-Soft LLC - initial API and implementation
12+
*******************************************************************************/
13+
package com.e1c.v8codestyle.md.check.itests;
14+
15+
import static org.junit.Assert.assertNotNull;
16+
import static org.junit.Assert.assertNull;
17+
18+
import org.junit.Test;
19+
20+
import com._1c.g5.v8.bm.core.IBmObject;
21+
import com._1c.g5.v8.dt.core.platform.IDtProject;
22+
import com._1c.g5.v8.dt.metadata.mdclass.Catalog;
23+
import com._1c.g5.v8.dt.metadata.mdclass.CatalogAttribute;
24+
import com._1c.g5.v8.dt.validation.marker.Marker;
25+
import com.e1c.g5.v8.dt.testing.check.SingleProjectReadOnlyCheckTestBase;
26+
import com.e1c.v8codestyle.md.check.DbObjectMaxNumberLengthCheck;
27+
28+
/**
29+
* Tests for {@link DbObjectMaxNumberLengthCheck} check
30+
*
31+
* @author Dmitriy Marmyshev
32+
*
33+
*/
34+
public class DbObjectMaxNumberLengthCheckTest
35+
extends SingleProjectReadOnlyCheckTestBase
36+
{
37+
private static final String CHECK_ID = "db-object-max-number-length"; //$NON-NLS-1$
38+
39+
private static final String PROJECT_NAME = "MdNumberMaxLength";
40+
41+
@Override
42+
protected String getTestConfigurationName()
43+
{
44+
return PROJECT_NAME;
45+
}
46+
47+
/**
48+
* Check that numeric DB field maximum length is more then 31
49+
*/
50+
@Test
51+
public void testNumberMaxLength()
52+
{
53+
IDtProject dtProject = dtProjectManager.getDtProject(PROJECT_NAME);
54+
assertNotNull(dtProject);
55+
56+
IBmObject object = getTopObjectByFqn("Catalog.Test", dtProject);
57+
if (object instanceof Catalog)
58+
{
59+
CatalogAttribute att = ((Catalog)object).getAttributes().get(0);
60+
Marker marker = getFirstMarker(CHECK_ID, att.getType().getNumberQualifiers(), dtProject);
61+
assertNull(marker);
62+
63+
att = ((Catalog)object).getAttributes().get(1);
64+
marker = getFirstMarker(CHECK_ID, att.getType().getNumberQualifiers(), dtProject);
65+
assertNotNull(marker);
66+
67+
att = ((Catalog)object).getAttributes().get(2);
68+
marker = getFirstMarker(CHECK_ID, att.getType(), dtProject);
69+
assertNull(marker);
70+
71+
att = ((Catalog)object).getAttributes().get(3);
72+
marker = getFirstMarker(CHECK_ID, att.getType(), dtProject);
73+
assertNotNull(marker);
74+
}
75+
}
76+
77+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<projectDescription>
3+
<name>MdNumberMaxLength</name>
4+
<comment></comment>
5+
<projects>
6+
</projects>
7+
<buildSpec>
8+
<buildCommand>
9+
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
10+
<arguments>
11+
</arguments>
12+
</buildCommand>
13+
</buildSpec>
14+
<natures>
15+
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
16+
<nature>com._1c.g5.v8.dt.core.V8ConfigurationNature</nature>
17+
</natures>
18+
</projectDescription>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
eclipse.preferences.version=1
2+
encoding/<project>=UTF-8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Manifest-Version: 1.0
2+
Runtime-Version: 8.3.19

0 commit comments

Comments
 (0)