$npx -y skills add Arman-Kudaibergenov/1c-ai-development-kit --skill 1c-test-runnerЭтот скилл MUST быть вызван когда пользователь говорит "напиши тест", "протестируй модуль", "запусти unit-тесты" для 1С. SHOULD также вызывать после реализации бизнес-логики для верификации через 1c-ai-debug MCP. Do NOT использовать для UI-тестов — используй playwright-test или 1
| 1 | # /1c-test-runner — AI-тестирование 1С без внешних зависимостей |
| 2 | |
| 3 | Workflow для автономного тестирования бизнес-логики 1С: |
| 4 | - AI создаёт тестовые данные через `1c-ai-debug` MCP (CRUD) |
| 5 | - AI пишет тест — CommonModule с суффиксом `_Test` |
| 6 | - Тест загружается в базу через `/db-load-xml` + `/db-update` |
| 7 | - AI запускает через MCP инструмент `run_unit_tests` |
| 8 | - Результат возвращается текстом/JSON — без скриншотов, без vanessa-runner |
| 9 | |
| 10 | ## Предварительные требования |
| 11 | |
| 12 | - `1c-ai-debug` MCP подключён к проекту |
| 13 | - Расширение AI_Debug установлено и опубликовано в базе |
| 14 | |
| 15 | ## Стек |
| 16 | |
| 17 | ``` |
| 18 | Claude → 1c-ai-debug MCP (run_unit_tests) → 1С база |
| 19 | ↑ |
| 20 | BSL: CommonModule *_Test (пишет Claude) |
| 21 | ↑ |
| 22 | CRUD: create_catalog_item, create_document, post_document |
| 23 | ``` |
| 24 | |
| 25 | --- |
| 26 | |
| 27 | ## Шаг 1 — Создать тестовые данные |
| 28 | |
| 29 | ```json |
| 30 | {"name": "create_catalog_item", "arguments": {"catalogName": "Контрагенты", "data": {"Наименование": "TEST-001"}}} |
| 31 | |
| 32 | {"name": "create_document", "arguments": { |
| 33 | "documentType": "ПоступлениеТоваровУслуг", |
| 34 | "header": {"Контрагент": "<ref>", "Дата": "2026-01-01T00:00:00"}, |
| 35 | "tables": {"Товары": [{"Номенклатура": "<ref>", "Количество": 10, "Цена": 100}]} |
| 36 | }} |
| 37 | |
| 38 | {"name": "post_document", "arguments": {"documentType": "ПоступлениеТоваровУслуг", "documentRef": "<ref>"}} |
| 39 | ``` |
| 40 | |
| 41 | --- |
| 42 | |
| 43 | ## Шаг 2 — Написать тест |
| 44 | |
| 45 | Тест — CommonModule с суффиксом `_Test`. Пример модуля `AI_SelfTest_Test` уже в составе AI_Debug. |
| 46 | |
| 47 | ```bsl |
| 48 | // CommonModules/ТестПроведенияПоступления_Test/Ext/Module.bsl |
| 49 | |
| 50 | #Область СлужебныйПрограммныйИнтерфейс |
| 51 | |
| 52 | Процедура ИсполняемыеСценарии() Экспорт |
| 53 | ЮТТесты.ДобавитьТест("ПроведениеПоступленияФормируетДвижения"); |
| 54 | КонецПроцедуры |
| 55 | |
| 56 | Процедура ПроведениеПоступленияФормируетДвижения() Экспорт |
| 57 | // Arrange — ссылка из шага 1 |
| 58 | ДокументСсылка = ПредопределённоеЗначение("..."); // или передать через параметры |
| 59 | |
| 60 | // Act + Assert |
| 61 | Движения = РегистрыНакопления.ТоварыНаСкладах.СоздатьНаборЗаписей(); |
| 62 | Движения.Отбор.Регистратор.Установить(ДокументСсылка); |
| 63 | Движения.Прочитать(); |
| 64 | |
| 65 | ЮТУтверждения.Больше(Движения.Количество(), 0, "Ожидаются движения по регистру"); |
| 66 | КонецПроцедуры |
| 67 | |
| 68 | #КонецОбласти |
| 69 | ``` |
| 70 | |
| 71 | ### API ЮТУтверждения (прямые вызовы) |
| 72 | |
| 73 | ```bsl |
| 74 | ЮТУтверждения.Равно(Факт, Ожидаемое, "комментарий") |
| 75 | ЮТУтверждения.НеРавно(Факт, НеОжидаемое) |
| 76 | ЮТУтверждения.ЭтоИстина(Условие, "комментарий") |
| 77 | ЮТУтверждения.ЭтоЛожь(Условие) |
| 78 | ЮТУтверждения.Больше(Значение, Порог, "комментарий") |
| 79 | ЮТУтверждения.Меньше(Значение, Порог) |
| 80 | ЮТУтверждения.НеЗаполнено(Значение) |
| 81 | ЮТУтверждения.Заполнено(Значение) |
| 82 | ЮТУтверждения.ИмеетДлину(Коллекция, N) |
| 83 | ``` |
| 84 | |
| 85 | > ⚠️ Fluent-стиль (`ЮТУтверждения.Что(X).Равно(Y)`) не работает в CommonModule — нет self-reference. |
| 86 | |
| 87 | ### Добавить тест в конфигурацию |
| 88 | |
| 89 | ```xml |
| 90 | <!-- Configuration.xml → ChildObjects --> |
| 91 | <CommonModule>ТестПроведенияПоступления_Test</CommonModule> |
| 92 | ``` |
| 93 | |
| 94 | CommonModule флаги: `Server=true`, `ClientManagedApplication=false`. |
| 95 | |
| 96 | --- |
| 97 | |
| 98 | ## Шаг 3 — Загрузить в базу |
| 99 | |
| 100 | ``` |
| 101 | /db-load-xml <configDir> -Mode Partial -Files "CommonModules/ТестПроведенияПоступления_Test.xml,CommonModules/ТестПроведенияПоступления_Test/Ext/Module.bsl" |
| 102 | /db-update |
| 103 | ``` |
| 104 | |
| 105 | --- |
| 106 | |
| 107 | ## Шаг 4 — Запустить тесты |
| 108 | |
| 109 | ```json |
| 110 | // Все _Test модули |
| 111 | {"name": "run_unit_tests", "arguments": {}} |
| 112 | |
| 113 | // Конкретный модуль |
| 114 | {"name": "run_unit_tests", "arguments": {"moduleName": "ТестПроведенияПоступления_Test"}} |
| 115 | ``` |
| 116 | |
| 117 | ### Формат результата |
| 118 | |
| 119 | ```json |
| 120 | { |
| 121 | "success": true, |
| 122 | "total": 3, |
| 123 | "passed": 3, |
| 124 | "failed": 0, |
| 125 | "summary": "[OK] ПроведениеПоступленияФормируетДвижения\n[OK] ..." |
| 126 | } |
| 127 | ``` |
| 128 | |
| 129 | При `failed > 0` — `success: false`, в `summary` строки `[FAIL] ИмяТеста: текст ошибки`. |
| 130 | |
| 131 | --- |
| 132 | |
| 133 | ## Шаг 5 — Cleanup |
| 134 | |
| 135 | ```json |
| 136 | {"name": "delete_object", "arguments": {"objectType": "Documents", "objectName": "ПоступлениеТоваровУслуг", "objectRef": "<ref>"}} |
| 137 | {"name": "delete_object", "arguments": {"objectType": "Catalogs", "objectName": "Контрагенты", "objectRef": "<ref>"}} |
| 138 | ``` |
| 139 | |
| 140 | --- |
| 141 | |
| 142 | ## Полный пример (end-to-end) |
| 143 | |
| 144 | ``` |
| 145 | 1. create_catalog_item(Номенклатура, {Наименование: "TEST-001"}) → ref_ном |
| 146 | 2. create_document(ПоступлениеТоваровУслуг, {Товары: [{Номенклатура: ref_ном, Кол: 5, Цена: 200}]}) → ref_doc |
| 147 | 3. post_document(ПоступлениеТоваровУслуг, ref_doc) → success: true |
| 148 | 4. Claude пишет BSL тест → /db-load-xml + /db-update |
| 149 | 5. run_unit_tests({moduleName: "ТестПроведенияПоступления_Test"}) → {success: true, passed: 1} |
| 150 | 6. delete_object x2 (cleanup) |
| 151 | ``` |
| 152 | |
| 153 | --- |
| 154 | |
| 155 | ## Ограничения |
| 156 | |
| 157 | - Тесты только серверная бизнес-логика: расчёты, движения, проведение — не UI |
| 158 | - Тест загружается в базу до запуска через `/db-load-xml` + `/db-update` |
| 159 | - Ссылки между объектами — |