mirror of
https://github.com/Nikolay-Shirokov/cc-1c-skills.git
synced 2026-09-18 07:35:52 +03:00
feat(meta-edit,meta-validate): типозависимый отказ на зарезервированные имена реквизитов
Имя собственного реквизита, совпадающее со стандартным (англ. ИЛИ рус., регистронезависимо), платформа не примет — теперь жёсткий отказ вместо предупреждения (как в meta-compile). meta-edit: reservedByContext (catalog/document) в Build-AttributeFragment; прочие контексты — прежнее предупреждение, реквизиты ТЧ не проверяются. meta-validate Check 7b: было плоско и только по англ. именам с Warn — стало типозависимо через standardAttributesByType, EN+RU, Report-Error. Проверка типозависима: «Номер» — легальный реквизит справочника (стандартный только у документа). Негативные кейсы error-reserved-attr (meta-edit + meta-validate с фикстурой). Регресс 11/11 и 13/13 ps1+py. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
c2703f043f
commit
d007da5eb8
@@ -1,4 +1,4 @@
|
|||||||
# meta-edit v1.9 — Edit existing 1C metadata object XML (inline mode + complex properties + TS attribute ops + modify-ts)
|
# meta-edit v1.10 — Edit existing 1C metadata object XML (inline mode + complex properties + TS attribute ops + modify-ts)
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[string]$DefinitionFile,
|
[string]$DefinitionFile,
|
||||||
@@ -890,19 +890,32 @@ $script:reservedAttrNames = @{
|
|||||||
"Account"="Счет"; "ValueType"="ТипЗначения"; "ActionPeriodIsBasic"="ПериодДействияБазовый"
|
"Account"="Счет"; "ValueType"="ТипЗначения"; "ActionPeriodIsBasic"="ПериодДействияБазовый"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Стандартные реквизиты по типу объекта (ключи из reservedAttrNames). Имя реквизита, совпадающее
|
||||||
|
# с ними (англ. ИЛИ рус.), платформа не позволит — жёсткий отказ. Контексты вне карты → предупреждение.
|
||||||
|
$script:reservedByContext = @{
|
||||||
|
"catalog" = @("Ref","DeletionMark","Predefined","PredefinedDataName","Code","Description","Owner","Parent","IsFolder")
|
||||||
|
"document" = @("Ref","DeletionMark","Date","Number","Posted")
|
||||||
|
}
|
||||||
|
|
||||||
function Build-AttributeFragment {
|
function Build-AttributeFragment {
|
||||||
param($parsed, [string]$context, [string]$indent)
|
param($parsed, [string]$context, [string]$indent)
|
||||||
|
|
||||||
if (-not $context) { $context = Get-AttributeContext }
|
if (-not $context) { $context = Get-AttributeContext }
|
||||||
|
|
||||||
# Check reserved attribute names
|
# Check reserved attribute names (типозависимо: catalog/document — жёсткий отказ; прочее — предупреждение)
|
||||||
$attrName = $parsed.name
|
$attrName = $parsed.name
|
||||||
if ($script:reservedAttrNames.ContainsKey($attrName)) {
|
$ctxReserved = $script:reservedByContext[$context]
|
||||||
Write-Warning "Attribute '$attrName' conflicts with a standard attribute name. This may cause errors when loading into 1C."
|
if ($ctxReserved) {
|
||||||
|
foreach ($en in $ctxReserved) {
|
||||||
|
$ru = $script:reservedAttrNames[$en]
|
||||||
|
if (($attrName -ieq $en) -or ($ru -and $attrName -ieq $ru)) {
|
||||||
|
Write-Error "Имя реквизита '$attrName' зарезервировано стандартным реквизитом ($en/$ru) объекта '$context'. Выберите другое имя."
|
||||||
|
exit 1
|
||||||
}
|
}
|
||||||
$ruValues = $script:reservedAttrNames.Values
|
}
|
||||||
if ($ruValues -contains $attrName) {
|
} elseif ($context -notin @("tabular", "processor-tabular") -and
|
||||||
Write-Warning "Attribute '$attrName' conflicts with a standard attribute name (Russian). This may cause errors when loading into 1C."
|
($script:reservedAttrNames.ContainsKey($attrName) -or ($script:reservedAttrNames.Values -contains $attrName))) {
|
||||||
|
Write-Warning "Attribute '$attrName' conflicts with a standard attribute name. This may cause errors when loading into 1C."
|
||||||
}
|
}
|
||||||
|
|
||||||
$uuid = New-Guid-String
|
$uuid = New-Guid-String
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
#!/usr/bin/env python3
|
#!/usr/bin/env python3
|
||||||
# meta-edit v1.9 — Edit existing 1C metadata object XML (inline mode + complex properties + TS attribute ops + modify-ts)
|
# meta-edit v1.10 — Edit existing 1C metadata object XML (inline mode + complex properties + TS attribute ops + modify-ts)
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
|
|
||||||
import argparse
|
import argparse
|
||||||
@@ -861,14 +861,43 @@ RESERVED_ATTR_NAMES_RU = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# Стандартные реквизиты по типу объекта (EN + RU). Совпадение имени реквизита с ними платформа
|
||||||
|
# не позволит — жёсткий отказ. Контексты вне карты → предупреждение по плоскому списку.
|
||||||
|
RESERVED_BY_CONTEXT = {
|
||||||
|
'catalog': {
|
||||||
|
'ref', 'ссылка',
|
||||||
|
'deletionmark', 'пометкаудаления',
|
||||||
|
'predefined', 'предопределенный',
|
||||||
|
'predefineddataname', 'имяпредопределенныхданных',
|
||||||
|
'code', 'код',
|
||||||
|
'description', 'наименование',
|
||||||
|
'owner', 'владелец',
|
||||||
|
'parent', 'родитель',
|
||||||
|
'isfolder', 'этогруппа',
|
||||||
|
},
|
||||||
|
'document': {
|
||||||
|
'ref', 'ссылка',
|
||||||
|
'deletionmark', 'пометкаудаления',
|
||||||
|
'date', 'дата',
|
||||||
|
'number', 'номер',
|
||||||
|
'posted', 'проведен',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
def build_attribute_fragment(parsed, context, indent):
|
def build_attribute_fragment(parsed, context, indent):
|
||||||
"""Build XML fragment string for an Attribute element."""
|
"""Build XML fragment string for an Attribute element."""
|
||||||
if not context:
|
if not context:
|
||||||
context = get_attribute_context()
|
context = get_attribute_context()
|
||||||
|
|
||||||
# Check reserved attribute names
|
# Check reserved attribute names (типозависимо: catalog/document — отказ; прочее — предупреждение)
|
||||||
attr_name = parsed['name']
|
attr_name = parsed['name']
|
||||||
if attr_name in RESERVED_ATTR_NAMES or attr_name in RESERVED_ATTR_NAMES_RU:
|
ctx_reserved = RESERVED_BY_CONTEXT.get(context)
|
||||||
|
if ctx_reserved is not None:
|
||||||
|
if attr_name.lower() in ctx_reserved:
|
||||||
|
print(f"meta-edit: имя реквизита '{attr_name}' зарезервировано стандартным реквизитом объекта '{context}'. Выберите другое имя.", file=sys.stderr)
|
||||||
|
sys.exit(1)
|
||||||
|
elif context not in ('tabular', 'processor-tabular') and (attr_name in RESERVED_ATTR_NAMES or attr_name in RESERVED_ATTR_NAMES_RU):
|
||||||
print(f"WARNING: Attribute '{attr_name}' conflicts with a standard attribute name. This may cause errors when loading into 1C.", file=sys.stderr)
|
print(f"WARNING: Attribute '{attr_name}' conflicts with a standard attribute name. This may cause errors when loading into 1C.", file=sys.stderr)
|
||||||
|
|
||||||
uid = new_uuid()
|
uid = new_uuid()
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# meta-validate v1.4 — Validate 1C metadata object structure
|
# meta-validate v1.5 — Validate 1C metadata object structure
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
param(
|
param(
|
||||||
[Parameter(Mandatory)]
|
[Parameter(Mandatory)]
|
||||||
@@ -699,17 +699,31 @@ if ($childObjNode) {
|
|||||||
|
|
||||||
if ($script:stopped) { & $finalize; exit 1 }
|
if ($script:stopped) { & $finalize; exit 1 }
|
||||||
|
|
||||||
# --- Check 7b: Reserved attribute names ---
|
# --- Check 7b: Reserved attribute names (типозависимо: стандартные реквизиты ДАННОГО типа, EN+RU) ---
|
||||||
|
# Совпадение имени собственного реквизита со стандартным (англ. или рус.) платформа не примет → ошибка.
|
||||||
|
|
||||||
$reservedAttrNames = @(
|
$reservedEnRu = @{
|
||||||
"Ref","DeletionMark","Code","Description","Date","Number","Posted","Parent","Owner",
|
"Ref"="Ссылка"; "DeletionMark"="ПометкаУдаления"; "Code"="Код"; "Description"="Наименование"
|
||||||
"IsFolder","Predefined","PredefinedDataName","Recorder","Period","LineNumber","Active",
|
"Date"="Дата"; "Number"="Номер"; "Posted"="Проведен"; "Parent"="Родитель"; "Owner"="Владелец"
|
||||||
"Order","Type","OffBalance","Started","Completed","HeadTask","Executed","RoutePoint",
|
"IsFolder"="ЭтоГруппа"; "Predefined"="Предопределенный"; "PredefinedDataName"="ИмяПредопределенныхДанных"
|
||||||
"BusinessProcess","ThisNode","SentNo","ReceivedNo","CalculationType","RegistrationPeriod",
|
"Recorder"="Регистратор"; "Period"="Период"; "LineNumber"="НомерСтроки"; "Active"="Активность"
|
||||||
"ReversingEntry","Account","ValueType","ActionPeriodIsBasic"
|
"Order"="Порядок"; "Type"="Тип"; "OffBalance"="Забалансовый"; "RecordType"="ВидДвижения"
|
||||||
)
|
"Started"="Стартован"; "Completed"="Завершен"; "HeadTask"="ВедущаяЗадача"
|
||||||
|
"Executed"="Выполнена"; "RoutePoint"="ТочкаМаршрута"; "BusinessProcess"="БизнесПроцесс"
|
||||||
|
"ThisNode"="ЭтотУзел"; "SentNo"="НомерОтправленного"; "ReceivedNo"="НомерПринятого"
|
||||||
|
"CalculationType"="ВидРасчета"; "RegistrationPeriod"="ПериодРегистрации"; "ReversingEntry"="СторноЗапись"
|
||||||
|
"Account"="Счет"; "ValueType"="ТипЗначения"; "ActionPeriodIsBasic"="ПериодДействияБазовый"
|
||||||
|
}
|
||||||
|
|
||||||
if ($childObjNode) {
|
$stdForType = $standardAttributesByType[$mdType]
|
||||||
|
if ($childObjNode -and $stdForType) {
|
||||||
|
# Множество зарезервированных имён (EN + RU) в нижнем регистре.
|
||||||
|
$reservedSet = @{}
|
||||||
|
foreach ($en in $stdForType) {
|
||||||
|
$reservedSet[$en.ToLower()] = $true
|
||||||
|
$ru = $reservedEnRu[$en]
|
||||||
|
if ($ru) { $reservedSet[$ru.ToLower()] = $true }
|
||||||
|
}
|
||||||
$check7bOk = $true
|
$check7bOk = $true
|
||||||
$attrNodes = $childObjNode.SelectNodes("md:Attribute", $ns)
|
$attrNodes = $childObjNode.SelectNodes("md:Attribute", $ns)
|
||||||
foreach ($attrNode in $attrNodes) {
|
foreach ($attrNode in $attrNodes) {
|
||||||
@@ -718,8 +732,8 @@ if ($childObjNode) {
|
|||||||
$attrNameNode = $attrProps.SelectSingleNode("md:Name", $ns)
|
$attrNameNode = $attrProps.SelectSingleNode("md:Name", $ns)
|
||||||
if ($attrNameNode -and $attrNameNode.InnerText) {
|
if ($attrNameNode -and $attrNameNode.InnerText) {
|
||||||
$an = $attrNameNode.InnerText
|
$an = $attrNameNode.InnerText
|
||||||
if ($reservedAttrNames -contains $an) {
|
if ($reservedSet.ContainsKey($an.ToLower())) {
|
||||||
Report-Warn "7b. Attribute '$an' conflicts with a standard attribute name"
|
Report-Error "7b. Attribute '$an' conflicts with a standard attribute of $mdType"
|
||||||
$check7bOk = $false
|
$check7bOk = $false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -728,6 +742,8 @@ if ($childObjNode) {
|
|||||||
if ($check7bOk) {
|
if ($check7bOk) {
|
||||||
Report-OK "7b. Reserved attribute names: no conflicts"
|
Report-OK "7b. Reserved attribute names: no conflicts"
|
||||||
}
|
}
|
||||||
|
} elseif ($childObjNode) {
|
||||||
|
Report-OK "7b. Reserved attribute names: no conflicts (no standard set for $mdType)"
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($script:stopped) { & $finalize; exit 1 }
|
if ($script:stopped) { & $finalize; exit 1 }
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# meta-validate v1.4 — Validate 1C metadata object structure (Python port)
|
# meta-validate v1.5 — Validate 1C metadata object structure (Python port)
|
||||||
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
|
||||||
import argparse
|
import argparse
|
||||||
import os
|
import os
|
||||||
@@ -676,18 +676,30 @@ if stopped:
|
|||||||
finalize()
|
finalize()
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
# ── Check 7b: Reserved attribute names ───────────────────────
|
# ── Check 7b: Reserved attribute names (типозависимо: стандартные ДАННОГО типа, EN+RU) ───────
|
||||||
|
# Совпадение имени собственного реквизита со стандартным (англ. или рус.) платформа не примет → ошибка.
|
||||||
|
|
||||||
RESERVED_ATTR_NAMES = {
|
RESERVED_EN_RU = {
|
||||||
'Ref', 'DeletionMark', 'Code', 'Description', 'Date', 'Number', 'Posted',
|
'Ref': 'Ссылка', 'DeletionMark': 'ПометкаУдаления', 'Code': 'Код', 'Description': 'Наименование',
|
||||||
'Parent', 'Owner', 'IsFolder', 'Predefined', 'PredefinedDataName',
|
'Date': 'Дата', 'Number': 'Номер', 'Posted': 'Проведен', 'Parent': 'Родитель', 'Owner': 'Владелец',
|
||||||
'Recorder', 'Period', 'LineNumber', 'Active', 'Order', 'Type', 'OffBalance',
|
'IsFolder': 'ЭтоГруппа', 'Predefined': 'Предопределенный', 'PredefinedDataName': 'ИмяПредопределенныхДанных',
|
||||||
'Started', 'Completed', 'HeadTask', 'Executed', 'RoutePoint', 'BusinessProcess',
|
'Recorder': 'Регистратор', 'Period': 'Период', 'LineNumber': 'НомерСтроки', 'Active': 'Активность',
|
||||||
'ThisNode', 'SentNo', 'ReceivedNo', 'CalculationType', 'RegistrationPeriod',
|
'Order': 'Порядок', 'Type': 'Тип', 'OffBalance': 'Забалансовый', 'RecordType': 'ВидДвижения',
|
||||||
'ReversingEntry', 'Account', 'ValueType', 'ActionPeriodIsBasic',
|
'Started': 'Стартован', 'Completed': 'Завершен', 'HeadTask': 'ВедущаяЗадача',
|
||||||
|
'Executed': 'Выполнена', 'RoutePoint': 'ТочкаМаршрута', 'BusinessProcess': 'БизнесПроцесс',
|
||||||
|
'ThisNode': 'ЭтотУзел', 'SentNo': 'НомерОтправленного', 'ReceivedNo': 'НомерПринятого',
|
||||||
|
'CalculationType': 'ВидРасчета', 'RegistrationPeriod': 'ПериодРегистрации', 'ReversingEntry': 'СторноЗапись',
|
||||||
|
'Account': 'Счет', 'ValueType': 'ТипЗначения', 'ActionPeriodIsBasic': 'ПериодДействияБазовый',
|
||||||
}
|
}
|
||||||
|
|
||||||
if child_obj_node is not None:
|
std_for_type = standard_attributes_by_type.get(md_type)
|
||||||
|
if child_obj_node is not None and std_for_type:
|
||||||
|
reserved_set = set()
|
||||||
|
for en in std_for_type:
|
||||||
|
reserved_set.add(en.lower())
|
||||||
|
ru = RESERVED_EN_RU.get(en)
|
||||||
|
if ru:
|
||||||
|
reserved_set.add(ru.lower())
|
||||||
check7b_ok = True
|
check7b_ok = True
|
||||||
for attr_node in find_all(child_obj_node, 'md:Attribute'):
|
for attr_node in find_all(child_obj_node, 'md:Attribute'):
|
||||||
attr_props = find(attr_node, 'md:Properties')
|
attr_props = find(attr_node, 'md:Properties')
|
||||||
@@ -695,11 +707,13 @@ if child_obj_node is not None:
|
|||||||
attr_name_node = find(attr_props, 'md:Name')
|
attr_name_node = find(attr_props, 'md:Name')
|
||||||
if attr_name_node is not None and inner_text(attr_name_node):
|
if attr_name_node is not None and inner_text(attr_name_node):
|
||||||
an = inner_text(attr_name_node)
|
an = inner_text(attr_name_node)
|
||||||
if an in RESERVED_ATTR_NAMES:
|
if an.lower() in reserved_set:
|
||||||
report_warn(f"7b. Attribute '{an}' conflicts with a standard attribute name")
|
report_error(f"7b. Attribute '{an}' conflicts with a standard attribute of {md_type}")
|
||||||
check7b_ok = False
|
check7b_ok = False
|
||||||
if check7b_ok:
|
if check7b_ok:
|
||||||
report_ok("7b. Reserved attribute names: no conflicts")
|
report_ok("7b. Reserved attribute names: no conflicts")
|
||||||
|
elif child_obj_node is not None:
|
||||||
|
report_ok(f"7b. Reserved attribute names: no conflicts (no standard set for {md_type})")
|
||||||
|
|
||||||
if stopped:
|
if stopped:
|
||||||
finalize()
|
finalize()
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "Ошибка: добавление реквизита с зарезервированным именем",
|
||||||
|
"preRun": [
|
||||||
|
{
|
||||||
|
"script": "meta-compile/scripts/meta-compile",
|
||||||
|
"input": { "type": "Catalog", "name": "Контрагенты" },
|
||||||
|
"args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"params": { "objectPath": "Catalogs/Контрагенты" },
|
||||||
|
"input": {
|
||||||
|
"add": { "attributes": ["Наименование: String(50)"] }
|
||||||
|
},
|
||||||
|
"expectError": "зарезервировано стандартным реквизитом"
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"name": "Валидатор находит ошибку: имя реквизита совпадает со стандартным",
|
||||||
|
"setup": "fixture:catalog-reserved-attr",
|
||||||
|
"params": { "objectPath": "Catalogs/РезервТест.xml" },
|
||||||
|
"expectError": true
|
||||||
|
}
|
||||||
+137
@@ -0,0 +1,137 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<MetaDataObject xmlns="http://v8.1c.ru/8.3/MDClasses" xmlns:app="http://v8.1c.ru/8.2/managed-application/core" xmlns:cfg="http://v8.1c.ru/8.1/data/enterprise/current-config" xmlns:cmi="http://v8.1c.ru/8.2/managed-application/cmi" xmlns:ent="http://v8.1c.ru/8.1/data/enterprise" xmlns:lf="http://v8.1c.ru/8.2/managed-application/logform" xmlns:style="http://v8.1c.ru/8.1/data/ui/style" xmlns:sys="http://v8.1c.ru/8.1/data/ui/fonts/system" xmlns:v8="http://v8.1c.ru/8.1/data/core" xmlns:v8ui="http://v8.1c.ru/8.1/data/ui" xmlns:web="http://v8.1c.ru/8.1/data/ui/colors/web" xmlns:win="http://v8.1c.ru/8.1/data/ui/colors/windows" xmlns:xen="http://v8.1c.ru/8.3/xcf/enums" xmlns:xpr="http://v8.1c.ru/8.3/xcf/predef" xmlns:xr="http://v8.1c.ru/8.3/xcf/readable" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.17">
|
||||||
|
<Catalog uuid="b2b644be-85ed-43ed-b4cf-0d94505f056e">
|
||||||
|
<InternalInfo>
|
||||||
|
<xr:GeneratedType name="CatalogObject.РезервТест" category="Object">
|
||||||
|
<xr:TypeId>50222869-fa45-4e19-b54c-f85738e99fe3</xr:TypeId>
|
||||||
|
<xr:ValueId>f047dcb9-ac0b-481d-b3dd-08b79d14ac1e</xr:ValueId>
|
||||||
|
</xr:GeneratedType>
|
||||||
|
<xr:GeneratedType name="CatalogRef.РезервТест" category="Ref">
|
||||||
|
<xr:TypeId>d51e0c65-0896-4595-8b99-3fd6bf35f714</xr:TypeId>
|
||||||
|
<xr:ValueId>4df96eb8-e5ed-4223-897b-c83e5b780fe8</xr:ValueId>
|
||||||
|
</xr:GeneratedType>
|
||||||
|
<xr:GeneratedType name="CatalogSelection.РезервТест" category="Selection">
|
||||||
|
<xr:TypeId>abda7247-b3d1-4e54-982c-c6c5f2182724</xr:TypeId>
|
||||||
|
<xr:ValueId>bb5893da-55cb-42c8-8f8f-d563768dcc39</xr:ValueId>
|
||||||
|
</xr:GeneratedType>
|
||||||
|
<xr:GeneratedType name="CatalogList.РезервТест" category="List">
|
||||||
|
<xr:TypeId>62af546e-4901-4bc5-9744-212a0c6b8a19</xr:TypeId>
|
||||||
|
<xr:ValueId>246cf98e-057d-4f40-baf0-3f48581b8202</xr:ValueId>
|
||||||
|
</xr:GeneratedType>
|
||||||
|
<xr:GeneratedType name="CatalogManager.РезервТест" category="Manager">
|
||||||
|
<xr:TypeId>4b7564c8-c0e0-46ac-a01e-3508311c59b7</xr:TypeId>
|
||||||
|
<xr:ValueId>097659cc-1974-4110-b0b3-d8ddf03718c0</xr:ValueId>
|
||||||
|
</xr:GeneratedType>
|
||||||
|
</InternalInfo>
|
||||||
|
<Properties>
|
||||||
|
<Name>РезервТест</Name>
|
||||||
|
<Synonym>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Резерв тест</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</Synonym>
|
||||||
|
<Comment/>
|
||||||
|
<Hierarchical>false</Hierarchical>
|
||||||
|
<HierarchyType>HierarchyFoldersAndItems</HierarchyType>
|
||||||
|
<LimitLevelCount>false</LimitLevelCount>
|
||||||
|
<LevelCount>2</LevelCount>
|
||||||
|
<FoldersOnTop>true</FoldersOnTop>
|
||||||
|
<UseStandardCommands>true</UseStandardCommands>
|
||||||
|
<Owners/>
|
||||||
|
<SubordinationUse>ToItems</SubordinationUse>
|
||||||
|
<CodeLength>9</CodeLength>
|
||||||
|
<DescriptionLength>25</DescriptionLength>
|
||||||
|
<CodeType>String</CodeType>
|
||||||
|
<CodeAllowedLength>Variable</CodeAllowedLength>
|
||||||
|
<CodeSeries>WholeCatalog</CodeSeries>
|
||||||
|
<CheckUnique>false</CheckUnique>
|
||||||
|
<Autonumbering>true</Autonumbering>
|
||||||
|
<DefaultPresentation>AsDescription</DefaultPresentation>
|
||||||
|
<Characteristics/>
|
||||||
|
<PredefinedDataUpdate>Auto</PredefinedDataUpdate>
|
||||||
|
<EditType>InDialog</EditType>
|
||||||
|
<QuickChoice>false</QuickChoice>
|
||||||
|
<ChoiceMode>BothWays</ChoiceMode>
|
||||||
|
<InputByString>
|
||||||
|
<xr:Field>Catalog.РезервТест.StandardAttribute.Description</xr:Field>
|
||||||
|
<xr:Field>Catalog.РезервТест.StandardAttribute.Code</xr:Field>
|
||||||
|
</InputByString>
|
||||||
|
<SearchStringModeOnInputByString>Begin</SearchStringModeOnInputByString>
|
||||||
|
<FullTextSearchOnInputByString>DontUse</FullTextSearchOnInputByString>
|
||||||
|
<ChoiceDataGetModeOnInputByString>Directly</ChoiceDataGetModeOnInputByString>
|
||||||
|
<DefaultObjectForm/>
|
||||||
|
<DefaultFolderForm/>
|
||||||
|
<DefaultListForm/>
|
||||||
|
<DefaultChoiceForm/>
|
||||||
|
<DefaultFolderChoiceForm/>
|
||||||
|
<AuxiliaryObjectForm/>
|
||||||
|
<AuxiliaryFolderForm/>
|
||||||
|
<AuxiliaryListForm/>
|
||||||
|
<AuxiliaryChoiceForm/>
|
||||||
|
<AuxiliaryFolderChoiceForm/>
|
||||||
|
<IncludeHelpInContents>false</IncludeHelpInContents>
|
||||||
|
<BasedOn/>
|
||||||
|
<DataLockFields/>
|
||||||
|
<DataLockControlMode>Automatic</DataLockControlMode>
|
||||||
|
<FullTextSearch>Use</FullTextSearch>
|
||||||
|
<ObjectPresentation/>
|
||||||
|
<ExtendedObjectPresentation/>
|
||||||
|
<ListPresentation/>
|
||||||
|
<ExtendedListPresentation/>
|
||||||
|
<Explanation/>
|
||||||
|
<CreateOnInput>Use</CreateOnInput>
|
||||||
|
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||||
|
<DataHistory>DontUse</DataHistory>
|
||||||
|
<UpdateDataHistoryImmediatelyAfterWrite>false</UpdateDataHistoryImmediatelyAfterWrite>
|
||||||
|
<ExecuteAfterWriteDataHistoryVersionProcessing>false</ExecuteAfterWriteDataHistoryVersionProcessing>
|
||||||
|
</Properties>
|
||||||
|
<ChildObjects>
|
||||||
|
<Attribute uuid="3ccf72e0-f87a-4871-a610-efb018858a6b">
|
||||||
|
<Properties>
|
||||||
|
<Name>Код</Name>
|
||||||
|
<Synonym>
|
||||||
|
<v8:item>
|
||||||
|
<v8:lang>ru</v8:lang>
|
||||||
|
<v8:content>Приоритет</v8:content>
|
||||||
|
</v8:item>
|
||||||
|
</Synonym>
|
||||||
|
<Comment/>
|
||||||
|
<Type>
|
||||||
|
<v8:Type>xs:decimal</v8:Type>
|
||||||
|
<v8:NumberQualifiers>
|
||||||
|
<v8:Digits>5</v8:Digits>
|
||||||
|
<v8:FractionDigits>0</v8:FractionDigits>
|
||||||
|
<v8:AllowedSign>Any</v8:AllowedSign>
|
||||||
|
</v8:NumberQualifiers>
|
||||||
|
</Type>
|
||||||
|
<PasswordMode>false</PasswordMode>
|
||||||
|
<Format/>
|
||||||
|
<EditFormat/>
|
||||||
|
<ToolTip/>
|
||||||
|
<MarkNegatives>false</MarkNegatives>
|
||||||
|
<Mask/>
|
||||||
|
<MultiLine>false</MultiLine>
|
||||||
|
<ExtendedEdit>false</ExtendedEdit>
|
||||||
|
<MinValue xsi:nil="true"/>
|
||||||
|
<MaxValue xsi:nil="true"/>
|
||||||
|
<FillFromFillingValue>false</FillFromFillingValue>
|
||||||
|
<FillValue xsi:type="xs:decimal">0</FillValue>
|
||||||
|
<FillChecking>DontCheck</FillChecking>
|
||||||
|
<ChoiceFoldersAndItems>Items</ChoiceFoldersAndItems>
|
||||||
|
<ChoiceParameterLinks/>
|
||||||
|
<ChoiceParameters/>
|
||||||
|
<QuickChoice>Auto</QuickChoice>
|
||||||
|
<CreateOnInput>Auto</CreateOnInput>
|
||||||
|
<ChoiceForm/>
|
||||||
|
<LinkByType/>
|
||||||
|
<ChoiceHistoryOnInput>Auto</ChoiceHistoryOnInput>
|
||||||
|
<Use>ForItem</Use>
|
||||||
|
<Indexing>DontIndex</Indexing>
|
||||||
|
<FullTextSearch>Use</FullTextSearch>
|
||||||
|
<DataHistory>Use</DataHistory>
|
||||||
|
</Properties>
|
||||||
|
</Attribute>
|
||||||
|
</ChildObjects>
|
||||||
|
</Catalog>
|
||||||
|
</MetaDataObject>
|
||||||
Reference in New Issue
Block a user