Архитектура ФО и оценки заданий — План реализации
For agentic workers: REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (
- [ ]) syntax for tracking.
Goal: Формализовать двухуровневую архитектуру функциональных опций: добавить проектный флаг ФункциональностьОценки, удалить бесполезный ФункциональностьServiceDesk, добавить валидацию между глобальными ФО и проектными флагами.
Architecture: Трехуровневая цепочка: Редакция → Глобальная ФО → Проектный флаг → UI формы задания. Проектные флаги управляют видимостью динамических реквизитов и вкладок на форме задания через ЗаданияСервер.ИспользуемаяФункциональность().
Tech Stack: 1С:EDT, BSL, MCP EDT tools (для .bsl файлов), прямое редактирование .mdo/.form XML
Spec: docs/superpowers/specs/2026-04-07-functional-options-architecture-design.md
Порядок задач
Миграция данных (Task 5) должна выполняться ДО удаления ФункциональностьServiceDesk (Task 6-7), т.к. она читает старое значение.
Task 1: Добавить реквизит ФункциональностьОценки в Проекты.mdo
Task 2: Добавить элемент формы на вкладку "Функционал"
Task 3: Добавить обработчик и логику в модуль формы проекта (BSL)
Task 4: Добавить в API проекта (ManagerModule)
Task 5: Обработчик обновления ИБ (миграция данных)
Task 6: Добавить "Оценки" в ЗаданияСервер и форму задания (BSL)
Task 7: Удалить ФункциональностьServiceDesk из кода (BSL)
Task 8: Удалить ФункциональностьServiceDesk из метаданных (.mdo, .form)
Task 9: Добавить валидацию между глобальными ФО и проектными флагами
Task 10: Документация архитектуры ФО
Task 1: Добавить реквизит ФункциональностьОценки в Проекты.mdo
Files:
-
Modify:
it/src/Catalogs/Проекты/Проекты.mdo:655(вставить послеФункциональностьServiceDesk) -
Step 1: Сгенерировать UUID
[guid]::NewGuid().ToString()
Запомнить результат — это UUID нового реквизита.
- Step 2: Добавить реквизит в .mdo
Вставить после строки 655 (после закрывающего </attributes> реквизита ФункциональностьServiceDesk), перед ФункциональностьSLA:
<attributes uuid="СГЕНЕРИРОВАННЫЙ-UUID">
<name>ФункциональностьОценки</name>
<synonym>
<key>ru</key>
<value>Функциональность оценки</value>
</synonym>
<type>
<types>Boolean</types>
</type>
<toolTip>
<key>ru</key>
<value>Отображать поле оценки выполнения в задачах проекта</value>
</toolTip>
<minValue xsi:type="core:UndefinedValue"/>
<maxValue xsi:type="core:UndefinedValue"/>
<fillValue xsi:type="core:BooleanValue"/>
<fullTextSearch>Use</fullTextSearch>
<dataHistory>Use</dataHistory>
</attributes>
- Step 3: Проверить ошибки EDT
MCP: get_project_errors — убедиться что новый реквизит не вызвал ошибок.
- Step 4: Commit
git add it/src/Catalogs/Проекты/Проекты.mdo
git commit -m "feat(T-XXXXX): Добавлен реквизит ФункциональностьОценки в справочник Проекты"
Task 2: Добавить элемент формы на в кладку "Функционал"
Files:
-
Modify:
it/src/Catalogs/Проекты/Forms/ФормаЭлемента/Form.form:2048(вставить послеФункциональностьServiceDesk) -
Step 1: Определить id для новых элементов
Найти максимальный <id> в форме:
grep -oP '<id>\K[0-9]+' it/src/Catalogs/Проекты/Forms/ФормаЭлемента/Form.form | sort -n | tail -5
Новым элементам назначить id = max+1, max+2, max+3 (основной, контекстное меню, расширенная подсказка).
- Step 2: Добавить элемент CheckBox в Form.form
Вставить после строки 2048 (после закрывающего </items> элемента ФункциональностьServiceDesk), перед элементом ФункциональностьТрудозатраты. Использовать как шаблон элемент ФункциональностьКлиенты (строки 2098-2144), заменив:
<name>→ФункциональностьОценки<id>→ новые id (3 штуки: основной, контекстное меню, подсказка)<dataPath>→Объект.ФункциональностьОценки<handlers>→ФункциональностьОценкиПриИзменении<title>→Оценки<toolTip>→Отображать поле оценки выполнения в задачах проектаcheckBoxType→Switcher(как у остальных)
Структура элемента (3 XML-блока):
- Основной
<items xsi:type="form:FormField">с<type>CheckBoxField</type> - Внутри:
<contextMenu>с собственным<name>и<id> - Внутри:
<extendedTooltip>с собственным<name>и<id>
- Step 3: Добавить поле СКД в ФормаВыбора проектов
В файле it/src/Catalogs/Проекты/Forms/ФормаВыбора/Form.form после строки с ФункциональностьServiceDesk (~784) добавить по аналогии:
<field>ФункциональностьОценки</field>
<field>ФункциональностьОценки</field>
- Step 4: Добавить поле СКД в ФормаСписка заданий
В файле it/src/Documents/Задание/Forms/ФормаСписка/Form.form после строки с ФункциональностьServiceDesk (~5131) добавить по аналогии:
<field>ФункциональностьОценки</field>
<field>ФункциональностьОценки</field>
- Step 5: Проверить ошибки EDT
MCP: get_project_errors — убедиться что форма корректна.
- Step 6: Commit
git add it/src/Catalogs/Проекты/Forms/ФормаЭлемента/Form.form
git add it/src/Catalogs/Проекты/Forms/ФормаВыбора/Form.form
git add it/src/Documents/Задание/Forms/ФормаСписка/Form.form
git commit -m "feat(T-XXXXX): Элемент формы ФункциональностьОценки на вкладке Функционал"
Task 3: Добавить обработчик в модуль формы проекта
Files:
-
Modify:
it/src/Catalogs/Проекты/Forms/ФормаЭлемента/Module.bsl -
Step 1: Добавить обработчик
ФункциональностьОценкиПриИзменении
Через MCP read_module_source прочитать модуль формы. Затем через write_module_source добавить после обработчика ФункциональностьServiceDeskПриИзменении (после строки 360):
&НаКлиенте
Процедура ФункциональностьОценкиПриИзменении(Элемент)
ФункциональностьПриИзменении(Элемент);
КонецПроцедуры
Шаблон идентичен остальным обработчикам (строки 342-379).
- Step 2: Проверить ошибки EDT
MCP: get_project_errors
- Step 3: Commit
git add it/src/Catalogs/Проекты/Forms/ФормаЭлемента/Module.bsl
git commit -m "feat(T-XXXXX): Обработчик ФункциональностьОценкиПриИзменении"
Task 4: Добавить в API проекта (ManagerModule)
Files:
- Modify:
it/src/Catalogs/Проекты/ManagerModule.bsl
Через MCP read_module_source прочитать модуль, затем write_module_source внести изменения.
- Step 1: Словарь десериализации
После строки 72 (features_service_desk) добавить:
ДанныеAPI.СловарьДесериализации.Вставить("features_ratings", "ФункциональностьОценки");
- Step 2: НовыйОбъектAPI
После строки 382 (ФункциональностьServiceDesk) добавить:
ОбъектAPI.Вставить("ФункциональностьОценки", Ложь);
- Step 3: СериализаторПроекта
В инициализации ОбъектFeatures (после строки с service_desk, ~419) добавить:
ОбъектFeatures.Вставить("ratings", Ложь);
В блоке сериализации (после блока service_desk, ~446) добавить:
Если ОбъектAPI.Свойство("ФункциональностьОценки") Тогда
ОбъектFeatures.Вставить("ratings", ОбъектAPI.ФункциональностьОценки);
КонецЕсли;
- Step 4: ДесериализаторПроекта
В блоке десериализации (после блока service_desk, ~512) добавить:
Если ОбъектFeatures.Свойство("ratings") Тогда
Результат.Вставить("ФункциональностьОценки", ОбъектFeatures.ratings);
КонецЕсли;
- Step 5: SELECT-запросы
В обоих SELECT-запросах (после строк с ФункциональностьServiceDesk, ~1494 и ~1558) добавить:
ДанныеОбъекта.ФункциональностьОценки КАК ФункциональностьОценки,
- Step 6: Проверить ошибки EDT
MCP: get_project_errors
- Step 7: Commit
git add it/src/Catalogs/Проекты/ManagerModule.bsl
git commit -m "feat(T-XXXXX): API проекта - поле features_ratings"
Task 5: Обработчик обновления ИБ (миграция данных)
Files:
- Modify:
it/src/CommonModules/УправлениеITОтделом8УФОбновлениеИнформационнойБазыБСП/Module.bsl
Эта задача выполняется ДО удаления ФункциональностьServiceDesk.
- Step 1: Найти процедуру регистрации обработчиков обновления