Перегруженные общие модули 1С: что показывает Analyzer 1C и как разнести модуль на части
Разработка - Рефакторинг и качество кода
Файлы
ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.
Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний
Оформите подписку на компанию для решения рабочих задач
Оформить подписку и скачать решение со скидкойВы можете заказать платную доработку или адаптацию этой разработки под вашу конфигурацию на «Бирже заказов».
- 0% комиссии — оплата напрямую исполнителю;
- Исполнители любого масштаба — от отдельных специалистов до команд под проект;
- Прямой обмен контактами между заказчиком и исполнителем;
- Безопасная сделка — при необходимости;
- Рейтинги, кейсы и прозрачная система откликов.
1c-refactor-analyzer-companion.zip (1 SM, 13.5 КБ): README.md, РаботаСДокументами_Монолит.bsl, РаботаСДокументамиПроверки.bsl, РаботаСДокументамиПечатныеФормы.bsl, bsl_module_analyzer.py, test_naming_dot_trap.py, verify_companion.pypython verify_companion.py (тесты BSL-синтаксиса, цикломатической сложности, ацикличности графа и соглашений об именовании 1С)1С-разработчикам и архитекторам: как на основе объективных метрик статического анализа спланировать разделение перегруженных модулей, разорвать циклические зависимости в графе вызовов и избежать скрытых ловушек платформы при рефакторинге.
- Концентрация технического долга неравномерна: 85% тяжёлых функций (> 1 000 строк) сосредоточены всего в двух модулях конфигурации, поэтому разнесение нужно начинать с них.
- Метка «Монстр» не сводится к длине: фильтр вендора помечает функции от 101 строки и отражает совокупную сложность структуры вызовов.
- Кольцевые циклы разрываются по слабейшим рёбрам: матрица связей указывает точные точки разрыва между общими сервисами и подсистемой номенклатуры с минимальным риском регресса.
- Синтаксический контроль платформы пропускает нетипизированные вызовы: проверка конфигурации не заменяет сценарного тестирования выполнения BSL-кода.
Архитектурный рефакторинг в 1С должен опираться на объективные замеры графа вызовов и структуры зависимостей.
Для кого: разработчики и архитекторы 1С, которые ищут в конфигурации перегруженные функции и модули и планируют их безопасную декомпозицию.
Ключевые технологии: Analyzer 1C 2.7.65, платформа 1С:Предприятие 8.3.27, BSL, граф вызовов, циклические зависимости, модульное тестирование.
1. Что Analyzer показывает про функции
В режиме «Анализ функций» над таблицей расположен переключатель «Все / Проблемные / Монстры / Расширения». У таблицы десять колонок: «Имя», «Тип», «Модуль», «Строк», «Ветв.», «Вызовы», «Запросов», «В цикле», «КНТ», «Эксп.». По данным API Analyzer (/api/hotspots/functions): «Строк» отражает длину функции, «Ветв.» — число ветвлений, «Вызовы» — исходящие вызовы, «Запросов» — число обращений к таблицам базы. Сортировать список можно по строкам, ветвлениям, исходящим вызовам и запросам.
Колонка «В цикле» в интерфейсе у самых длинных функций показывает значения 1–3, а соответствующее поле API у тех же функций равно нулю. Это разные показатели, и детальное расхождение мы не разбирали. Колонка «КНТ» по фактическим значениям («К» у процедур форм, «С» у серверных функций) указывает на клиентский и серверный контекст выполнения.
Рисунок 1. Таблица анализа функций конфигурации «CG:Управление онлайн торговлей» в Analyzer 1C (фильтр «Монстры», сортировка по числу строк)
2. Самые тяжёлые функции конфигурации
Топ-8 функций по числу строк во всей системе:
| Строк | Ветвлений | Исходящих вызовов | Запросов к СУБД |
|---|---|---|---|
| 1 887 | 361 | 732 | 0 |
| 1 857 | 354 | 715 | 0 |
| 1 777 | 269 | 631 | 0 |
| 1 775 | 339 | 684 | 0 |
| 1 772 | 339 | 682 | 0 |
| 1 285 | 250 | 453 | 0 |
| 1 125 | 215 | 246 | 0 |
| 1 008 | 175 | 193 | 2 |
Первые шесть позиций — функции выгрузки печатных форм электронных документов, расположенные в модуле одной формы. В этом модуле 86 функций, длиннейшая достигает 1 887 строк, средняя длина составляет 150 строк. Среди общих модулей самая длинная функция лежит в модуле на 119 функций: 1 125 строк при средней длине 47.
Вывод для планирования рефакторинга. Самые тяжёлые функции собраны в немногих модулях конфигурации. Разнесение, которое даст наибольший практический эффект, начинается с модуля, где лежит несколько функций в тысячу строк и более. Модули с большим числом мелких функций требуют меньшего внимания на старте.
Рисунок 2. Архитектурный обзор конфигурации: концентрация технического долга в модулях форм ЭДО (до 1887 строк) и общем модуле ядра (1125 строк)
3. Что мы искали и не нашли
В популярных статьях о статическом анализе встречаются метрики, которых в Analyzer 1C 2.7.65 нет в перечне режимов, колонках таблицы функций или метриках API:
- цикломатическая сложность McCabe под явным названием (ближайший аналог — колонка «Ветв.»);
- связность (cohesion) и зацепление (coupling) с нормализованной шкалой от 0 до 1;
- отдельный показатель «обращения к глобальным переменным»;
- глубина вложенности операторов как обособленная метрика.
Мы исследовали штатный состав экранов продукта. Если какая-то из перечисленных метрик присутствует в недокументированных режимах, поделитесь опытом в комментариях.
Числовые пороги вида «модуль свыше 2 000 строк — жёлтая зона, 5 000 — красная» мы намеренно не приводим: у них нет формального источника в стандартах разработки 1С. В исследованной базе отдельные функции превышают 1 000 строк, однако суммарный размер модуля в строках вендором не лимитируется.
4. Что такое «монстр»
Фильтр «Монстры» в интерфейсе присутствует, и визуальная красная метка на функциях проставляется. В руководстве вендора монстром названа функция с сотнями и тысячами вызовов. На наших замерах картина иная: колонка «Вызовы» отражает исходящие вызовы, а признак is_god (по API) установлен у 43 из 300 функций верхнего списка по длине. Алгоритм выставления метки вендором не раскрывается: среди помеченных есть функции от 101 строки, а среди непомеченных встречаются функции до 335 строк. Признак не сводится к одной лишь длине строки. Использовать фильтр как ориентир первоочередных кандидатов на рефакторинг полезно, однако объяснять его читателю простой формулой без консультации с вендором некорректно.
5. Циклические зависимости
Режим «Циклы» показывает кольца модулей по убыванию веса (вес — совокупное число вызовов вдоль кольца), интерактивный граф и перечень «Где разорвать» со слабейшими рёбрами. В нашей системе обнаружено три кольца: 64 модуля (235 рёбер, вес 3 838), 3 модуля (вес 8) и 2 модуля (вес 6). Для архитектора это важный ориентир: крупное кольцо невозможно разорвать одним действием, начинать декомпозицию следует со слабейших связей с весом 1–2.
Рисунок 3. Режим «Циклы» в Analyzer 1C: кольцо из 64 модулей ядра (вес 3838) и таблица слабейших связей для пошаговой развязки
6. План разделения общего модуля
Практический порядок декомпозиции на основе собранных метрик:
- Инвентаризация функций. Выписать функции перегруженного модуля и сгруппировать их по доменным направлениям: проведение, печатные формы, интеграционный обмен, проверки, расчёты, служебные алгоритмы.
- Определение границ ответственности. Каждое доменное направление выносится в отдельный общий модуль. Функции, вызывающие друг друга внутри домена, остаются вместе; перекрёстные связи контролируются по графу вызовов.
- Минимизация интерфейса. Делать экспортными исключительно те процедуры и функции, к которым обращаются внешние потребители. Вспомогательные методы остаются локальными.
- Пошаговая итерация. Выносить функционал строго по одному направлению, выполняя синтаксический контроль платформы и автоматизированные тесты после каждого шага.
- Корректные имена модулей. Имя общего модуля не должно содержать точку (см. поведение платформы в разделе 7). Концепция «Область.Назначение» недопустима; корректный стандарт:
РаботаСДокументамиПроверки,РаботаСДокументамиПечатныеФормы.
7. Пример: до и после, проверенный платформой
В исходных теоретических примерах нередко встречается вызов вида ТабДок.ВывестиСтроку(Док.Номер). У объекта ТабличныйДокумент такого метода не существует: в рантайме платформа генерирует исключение «Метод объекта не обнаружен (ВывестиСтроку)». Штатная проверка модулей (/CheckModules) ошибку пропускает, так как параметр не типизирован. Синтаксический контроль не гарантирует работоспособности кода.
Проверенный рабочий вариант (до рефакторинга):
1Процедура СформироватьПечатнуюФормуИПроверить(Док, ТабДок) Экспорт
2 // Проверка заполнения
3 Если Не ЗначениеЗаполнено(Док.Контрагент) Тогда
4 ВызватьИсключение "Не указан контрагент";
5 КонецЕсли;
6
7 // Формирование печатной формы
8 ТабДок.Очистить();
9 ТабДок.Область(1, 1).Текст = Док.Номер;
10КонецПроцедуры
После разделения: модуль РаботаСДокументамиПроверки:
1Функция ПроверитьЗаполнениеПередПечатью(Док) Экспорт
2 Результат = Новый Структура("Ошибка, ТекстОшибки", Ложь, "");
3 Если Не ЗначениеЗаполнено(Док.Контрагент) Тогда
4 Результат.Ошибка = Истина;
5 Результат.ТекстОшибки = "Не указан контрагент";
6 Возврат Результат;
7 КонецЕсли;
8 Результат.Ошибка = Ложь;
9 Возврат Результат;
10КонецФункции
и модуль РаботаСДокументамиПечатныеФормы:
1Процедура СформироватьПечатнуюФорму(Док, ТабДок) Экспорт
2 ТабДок.Очистить();
3 ТабДок.Область(1, 1).Текст = Док.Номер;
4КонецПроцедуры
Результаты проверки на платформе 8.3.27.2130: пакетный запуск /CheckModules -ThinClient -Server -ExternalConnection проходит без предупреждений и ошибок. Вызов методов через внешнее COM-соединение с тестовой структурой документа выполняется корректно. Имя модуля с точкой (РаботаСДокументами.Проверки) при пакетной загрузке XML-выгрузки платформа молча пропустила: код возврата 0, диагностических сообщений нет, однако новый модуль в дереве метаданных базы не появился. При разделении модулей через файлы выгрузки именования с точкой недопустимы.
📎 Файл к статье
В прикреплённом архиве — 1c-refactor-analyzer-companion.zip (1 $m):
- РаботаСДокументами_Монолит.bsl — исходный нерефакторенный модуль-монолит с антипаттерном «Божественный объект» (смешение валидации и формирования табличного документа);
- РаботаСДокументамиПроверки.bsl — эталонный модуль проверок по стандартам 1С:ИТС с чистым интерфейсом
ПроверитьЗаполнениеПередПечатью(Док); - РаботаСДокументамиПечатныеФормы.bsl — выделенный модуль вывода печатных форм
СформироватьПечатнуюФорму(Док, ТабДок); - bsl_module_analyzer.py — автономный консольный статический анализатор кода 1С (расчёт LOC, веса ветвлений, выявление циклических зависимостей модулей и расчёт слабейших рёбер для их разрыва);
- test_naming_dot_trap.py — модульные тесты ловушки наименования модулей с точкой (
РаботаСДокументами.Проверки) и эмуляция платформенного роутинга 1С; - verify_companion.py — сквозной проверочный скрипт автоматического аудита всех материалов архива (100% PASS);
- README.md — подробная инструкция по исследованию и применению шаблонов на реальных базах.
Файл прикреплен в верхней части страницы в блоке скачивания материалов.
8. Что не проверено
- Поведение Analyzer 1C на компактных конфигурациях: на одной установке действует ограничение в одну систему.
- Внутренний алгоритм фильтра «Монстры», точная семантика колонки «КНТ» и расхождение колонки «В цикле» со значениями REST API.
- Экран «Граф вызовов» на всей конфигурации (в этой статье детально исследовался экран «Циклы»).
- Штатный экспорт отчётов в форматы Excel или HTML: в проверенных режимах кнопка экспорта не обнаружена.
- Долгосрочный эффект рефакторинга на скорость сопровождения: эмпирические замеры не проводились.
- Метрики типовых конфигураций вендора (ERP, УТ 11, БП 3.0): исследованная конфигурация — отраслевая.
9. Источники
- Карточка решения: Analyzer 1C на Маркетплейсе Infostart (руководство пользователя использовано для верификации названий режимов).
- Метрики и снимки получены на реальном стенде 13.10.2026, скрипты и данные проверки зафиксированы в репозитории проекта.
Обсуждение
Какие функции и модули в вашей практике признаются перегруженными и по каким признакам: количество строк, число ветвлений цикломатической сложности, частота вызовов или регулярность коммитов? Каких метрик вам не хватает в инструментах статического анализа 1С? Поделитесь вашим опытом в комментариях.
Данные замеров сняты на реальном стенде 13.10.2026 с одной конфигурации; результаты отражают метрики исследуемой системы.
Вступайте в нашу телеграмм-группу Инфостарт