Правила форм 1С для ИИ-агента: без них 41 нарушение в расширении, с ними от 0 до 2
Разработка - Инструментарий разработчика
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
Объект исключён из S01 уже после опыта. Линтер на УТ 11.5: 21 373 находки; тесты: 24 из 24 в версии опыта, 29 из 29 после доработки 26.10.2026.В этом задании файл правил с конкретными требованиями (имя с префиксом, подсказка у каждого поля, картинка у команды) почти полностью убрал типичные нарушения оформления, которые агент без правил делал во всех прогонах. Платформа этих нарушений не замечает, поэтому нужен отдельный проверочный скрипт: он один и тот же для типовой конфигурации и для расширения, а пороги берутся из распределения на реальной конфигурации.
- Без файла правил агент не ставит префикс расширения нигде, хотя задание прямо сообщает, что префикс
Расш_задан в Configuration.xml: 32 нарушения S01 в каждом из шести прогонов. - С правилами в двух из шести прогонов платформа не приняла файлы формы; по трём прогонам на ячейку не видно, связано ли это с правилами. Линтер оформления не заменяет проверку XML и загрузку.
- Платформа молча приняла форму с 52 нарушениями; значит, правила оформления проверяют только скрипт и человек.
- На типовой конфигурации каждое правило пришлось уточнить: подсказку из метаданных, страницы без заголовков вкладок и аббревиатуры в заголовках первая версия считала нарушениями.
Правила в файле для агента и скрипт-линтер работают как пара: первое уменьшает число нарушений, второе показывает, что осталось, и держит оба под контролем одним набором кодов S01-S08.
Для кого: разработчики 1С, которые пишут расширения вместе с ИИ-агентом (Cursor, Claude Code, Codex) и хотят проверять оформление форм расширения по одним правилам до приёмки.
Статьи про Cursor Rules советуют записать в правила, как должен выглядеть интерфейс расширения, и обещают единый вид форм без ручной доводки. Я написала правила оформления форм расширения 1С с кодами S01-S08, сделала к ним проверочный скрипт и дала Claude Code одно и то же задание на расширение к «Нано-УТ 2.0» шесть раз без правил и шесть раз с правилами. Результат каждого прогона проверила линтером и загрузила платформой 8.3.27.
Что я проверяла и как
Задание для агента одно на все прогоны. В каталоге лежит заготовка расширения «РасшЗаметки» с префиксом Расш_ в Configuration.xml, выгрузка «Нано-УТ 2.0» для чтения и два файла-образца с описанием объектов. Нужно создать обработку «ЗаметкиКонтрагента» с формой (поля Контрагент, Тема, Текст заметки, Срочно, Напомнить, таблица заметок, команды «Добавить заметку» и «Очистить», две вложенные группы) и общую форму «СводкаЗаметок» (флажок «Только срочные», таблица, команда «Обновить»). Задание сообщает, что префикс Расш_ задан в Configuration.xml, но не требует ставить его у всех объектов, элементов, реквизитов и команд. Требования к подсказкам, картинкам и остальному оформлению есть только в файле правил: в вариантах без правил агент их не получил.
Варианты отличаются одним файлом. В варианте без правил рабочий каталог содержит только материалы задания. В варианте с правилами в каталоге лежит CLAUDE.md с текстом правил S01-S08. Агенты читали версию от 25.10.2026, она сохранена в архиве как evidence/rules-as-tested/CLAUDE.md. Поставляемые .cursor/rules/1c-forms.mdc, AGENTS.md и CLAUDE.md между собой совпадают, но с тех пор дополнены: строкой об основном реквизите Объект в S01 и строками о границах проверки S02 и S08. Модели: claude-haiku-5-5 и claude-sonnet-5-5, по три прогона каждой на каждый вариант. Каждый прогон запускался в заново созданном рабочем каталоге, предыдущие результаты в этот каталог не попадали.
Результат прогона проверялся тремя способами: линтером form_style_lint.py, загрузкой платформой в копию файловой базы «Нано-УТ» (/LoadConfigFromFiles -Extension с /UpdateDBCfg) и проверками /CheckModules -Extension и /CheckConfig -Extension.
Правила S01-S08 и что проверяет линтер
Правила написаны так, чтобы их можно было проверить по файлам выгрузки без запуска платформы: формы по Form.xml, имена объектов для S01 по Configuration.xml, подсказку из метаданных для S03 по файлу объекта. Код правила одинаков в тексте для агента и в линтере. Линтер проверяет не всё, что сказано в правилах: границы указаны в таблице, остальное смотрит человек.
| Код | Правило | Что проверяет линтер |
|---|---|---|
| S01 | Префикс Расш_ у объектов, элементов, реквизитов и команд формы |
Имена без префикса; основной реквизит Объект и колонки таблиц исключены |
| S02 | Заголовок у всего, что видит пользователь | Кнопка без Title на кнопке и команде, группа с видимым заголовком без Title, страница без Title, поле на реквизите формы без Title; команда без кнопки не проверяется |
| S03 | Подсказка у полей ввода | Нет ни ToolTip, ни текста расширенной подсказки; подсказка из метаданных реквизита засчитывается |
| S04 | Не больше четырёх уровней групп | Группа, страница или группа колонок глубже порога |
| S05 | Цвета только из стиля | #RRGGBB, web:, win: вместо style: |
| S06 | Шрифты только из стиля | kind="Absolute" вместо ссылки на стиль |
| S07 | Картинка у команды на кнопке главной командной панели | Нет Picture; текстовые кнопки и кнопка по умолчанию исключены |
| S08 | Заголовки обычными словами | Заголовок из одного слова с _ или склеенное слово, совпадающее с именем; заголовок с пробелом не проверяется |
Правила выглядят в файле как короткие требования с примером вида <Picture><xr:Ref>StdPicture.CreateListItem</xr:Ref>.... Длинных пояснений в файле нет: агент читает его целиком при каждом ответе. В архиве лежит разбор каждого правила с примерами «плохо» и «хорошо» из прогонов.
Cursor без окна: запускается, но измерить на нём не вышло
Cursor CLI (cursor-agent 2026.10.22) запускается без окна: cursor-agent -p --force --workspace <каталог> "<задание>". Учётная запись на этом компьютере уже была выполнена, я её не меняла и ключей не вводила. В сохранённом журнале попытки (evidence/cursor-attempt/attempt3.out) Cursor работал на модели Auto, то есть модель выбирал он сам.
Два пробных прогона я сделала с заданием, переданным аргументом командной строки. Обёртка cursor-agent.cmd пересылает аргументы строкой %*, и многострочный аргумент обрезается по первой строке. На пробной обёртке с той же схемой из трёх строк дошла одна (evidence/cmd-newline-demo.txt). Поэтому агент получил только фразу «Сделай расширение конфигурации ... для «НаноУТ»» и стал искать недостающее на диске. В журнале первого прогона (evidence/probe/probe1-contaminated-agent.out) он пишет, что нашёл в соседнем каталоге мой образец расширения и разбирает его, а в итоге сообщает про нулевую проверку линтером, которого в задании не было. Такой прогон ничего не измеряет: готовый ответ лежал на диске.
Задание можно передать файлом TASK.md и попросить агента выполнить его. Так была устроена третья попытка, но её остановил лимит, поэтому на Cursor этот способ не проверен: журнал попытки (evidence/cursor-attempt/attempt3.out) заканчивается сообщением «You've hit your usage limit». Основной опыт поэтому выполнен на Claude Code с инструментами Read, Write, Edit, Glob, Grep без Bash. Агент дважды пробовал искать за пределами рабочего каталога (поиск файла 1cv8.exe через Glob), и Claude Code оба раза отклонил запрос. Отдельной изоляции на уровне ОС у прогонов не было.
Влияние файла в формате .mdc на сам Cursor я не измеряла. По документации Cursor читает правила из .cursor/rules в формате .mdc (Rules), а CLI ещё и AGENTS.md и CLAUDE.md в корне проекта (Using Agent in CLI). Как эти файлы меняют результат в Cursor, документация не говорит, и перенос результатов Claude Code на Cursor остаётся предположением.
Результат: 244 находки без файла правил и 4 при его наличии

