Почти все убеждены, что любой стиль кроме их собственного ужасен и нечитаем. Уберите отсюда "кроме их собственного" — и они будут, наверное, правы...
-- Джерри Коффин (Jerry Coffin) об отступах
- Используйте CAPS LOCK для обозначения переменных, которые будут выполнять роль констант
СТАТУС_ОТПРАВКИ_OK = 1;
СТАТУС_ОТПРАВКИ_ERR = 2;
- Используйте венгерскую нотацию в именах переменных
Тип | Русское | Английское | Пример |
---|---|---|---|
Примитивные типы | |||
число | ч | n | чКоличество; nNumber |
строка | с | s | сТекст; sError |
дата | д | d | дНачало; dBegin |
булево | б | b | бФлаг; bFlag |
Универсальные коллекции | |||
массив | м | a | мДокументы; aDocs |
структура | ст | st | стПараметры; stParam |
таблица значений | тз | vt | тзТовары; vtGoods |
дерево значений | дз | tr | дзДокумент; trDoc |
соответствие | со | mp | соАдреса; mpAddr |
список значений | сз | vl | сзФорма; vlForm |
Типы прикладных объектов | |||
ссылка на прикладной объект | реф | ref | рефСпрНоменклатура; refCatGoods |
сам прикладной объект | о | obj | оСпрНоменклатура; objCatGoods |
справочник | Спр | Cat | рефСпрНоменклатура; refCatGoods |
документ | Док | Doc | рефДокАкт; refDocAct |
регистры сведений | РС | IR | РСОстатки; IRRemain |
регистры накоплений | РН | AR | РНОстатки; ARRemain |
- Для переменных модуля используйте префикс
м_
Перем м_рефCOMобъект;
- Используйте стиль CamelCase при именовании переменных и методов. Так же в наименованиях допустимы суффиксы, указанные через
_
Перем бВыполненоБезОшибок = Истина;
Процедура УдалитьВременныеФайлы_Локально()
// код метода
КонецПроцедуры
Процедура УдалитьВременныеФайлы_УдСервер()
// код метода
КонецПроцедуры
- Не используйте отрицание в именах переменных и методов
// Плохо:
Функция ПроверкаНеПройдена()
// Хорошо:
Функция ПроверкаПройдена()
- Длина строки в общем случае не должна превышать 120 символов.
- Для отступов необходимо использовать символы табуляции.
- Одна строка кода - одна управляющая конструкция.
// Плохо:
Если бЭтоБрак Тогда Продолжить; КонецЕсли;
// Хорошо:
Если бЭтоБрак Тогда
Продолжить;
КонецЕсли;
- Следует отделять друг от друга пробелами ключевые слова, вызовы процедур и функций, параметры процедур и функций внутри скобок, операторы.
// Плохо:
Сообщить(“Сумма: “+Сумма);
// Хорошо:
Сообщить(“Сумма: “ + Сумма);
- Для разделения на логические части внутри модуля следует использовать пустые строки
- При вызове функции с несколькими параметрами при переносе строк необходимо выравнивать параметры по первому
// Начальное состояние (строка слишком длинная):
НалоговыйУчет.ОстаткиВременныхРазниц(СтрокаВидАктиваОбязательства, СписокОрганизаций, Реквизиты.НачалоГода, Реквизиты.КонДата);
// Плохо:
НалоговыйУчет.ОстаткиВременныхРазниц(
СтрокаВидАктиваОбязательства, СписокОрганизаций, Реквизиты.НачалоГода, Реквизиты.КонДата);
// Лучше:
НалоговыйУчет.ОстаткиВременныхРазниц(СтрокаВидАктиваОбязательства,
СписокОрганизаций,
Реквизиты.НачалоГода,
Реквизиты.КонДата);
// Хорошо:
НалоговыйУчет.ОстаткиВременныхРазниц(
СтрокаВидАктиваОбязательства,
СписокОрганизаций,
Реквизиты.НачалоГода,
Реквизиты.КонДата);
- Выравнивание однотипных операторов. При следовании друг за другом нескольких однотипных операторов допускается их выравнивание. Выравнивание следует выполнять с помощью пробелов
// Хорошо:
НоваяСтрока = ВидыОпераций.Добавить();
НоваяСтрока.ВидОперации = ВидОперации;
НоваяСтрока.НомерГруппы = ГруппаПоВидуОперации(ВидОперации);
НоваяСтрока.ПоОрганизацииВЦелом = ГруппаПоОрганизации(НоваяСтрок);
-
Метод должен иметь описание созданное с помощью команды "Создать описание процедуры" (щелчек правой кнопкой мыши на наименовании метода - Рефакторинг - Создать описание процедуры)
-
Параметр функции не должен возвращать значение. Иными словами не используйте входные параметры функций как дополнительный вывод. Весь вывод должен быть в возвращаемом значении. Если нужно возвращать несколько значений следует использовать такие типы как
Структура
,Массив
и т.д.
// Плохо:
URLСервиса = "";
ИмяПользователя = "";
ПарольПользователя = "";
ЗаполнитьПараметрыПодключения(URLСервиса, ИмяПользователя, Пароль);
// Хорошо:
ПараметрыПодключения = ПолучитьПараметрыПодключения();
// Возвращаемое значение - структура:
// URLСервиса - Строка
// ИмяПользователя - Строка
// ПарольПользователя - Строка
- Предпочтительней использовать тернарный оператор для простых конструкций.
// Плохо:
Если НДС0 Тогда
Возврат 0;
Иначе
Возврат 18;
КонецЕсли;
// Хорошо:
Возврат ?(НДС0, 0, 18);
- Не допускайте использования вложенных тернарных операторов.
- Ключевое слово
Тогда
пишется на той же строке, что и последнее условие. - Сложные условия (содержащие 3 конструкции и более) необходимо выносить в отдельные методы.
// Плохо:
Если ИдентификаторОбъекта = "АнализСубконто"
ИЛИ ИдентификаторОбъекта = "АнализСчета"
ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомость"
ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомостьПоСчету"
ИЛИ ИдентификаторОбъекта = "ОборотыМеждуСубконто"
ИЛИ ИдентификаторОбъекта = "ОборотыСчета"
ИЛИ ИдентификаторОбъекта = "СводныеПроводки"
ИЛИ ИдентификаторОбъекта = "ГлавнаяКнига"
ИЛИ ИдентификаторОбъекта = "ШахматнаяВедомость" Тогда
ПараметрыРасшифровки.Вставить("ОткрытьОбъект", Ложь);
ЕстьПоказатель = Ложь;
ЕстьКорЗначение = Ложь;
ЕстьСчет = Истина;
Счет = Неопределено;
ПервыйЭлемент = Неопределено;
КонецЕсли;
// Хорошо:
Если ОткрыватьОбъектПриИдентификаторе(ИдентификаторОбъекта) Тогда
ПараметрыРасшифровки.Вставить("ОткрытьОбъект", Ложь);
ЕстьПоказатель = Ложь;
ЕстьКорЗначение = Ложь;
ЕстьСчет = Истина;
Счет = Неопределено;
ПервыйЭлемент = Неопределено;
КонецЕсли;
Функция ОткрыватьОбъектПриИдентификаторе(ИдентификаторОбъекта)
Возврат ИдентификаторОбъекта = "АнализСубконто"
ИЛИ ИдентификаторОбъекта = "АнализСчета"
ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомость"
ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомостьПоСчету"
ИЛИ ИдентификаторОбъекта = "ОборотыМеждуСубконто"
ИЛИ ИдентификаторОбъекта = "ОборотыСчета"
ИЛИ ИдентификаторОбъекта = "СводныеПроводки"
ИЛИ ИдентификаторОбъекта = "ГлавнаяКнига"
ИЛИ ИдентификаторОбъекта = "ШахматнаяВедомость";
КонецФункции
- Избегайте использование Йода-синтаксиса.
// Плохо:
Если 0 = Сумма Тогда
// Хорошо:
Если Сумма = 0 Тогда
- Избегайте неявного определения переменных
// Плохо
Функция ИдентификаторОбъекта(Объект)
// Ошибки не будет, даже если переменная не определена в области видимости.
// В результате будет определена переменная со значением Неопределено.
ВашаПеременная = ВашаПеременная;
Если Не ЗначениеЗаполнено(ВашаПеременная) Тогда
...
КонецЕсли;
КонецФункции
// Хорошо
Функция ИдентификаторОбъекта(Объект)
Перем ВашаПеременная;
...
КонецФункции
- Если код требует комментария для пояснения работы - в первую очередь необходимо рассмотреть варианты рефакторинга, чтобы код не требовал комментария.
- К комментариям также относятся ограничения на длину строки в 120 символов.
- Проверяйте параметры методов на корректность перед использованием
Процедура Рассчитатьпроцент(стКоллекцияСтрок)
Если ТипЗнч(стКоллекцияСтрок)<>Тип("Структура") ИЛИ стКоллекцияСтрок.Количество()=0 Тогда
// обработка ошибки
КонецЕсли;
// код метода
КонецПроцедуры
- При обнаружении некорректного параметра инициализируйте его значением по умолчанию или обработайте ошибку
- Инициализируйте параметры методов значениями по умолчанию только в случае полной уверенности корректности этого значения с точки зрения бизнеса
- Помните, что код заключенный в операторную скобку
TRY - CATCH
выполняется медленнее
- Запись сообщения об ошибке в лог предпочтительнее сообщения пользователю
- Сообщение пользователю об ошибке должно быть ориентировано на пользователя
// Плохо
сТекстСообщенияПользователю = "В методе РассчитатьПроцент() параметр стКоллекцияСтрок пуст или не является структурой.";
// Хорошо
сТекстСообщенияПользователю = "При расчете процентов произошла ошибка. Проценты не расчитаны. Продробнее в Журнале регистрации."
- Если составной тип используется многократно, следует использовать объект конфигурации "Определяемый тип". Пример: "Документ резервирования", "Документ партии".