При сопровождении сложных систем программисты 1С часто сталкиваются с необходимостью массового переименования методов или реквизитов. Стандартный глобальный поиск в Конфигураторе по всей конфигурации, расширениям и внешним обработкам может занимать очень много времени. Рассмотрим способы, как оптимизировать этот процесс и использовать инструменты с мгновенной индексацией кода.
Самый очевидный способ получить «умный» и быстрый поиск — это использование EDT. В отличие от стандартного Конфигуратора, EDT строит полноценный индекс всего проекта. Разберем основные преимущества этого подхода:
Если переход на EDT кажется слишком сложным, проанализируем альтернативный вариант — связку VS Code и Git. Для этого необходимо выгрузить конфигурацию, расширения и внешние обработки в файлы (декомпозировать их). Рассмотрим по шагам, как это организовать:
precommit1c или gitsync для автоматической выгрузки метаданных в файлы XML и модули .bsl.Ctrl+Shift+F по всей структуре (конфигурация + расширения + внешние файлы) будет выполняться за доли секунды.Чтобы поиск в VS Code был не просто текстовым, а контекстным, разберем возможность подключения BSL Language Server. Этот инструмент позволяет:
Если ваша основная задача — только поиск строк в огромных конфигурациях (например, ERP), проанализируем утилиту ripgrep (rg). Это консольный инструмент, который работает значительно быстрее стандартного поиска Windows или VS Code. Его можно интегрировать прямо в VS Code, что позволит находить вхождения префиксов или имен реквизитов в тысячах файлов метаданных почти мгновенно.
Для тех, кому нужна «одна кнопка» для массовых замен, можно использовать скрипты на OneScript. Выясним причину их эффективности: они позволяют программно обойти все файлы выгруженной конфигурации и заменить одну строку на другую по заданным правилам. Пример простого алгоритма на OneScript:
// Пример логики перебора файлов для замены текста
Файлы = НайтиФайлы(КаталогПроекта, "*.bsl", Истина);
Для Каждого Файл Из Файлы Цикл
Текст = Новый ЧтениеТекста(Файл.ПолноеИмя);
Содержимое = Текст.Прочитать();
Текст.Закрыть();
НовоеСодержимое = СтрЗаменить(Содержимое, "преф_Реквизит", "Реквизит");
Запись = Новый ЗаписьТекста(Файл.ПолноеИмя);
Запись.Записать(НовоеСодержимое);
Запись.Закрыть();
КонецЦикла;
Стоит отметить, что в последних версиях платформы (начиная с 8.3.27) многие проблемы с работой СКД в расширениях были исправлены. Это позволяет более смело переносить доработки из внешних отчетов в расширения, что упрощает глобальный поиск и рефакторинг стандартными средствами Конфигуратора, так как всё хранится в рамках одной информационной базы.