├── LICENSE └── README.md /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2016 Aleksandr 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # 1С: Руководство по стилю оформления 2 | 3 | > Почти все убеждены, что любой стиль кроме их собственного ужасен и нечитаем. Уберите отсюда "кроме их собственного" — и они будут, наверное, правы... 4 | > 5 | > -- Джерри Коффин (Jerry Coffin) об отступах 6 | 7 | ## Оформление модулей 8 | 9 | - Длина строки в общем случае не должна превышать 120 символов. 10 | - Для отступов необходимо использовать символы табуляции. 11 | - Одна строка кода - одна управляющая конструкция. 12 | 13 | ```bsl 14 | // Плохо: 15 | Если ЭтоБрак Тогда Продолжить; КонецЕсли; 16 | 17 | // Хорошо: 18 | Если ЭтоБрак Тогда 19 | Продолжить; 20 | КонецЕсли; 21 | ``` 22 | - Следует отделять друг от друга пробелами ключевые слова, вызовы процедур и функций, параметры процедур и функций внутри скобок, операторы. 23 | 24 | ```bsl 25 | // Плохо: 26 | Сообщить(“Сумма: “+Сумма); 27 | 28 | // Хорошо: 29 | Сообщить(“Сумма: “ + Сумма); 30 | ``` 31 | 32 | - Для разделения на логические части внутри модуля следует использовать пустые строки 33 | - При вызове функции с несколькими параметрами при переносе строк необходимо выравнивать параметры по первому 34 | 35 | ```bsl 36 | // Начальное состояние (строка слишком длинная): 37 | НалоговыйУчет.ОстаткиВременныхРазниц(СтрокаВидАктиваОбязательства, СписокОрганизаций, Реквизиты.НачалоГода, Реквизиты.КонДата); 38 | 39 | // Плохо: 40 | НалоговыйУчет.ОстаткиВременныхРазниц( 41 | СтрокаВидАктиваОбязательства, СписокОрганизаций, Реквизиты.НачалоГода, Реквизиты.КонДата); 42 | 43 | // Лучше: 44 | НалоговыйУчет.ОстаткиВременныхРазниц(СтрокаВидАктиваОбязательства, 45 | СписокОрганизаций, 46 | Реквизиты.НачалоГода, 47 | Реквизиты.КонДата); 48 | 49 | // Хорошо: 50 | НалоговыйУчет.ОстаткиВременныхРазниц( 51 | СтрокаВидАктиваОбязательства, 52 | СписокОрганизаций, 53 | Реквизиты.НачалоГода, 54 | Реквизиты.КонДата); 55 | 56 | ``` 57 | 58 | - Выравнивание однотипных операторов. При следовании друг за другом нескольких однотипных операторов допускается их выравнивание. Выравнивание следует выполнять с помощью пробелов 59 | 60 | ```bsl 61 | // Хорошо: 62 | НоваяСтрока = ВидыОпераций.Добавить(); 63 | НоваяСтрока.ВидОперации = ВидОперации; 64 | НоваяСтрока.НомерГруппы = ГруппаПоВидуОперации(ВидОперации); 65 | НоваяСтрока.ПоОрганизацииВЦелом = ГруппаПоОрганизации(НоваяСтрок); 66 | ``` 67 | 68 | ### Методы 69 | 70 | - Параметр функции не должен возвращать значение. Иными словами не используйте входные параметры функций как дополнительный вывод. Весь вывод должен быть в возвращаемом значении. Если нужно возвращать несколько значений следует использовать такие типы как `Структура`, `Массив` и т.д. 71 | ```bsl 72 | // Плохо: 73 | URLСервиса = ""; 74 | ИмяПользователя = ""; 75 | ПарольПользователя = ""; 76 | 77 | ЗаполнитьПараметрыПодключения(URLСервиса, ИмяПользователя, Пароль); 78 | 79 | // Хорошо: 80 | ПараметрыПодключения = ПолучитьПараметрыПодключения(); 81 | // Возвращаемое значение - структура: 82 | // URLСервиса - Строка 83 | // ИмяПользователя - Строка 84 | // ПарольПользователя - Строка 85 | ``` 86 | 87 | ### Условия 88 | - Предпочтительней использовать тернарный оператор для простых конструкций. 89 | ```bsl 90 | // Плохо: 91 | Если НДС0 Тогда 92 | Возврат 0; 93 | Иначе 94 | Возврат 18; 95 | КонецЕсли; 96 | 97 | // Хорошо: 98 | Возврат ?(НДС0, 0, 18); 99 | ``` 100 | 101 | - Не допускайте использования вложенных тернарных операторов. 102 | - Ключевое слово `Тогда` пишется на той же строке, что и последнее условие. 103 | - Сложные условия (содержащие 3 конструкции и более) необходимо выносить в отдельные методы. 104 | 105 | ```bsl 106 | // Плохо: 107 | Если ИдентификаторОбъекта = "АнализСубконто" 108 | ИЛИ ИдентификаторОбъекта = "АнализСчета" 109 | ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомость" 110 | ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомостьПоСчету" 111 | ИЛИ ИдентификаторОбъекта = "ОборотыМеждуСубконто" 112 | ИЛИ ИдентификаторОбъекта = "ОборотыСчета" 113 | ИЛИ ИдентификаторОбъекта = "СводныеПроводки" 114 | ИЛИ ИдентификаторОбъекта = "ГлавнаяКнига" 115 | ИЛИ ИдентификаторОбъекта = "ШахматнаяВедомость" Тогда 116 | ПараметрыРасшифровки.Вставить("ОткрытьОбъект", Ложь); 117 | 118 | ЕстьПоказатель = Ложь; 119 | ЕстьКорЗначение = Ложь; 120 | ЕстьСчет = Истина; 121 | Счет = Неопределено; 122 | ПервыйЭлемент = Неопределено; 123 | КонецЕсли; 124 | 125 | // Хорошо: 126 | Если ОткрыватьОбъектПриИдентификаторе(ИдентификаторОбъекта) Тогда 127 | ПараметрыРасшифровки.Вставить("ОткрытьОбъект", Ложь); 128 | 129 | ЕстьПоказатель = Ложь; 130 | ЕстьКорЗначение = Ложь; 131 | ЕстьСчет = Истина; 132 | Счет = Неопределено; 133 | ПервыйЭлемент = Неопределено; 134 | КонецЕсли; 135 | 136 | Функция ОткрыватьОбъектПриИдентификаторе(ИдентификаторОбъекта) 137 | 138 | Возврат ИдентификаторОбъекта = "АнализСубконто" 139 | ИЛИ ИдентификаторОбъекта = "АнализСчета" 140 | ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомость" 141 | ИЛИ ИдентификаторОбъекта = "ОборотноСальдоваяВедомостьПоСчету" 142 | ИЛИ ИдентификаторОбъекта = "ОборотыМеждуСубконто" 143 | ИЛИ ИдентификаторОбъекта = "ОборотыСчета" 144 | ИЛИ ИдентификаторОбъекта = "СводныеПроводки" 145 | ИЛИ ИдентификаторОбъекта = "ГлавнаяКнига" 146 | ИЛИ ИдентификаторОбъекта = "ШахматнаяВедомость"; 147 | 148 | КонецФункции 149 | ``` 150 | 151 | - Избегайте использование Йода-синтаксиса. 152 | ```bsl 153 | // Плохо: 154 | Если 0 = Сумма Тогда 155 | 156 | // Хорошо: 157 | Если Сумма = 0 Тогда 158 | ``` 159 | 160 | ### Переменные 161 | 162 | - Избегайте неявного определения переменных 163 | ```bsl 164 | // Плохо 165 | Функция ИдентификаторОбъекта(Объект) 166 | // Ошибки не будет, даже если переменная не определена в области видимости. 167 | // В результате будет определена переменная со значением Неопределено. 168 | ВашаПеременная = ВашаПеременная; 169 | 170 | Если Не ЗначениеЗаполнено(ВашаПеременная) Тогда 171 | ... 172 | КонецЕсли; 173 | КонецФункции 174 | 175 | // Хорошо 176 | Функция ИдентификаторОбъекта(Объект) 177 | Перем ВашаПеременная; 178 | ... 179 | КонецФункции 180 | ``` 181 | 182 | ### Имена процедур, функций, переменных 183 | 184 | - Следуюйте общему подходу именования 185 | ```bsl 186 | // Плохо: 187 | этобрак, ЭТОБРАК, этоБрак 188 | 189 | // Хорошо: 190 | ЭтоБрак 191 | ``` 192 | 193 | - Не используйте отрицание в именах переменных и методов 194 | ```bsl 195 | // Плохо: 196 | Функция ПроверкаНеПройдена() 197 | ... 198 | 199 | Если Не (Условие И Не ПроверкаНеПройдена()) Тогда 200 | 201 | // Хорошо: 202 | Функция ПроверкаПройдена() 203 | ... 204 | 205 | Если Не Условие И Не ПроверкаПройдена() Тогда 206 | ``` 207 | 208 | ### Комментарии 209 | - Если код требует комментария для пояснения работы - в первую очередь необходимо рассмотреть варианты рефакторинга, чтобы код не требовал комментария. 210 | - К комментариям также относятся ограничения на длину строки в 120 символов. 211 | 212 | ## Создание, изменение объектов метаданных 213 | 214 | - Если составной тип используется многократно, следует использовать объект конфигурации "Определяемый тип". Пример: "Документ резервирования", "Документ партии". 215 | --------------------------------------------------------------------------------