Программные модули не должны содержать:
закомментированные фрагменты программного кода;
отладочный код;
служебные отметки, например TODO, MRG и т. п.;
комментарии и фрагменты, связанные с конкретными разработчиками;
пустые процедуры и функции.
Подобные фрагменты должны быть удалены из программного кода после завершения разработки, отладки или рефакторинга.
Неправильно:
Процедура ПередУдалением(Отказ)
// Если Истина Тогда
// Сообщение("Для отладки");
// КонецЕсли;
КонецПроцедуры
Также неправильно:
Процедура ПередУдалением(Отказ)
Если Истина Тогда
// Иванов: доделать
КонецЕсли;
КонецПроцедуры
Функция всегда должна явно возвращать значение.
Если выполнение функции может завершиться без попадания в условие, в котором выполняется Возврат, необходимо явно вернуть соответствующее значение, например Неопределено.
Неправильно:
Функция ПолучитьДанныеОтправки(ДокументСсылка, ПараметрыФискализации)
...
Если Тип("ДокументСсылка.РеализацияТоваровУслуг") = ТипЗнч(ДокументСсылка) Тогда
Возврат ПолучитьДанныеОтправкиРеализацияТоваровУслуг(ДокументСсылка, ПараметрыФискализации);
ИначеЕсли Тип("ДокументСсылка.ВозвратТоваровОтКлиента") = ТипЗнч(ДокументСсылка) Тогда
Возврат ПолучитьДанныеОтправкиВозвратТоваровОтКлиента(ДокументСсылка, ПараметрыФискализации);
КонецЕсли;
...
КонецФункции
Правильно:
Функция ПолучитьДанныеОтправки(ДокументСсылка, ПараметрыФискализации)
...
Если Тип("ДокументСсылка.РеализацияТоваровУслуг") = ТипЗнч(ДокументСсылка) Тогда
Возврат ПолучитьДанныеОтправкиРеализацияТоваровУслуг(ДокументСсылка, ПараметрыФискализации);
ИначеЕсли Тип("ДокументСсылка.ВозвратТоваровОтКлиента") = ТипЗнч(ДокументСсылка) Тогда
Возврат ПолучитьДанныеОтправкиВозвратТоваровОтКлиента(ДокументСсылка, ПараметрыФискализации);
КонецЕсли;
...
Возврат Неопределено;
КонецФункции
В функциях и процедурах сначала должно выполняться основное действие по формированию или обработке данных, и только после этого — действие, формирующее или возвращающее конечный результат.
Например, при формировании JSON сначала необходимо сформировать данные, затем подготовить объект записи JSON, выполнить запись и только после этого вернуть результат.
Неправильно:
Функция ПолучитьДанныеОтправкиРеализацияТоваровУслуг(ДокументСсылка, ПараметрыФискализации)
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Ложь;
ЗаписьJSON.УстановитьСтроку();
ОсновныеДанные = Новый Структура;
ОсновныеДанные.Вставить("guid", XMLСтрока(ДокументСсылка));
ОсновныеДанные.Вставить("operationDateTime", Формат(ТекущаяДатаСеанса(), "ДФ='yyyy-MM-dd HH:mm:ss'"));
ОсновныеДанные.Вставить("paymentType", "CardPayment");
ОсновныеДанные.Вставить("amount", ДокументСсылка.Товары.Итог("Сумма"));
ОсновныеДанные.Вставить("items", ПолучитьДанныеТабЧастиДокументаДляОтправки(ДокументСсылка));
ОсновныеДанные.Вставить("accountNumber", СокрЛП(ДокументСсылка.Номер));
ОсновныеДанные.Вставить("kkmCashDeskCode", ПараметрыФискализации.kkmCashDeskCode);
ОсновныеДанные.Вставить("cashierId", ПараметрыФискализации.cashierId);
ЗаписатьJSON(ЗаписьJSON, ОсновныеДанные);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
Правильно:
Функция ПолучитьДанныеОтправкиРеализацияТоваровУслуг(ДокументСсылка, ПараметрыФискализации)
ОсновныеДанные = Новый Структура;
ОсновныеДанные.Вставить("guid", XMLСтрока(ДокументСсылка));
ОсновныеДанные.Вставить("operationDateTime", Формат(ТекущаяДатаСеанса(), "ДФ='yyyy-MM-dd HH:mm:ss'"));
ОсновныеДанные.Вставить("paymentType", "CardPayment");
ОсновныеДанные.Вставить("amount", ДокументСсылка.Товары.Итог("Сумма"));
ОсновныеДанные.Вставить("items", ПолучитьДанныеТабЧастиДокументаДляОтправки(ДокументСсылка));
ОсновныеДанные.Вставить("accountNumber", СокрЛП(ДокументСсылка.Номер));
ОсновныеДанные.Вставить("kkmCashDeskCode", ПараметрыФискализации.kkmCashDeskCode);
ОсновныеДанные.Вставить("cashierId", ПараметрыФискализации.cashierId);
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Ложь;
ЗаписьJSON.УстановитьСтроку();
ЗаписатьJSON(ЗаписьJSON, ОсновныеДанные);
Возврат ЗаписьJSON.Закрыть();
КонецФункции
В текстах запросов запрещается использовать комментарии или комментировать текст запроса.
Неправильно:
ТекстЗапроса = "ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка
|// ПОМЕСТИТЬ втКонтрагенты
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";
ТекстЗапроса = "ВЫБРАТЬ
| Контрагенты.Ссылка КАК Ссылка,
//| Контрагенты.Код КАК Код
//| ПОМЕСТИТЬ втКонтрагенты
|ИЗ
| Справочник.Контрагенты КАК Контрагенты";
Тексты запросов должны быть вынесены в отдельные функции, которые возвращают только текст соответствующего запроса.
Функция, возвращающая текст запроса, должна располагаться перед функцией, которая ее вызывает.
Допускается также размещение функций с текстами запросов в отдельной области, например: #Область ТекстыЗапросов
Неправильно:
Функция ПолучитьМассивБизнесРегионов()
МассивБизнесРегионов = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| БизнесРегионы.Ссылка КАК Ссылка
|ИЗ
| Справочник.БизнесРегионы КАК БизнесРегионы
|ГДЕ
| НЕ БизнесРегионы.ПометкаУдаления
| И НЕ БизнесРегионы.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
МассивБизнесРегионов.Добавить(Выборка.Ссылка);
КонецЦикла;
Возврат МассивБизнесРегионов;
КонецФункции
Правильно:
Функция ПолучитьТекстЗапросаМассивБизнесРегионов()
Возврат "ВЫБРАТЬ
| БизнесРегионы.Ссылка КАК Ссылка
|ИЗ
| Справочник.БизнесРегионы КАК БизнесРегионы
|ГДЕ
| НЕ БизнесРегионы.ПометкаУдаления
| И НЕ БизнесРегионы.ПометкаУдаления";
КонецФункции
Функция ПолучитьМассивБизнесРегионов()
МассивБизнесРегионов = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст = ПолучитьТекстЗапросаМассивБизнесРегионов();
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
МассивБизнесРегионов.Добавить(Выборка.Ссылка);
КонецЦикла;
Возврат МассивБизнесРегионов;
КонецФункции
Если в запросе используются временные таблицы, они должны быть явно удалены непосредственно в тексте запроса после того, как необходимость в них отпала.
Тексты модулей должны оформляться по принципу «один оператор в одной строке».
Наличие нескольких операторов в одной строке допускается только для однотипных операторов присваивания.
Допустимо:
НачальныйИндекс = 0; Индекс = 0; Результат = 0;
Для остальных случаев каждый оператор должен располагаться на отдельной строке.
Каждая функция должна выполнять одно логически завершенное действие.
Не следует объединять в одной функции несколько независимых задач. При необходимости отдельные действия должны быть вынесены в самостоятельные функции.
Если результат условия используется только для присваивания значения переменной и никак иначе не влияет на результат выполнения программы, следует использовать тернарный оператор.
Неправильно:
Если Константы.ЕМ_ЭтоЦентр.Получить() Тогда
ТекущийПланОбмена = ПланыОбмена.ОбменЦентрБП;
Иначе
ТекущийПланОбмена = ПланыОбмена.ОбменФилиалБП;
КонецЕсли;
Правильно:
ТекущийПланОбмена = ?(Константы.ЕМ_ЭтоЦентр.Получить(), ПланыОбмена.ОбменЦентрБП, ПланыОбмена.ОбменФилиалБП);
Аналогично не рекомендуется использовать условную конструкцию, если необходимо только заменить значение переменной при выполнении условия.
Не желательно:
Если КоличествоДнейСдвига = 0 Тогда
КоличествоДнейСдвига = 15;
КонецЕсли;
Правильно:
КоличествоДнейСдвига = ?(КоличествоДнейСдвига = 0, 15, КоличествоДнейСдвига);
Код должен быть визуально и логически разделен на самостоятельные части.
Внутри одного логического блока необходимо выделять отдельные этапы выполнения: создание объектов, заполнение данных, обработку данных, добавление результата и т. п.
Неправильно:
Пока ВыборкаТовары.НайтиСледующий(СтруктураОтбора) Цикл
СтруктураТовара = Новый Структура;
СтруктураТовара.Вставить("Номенклатура", XMLСтрока(ВыборкаТовары.Номенклатура));
СтруктураТовара.Вставить("ЕдиницаИзмерения", XMLСтрока(ВыборкаТовары.ЕдиницаИзмерения));
СтруктураТовара.Вставить("Количество", ВыборкаТовары.Количество);
СтруктураТовара.Вставить("Цена", ВыборкаТовары.Цена);
СтруктураТовара.Вставить("СуммаНДС", ВыборкаТовары.СуммаНДС);
СтруктураТовара.Вставить("Сумма", ВыборкаТовары.Сумма);
СтруктураДокумента.Состав.Добавить(СтруктураТовара);
КонецЦикла;
Правильно:
Пока ВыборкаТовары.НайтиСледующий(СтруктураОтбора) Цикл
СтруктураТовара = Новый Структура;
СтруктураТовара.Вставить("Номенклатура", XMLСтрока(ВыборкаТовары.Номенклатура));
СтруктураТовара.Вставить("ЕдиницаИзмерения", XMLСтрока(ВыборкаТовары.ЕдиницаИзмерения));
СтруктураТовара.Вставить("Количество", ВыборкаТовары.Количество);
СтруктураТовара.Вставить("Цена", ВыборкаТовары.Цена);
СтруктураТовара.Вставить("СуммаНДС", ВыборкаТовары.СуммаНДС);
СтруктураТовара.Вставить("Сумма", ВыборкаТовары.Сумма);
СтруктураДокумента.Состав.Добавить(СтруктураТовара);
КонецЦикла;
Аналогичный принцип применяется при формировании JSON и других структурированных данных.
Неправильно:
Функция СформироватьСтрокуJSONИзСтруктуры(СтруктураОбъекта) Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Ложь;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураОбъекта);
Ответ = ЗаписьJSON.Закрыть();
Возврат Ответ;
КонецФункции
Правильно:
Функция СформироватьСтрокуJSONИзСтруктуры(СтруктураОбъекта) Экспорт
ЗаписьJSON = Новый ЗаписьJSON;
ЗаписьJSON.ПроверятьСтруктуру = Ложь;
ПараметрыЗаписиJSON = Новый ПараметрыЗаписиJSON(, Символы.Таб);
ЗаписьJSON.УстановитьСтроку(ПараметрыЗаписиJSON);
ЗаписатьJSON(ЗаписьJSON, СтруктураОбъекта);
Ответ = ЗаписьJSON.Закрыть();
Возврат Ответ;
КонецФункции
Если процедура или функция имеет более 5 параметров, ее необходимо перепроектировать таким образом, чтобы количество параметров не превышало 5.
Если сократить количество параметров невозможно или это приводит к ухудшению структуры кода, для передачи параметров необходимо использовать структуру.
Если платформа позволяет получить необходимый результат без явного обхода коллекции, следует использовать такой вариант.
Например, вместо создания массива и последующего обхода выборки предпочтительно использовать методы Выгрузить() и ВыгрузитьКолонку().
Не желательно:
Функция ПолучитьМассивВидовЦен()
МассивВидовЦен = Новый Массив;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КатегорииЦен.Ссылка КАК Ссылка
|ИЗ
| Справочник.ВидыЦен КАК КатегорииЦен
|ГДЕ
| НЕ КатегорииЦен.ПометкаУдаления";
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
МассивВидовЦен.Добавить(Выборка.Ссылка);
КонецЦикла;
Возврат МассивВидовЦен;
КонецФункции
Желательно:
Функция ПолучитьМассивВидовЦен()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| КатегорииЦен.Ссылка КАК Ссылка
|ИЗ
| Справочник.ВидыЦен КАК КатегорииЦен
|ГДЕ
| НЕ КатегорииЦен.ПометкаУдаления";
Результат = Запрос.Выполнить().Выгрузить().ВыгрузитьКолонку("Ссылка");
Возврат Результат;
КонецФункции
Не следует сравнивать значения с пустой строкой, пустой датой или другими значениями, используемыми для определения отсутствия значения.
Для проверки заполненности необходимо использовать функцию ЗначениеЗаполнено().
При разработке справочников, документов и обработок вся логика основного бизнес-процесса должна находиться в модуле объекта.
В модуле формы должен находиться только код, непосредственно относящийся:
Основная бизнес-логика не должна размещаться в модуле формы, если она может быть реализована в модуле объекта.