Skip to content

Instantly share code, notes, and snippets.

@Albus
Last active October 9, 2025 20:29
Show Gist options
  • Select an option

  • Save Albus/a8703fcbcb8dd9fe5e8f832bdc2edcbb to your computer and use it in GitHub Desktop.

Select an option

Save Albus/a8703fcbcb8dd9fe5e8f832bdc2edcbb to your computer and use it in GitHub Desktop.
1c code review
Процедура СформироватьПодпись()
Если ЗначениеЗаполнено(Объект.Руководитель) Тогда
Элементы.ДекорацияПодпись.Гиперссылка = Истина;
Если Не ЗначениеЗаполнено(Объект.ДолжностьРуководителя)
И Не ЗначениеЗаполнено(Объект.ОснованиеПодписиРуководителя) Тогда
Элементы.ДекорацияПодпись.Заголовок = "<должность не указана>";
Иначе
ДолжностьРуководителя = ?(ЗначениеЗаполнено(Объект.ДолжностьРуководителя)
, Строка(Объект.ДолжностьРуководителя), "<должность не указана>");
ОснованиеПодписи = ?(ЗначениеЗаполнено(Объект.ОснованиеПодписиРуководителя)
, " /" + Строка(Объект.ОснованиеПодписиРуководителя) + "/", "");
Элементы.ДекорацияПодпись.Заголовок = СтрШаблон("%1 %2", ДолжностьРуководителя, ОснованиеПодписи);
КонецЕсли;
Иначе
Элементы.ДекорацияПодпись.Гиперссылка = Ложь;
Элементы.ДекорацияПодпись.Заголовок = "<должность не указана>";
КонецЕсли;
КонецПроцедуры
// Формирует подпись документа на основе данных о руководителе
// и его должности. Управляет отображением декорации подписи.
Процедура СформироватьПодпись()
ДекорацияПодпись = Элементы.ДекорацияПодпись;
ЕстьРуководитель = ЗначениеЗаполнено(Объект.Руководитель);
// Устанавливаем гиперссылку только если указан руководитель
ДекорацияПодпись.Гиперссылка = ЕстьРуководитель;
// Если руководитель не указан, показываем текст по умолчанию
Если Не ЕстьРуководитель Тогда
ДекорацияПодпись.Заголовок = ПолучитьТекстПодписиПоУмолчанию();
Возврат;
КонецЕсли;
// Формируем полный текст подписи
ДекорацияПодпись.Заголовок = СформироватьТекстПодписи();
КонецПроцедуры
// Возвращает текст подписи по умолчанию, используемый когда
// данные о руководителе отсутствуют
//
// Возвращаемое значение:
// Строка - текст подписи по умолчанию
Функция ПолучитьТекстПодписиПоУмолчанию()
Возврат "<должность не указана>";
КонецФункции
// Формирует полный текст подписи, включающий должность
// и основание подписи (если указано)
//
// Возвращаемое значение:
// Строка - отформатированный текст подписи
Функция СформироватьТекстПодписи()
ЧастиПодписи = Новый Массив;
// Добавляем должность (гарантированно не пустая)
Должность = ПолучитьТекстДолжности();
ЧастиПодписи.Добавить(Должность);
// Добавляем основание подписи, если оно указано
Основание = ПолучитьТекстОснования();
Если Основание <> Неопределено Тогда
ЧастиПодписи.Добавить(Основание);
КонецЕсли;
// Соединяем части подписи неразрывными пробелами
Возврат СтрСоединить(ЧастиПодписи, Символы.НПП);
КонецФункции
// Возвращает текст должности руководителя.
// Если должность не указана, возвращает значение по умолчанию.
//
// Возвращаемое значение:
// Строка - текст должности или значение по умолчанию
Функция ПолучитьТекстДолжности()
// Если должность указана, возвращаем ее текстовое представление
Если ЗначениеЗаполнено(Объект.ДолжностьРуководителя) Тогда
Возврат Строка(Объект.ДолжностьРуководителя);
КонецЕсли;
// Возвращаем значение по умолчанию
Возврат ПолучитьТекстПодписиПоУмолчанию();
КонецФункции
// Возвращает отформатированный текст основания подписи.
// Если основание не указано, возвращает Неопределено.
//
// Возвращаемое значение:
// Строка - отформатированный текст основания
// Неопределено - если основание не указано
Функция ПолучитьТекстОснования()
// Если основание указано, форматируем его в виде "/текст/"
Если ЗначениеЗаполнено(Объект.ОснованиеПодписиРуководителя) Тогда
Возврат СтрШаблон("/%(1)/", Объект.ОснованиеПодписиРуководителя);
КонецЕсли;
// Возвращаем Неопределено, если основание не указано
Возврат Неопределено;
КонецФункции
@Albus
Copy link
Author

Albus commented Oct 9, 2025

Анализируя представленные версии кода, можно выделить следующие проблемы в оригинальной реализации и методы их решения в рефакторинговой версии:

Проблемы оригинального кода (original.bsl)

1. Нарушение принципа единственной ответственности

  • Одна процедура выполняет слишком много задач: проверяет данные, формирует текст, управляет отображением
  • Сложность восприятия из-за вложенных условий

2. Дублирование кода

  • Строка "<должность не указана>" повторяется три раза
  • Логика проверки заполненности значений дублируется

3. Жесткая связность

  • Прямые обращения к свойствам объекта разбросаны по всему коду
  • Сложно тестировать отдельные компоненты логики

4. Сложность модификации

  • Изменение формата подписи требует модификации основной процедуры
  • Добавление новых элементов подписи усложнит и без того запутанный код

5. Потенциальная ошибка форматирования

  • Использование пробела для соединения частей подписи может привести к некорректному отображению

Решения в рефакторинговой версии (review.bsl)

1. Декомпозиция на специализированные функции

// Вместо одной сложной процедуры - несколько простых функций
Функция ПолучитьТекстДолжности()
Функция ПолучитьТекстОснования()
Функция СформироватьТекстПодписи()

2. Устранение дублирования

  • Вынесение текста по умолчанию в отдельную функцию ПолучитьТекстПодписиПоУмолчанию()
  • Централизованное управление повторяющимися значениями

3. Улучшение читаемости

  • Использование понятных имен переменных (ЕстьРуководитель, ДекорацияПодпись)
  • Ранний возврат при отсутствии руководителя упрощает логику

4. Гибкость и расширяемость

// Использование массива для сборки подписи
ЧастиПодписи = Новый Массив;
ЧастиПодписи.Добавить(Должность);
// Легко добавить новые элементы

5. Улучшенное форматирование

  • Использование неразрывного пробела (Символы.НПП) для корректного отображения
  • Единообразное форматирование основания подписи

6. Улучшенная документированность

  • Добавлены комментарии, описывающие назначение функций
  • Четко определены возвращаемые значения

7. Упрощение тестирования

Каждую функцию можно тестировать независимо:

  • ПолучитьТекстДолжности() - тестирование различных состояний должности
  • ПолучитьТекстОснования() - тестирование наличия/отсутствия основания
  • СформироватьТекстПодписи() - тестирование комбинаций элементов

Такой подход делает код более поддерживаемым, тестируемым и готовым к дальнейшим изменениям требований.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment