diff --git a/tests/skills/cases/meta-edit/_skill.json b/tests/skills/cases/meta-edit/_skill.json
new file mode 100644
index 00000000..ed51f8f7
--- /dev/null
+++ b/tests/skills/cases/meta-edit/_skill.json
@@ -0,0 +1,12 @@
+{
+ "script": "meta-edit/scripts/meta-edit",
+ "setup": "empty-config",
+ "args": [
+ { "flag": "-DefinitionFile", "from": "inputFile" },
+ { "flag": "-ObjectPath", "from": "workPath", "field": "objectPath" }
+ ],
+ "snapshot": {
+ "root": "workDir",
+ "normalizeUuids": true
+ }
+}
diff --git a/tests/skills/cases/meta-edit/add-attribute.json b/tests/skills/cases/meta-edit/add-attribute.json
new file mode 100644
index 00000000..fa445507
--- /dev/null
+++ b/tests/skills/cases/meta-edit/add-attribute.json
@@ -0,0 +1,16 @@
+{
+ "name": "Добавление реквизита к справочнику",
+ "preRun": [
+ {
+ "script": "meta-compile/scripts/meta-compile",
+ "input": { "type": "Catalog", "name": "Контрагенты" },
+ "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
+ }
+ ],
+ "params": { "objectPath": "Catalogs/Контрагенты" },
+ "input": {
+ "operations": [
+ { "op": "add-attribute", "name": "ИНН", "type": "String", "length": 12 }
+ ]
+ }
+}
diff --git a/tests/skills/cases/meta-edit/add-tabpart.json b/tests/skills/cases/meta-edit/add-tabpart.json
new file mode 100644
index 00000000..fdb5c21c
--- /dev/null
+++ b/tests/skills/cases/meta-edit/add-tabpart.json
@@ -0,0 +1,23 @@
+{
+ "name": "Добавление табличной части к справочнику",
+ "preRun": [
+ {
+ "script": "meta-compile/scripts/meta-compile",
+ "input": { "type": "Catalog", "name": "Контрагенты" },
+ "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
+ }
+ ],
+ "params": { "objectPath": "Catalogs/Контрагенты" },
+ "input": {
+ "operations": [
+ {
+ "op": "add-ts",
+ "name": "КонтактнаяИнформация",
+ "attributes": [
+ { "name": "Тип", "type": "String", "length": 50 },
+ { "name": "Значение", "type": "String", "length": 250 }
+ ]
+ }
+ ]
+ }
+}
diff --git a/tests/skills/cases/meta-edit/error-no-definition.json b/tests/skills/cases/meta-edit/error-no-definition.json
new file mode 100644
index 00000000..6e384db9
--- /dev/null
+++ b/tests/skills/cases/meta-edit/error-no-definition.json
@@ -0,0 +1,12 @@
+{
+ "name": "Ошибка: ни DefinitionFile ни Operation не указаны",
+ "preRun": [
+ {
+ "script": "meta-compile/scripts/meta-compile",
+ "input": { "type": "Catalog", "name": "Тест" },
+ "args": { "-JsonPath": "{inputFile}", "-OutputDir": "{workDir}" }
+ }
+ ],
+ "params": { "objectPath": "Catalogs/Тест" },
+ "expectError": true
+}
diff --git a/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml
new file mode 100644
index 00000000..cb1813d2
--- /dev/null
+++ b/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты.xml
@@ -0,0 +1,327 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+
+ Контрагенты
+
+
+ ru
+ Контрагенты
+
+
+
+ false
+ HierarchyFoldersAndItems
+ false
+ 2
+ true
+ true
+
+ ToItems
+ 9
+ 25
+ String
+ Variable
+ WholeCatalog
+ false
+ true
+ AsDescription
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ Auto
+ InDialog
+ true
+ BothWays
+
+ Catalog.Контрагенты.StandardAttribute.Description
+ Catalog.Контрагенты.StandardAttribute.Code
+
+ Begin
+ DontUse
+ Directly
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ Automatic
+ Use
+
+
+
+
+
+ DontUse
+ Auto
+ DontUse
+ false
+ false
+
+
+
+
diff --git a/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты/Ext/ObjectModule.bsl b/tests/skills/cases/meta-edit/snapshots/add-attribute/Catalogs/Контрагенты/Ext/ObjectModule.bsl
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/skills/cases/meta-edit/snapshots/add-attribute/Configuration.xml b/tests/skills/cases/meta-edit/snapshots/add-attribute/Configuration.xml
new file mode 100644
index 00000000..c9614252
--- /dev/null
+++ b/tests/skills/cases/meta-edit/snapshots/add-attribute/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
+ Taxi
+ DontUse
+ Version8_3_24
+
+
+
+ Русский
+ Контрагенты
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-edit/snapshots/add-attribute/Languages/Русский.xml b/tests/skills/cases/meta-edit/snapshots/add-attribute/Languages/Русский.xml
new file mode 100644
index 00000000..37c60d78
--- /dev/null
+++ b/tests/skills/cases/meta-edit/snapshots/add-attribute/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml
new file mode 100644
index 00000000..cb1813d2
--- /dev/null
+++ b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты.xml
@@ -0,0 +1,327 @@
+
+
+
+
+
+ UUID-002
+ UUID-003
+
+
+ UUID-004
+ UUID-005
+
+
+ UUID-006
+ UUID-007
+
+
+ UUID-008
+ UUID-009
+
+
+ UUID-010
+ UUID-011
+
+
+
+ Контрагенты
+
+
+ ru
+ Контрагенты
+
+
+
+ false
+ HierarchyFoldersAndItems
+ false
+ 2
+ true
+ true
+
+ ToItems
+ 9
+ 25
+ String
+ Variable
+ WholeCatalog
+ false
+ true
+ AsDescription
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ DontCheck
+ false
+ false
+ Auto
+
+
+ false
+
+
+ Auto
+ Auto
+
+ false
+ Use
+ false
+
+
+
+ Use
+
+
+
+
+
+
+
+ Auto
+ InDialog
+ true
+ BothWays
+
+ Catalog.Контрагенты.StandardAttribute.Description
+ Catalog.Контрагенты.StandardAttribute.Code
+
+ Begin
+ DontUse
+ Directly
+
+
+
+
+
+
+
+
+
+
+ false
+
+
+ Automatic
+ Use
+
+
+
+
+
+ DontUse
+ Auto
+ DontUse
+ false
+ false
+
+
+
+
diff --git a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты/Ext/ObjectModule.bsl b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Catalogs/Контрагенты/Ext/ObjectModule.bsl
new file mode 100644
index 00000000..e69de29b
diff --git a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Configuration.xml b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Configuration.xml
new file mode 100644
index 00000000..c9614252
--- /dev/null
+++ b/tests/skills/cases/meta-edit/snapshots/add-tabpart/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
+ Taxi
+ DontUse
+ Version8_3_24
+
+
+
+ Русский
+ Контрагенты
+
+
+
\ No newline at end of file
diff --git a/tests/skills/cases/meta-edit/snapshots/add-tabpart/Languages/Русский.xml b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Languages/Русский.xml
new file mode 100644
index 00000000..37c60d78
--- /dev/null
+++ b/tests/skills/cases/meta-edit/snapshots/add-tabpart/Languages/Русский.xml
@@ -0,0 +1,16 @@
+
+
+
+
+ Русский
+
+
+ ru
+ Русский
+
+
+
+ ru
+
+
+
\ No newline at end of file
diff --git a/tests/skills/runner.mjs b/tests/skills/runner.mjs
index e4225e51..4c9ce787 100644
--- a/tests/skills/runner.mjs
+++ b/tests/skills/runner.mjs
@@ -175,6 +175,12 @@ function buildArgs(skillConfig, caseData, workDir, inputFilePath, runtime) {
case 'outputPath':
args.push(join(workDir, caseData.outputPath || ''));
break;
+ case 'workPath':
+ // workDir + value from case.params or case (specified in mapping.field)
+ const wpField = mapping.field || 'objectPath';
+ const wpVal = caseData.params?.[wpField] ?? caseData[wpField] ?? '';
+ args.push(join(workDir, wpVal));
+ break;
case 'switch':
// flag already pushed, no value needed — remove the flag and re-push conditionally
args.pop(); // remove flag, will re-add if switch is active
@@ -327,13 +333,44 @@ function runCase(testCase, opts) {
const fixturePath = ensureSetup(setupName, opts.runtime);
workDir = createWorkspace(fixturePath);
- // 2. Write input JSON if needed
+ // 2. Pre-run steps (setup prerequisites like creating objects)
+ if (caseData.preRun) {
+ for (const step of caseData.preRun) {
+ const preScript = resolveScript(step.script, opts.runtime);
+ const preArgs = [];
+ for (const [flag, value] of Object.entries(step.args || {})) {
+ preArgs.push(flag);
+ const resolved = String(value)
+ .replace('{workDir}', workDir)
+ .replace('{inputFile}', '');
+ preArgs.push(resolved);
+ }
+ // Write step input to temp file if needed
+ let preInputFile = null;
+ if (step.input) {
+ preInputFile = join(workDir, '__pre_input.json');
+ writeFileSync(preInputFile, JSON.stringify(step.input, null, 2), 'utf8');
+ // Replace {inputFile} references in args
+ for (let i = 0; i < preArgs.length; i++) {
+ if (preArgs[i] === '') preArgs[i] = preInputFile;
+ }
+ }
+ try {
+ execSkillRaw(opts.runtime, preScript, preArgs);
+ } catch (e) {
+ throw new Error(`preRun step "${step.script}" failed: ${e.stderr || e.message}`);
+ }
+ if (preInputFile && existsSync(preInputFile)) rmSync(preInputFile);
+ }
+ }
+
+ // 3. Write input JSON if needed
if (caseData.input !== undefined) {
inputFile = join(workDir, '__input.json');
writeFileSync(inputFile, JSON.stringify(caseData.input, null, 2), 'utf8');
}
- // 3. Build CLI args and execute
+ // 4. Build CLI args and execute
const { scriptPath, args } = buildArgs(skillConfig, caseData, workDir, inputFile, opts.runtime);
let stdout = '', stderr = '', exitCode = 0;