При совместной разработке или поддержке нетиповых конфигураций отсутствие единых договоренностей по стилю кода приводит к ухудшению читаемости, сложностям при слиянии изменений и регулярным ошибкам рефакторинга. Разберем основные принципы и практические правила, которые необходимо включить в стандарт разработки команды, опираясь на официальные стандарты платформы и опыт сообщества.
Одной из распространенных ошибок при проектировании булевых переменных и функций является включение частицы отрицания прямо в их идентификатор (например, НеСоответствует, НеЗаполнено или НеЗначениеЗаполнено). Проанализируем, к чему это приводит на практике:
Рано или поздно при усложнении логики алгоритма в коде возникнет конструкция с двойным отрицанием:
Если Не НеЗначениеЗаполнено Тогда
ВыполнитьДействие();
КонецЕсли;
Такой синтаксис существенно затрудняет восприятие логического условия и повышает вероятность ошибки. Рекомендуется всегда формировать имена предикатов в утвердительной форме: ЗначениеЗаполнено, СоответствуетУсловию, ДанныеКорректны. Отрицание должно задаваться исключительно оператором Не в самом выражении:
Если Не ЗначениеЗаполнено Тогда
ВыполнитьДействие();
КонецЕсли;
Классический принцип проектирования «параметр функции не должен неявно возвращать значение» направлен на устранение побочных эффектов. В платформе 1С присутствует ряд встроенных методов, возвращающих значение через параметр по ссылке (например, метод Свойство у объекта Структура):
Значение = Неопределено;
Если СтруктураПараметров.Свойство("КлючПоиска", Значение) Тогда
ОбработатьЗначение(Значение);
КонецЕсли;
При написании собственных прикладных процедур и функций следует избегать передачи данных наружу через параметры. Проанализируем рекомендации по проектированию сигнатур:
Возврат.Знач для параметров, изменение которых внутри тела метода не должно влиять на вызывающий контекст.При доработке типовых конфигураций или внедрении собственной подсистемы критически важно соблюдать единую схему именования объектов метаданных. Недопустимо называть модули именем конкретного программиста или наименованием компании-интегратора (например, Франчайзи_ОбщегоНазначения). При смене исполнителя такой код создает проблемы и требует массового рефакторинга вызовов.
Рассмотрим правила формирования префиксов:
инт_ для интеграций, внедр_ для проектных доработок).Префикс_ОбработчикиПодписокНаСобытия, Префикс_ОбщегоНазначенияКлиент, Префикс_ОбщегоНазначенияСервер.Для сохранения читаемости кода при вертикальном разделении экранов и проведении код-ревью в системах контроля версий принято соглашение: длина строки не должна превышать 120 символов.
Разберем правила переноса длинных конструкций:
И и ИЛИ переносятся на новую строку с выравниванием по левому краю условия:
Если ЭтоНовыйКонтрагент
И Не Отказ
Или ПринудительнаяЗапись Тогда
ЗафиксироватьИзменения();
КонецЕсли;
ВЫБРАТЬ, ИЗ, ГДЕ, СГРУППИРОВАТЬ ПО) выравниваются по левому краю, а вложенные поля переносятся со смещением.Избыточная вложенность блоков Если ... Тогда ... КонецЕсли снижает читаемость кода («эффект лесенки»). Для упрощения структуры применяем паттерн досрочного выхода:
// Нежелательный вариант с глубокой вложенностью
Процедура ПровестиПроверку(ДокументСсылка)
Если ЗначениеЗаполнено(ДокументСсылка) Тогда
Если Не ДокументСсылка.ПометкаУдаления Тогда
ВыполнитьОсновнойАлгоритм(ДокументСсылка);
КонецЕсли;
КонецЕсли;
КонецПроцедуры;
// Рекомендуемый вариант с защитными условиями
Процедура ПровестиПроверку(ДокументСсылка)
Если Не ЗначениеЗаполнено(ДокументСсылка) Тогда
Возврат;
КонецЕсли;
Если ДокументСсылка.ПометкаУдаления Тогда
Возврат;
КонецЕсли;
ВыполнитьОсновнойАлгоритм(ДокументСсылка);
КонецПроцедуры;
В соответствии со стандартами разработки Библиотеки стандартных подсистем (БСП) программный код общих модулей и модулей менеджеров объектов разделяется директивами областей. Это формирует четкую архитектуру и упрощает навигацию:
#Область ПрограммныйИнтерфейс — экспортные процедуры и функции, предназначенные для вызова из внешних модулей и подсистем.#Область СлужебныйПрограммныйИнтерфейс — экспортные методы, предназначенные только для внутреннего взаимодействия подсистемы.#Область СлужебныеПроцедурыИФункции — внутренние неэкспортные методы модуля.#Область ОбработчикиСобытий — методы, привязанные к событиям платформы или подпискам на события.Соблюдение соглашений об оформлении кода не должно контролироваться исключительно вручную. Для поддержания качества используем современные инструменты экосистемы 1С: