---
name: 1c-standards
description: >
  Проверка кода 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.
version: 1.0.0
user-invocable: true
---

# Проверка кода 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 ниже)
- Экспортные процедуры имеют комментарий в формате:
```bsl
// Описание того, что делает процедура.
//
// Параметры:
//  ИмяПараметра - Тип - Описание параметра.
//  ВторойПараметр - Тип - Описание.
//
// Возвращаемое значение:
//  Тип - Описание возвращаемого значения.
```

**Именование:**
- Переменные, процедуры, функции — 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

Ключевые теги:
```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)
  Рекомендация: Добавить подсказку для ключевого поля ввода
```
