1. Именование — основа понимания
1.1. Переменные и параметры
ПЛОХО:
bslд = 10; // Что это за дни? Срок? Период?
н = 0; // Непонятное назначениеХОРОШО:
bsl
ДнейОтсрочки = 10;
СчетчикНеобработанныхДокументов = 0;Еще примеры хороших имен:
bsl// Вместо непонятных сокращений
Элемент = Справочники.Номенклатура.НайтиПоНаименованию("Карандаш");
РезультатЗапроса = Запрос.Выполнить().Выбрать();
// Лучше так
НайденнаяНоменклатура = Справочники.Номенклатура.НайтиПоНаименованию("Карандаш");
ВыборкаДанных = Запрос.Выполнить().Выбрать();1.2. Процедуры и функции
Имена должны отражать действие или результат.
ПЛОХО:
bslПроцедура ОбработкаДокумента(Документ)
// Какая обработка? Что делает?ХОРОШО:
bsl// Процедуры называем как действия
Процедура ПровестиИЗаписатьДокумент(Документ)
Процедура РассчитатьСкидкиНаОснованииИсторииПокупок(Контрагент)
// Функции называем как результат
Функция ПолучитьСуммуДокументаБезНДС(Документ)
Функция ЕстьНезавершенныеПроизводственныеЗаказыНаДату(Дата)2. Комментарии — ваш друг, но не костыль
2.1. Хорошие комментарии объясняют "почему", а не "что"
ПЛОХО:
bsl// Увеличиваем счетчик на 1
Счетчик = Счетчик + 1;
// Получаем курс валюты
Курс = КурсыВалют.ПолучитьКурс(Валюта, Дата);ХОРОШО:
bsl// Увеличиваем счетчик повторных попыток подключения
// После 3-х неудачных попыток переходим к резервному серверу
СчетчикНеудачныхПодключений = СчетчикНеудачныхПодключений + 1;
// Получаем курс ЦБ РФ на дату документа
// Используем для бухгалтерского учета по официальному курсу
КурсЦБ = КурсыВалют.ПолучитьКурс(Валюта, ДатаДокумента);2.2. Структурирование сложных алгоритмов
bsl// ## АЛГОРИТМ РАСЧЕТА СКИДКИ ##
// 1. Получаем базовую скидку по карте клиента
// 2. Добавляем накопительную скидку за прошлый квартал
// 3. Применяем сезонный коэффициент
// 4. Ограничиваем максимальной скидкой по категории товара
БазоваяСкидка = ПолучитьСкидкуПоКарте(Клиент);
НакопительнаяСкидка = РассчитатьНакопительнуюСкидку(Клиент, НачалоКвартала);
// ... код расчета ...3. Структура и форматирование кода
3.1. Отступы и пробелы
ПЛОХО:
bslЕсли Не ЗначениеЗаполнено(Документ.Контрагент) Тогда
Сообщить("Не заполнен контрагент");
Возврат;
КонецЕсли;ХОРОШО:
bslЕсли Не ЗначениеЗаполнено(Документ.Контрагент) Тогда
Сообщить("Не заполнен контрагент");
Возврат;
КонецЕсли;3.2. Группировка логических блоков
bsl// === БЛОК 1: ПОДГОТОВКА ДАННЫХ ===
ТекДата = ТекущаяДата();
ПериодАнализа = НачалоГода(ТекДата);
// === БЛОК 2: ВЫПОЛНЕНИЕ ЗАПРОСА ===
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| Обороты.Номенклатура,
| СУММА(Обороты.Количество) КАК Количество
|ИЗ
| РегистрНакопления.Продажи.Обороты(...) Обороты";
Выборка = Запрос.Выполнить().Выбрать();
// === БЛОК 3: ОБРАБОТКА РЕЗУЛЬТАТОВ ===
Пока Выборка.Следующий() Цикл
// ... обработка ...
КонецЦикла;4. Принцип единственной ответственности (разделение ответственности)
4.1. Дробим большие процедуры
ПЛОХО — монолитная процедура:
bslПроцедура ОбработатьЗаказПокупателя(ДокументЗаказа)
// 50 строк проверок
Если Не ДокументЗаказа.Проверен Тогда
// ... много кода ...
КонецЕсли;
// 100 строк расчета
Для каждого Строка Из ДокументЗаказа.Товары Цикл
// ... сложные расчеты ...
КонецЦикла;
// 80 строк проведения
// ... код проведения ...
КонецПроцедурыХОРОШО — разделенная логика:
bslПроцедура ОбработатьЗаказПокупателя(ДокументЗаказа)
Если Не ПроверитьВозможностьОбработки(ДокументЗаказа) Тогда
Возврат;
КонецЕсли;
РассчитатьСтоимостьИСкидки(ДокументЗаказа);
ПровестиДокументВРежимеЗаказа(ДокументЗаказа);
СоздатьРезервНаСкладе(ДокументЗаказа);
КонецПроцедуры
Функция ПроверитьВозможностьОбработки(ДокументЗаказа)
// Только проверки
Если Не ДокументЗаказа.Проверен Тогда
Возврат Ложь;
КонецЕсли;
Если Не ДокументЗаказа.Контрагент.Действующий Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
Процедура РассчитатьСтоимостьИСкидки(ДокументЗаказа)
// Только расчеты
Для каждого Строка Из ДокументЗаказа.Товары Цикл
Строка.Сумма = РассчитатьСуммуСоСкидкой(Строка);
КонецЦикла;
КонецПроцедуры5. Работа с исключениями и ошибками
5.1. Информативные сообщения об ошибках
ПЛОХО:
bslЕсли Не ЗначениеЗаполнено(Документ.Склад) Тогда
ВызватьИсключение "Не заполнено поле";
КонецЕсли;ХОРОШО:
bslЕсли Не ЗначениеЗаполнено(Документ.Склад) Тогда
ВызватьИсключение "Не заполнен склад отгрузки в документе " +
Документ.Наименование + " от " +
Формат(Документ.Дата, "ДЛФ=Д");
КонецЕсли;6. Использование временных переменных для сложных выражений
ПЛОХО — сложно читать:
bslЕсли (Документ.Статус = Перечисления.СтатусыДокументов.Проведен
ИЛИ Документ.Статус = Перечисления.СтатусыДокументов.ПроведенРасчет)
И Документ.Дата >= НачалоМесяца(ТекущаяДата())
И Не ПустаяСтрока(Документ.Номер) Тогда
// ...
КонецЕсли;ХОРОШО — понятная логика:
bslДокументПроведен = (Документ.Статус = Перечисления.СтатусыДокументов.Проведен
ИЛИ Документ.Статус = Перечисления.СтатусыДокументов.ПроведенРасчет);
ДокументВТекущемМесяце = Документ.Дата >= НачалоМесяца(ТекущаяДата());
ДокументИмеетНомер = Не ПустаяСтрока(Документ.Номер);
Если ДокументПроведен И ДокументВТекущемМесяце И ДокументИмеетНомер Тогда
// ...
КонецЕсли;7. Соглашения по типам данных в именах (венгерская нотация)
Хотя полная венгерская нотация устарела, некоторые префиксы полезны:
bsl// Коллекции
МассивЦен = Новый Массив;
СтруктураПараметров = Новый Структура;
СоответствиеЕдиницИзмерения = Новый Соответствие;
// Объекты метаданных
ДокЗаказ = Документы.ЗаказПокупателя;
СпрНоменклатура = Справочники.Номенклатура;
// Результаты запросов
ВыборкаОстатков = Запрос.Выполнить().Выбрать();
НаборЗаписей = Запрос.Выполнить().Выгрузить();8. Документирование публичных методов
Используйте комментарии для описания сложных функций:
bsl// Функция рассчитывает конечную цену товара с учетом всех скидок и наценок
//
// Параметры:
// БазоваяЦена - Число, исходная цена товара
// ПроцентСкидки - Число, процент скидки (от 0 до 100)
// КатегорияТовара - СправочникСсылка.КатегорииТоваров
// Клиент - СправочникСсылка.Контрагенты
//
// Возвращаемое значение:
// Число - конечная цена с учетом всех корректировок
//
Функция РассчитатьКонечнуюЦену(БазоваяЦена, ПроцентСкидки, КатегорияТовара, Клиент = Неопределено)
// ... код функции ...
КонецФункции9. Практические примеры рефакторинга
БЫЛО (плохо):
bslПроцедура Обработать()
д = Документы.ЗаказПокупателя.СоздатьДокумент();
д.Дата = ТекущаяДата();
м = Новый Массив;
з = Новый Запрос;
з.Текст = "ВЫБРАТЬ Товары.Ссылка ИЗ Справочник.Товары КАК Товары";
в = з.Выполнить().Выбрать();
п = 0;
Пока в.Следующий() Цикл
с = д.Товары.Добавить();
с.Товар = в.Ссылка;
с.Количество = 1;
с.Цена = 100;
п = п + с.Цена * с.Количество;
КонецЦикла;
д.Сумма = п;
д.Записать();
КонецПроцедурыСТАЛО (хорошо):
bslПроцедура СоздатьТестовыйЗаказПокупателя()
НовыйЗаказ = Документы.ЗаказПокупателя.СоздатьДокумент();
НовыйЗаказ.Дата = ТекущаяДата();
ЗаполнитьСтрокиЗаказаТоварамиПоУмолчанию(НовыйЗаказ);
ПересчитатьСуммуДокумента(НовыйЗаказ);
НовыйЗаказ.Записать();
Сообщить("Создан тестовый заказ № " + НовыйЗаказ.Номер);
КонецПроцедуры
Процедура ЗаполнитьСтрокиЗаказаТоварамиПоУмолчанию(ДокументЗаказа)
ВыборкаТоваров = ПолучитьВсеАктивныеТовары();
Пока ВыборкаТоваров.Следующий() Цикл
НоваяСтрока = ДокументЗаказа.Товары.Добавить();
НоваяСтрока.Товар = ВыборкаТоваров.Ссылка;
НоваяСтрока.Количество = 1;
НоваяСтрока.Цена = 100; // Базовая тестовая цена
КонецЦикла;
КонецПроцедуры
Функция ПолучитьВсеАктивныеТовары()
Запрос = Новый Запрос;
Запрос.Текст = "
|ВЫБРАТЬ
| Товары.Ссылка
|ИЗ
| Справочник.Номенклатура КАК Товары
|ГДЕ
| НЕ Товары.ПометкаУдаления
| И Товары.ЭтоГруппа = ЛОЖЬ";
Возврат Запрос.Выполнить().Выбрать();
КонецФункции
Процедура ПересчитатьСуммуДокумента(ДокументЗаказа)
ОбщаяСумма = 0;
Для каждого СтрокаЗаказа Из ДокументЗаказа.Товары Цикл
ОбщаяСумма = ОбщаяСумма + СтрокаЗаказа.Цена * СтрокаЗаказа.Количество;
КонецЦикла;
ДокументЗаказа.Сумма = ОбщаяСумма;
КонецПроцедурыЗаключение
Хороший стиль кодирования — это навык, который развивается со временем. Основные принципы:
-
Имена должны быть самодокументируемыми
-
Код должен читаться как книга — сверху вниз, понятными блоками
-
Каждая функция/процедура должна делать одну вещь и делать ее хорошо
-
Комментарии объясняют намерения, а не пересказывают код
-
Форматирование — основа читаемости
Следуя этим правилам, вы создадите код, который будет легко понимать, поддерживать и развивать — как вам самим через полгода, так и вашим коллегам.

