feat(web-test): обработка ТестовыеОшибки + bsl-модули (M1 Step 3)

Покрытие matrix #6 — errors balloon/messages/modal (10-validation,
fetchErrorStack Path 2):
- ОбщиеФункции.ПоказатьСообщение() → Сообщить("Тестовое сообщение")
- ОбщиеФункции.ВызватьТестовоеИсключение() → ВызватьИсключение
- DataProcessor.ТестовыеОшибки + ФормаОбработки с двумя кнопками,
  каждая делает клиент→сервер вызов соответствующей процедуры
- Регистрация в Configuration + Subsystem.Администрирование

Runner расширен step-типом writeFile — записывает произвольный текст
(обычно Module.bsl) в workDir. Нет навыка для модификации bsl-кода
модулей, и плодить отдельный навык под одну задачу избыточно.

Платформенная верификация: 36 шагов, 21.2s.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
Nick Shirokov
2026-05-01 14:27:38 +03:00
parent 3e8159b591
commit a828f1847f
2 changed files with 92 additions and 0 deletions
@@ -153,6 +153,29 @@ export const steps = [
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'CommonModules/ОбщиеФункции' },
},
{
name: 'writeFile: ОбщиеФункции Module.bsl',
writeFile: 'CommonModules/ОбщиеФункции/Ext/Module.bsl',
content: `Процедура ПоказатьСообщение() Экспорт
\tСообщить("Тестовое сообщение");
КонецПроцедуры
Процедура ВызватьТестовоеИсключение() Экспорт
\tВызватьИсключение "Тестовое исключение";
КонецПроцедуры
`,
},
// Обработка ТестовыеОшибки — для тестов errors balloon/messages/modal (10-validation)
{
name: 'meta-compile: Обработка ТестовыеОшибки',
script: 'meta-compile/scripts/meta-compile',
input: {
type: 'DataProcessor', name: 'ТестовыеОшибки',
},
args: { '-JsonPath': '{inputFile}', '-OutputDir': '{workDir}' },
validate: { script: 'meta-validate/scripts/meta-validate', flag: '-ObjectPath', path: 'DataProcessors/ТестовыеОшибки' },
},
// Отчёт ОстаткиТоваров
{
@@ -348,6 +371,57 @@ export const steps = [
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'Documents/ПриходнаяНакладная/Forms/ФормаСписка/Ext/Form.xml' },
},
// Форма обработки ТестовыеОшибки — кнопки вызова процедур ОбщиеФункции
{
name: 'form-add: Форма обработки ТестовыеОшибки',
script: 'form-add/scripts/form-add',
args: { '-ObjectPath': '{workDir}/DataProcessors/ТестовыеОшибки.xml', '-FormName': 'ФормаОбработки' },
},
{
name: 'form-compile: Форма обработки ТестовыеОшибки',
script: 'form-compile/scripts/form-compile',
input: {
title: 'Тестовые ошибки',
attributes: [
{ name: 'Объект', type: 'DataProcessorObject.ТестовыеОшибки', main: true },
],
elements: [
{ button: 'ПоказатьСообщение', command: 'ПоказатьСообщение', title: 'Показать сообщение' },
{ button: 'ВызватьИсключение', command: 'ВызватьИсключениеКоманда', title: 'Вызвать исключение' },
],
commands: [
{ name: 'ПоказатьСообщение', action: 'ПоказатьСообщение' },
{ name: 'ВызватьИсключениеКоманда', action: 'ВызватьИсключениеКоманда' },
],
},
args: { '-JsonPath': '{inputFile}', '-OutputPath': '{workDir}/DataProcessors/ТестовыеОшибки/Forms/ФормаОбработки/Ext/Form.xml' },
validate: { script: 'form-validate/scripts/form-validate', flag: '-FormPath', path: 'DataProcessors/ТестовыеОшибки/Forms/ФормаОбработки/Ext/Form.xml' },
},
{
name: 'writeFile: ТестовыеОшибки form Module.bsl',
writeFile: 'DataProcessors/ТестовыеОшибки/Forms/ФормаОбработки/Ext/Form/Module.bsl',
content: `&НаКлиенте
Процедура ПоказатьСообщение(Команда)
\tПоказатьСообщениеНаСервере();
КонецПроцедуры
&НаСервере
Процедура ПоказатьСообщениеНаСервере()
\tОбщиеФункции.ПоказатьСообщение();
КонецПроцедуры
&НаКлиенте
Процедура ВызватьИсключениеКоманда(Команда)
\tВызватьИсключениеНаСервере();
КонецПроцедуры
&НаСервере
Процедура ВызватьИсключениеНаСервере()
\tОбщиеФункции.ВызватьТестовоеИсключение();
КонецПроцедуры
`,
},
// ── 4. DCS for report ──
{
name: 'skd-compile: Схема отчёта ОстаткиТоваров',
@@ -397,6 +471,7 @@ export const steps = [
content: [
'InformationRegister.КурсыВалют',
'Constant.ОсновнаяВалюта',
'DataProcessor.ТестовыеОшибки',
],
},
args: { '-DefinitionFile': '{inputFile}', '-OutputDir': '{workDir}' },
@@ -434,6 +509,7 @@ export const steps = [
{ operation: 'add-childObject', value: 'InformationRegister.КурсыВалют' },
{ operation: 'add-childObject', value: 'Constant.ОсновнаяВалюта' },
{ operation: 'add-childObject', value: 'CommonModule.ОбщиеФункции' },
{ operation: 'add-childObject', value: 'DataProcessor.ТестовыеОшибки' },
{ operation: 'add-childObject', value: 'Report.ОстаткиТоваров' },
{ operation: 'add-childObject', value: 'Subsystem.Склад' },
{ operation: 'add-childObject', value: 'Subsystem.Администрирование' },
+16
View File
@@ -929,6 +929,22 @@ async function runIntegrationTest(test, opts) {
const step = test.steps[i];
const stepT0 = performance.now();
// writeFile step: записать содержимое (обычно .bsl модуля) в workDir
if (step.writeFile) {
try {
const target = replacePlaceholders(step.writeFile);
const abs = target.includes(':') || target.startsWith('/') ? target : join(workDir, target);
mkdirSync(dirname(abs), { recursive: true });
writeFileSync(abs, step.content ?? '', 'utf8');
const stepElapsed = ((performance.now() - stepT0) / 1000).toFixed(1);
stepResults.push({ name: step.name, passed: true, elapsed: `${stepElapsed}s` });
} catch (e) {
stepResults.push({ name: step.name, passed: false, error: `writeFile failed: ${e.message}` });
break;
}
continue;
}
// Write input if provided
let inputFile = null;
if (step.input) {