An open API service indexing awesome lists of open source software.

https://github.com/skyksandr/1c-styleguide

Руководство по стилю оформления
https://github.com/skyksandr/1c-styleguide

Last synced: 6 months ago
JSON representation

Руководство по стилю оформления

Awesome Lists containing this project

README

          

# 1С: Руководство по стилю оформления

> Почти все убеждены, что любой стиль кроме их собственного ужасен и нечитаем. Уберите отсюда "кроме их собственного" — и они будут, наверное, правы...
>
> -- Джерри Коффин (Jerry Coffin) об отступах

## Оформление модулей

- Длина строки в общем случае не должна превышать 120 символов.
- Для отступов необходимо использовать символы табуляции.
- Одна строка кода - одна управляющая конструкция.

```bsl
// Плохо:
Если ЭтоБрак Тогда Продолжить; КонецЕсли;

// Хорошо:
Если ЭтоБрак Тогда
Продолжить;
КонецЕсли;
```
- Следует отделять друг от друга пробелами ключевые слова, вызовы процедур и функций, параметры процедур и функций внутри скобок, операторы.

```bsl
// Плохо:
Сообщить(“Сумма: “+Сумма);

// Хорошо:
Сообщить(“Сумма: “ + Сумма);
```

- Для разделения на логические части внутри модуля следует использовать пустые строки
- При вызове функции с несколькими параметрами при переносе строк необходимо выравнивать параметры по первому

```bsl
// Начальное состояние (строка слишком длинная):
НалоговыйУчет.ОстаткиВременныхРазниц(СтрокаВидАктиваОбязательства, СписокОрганизаций, Реквизиты.НачалоГода, Реквизиты.КонДата);

// Плохо:
НалоговыйУчет.ОстаткиВременныхРазниц(
СтрокаВидАктиваОбязательства, СписокОрганизаций, Реквизиты.НачалоГода, Реквизиты.КонДата);

// Лучше:
НалоговыйУчет.ОстаткиВременныхРазниц(СтрокаВидАктиваОбязательства,
СписокОрганизаций,
Реквизиты.НачалоГода,
Реквизиты.КонДата);

// Хорошо:
НалоговыйУчет.ОстаткиВременныхРазниц(
СтрокаВидАктиваОбязательства,
СписокОрганизаций,
Реквизиты.НачалоГода,
Реквизиты.КонДата);

```

- Выравнивание однотипных операторов. При следовании друг за другом нескольких однотипных операторов допускается их выравнивание. Выравнивание следует выполнять с помощью пробелов

```bsl
// Хорошо:
НоваяСтрока = ВидыОпераций.Добавить();
НоваяСтрока.ВидОперации = ВидОперации;
НоваяСтрока.НомерГруппы = ГруппаПоВидуОперации(ВидОперации);
НоваяСтрока.ПоОрганизацииВЦелом = ГруппаПоОрганизации(НоваяСтрок);
```

### Методы

- Параметр функции не должен возвращать значение. Иными словами не используйте входные параметры функций как дополнительный вывод. Весь вывод должен быть в возвращаемом значении. Если нужно возвращать несколько значений следует использовать такие типы как `Структура`, `Массив` и т.д.
```bsl
// Плохо:
URLСервиса = "";
ИмяПользователя = "";
ПарольПользователя = "";

ЗаполнитьПараметрыПодключения(URLСервиса, ИмяПользователя, Пароль);

// Хорошо:
ПараметрыПодключения = ПолучитьПараметрыПодключения();
// Возвращаемое значение - структура:
// URLСервиса - Строка
// ИмяПользователя - Строка
// ПарольПользователя - Строка
```

### Условия
- Предпочтительней использовать тернарный оператор для простых конструкций.
```bsl
// Плохо:
Если НДС0 Тогда
Возврат 0;
Иначе
Возврат 18;
КонецЕсли;

// Хорошо:
Возврат ?(НДС0, 0, 18);
```

