При сопровождении и доработке больших конфигураций разработчики часто сталкиваются с огромными общими модулями объемом в десятки тысяч строк. Нередко возникает задача отыскать конкретный фрагмент алгоритма или блок текста запроса, состоящий сразу из нескольких строк. Разберем особенности работы механизма поиска в платформе 1С:Предприятие, выясним причины имеющихся ограничений и рассмотрим эффективные практические способы решения этой проблемы.
Проанализируем поведение встроенных средств поиска платформы. В классическом Конфигураторе 1С как локальный поиск в открытом модуле по нажатию Ctrl + F, так и глобальный поиск по всей конфигурации через Ctrl + Shift + F имеют строго однострочные поля ввода. При попытке вставить в строку поиска скопированный многострочный фрагмент происходят следующие ограничения:
\r или \n), либо полностью вырезает спецсимволы, склеивая слова вместе.|. Наличие разного количества пробелов, отступов и символов табуляции делает точное строковое совпадение практически невозможным.Таким образом, стандартными средствами Конфигуратора найти блок кода из нескольких строк прямым копированием невозможно. Рассмотрим рабочие альтернативные способы.
Самый быстрый подход, не требующий сторонних утилит, заключается в оптимизации поискового запроса. Посмотрим на пример проблемного блока запроса:
| ВЫРАЗИТЬ(ВЫБОР
| КОГДА НЕ Цены.Стоимость ЕСТЬ NULL
| ТОГДА Цены.Стоимость / ВЫБОР
| КОГДА Цены.Количество = 0
| ТОГДА 1
| ИНАЧЕ Цены.Количество
| КОНЕЦ
| ИНАЧЕ ЦеныПредварительные.Стоимость
| КОНЕЦ * ВЫБОР
Вместо попытки скопировать весь блок целиком, проанализируем его структуру и найдем наиболее уникальную и редкую строку. Строка КОГДА НЕ Цены.Стоимость ЕСТЬ NULL или ТОГДА 1 может встречаться в коде десятки раз. Однако конструкция:
ИНАЧЕ ЦеныПредварительные.Стоимость
является узкоспециализированной. Скопировав только эту одну строку в стандартный диалог поиска Ctrl + F, мы сразу сократим количество найденных совпадений до минимума и быстро перейдем к нужному участку алгоритма.
Если модуль уже открыт в Конфигураторе, а поиск по одной строке дает слишком много ложных результатов, применим эффективную связку с продвинутым текстовым редактором (Notepad++, VS Code, Sublime Text). Разберем пошаговый алгоритм действий:
| в регулярных выражениях означает логическое «ИЛИ», его необходимо экранировать: \|.[\s\|]+ между ключевыми словами.Если модуль неизвестен заранее, или требуется найти многострочный фрагмент по всей конфигурации, оптимальным решением является выгрузка исходников. Разберем этот процесс:
Цены\.Стоимость\s*/\s*ВЫБОР[\s\|]+КОГДА\s+Цены\.Количество\s*=\s*0
Такой шаблон проигнорирует любые варианты переносов строк и отступов, безошибочно указав файл объекта метаданных и конкретную строку запроса.
Современная среда разработки 1C:EDT, построенная на базе платформы Eclipse, изначально лишена недостатков классического Конфигуратора в части поиска:
Для разработчиков, работающих исключительно в классическом Конфигураторе, существует возможность расширения возможностей среды с помощью надстройки Снегопат (Snegopat). Встроенные скрипты надстройки (в частности, скрипт расширенного поиска) внедряют в интерфейс Конфигуратора диалоговое окно с поддержкой регулярных выражений, позволяя искать многострочные блоки запросов непосредственно в окне редактируемого модуля 1С.
Если задачу поиска многострочных конструкций по текстам модулей необходимо автоматизировать в рамках служебных обработок, обратим внимание на развитие платформы. Начиная с версии платформы 8.3.23, во встроенный язык добавлена прямая работа с регулярными выражениями. Посмотрим на пример кода функции:
ШаблонПоиска = "КОГДА[\s\|]+Цены\.Количество\s*=\s*0[\s\|]+ТОГДА\s+1";
Результаты = СтрНайтиВсеПоРегулярномуВыражению(ТекстМодуля, ШаблонПоиска, Истина);
Для Каждого Совпадение Из Результаты Цикл
Сообщить("Найдено совпадение на позиции: " + Совпадение.НачальнаяПозиция);
КонецЦикла;
Функция СтрНайтиВсеПоРегулярномуВыражению с параметром МногострочныйПоиск = Истина позволяет программно анализировать исходные тексты конфигурации любой сложности.