Вы когда-нибудь сталкивались с ситуацией, когда программа на 1С:Предприятие работает корректно, но поддерживать её становится всё сложнее? Модули разрастаются до сотен строк, логика дублируется в разных местах, а любое изменение требует часов на поиск «где же это используется»? Если да, то ваш код нуждается в рефакторинге — системном улучшении структуры без изменения внешнего поведения.

Рефакторинг в — это не роскошь, а необходимость для долговременных проектов. По данным исследования JetBrains, до 70% времени разработчиков уходит на поддержку legacy-кода, и большая часть этих затрат связана с плохо структурированными решениями. В этой статье мы разберём, что такое рефакторинг на практике, когда его применять, какие инструменты использовать и как избежатьных ошибок, которые превращают «улучшение» в бесконечную переделку.

Важно понимать: рефакторинг — это не «почистить код перед сдачей», а стратегический процесс, который экономит время и деньги в долгосрочной перспективе. Например, клиент одной из компаний сэкономил 1200 человеко-часов в год после рефакторинга учётной системы, сократив время на добавление новых отчётов с 3 дней до 4 часов. Но как добиться такого результата? Читайте далее.

Что такое рефакторинг кода 1С простыми словами

Рефакторинг (от англ. refactoring) — это изменение внутренней структуры кода без модификации его внешнего поведения. Проще говоря, вы переделываете «кухню» программы, но для пользователя ничего не меняется: те же кнопки, те же отчёты, те же результаты. Цель — сделать код:

  • 📖 Читабельным — чтобы новый разработчик разобрался в логике за часы, а не за недели;
  • Производительным — устранить «узкие места», которые тормозят систему;
  • 🔄 Поддерживаемым — чтобы изменения в одном модуле не ломали работу в другом;
  • 🧩 Модульным — разделить монолитные процедуры на небольшие независимые блоки.

Пример из жизни: представьте, что у вас есть шкаф, в котором всё свалено в одну кучу. Вы знаете, где лежат носки (программа работает), но каждый раз, когда нужно достать футболку, приходится перерывать всё содержимое (тратить время на поддержку). Рефакторинг — это разложить вещи по полкам и ящикам (модулям), подписать их (комментарии) и выбросить ненужное (удаление мёртвого кода).

В рефакторинг особенно актуален из-за специфики платформы: 1С:Предприятие позволяет писать код быстро, но не всегда качественно. Многие разработчики «забивают гвозди микроскопом» — используют универсальные инструменты (например, Запрос) там, где достаточно простого цикла. Со временем это приводит к:

  • 🐢 Замедлению работы системы (например, из-за лишних обращений к базе);
  • 🤯 Сложности в отладке (когда одна процедура выполняет 10 разных задач);
  • 💥 Риску ошибок при модификациях (когда изменение в одном месте ломает другое).
📊 Как часто вы проводите рефакторинг в 1С?
Никогда
Только перед сдачей проекта
Регулярно, по мере развития
Только когда система начинает «тормозить»

Когда нужен рефакторинг: 7 признаков, что пора действовать

Не каждый код требует рефакторинга. Если система небольшая, а изменения вносятся раз в год, то тратить ресурсы на переделку может быть нерационально. Но есть красные флаги, которые сигнализируют: «Пора браться за инструменты». Обратите внимание на эти признаки:

⚠️ Внимание: Если в вашей конфигурации используются ВнешниеОбработки или ВнешниеОтчёты как «костыли» для основной логики, это верный знак, что архитектура требует пересмотра. Такие решения часто маскируют проблемы с модульностью.
Признак Что это означает Пример из 1С
«Спагетти-код» Логика размазана по десяткам процедур, сложно отследить последовательность выполнения. Процедура ПриЗаписи в документе вызывает 5 других процедур, которые в свою очередь модифицируют данные в 3 справочниках.
Дублирование кода Один и тот же фрагмент копируется в разных местах (нарушение принципа DRY — Don’t Repeat Yourself). Одинаковый алгоритм расчёта скидки прописан в модулях Документ.ЗаказКлиента и Документ.РеализацияТоваровУслуг.
«Божественные» процедуры Процедуры длиной в сотни строк, которые делают всё и сразу. Процедура ОбработатьДанные на 300 строк, которая формирует отчёт, отправляет email и обновляет регистры.
Сложная отладка На поиск причины бага уходит больше времени, чем на его исправление. Ошибка в расчёте себестоимости проявляется только при определённой последовательности действий, которую сложно воспроизвести.

