1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2025-01-06 00:33:23 +02:00

#373 Добавлена проверка метода вне области (#1093)

This commit is contained in:
Artem Iliukhin 2022-08-02 10:37:25 +03:00 committed by GitHub
parent 9d23e508bd
commit 2140998caa
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
36 changed files with 932 additions and 5 deletions

View File

@ -48,6 +48,7 @@
- Отсутствует удаление временного файла после использования.
- Структура модуля. Добавлена проверка области событий.
- Отсутствует включение безопасного режима перед вызовом метода "Выполнить" или "Вычислить"
- Структура модуля. Добавлена проверка метода вне области.
#### Запросы

View File

@ -0,0 +1,40 @@
# Check the method is outside a region
The method is outside a region
The Interface section contains export procedures and functions intended for use by other configuration objects or
by other programs (for example, via an external connection).
The Internal procedures and functions section contains procedures and functions that comprise
the internal implementation of the common module. When a common module is a part of some functional subsystem
that includes multiple metadata objects, this section can also contain other internal export procedures and
functions intended to be called only from other objects of this subsystem.
## Noncompliant Code Example
```bsl
Procedure Noncompliant()
//...
EndProcedure
```bsl
## Compliant Solution
```bsl
#Region Private
Procedure Compliant()
//...
EndProcedure
#EndRegion
```bsl
## See
- [Module structure](https://1c-dn.com/library/module_structure/)
- [Module structure](https://support.1ci.com/hc/en-us/articles/360011002360-Module-structure)

View File

@ -0,0 +1,62 @@
# Проверяет что метод находится в области
Метод находится в области
Раздел «Программный интерфейс» содержит экспортные процедуры и функции, предназначенные для использования
другими объектами конфигурации или другими программами (например, через внешнее соединение).
Раздел «Служебный программный интерфейс» предназначен для модулей, которые являются частью некоторой функциональной
подсистемы. В нем должны быть размещены экспортные процедуры и функции, которые допустимо вызывать только из других
функциональных подсистем этой же библиотеки.
Раздел «Служебные процедуры и функции» содержит процедуры и функции, составляющие внутреннюю реализацию общего модуля.
В тех случаях, когда общий модуль является частью некоторой функциональной подсистемы, включающей в себя несколько
объектов метаданных, в этом разделе также могут быть размещены служебные экспортные процедуры и функции, предназначенные
только для вызова из других объектов данной подсистемы.
## Неправильно
```bsl
Процедура МетодВызываемыйИзВне() Экспорт
КонецПроцедуры
#Область ПрограммныйИнтерфейс
// Код процедур и функций
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Код процедур и функций
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Код процедур и функций
#КонецОбласти
```
## Правильно
```bsl
#Область ПрограммныйИнтерфейс
Процедура МетодВызываемыйИзВне() Экспорт
КонецПроцедуры
#КонецОбласти
#Область СлужебныйПрограммныйИнтерфейс
// Код процедур и функций
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
// Код процедур и функций
#КонецОбласти
```
## См.
- [Структура модуля](https://its.1c.ru/db/v8std#content:455:hdoc)

View File

@ -115,6 +115,10 @@
<check
category="com.e1c.v8codestyle.bsl.strict"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.strict.check.FunctionCtorReturnSectionCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.ModuleStructureMethodInRegionCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl.strict"

View File

@ -64,12 +64,12 @@ public abstract class AbstractModuleStructureCheck
}
/**
* Gets the parent region of given region.
* Gets the parent region of this object located inside the region.
*
* @param object the region to find the parent, cannot be {@code null}.
* @param object the object to find the first parent region, cannot be {@code null}.
* @return the parent region, cannot return {@code null}.
*/
protected Optional<RegionPreprocessor> getFirstParentRegion(RegionPreprocessor object)
protected Optional<RegionPreprocessor> getFirstParentRegion(EObject object)
{
EObject parent = object.eContainer();
PreprocessorItem lastItem = null;
@ -83,8 +83,10 @@ public abstract class AbstractModuleStructureCheck
{
return Optional.ofNullable(parentRegion);
}
return Optional.empty();
else
{
lastItem = null;
}
}
else if (parent instanceof PreprocessorItem)
{

View File

@ -154,6 +154,16 @@ final class Messages
public static String ModuleStructureEventRegionsCheck_Title;
public static String ModuleStructureMethodInRegionCheck_Description;
public static String ModuleStructureMethodInRegionCheck_Method_should_be_placed_in_one_of_the_standard_regions;
public static String ModuleStructureMethodInRegionCheck_Multilevel_nesting_of_regions;
public static String ModuleStructureMethodInRegionCheck_Only_export;
public static String ModuleStructureMethodInRegionCheck_Title;
public static String QueryInLoop_check_query_in_infinite_loop;
public static String QueryInLoop_description;
public static String QueryInLoop_Loop_has_method_with_query__0;

View File

@ -0,0 +1,147 @@
/*******************************************************************************
* Copyright (C) 2022, 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.check;
import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.METHOD;
import java.text.MessageFormat;
import java.util.Collection;
import java.util.Optional;
import org.eclipse.core.runtime.IProgressMonitor;
import com._1c.g5.v8.dt.bsl.model.Method;
import com._1c.g5.v8.dt.bsl.model.ModuleType;
import com._1c.g5.v8.dt.bsl.model.RegionPreprocessor;
import com._1c.g5.v8.dt.core.platform.IV8Project;
import com._1c.g5.v8.dt.core.platform.IV8ProjectManager;
import com._1c.g5.v8.dt.mcore.McorePackage;
import com._1c.g5.v8.dt.metadata.mdclass.ScriptVariant;
import com.e1c.g5.v8.dt.check.CheckComplexity;
import com.e1c.g5.v8.dt.check.ICheckParameters;
import com.e1c.g5.v8.dt.check.components.ModuleTopObjectNameFilterExtension;
import com.e1c.g5.v8.dt.check.settings.IssueSeverity;
import com.e1c.g5.v8.dt.check.settings.IssueType;
import com.e1c.v8codestyle.bsl.IModuleStructureProvider;
import com.e1c.v8codestyle.bsl.ModuleStructureSection;
import com.e1c.v8codestyle.check.StandardCheckExtension;
import com.e1c.v8codestyle.internal.bsl.BslPlugin;
import com.google.inject.Inject;
/**
* Checks that the method is outside the regions.
* Checks the standard interface regions for the existence of non-export methods
* and the location of export methods outside the regions provided by the standard for export methods.
*
* @author Artem Iliukhin
*
*/
public class ModuleStructureMethodInRegionCheck
extends AbstractModuleStructureCheck
{
private static final String CHECK_ID = "module-structure-method-in-regions"; //$NON-NLS-1$
private static final String DEFAULT_CHECK_NESTING_OF_REGIONS = Boolean.toString(Boolean.TRUE);
private static final String MULTILEVEL_NESTING_OF_REGIONS = "multilevelNestingOfRegions"; //$NON-NLS-1$
private final IModuleStructureProvider moduleStructureProvider;
private final IV8ProjectManager v8ProjectManager;
@Inject
public ModuleStructureMethodInRegionCheck(IModuleStructureProvider moduleStructureProvider,
IV8ProjectManager v8ProjectManager)
{
super();
this.moduleStructureProvider = moduleStructureProvider;
this.v8ProjectManager = v8ProjectManager;
}
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.ModuleStructureMethodInRegionCheck_Title)
.description(
Messages.ModuleStructureMethodInRegionCheck_Description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.MINOR)
.issueType(IssueType.CODE_STYLE)
.extension(new ModuleTopObjectNameFilterExtension())
.extension(new StandardCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID))
.module()
.checkedObjectType(METHOD)
.parameter(MULTILEVEL_NESTING_OF_REGIONS, Boolean.class, DEFAULT_CHECK_NESTING_OF_REGIONS,
Messages.ModuleStructureMethodInRegionCheck_Multilevel_nesting_of_regions);
}
@Override
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
if (monitor.isCanceled())
{
return;
}
Method method = (Method)object;
IV8Project project = v8ProjectManager.getProject(method);
ScriptVariant scriptVariant = project.getScriptVariant();
ModuleType moduleType = getModuleType(method);
Collection<String> regionNames = moduleStructureProvider.getModuleStructureRegions(moduleType, scriptVariant);
boolean multilevel = parameters.getBoolean(MULTILEVEL_NESTING_OF_REGIONS);
Optional<RegionPreprocessor> region = multilevel ? getTopParentRegion(method) : getFirstParentRegion(method);
// An export method located out of region in a form and command module is checked
// by {@link ExportMethodInCommandFormModuleCheck}
if (region.isEmpty())
{
addIssue(resultAceptor, method, String.join(", ", regionNames)); //$NON-NLS-1$
}
else if (moduleType != ModuleType.FORM_MODULE && moduleType != ModuleType.COMMAND_MODULE)
{
String publicName = ModuleStructureSection.PUBLIC.getName(scriptVariant);
String internalName = ModuleStructureSection.INTERNAL.getName(scriptVariant);
String privateName = ModuleStructureSection.PRIVATE.getName(scriptVariant);
String regionName = region.get().getName();
if (!method.isExport() && (publicName.equals(regionName) || internalName.equals(regionName)))
{
resultAceptor.addIssue(
MessageFormat.format(Messages.ModuleStructureMethodInRegionCheck_Only_export, regionName),
McorePackage.Literals.NAMED_ELEMENT__NAME);
}
else if (method.isExport() && !(publicName.equals(regionName) || internalName.equals(regionName)
|| privateName.equals(regionName)))
{
addIssue(resultAceptor, method, String.join(", ", publicName, internalName, privateName)); //$NON-NLS-1$
}
}
}
private void addIssue(ResultAcceptor resultAceptor, Method method, String regions)
{
resultAceptor.addIssue(MessageFormat.format(
Messages.ModuleStructureMethodInRegionCheck_Method_should_be_placed_in_one_of_the_standard_regions,
method.getName(), regions), McorePackage.Literals.NAMED_ELEMENT__NAME);
}
}