Без правил все шесть прогонов дали почти один и тот же набор: 32 имени без префикса, 6 полей ввода без подсказки, 1-3 команды без картинки. Группы, заголовки, цвета и шрифты агенты оформили без нарушений: S02, S04, S05, S06, S08 не сработали ни разу.
| Серия | Прогонов | Находок всего | S01 | S03 | S07 | Файл не читается | Платформа приняла | Без нарушений и принято |
|---|---|---|---|---|---|---|---|---|
| haiku, без правил | 3 | 121 | 96 | 18 | 7 | 0 | 3 из 3 | 0 |
| sonnet, без правил | 3 | 123 | 96 | 18 | 9 | 0 | 3 из 3 | 0 |
| haiku, с правилами | 3 | 4 | 2 | 0 | 0 | 2 | 2 из 3 | 1 |
| sonnet, с правилами | 3 | 0 | 0 | 0 | 0 | 0 | 2 из 3 | 2 |
Числа в таблице посчитаны итоговой версией линтера. После опыта я добавила в S01 исключение для основного реквизита формы Объект, а агенты читали правила без этой строки. Первая версия линтера давала по одной находке S01 на Объект в пяти прогонах sonnet: 42 вместо 41 в трёх прогонах без правил и 1 вместо 0 в двух прогонах с правилами. По первой версии итог был бы 249 и 6 находок вместо 244 и 4. Выводы первой версии сохранены рядом с итоговыми (lint-v1.txt в каждом прогоне), разница расписана в evidence/lint-v1-provenance.md.