- Не допускайте использования вложенных тернарных операторов.
- Ключевое слово `Тогда` пишется на той же строке, что и последнее условие.
- Сложные условия (содержащие 3 конструкции и более) необходимо выносить в отдельные методы.

```bsl
// Плохо:
Если ИдентификаторОбъекта = "АнализСубконто"
ИЛИ ИдентификаторОбъекта = "АнализСчета"
ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомость"
ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомостьПоСчету"
ИЛИ ИдентификаторОбъекта = "ОборотыМеждуСубконто"
ИЛИ ИдентификаторОбъекта = "ОборотыСчета"
ИЛИ ИдентификаторОбъекта = "СводныеПроводки"
ИЛИ ИдентификаторОбъекта = "ГлавнаяКнига"
ИЛИ ИдентификаторОбъекта = "ШахматнаяВедомость" Тогда
ПараметрыРасшифровки.Вставить("ОткрытьОбъект", Ложь);

ЕстьПоказатель = Ложь;
ЕстьКорЗначение = Ложь;
ЕстьСчет = Истина;
Счет = Неопределено;
ПервыйЭлемент = Неопределено;
КонецЕсли;

// Хорошо:
Если ОткрыватьОбъектПриИдентификаторе(ИдентификаторОбъекта) Тогда
ПараметрыРасшифровки.Вставить("ОткрытьОбъект", Ложь);

ЕстьПоказатель = Ложь;
ЕстьКорЗначение = Ложь;
ЕстьСчет = Истина;
Счет = Неопределено;
ПервыйЭлемент = Неопределено;
КонецЕсли;

Функция ОткрыватьОбъектПриИдентификаторе(ИдентификаторОбъекта)

Возврат ИдентификаторОбъекта = "АнализСубконто"
ИЛИ ИдентификаторОбъекта = "АнализСчета"
ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомость"
ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомостьПоСчету"
ИЛИ ИдентификаторОбъекта = "ОборотыМеждуСубконто"
ИЛИ ИдентификаторОбъекта = "ОборотыСчета"
ИЛИ ИдентификаторОбъекта = "СводныеПроводки"
ИЛИ ИдентификаторОбъекта = "ГлавнаяКнига"
ИЛИ ИдентификаторОбъекта = "ШахматнаяВедомость";

КонецФункции
```

- Избегайте использование Йода-синтаксиса.
```bsl
// Плохо:
Если 0 = Сумма Тогда

// Хорошо:
Если Сумма = 0 Тогда
```

### Переменные

- Избегайте неявного определения переменных
```bsl
// Плохо
Функция ИдентификаторОбъекта(Объект)
// Ошибки не будет, даже если переменная не определена в области видимости.
// В результате будет определена переменная со значением Неопределено.
ВашаПеременная = ВашаПеременная;

Если Не ЗначениеЗаполнено(ВашаПеременная) Тогда
...
КонецЕсли;
КонецФункции

// Хорошо
Функция ИдентификаторОбъекта(Объект)
Перем ВашаПеременная;
...
КонецФункции
```

### Имена процедур, функций, переменных

- Следуюйте общему подходу именования
```bsl
// Плохо:
этобрак, ЭТОБРАК, этоБрак

// Хорошо:
ЭтоБрак
```

- Не используйте отрицание в именах переменных и методов
```bsl
// Плохо:
Функция ПроверкаНеПройдена()
...

Если Не (Условие И Не ПроверкаНеПройдена()) Тогда

// Хорошо:
Функция ПроверкаПройдена()
...

Если Не Условие И Не ПроверкаПройдена() Тогда
```

### Комментарии
- Если код требует комментария для пояснения работы - в первую очередь необходимо рассмотреть варианты рефакторинга, чтобы код не требовал комментария.
- К комментариям также относятся ограничения на длину строки в 120 символов.

## Создание, изменение объектов метаданных

- Если составной тип используется многократно, следует использовать объект конфигурации "Определяемый тип". Пример: "Документ резервирования", "Документ партии".