View File

@ -219,6 +219,16 @@ ModuleStructureEventRegionsCheck_Only_event_methods__0=Only event methods can be
ModuleStructureEventRegionsCheck_Title=Checks the region of event handlers for the existence of methods related only to handlers
ModuleStructureMethodInRegionCheck_Description=Checks that the method is outside the standard region, and suggests placing the method in one of the standard regions for the current type of module
ModuleStructureMethodInRegionCheck_Method_should_be_placed_in_one_of_the_standard_regions=The method "{0}" should be placed in one of the standard regions: {1}
ModuleStructureMethodInRegionCheck_Multilevel_nesting_of_regions=Allow multilevel nesting of regions
ModuleStructureMethodInRegionCheck_Only_export=Only export methods can be placed in the "{0}" region
ModuleStructureMethodInRegionCheck_Title=Method is outside a standard region
NewColorCheck_Use_style_elements=To change the design, you should use style elements, and not set specific values directly in the controls
NewColorCheck_Use_style_elements_not_specific_values=To change the design, you should use style elements, and not set specific values directly in the controls. This is required in order for similar controls to look the same in all forms where they occur.

View File

@ -204,6 +204,14 @@ ModuleStructureTopRegionCheck_error_message = Стандартная облас
ModuleStructureTopRegionCheck_title = Стандартная область структуры модуля верхнеуровневая
ModuleStructureMethodInRegionCheck_Multilevel_nesting_of_regions = Разрешить многоуровневое вложение областей
ModuleStructureMethodInRegionCheck_Title = Метод вне области
ModuleStructureMethodInRegionCheck_Description = Проверяет что метод находится вне области, и предлагает поместить метод в одну из стандартных для текущего типа модуля область
ModuleStructureMethodInRegionCheck_Method_should_be_placed_in_one_of_the_standard_regions = Метод "{0}" необходимо разместить в одной из верхнеуровневых областей: {1}
ModuleUnusedLocalVariableCheck_Description = Проверка модуля на наличие неиспользуемых локальных переменных
ModuleUnusedLocalVariableCheck_Probably_variable_not_initilized_yet__0 = Возможно, переменная ''{0}'' еще не была проинициализирована

