1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2024-11-28 09:33:06 +02:00

#497 Метод или переменная доступны на Клиенте (#456)

* #319 Метод или переменная доступны на Клиенте
This commit is contained in:
Dmitriy Marmyshev 2021-12-14 09:59:43 +02:00 committed by GitHub
parent 5867c7707e
commit 1bdb27b7d9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
19 changed files with 601 additions and 0 deletions

View File

@ -63,6 +63,7 @@
- Использование директив компиляции модуля формы
- Всегда использовать директивы компиляции в модуле формы
- Описание оповещения на серверную процедуру
- Метод или переменная доступны НаКлиенте
#### Запросы

View File

@ -0,0 +1,53 @@
# Method or variable accessible AtClient
Method or variable accessible AtClient in manager or object module
## Noncompliant Code Example
```bsl
Var moduleVar;
Procedure BeforeDelete(Cancel)
// Non-compliant
EndProcedure
Procedure Noncompiant() Export
// empty
EndProcedure
moduleVar = Undefined;
```
## Compliant Solution
```bsl
#If Server Or ThickClientOrdinaryApplication Or ExternalConnection Then
Var moduleVar;
Procedure BeforeDelete(Cancel)
// Compliant
EndProcedure
Procedure Compiant() Export
// empty
EndProcedure
moduleVar = Undefined;
#Else
Raise NStr("en = 'Invalid object call on the client.'");
#EndIf
```
## See
- [Thick client support in managed applications that run in the client/server mode](https://1c-dn.com/library/thick_client_support_in_managed_applications_that_run_in_the_client_server_mode/)
- [Thick client support, managed application, client-server](https://support.1ci.com/hc/en-us/articles/360010988300-Thick-client-support-managed-application-client-server)
- [PresentationGetProcessing() and PresentationFieldsGetProcessing() event handlers](https://support.1ci.com/hc/en-us/articles/360011001340-PresentationGetProcessing-and-PresentationFieldsGetProcessing-event-handlers)

View File

@ -0,0 +1,48 @@
# Метод или переменная доступны НаКлиенте
Метод или переменная доступны НаКлиенте в модулях менеджера или объекта
## Неправильно
```bsl
Перем ПеременнаяМодуля;
Процедура ПередУдалением(Отказ)
// Неправильно
КонецПроцедуры
Процедура Неправильно() Экспорт
// пусто
КонецПроцедуры
ПеременнаяМодуля = Неопределено;
```
## Правильно
```bsl
#Если Сервер Или ТолстыйКлиентОбычноеПриложение Или ВнешнееСоединение Тогда
Перем ПеременнаяМодуля;
Процедура ПередУдалением(Отказ)
// Неправильно
КонецПроцедуры
Процедура Правильно() Экспорт
// пусто
КонецПроцедуры
ПеременнаяМодуля = Неопределено;
#Иначе
ВызватьИсключение НСтр("ru = 'Недопустимый вызов объекта на клиенте.'");
#КонецЕсли
```
## См.
- [Поддержка толстого клиента, управляемое приложение, клиент-сервер](https://its.1c.ru/db/v8std#content:680:hdoc:2)
- [Обработчики событий ОбработкаПолученияПредставления и ОбработкаПолученияПолейПредставления](https://its.1c.ru/db/v8std#content:746:hdoc)

View File

@ -30,6 +30,10 @@
id="com.e1c.v8codestyle.bsl.strict"
title="%category.bsl.strict.title">
</category>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.AccessibilityAtClientInObjectModuleCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.StructureCtorTooManyKeysCheck">

View File

@ -0,0 +1,169 @@
/*******************************************************************************
* Copyright (C) 2021, 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.DECLARE_STATEMENT;
import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.DECLARE_STATEMENT__VARIABLES;
import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.METHOD;
import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.NAMED_ELEMENT__NAME;
import java.util.Collection;
import java.util.Set;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.EcoreUtil2;
import com._1c.g5.v8.dt.bsl.common.IBslPreferences;
import com._1c.g5.v8.dt.bsl.model.DeclareStatement;
import com._1c.g5.v8.dt.bsl.model.Method;
import com._1c.g5.v8.dt.bsl.model.Module;
import com._1c.g5.v8.dt.bsl.model.ModuleType;
import com._1c.g5.v8.dt.bsl.model.Preprocessor;
import com._1c.g5.v8.dt.lcore.util.CaseInsensitiveString;
import com._1c.g5.v8.dt.mcore.Environmental;
import com._1c.g5.v8.dt.mcore.util.Environments;
import com.e1c.g5.v8.dt.check.CheckComplexity;
import com.e1c.g5.v8.dt.check.ICheckParameters;
import com.e1c.g5.v8.dt.check.components.BasicCheck;
import com.e1c.g5.v8.dt.check.settings.IssueSeverity;
import com.e1c.g5.v8.dt.check.settings.IssueType;
import com.google.inject.Inject;
/**
* Checks that method or declared variables accessible &AtClient in manager or object module.
*
* @author Dmitriy Marmyshev
* @author Victor Golubev
*/
public class AccessibilityAtClientInObjectModuleCheck
extends BasicCheck
{
private static final String CHECK_ID = "module-accessibility-at-client"; //$NON-NLS-1$
//@formatter:off
private static final Collection<CaseInsensitiveString> MANAGER_EVENT_EXCEPTION_NAMES = Set.of(
new CaseInsensitiveString("PresentationFieldsGetProcessing"), //$NON-NLS-1$
new CaseInsensitiveString("ОбработкаПолученияПолейПредставления"), //$NON-NLS-1$
new CaseInsensitiveString("PresentationGetProcessing"), //$NON-NLS-1$
new CaseInsensitiveString("ОбработкаПолученияПредставления"), //$NON-NLS-1$
new CaseInsensitiveString("FormGetProcessing"), //$NON-NLS-1$
new CaseInsensitiveString("ОбработкаПолученияФормы"), //$NON-NLS-1$
new CaseInsensitiveString("AfterWriteDataHistoryVersionsProcessing"), //$NON-NLS-1$
new CaseInsensitiveString("ОбработкаПослеЗаписиВерсийИсторииДанных"), //$NON-NLS-1$
new CaseInsensitiveString("ChoiceDataGetProcessing"), //$NON-NLS-1$
new CaseInsensitiveString("ОбработкаПолученияДанныхВыбора")); //$NON-NLS-1$
//@formatter:on
private final IBslPreferences bslPreferences;
/**
* Instantiates a new accessibility at client in object module check.
*
* @param bslPreferences the BSL preferences service, cannot be {@code null}.
*/
@Inject
public AccessibilityAtClientInObjectModuleCheck(IBslPreferences bslPreferences)
{
super();
this.bslPreferences = bslPreferences;
}
@Override
public String getCheckId()
{
return CHECK_ID;
}
@Override
protected void configureCheck(CheckConfigurer builder)
{
builder.title(Messages.AccessibilityAtClientInObjectModuleCheck_title)
.description(Messages.AccessibilityAtClientInObjectModuleCheck_description)
.complexity(CheckComplexity.NORMAL)
.severity(IssueSeverity.MINOR)
.issueType(IssueType.PORTABILITY)
.module()
.checkedObjectType(METHOD, DECLARE_STATEMENT);
}
@Override
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
EObject eObject = (EObject)object;
if (eObject instanceof DeclareStatement
&& (eObject instanceof Preprocessor || EcoreUtil2.getContainerOfType(eObject, Method.class) != null))
{
// Skip preprocessor declare statement or declared variables in method
return;
}
Module module = EcoreUtil2.getContainerOfType(eObject, Module.class);
if (!isValidModule(module) || monitor.isCanceled())
{
return;
}
Environmental environmental = EcoreUtil2.getContainerOfType(eObject, Environmental.class);
Environments enivronmetsObject = environmental.environments();
Environments checkingEnvs = bslPreferences.getLoadEnvs(eObject).intersect(Environments.MNG_CLIENTS);
boolean isClientEvent = isClientEvent(eObject, module);
boolean isAccessibleAtClient = enivronmetsObject.containsAny(checkingEnvs);
if (isClientEvent && !isAccessibleAtClient)
{
resultAceptor.addIssue(
Messages.AccessibilityAtClientInObjectModuleCheck_Event_handler_should_be_accessible_AtClient, eObject,
NAMED_ELEMENT__NAME);
}
else if (!isAccessibleAtClient || isClientEvent || monitor.isCanceled())
{
return;
}
if (eObject instanceof Method)
{
resultAceptor.addIssue(Messages.AccessibilityAtClientInObjectModuleCheck_Method_accessible_AtClient,
eObject, NAMED_ELEMENT__NAME);
}
else if (eObject instanceof DeclareStatement)
{
resultAceptor.addIssue(
Messages.AccessibilityAtClientInObjectModuleCheck_Declared_variable_accessible_AtClient, eObject,
DECLARE_STATEMENT__VARIABLES);
}
}
private boolean isValidModule(Module module)
{
ModuleType type = module.getModuleType();
return type == ModuleType.SESSION_MODULE || type == ModuleType.MANAGER_MODULE
|| type == ModuleType.OBJECT_MODULE || type == ModuleType.RECORDSET_MODULE;
}
private boolean isClientEvent(EObject object, Module module)
{
if (object instanceof Method && module.getModuleType() == ModuleType.MANAGER_MODULE)
{
Method method = (Method)object;
CaseInsensitiveString name = new CaseInsensitiveString(method.getName());
return MANAGER_EVENT_EXCEPTION_NAMES.contains(name);
}
return false;
}
}

View File

@ -24,6 +24,15 @@ final class Messages
{
private static final String BUNDLE_NAME = "com.e1c.v8codestyle.bsl.check.messages"; //$NON-NLS-1$
public static String AccessibilityAtClientInObjectModuleCheck_Declared_variable_accessible_AtClient;
public static String AccessibilityAtClientInObjectModuleCheck_description;
public static String AccessibilityAtClientInObjectModuleCheck_Event_handler_should_be_accessible_AtClient;
public static String AccessibilityAtClientInObjectModuleCheck_Method_accessible_AtClient;
public static String AccessibilityAtClientInObjectModuleCheck_title;
public static String CanonicalPragmaCheck_description;
public static String CanonicalPragmaCheck_Pragma_0_is_not_written_canonically_correct_spelling_is_1;
public static String CanonicalPragmaCheck_title;

View File

@ -1,3 +1,4 @@
#Generated by ResourceBundle Editor (http://essiembre.github.io/eclipse-rbe/)
###############################################################################
# Copyright (C) 2021, 1C-Soft LLC and others.
@ -13,6 +14,15 @@
# Aleksandr Kapralov - issue #17, #449, #458
# Viktor Gukov - issue #394
###############################################################################
AccessibilityAtClientInObjectModuleCheck_Declared_variable_accessible_AtClient = Declared variable accessible AtClient
AccessibilityAtClientInObjectModuleCheck_Event_handler_should_be_accessible_AtClient = Event handler should be accessible AtClient
AccessibilityAtClientInObjectModuleCheck_Method_accessible_AtClient = Method accessible AtClient
AccessibilityAtClientInObjectModuleCheck_description = Method or variable accessible AtClient in manager or object module
AccessibilityAtClientInObjectModuleCheck_title = Method or variable accessible AtClient
CanonicalPragmaCheck_Pragma_0_is_not_written_canonically_correct_spelling_is_1 = Annotation {0} is not written canonically, correct spelling is {1}

View File

@ -14,6 +14,16 @@
# Viktor Gukov - issue #394
###############################################################################
AccessibilityAtClientInObjectModuleCheck_Declared_variable_accessible_AtClient = Объявленная переменная доступна НаКлиенте
AccessibilityAtClientInObjectModuleCheck_Event_handler_should_be_accessible_AtClient = Обработчик события должен быть доступен НаКлиенте
AccessibilityAtClientInObjectModuleCheck_Method_accessible_AtClient = Метод доступен НаКлиенте
AccessibilityAtClientInObjectModuleCheck_description = Метод или переменная доступны НаКлиенте в модулях менеджера или объекта
AccessibilityAtClientInObjectModuleCheck_title = Метод или переменная доступны НаКлиенте
CanonicalPragmaCheck_Pragma_0_is_not_written_canonically_correct_spelling_is_1 = Аннотация {0} написана не канонически, правильное написание {1}
CanonicalPragmaCheck_description = Проверяет что аннотация метода написана канонически

View File

@ -0,0 +1,131 @@
/*******************************************************************************
* Copyright (C) 2021, 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 static org.junit.Assert.assertNotNull;
import java.util.List;
import java.util.stream.Collectors;
import org.eclipse.core.runtime.Path;
import org.junit.Ignore;
import org.junit.Test;
import com._1c.g5.v8.dt.validation.marker.IExtraInfoKeys;
import com._1c.g5.v8.dt.validation.marker.Marker;
import com.e1c.v8codestyle.bsl.check.AccessibilityAtClientInObjectModuleCheck;
/**
* Tests for {@link AccessibilityAtClientInObjectModuleCheck} check.
*
* @author Dmitriy Marmyshev
*/
public class AccessibilityAtClientInObjectModuleCheckTest
extends AbstractSingleModuleTestBase
{
private static final String PROJECT_NAME = "AccessibilityAtClient";
private static final String MANAGER_MODULE_FILE_NAME = "/src/Catalogs/Products/ManagerModule.bsl";
private static final String OBJECT_MODULE_FILE_NAME = "/src/Catalogs/Products/ObjectModule.bsl";
private static final String SESSION_MODULE_FILE_NAME = "/src/Configuration/SessionModule.bsl";
public AccessibilityAtClientInObjectModuleCheckTest()
{
super(AccessibilityAtClientInObjectModuleCheck.class);
}
@Override
protected String getTestConfigurationName()
{
return PROJECT_NAME;
}
@Override
protected String getModuleId()
{
return Path.ROOT.append(getTestConfigurationName()).append(MANAGER_MODULE_FILE_NAME).toString();
}
@Test
public void testObjectModule() throws Exception
{
List<Marker> markers = getObjectModuleMarkers();
assertEquals(3, markers.size());
Marker marker = markers.get(0);
assertEquals("5", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
marker = markers.get(1);
assertEquals("10", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
marker = markers.get(2);
assertEquals("2", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
public void testManagerModule() throws Exception
{
List<Marker> markers = getModuleMarkers();
assertEquals(4, markers.size());
Marker marker = markers.get(0);
assertEquals("2", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
marker = markers.get(1);
assertEquals("8", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
// FIXME remove this after 2021.3
marker = markers.get(2);
assertEquals("8", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
marker = markers.get(3);
assertEquals("22", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
@Test
@Ignore // all module is server in EDT
public void testSessionModule() throws Exception
{
List<Marker> markers = getSessionModuleMarkers();
assertEquals(1, markers.size());
Marker marker = markers.get(0);
assertEquals("10", marker.getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
}
private List<Marker> getObjectModuleMarkers()
{
String moduleId = Path.ROOT.append(getTestConfigurationName()).append(OBJECT_MODULE_FILE_NAME).toString();
List<Marker> markers = List.of(markerManager.getMarkers(getProject().getWorkspaceProject(), moduleId));
String chekcId = getCheckId();
assertNotNull(chekcId);
return markers.stream()
.filter(m -> chekcId.equals(getCheckIdFromMarker(m, getProject())))
.collect(Collectors.toList());
}
private List<Marker> getSessionModuleMarkers()
{
String moduleId = Path.ROOT.append(getTestConfigurationName()).append(SESSION_MODULE_FILE_NAME).toString();
List<Marker> markers = List.of(markerManager.getMarkers(getProject().getWorkspaceProject(), moduleId));
String chekcId = getCheckId();
assertNotNull(chekcId);
return markers.stream()
.filter(m -> chekcId.equals(getCheckIdFromMarker(m, getProject())))
.collect(Collectors.toList());
}
}

View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>AccessibilityAtClient</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,24 @@
Procedure Noncompiant() Export
// empty
EndProcedure
#If Server Or ThickClientOrdinaryApplication Or ExternalConnection Then
Procedure ChoiceDataGetProcessing(ChoiceData, Parameters, StandardProcessing)
// Non-complaint
EndProcedure
Procedure Compiant() Export
// empty
EndProcedure
#EndIf
Procedure FormGetProcessing(FormType, Parameters, SelectedForm, AdditionalInformation, StandardProcessing)
// Complaint
EndProcedure
Procedure Noncompiant2() Export
// empty
EndProcedure

View File

@ -0,0 +1,29 @@
Var moduleVar;
Procedure BeforeDelete(Cancel)
// Non-compliant
EndProcedure
Procedure Noncompiant() Export
// empty
EndProcedure
#If Server Or ThickClientOrdinaryApplication Or ExternalConnection Then
Procedure OnWrite(Cancel)
// Compliant
EndProcedure
Procedure Compiant() Export
// empty
EndProcedure
#Else
Raise NStr("en = 'Invalid object call on the client.'");
#EndIf
moduleVar = Undefined;

View File

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Catalog xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="ae2ab0d7-8ff2-47c9-9785-4fc6d9952479">
<producedTypes>
<objectType typeId="2d3b3c93-0355-4d8a-88f0-223cd16fdd13" valueTypeId="c5b80f0c-a916-4fe7-927f-f03d11570346"/>
<refType typeId="f80a1db2-6e25-42d2-8d2d-46e203ceba11" valueTypeId="27b96522-0509-42d1-a9da-3d53f1eebd63"/>
<selectionType typeId="fd8d69c7-90c6-4179-8e2b-5e94bc646999" valueTypeId="dcc8de93-1bde-4ca9-b4c1-941bde942174"/>
<listType typeId="42114f4b-4c08-4e7b-ac39-ccdc8be6f2b5" valueTypeId="6dcfd1ae-ca57-429f-813b-cd0590001736"/>
<managerType typeId="6477b8f1-ad26-46d9-8af2-c530999a0b0f" valueTypeId="1db39cbc-3397-4827-8b71-36f95c5852e7"/>
</producedTypes>
<name>Products</name>
<synonym>
<key>en</key>
<value>Products</value>
</synonym>
<useStandardCommands>true</useStandardCommands>
<inputByString>Catalog.Products.StandardAttribute.Code</inputByString>
<inputByString>Catalog.Products.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>
</mdclass:Catalog>

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,42 @@
<?xml version="1.0" encoding="UTF-8"?>
<mdclass:Configuration xmlns:mdclass="http://g5.1c.ru/v8/dt/metadata/mdclass" uuid="dbf807c7-3403-46ec-9438-762f95339f9a">
<name>AccessibilityAtClient</name>
<synonym>
<key>en</key>
<value>Accessibility at client</value>
</synonym>
<containedObjects classId="9cd510cd-abfc-11d4-9434-004095e12fc7" objectId="1e032eac-af6d-4142-b2db-503007b97787"/>
<containedObjects classId="9fcd25a0-4822-11d4-9414-008048da11f9" objectId="18edc1eb-82c8-4108-b865-48d3eaf60ad5"/>
<containedObjects classId="e3687481-0a87-462c-a166-9f34594f9bba" objectId="4e1e2046-252a-4dc4-a7e3-9d81d74a8826"/>
<containedObjects classId="9de14907-ec23-4a07-96f0-85521cb6b53b" objectId="0d9f0854-b8ca-4f36-ac09-1492932cbe68"/>
<containedObjects classId="51f2d5d8-ea4d-4064-8892-82951750031e" objectId="6d85c977-6f19-43ea-b8da-40abee52f24b"/>
<containedObjects classId="e68182ea-4237-4383-967f-90c1e3370bc7" objectId="d40728f5-9b55-40dc-912f-25a2a1e8b48b"/>
<containedObjects classId="fb282519-d103-4dd3-bc12-cb271d631dfc" objectId="a22e504a-45dc-4a29-80a4-b3acca1c431b"/>
<configurationExtensionCompatibilityMode>8.3.19</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.19</compatibilityMode>
<languages uuid="5671d618-72ac-4af6-beea-0a1feb9a95c4">
<name>English</name>
<synonym>
<key>en</key>
<value>English</value>
</synonym>
<languageCode>en</languageCode>
</languages>
<catalogs>Catalog.Products</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"/>

View File

@ -0,0 +1,12 @@
#If Server Or ThickClientOrdinaryApplication Or ExternalConnection Then
Procedure SessionParametersSetting(RequiredParameters)
// empty
EndProcedure
#EndIf
Procedure Noncompiant() Export
// empty
EndProcedure