diff --git a/.claude/skills/meta-compile/scripts/meta-compile.ps1 b/.claude/skills/meta-compile/scripts/meta-compile.ps1
index bf989b91..e3bfd801 100644
--- a/.claude/skills/meta-compile/scripts/meta-compile.ps1
+++ b/.claude/skills/meta-compile/scripts/meta-compile.ps1
@@ -1,4 +1,4 @@
-# meta-compile v1.53 — Compile 1C metadata object from JSON
+# meta-compile v1.54 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
param(
[Parameter(Mandatory)]
@@ -197,6 +197,7 @@ $script:objectTypeSynonyms = @{
"HTTPСервис" = "HTTPService"
"ВебСервис" = "WebService"
"ОпределяемыйТип" = "DefinedType"
+ "ФункциональнаяОпция" = "FunctionalOption"
}
# Enum property value synonyms — model often gets these slightly wrong
@@ -346,7 +347,7 @@ $validTypes = @("Catalog","Document","Enum","Constant","InformationRegister","Ac
"AccountingRegister","CalculationRegister","ChartOfAccounts","ChartOfCharacteristicTypes",
"ChartOfCalculationTypes","BusinessProcess","Task","ExchangePlan","DocumentJournal",
"Report","DataProcessor","CommonModule","ScheduledJob","EventSubscription",
- "HTTPService","WebService","DefinedType")
+ "HTTPService","WebService","DefinedType","FunctionalOption")
if ($objType -notin $validTypes) {
Write-Error "Unsupported type: $objType. Valid: $($validTypes -join ', ')"
exit 1
@@ -680,6 +681,31 @@ $script:fillEmptyRefWords = @('emptyref','пустаяссылка')
$script:fillEnumValWords = @('enumvalue','значениеперечисления')
$script:fillBoolTrue = @('true','истина','да')
$script:fillBoolFalse = @('false','ложь','нет')
+# Прощающий ввод MDObjectRef-путей (Location/Content функц. опции, registerRecords и т.п.): русские корни
+# метаданных + подвиды → английские. Виды стоят на ЧЁТНЫХ позициях (0,2,4…), имена (нечётные) не трогаем.
+# Английские пути проходят без изменений (в мапе только русские ключи) → роундтрип byte-exact сохраняется.
+$script:mdRefRoots = @{
+ 'справочник'='Catalog'; 'документ'='Document'; 'перечисление'='Enum'; 'константа'='Constant';
+ 'регистрсведений'='InformationRegister'; 'регистрнакопления'='AccumulationRegister';
+ 'регистрбухгалтерии'='AccountingRegister'; 'регистррасчета'='CalculationRegister'; 'регистррасчёта'='CalculationRegister';
+ 'плансчетов'='ChartOfAccounts'; 'планвидовхарактеристик'='ChartOfCharacteristicTypes';
+ 'планвидоврасчета'='ChartOfCalculationTypes'; 'планвидоврасчёта'='ChartOfCalculationTypes';
+ 'планобмена'='ExchangePlan'; 'бизнеспроцесс'='BusinessProcess'; 'задача'='Task';
+ 'журналдокументов'='DocumentJournal'; 'отчет'='Report'; 'отчёт'='Report'; 'обработка'='DataProcessor';
+ 'табличнаячасть'='TabularSection'; 'реквизит'='Attribute'; 'измерение'='Dimension'; 'ресурс'='Resource';
+ 'стандартныйреквизит'='StandardAttribute'; 'значениеперечисления'='EnumValue'; 'команда'='Command';
+ 'признакучета'='AccountingFlag'; 'признакучёта'='AccountingFlag'
+}
+function Normalize-MDObjectRef {
+ param([string]$ref)
+ if (-not $ref -or -not $ref.Contains('.')) { return $ref }
+ $parts = $ref -split '\.'
+ for ($k = 0; $k -lt $parts.Count; $k += 2) {
+ $t = $script:mdRefRoots[$parts[$k].ToLower()]
+ if ($t) { $parts[$k] = $t }
+ }
+ return ($parts -join '.')
+}
# Значения платформенного перечисления ВидСчета (ent:AccountType) — FillValue стандартного реквизита Тип у Плана счетов.
$script:accountTypeValues = @('Active','Passive','ActivePassive')
# XxxRef (тип реквизита) → корень DTR-пути (для разворота короткой записи значения).
@@ -2472,6 +2498,31 @@ function Emit-DefinedTypeProperties {
if ($vt) { Emit-ValueType $i $vt } else { X "$i" }
}
+function Emit-FunctionalOptionProperties {
+ param([string]$indent)
+ $i = $indent
+
+ X "$i$(Esc-Xml $objName)"
+ Emit-MLText $i "Synonym" $synonym
+ if ($def.comment) { X "$i$(Esc-XmlText $def.comment)" } else { X "$i" }
+ # Location — хранилище значения опции (Constant.X / InformationRegister.X.Resource.Y / <Тип>.X.Attribute.Y).
+ # Ссылка verbatim (MDObjectRef-путь; принимаем location или value).
+ $loc = if ($def.location) { "$($def.location)" } elseif ($def.value) { "$($def.value)" } else { "" }
+ if ($loc) { X "$i$(Esc-Xml (Normalize-MDObjectRef $loc))" } else { X "$i" }
+ # PrivilegedGetMode — привилегированный режим чтения (корпус 2864/2864 = true → дефолт true).
+ X "$i$(if (Get-BoolProp 'privilegedGetMode' $true) { 'true' } else { 'false' })"
+ # Content — объекты, зависящие от опции (список MDObjectRef-путей к реквизитам/измерениям/ресурсам). omit-on-empty.
+ $content = @()
+ if ($def.content) { $content = @($def.content) }
+ if ($content.Count -gt 0) {
+ X "$i"
+ foreach ($obj in $content) { X "$i`t$(Esc-Xml (Normalize-MDObjectRef "$obj"))" }
+ X "$i"
+ } else {
+ X "$i"
+ }
+}
+
function Emit-CommonModuleProperties {
param([string]$indent)
$i = $indent
@@ -3565,6 +3616,7 @@ switch ($objType) {
"InformationRegister" { Emit-InformationRegisterProperties "`t`t`t" }
"AccumulationRegister" { Emit-AccumulationRegisterProperties "`t`t`t" }
"DefinedType" { Emit-DefinedTypeProperties "`t`t`t" }
+ "FunctionalOption" { Emit-FunctionalOptionProperties "`t`t`t" }
"CommonModule" { Emit-CommonModuleProperties "`t`t`t" }
"ScheduledJob" { Emit-ScheduledJobProperties "`t`t`t" }
"EventSubscription" { Emit-EventSubscriptionProperties "`t`t`t" }
@@ -3848,6 +3900,7 @@ $script:typePluralMap = @{
"HTTPService" = "HTTPServices"
"WebService" = "WebServices"
"DefinedType" = "DefinedTypes"
+ "FunctionalOption" = "FunctionalOptions"
}
$typePlural = $script:typePluralMap[$objType]
diff --git a/.claude/skills/meta-compile/scripts/meta-compile.py b/.claude/skills/meta-compile/scripts/meta-compile.py
index 3213e62e..5a03f2a0 100644
--- a/.claude/skills/meta-compile/scripts/meta-compile.py
+++ b/.claude/skills/meta-compile/scripts/meta-compile.py
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
-# meta-compile v1.53 — Compile 1C metadata object from JSON
+# meta-compile v1.54 — Compile 1C metadata object from JSON
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
import argparse
@@ -314,6 +314,7 @@ object_type_synonyms = {
'HTTPСервис': 'HTTPService',
'ВебСервис': 'WebService',
'ОпределяемыйТип': 'DefinedType',
+ 'ФункциональнаяОпция': 'FunctionalOption',
}
# Enum property value synonyms — model often gets these slightly wrong
@@ -460,6 +461,7 @@ valid_types = [
'BusinessProcess', 'Task', 'ExchangePlan', 'DocumentJournal',
'Report', 'DataProcessor', 'CommonModule', 'ScheduledJob',
'EventSubscription', 'HTTPService', 'WebService', 'DefinedType',
+ 'FunctionalOption',
]
if obj_type not in valid_types:
print(f"Unsupported type: {obj_type}. Valid: {', '.join(valid_types)}", file=sys.stderr)
@@ -707,6 +709,30 @@ fill_empty_ref_words = ('emptyref', 'пустаяссылка')
fill_enum_val_words = ('enumvalue', 'значениеперечисления')
fill_bool_true = ('true', 'истина', 'да')
fill_bool_false = ('false', 'ложь', 'нет')
+# Прощающий ввод MDObjectRef-путей (Location/Content функц. опции): русские корни метаданных + подвиды →
+# английские. Виды на ЧЁТНЫХ позициях (0,2,4…); имена (нечётные) не трогаем. Английские пути неизменны.
+md_ref_roots = {
+ 'справочник': 'Catalog', 'документ': 'Document', 'перечисление': 'Enum', 'константа': 'Constant',
+ 'регистрсведений': 'InformationRegister', 'регистрнакопления': 'AccumulationRegister',
+ 'регистрбухгалтерии': 'AccountingRegister', 'регистррасчета': 'CalculationRegister', 'регистррасчёта': 'CalculationRegister',
+ 'плансчетов': 'ChartOfAccounts', 'планвидовхарактеристик': 'ChartOfCharacteristicTypes',
+ 'планвидоврасчета': 'ChartOfCalculationTypes', 'планвидоврасчёта': 'ChartOfCalculationTypes',
+ 'планобмена': 'ExchangePlan', 'бизнеспроцесс': 'BusinessProcess', 'задача': 'Task',
+ 'журналдокументов': 'DocumentJournal', 'отчет': 'Report', 'отчёт': 'Report', 'обработка': 'DataProcessor',
+ 'табличнаячасть': 'TabularSection', 'реквизит': 'Attribute', 'измерение': 'Dimension', 'ресурс': 'Resource',
+ 'стандартныйреквизит': 'StandardAttribute', 'значениеперечисления': 'EnumValue', 'команда': 'Command',
+ 'признакучета': 'AccountingFlag', 'признакучёта': 'AccountingFlag',
+}
+
+def normalize_md_object_ref(ref):
+ if not ref or '.' not in ref:
+ return ref
+ parts = ref.split('.')
+ for k in range(0, len(parts), 2):
+ t = md_ref_roots.get(parts[k].lower())
+ if t:
+ parts[k] = t
+ return '.'.join(parts)
# Значения платформенного перечисления ВидСчета (ent:AccountType) — FillValue реквизита Тип у Плана счетов.
ACCOUNT_TYPE_VALUES = ('Active', 'Passive', 'ActivePassive')
# «Только обороты» () — предопределённый признак учёта субконто; токен в списке flags наравне с добавленными.
@@ -2469,6 +2495,32 @@ def emit_defined_type_properties(indent):
else:
X(f'{i}')
+def emit_functional_option_properties(indent):
+ i = indent
+ X(f'{i}{esc_xml(obj_name)}')
+ emit_mltext(i, 'Synonym', synonym)
+ if defn.get('comment'):
+ X(f'{i}{esc_xml_text(str(defn["comment"]))}')
+ else:
+ X(f'{i}')
+ # Location — хранилище значения опции (ссылка verbatim; location или value).
+ loc = str(defn['location']) if defn.get('location') else (str(defn['value']) if defn.get('value') else '')
+ if loc:
+ X(f'{i}{esc_xml(normalize_md_object_ref(loc))}')
+ else:
+ X(f'{i}')
+ # PrivilegedGetMode — дефолт true (корпус 2864/2864).
+ X(f'{i}{"true" if get_bool_prop("privilegedGetMode", True) else "false"}')
+ # Content — зависимые объекты (список MDObjectRef-путей). omit-on-empty.
+ content = list(defn['content']) if defn.get('content') else []
+ if content:
+ X(f'{i}')
+ for obj in content:
+ X(f'{i}\t{esc_xml(normalize_md_object_ref(str(obj)))}')
+ X(f'{i}')
+ else:
+ X(f'{i}')
+
def emit_common_module_properties(indent):
i = indent
X(f'{i}{esc_xml(obj_name)}')
@@ -3418,6 +3470,7 @@ property_emitters = {
'InformationRegister': emit_information_register_properties,
'AccumulationRegister': emit_accumulation_register_properties,
'DefinedType': emit_defined_type_properties,
+ 'FunctionalOption': emit_functional_option_properties,
'CommonModule': emit_common_module_properties,
'ScheduledJob': emit_scheduled_job_properties,
'EventSubscription': emit_event_subscription_properties,
@@ -3687,6 +3740,7 @@ type_plural_map = {
'HTTPService': 'HTTPServices',
'WebService': 'WebServices',
'DefinedType': 'DefinedTypes',
+ 'FunctionalOption': 'FunctionalOptions',
}
type_plural = type_plural_map[obj_type]
diff --git a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1 b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1
index bd18580b..db280c50 100644
--- a/.claude/skills/meta-decompile/scripts/meta-decompile.ps1
+++ b/.claude/skills/meta-decompile/scripts/meta-decompile.ps1
@@ -1,4 +1,4 @@
-# meta-decompile v0.44 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
+# meta-decompile v0.45 — XML объекта метаданных 1С → JSON-черновик формата meta-compile
# Source: https://github.com/Nikolay-Shirokov/cc-1c-skills
#
# Поддержаны: Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document,
@@ -92,8 +92,8 @@ foreach ($c in $rootEl.ChildNodes) { if ($c.NodeType -eq 'Element') { $objNode =
if (-not $objNode) { [Console]::Error.WriteLine("meta-decompile: пустой MetaDataObject"); exit 3 }
$objType = $objNode.LocalName
-if ($objType -notin @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts', 'ChartOfCalculationTypes', 'Document', 'InformationRegister', 'AccumulationRegister', 'AccountingRegister', 'CalculationRegister', 'BusinessProcess', 'Task', 'Enum', 'Report', 'DataProcessor', 'Constant', 'DefinedType')) {
- [Console]::Error.WriteLine("meta-decompile: тип '$objType' пока не поддержан (Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document, InformationRegister, AccumulationRegister, AccountingRegister, CalculationRegister, BusinessProcess, Task, Enum, Report, DataProcessor, Constant, DefinedType)"); exit 3
+if ($objType -notin @('Catalog', 'ExchangePlan', 'ChartOfCharacteristicTypes', 'ChartOfAccounts', 'ChartOfCalculationTypes', 'Document', 'InformationRegister', 'AccumulationRegister', 'AccountingRegister', 'CalculationRegister', 'BusinessProcess', 'Task', 'Enum', 'Report', 'DataProcessor', 'Constant', 'DefinedType', 'FunctionalOption')) {
+ [Console]::Error.WriteLine("meta-decompile: тип '$objType' пока не поддержан (Catalog, ExchangePlan, ChartOfCharacteristicTypes, ChartOfAccounts, ChartOfCalculationTypes, Document, InformationRegister, AccumulationRegister, AccountingRegister, CalculationRegister, BusinessProcess, Task, Enum, Report, DataProcessor, Constant, DefinedType, FunctionalOption)"); exit 3
}
$props = $objNode.SelectSingleNode('md:Properties', $nsm)
@@ -599,6 +599,16 @@ if ($objType -eq 'DefinedType') {
$vt = Get-TypeShorthand ($props.SelectSingleNode('md:Type', $nsm))
if ($vt) { $dsl['valueType'] = $vt }
}
+# FunctionalOption — функциональная опция: Location (хранилище значения) + PrivilegedGetMode + Content (зависимые объекты).
+if ($objType -eq 'FunctionalOption') {
+ $loc = P 'Location'; if ($loc) { $dsl['location'] = $loc }
+ Add-BoolProp 'privilegedGetMode' 'PrivilegedGetMode' $true # корпус 2864/2864 true → дефолт true, ловим false
+ $contentNode = $props.SelectSingleNode('md:Content', $nsm)
+ if ($contentNode) {
+ $items = @($contentNode.SelectNodes('xr:Object', $nsm) | ForEach-Object { $_.InnerText })
+ if ($items.Count -gt 0) { $dsl['content'] = [System.Collections.ArrayList]@($items) }
+ }
+}
# Constant — богатый одиночный реквизит: Type + свойства значения (как у реквизита) + object-уровень.
if ($objType -eq 'Constant') {
$vt = Get-TypeShorthand ($props.SelectSingleNode('md:Type', $nsm))
diff --git a/docs/meta-dsl-spec.md b/docs/meta-dsl-spec.md
index 4f6d93ec..a4a1bab2 100644
--- a/docs/meta-dsl-spec.md
+++ b/docs/meta-dsl-spec.md
@@ -963,6 +963,29 @@ true); `characteristics` (§7.1.4); `basedOn`/`inputByString`/`dataLockFields` (
{ "type": "DefinedType", "name": "ФлагАктивности", "valueType": "Boolean" }
```
+### 7.7a FunctionalOption (Функциональная опция)
+
+Функциональная опция: хранилище значения (Location) + список зависимых объектов (Content). Без InternalInfo,
+ChildObjects и модулей.
+
+| Поле JSON | Умолчание | XML элемент |
+|-----------|----------|-------------|
+| `location` | `""` | Location — где хранится значение опции: `Constant.X` / `InformationRegister.X.Resource.Y` / `<Тип>.X.Attribute.Y` (алиас `value`) |
+| `content` | `[]` | Content — массив MDObjectRef-путей к реквизитам/измерениям/ресурсам, зависящим от опции (``) |
+| `privilegedGetMode` | `true` | PrivilegedGetMode |
+| `comment` | пусто | Comment |
+
+`location`/`content` — **полные MDObjectRef-пути к внешним объектам** (короткой self-формы нет — опция ссылается
+на реквизиты чужих объектов). Прощающий ввод: русские корни метаданных и подвидов (Документ→Document,
+ТабличнаяЧасть→TabularSection, Реквизит→Attribute, Измерение→Dimension, Ресурс→Resource, Константа→Constant, …);
+имена объектов не трогаются.
+
+```json
+{ "type": "FunctionalOption", "name": "ВестиУчетПоСкладам", "location": "Constant.ВестиУчетПоСкладам",
+ "content": ["Документ.РеализацияТоваров.ТабличнаяЧасть.Товары.Реквизит.Склад",
+ "РегистрНакопления.ОстаткиТоваров.Измерение.Склад"] }
+```
+
### 7.8 CommonModule
| Поле JSON | Умолчание | XML элемент |
diff --git a/tests/skills/cases/meta-compile/functional-option.json b/tests/skills/cases/meta-compile/functional-option.json
new file mode 100644
index 00000000..55d6a2b7
--- /dev/null
+++ b/tests/skills/cases/meta-compile/functional-option.json
@@ -0,0 +1,17 @@
+{
+ "name": "Функциональная опция с составом",
+ "input": {
+ "type": "FunctionalOption",
+ "name": "ВестиУчетПоСкладам",
+ "comment": "(Демо)",
+ "location": "Constant.ВестиУчетПоСкладам",
+ "content": [
+ "Document.РеализацияТоваров.TabularSection.Товары.Attribute.Склад",
+ "AccumulationRegister.ОстаткиТоваров.Dimension.Склад"
+ ]
+ },
+ "validatePath": "FunctionalOptions/ВестиУчетПоСкладам",
+ "expect": {
+ "files": ["FunctionalOptions/ВестиУчетПоСкладам.xml"]
+ }
+}
diff --git a/tests/skills/cases/meta-compile/snapshots/functional-option/Configuration.xml b/tests/skills/cases/meta-compile/snapshots/functional-option/Configuration.xml
new file mode 100644
index 00000000..79cfc9a7
--- /dev/null
+++ b/tests/skills/cases/meta-compile/snapshots/functional-option/Configuration.xml
@@ -0,0 +1,252 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+ UUID-012
+ UUID-013
+
+
+ UUID-014
+ UUID-015
+
+
+
+ TestConfig
+
+
+ ru
+ TestConfig
+
+
+
+
+ Version8_3_24
+ ManagedApplication
+
+ PlatformApplication
+
+ Russian
+
+
+
+
+ false
+ false
+ false
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Biometrics
+ true
+
+
+ Location
+ false
+
+
+ BackgroundLocation
+ false
+
+
+ BluetoothPrinters
+ false
+
+
+ WiFiPrinters
+ false
+
+
+ Contacts
+ false
+
+
+ Calendars
+ false
+
+
+ PushNotifications
+ false
+
+
+ LocalNotifications
+ false
+
+
+ InAppPurchases
+ false
+
+
+ PersonalComputerFileExchange
+ false
+
+
+ Ads
+ false
+
+
+ NumberDialing
+ false
+
+
+ CallProcessing
+ false
+
+
+ CallLog
+ false
+
+
+ AutoSendSMS
+ false
+
+
+ ReceiveSMS
+ false
+
+
+ SMSLog
+ false
+
+
+ Camera
+ false
+
+
+ Microphone
+ false
+
+
+ MusicLibrary
+ false
+
+
+ PictureAndVideoLibraries
+ false
+
+
+ AudioPlaybackAndVibration
+ false
+
+
+ BackgroundAudioPlaybackAndVibration
+ false
+
+
+ InstallPackages
+ false
+
+
+ OSBackup
+ true
+
+
+ ApplicationUsageStatistics
+ false
+
+
+ BarcodeScanning
+ false
+
+
+ BackgroundAudioRecording
+ false
+
+
+ AllFilesAccess
+ false
+
+
+ Videoconferences
+ false
+
+
+ NFC
+ false
+
+
+ DocumentScanning
+ false
+
+
+ SpeechToText
+ false
+
+
+ Geofences
+ false
+
+
+ IncomingShareRequests
+ false
+
+
+ AllIncomingShareRequestsTypesProcessing
+ false
+
+
+
+
+
+ Normal
+
+
+ Language.Русский
+
+
+
+
+
+ Managed
+ NotAutoFree
+ DontUse
+ DontUse
+ TaxiEnableVersion8_2
+ DontUse
+ Version8_3_24
+
+
+
+ Русский
+ ВестиУчетПоСкладам
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-compile/snapshots/functional-option/Ext/ClientApplicationInterface.xml b/tests/skills/cases/meta-compile/snapshots/functional-option/Ext/ClientApplicationInterface.xml
new file mode 100644
index 00000000..3c1161b2
--- /dev/null
+++ b/tests/skills/cases/meta-compile/snapshots/functional-option/Ext/ClientApplicationInterface.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ UUID-002
+
+
+
+
+ UUID-004
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-compile/snapshots/functional-option/FunctionalOptions/ВестиУчетПоСкладам.xml b/tests/skills/cases/meta-compile/snapshots/functional-option/FunctionalOptions/ВестиУчетПоСкладам.xml
new file mode 100644
index 00000000..eaa78291
--- /dev/null
+++ b/tests/skills/cases/meta-compile/snapshots/functional-option/FunctionalOptions/ВестиУчетПоСкладам.xml
@@ -0,0 +1,21 @@
+
+
+
+
+ ВестиУчетПоСкладам
+
+
+ ru
+ Вести учет по складам
+
+
+ (Демо)
+ Constant.ВестиУчетПоСкладам
+ true
+
+ Document.РеализацияТоваров.TabularSection.Товары.Attribute.Склад
+ AccumulationRegister.ОстаткиТоваров.Dimension.Склад
+
+
+
+
diff --git a/tests/skills/cases/meta-compile/snapshots/functional-option/Languages/Русский.xml b/tests/skills/cases/meta-compile/snapshots/functional-option/Languages/Русский.xml
new file mode 100644
index 00000000..37c60d78
--- /dev/null
+++ b/tests/skills/cases/meta-compile/snapshots/functional-option/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file