В прогонах с правилами остались четыре находки. Две относятся к S01: haiku назвала обработку ЗаметкиКонтрагента и общую форму СводкаЗаметок без префикса. Агенты положили префикс туда, где его заметили, а два имени в Configuration.xml пропустили. Ещё две находки (S00) линтер выдал не по оформлению: в третьем прогоне haiku файлы форм были некорректным XML, и разбор остановился на третьей строке. Оформление этих двух форм не проверено вовсе: сколько в них нарушений, неизвестно, и число 4 их не учитывает. Ноль находок тоже не означает рабочего расширения: у sonnet-3 линтер ничего не нашёл, и всё же платформа это расширение не загрузила (ниже).
С файлом правил прогоны шли дольше и стоили дороже: в среднем haiku работала 127 секунд без файла и 157 с ним (отдельные прогоны 119-136 и 124-198 секунд, расход 0,027 и 0,033 доллара), sonnet 91 и 113 секунд (89-93 и 107-123 секунды, 0,308 и 0,358 доллара). Расход по журналам Claude Code, по три прогона в ячейке; значимость разницы я не оценивала.
Один побочный результат стоит записать. Правило S07 требует картинку у команд, и в четырёх прогонах с правилами из шести (все три haiku и sonnet-3) агент поставил одну и ту же StdPicture.CreateListItem на «Добавить заметку» и на «Очистить». Линтер такое пропускает: он проверяет наличие картинки, а смысл картинки смотрит человек.
Что сказала платформа
Платформа приняла все шесть расширений без правил и с 39-41 нарушением оформления в каждом: код возврата 0, журнал загрузки пустой, /CheckModules написал «Синтаксических ошибок не обнаружено!», /CheckConfig написал «Ошибок не обнаружено». То же случилось с образцом bad, в который я заложила 52 нарушения по всем восьми правилам: заголовок «Очистить_поля», цвет #FFF2CC, шрифт Arial 14, четыре лишние группы, поля без подсказок. Для платформы форма корректна. Правила оформления проверяет только линтер.
Два прогона с правилами платформа не приняла, причём по причинам, не связанным с оформлением.
- haiku-3: загрузка вернула код 1 и сообщение «Ошибка разбора XML ... Extra content at the end of the document» для файла описания общей формы.
- sonnet-3: загрузка не вернула управление, и через десять минут (мой таймаут) процесс пришлось снять по PID; при повторе результат тот же. Я разделила расширение на части: зависание остаётся при одной обработке, а с заменой её Form.xml на образец загрузка занимает 5 секунд. Дальше исключала элементы по одному: если убрать из Form.xml таблицу, картинки, подсказки или основной реквизит, зависание остаётся, если убрать элементы
ContextMenuиз групп, расширение загружается. У группы (UsualGroup) в выгрузке УТ 11.5 нет элемента ContextMenu: в 2685 группах из случайных 600 форм ни одного. Агент записал его по аналогии с полями. Платформа не вернула ни ошибки, ни сообщения.
Вывод для приёмки: после правил нужен ещё и обычный порядок проверки файла и загрузки с таймаутом. Зависший 1cv8.exe надо снимать по PID, как это делает load_ext.py из архива.
Линтер на типовой УТ 11.5

