Вы когда-нибудь сталкивались с ситуацией, когда программа на 1С:Предприятие работает корректно, но поддерживать её становится всё сложнее? Модули разрастаются до сотен строк, логика дублируется в разных местах, а любое изменение требует часов на поиск «где же это используется»? Если да, то ваш код нуждается в рефакторинге — системном улучшении структуры без изменения внешнего поведения.
Рефакторинг в 1С — это не роскошь, а необходимость для долговременных проектов. По данным исследования JetBrains, до 70% времени разработчиков уходит на поддержку legacy-кода, и большая часть этих затрат связана с плохо структурированными решениями. В этой статье мы разберём, что такое рефакторинг на практике, когда его применять, какие инструменты использовать и как избежатьных ошибок, которые превращают «улучшение» в бесконечную переделку.
Важно понимать: рефакторинг — это не «почистить код перед сдачей», а стратегический процесс, который экономит время и деньги в долгосрочной перспективе. Например, клиент одной из компаний сэкономил 1200 человеко-часов в год после рефакторинга учётной системы, сократив время на добавление новых отчётов с 3 дней до 4 часов. Но как добиться такого результата? Читайте далее.
Что такое рефакторинг кода 1С простыми словами
Рефакторинг (от англ. refactoring) — это изменение внутренней структуры кода без модификации его внешнего поведения. Проще говоря, вы переделываете «кухню» программы, но для пользователя ничего не меняется: те же кнопки, те же отчёты, те же результаты. Цель — сделать код:
- 📖 Читабельным — чтобы новый разработчик разобрался в логике за часы, а не за недели;
- ⚡ Производительным — устранить «узкие места», которые тормозят систему;
- 🔄 Поддерживаемым — чтобы изменения в одном модуле не ломали работу в другом;
- 🧩 Модульным — разделить монолитные процедуры на небольшие независимые блоки.
Пример из жизни: представьте, что у вас есть шкаф, в котором всё свалено в одну кучу. Вы знаете, где лежат носки (программа работает), но каждый раз, когда нужно достать футболку, приходится перерывать всё содержимое (тратить время на поддержку). Рефакторинг — это разложить вещи по полкам и ящикам (модулям), подписать их (комментарии) и выбросить ненужное (удаление мёртвого кода).
В 1С рефакторинг особенно актуален из-за специфики платформы:
1С:Предприятие позволяет писать код быстро, но не всегда качественно. Многие разработчики «забивают гвозди микроскопом» — используют универсальные инструменты (например, Запрос) там, где достаточно простого цикла. Со временем это приводит к:
- 🐢 Замедлению работы системы (например, из-за лишних обращений к базе);
- 🤯 Сложности в отладке (когда одна процедура выполняет 10 разных задач);
- 💥 Риску ошибок при модификациях (когда изменение в одном месте ломает другое).
Когда нужен рефакторинг: 7 признаков, что пора действовать
Не каждый код требует рефакторинга. Если система небольшая, а изменения вносятся раз в год, то тратить ресурсы на переделку может быть нерационально. Но есть красные флаги, которые сигнализируют: «Пора браться за инструменты». Обратите внимание на эти признаки:
⚠️ Внимание: Если в вашей конфигурации используютсяВнешниеОбработкиилиВнешниеОтчётыкак «костыли» для основной логики, это верный знак, что архитектура требует пересмотра. Такие решения часто маскируют проблемы с модульностью.
| Признак | Что это означает | Пример из 1С |
|---|---|---|
| «Спагетти-код» | Логика размазана по десяткам процедур, сложно отследить последовательность выполнения. | Процедура ПриЗаписи в документе вызывает 5 других процедур, которые в свою очередь модифицируют данные в 3 справочниках. |
| Дублирование кода | Один и тот же фрагмент копируется в разных местах (нарушение принципа DRY — Don’t Repeat Yourself). | Одинаковый алгоритм расчёта скидки прописан в модулях Документ.ЗаказКлиента и Документ.РеализацияТоваровУслуг. |
| «Божественные» процедуры | Процедуры длиной в сотни строк, которые делают всё и сразу. | Процедура ОбработатьДанные на 300 строк, которая формирует отчёт, отправляет email и обновляет регистры. |
| Сложная отладка | На поиск причины бага уходит больше времени, чем на его исправление. | Ошибка в расчёте себестоимости проявляется только при определённой последовательности действий, которую сложно воспроизвести. |
Ещё один тревожный сигнал — когда разработчики боятся вносить изменения из-за страха что-то сломать. Это говорит о высокой связанности (coupling) модулей. Например, modification одного справочника требует правок в 5 других объектах конфигурации.
Как понять, что рефакторинг необходим прямо сейчас?
Исправление багов занимает больше времени, чем добавление новой функциональности|
Новые разработчики тратят недели на вникание в логику|
Клиенты жалуются на «тормоза» при стандартных операциях (например, проведение документа)|
В коде есть комментарии вроде «Не трогать! Работает, но почему — неизвестно»|
Модификации для новых требований требуют изменений в 3+ местах-->
Виды рефакторинга в 1С: от косметики до глобальной переработки
Рефакторинг бывает разных масштабов — от мелких правок до полной перестройки архитектуры. В 1С чаще всего применяют следующие виды:
1. Локальный рефакторинг
Затрагивает отдельные процедуры, функции или небольшие блоки кода. Цель — улучшить читаемость и устранить «запахи кода» (code smells). Примеры:
- 🔄 Переименование переменных (например,
П→ПозицияДокумента); - 🧹 Удаление мёртвого кода (неиспользуемых процедур или комментариев вроде
// Старая версия, не удалять!); - 📦 Выделение фрагмента в отдельную процедуру (если блок кода повторяется или выполняет самостоятельную задачу).
2. Структурный рефакторинг
Изменяет организацию модулей и объектов конфигурации. Включает:
- 🏗️ Разделение монолитных модулей (например, вынос логики печатных форм в отдельные обработки);
- 🔗 Замена жёстких ссылок на динамические (использование
ПолучитьОбъектвместо прямых обращений к справочникам); - 📁 Группировку связанных процедур (создание общих модулей для повторяемой логики, например,
ОбщийМодуль.РасчётыСкидок).
3. Архитектурный рефакторинг
Самый сложный и затратный вид, затрагивающий основы системы. Примеры:
- 🏛️ Переход с процедурного подхода к объектно-ориентированному (использование БСП или собственных классов);
- 🔄 Замена прямого доступа к данным на слои абстракции (введение
МенеджеровДанных); - 🌐 Интеграция с внешними системами через API вместо прямого обмена файлами.
Какой вид выбрать? Зависит от целей:
Начните с локального рефакторинга, если проект стабилен, но код трудно читать. Если система «дышит на ладан» (частые ошибки, медленная работа), потребуется структурный или архитектурный подход.
Инструменты для рефакторинга в 1С: от встроенных до сторонних решений
Без правильных инструментов рефакторинг может превратиться в рутину. К счастью, у разработчиков 1С есть как встроенные возможности платформы, так и специализированные утилиты. Рассмотрим основные:
1. Встроенные средства 1С:Предприятие
- 🔍 Поиск и замена (
Ctrl+Shift+F) — для массового переименования переменных или процедур; - 📋 Сравнение и объединение конфигураций — полезно для отслеживания изменений;
- 🐞 Отладчик — помогает выявить «узкие места» в коде (например, долгие запросы).
2. Внешние утилиты
| Инструмент | Назначение | Пример использования |
|---|---|---|
| 1С:Рефакторинг (от Инфостарт) | Автоматизированный анализ кода и предложения по улучшению. | Находит дублирующийся код в модулях документов ЗаказКлиента и ВозвратТоваров. |
| SonarQube (с плагином для 1С) | Статический анализ кода, выявление «запахов» и уязвимостей. | Обнаруживает процедуры с цикломатической сложностью >20 (сложные для понимания). |
| Git + OneScript | Версионирование и скрипты для массовых правок. | Автоматическое добавление комментариев к публичным методам. |
Один из самых мощных инструментов — Библиотека стандартных подсистем (БСП). Она предоставляет готовые механизмы для типичных задач (например, работа с файлами, логирование), что позволяет избежать «велосипедов». Например, вместо самописного кода для отправки email можно использовать:
Попытка
Почта = Новый Почта;
Письмо = Почта.СоздатьПисьмо;
Письмо.Адресат ="client@example.com";
Письмо.Тема ="Отчёт по заказу";
Письмо.Текст = ПолучитьТекстОтчёта;
Почта.Отправить(Письмо);
Исключение
ЗаписатьЛог(ОписаниеОшибки);
КонецПопытки;
Но будьте осторожны: автоматизированные инструменты не заменяют ручной анализ. Например, 1С:Рефакторинг может предложить вынести повторяющийся код в общую процедуру, но не учтёт специфику бизнес-логики вашей компании.
Инструменты ускоряют рефакторинг, но окончательное решение всегда принимает разработчик. Автоматическое исправление может сломать уникальную логику, которую «не видит» анализ.
Пошаговая инструкция: как провести рефакторинг без ошибок
Рефакторинг — это не хаотичные правки, а структурированный процесс. Следуйте этому алгоритму, чтобы избежать типичных ошибок:
Шаг 1. Подготовка
- 📌 Создайте резервную копию базы и конфигурации (обязательно!);
- 📝 Документируйте текущее состояние: составьте список проблемных мест (например, с помощью SonarQube);
- 👥 Согласуйте изменения с командой — рефакторинг не должен быть сюрпризом для других разработчиков.
Шаг 2. Приоритизация
Не пытайтесь переделать всё сразу. Начните с критических зон:
Модули с частыми ошибками (по данным журнала регистрации)|
Процедуры, которые модифицируются чаще всего|
Код, отвечающий за ключевые бизнес-процессы (например, расчёт зарплаты)|
«Узкие места» по производительности (найдите с помощью ТестированиеПроизводительности)-->
Шаг 3. Рефакторинг
Применяйте изменения малыми порциями. Например:
- Выделите повторяющийся код в отдельную процедуру;
- Протестируйте её;
- Замените дубли в основном коде вызовами новой процедуры;
- Повторите тестирование.
Пример: если в 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С.
Пример 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 месяца.
Совет: разбивайте работу на этапы и фиксируйте промежуточные результаты.
❓ Можно ли провести рефакторинг без остановки работы пользователей?
Да, если следовать нескольким правилам:
- Проводите изменения в тестовой базе, а не в рабочей;
- Используйте механизм расширений для модификации типовых конфигураций;
- Вносите правки малыми порциями и тестируйте после каждого изменения;
- Для критических систем планируйте рефакторинг на период низкой нагрузки (например, ночью или в выходные).
❓ Как убедить руководство выделить время на рефакторинг?
Аргументируйте экономическую выгоду:
- 💰 Сокращение затрат на поддержку (например, «сейчас на исправление багов уходит 20% времени, после рефакторинга — 5%»);
- ⏱️ Ускорение разработки новых функций (например, «добавление отчёта будет занимать 1 день вместо 3»);
- 📉 Снижение рисков (например, «