Chunk Advisor
Программа-консультант по чанкам для 1С-разработчиков. Консольное приложение на Python для автоматизированного подбора требований к коду и формирования промптов для ИИ.
Python 3.10+ pydantic · rapidfuzz · pymorphy3 · rich SQLite 15 чанков 19.03.202601Назначение программы
Chunk Advisor — консольный инструмент на Python для автоматизированного подбора чанков (фрагментов требований к коду) при разработке на 1С. Цель: помочь разработчику формировать качественные промпты для ИИ, включающие требования безопасности, производительности и стандартов кодирования.
Чанк — именованный фрагмент текста с правилами и примерами кода на 1С (BSL), который добавляется в промпт для ИИ перед описанием задачи. Использование нужного набора чанков гарантирует, что ИИ-инструмент учтёт специфические требования проекта.
Основные функции:
- Хранение и управление базой знаний (чанки, матрица ситуаций, примеры)
- Интеллектуальный подбор чанков по описанию задачи
- Формирование промпта с полными текстами выбранных чанков
- История запросов (SQLite, автосохранение)
- Личные шаблоны пользователя с переменными
- Режим администратора для редактуры базы знаний
- Просмотр всех чанков постранично
- Экспорт: буфер обмена и файл
data/storage/chunks.json до начала этапа 2. Без этих данных программа не может быть запущена и протестирована.Целевая аудитория
- Исполнитель: Python-разработчик уровня middle+ (реализация программы)
- Конечные пользователи: 1С-разработчики уровня Junior+, Middle, технические лиды
02Архитектура программы
Программа построена по модульному принципу. Все пакеты содержат __init__.py. Пользовательские данные отделены от базы знаний.
chunk_advisor/
+-- main.py # точка входа; обработка --admin, --help
+-- requirements.txt # зависимости проекта
+-- README.md # документация: установка и использование
|
+-- core/ # ядро программы
| +-- __init__.py
| +-- knowledge_base.py # загрузка данных из JSON, поиск по базе
| +-- recommender.py # алгоритм подбора чанков (токенизация, scoring)
| +-- prompt_builder.py # сборка финального промпта из чанков + контекста
| +-- models.py # Pydantic-модели: Chunk, Situation, Category, Example
|
+-- data/ # работа с файлами данных
| +-- __init__.py
| +-- loader.py # загрузка и валидация JSON-файлов через Pydantic
| +-- storage/ # ХРАНИЛИЩЕ БАЗЫ ЗНАНИЙ (редактируется командой)
| +-- chunks.json # полные тексты чанков (предоставляется отдельно)
| +-- matrix.json # матрица ситуаций (единственный источник связей)
| +-- examples.json # готовые примеры промптов
|
+-- user_data/ # пользовательские данные (генерируются программой)
| +-- __init__.py
| +-- history_manager.py # запись и чтение истории запросов (SQLite)
| +-- template_manager.py # создание, применение, удаление шаблонов (SQLite)
| +-- history.db # автогенерируемый файл БД истории
| +-- templates.db # автогенерируемый файл БД шаблонов
|
+-- ui/ # пользовательский интерфейс
| +-- __init__.py
| +-- console.py # отрисовка меню, запросы ввода (rich)
| +-- paginator.py # постраничный вывод списков (10 элементов/стр.)
|
+-- utils/ # вспомогательные модули
+-- __init__.py
+-- text_processor.py # токенизация, нормализация (pymorphy3 + rapidfuzz)
Описание ключевых модулей
core/knowledge_base.py — загружает все JSON при старте. Методы: получить чанк по ID, получить все категории, получить ситуации по категории, поиск по ключевым словам. Перезагружается без рестарта после изменений в режиме администратора.
core/recommender.py — принимает строку запроса, возвращает ранжированный список chunk_id. Использует pymorphy3 (лемматизация) и rapidfuzz (нечёткое совпадение). Подробно — в разделе 6.
core/prompt_builder.py — собирает финальный промпт из полных текстов выбранных чанков + контекста пользователя. Обрабатывает подстановку переменных {var} в шаблонах.
user_data/history_manager.py — работает с SQLite (history.db). Автоматически сохраняет запись при каждом экспорте. Поддерживает чтение последних N записей, полный просмотр промпта по ID.
user_data/template_manager.py — работает с SQLite (templates.db). Создание, просмотр, применение (подстановка переменных), удаление. Инкрементирует счётчик usage_count при применении.
03Модели данных (core/models.py)
from pydantic import BaseModel
from typing import List, Optional
from datetime import datetime
# -- База знаний --------------------------------------------------
class Chunk(BaseModel):
id: int
title: str
full_text: str # полный текст требований для подстановки в промпт
class Situation(BaseModel):
id: str # уникальный идентификатор, напр. "form_new"
name: str # человекочитаемое название ситуации
keywords: List[str] # ключевые слова для алгоритма подбора
chunk_ids: List[int] # какие чанки нужны для этой ситуации
reason: str # краткое объяснение, почему именно эти чанки
class Category(BaseModel):
id: str # напр. "forms", "queries", "errors"
name: str # напр. "Работа с формами и интерфейсом"
situations: List[Situation]
class Example(BaseModel):
id: str
name: str
description: str
chunk_ids: List[int]
context: str # готовый текст контекста для подстановки
# -- Пользовательские данные ------------------------------------
class HistoryEntry(BaseModel):
id: Optional[int] = None # PRIMARY KEY в SQLite
timestamp: datetime
query: str # исходный запрос пользователя
selected_chunk_ids: List[int]
generated_prompt: str # финальный промпт целиком
class Template(BaseModel):
id: Optional[int] = None # PRIMARY KEY в SQLite
name: str
description: str
chunk_ids: List[int]
context_template: str # текст с переменными вида {var}
created_at: datetime
updated_at: Optional[datetime] = None
usage_count: int = 0
04Структура данных (JSON)
4.1 chunks.json — схема
Массив объектов. Каждый объект — один чанк. Поле full_text содержит полный текст требований, включая примеры кода BSL с переносами строк (\n) и отступами.
[
{
"id": 1,
"title": "Безопасный код (проверка типов, наличие полей)",
"full_text": "Требования к безопасности кода:\n\n1. ВСЕГДА проверяй наличие свойства:\n // Правильно\n Значение = ОбщегоНазначенияКлиентСервер.СвойствоСтруктуры(\n Параметры, \"ИмяСвойства\", ЗначениеПоУмолчанию);\n // Неправильно\n Значение = Параметры.ИмяСвойства;\n\n2. ВСЕГДА проверяй тип параметров...\n..."
},
{
"id": 2,
"title": "Сохранение отладочной информации",
"full_text": "..."
}
// ... чанки 3-15 предоставляются отдельным документом
]
full_text не имеет ограничения по длине. Ожидаемый объём каждого чанка — от 500 до 3000 символов. Экранирование кавычек внутри JSON-строки обязательно: \"4.2 matrix.json — единственный источник связей «Ситуация -> Чанки»
Один файл заменяет оба предыдущих. Поле display_string не хранится — вычисляется в prompt_builder.py. Поле keywords — основа для алгоритма подбора.
{
"categories": [
{
"id": "forms",
"name": "Работа с формами и интерфейсом",
"situations": [
{
"id": "form_new",
"name": "Создание новой формы",
"keywords": ["форма", "создать", "новый", "создание"],
"chunk_ids": [5, 2],
"reason": "Минимизация серверных вызовов, логирование событий"
},
{
"id": "form_event_handler",
"name": "Обработчик события на форме",
"keywords": ["обработчик", "событие", "приизменении", "приоткрытии"],
"chunk_ids": [5, 1],
"reason": "Проверка данных от пользователя, правильные директивы"
}
// ... остальные ситуации (полностью — раздел 14)
]
}
]
}
4.3 examples.json — готовые примеры промптов
{
"examples": [
{
"id": "example_1",
"name": "Разработка документа",
"description": "Создание документа 'Заявка на закупку'",
"chunk_ids": [7, 5, 3, 2],
"context": "Проект 1С УНФ 3.0 с расширением АПРО_Доработки\n..."
}
// ... примеры 2-7 (полностью — раздел 15)
]
}
05Требования к окружению
5.1 Системные требования
- Python 3.10 или выше
- Операционная система: Windows 10+, Linux (Ubuntu 20.04+), macOS 12+
- Дисковое пространство: ~50 МБ (включая зависимости)
5.2 requirements.txt
pydantic>=2.0.0 # валидация моделей данных rapidfuzz>=3.6.0 # нечёткое сравнение строк (token_set_ratio) pymorphy3>=1.0.0 # морфологический анализатор русского языка (лемматизация) pyperclip>=1.8.0 # копирование в буфер обмена rich>=13.0.0 # цветной консольный вывод, таблицы, прогресс-бары pytest>=7.0.0 # модульное и интеграционное тестирование pytest-cov>=4.0.0 # измерение покрытия кода
sudo apt install xclip (Debian/Ubuntu) или sudo apt install xsel. При отсутствии xclip/xsel программа должна отловить исключение pyperclip и вывести промпт на экран с сообщением: «Буфер обмена недоступен — скопируйте текст вручную.»5.3 Установка и запуск
# Установка зависимостей pip install -r requirements.txt # Обычный запуск python main.py # Режим администратора (только через аргумент) python main.py --admin # Справка python main.py --help
06Алгоритмы работы
6.1 Алгоритм подбора чанков (recommender.py)
Вход: строка запроса пользователя (user_input: str)
Выход: список ID чанков (List[int])
Шаг 1 — Токенизация и нормализация запроса
import pymorphy3
from rapidfuzz import fuzz
morph = pymorphy3.MorphAnalyzer()
def tokenize_and_normalize(text: str) -> set[str]:
"""
Разбивает текст на токены, приводит к нижнему регистру,
фильтрует короткие токены (len <= 2) и возвращает
множество нормальных форм (лемм) через pymorphy3.
'Создание формы документа' -> {'создание', 'форма', 'документ'}
"""
tokens = text.lower().split()
return {
morph.parse(t)[0].normal_form
for t in tokens
if len(t) > 2
}
Шаг 2 — Скоринг каждой ситуации из matrix.json
def score_situation(query_tokens: set[str], situation) -> float:
"""
Вычисляет взвешенную оценку релевантности ситуации запросу.
Вес 3: точное совпадение нормализованных токенов с keywords ситуации.
Поиск по токенам (не подстрокам) — исключает ложные срабатывания.
Вес 2: нечёткое совпадение через fuzz.token_set_ratio.
token_set_ratio устойчив к порядку слов и частичным совпадениям.
Нормализуется к диапазону [0, 2].
"""
norm_keywords = {morph.parse(kw)[0].normal_form for kw in situation.keywords}
norm_name_tokens = tokenize_and_normalize(situation.name)
# Вес 3: точные совпадения с ключевыми словами
keyword_hits = len(query_tokens & norm_keywords)
keyword_score = 3 * keyword_hits
# Вес 2: нечёткое совпадение с названием ситуации
fuzzy_score = fuzz.token_set_ratio(
" ".join(query_tokens),
" ".join(norm_name_tokens)
) / 100 * 2
return keyword_score + fuzzy_score
Шаги 3–8 — Сборка результата
- Вычислить
score_situation()для каждой ситуации из всех категорий матрицы - Отфильтровать ситуации с score == 0 (нет совпадений)
- Отсортировать оставшиеся по убыванию score
- Взять топ-3 ситуации
- Собрать уникальные
chunk_idsиз выбранных ситуаций - Гарантированно добавить чанк 7 (Универсальный), если его ещё нет в списке
- Вернуть итоговый список chunk_ids
token_set_ratio игнорирует порядок слов и обрабатывает пересечения токенов, что критично для русскоязычных запросов с произвольным порядком слов. partial_ratio ищет подстроку и менее устойчив к перестановкам.6.2 Алгоритм формирования промпта (prompt_builder.py)
Вход: chunk_ids: List[int], context: str
Выход: str — готовый промпт для вставки в ИИ-инструмент
- Загрузить полные тексты чанков из
knowledge_baseпо ID - Для каждого chunk_id сформировать блок:
=== ЧАНК {id}: {title} ===\n{full_text}\n - Объединить все блоки чанков
- Добавить раздел задачи:
--- ЗАДАЧА ---\n{context} - Вернуть итоговую строку
Пример итогового промпта:
=== ЧАНК 7: Универсальный (базовые требования) === [полный текст чанка 7] === ЧАНК 5: Клиент-серверное взаимодействие === [полный текст чанка 5] === ЧАНК 3: Обработка ошибок и транзакций === [полный текст чанка 3] === ЧАНК 2: Сохранение отладочной информации === [полный текст чанка 2] --- ЗАДАЧА --- Проект 1С УНФ 3.0 с расширением АПРО_Доработки Задача: Создать документ "Заявка на закупку" в расширении Требования: - Табличная часть "Товары" (номенклатура, количество, цена, сумма) - Проверка заполнения перед записью - Формирование движений по регистру "ЗаявкиНаЗакупку"
6.3 Механизм подстановки переменных в шаблонах
Контекст шаблона может содержать именованные переменные в фигурных скобках: {version}, {document_name}. При применении шаблона программа:
- Находит все вхождения
{var}черезre.findall(r'\{(\w+)\}', template) - Для каждой уникальной переменной запрашивает значение у пользователя
- Подставляет значения через
str.format_map() - Передаёт результат в
prompt_builder.py
07Пользовательский интерфейс
Консольный интерфейс реализован через библиотеку rich. Используются: rich.console.Console, rich.table.Table, rich.panel.Panel, rich.prompt.Prompt.
7.1 Главное меню
CHUNK ADVISOR v1.0 -- Консультант по подбору чанков ------------------------------------------------------ 1. Подобрать чанки по описанию задачи 2. Выбрать чанки по категориям 3. Посмотреть все чанки 4. Мои шаблоны 5. История запросов 6. Примеры готовых промптов 7. Выход ------------------------------------------------------ Для входа в режим администратора: python main.py --admin
--admin. Пункт меню с ним не добавляется.7.2 Режим 1 — Подбор по описанию задачи
Опишите вашу задачу (пустая строка = завершить ввод): > Нужно создать документ "Заявка на закупку" с табличной частью > Документ должен проводиться и формировать движения по регистру > Анализирую запрос... Найдены подходящие ситуации: 1. Создание новой формы (релевантность: 95%) 2. Запись документа (релевантность: 87%) 3. Массовая обработка документов (релевантность: 45%) Рекомендуемые чанки: [7] Универсальный (базовые требования) [5] Клиент-серверное взаимодействие [3] Обработка ошибок и транзакций [2] Сохранение отладочной информации Хотите изменить набор чанков? [д/н]: > н Введите контекст задачи (Enter = использовать запрос как контекст): > Проект 1С УНФ 3.0 с расширением АПРО_Доработки > - Табличная часть "Товары" (номенклатура, количество, цена, сумма) > Промпт сформирован! [c] скопировать в буфер [s] сохранить в файл [t] сохранить как шаблон [Enter] вернуться в меню
Редактирование набора чанков (при ответе «д»):
Текущий набор: [7, 5, 3, 2] Команды: a 4 -- добавить чанк с ID 4 r 3 -- убрать чанк с ID 3 list -- показать все чанки для выбора ok -- подтвердить текущий набор
7.3 Режим 2 — Выбор по категориям
Выберите категорию: 1. Работа с формами и интерфейсом 2. Работа с данными и запросами 3. Работа с объектами и метаданными 4. Обработка ошибок и отладка 5. Стандартизация и качество кода 6. Работа с динамическими списками 7. Интеграции и обмен данными 8. Работа с регистрами 9. Оптимизация производительности 10. Расширения конфигурации 11. Исключительные ситуации 12. Файловые операции 13. Тестирование и отладка > 1 Ситуации в категории "Работа с формами и интерфейсом": 1. Создание новой формы [чанки: 5, 2] 2. Обработчик события на форме [чанки: 5, 1] 3. Открытие одной формы из другой [чанки: 5] 4. Работа с табличной частью [чанки: 5] 5. Условное оформление [чанки: 5] Выберите ситуации (номера через пробел, 0 = назад): > 1 2
7.4 Режим 3 — Просмотр всех чанков
Все чанки (всего: 15) -- Страница 1/2 [1] Безопасный код (проверка типов, наличие полей) [2] Сохранение отладочной информации [3] Обработка ошибок и транзакций [4] Оптимизация запросов [5] Клиент-серверное взаимодействие [6] Использование БСП [7] Универсальный (базовые требования) [8] Работа с динамическими списками [9] Интеграции и обмен данными [10] Работа с периодическими регистрами [n] следующая страница [p] предыдущая [0] в меню [номер] -- просмотр полного текста чанка > 1 === ЧАНК 1: Безопасный код (проверка типов, наличие полей) === [полный текст чанка прокручивается здесь...] [Enter] вернуться к списку
7.5 Режим 5 — История запросов
История запросов (последние 10): 1. 2026-03-19 10:23 Создание документа "Заявка на закупку" [7,5,3,2] 2. 2026-03-19 09:15 Оптимизация отчёта по продажам [4,11] 3. 2026-03-18 17:42 Интеграция с Ozon [9,2,3,1] Введите номер для просмотра промпта (0 = назад): > 1 [полный текст промпта...] [c] скопировать [Enter] назад
7.6 Режим 4 — Мои шаблоны
Мои шаблоны:
1. Создание документа УНФ (использован: 5 раз)
2. Оптимизация отчёта (использован: 3 раза)
3. Интеграция с маркетплейсом (использован: 2 раза)
[номер] применить [d номер] удалить [0] в меню
> 1
Шаблон: "Создание документа УНФ"
Чанки: [7, 5, 3, 2]
Контекст: Проект 1С УНФ {version}
Задача: Создать документ "{document_name}"...
Заполните переменные:
version [3.0]:
> 3.0.12
document_name:
> ЗаявкаНаЗакупку
Промпт сформирован!
08Режим администратора
Режим доступен только через python main.py --admin. Пароль не требуется (инструмент внутренний, без сетевого доступа).
РЕЖИМ АДМИНИСТРАТОРА -- Управление базой знаний ------------------------------------------------- 1. Редактировать чанки 2. Редактировать матрицу ситуаций 3. Редактировать примеры промптов 4. Добавить новый чанк 5. Добавить новую ситуацию 6. Проверить целостность данных 7. Выход из режима администратора
Поведение после изменений
- После каждого изменения соответствующий JSON-файл перезаписывается на диск
knowledge_base.reload()перечитывает все файлы в память без перезапуска программы- Изменения сразу доступны в обычных режимах без выхода из
--admin
Проверка целостности (пункт 6)
- Все
chunk_idsв матрице ссылаются на существующие чанки - Все
chunk_idsв примерах ссылаются на существующие чанки - Нет дублирующихся
idсреди чанков - Нет дублирующихся
idсреди ситуаций - Все обязательные поля заполнены (через Pydantic)
09История запросов и шаблоны
9.1 История запросов (history_manager.py)
Хранится в SQLite: user_data/history.db. Файл создаётся автоматически при первом запуске.
CREATE TABLE history (
id INTEGER PRIMARY KEY AUTOINCREMENT,
timestamp TEXT NOT NULL, -- ISO-8601 datetime
query TEXT NOT NULL, -- исходный запрос пользователя
selected_chunks TEXT NOT NULL, -- JSON-список: [7, 5, 3, 2]
generated_prompt TEXT NOT NULL -- полный текст промпта
);
Запись создаётся автоматически при каждом успешном экспорте (нажатие [c] или [s]). Отдельного вопроса «Сохранить?» нет.
9.2 Шаблоны пользователя (template_manager.py)
Хранятся в SQLite: user_data/templates.db. Файл создаётся автоматически.
CREATE TABLE templates (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL, -- напр. "Создание документа УНФ"
description TEXT NOT NULL,
chunk_ids TEXT NOT NULL, -- JSON-список
context_template TEXT NOT NULL, -- текст с переменными {var}
created_at TEXT NOT NULL,
updated_at TEXT,
usage_count INTEGER DEFAULT 0
);
Управление шаблонами доступно пользователю без --admin через пункт «4. Мои шаблоны».
10Обработка ошибок
| Ситуация | Поведение программы |
|---|---|
chunks.json не найден |
Сообщение: «Ошибка загрузки базы знаний. Убедитесь, что файл data/storage/chunks.json существует.» Предложение: выйти или повторить попытку. |
matrix.json повреждён |
Pydantic выбрасывает ValidationError. Программа выводит список ошибок валидации и предлагает выйти. |
| Несуществующий ID чанка в вводе | «Чанк с ID X не найден» — предупреждение, ID игнорируется, остальные обрабатываются нормально. |
| Пустой ввод при выборе пункта меню | Возврат в текущее меню с повтором запроса. |
| Нечисловой ввод вместо числа | «Введите число» — повтор запроса с подсказкой. |
| Буфер обмена недоступен (Linux без xclip) | Исключение pyperclip перехватывается. Промпт выводится на экран: «Буфер обмена недоступен — скопируйте текст вручную.» |
| SQLite файл недоступен для записи | История/шаблоны не сохраняются, выводится предупреждение. Основной функционал продолжает работу. |
11План разработки и тестирования
11.1 Этапы с зависимостями
| Этап | Задачи | Зависит от | Дней |
|---|---|---|---|
| 1 | Модели данных (models.py), структура проекта, requirements.txt | — | 1 |
| 2 | Загрузка JSON (loader.py), валидация через Pydantic, knowledge_base.py | 1 | 1 |
| 3 | Алгоритм подбора (recommender.py): токенизация, scoring, сборка результата | 1, 2 | 3 |
| 4 | Формирование промпта (prompt_builder.py), подстановка переменных | 1, 2 | 1 |
| 5 | Консольный интерфейс (console.py, paginator.py). На этапе 5 recommender заменяется заглушкой. | 1 | 3 |
| 6 | История запросов (history_manager.py, SQLite) | 1, 2 | 2 |
| 7 | Шаблоны пользователя (template_manager.py, SQLite) | 1, 2 | 1 |
| 8 | Режим администратора (редактирование JSON, валидация целостности, перезагрузка) | 2, 5 | 2 |
| 9 | Интеграция всех компонентов, полный пользовательский цикл | 3,4,5,6,7,8 | 2 |
| 10 | Тесты (pytest, pytest-cov), README | 9 | 2 |
| Итого | 18 дней | ||
11.2 Тестирование
Модульные тесты (core/ и utils/ — минимум 80% покрытия):
- Токенизация и нормализация: корректность лемматизации, фильтрация коротких токенов
- Алгоритм скоринга: тестовые запросы против ожидаемых ситуаций и чанков
- Формирование промпта: структура вывода, наличие всех блоков, подстановка переменных
- Загрузка и валидация данных: корректный JSON, повреждённый JSON, отсутствующий файл
Интеграционные тесты (ui/, user_data/ — без фиксированного порога):
- Полный цикл: ввод запроса → подбор → формирование → экспорт → запись в историю
- Работа с шаблонами: создание → применение с переменными → удаление
- Режим администратора: добавление чанка → сохранение → перезагрузка → проверка доступности
Тестовые сценарии (минимальный набор):
test_cases = [
{
"query": "создать новую форму документа",
"expected_chunks_include": [5, 7],
"description": "форма документа -> клиент-серверное взаимодействие"
},
{
"query": "оптимизировать медленный отчет",
"expected_chunks_include": [4, 11],
"description": "медленный отчёт -> запросы + производительность"
},
{
"query": "интеграция с внешним API через HTTP",
"expected_chunks_include": [9, 2, 3],
"description": "HTTP API -> интеграции + логирование + транзакции"
},
{
"query": "загрузка номенклатуры из excel",
"expected_chunks_include": [14, 3],
"description": "загрузка файла -> файловые операции + транзакции"
},
{
"query": "расширение конфигурации добавить реквизит",
"expected_chunks_include": [12, 7],
"description": "расширение -> чанк расширений + универсальный"
}
]
12Критерии приёмки
- Программа запускается без ошибок на Windows 10+ и Ubuntu 20.04+
- Все пункты главного меню работают согласно описанию в разделе 7
- Алгоритм подбора выдаёт ожидаемые чанки для всех тестовых сценариев из п. 11.2
- Формируемый промпт содержит полные тексты выбранных чанков (не только заголовки)
- История запросов автоматически сохраняется после каждого экспорта
- Шаблоны создаются, применяются (с подстановкой переменных) и удаляются без ошибок
- Режим администратора позволяет добавлять/редактировать чанки и ситуации; изменения отражаются без перезапуска программы
- Покрытие кода тестами: не менее 80% для модулей
core/иutils/(измеряется pytest-cov) - README содержит инструкции по установке (включая Linux-специфику) и базовое описание использования
13Чеклист приёмки программы
Заполняется разработчиком перед сдачей. Все пункты должны быть отмечены как выполненные.
| N | Критерий | Проверено |
|---|---|---|
| 1 | Запуск на Windows без ошибок | [ ] |
| 2 | Запуск на Linux без ошибок | [ ] |
| 3 | Все пункты главного меню работают | [ ] |
| 4 | Тестовые запросы дают ожидаемые чанки | [ ] |
| 5 | Промпт содержит полные тексты чанков | [ ] |
| 6 | История автосохраняется после экспорта | [ ] |
| 7 | Шаблоны: создание, применение, удаление | [ ] |
| 8 | Переменные в шаблонах подставляются корректно | [ ] |
| 9 | Редактирование JSON через --admin работает | [ ] |
| 10 | Перезагрузка базы без рестарта программы | [ ] |
| 11 | Проверка целостности выявляет несуществующие chunk_ids | [ ] |
| 12 | Ошибки загрузки данных обрабатываются (не падает с traceback) | [ ] |
| 13 | Буфер обмена недоступен — выводит промпт на экран | [ ] |
| 14 | Покрытие core/ и utils/ не менее 80% (pytest-cov) | [ ] |
| 15 | README написан, установка описана | [ ] |
14Матрица ситуаций (полная версия matrix.json)
Полное содержимое файла data/storage/matrix.json. Это единственный источник связей «Ситуация → Чанки». Файл final_table.json не используется.
{
"categories": [
{
"id": "forms",
"name": "Работа с формами и интерфейсом",
"situations": [
{ "id": "form_new", "name": "Создание новой формы",
"keywords": ["форма","создать","новый","создание"],
"chunk_ids": [5,2], "reason": "Минимизация серверных вызовов, логирование событий" },
{ "id": "form_event_handler", "name": "Обработчик события на форме",
"keywords": ["обработчик","событие","приизменении","приоткрытии"],
"chunk_ids": [5,1], "reason": "Проверка данных от пользователя, правильные директивы" },
{ "id": "form_open_another", "name": "Открытие одной формы из другой",
"keywords": ["открыть","открытие","вызов формы","открытьформу"],
"chunk_ids": [5], "reason": "Совместимость с веб-клиентом, асинхронные диалоги" },
{ "id": "form_table_part", "name": "Работа с табличной частью",
"keywords": ["табличная часть","таблица","строки","товары"],
"chunk_ids": [5], "reason": "Клиентские расчёты, отзывчивость интерфейса" },
{ "id": "form_conditional", "name": "Условное оформление",
"keywords": ["условное оформление","оформление","цвет","выделение"],
"chunk_ids": [5], "reason": "Группировка изменений, один серверный вызов" }
]
},
{
"id": "queries",
"name": "Работа с данными и запросами",
"situations": [
{ "id": "query_report", "name": "Получение данных для отчёта",
"keywords": ["отчёт","отчет","выборка","данные"],
"chunk_ids": [4], "reason": "Производительность, оптимальные планы запросов" },
{ "id": "query_remains", "name": "Проверка остатков перед списанием",
"keywords": ["остатки","списание","проверка","достаточно"],
"chunk_ids": [4,3], "reason": "Целостность данных, блокировки" },
{ "id": "query_batch", "name": "Массовая обработка документов",
"keywords": ["массовый","пакетный","обработка","документы","пакет"],
"chunk_ids": [3,4], "reason": "Устойчивость к ошибкам, одна ошибка не убивает всё" },
{ "id": "query_search", "name": "Поиск по справочнику",
"keywords": ["поиск","найти","подбор","справочник"],
"chunk_ids": [4], "reason": "Ограничение результатов, ПЕРВЫЕ N" },
{ "id": "query_complex_join", "name": "Сложная выборка с соединениями",
"keywords": ["соединение","join","сложный","выборка","несколько таблиц"],
"chunk_ids": [4], "reason": "Временные таблицы, ЕСТЬNULL, правильные данные" }
]
},
{
"id": "objects",
"name": "Работа с объектами и метаданными",
"situations": [
{ "id": "object_write", "name": "Запись документа",
"keywords": ["запись","записать","проведение","документ"],
"chunk_ids": [3,2], "reason": "Атомарность, диагностика при ошибках" },
{ "id": "object_get_attrs", "name": "Получение реквизитов по ссылке",
"keywords": ["реквизиты","получить","значение","атрибуты"],
"chunk_ids": [6,1], "reason": "Производительность, безопасность, проверка существования" },
{ "id": "object_validate", "name": "Проверка заполнения",
"keywords": ["проверка","заполнение","валидация","заполнено"],
"chunk_ids": [6,1], "reason": "Единообразие, ЗначениеЗаполнено" },
{ "id": "object_rights", "name": "Работа с правами доступа",
"keywords": ["права","доступ","разрешения","роль"],
"chunk_ids": [6], "reason": "Проверенные механизмы БСП" },
{ "id": "object_create", "name": "Создание нового элемента",
"keywords": ["создать","новый","элемент","справочник"],
"chunk_ids": [6,3], "reason": "Надёжность, откат при ошибке" }
]
},
{
"id": "errors",
"name": "Обработка ошибок и отладка",
"situations": [
{ "id": "error_db", "name": "Любая операция с БД",
"keywords": ["база данных","бд","запись","транзакция"],
"chunk_ids": [3,2], "reason": "Откат при ошибке, диагностика" },
{ "id": "error_integration", "name": "Интеграция с внешней системой",
"keywords": ["интеграция","внешний","api","http"],
"chunk_ids": [2,3], "reason": "Диагностика сбоев, повторные попытки" },
{ "id": "error_batch", "name": "Пакетная обработка",
"keywords": ["пакет","массив","список","много"],
"chunk_ids": [3], "reason": "Накопление ошибок, продолжение работы" },
{ "id": "error_debug", "name": "Отладка сложного алгоритма",
"keywords": ["отладка","алгоритм","сложный","логика"],
"chunk_ids": [2], "reason": "Промежуточные результаты, понимание" }
]
},
{
"id": "standards",
"name": "Стандартизация и качество кода",
"situations": [
{ "id": "std_export", "name": "Экспортная функция",
"keywords": ["экспорт","функция","процедура","экспортная"],
"chunk_ids": [1,2], "reason": "Проверка параметров, документация" },
{ "id": "std_strings", "name": "Работа со строками",
"keywords": ["строка","текст","конкатенация","соединить"],
"chunk_ids": [6,1], "reason": "Производительность, локализация, НСтр" },
{ "id": "std_loop_concat", "name": "Конкатенация в цикле",
"keywords": ["цикл","конкатенация","сложение строк"],
"chunk_ids": [1], "reason": "O(N) вместо O(N^2), СтрСоединить" },
{ "id": "std_naming", "name": "Именование переменных",
"keywords": ["имена","переменные","названия","camelcase"],
"chunk_ids": [1], "reason": "Читаемость, CamelCase на русском" },
{ "id": "std_comments", "name": "Комментарии",
"keywords": ["комментарий","комментировать","документация"],
"chunk_ids": [2], "reason": "Документирование, объяснение 'зачем'" }
]
},
{
"id": "dynamic_lists",
"name": "Работа с динамическими списками",
"situations": [
{ "id": "dynlist_setup", "name": "Настройка динамического списка",
"keywords": ["динамический список","список","настройка","отбор"],
"chunk_ids": [8], "reason": "Инициализация в ПриСозданииНаСервере" },
{ "id": "dynlist_filters", "name": "Установка отборов",
"keywords": ["отбор","фильтр","условие"],
"chunk_ids": [8], "reason": "Отборы через параметры, производительность" },
{ "id": "dynlist_custom_query", "name": "Произвольный запрос в списке",
"keywords": ["произвольный","запрос","текст запроса"],
"chunk_ids": [8,4], "reason": "Сложные выборки с оптимизацией" },
{ "id": "dynlist_conditional", "name": "Условное оформление строк",
"keywords": ["условное оформление","подсветка","цвет"],
"chunk_ids": [8], "reason": "Визуализация данных" }
]
},
{
"id": "integrations",
"name": "Интеграции и обмен данными",
"situations": [
{ "id": "int_http", "name": "HTTP-вызов к внешнему API",
"keywords": ["http","api","запрос","внешний","интеграция"],
"chunk_ids": [9,2,3], "reason": "Надёжность, повторные попытки, диагностика" },
{ "id": "int_files", "name": "Обмен через файлы",
"keywords": ["файл","обмен","выгрузка","загрузка"],
"chunk_ids": [9,14], "reason": "Структурированный обмен, работа с файлами" },
{ "id": "int_json", "name": "Работа с JSON/XML",
"keywords": ["json","xml","сериализация","парсинг"],
"chunk_ids": [9], "reason": "Корректный парсинг, стандартные функции" },
{ "id": "int_com", "name": "Интеграция через COM",
"keywords": ["com","ole","внешний объект"],
"chunk_ids": [9,3], "reason": "Стабильность соединения, обработка ошибок" }
]
},
{
"id": "registers",
"name": "Работа с регистрами",
"situations": [
{ "id": "reg_remains", "name": "Получение остатков",
"keywords": ["остатки","регистр накопления","остаток"],
"chunk_ids": [10,4], "reason": "Актуальные данные, виртуальные таблицы" },
{ "id": "reg_last_slice", "name": "Получение среза последних",
"keywords": ["срез последних","актуальные","текущие"],
"chunk_ids": [10], "reason": "Текущие значения на дату" },
{ "id": "reg_write", "name": "Запись в регистр сведений",
"keywords": ["запись","регистр сведений","набор записей"],
"chunk_ids": [10], "reason": "Правильная структура, НаборЗаписей" },
{ "id": "reg_movements", "name": "Движения документа",
"keywords": ["движения","регистратор","проведение"],
"chunk_ids": [10,3], "reason": "Целостность, транзакции" }
]
},
{
"id": "performance",
"name": "Оптимизация производительности",
"situations": [
{ "id": "perf_slow_report", "name": "Медленный отчёт",
"keywords": ["медленный","тормозит","долго","отчёт"],
"chunk_ids": [11,4], "reason": "Выявление узких мест, оптимизация запросов" },
{ "id": "perf_slow_form", "name": "Тормозит форма",
"keywords": ["форма","тормозит","зависает","медленно"],
"chunk_ids": [11,5], "reason": "Сокращение серверных вызовов" },
{ "id": "perf_long_op", "name": "Длительная операция",
"keywords": ["длительный","фон","фоновое задание"],
"chunk_ids": [11], "reason": "Фоновые задания, не блокировать интерфейс" },
{ "id": "perf_caching", "name": "Кэширование данных",
"keywords": ["кэш","кэширование","повторные вызовы"],
"chunk_ids": [11], "reason": "Ускорение повторных обращений" }
]
},
{
"id": "extensions",
"name": "Расширения конфигурации",
"situations": [
{ "id": "ext_create", "name": "Создание расширения",
"keywords": ["расширение","extension","доработка"],
"chunk_ids": [12], "reason": "Правильная структура, не изменять основную" },
{ "id": "ext_add_attribute", "name": "Добавление реквизита",
"keywords": ["реквизит","добавить","присоединённый"],
"chunk_ids": [12], "reason": "Совместимость, ПриУстановкеСвойств" },
{ "id": "ext_override", "name": "Переопределение процедуры",
"keywords": ["переопределить","продолжитьвызов","замещение"],
"chunk_ids": [12], "reason": "Сохранение оригинальной логики" },
{ "id": "ext_update", "name": "Обновление при изменении конфигурации",
"keywords": ["обновление","совместимость","версия"],
"chunk_ids": [12], "reason": "Предотвращение ошибок" }
]
},
{
"id": "exceptions",
"name": "Исключительные ситуации",
"situations": [
{ "id": "exc_critical", "name": "Критическая ошибка",
"keywords": ["критическая","авария","падение","фатальная"],
"chunk_ids": [13,2], "reason": "Диагностика, полное логирование" },
{ "id": "exc_recovery", "name": "Восстановление после сбоя",
"keywords": ["восстановление","fallback","резервный"],
"chunk_ids": [13], "reason": "Устойчивость, запасные варианты" },
{ "id": "exc_user", "name": "Пользовательские исключения",
"keywords": ["исключение","вызватьисключение","ошибка пользователя"],
"chunk_ids": [13], "reason": "Понятный контекст, пользовательские сообщения" },
{ "id": "exc_timeout", "name": "Таймауты внешних вызовов",
"keywords": ["таймаут","timeout","ожидание"],
"chunk_ids": [13], "reason": "Повторные попытки, экспоненциальная задержка" }
]
},
{
"id": "files",
"name": "Файловые операции",
"situations": [
{ "id": "file_upload", "name": "Загрузка файла на сервер",
"keywords": ["загрузка","файл","на сервер","поместить"],
"chunk_ids": [14,5], "reason": "Асинхронные диалоги, пользовательский опыт" },
{ "id": "file_temp", "name": "Работа с временными файлами",
"keywords": ["временный","temp","удалить"],
"chunk_ids": [14], "reason": "Очистка ресурсов, предотвращение мусора" },
{ "id": "file_excel", "name": "Импорт из Excel/CSV",
"keywords": ["excel","csv","импорт","загрузка"],
"chunk_ids": [14,3], "reason": "Производительность, массовая обработка" },
{ "id": "file_zip", "name": "Работа с ZIP-архивами",
"keywords": ["zip","архив","сжатие","распаковать"],
"chunk_ids": [14], "reason": "Компактность, стандартные функции" }
]
},
{
"id": "testing",
"name": "Тестирование и отладка",
"situations": [
{ "id": "test_unit", "name": "Написание модульных тестов",
"keywords": ["тест","тестирование","модульный","unit"],
"chunk_ids": [15], "reason": "Качество кода, предотвращение регрессий" },
{ "id": "test_debug", "name": "Отладка сложного алгоритма",
"keywords": ["отладка","алгоритм","сложный"],
"chunk_ids": [15,2], "reason": "Трассировка, понимание логики" },
{ "id": "test_edge", "name": "Тестирование граничных случаев",
"keywords": ["граничный","крайний случай","edge"],
"chunk_ids": [15], "reason": "Надёжность, обработка исключений" },
{ "id": "test_perf", "name": "Измерение производительности",
"keywords": ["производительность","замер","время"],
"chunk_ids": [15,11], "reason": "Выявление узких мест, оптимизация" }
]
}
]
}
15Примеры готовых промптов (examples.json)
Полное содержимое файла data/storage/examples.json. Отображаются в пункте меню «6. Примеры готовых промптов».
{
"examples": [
{
"id": "example_1",
"name": "Разработка документа",
"description": "Создание документа 'Заявка на закупку'",
"chunk_ids": [7, 5, 3, 2],
"context": "Проект 1С УНФ 3.0 с расширением АПРО_Доработки\nЗадача: Создать документ 'Заявка на закупку' в расширении\nТребования:\n- Табличная часть 'Товары' (номенклатура, количество, цена, сумма)\n- Проверка заполнения перед записью\n- Формирование движений по регистру 'ЗаявкиНаЗакупку'"
},
{
"id": "example_2",
"name": "Оптимизация отчёта",
"description": "Ускорение отчёта по продажам",
"chunk_ids": [4, 2],
"context": "Проблема: Отчёт по продажам выполняется 5 минут\nТребуется оптимизировать запрос:\n- Виртуальные таблицы регистров\n- Индексация временных таблиц\n- Ограничение выборки (ПЕРВЫЕ N)\n- Логирование времени выполнения"
},
{
"id": "example_3",
"name": "Массовая загрузка",
"description": "Загрузка 10 000 строк номенклатуры из Excel",
"chunk_ids": [1, 2, 3, 6],
"context": "Задача: Загрузка 10 000 строк номенклатуры из Excel\nТребования:\n- Поэлементная обработка с накоплением ошибок\n- Проверка типов данных\n- Поиск дубликатов по артикулу\n- Логирование каждой ошибки\n- Итоговый отчёт о результатах"
},
{
"id": "example_4",
"name": "Отчёт с группировками",
"description": "Отчёт 'Продажи по контрагентам' с группировкой",
"chunk_ids": [4, 10, 2],
"context": "Проект 1С УНФ 3.0\nЗадача: Отчёт 'Продажи по контрагентам' с группировкой по месяцам\nТребования:\n- Период: январь-март 2026\n- Группировка: по месяцам, внутри по контрагентам\n- Показатели: сумма продаж, количество документов, средний чек\n- Виртуальные таблицы регистра продаж\n- Логирование времени выполнения"
},
{
"id": "example_5",
"name": "Интеграция с маркетплейсом",
"description": "Выгрузка остатков на Ozon",
"chunk_ids": [9, 2, 3, 1],
"context": "Проект 1С УНФ, интеграция с Ozon\nЗадача: Выгрузка остатков на маркетплейс\nТребования:\n- Получать остатки по всем складам\n- Формировать JSON по спецификации Ozon\n- HTTP с повторными попытками (3 раза)\n- Логировать каждый этап\n- При ошибке: запись в журнал и уведомление администратора\n- Пароль для API хранить в константе"
},
{
"id": "example_6",
"name": "Фоновая обработка",
"description": "Фоновое задание для проведения документов",
"chunk_ids": [11, 3, 2],
"context": "Проект 1С УНФ\nЗадача: Фоновое задание для массового проведения документов за день\nТребования:\n- Все непроведённые документы за текущий день\n- Поэлементная обработка с накоплением ошибок\n- Каждый документ в отдельной транзакции\n- Логировать успехи и ошибки\n- По окончании отправить отчёт администратору\n- Не блокировать работу пользователей"
},
{
"id": "example_7",
"name": "Расширение с новым функционалом",
"description": "Добавление реквизита в расширение",
"chunk_ids": [12, 1, 5, 3],
"context": "Расширение АПРО_Доработки для 1С УНФ\nЗадача: Добавить реквизит 'КомментарийМенеджера' в 'РеализацияТоваровУслуг'\nТребования:\n- Добавить реквизит в расширении\n- Вывести на форму документа\n- При записи проверять длину (не более 500 символов)\n- Логировать в отдельный регистр сведений\n- Использовать ПродолжитьВызов для сохранения оригинальной логики"
}
]
}
АПриложение А. Данные для инициализации базы знаний
Полные тексты всех 15 чанков предоставляются командой в виде отдельного документа «Справочник чанков». Разработчик обязан получить этот документ до начала этапа 2 и перенести данные в файл data/storage/chunks.json согласно схеме из раздела 4.1.
Перечень чанков (должны быть в chunks.json)
| ЧАНК 01 | Безопасный код (проверка типов, наличие полей) |
| ЧАНК 02 | Сохранение отладочной информации |
| ЧАНК 03 | Обработка ошибок и транзакций |
| ЧАНК 04 | Оптимизация запросов |
| ЧАНК 05 | Клиент-серверное взаимодействие |
| ЧАНК 06 | Использование БСП |
| ЧАНК 07 | Универсальный (базовые требования) — добавляется всегда |
| ЧАНК 08 | Работа с динамическими списками |
| ЧАНК 09 | Интеграции и обмен данными |
| ЧАНК 10 | Работа с периодическими регистрами |
| ЧАНК 11 | Оптимизация производительности |
| ЧАНК 12 | Работа с расширениями конфигурации |
| ЧАНК 13 | Обработка исключительных ситуаций |
| ЧАНК 14 | Работа с файлами и двоичными данными |
| ЧАНК 15 | Тестирование и отладка |
Чанк 07 (Универсальный) выделен — он автоматически добавляется в каждый результат подбора, если отсутствует в выбранном наборе.
Дата: 19.03.2026 · Статус: финальная версия, готова к реализации
Разделов: 15 + приложение А · Этапов разработки: 10 · Срок: 18 дней
Критический путь: этапы 1 → 2 → 3 → 9 → 10 (9 дней)
Вступайте в нашу телеграмм-группу Инфостарт