Ещё один тревожный сигнал — когда разработчики боятся вносить изменения из-за страха что-то сломать. Это говорит о высокой связанности (coupling) модулей. Например, modification одного справочника требует правок в 5 других объектах конфигурации.

Как понять, что рефакторинг необходим прямо сейчас?

Исправление багов занимает больше времени, чем добавление новой функциональности|

Новые разработчики тратят недели на вникание в логику|

Клиенты жалуются на «тормоза» при стандартных операциях (например, проведение документа)|

В коде есть комментарии вроде «Не трогать! Работает, но почему — неизвестно»|

Модификации для новых требований требуют изменений в 3+ местах-->

Виды рефакторинга в 1С: от косметики до глобальной переработки

Рефакторинг бывает разных масштабов — от мелких правок до полной перестройки архитектуры. В чаще всего применяют следующие виды:

1. Локальный рефакторинг

Затрагивает отдельные процедуры, функции или небольшие блоки кода. Цель — улучшить читаемость и устранить «запахи кода» (code smells). Примеры:

  • 🔄 Переименование переменных (например, ППозицияДокумента);
  • 🧹 Удаление мёртвого кода (неиспользуемых процедур или комментариев вроде // Старая версия, не удалять!);
  • 📦 Выделение фрагмента в отдельную процедуру (если блок кода повторяется или выполняет самостоятельную задачу).

2. Структурный рефакторинг

Изменяет организацию модулей и объектов конфигурации. Включает:

  • 🏗️ Разделение монолитных модулей (например, вынос логики печатных форм в отдельные обработки);
  • 🔗 Замена жёстких ссылок на динамические (использование ПолучитьОбъект вместо прямых обращений к справочникам);
  • 📁 Группировку связанных процедур (создание общих модулей для повторяемой логики, например, ОбщийМодуль.РасчётыСкидок).

3. Архитектурный рефакторинг

Самый сложный и затратный вид, затрагивающий основы системы. Примеры:

  • 🏛️ Переход с процедурного подхода к объектно-ориентированному (использование БСП или собственных классов);
  • 🔄 Замена прямого доступа к данным на слои абстракции (введение МенеджеровДанных);
  • 🌐 Интеграция с внешними системами через API вместо прямого обмена файлами.

Какой вид выбрать? Зависит от целей:

💡

Начните с локального рефакторинга, если проект стабилен, но код трудно читать. Если система «дышит на ладан» (частые ошибки, медленная работа), потребуется структурный или архитектурный подход.

Инструменты для рефакторинга в 1С: от встроенных до сторонних решений

Без правильных инструментов рефакторинг может превратиться в рутину. К счастью, у разработчиков есть как встроенные возможности платформы, так и специализированные утилиты. Рассмотрим основные:

1. Встроенные средства 1С:Предприятие

  • 🔍 Поиск и замена (Ctrl+Shift+F) — для массового переименования переменных или процедур;
  • 📋 Сравнение и объединение конфигураций — полезно для отслеживания изменений;
  • 🐞 Отладчик — помогает выявить «узкие места» в коде (например, долгие запросы).

2. Внешние утилиты

Инструмент Назначение Пример использования
1С:Рефакторинг (от Инфостарт) Автоматизированный анализ кода и предложения по улучшению. Находит дублирующийся код в модулях документов ЗаказКлиента и ВозвратТоваров.
SonarQube (с плагином для 1С) Статический анализ кода, выявление «запахов» и уязвимостей. Обнаруживает процедуры с цикломатической сложностью >20 (сложные для понимания).
Git + OneScript Версионирование и скрипты для массовых правок. Автоматическое добавление комментариев к публичным методам.

Один из самых мощных инструментов — Библиотека стандартных подсистем (БСП). Она предоставляет готовые механизмы для типичных задач (например, работа с файлами, логирование), что позволяет избежать «велосипедов». Например, вместо самописного кода для отправки email можно использовать:

Попытка

Почта = Новый Почта;

Письмо = Почта.СоздатьПисьмо;

Письмо.Адресат ="client@example.com";

Письмо.Тема ="Отчёт по заказу";

Письмо.Текст = ПолучитьТекстОтчёта;

Почта.Отправить(Письмо);

Исключение

ЗаписатьЛог(ОписаниеОшибки);

КонецПопытки;

Но будьте осторожны: автоматизированные инструменты не заменяют ручной анализ. Например, 1С:Рефакторинг может предложить вынести повторяющийся код в общую процедуру, но не учтёт специфику бизнес-логики вашей компании.

💡

Инструменты ускоряют рефакторинг, но окончательное решение всегда принимает разработчик. Автоматическое исправление может сломать уникальную логику, которую «не видит» анализ.

Пошаговая инструкция: как провести рефакторинг без ошибок

Рефакторинг — это не хаотичные правки, а структурированный процесс. Следуйте этому алгоритму, чтобы избежать типичных ошибок:

Шаг 1. Подготовка

  • 📌 Создайте резервную копию базы и конфигурации (обязательно!);
  • 📝 Документируйте текущее состояние: составьте список проблемных мест (например, с помощью SonarQube);
  • 👥 Согласуйте изменения с командой — рефакторинг не должен быть сюрпризом для других разработчиков.

Шаг 2. Приоритизация

Не пытайтесь переделать всё сразу. Начните с критических зон:

Модули с частыми ошибками (по данным журнала регистрации)|

Процедуры, которые модифицируются чаще всего|

Код, отвечающий за ключевые бизнес-процессы (например, расчёт зарплаты)|

«Узкие места» по производительности (найдите с помощью ТестированиеПроизводительности)-->

Шаг 3. Рефакторинг

Применяйте изменения малыми порциями. Например:

  1. Выделите повторяющийся код в отдельную процедуру;
  2. Протестируйте её;
  3. Замените дубли в основном коде вызовами новой процедуры;
  4. Повторите тестирование.

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

Функция ПолучитьКурсВалюты(Валюта, Дата) Экспорт

Запрос = Новый Запрос;

Запрос.Текст =

"ВЫБРАТЬ ПЕРВЫЕ 1

| КурсыВалют.Курс КАК Курс

|ИЗ

| РегистрСведений.КурсыВалют КАК КурсыВалют

|ГДЕ

| КурсыВалют.Валюта = &Валюта

| И КурсыВалют.Дата = &Дата";

Запрос.УстановитьПараметр("Валюта", Валюта);

Запрос.УстановитьПараметр("Дата", Дата);

Результат = Запрос.Выполнить;

Возврат Результат.Получить(0).Курс;

КонецФункции

Шаг 4. Тестирование

После каждого изменения проверяйте:

  • 🧪 Функциональные тесты — работает ли логика как раньше;
  • ⏱️ Производительность — не стало ли медленнее (используйте Профилировщик);
  • 📊 Отчёты и печатные формы — не исказились ли данные.
⚠️ Внимание: Если вы используете БСП, после рефакторинга обновите версию библиотеки и проверьте совместимость. Некоторые изменения в стандартных подсистемах могут конфликтовать с вашим кодом.

Шаг 5. Документирование

Фиксируйте все изменения в:

  • 📄 Комментариях в коде (например, // Рефакторинг 2026-05: вынесена логика расчёта НДС в общий модуль);
  • 📑 Журнале изменений (если ведёте);
  • 💬 Задачах в трекере (например, в Jira или Redmine).

Пример документации для новой процедуры:

Пример комментария к процедуре

/**

* Рассчитывает итоговую сумму документа с учётом скидок и налогов.

* Рефакторинг 2026-06: объединена логика из модулей ЗаказКлиента и РеализацияТоваровУслуг.

* @param {ДокументОбъект} Документ - Объект документа для расчёта.

* @return {Число} Итоговая сумма с НДС.

*/

Типичные ошибки при рефакторинге 1С и как их избежать

Даже опытные разработчики совершают ошибки, которые превращают рефакторинг в кошмар. Вот самые распространённые ловушки и способы их обойти:

1. Рефакторинг без тестов

Если у вас нет автоматизированных тестов, вы играете в «русскую рулетку»: любое изменение может сломать функциональность. Решение:

  • 🛠️ Напишите хотя бы минимальные тесты для критических участков (используйте xUnitFor1C или Vanessa-Automation);
  • 🔄 Тестируйте после каждого небольшого изменения, а не в конце.

2. «Золотой молоток»

Когда разработчик пытается применить один подход ко всему коду. Например, выносит всю логику в общие модули, даже когда это неоправданно. Последствия:

  • 📉 Ухудшение читаемости (логика размазана по многим файлам);
  • ⚡ Падение производительности (лишние обращения к общим модулям).

Решение: следуйте принципу YAGNI (You Aren’t Gonna Need It) — не оптимизируйте то, что не требует оптимизации.

3. Игнорирование бизнес-логики

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

Решение: перед рефакторингом согласуйте изменения с пользователями системы.

4. Отсутствие версионирования

Если вы не используете Git или хотя бы сохраняете версии конфигурации, вы рискуете потерять работоспособный код. Решение:

  • 🗃️ Настройте репозиторий для конфигурации (например, через 1С:EDT или OneScript);
  • 📌 Делайте коммиты с понятными сообщениями (например, refactor: вынесена логика печатной формы в отдельный модуль).
⚠️ Внимание: Если вы работаете с типовыми конфигурациями (1С:Бухгалтерия, 1С:ЗУП), будьте осторожны с рефакторингом стандартных объектов. Обновления от 1С могут перезаписать ваши изменения. В таких случаях используйте расширения или внешние обработки.

5. Бесконечный рефакторинг

Некоторые разработчики впадают в перфекционизм и переделывают код до бесконечности. Признаки:

  • ⏳ Задача на рефакторинг тянется неделями;
  • 🔄 Изменения не приносят реальной пользы (например, переименование переменных без улучшения логики).

Решение: установите чёткие критерии завершения (например, «сократить время генерации отчёта на 30%» или «уменьшить дублирование кода на 50%»).

Примеры рефакторинга: до и после

Лучше один раз увидеть, чем сто раз услышать. Рассмотрим реальные примеры, как рефакторинг улучшает код в .

Пример 1: Дублирование кода

До: Одинаковая логика расчёта скидки в двух документах.

// В модуле ЗаказКлиента

Процедура РассчитатьСкидку

Если Клиент.Категория = Перечисление.КатегорииКлиентов.Оптовый Тогда

Скидка = 10;

ИначеЕсли Клиент.Категория = Перечисление.КатегорииКлиентов.Розничный Тогда

Скидка = 5;

КонецЕсли;

Возврат Скидка;

КонецПроцедуры

// В модуле РеализацияТоваровУслуг

Процедура ОпределитьСкидку

Если Клиент.Категория = Перечисление.КатегорииКлиентов.Оптовый Тогда

Скидка = 10;

ИначеЕсли Клиент.Категория = Перечисление.КатегорииКлиентов.Розничный Тогда

Скидка = 5;

КонецЕсли;

Возврат Скидка;

КонецПроцедуры

После: Логика вынесена в общий модуль.

// В общем модуле РасчётыСкидок

Функция ПолучитьСкидкуКлиента(Клиент) Экспорт

Если Клиент.Категория = Перечисление.КатегорииКлиентов.Оптовый Тогда

Возврат 10;

ИначеЕсли Клиент.Категория = Перечисление.КатегорииКлиентов.Розничный Тогда

Возврат 5;

КонецЕсли;

Возврат 0; // Дефолтное значение

КонецФункции

// В модулях документов остаётся только вызов:

Скидка = РасчётыСкидок.ПолучитьСкидкуКлиента(Клиент);

Выгода:

  • 🔄 Изменение логики скидок в одном месте;
  • 📉 Снижение риска ошибок при модификациях;
  • 📖 Повышение читаемости (код документов стал короче).

Пример 2: «Божественная» процедура

До: Процедура на 200 строк, которая формирует отчёт, отправляет email и обновляет регистры.

Процедура ОбработатьЗаказ(Заказ)

// 1. Формирование отчёта (50 строк)

Отчёт = Новый ТабличныйДокумент;

//... код формирования отчёта...

// 2. Отправка email (30 строк)

Почта = Новый Почта;

Письмо = Почта.СоздатьПисьмо;

//... код отправки...

// 3. Обновление регистров (120 строк)

Для Каждого Товар Из Заказ.Товары Цикл

Движение = Регистры.ОстаткиТоваров.Добавить;

//... код записи движений...

КонецЦикла;

КонецПроцедуры

После: Разделение на отдельные процедуры.

Процедура ОбработатьЗаказ(Заказ)

Отчёт = СформироватьОтчётПоЗаказу(Заказ);

ОтправитьОтчётНаПочту(Отчёт, Заказ.Клиент.Email);

ОбновитьРегистрыОстатков(Заказ);

КонецПроцедуры

Функция СформироватьОтчётПоЗаказу(Заказ)

Отчёт = Новый ТабличныйДокумент;

//... код формирования...

Возврат Отчёт;

КонецФункции

Процедура ОтправитьОтчётНаПочту(Отчёт, EmailПолучателя)

Почта = Новый Почта;

Письмо = Почта.СоздатьПисьмо;

Письмо.Адресат = EmailПолучателя;

Письмо.Вложения.Добавить(Отчёт);

Почта.Отправить(Письмо);

КонецПроцедуры

Процедура ОбновитьРегистрыОстатков(Заказ)

Для Каждого Товар Из Заказ.Товары Цикл

Движение = Регистры.ОстаткиТоваров.Добавить;

Движение.Товар = Товар.Номенклатура;

Движение.Количество = -Товар.Количество;

КонецЦикла;

КонецПроцедуры

Выгода:

  • 🎯 Каждая процедура делает одну вещь;
  • 🔍 Легче отлаживать (ошибка в отправке email не затрагивает логику регистров);
  • ♻️ Процедуры можно переиспользовать (например, ОтправитьОтчётНаПочту для других документов).

FAQ: Частые вопросы о рефакторинге в 1С

❓ Сколько времени занимает рефакторинг?

Зависит от масштаба проекта. Локальные правки могут занять несколько часов, а архитектурный рефакторинг — недели или месяцы. Средние показатели:

  • Небольшая конфигурация (до 50 объектов): 1–3 дня;
  • Средний проект (100–300 объектов): 1–4 недели;
  • Крупная система (500+ объектов): от 1 месяца.

Совет: разбивайте работу на этапы и фиксируйте промежуточные результаты.

❓ Можно ли провести рефакторинг без остановки работы пользователей?

Да, если следовать нескольким правилам:

  1. Проводите изменения в тестовой базе, а не в рабочей;
  2. Используйте механизм расширений для модификации типовых конфигураций;
  3. Вносите правки малыми порциями и тестируйте после каждого изменения;
  4. Для критических систем планируйте рефакторинг на период низкой нагрузки (например, ночью или в выходные).
❓ Как убедить руководство выделить время на рефакторинг?

Аргументируйте экономическую выгоду:

  • 💰 Сокращение затрат на поддержку (например, «сейчас на исправление багов уходит 20% времени, после рефакторинга — 5%»);
  • ⏱️ Ускорение разработки новых функций (например, «добавление отчёта будет занимать 1 день вместо 3»);
  • 📉 Снижение рисков (например, «