Проверка кода 1С на соответствие стандартам
Этот скилл проверяет код 1С:Предприятие (BSL) на соответствие стандартам разработки из "Системы стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8" и требованиям "1С:Совместимо".
Правила извлечены из конфигурации АПК (Автоматизированная проверка конфигураций) v1.2.9.124 от ООО "1С-Софт".
Как использовать
Пользователь может попросить:
- Проверить конкретный файл
.bsl
- Проверить все
.bsl файлы в проекте
- Проверить вставленный фрагмент кода
- Проверить конкретный аспект (именование, структура модуля, запросы)
Алгоритм проверки
1. Определить тип проверяемого файла
BSL-модуль — по расположению файла определи тип и запомни контекст выполнения:
| Файл |
Тип модуля |
Контекст |
Директивы &НаКлиенте/&НаСервере |
Ext/Module.bsl |
Общий модуль |
Зависит от флагов модуля (сервер/клиент/везде) |
Возможны |
Ext/ObjectModule.bsl |
Модуль объекта |
Только сервер |
Запрещены |
Ext/ManagerModule.bsl |
Модуль менеджера |
Только сервер |
Запрещены |
Forms/*/Ext/Form/Module.bsl |
Модуль формы |
Клиент + сервер (смешанный) |
Обязательны |
Ext/SessionModule.bsl |
Модуль сеанса |
Только сервер |
Запрещены |
Ext/ManagedApplicationModule.bsl |
Модуль приложения |
Только клиент |
&НаСервере запрещён |
Ext/CommandModule.bsl |
Модуль команды |
Только клиент |
&НаСервере запрещён |
Ошибки контекста:
&НаКлиенте в модуле объекта/менеджера/сеанса → немедленная ошибка компиляции
&НаСервере в модуле приложения/команды → немедленная ошибка компиляции
- Обращение к БД (запросы, объектная модель) в процедуре
&НаКлиенте → ошибка выполнения
XML-описание формы — файл Forms/ИмяФормы/Ext/Form.xml. Требует отдельного алгоритма проверки (см. раздел "Проверка XML форм").
2. Загрузить правила
Правила находятся в папке rules/ рядом с этим файлом. Ключевые файлы для проверки кода:
Обязательные (проверяй всегда):
rules/00-builtin-checks.md — встроенные проверки АПК (структура модуля, документация параметров, права ролей, система исключений)
rules/04-soglasheniya-pri-napisanii-koda.md — соглашения при написании кода (именование, структура модулей, оформление)
rules/03-realizaciya-obrabotki-dannyh.md — работа с запросами, оптимизация, обработка данных
rules/02-nastrojka-prav-dostupa-k-dannym.md — права доступа
rules/01-sozdanie-i-izmenenie-obektov-metadannyh.md — параметры сеанса, часовые пояса, ТекущаяДатаСеанса (актуально для любого кода, работающего с датами)
rules/12-klient-servernoe-vzaimodejstvie.md — загружать если в модуле есть хотя бы одна директива &НаКлиенте или &НаСервере (модули форм, общие модули с директивами)
По контексту (загружай при необходимости):
rules/00-terminology-dictionary.md — словарь русских/английских терминов 1С (1044 термина — для проверки двуязычного кода)
rules/13-obschie-voprosy-bezopasnosti.md — безопасность (если есть Выполнить/Вычислить, работа с паролями)
rules/11-trebovaniya-po-lokalizacii.md — локализация (если есть строковые литералы на русском)
rules/07-proektirovanie-interfejsov-dlya-8-3.md — проектирование интерфейсов 8.3 (если проверяешь форму)
rules/08-razrabotka-polzovatelskih-interfejsov.md — разработка интерфейсов (если форма: командный интерфейс, реквизиты, элементы управления)
rules/06-razrabotka-i-ispolzovanie-bibliotek.md — библиотеки (если используется БСП)
3. Проверить код
Шаг 3а — определить тип модуля и добавить специфичные проверки
Если модуль формы (Forms/*/Ext/Form/Module.bsl):
- Загрузить
rules/12-klient-servernoe-vzaimodejstvie.md (обязательно — директивы компиляции есть всегда)
- Применить таблицу сопоставления процедура→область из раздела "Структура модуля (std455)" ниже
- Проверить каждую процедуру: в какой области она находится, соответствует ли это её сигнатуре
Если общий модуль (Ext/Module.bsl):
- Загрузить
rules/12-klient-servernoe-vzaimodejstvie.md если есть директивы компиляции
- Проверить: все экспортные процедуры в области
ПрограммныйИнтерфейс, все неэкспортные в СлужебныеПроцедурыИФункции
Если модуль объекта/менеджера (Ext/ObjectModule.bsl, Ext/ManagerModule.bsl):
- Проверить наличие обработчиков проведения, удаления в правильных областях
Шаг 3б — общие проверки для всех модулей
Оформление модулей:
- Все процедуры внутри именованных областей
#Область/#КонецОбласти
- Порядок областей соответствует стандарту (см. раздел std455 ниже)
- Экспортные процедуры имеют комментарий в формате:
// Описание того, что делает процедура.
//
// Параметры:
// ИмяПараметра - Тип - Описание параметра.
// ВторойПараметр - Тип - Описание.
//
// Возвращаемое значение:
// Тип - Описание возвращаемого значения.
Именование:
- Переменные, процедуры, функции — CamelCase на русском
- Процедуры с побочными эффектами — глагол (Записать, Удалить)
- Функции возвращающие значение — существительное или вопрос (ПолучитьСписок, ЭтоДокумент)
- Булевы переменные и функции — утверждение (ЕстьОшибки, ДокументПроведён)
Работа с запросами:
- Запросы не в циклах
- Использование параметров вместо конкатенации строк
- Оформление текста запроса (ключевые слова капсом, отступы)
Клиент-серверное взаимодействие (если в модуле есть &НаКлиенте или &НаСервере):
- Нет транзакций (
НачатьТранзакцию) в процедурах &НаКлиенте
- Нет запросов и обращений к БД в процедурах
&НаКлиенте
- Нет серверных вызовов внутри цикла (каждый вызов
&НаСервере — отдельный roundtrip)
&НаСервереБезКонтекста предпочтительнее &НаСервере там, где контекст формы не нужен
- Нет
ОповеститьОбИзменении / Оповестить в серверных процедурах без необходимости
Безопасность и права доступа:
- Нет
Выполнить() / Вычислить() с непроверенными строками
ПривилегированныйРежим() используется только когда это необходимо и явно обосновано
- Перед записью/проведением/удалением объекта есть проверка права:
ПравоДоступа("Изменение", Метаданные.Документы.ИмяДок)
- Пароли и чувствительные данные не хранятся в реквизитах объектов или в открытом виде — только через безопасное хранилище БСП
- Нет прямого SQL или обхода механизма прав через COM-объекты
Производительность:
- Нет запросов в цикле
- Правильное использование транзакций (минимально необходимый охват)
- Отсутствие избыточных блокировок
4. Формат вывода
Для каждого найденного нарушения выведи:
[Уровень] Строка N: Описание нарушения
Правило: Название правила (ссылка на стандарт)
Рекомендация: Как исправить
Уровни:
- ОШИБКА — обязательное к исправлению нарушение
- ПРЕДУПРЕЖДЕНИЕ — рекомендуемое к исправлению
- ИНФОРМАЦИЯ — рекомендация по улучшению
В конце выведи сводку:
Итого: X ошибок, Y предупреждений, Z информационных
Критичные нарушения — проверять всегда, независимо от загруженных файлов правил
| Нарушение |
Правильно |
Стандарт |
ТекущаяДата() |
ТекущаяДатаСеанса() |
std643 — в SaaS/многозонных системах возвращает время сервера, а не сеанса |
| Запрос внутри цикла |
Запрос до цикла |
std468 — экспоненциальный рост нагрузки на СУБД |
"ВЫБРАТЬ ... = " + Переменная |
"... = &Параметр" + УстановитьПараметр |
std434 — инъекция и отсутствие кэширования планов |
Пустой блок Исключение |
ЗаписьЖурналаРегистрации(...) |
std499 — потеря информации об ошибке |
Выполнить(Строка) без проверки |
Проверить источник строки |
std524 — выполнение произвольного кода |
Важные правила (краткая справка)
Тексты модулей (std456)
- Код на русском языке
- Не использовать букву "ё" в коде (допустима в интерфейсных текстах)
- Один оператор — одна строка
- Синтаксический отступ — табуляция
- Не оставлять закомментированный код и TODO
Структура модуля (std455)
Обычный/общий модуль — порядок областей:
#Область ОписаниеПеременных
#Область ПрограммныйИнтерфейс <- только Экспорт процедуры
#Область СлужебныйПрограммныйИнтерфейс <- вызовы из подсистем (опционально)
#Область СлужебныеПроцедурыИФункции <- всё остальное
#Область Инициализация
Модуль формы — порядок областей и правило сопоставления:
#Область ОписаниеПеременных
#Область ПрограммныйИнтерфейс
#Область ОбработчикиСобытийФормы
#Область ОбработчикиСобытийЭлементовШапкиФормы
#Область ОбработчикиСобытийЭлементовТаблицыФормы<ИмяТаблицы>
#Область ОбработчикиКомандФормы
#Область СлужебныеПроцедурыИФункции
#Область Инициализация
Для каждой процедуры в модуле формы определи область по сигнатуре:
| Сигнатура |
Правильная область |
Процедура Имя(Команда) |
ОбработчикиКомандФормы |
ПриОткрытии, ПриСозданииНаСервере, ПередЗаписью, ПриЗаписи, ПослеЗаписи, ОбработкаПроверкиЗаполнения, ОбработкаВыбора, ОбработкаОповещения |
ОбработчикиСобытийФормы |
<ИмяПоля>ПриИзменении(Элемент), <ИмяПоля>ОкончаниеВводаТекста(Элемент, ...) — поля шапки |
ОбработчикиСобытийЭлементовШапкиФормы |
<ИмяТаблицы>ПриАктивизацииСтроки, <ИмяТаблицы><Колонка>ПриИзменении, <ИмяТаблицы>ПередНачаломДобавления |
ОбработчикиСобытийЭлементовТаблицыФормы<ИмяТаблицы> |
ЧтоТоЗавершение(Результат, ДополнительныеПараметры) Экспорт |
СлужебныеПроцедурыИФункции |
| Экспортная процедура, вызываемая снаружи |
ПрограммныйИнтерфейс |
| Всё остальное |
СлужебныеПроцедурыИФункции |
Ошибки разметки областей:
- Процедура с
(Команда) лежит в СлужебныеПроцедурыИФункции
ПриОткрытии / ПриСозданииНаСервере вне ОбработчикиСобытийФормы
- Процедуры вообще вне каких-либо областей
- Области есть, но порядок нарушен
Именование переменных и процедур (std640)
- CamelCase (ВерблюжийРегистр)
- Осмысленные имена, не аббревиатуры
- Без префиксов типов (не
стрИмя, а Имя)
- Булевы — утверждение (
ЕстьОшибки, не Ошибки)
Работа с запросами (std434)
- Ключевые слова заглавными: ВЫБРАТЬ, ИЗ, ГДЕ, И, ИЛИ
- Имена таблиц и полей — CamelCase
- Параметры через
&ИмяПараметра
- Не собирать запрос конкатенацией строк
Обработка исключительных ситуаций (std499)
- В блоке Исключение обязательно записать в журнал
- Не использовать пустой блок Исключение
- Не перехватывать все исключения без необходимости
Проверка XML форм (Form.xml)
Файл Forms/ИмяФормы/Ext/Form.xml описывает структуру управляемой формы. При получении такого файла выполни проверку по следующим правилам.
Как читать Form.xml
Ключевые теги:
<Form>
<Title><v8:item><v8:lang>ru</v8:lang><v8:content>Заголовок</v8:content></v8:item></Title>
<AutoTitle>false</AutoTitle> <!-- false = заголовок задан явно -->
<WindowOpeningMode>...</WindowOpeningMode> <!-- режим открытия окна -->
<AutoCommandBar name="..."> <!-- командная панель -->
<Button name="..." ButtonImportance="Main">
<DefaultButton>true</DefaultButton>
<Events>
<Event name="OnOpen">ПриОткрытии</Event> <!-- связь с обработчиком BSL -->
<ChildItems> <!-- дерево элементов формы -->
<Pages>, <Page>, <UsualGroup>, <InputField>, <CheckBoxField>,
<RadioButtonField>, <Button>, <Table>, <LabelDecoration>
Проверки по правилам
Заголовок формы (std711)
<AutoTitle>false</AutoTitle> — обязателен явный заголовок в <Title>
- Заголовок должен быть в именительном падеже, с заглавной буквы
- Не использовать в заголовке название объекта метаданных дословно (не "Справочник.Контрагенты", а "Контрагенты")
- Нет буквы "ё" в заголовке
Режим открытия окна (std711)
<WindowOpeningMode> — допустимые значения:
DontBlock — для большинства форм (не блокирует родительское окно)
LockOwnerWindow — только для диалогов, требующих обязательного ответа
Independent — только для форм, работающих независимо
- Ошибка: использование
LockOwnerWindow для обычных форм списков и объектов
Кнопки (std430)
<DefaultButton>true — должна быть не более одной кнопки по умолчанию на форме
<ButtonImportance>Main — основных кнопок не более двух
- Кнопки закрытия/отмены не должны иметь
ButtonImportance=Main
<Visible>false на кнопке в командной панели — проверить, не является ли она мёртвым кодом
Именование элементов (std640)
Атрибут name= каждого элемента:
- CamelCase на русском:
ГруппаОсновныеРеквизиты, ТаблицаТоваров
- Без технических префиксов: не
грpОсновные, а ГруппаОсновные
- Страницы: имя отражает содержимое (
СтраницаОсновное, СтраницаДополнительно)
- Группы:
ГруппаШапка, ГруппаКоманды, ГруппаПодвал
- Ошибка: автогенерированные имена типа
Группа1, Кнопка2, Поле3
Привязка реквизитов к данным (std468)
- Каждый
<InputField>, <CheckBoxField>, <RadioButtonField> должен иметь <DataPath>
- Ошибка: элемент ввода без
<DataPath> — нет привязки к реквизиту формы
<DataPath> должен совпадать с именем реквизита в CamelCase
Структура групп (std711, std727)
- Вертикальные группы (
<Group>Vertical</Group>) — для последовательного размещения полей
- Горизонтальные (
<Group>AlwaysHorizontal</Group>) — для элементов в строку (не более 3-4 полей)
- Предупреждение: горизонтальная группа с более чем 4 дочерними элементами — вероятно нарушение компоновки
<Representation>None</Representation> + <ShowTitle>false</ShowTitle> на группах — корректный паттерн для скрытия рамки
Подсказки (std711)
<ExtendedTooltip> — рекомендуется для ключевых полей ввода
- Информация: поле ввода без
<ExtendedTooltip> — рассмотреть добавление подсказки
Вкладки (std711, std727)
<PagesRepresentation> — допустимые значения:
TabsOnTop — стандартные вкладки сверху (предпочтительно)
TabsOnLeftHorizontal — вкладки слева с горизонтальным текстом
None — вкладки без заголовков (только если переключение программное)
- Имена страниц должны быть осмысленными, не "Страница1"
Обработчики событий (std640)
В блоке <Events> каждого элемента:
- Имя обработчика должно совпадать с паттерном:
ИмяЭлемента + ИмяСобытия
- Например:
<Event name="OnChange">КонтрагентПриИзменении</Event>
- Ошибка: обработчик с именем не по стандарту (например,
ОбработатьИзменение вместо КонтрагентПриИзменении)
- Событие формы
OnOpen → ПриОткрытии, OnCreateAtServer → ПриСозданииНаСервере
Орфография заголовков (std23)
Все тексты в <v8:content>:
- Без буквы "ё" (кроме имён собственных)
- Заглавная буква в начале, остальные строчные (если не имя собственное)
- Числа без пробела перед
%, но с пробелом в числах >= 1000
- Ошибка: текст типа
"контрагент" — должно быть "Контрагент"
Сохранение настроек пользователя (std468)
<AutoSaveDataInSettings>Use</AutoSaveDataInSettings> + <SaveDataInSettings>UseList</SaveDataInSettings> — корректный паттерн для форм-списков
- Предупреждение:
AutoSaveDataInSettings=DontUse на форме списка — пользователь потеряет настройки при закрытии
Формат вывода для Form.xml — тот же, что для BSL
[ОШИБКА] Элемент "Кнопка2": автогенерированное имя не соответствует стандарту
Правило: Именование элементов формы (std640)
Рекомендация: Переименовать в осмысленное имя, например "КнопкаЗакрыть"
[ОШИБКА] InputField "СуммаДокумента": отсутствует DataPath
Правило: Привязка реквизитов (std468)
Рекомендация: Указать DataPath, соответствующий реквизиту формы
[ПРЕДУПРЕЖДЕНИЕ] WindowOpeningMode = LockOwnerWindow
Правило: Режим открытия окна (std711)
Рекомендация: Использовать DontBlock, если форма не является обязательным диалогом
[ИНФОРМАЦИЯ] InputField "Контрагент": отсутствует ExtendedTooltip
Правило: Подсказки к элементам (std711)
Рекомендация: Добавить подсказку для ключевого поля ввода
1---2name: 1c-standards3description: Проверка кода 1С на соответствие стандартам разработки 1С. Use when: user asks to check 1C code against standards, "проверь код 1С", "стандарты 1С", "code review BSL", "проверка кода", "1С стандарт", "АПК", "review 1C module", "check 1C standards compliance", "оформление модулей", "соглашения при написании кода", "проверь форму", "Form.xml", "check 1C form". TRIGGER when: user opens or reviews .bsl files or Form.xml files, discusses 1C code quality, asks about 1C coding conventions, naming rules, module structure, form layout, UI standards.4---56# Проверка кода 1С на соответствие стандартам78Этот скилл проверяет код 1С:Предприятие (BSL) на соответствие стандартам разработки из "Системы стандартов и методик разработки конфигураций для платформы 1С:Предприятие 8" и требованиям "1С:Совместимо".910Правила извлечены из конфигурации **АПК (Автоматизированная проверка конфигураций) v1.2.9.124** от ООО "1С-Софт".1112## Как использовать1314Пользователь может попросить:15- Проверить конкретный файл `.bsl`16- Проверить все `.bsl` файлы в проекте17- Проверить вставленный фрагмент кода18- Проверить конкретный аспект (именование, структура модуля, запросы)1920## Алгоритм проверки2122### 1. Определить тип проверяемого файла2324**BSL-модуль** — по расположению файла определи тип и запомни контекст выполнения:2526| Файл | Тип модуля | Контекст | Директивы &НаКлиенте/&НаСервере |27|---|---|---|---|28| `Ext/Module.bsl` | Общий модуль | Зависит от флагов модуля (сервер/клиент/везде) | Возможны |29| `Ext/ObjectModule.bsl` | Модуль объекта | Только сервер | Запрещены |30| `Ext/ManagerModule.bsl` | Модуль менеджера | Только сервер | Запрещены |31| `Forms/*/Ext/Form/Module.bsl` | Модуль формы | Клиент + сервер (смешанный) | Обязательны |32| `Ext/SessionModule.bsl` | Модуль сеанса | Только сервер | Запрещены |33| `Ext/ManagedApplicationModule.bsl` | Модуль приложения | Только клиент | `&НаСервере` запрещён |34| `Ext/CommandModule.bsl` | Модуль команды | Только клиент | `&НаСервере` запрещён |3536**Ошибки контекста:**37- `&НаКлиенте` в модуле объекта/менеджера/сеанса → немедленная ошибка компиляции38- `&НаСервере` в модуле приложения/команды → немедленная ошибка компиляции39- Обращение к БД (запросы, объектная модель) в процедуре `&НаКлиенте` → ошибка выполнения4041**XML-описание формы** — файл `Forms/ИмяФормы/Ext/Form.xml`. Требует отдельного алгоритма проверки (см. раздел "Проверка XML форм").4243### 2. Загрузить правила4445Правила находятся в папке `rules/` рядом с этим файлом. Ключевые файлы для проверки кода:4647**Обязательные** (проверяй всегда):48- `rules/00-builtin-checks.md` — встроенные проверки АПК (структура модуля, документация параметров, права ролей, система исключений)49- `rules/04-soglasheniya-pri-napisanii-koda.md` — соглашения при написании кода (именование, структура модулей, оформление)50- `rules/03-realizaciya-obrabotki-dannyh.md` — работа с запросами, оптимизация, обработка данных51- `rules/02-nastrojka-prav-dostupa-k-dannym.md` — права доступа52- `rules/01-sozdanie-i-izmenenie-obektov-metadannyh.md` — параметры сеанса, часовые пояса, ТекущаяДатаСеанса (актуально для любого кода, работающего с датами)53- `rules/12-klient-servernoe-vzaimodejstvie.md` — **загружать если в модуле есть хотя бы одна директива `&НаКлиенте` или `&НаСервере`** (модули форм, общие модули с директивами)5455**По контексту** (загружай при необходимости):56- `rules/00-terminology-dictionary.md` — словарь русских/английских терминов 1С (1044 термина — для проверки двуязычного кода)57- `rules/13-obschie-voprosy-bezopasnosti.md` — безопасность (если есть Выполнить/Вычислить, работа с паролями)58- `rules/11-trebovaniya-po-lokalizacii.md` — локализация (если есть строковые литералы на русском)59- `rules/07-proektirovanie-interfejsov-dlya-8-3.md` — проектирование интерфейсов 8.3 (если проверяешь форму)60- `rules/08-razrabotka-polzovatelskih-interfejsov.md` — разработка интерфейсов (если форма: командный интерфейс, реквизиты, элементы управления)61- `rules/06-razrabotka-i-ispolzovanie-bibliotek.md` — библиотеки (если используется БСП)6263### 3. Проверить код6465#### Шаг 3а — определить тип модуля и добавить специфичные проверки6667**Если модуль формы** (`Forms/*/Ext/Form/Module.bsl`):68- Загрузить `rules/12-klient-servernoe-vzaimodejstvie.md` (обязательно — директивы компиляции есть всегда)69- Применить таблицу сопоставления процедура→область из раздела "Структура модуля (std455)" ниже70- Проверить каждую процедуру: в какой области она находится, соответствует ли это её сигнатуре7172**Если общий модуль** (`Ext/Module.bsl`):73- Загрузить `rules/12-klient-servernoe-vzaimodejstvie.md` если есть директивы компиляции74- Проверить: все экспортные процедуры в области `ПрограммныйИнтерфейс`, все неэкспортные в `СлужебныеПроцедурыИФункции`7576**Если модуль объекта/менеджера** (`Ext/ObjectModule.bsl`, `Ext/ManagerModule.bsl`):77- Проверить наличие обработчиков проведения, удаления в правильных областях7879#### Шаг 3б — общие проверки для всех модулей8081**Оформление модулей:**82- Все процедуры внутри именованных областей `#Область`/`#КонецОбласти`83- Порядок областей соответствует стандарту (см. раздел std455 ниже)84- Экспортные процедуры имеют комментарий в формате:85```bsl86// Описание того, что делает процедура.87//88// Параметры:89// ИмяПараметра - Тип - Описание параметра.90// ВторойПараметр - Тип - Описание.91//92// Возвращаемое значение:93// Тип - Описание возвращаемого значения.94```9596**Именование:**97- Переменные, процедуры, функции — CamelCase на русском98- Процедуры с побочными эффектами — глагол (Записать, Удалить)99- Функции возвращающие значение — существительное или вопрос (ПолучитьСписок, ЭтоДокумент)100- Булевы переменные и функции — утверждение (ЕстьОшибки, ДокументПроведён)101102**Работа с запросами:**103- Запросы не в циклах104- Использование параметров вместо конкатенации строк105- Оформление текста запроса (ключевые слова капсом, отступы)106107**Клиент-серверное взаимодействие** (если в модуле есть `&НаКлиенте` или `&НаСервере`):108- Нет транзакций (`НачатьТранзакцию`) в процедурах `&НаКлиенте`109- Нет запросов и обращений к БД в процедурах `&НаКлиенте`110- Нет серверных вызовов внутри цикла (каждый вызов `&НаСервере` — отдельный roundtrip)111- `&НаСервереБезКонтекста` предпочтительнее `&НаСервере` там, где контекст формы не нужен112- Нет `ОповеститьОбИзменении` / `Оповестить` в серверных процедурах без необходимости113114**Безопасность и права доступа:**115- Нет `Выполнить()` / `Вычислить()` с непроверенными строками116- `ПривилегированныйРежим()` используется только когда это необходимо и явно обосновано117- Перед записью/проведением/удалением объекта есть проверка права: `ПравоДоступа("Изменение", Метаданные.Документы.ИмяДок)`118- Пароли и чувствительные данные не хранятся в реквизитах объектов или в открытом виде — только через безопасное хранилище БСП119- Нет прямого SQL или обхода механизма прав через COM-объекты120121**Производительность:**122- Нет запросов в цикле123- Правильное использование транзакций (минимально необходимый охват)124- Отсутствие избыточных блокировок125126### 4. Формат вывода127128Для каждого найденного нарушения выведи:129130```131[Уровень] Строка N: Описание нарушения132 Правило: Название правила (ссылка на стандарт)133 Рекомендация: Как исправить134```135136Уровни:137- **ОШИБКА** — обязательное к исправлению нарушение138- **ПРЕДУПРЕЖДЕНИЕ** — рекомендуемое к исправлению139- **ИНФОРМАЦИЯ** — рекомендация по улучшению140141В конце выведи сводку:142```143Итого: X ошибок, Y предупреждений, Z информационных144```145146## Критичные нарушения — проверять всегда, независимо от загруженных файлов правил147148| Нарушение | Правильно | Стандарт |149|---|---|---|150| `ТекущаяДата()` | `ТекущаяДатаСеанса()` | std643 — в SaaS/многозонных системах возвращает время сервера, а не сеанса |151| Запрос внутри цикла | Запрос до цикла | std468 — экспоненциальный рост нагрузки на СУБД |152| `"ВЫБРАТЬ ... = " + Переменная` | `"... = &Параметр"` + УстановитьПараметр | std434 — инъекция и отсутствие кэширования планов |153| Пустой блок `Исключение` | `ЗаписьЖурналаРегистрации(...)` | std499 — потеря информации об ошибке |154| `Выполнить(Строка)` без проверки | Проверить источник строки | std524 — выполнение произвольного кода |155156## Важные правила (краткая справка)157158### Тексты модулей (std456)159- Код на русском языке160- Не использовать букву "ё" в коде (допустима в интерфейсных текстах)161- Один оператор — одна строка162- Синтаксический отступ — табуляция163- Не оставлять закомментированный код и TODO164165### Структура модуля (std455)166167#### Обычный/общий модуль — порядок областей:168```169#Область ОписаниеПеременных170#Область ПрограммныйИнтерфейс <- только Экспорт процедуры171#Область СлужебныйПрограммныйИнтерфейс <- вызовы из подсистем (опционально)172#Область СлужебныеПроцедурыИФункции <- всё остальное173#Область Инициализация174```175176#### Модуль формы — порядок областей и правило сопоставления:177```178#Область ОписаниеПеременных179#Область ПрограммныйИнтерфейс180#Область ОбработчикиСобытийФормы181#Область ОбработчикиСобытийЭлементовШапкиФормы182#Область ОбработчикиСобытийЭлементовТаблицыФормы<ИмяТаблицы>183#Область ОбработчикиКомандФормы184#Область СлужебныеПроцедурыИФункции185#Область Инициализация186```187188**Для каждой процедуры в модуле формы определи область по сигнатуре:**189190| Сигнатура | Правильная область |191|---|---|192| `Процедура Имя(Команда)` | `ОбработчикиКомандФормы` |193| `ПриОткрытии`, `ПриСозданииНаСервере`, `ПередЗаписью`, `ПриЗаписи`, `ПослеЗаписи`, `ОбработкаПроверкиЗаполнения`, `ОбработкаВыбора`, `ОбработкаОповещения` | `ОбработчикиСобытийФормы` |194| `<ИмяПоля>ПриИзменении(Элемент)`, `<ИмяПоля>ОкончаниеВводаТекста(Элемент, ...)` — поля шапки | `ОбработчикиСобытийЭлементовШапкиФормы` |195| `<ИмяТаблицы>ПриАктивизацииСтроки`, `<ИмяТаблицы><Колонка>ПриИзменении`, `<ИмяТаблицы>ПередНачаломДобавления` | `ОбработчикиСобытийЭлементовТаблицыФормы<ИмяТаблицы>` |196| `ЧтоТоЗавершение(Результат, ДополнительныеПараметры) Экспорт` | `СлужебныеПроцедурыИФункции` |197| Экспортная процедура, вызываемая снаружи | `ПрограммныйИнтерфейс` |198| Всё остальное | `СлужебныеПроцедурыИФункции` |199200**Ошибки разметки областей:**201- Процедура с `(Команда)` лежит в `СлужебныеПроцедурыИФункции`202- `ПриОткрытии` / `ПриСозданииНаСервере` вне `ОбработчикиСобытийФормы`203- Процедуры вообще вне каких-либо областей204- Области есть, но порядок нарушен205206### Именование переменных и процедур (std640)207- CamelCase (ВерблюжийРегистр)208- Осмысленные имена, не аббревиатуры209- Без префиксов типов (не `стрИмя`, а `Имя`)210- Булевы — утверждение (`ЕстьОшибки`, не `Ошибки`)211212### Работа с запросами (std434)213- Ключевые слова заглавными: ВЫБРАТЬ, ИЗ, ГДЕ, И, ИЛИ214- Имена таблиц и полей — CamelCase215- Параметры через `&ИмяПараметра`216- Не собирать запрос конкатенацией строк217218### Обработка исключительных ситуаций (std499)219- В блоке Исключение обязательно записать в журнал220- Не использовать пустой блок Исключение221- Не перехватывать все исключения без необходимости222223---224225## Проверка XML форм (Form.xml)226227Файл `Forms/ИмяФормы/Ext/Form.xml` описывает структуру управляемой формы. При получении такого файла выполни проверку по следующим правилам.228229### Как читать Form.xml230231Ключевые теги:232```xml233<Form>234 <Title><v8:item><v8:lang>ru</v8:lang><v8:content>Заголовок</v8:content></v8:item></Title>235 <AutoTitle>false</AutoTitle> <!-- false = заголовок задан явно -->236 <WindowOpeningMode>...</WindowOpeningMode> <!-- режим открытия окна -->237 <AutoCommandBar name="..."> <!-- командная панель -->238 <Button name="..." ButtonImportance="Main">239 <DefaultButton>true</DefaultButton>240 <Events>241 <Event name="OnOpen">ПриОткрытии</Event> <!-- связь с обработчиком BSL -->242 <ChildItems> <!-- дерево элементов формы -->243 <Pages>, <Page>, <UsualGroup>, <InputField>, <CheckBoxField>,244 <RadioButtonField>, <Button>, <Table>, <LabelDecoration>245```246247### Проверки по правилам248249#### Заголовок формы (std711)250- `<AutoTitle>false</AutoTitle>` — обязателен явный заголовок в `<Title>`251- Заголовок должен быть в именительном падеже, с заглавной буквы252- Не использовать в заголовке название объекта метаданных дословно (не "Справочник.Контрагенты", а "Контрагенты")253- Нет буквы "ё" в заголовке254255#### Режим открытия окна (std711)256- `<WindowOpeningMode>` — допустимые значения:257 - `DontBlock` — для большинства форм (не блокирует родительское окно)258 - `LockOwnerWindow` — только для диалогов, требующих обязательного ответа259 - `Independent` — только для форм, работающих независимо260- **Ошибка**: использование `LockOwnerWindow` для обычных форм списков и объектов261262#### Кнопки (std430)263- `<DefaultButton>true` — должна быть не более одной кнопки по умолчанию на форме264- `<ButtonImportance>Main` — основных кнопок не более двух265- Кнопки закрытия/отмены не должны иметь `ButtonImportance=Main`266- `<Visible>false` на кнопке в командной панели — проверить, не является ли она мёртвым кодом267268#### Именование элементов (std640)269Атрибут `name=` каждого элемента:270- CamelCase на русском: `ГруппаОсновныеРеквизиты`, `ТаблицаТоваров`271- Без технических префиксов: не `грpОсновные`, а `ГруппаОсновные`272- Страницы: имя отражает содержимое (`СтраницаОсновное`, `СтраницаДополнительно`)273- Группы: `ГруппаШапка`, `ГруппаКоманды`, `ГруппаПодвал`274- **Ошибка**: автогенерированные имена типа `Группа1`, `Кнопка2`, `Поле3`275276#### Привязка реквизитов к данным (std468)277- Каждый `<InputField>`, `<CheckBoxField>`, `<RadioButtonField>` должен иметь `<DataPath>`278- **Ошибка**: элемент ввода без `<DataPath>` — нет привязки к реквизиту формы279- `<DataPath>` должен совпадать с именем реквизита в CamelCase280281#### Структура групп (std711, std727)282- Вертикальные группы (`<Group>Vertical</Group>`) — для последовательного размещения полей283- Горизонтальные (`<Group>AlwaysHorizontal</Group>`) — для элементов в строку (не более 3-4 полей)284- **Предупреждение**: горизонтальная группа с более чем 4 дочерними элементами — вероятно нарушение компоновки285- `<Representation>None</Representation>` + `<ShowTitle>false</ShowTitle>` на группах — корректный паттерн для скрытия рамки286287#### Подсказки (std711)288- `<ExtendedTooltip>` — рекомендуется для ключевых полей ввода289- **Информация**: поле ввода без `<ExtendedTooltip>` — рассмотреть добавление подсказки290291#### Вкладки (std711, std727)292- `<PagesRepresentation>` — допустимые значения:293 - `TabsOnTop` — стандартные вкладки сверху (предпочтительно)294 - `TabsOnLeftHorizontal` — вкладки слева с горизонтальным текстом295 - `None` — вкладки без заголовков (только если переключение программное)296- Имена страниц должны быть осмысленными, не "Страница1"297298#### Обработчики событий (std640)299В блоке `<Events>` каждого элемента:300- Имя обработчика должно совпадать с паттерном: `ИмяЭлемента` + `ИмяСобытия`301 - Например: `<Event name="OnChange">КонтрагентПриИзменении</Event>`302- **Ошибка**: обработчик с именем не по стандарту (например, `ОбработатьИзменение` вместо `КонтрагентПриИзменении`)303- Событие формы `OnOpen` → `ПриОткрытии`, `OnCreateAtServer` → `ПриСозданииНаСервере`304305#### Орфография заголовков (std23)306Все тексты в `<v8:content>`:307- Без буквы "ё" (кроме имён собственных)308- Заглавная буква в начале, остальные строчные (если не имя собственное)309- Числа без пробела перед `%`, но с пробелом в числах >= 1000310- **Ошибка**: текст типа `"контрагент"` — должно быть `"Контрагент"`311312#### Сохранение настроек пользователя (std468)313- `<AutoSaveDataInSettings>Use</AutoSaveDataInSettings>` + `<SaveDataInSettings>UseList</SaveDataInSettings>` — корректный паттерн для форм-списков314- **Предупреждение**: `AutoSaveDataInSettings=DontUse` на форме списка — пользователь потеряет настройки при закрытии315316### Формат вывода для Form.xml — тот же, что для BSL317318```319[ОШИБКА] Элемент "Кнопка2": автогенерированное имя не соответствует стандарту320 Правило: Именование элементов формы (std640)321 Рекомендация: Переименовать в осмысленное имя, например "КнопкаЗакрыть"322323[ОШИБКА] InputField "СуммаДокумента": отсутствует DataPath324 Правило: Привязка реквизитов (std468)325 Рекомендация: Указать DataPath, соответствующий реквизиту формы326327[ПРЕДУПРЕЖДЕНИЕ] WindowOpeningMode = LockOwnerWindow328 Правило: Режим открытия окна (std711)329 Рекомендация: Использовать DontBlock, если форма не является обязательным диалогом330331[ИНФОРМАЦИЯ] InputField "Контрагент": отсутствует ExtendedTooltip332 Правило: Подсказки к элементам (std711)333 Рекомендация: Добавить подсказку для ключевого поля ввода334```