Типовая конфигурация не писалась под эти правила, поэтому находок на ней много: 21 373 на 4849 формах. Задача прогона на УТ была другой: проверить, что находки соответствуют тексту правила, и убрать из правил случаи, где нарушения нет. Для этого линтер прошёл через несколько версий.
| Правило | Находок в первой версии | Находок в итоговой | Что уточнено |
|---|---|---|---|
| S02 | 548 | 279 | Группа с Representation=None и страница при PagesRepresentation=None заголовка не показывают; заголовок команды проверяется на кнопке |
| S03 | 35 400 | 14 689 | Колонки таблиц не проверяются; подсказка реквизита из метаданных засчитывается; картинки и индикаторы не поля ввода |
| S04 | 8 521 | 4 203 | Pages уровня не добавляет, уровень даёт страница |
| S05 | 792 | 786 | Выключенные параметры условного оформления (use=false) пропускаются |
| S06 | 81 | 81 | Без изменений |
| S07 | 3 967 | 1 240 | Текстовые кнопки, кнопки по умолчанию и картинки на самой кнопке исключены |
| S08 | 667 | 95 | Аббревиатуры (ИНН, ОГРН, ФИО) и фразы с пробелами исключены |
Находки S03, S05 и S06 я сверила целиком вторым скриптом по тексту XML (ut_verify.py из того же комплекта): он подтвердил 14 683 из 14 689 находок S03, все 786 находок S05 и все 81 находку S06. Находки S02, S04, S07 и S08 разобраны по случайной выборке (evidence/ut/samples.md); ложных среди них не нашлось, остальные находки этих правил по отдельности не просматривались. Шесть расхождений в S03 остаются: у этих полей пустой <Title formatted="true"/> в расширенной подсказке и обработчик URLProcessing. Возможно, подсказку формирует код при открытии формы, но на экране я этого не проверяла, поэтому эти поля записаны в README как предел инструмента. Все 21 373 находки - отклонения от соглашений команды, ошибок типовой УТ они не означают.
Порог S04 выбран по распределению. Групп глубже четвёртого уровня нет в 4450 формах из 4849. Глубже пяти уровней 172 формы (3,5 %), глубже шести 99 (2,0 %). Для расширений, которые создаются с нуля, взят порог 4, для проверки существующей конфигурации разумнее --max-depth 6.
Тесты линтера работают без платформы: правила и исключения, образец good (0 находок) и образец bad (сработали все восемь кодов). В опыте была версия с 24 тестами. После приёмки я добавила пять: код ошибки, если не найдено ни одной формы, предупреждение, если каталог указан на уровень выше выгрузки, повреждённый XML и две записанные границы S02 и S08. Теперь тестов 29, на снимке прогон 26.10.2026; разбор форм от этого не изменился, повторный прогон по УТ дал тот же список находок построчно.

Как внедрить у себя
- Скопируйте файл правил в проект:
.cursor/rules/1c-forms.mdcдля Cursor,AGENTS.mdилиCLAUDE.mdдля остальных агентов. ЗаменитеРасш_на префикс вашего расширения. Где Cursor ищет эти файлы, написано в его документации: Rules и Using Agent in CLI. - После генерации выгрузите расширение или возьмите каталог, который собрал агент, и запустите
python form_style_lint.py <каталог> --stats. Код 0 значит только, что в найденных формах нет находок: сверьте строкуформ: Nс числом форм. Если форм не нашлось, линтер вернёт код 3. Если каталог указан на уровень выше выгрузки, он предупредит, что S01 выключено. - Верните агенту вывод линтера целиком и попросите исправить (запрос в архиве,
prompts/fix-from-linter.md). В опыте этот шаг не выполнялся, и сколько кругов он займёт, я не измеряла. В прогонах с правилами из находок по оформлению остались только два пропущенных префикса в Configuration.xml. - Загрузите расширение платформой с таймаутом и сохраните журнал: линтер не заменяет проверку XML и загрузку.
- Пройдите по чек-листу из архива: он стоит в порядке «до запуска агента», «до загрузки», «после загрузки» и содержит те же коды.
Ограничения линтера записаны в README: он не оценивает смысл подсказки и заголовка, не знает, что картинка подходит к команде, считает отсутствующей подсказку у шести полей УТ с пустой расширенной подсказкой и обработчиком URLProcessing, проверяет S02 и S08 не целиком (команда без кнопки, заголовок с пробелом) и работает только с форматом Form.xml 2.20.
Итог
Из шести прогонов с файлом правил три дали формы без находок линтера и приняты платформой, в одном остались два пропущенных префикса у объектов метаданных, в двух платформа не приняла формы по причинам, не связанным с оформлением. Без правил все шесть прогонов нарушали S01, S03 и S07: 244 находки на 12 форм. Платформа ни одного нарушения оформления не заметила, ни в прогонах агента, ни в образце с 52 заложенными нарушениями.
Практический смысл в такой цепочке: файл правил в проекте, линтер по тем же кодам, загрузка платформой с таймаутом, просмотр формы человеком. Каждое звено ловит то, что пропустили остальные. Платформа не видит оформление, линтер не видит смысл подсказки и картинки, правила не защищают от некорректного XML.
Выводы относятся к одному заданию, двум моделям Claude Code, трём прогонам на ячейку, платформе 8.3.27.2130 в файловом режиме и конфигурации «Нано-УТ 2.0». Измерение на самом Cursor не выполнено: пробные прогоны получили обрезанное задание, а повтор остановил лимит бесплатного плана. Три прогона на ячейку показывают разницу между 41 и 0-2 находками, но не оценивают разброс: на другом задании и в другой конфигурации числа будут иными.
Вступайте в нашу телеграмм-группу Инфостарт