View File

@ -0,0 +1,204 @@
/*******************************************************************************
* Copyright (C) 2022, 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.check.itests;
import static org.junit.Assert.assertEquals;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.Path;
import org.junit.Before;
import org.junit.Test;
import com._1c.g5.v8.dt.core.platform.IDtProject;
import com._1c.g5.v8.dt.validation.marker.IExtraInfoKeys;
import com._1c.g5.v8.dt.validation.marker.Marker;
import com.e1c.g5.v8.dt.check.settings.CheckUid;
import com.e1c.g5.v8.dt.check.settings.ICheckSettings;
import com.e1c.g5.v8.dt.testing.check.SingleProjectReadOnlyCheckTestBase;
import com.e1c.v8codestyle.bsl.check.ModuleStructureMethodInRegionCheck;
import com.e1c.v8codestyle.internal.bsl.BslPlugin;
/**
* Tests for {@link ModuleStructureMethodInRegionCheck} check.
*
* @author Artem Iliukhin
*/
public class ModuleStructureMethodInRegionCheckTest
extends SingleProjectReadOnlyCheckTestBase
{
private static final String CHECK_ID = "module-structure-method-in-regions"; //$NON-NLS-1$
private static final String PROJECT_NAME = "ModuleStructureMethodInRegionCheck";
private static final String COMMON_MODULE_NO_REGION_FILE_NAME =
"/src/CommonModules/CommonModuleNoRegion/Module.bsl";
private static final String COMMON_MODULE_AFTER_REGION_FILE_NAME =
"/src/CommonModules/CommonModuleAfterRegion/Module.bsl";
private static final String CATALOG_MODULE_MANAGER_EVENT_OUT_REGION_FILE_NAME =
"/src/Catalogs/CatalogOutOfRegion/ManagerModule.bsl";
private static final String COMMON_MODULE_IN_REGION_FILE_NAME =
"/src/CommonModules/CommonModuleInRegion/Module.bsl";
private static final String COMMON_MODULE_EXPORT_IN_REGION_FILE_NAME =
"/src/CommonModules/CommonModuleExportInRegion/Module.bsl";
private static final String COMMON_MODULE_EXPORT_IN_NON_INTERFACE_REGION_FILE_NAME =
"/src/CommonModules/CommonModuleInNonInterfaceRegion/Module.bsl";
private static final String COMMAND_MODULE_OUT_OF_REGION_FILE_NAME =
"/src/CommonCommands/CommonCommand/CommandModule.bsl";
private static final String FORM_MODULE_OUT_OF_REGION_FILE_NAME =
"/src/Catalogs/CatalogOutOfRegion/Forms/ItemForm/Module.bsl";
private static final Object MULTILEVEL_NESTING_OF_REGIONS = "multilevelNestingOfRegions";
private static final String COMMON_MODULE_OUT_OF_MULTI_REGION_FILE_NAME =
"/src/CommonModules/CommonModulMultiLevel/Module.bsl";
private static final String COMMON_MODULE_OUT_OF_MULTI_REGION_NONCOMPLIENT_FILE_NAME =
"/src/CommonModules/CommonModuleMultiLevel1/Module.bsl";
@Override
protected String getTestConfigurationName()
{
return PROJECT_NAME;
}
@Before
public void setSettings()
{
IDtProject dtProject = getProject();
IProject project = dtProject.getWorkspaceProject();
ICheckSettings settings = checkRepository.getSettings(new CheckUid(CHECK_ID, BslPlugin.PLUGIN_ID), project);
settings.getParameters().get(MULTILEVEL_NESTING_OF_REGIONS).setValue(Boolean.toString(Boolean.TRUE));
checkRepository.applyChanges(Collections.singleton(settings), project);
waitForDD(dtProject);
}
@Test
public void testNoRegion() throws Exception
{
List<Marker> markers = getMarkers(COMMON_MODULE_NO_REGION_FILE_NAME);
assertEquals(1, markers.size());
assertEquals("1", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
public void testMethodAfterRegion() throws Exception
{
List<Marker> markers = getMarkers(COMMON_MODULE_AFTER_REGION_FILE_NAME);
assertEquals(1, markers.size());
assertEquals("5", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
public void testEventModuleManagerOutOfRegion() throws Exception
{
List<Marker> markers = getMarkers(CATALOG_MODULE_MANAGER_EVENT_OUT_REGION_FILE_NAME);
assertEquals(1, markers.size());
assertEquals("10", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
public void testExportMethodInNonInterfaceRegion() throws Exception
{
List<Marker> markers = getMarkers(COMMON_MODULE_EXPORT_IN_NON_INTERFACE_REGION_FILE_NAME);
assertEquals(1, markers.size());
assertEquals("3", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
public void testMethodInRegion() throws Exception
{
List<Marker> markers = getMarkers(COMMON_MODULE_IN_REGION_FILE_NAME);
assertEquals(1, markers.size());
assertEquals("3", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
public void testExportMethodInRegion() throws Exception
{
List<Marker> markers = getMarkers(COMMON_MODULE_EXPORT_IN_REGION_FILE_NAME);
assertEquals(0, markers.size());
}
@Test
public void testMethodOutOfRegionInForm() throws Exception
{
List<Marker> markers = getMarkers(FORM_MODULE_OUT_OF_REGION_FILE_NAME);
assertEquals(1, markers.size());
assertEquals("2", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
public void testMethodOutOfRegionInCommand() throws Exception
{
List<Marker> markers = getMarkers(COMMAND_MODULE_OUT_OF_REGION_FILE_NAME);
assertEquals(1, markers.size());
assertEquals("3", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
public void testMethodOutOfNonMultiRegionOption() throws Exception
{
IDtProject dtProject = getProject();
IProject project = dtProject.getWorkspaceProject();
ICheckSettings settings = checkRepository.getSettings(new CheckUid(CHECK_ID, BslPlugin.PLUGIN_ID), project);
settings.getParameters().get(MULTILEVEL_NESTING_OF_REGIONS).setValue(Boolean.toString(Boolean.FALSE));
checkRepository.applyChanges(Collections.singleton(settings), project);
waitForDD(dtProject);
List<Marker> markers = getMarkers(COMMON_MODULE_OUT_OF_MULTI_REGION_FILE_NAME);
assertEquals(0, markers.size());
}
@Test
public void testMethodOutOfNonMultiRegionOptionNonComplient() throws Exception
{
IDtProject dtProject = getProject();
IProject project = dtProject.getWorkspaceProject();
ICheckSettings settings = checkRepository.getSettings(new CheckUid(CHECK_ID, BslPlugin.PLUGIN_ID), project);
settings.getParameters().get(MULTILEVEL_NESTING_OF_REGIONS).setValue(Boolean.toString(Boolean.FALSE));
checkRepository.applyChanges(Collections.singleton(settings), project);
waitForDD(dtProject);
List<Marker> markers = getMarkers(COMMON_MODULE_OUT_OF_MULTI_REGION_NONCOMPLIENT_FILE_NAME);
assertEquals(1, markers.size());
assertEquals("6", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
public void testMethodOutOfMultiRegionOption() throws Exception
{
List<Marker> markers = getMarkers(COMMON_MODULE_OUT_OF_MULTI_REGION_FILE_NAME);
assertEquals(0, markers.size());
}
private List<Marker> getMarkers(String moduleFileName)
{
String moduleId = Path.ROOT.append(getTestConfigurationName()).append(moduleFileName).toString();
List<Marker> markers = List.of(markerManager.getMarkers(getProject().getWorkspaceProject(), moduleId));
return markers.stream()
.filter(marker -> CHECK_ID.equals(getCheckIdFromMarker(marker, getProject())))
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>ModuleStructureMethodInRegionCheck</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.xtext.ui.shared.xtextBuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.xtext.ui.shared.xtextNature</nature>
<nature>com._1c.g5.v8.dt.core.V8ConfigurationNature</nature>
</natures>
</projectDescription>

View File

@ -0,0 +1,2 @@
eclipse.preferences.version=1
encoding/<project>=UTF-8

View File

@ -0,0 +1,2 @@
Manifest-Version: 1.0
Runtime-Version: 8.3.19

View File

@ -0,0 +1,43 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Catalog xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="455d05d5-df0a-4930-bcaa-96fa060a66a4">
<producedTypes>
<objectType typeId="e139fc3a-546a-453f-a846-faaef7b1dd65" valueTypeId="e780f751-3b85-4010-92b2-c68fd33f5016"/>
<refType typeId="a886f0ea-88a3-42a5-aca5-352703c4e2de" valueTypeId="c9403923-f233-4e51-8450-41965fddd4e5"/>
<selectionType typeId="ec53fee4-3fbd-40a7-b5c5-13d177b92428" valueTypeId="b0531e68-dfcb-4d0a-bc68-d3223b871d34"/>
<listType typeId="17c20a4b-8f31-4756-9ad2-a48ded24e21d" valueTypeId="f5898cbd-b1cd-4dcf-9310-c15945c9bfc4"/>
<managerType typeId="54ee0ec3-c09e-4e95-83d1-b0686029fbae" valueTypeId="9b83bae2-1a84-41b2-a69b-917986ad93db"/>
</producedTypes>
<name>CatalogOutOfRegion</name>
<synonym>
<key>en</key>
<value>Catalog out of region</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<inputByString>Catalog.CatalogOutOfRegion.StandardAttribute.Code</inputByString>
<inputByString>Catalog.CatalogOutOfRegion.StandardAttribute.Description</inputByString>
<fullTextSearchOnInputByString>DontUse</fullTextSearchOnInputByString>
<createOnInput>Use</createOnInput>
<dataLockControlMode>Managed</dataLockControlMode>
<fullTextSearch>Use</fullTextSearch>
<levelCount>2</levelCount>
<foldersOnTop>true</foldersOnTop>
<codeLength>9</codeLength>
<descriptionLength>25</descriptionLength>
<codeType>String</codeType>
<codeAllowedLength>Variable</codeAllowedLength>
<checkUnique>true</checkUnique>
<autonumbering>true</autonumbering>
<defaultPresentation>AsDescription</defaultPresentation>
<editType>InDialog</editType>
<choiceMode>BothWays</choiceMode>
<defaultObjectForm>Catalog.CatalogOutOfRegion.Form.ItemForm</defaultObjectForm>
<forms uuid="c73c9f63-9a7b-4837-9c04-dcf1f4b51999">
<name>ItemForm</name>
<synonym>
<key>en</key>
<value>Item form</value>
</synonym>
<usePurposes>PersonalComputer</usePurposes>
<usePurposes>MobileDevice</usePurposes>
</forms>
</mdclass:Catalog>

View File

@ -0,0 +1,143 @@
<?xml version="1.0" encoding="UTF-8"?>
<form:Form xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:form="http://g5.1c.ru/v8/dt/form">
<items xsi:type="form:FormField">
<name>Code</name>
<id>1</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:DataPath">
<segments>Object.Code</segments>
</dataPath>
<extendedTooltip>
<name>CodeExtendedTooltip</name>
<id>3</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>CodeContextMenu</name>
<id>2</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>InputField</type>
<editMode>EnterOnInput</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:InputFieldExtInfo">
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<wrap>true</wrap>
<chooseType>true</chooseType>
<typeDomainEnabled>true</typeDomainEnabled>
<textEdit>true</textEdit>
</extInfo>
</items>
<items xsi:type="form:FormField">
<name>Description</name>
<id>4</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<dataPath xsi:type="form:DataPath">
<segments>Object.Description</segments>
</dataPath>
<extendedTooltip>
<name>DescriptionExtendedTooltip</name>
<id>6</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<type>Label</type>
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<extInfo xsi:type="form:LabelDecorationExtInfo">
<horizontalAlign>Left</horizontalAlign>
</extInfo>
</extendedTooltip>
<contextMenu>
<name>DescriptionContextMenu</name>
<id>5</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<autoFill>true</autoFill>
</contextMenu>
<type>InputField</type>
<editMode>EnterOnInput</editMode>
<showInHeader>true</showInHeader>
<headerHorizontalAlign>Left</headerHorizontalAlign>
<showInFooter>true</showInFooter>
<extInfo xsi:type="form:InputFieldExtInfo">
<autoMaxWidth>true</autoMaxWidth>
<autoMaxHeight>true</autoMaxHeight>
<wrap>true</wrap>
<chooseType>true</chooseType>
<typeDomainEnabled>true</typeDomainEnabled>
<textEdit>true</textEdit>
</extInfo>
</items>
<autoCommandBar>
<name>FormCommandBar</name>
<id>-1</id>
<visible>true</visible>
<enabled>true</enabled>
<userVisible>
<common>true</common>
</userVisible>
<horizontalAlign>Left</horizontalAlign>
<autoFill>true</autoFill>
</autoCommandBar>
<windowOpeningMode>LockOwnerWindow</windowOpeningMode>
<autoTitle>true</autoTitle>
<autoUrl>true</autoUrl>
<group>Vertical</group>
<autoFillCheck>true</autoFillCheck>
<allowFormCustomize>true</allowFormCustomize>
<enabled>true</enabled>
<showTitle>true</showTitle>
<showCloseButton>true</showCloseButton>
<attributes>
<name>Object</name>
<id>1</id>
<valueType>
<types>CatalogObject.CatalogOutOfRegion</types>
</valueType>
<view>
<common>true</common>
</view>
<edit>
<common>true</common>
</edit>
<main>true</main>
<savedData>true</savedData>
</attributes>
<commandInterface>
<navigationPanel/>
<commandBar/>
</commandInterface>
<extInfo xsi:type="form:CatalogFormExtInfo"/>
</form:Form>

View File

@ -0,0 +1,21 @@
#Region Public
// Enter code here.
#EndRegion
#Region EventHandlers
#EndRegion
Procedure FormGetProcessing(FormType, Parameters, SelectedForm, AdditionalInformation, StandardProcessing)
//TODO: Insert the handler content
EndProcedure
#Region Internal
// Enter code here.
#EndRegion
#Region Private
// Enter code here.
#EndRegion

View File

@ -0,0 +1,7 @@
&AtClient
Procedure CommandProcessing(CommandParameter, CommandExecuteParameters)
//TODO: Paste handler content.
//FormParameters = New Structure("", );
//OpenForm("CommonForm.", FormParameters, CommandExecuteParameters.Source, CommandExecuteParameters.Uniqueness, CommandExecuteParameters.Window, CommandExecuteParameters.URL);
EndProcedure

View File

@ -0,0 +1,10 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:CommonCommand xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ec274abb-481c-4ea9-b431-6952f7e6e9ad">
<name>CommonCommand</name>
<synonym>
<key>en</key>
<value>Common command</value>
</synonym>
<group>ActionsPanelTools</group>
<representation>Auto</representation>
</mdclass:CommonCommand>

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="f5d1162e-e7b6-4a08-8e17-cb944d7c82fc">
<name>CommonModulMultiLevel</name>
<synonym>
<key>en</key>
<value>Common modul multi level</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,12 @@
#Region Public
#Region SecondLevel
#EndRegion
Procedure Complient() Export
EndProcedure
#EndRegion

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="9a18ed1a-a7f9-4d19-8058-3289bcc24ce0">
<name>CommonModuleAfterRegion</name>
<synonym>
<key>en</key>
<value>Common module after region</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,7 @@
#Region Public
#EndRegion
Procedure NonComplient()
EndProcedure

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="7029f3d4-de6f-459f-9923-bf1d870af4ee">
<name>CommonModuleExportInRegion</name>
<synonym>
<key>en</key>
<value>Common module export in region</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,8 @@
#Region Public
Procedure Complient() Export
EndProcedure
#EndRegion

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="21389003-9e6b-4436-9cd6-632572dfeeea">
<name>CommonModuleInNonInterfaceRegion</name>
<synonym>
<key>en</key>
<value>Common module in non interface region</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,8 @@
#Region NonComplient
Procedure NonComplient() Export
EndProcedure
#EndRegion

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="ce0ad85f-b5ee-4f59-b409-f50ddd0539bd">
<name>CommonModuleInRegion</name>
<synonym>
<key>en</key>
<value>Common module in region</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,8 @@
#Region Public
Procedure NonComplient()
EndProcedure
#EndRegion

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="78b735dc-2bde-40f1-aa86-e0c8b7be24ae">
<name>CommonModuleMultiLevel1</name>
<synonym>
<key>en</key>
<value>Common module multi level1</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

@ -0,0 +1,12 @@
#Region Public
#Region SecondLevel
Procedure NonComplient() Export
EndProcedure
#EndRegion
#EndRegion

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="53ce0678-7770-4cc4-b995-b043254e7dfa">
<name>CommonModuleNoRegion</name>
<synonym>
<key>en</key>
<value>Common module no region</value>
</synonym>
<server>true</server>
<externalConnection>true</externalConnection>
<clientOrdinaryApplication>true</clientOrdinaryApplication>
</mdclass:CommonModule>

View File

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

View File

@ -0,0 +1,50 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="da3da622-85c7-4a68-9cb7-0ee5aa7448e7">
<name>StructureModule</name>
<synonym>
<key>en</key>
<value>Structure module</value>
</synonym>
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="11fab9f4-1ac8-4b90-974c-148dd1f1ee29"/>
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="23524e35-34a7-4bc8-94d1-c314704aad64"/>
<containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="bf5898bf-f470-4416-bbdf-78425a7ed95d"/>
<containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="b1d7c42c-2468-422c-aae9-22ca0f17d470"/>
<containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="95b2fb6a-d0b0-4bba-933f-f25846ff134c"/>
<containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="212dac74-8939-4083-bd96-464aef7f5c0a"/>
<containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="536422e3-5396-4bae-99a5-bdb058bfc993"/>
<configurationExtensionCompatibilityMode>8.3.20</configurationExtensionCompatibilityMode>
<defaultRunMode>ManagedApplication</defaultRunMode>
<usePurposes>PersonalComputer</usePurposes>
<usedMobileApplicationFunctionalities>
<functionality>
<use>true</use>
</functionality>
<functionality>
<functionality>OSBackup</functionality>
<use>true</use>
</functionality>
</usedMobileApplicationFunctionalities>
<defaultLanguage>Language.English</defaultLanguage>
<dataLockControlMode>Managed</dataLockControlMode>
<objectAutonumerationMode>NotAutoFree</objectAutonumerationMode>
<modalityUseMode>DontUse</modalityUseMode>
<synchronousPlatformExtensionAndAddInCallUseMode>DontUse</synchronousPlatformExtensionAndAddInCallUseMode>
<compatibilityMode>8.3.20</compatibilityMode>
<languages uuid="52ec6aa9-b177-434c-b409-1c456749c996">
<name>English</name>
<synonym>
<key>en</key>
<value>English</value>
</synonym>
<languageCode>en</languageCode>
</languages>
<commonModules>CommonModule.CommonModuleAfterRegion</commonModules>
<commonModules>CommonModule.CommonModuleExportInRegion</commonModules>
<commonModules>CommonModule.CommonModuleInNonInterfaceRegion</commonModules>
<commonModules>CommonModule.CommonModuleInRegion</commonModules>
<commonModules>CommonModule.CommonModuleNoRegion</commonModules>
<commonModules>CommonModule.CommonModulMultiLevel</commonModules>
<commonModules>CommonModule.CommonModuleMultiLevel1</commonModules>
<commonCommands>CommonCommand.CommonCommand</commonCommands>
<catalogs>Catalog.CatalogOutOfRegion</catalogs>
</mdclass:Configuration>

View File

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