Как выполнить многострочный поиск по коду и текстам запросов в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему штатный поиск Конфигуратора не находит многострочные конструкции?

Проанализируем поведение встроенных средств поиска платформы. В классическом Конфигураторе 1С как локальный поиск в открытом модуле по нажатию Ctrl + F, так и глобальный поиск по всей конфигурации через Ctrl + Shift + F имеют строго однострочные поля ввода. При попытке вставить в строку поиска скопированный многострочный фрагмент происходят следующие ограничения:

  1. Платформа автоматически обрезает буфер обмена по первому символу перевода строки (\r или \n), либо полностью вырезает спецсимволы, склеивая слова вместе.
  2. Штатный редактор Конфигуратора не поддерживает регулярные выражения (RegEx), маски поиска (wildcards) и escape-последовательности символов переноса строки.
  3. Тексты запросов в коде 1С оформляются в виде многострочных строковых литералов, где каждая строка начинается с вертикальной черты |. Наличие разного количества пробелов, отступов и символов табуляции делает точное строковое совпадение практически невозможным.

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

Способ 1. Выделение наиболее характерного однострочного фрагмента

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


|	ВЫРАЗИТЬ(ВЫБОР
|			КОГДА НЕ Цены.Стоимость ЕСТЬ NULL
|				ТОГДА Цены.Стоимость / ВЫБОР
|						КОГДА Цены.Количество = 0
|							ТОГДА 1
|						ИНАЧЕ Цены.Количество
|					КОНЕЦ
|			ИНАЧЕ ЦеныПредварительные.Стоимость
|		КОНЕЦ * ВЫБОР

Вместо попытки скопировать весь блок целиком, проанализируем его структуру и найдем наиболее уникальную и редкую строку. Строка КОГДА НЕ Цены.Стоимость ЕСТЬ NULL или ТОГДА 1 может встречаться в коде десятки раз. Однако конструкция:

ИНАЧЕ ЦеныПредварительные.Стоимость

является узкоспециализированной. Скопировав только эту одну строку в стандартный диалог поиска Ctrl + F, мы сразу сократим количество найденных совпадений до минимума и быстро перейдем к нужному участку алгоритма.

Способ 2. Быстрая связка Конфигуратора с внешним редактором

Если модуль уже открыт в Конфигураторе, а поиск по одной строке дает слишком много ложных результатов, применим эффективную связку с продвинутым текстовым редактором (Notepad++, VS Code, Sublime Text). Разберем пошаговый алгоритм действий:

  1. В окне открытого модуля в Конфигураторе нажимаем сочетание клавиш Ctrl + A, чтобы выделить весь текст, и копируем его в буфер обмена (Ctrl + C).
  2. Открываем текстовый редактор и вставляем скопированный код (Ctrl + V).
  3. Вызываем окно расширенного поиска (Ctrl + F) и переключаем режим в Регулярные выражения (Regular expressions).
  4. Формируем шаблон поиска. Поскольку в запросах 1С строки разделяются вертикальной чертой, а символ | в регулярных выражениях означает логическое «ИЛИ», его необходимо экранировать: \|.
  5. Чтобы поиск не зависел от количества пробелов и табуляций между строками, используем шаблон вида [\s\|]+ между ключевыми словами.
  6. Находим нужный блок во внешнем редакторе и смотрим номер строки, на которой он расположен.
  7. Возвращаемся в Конфигуратор и нажимаем Ctrl + G (Перейти к строке), вводим полученный номер строки и мгновенно переходим к искомому коду.

Способ 3. Выгрузка конфигурации в файлы и глобальный поиск в VS Code

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

  1. В главном меню Конфигуратора переходим в пункт Конфигурация → Выгрузить конфигурацию в файлы... и сохраняем исходный код в отдельную папку.
  2. Открываем данную папку в редакторе Visual Studio Code.
  3. Нажимаем комбинацию клавиш Ctrl + Shift + F для открытия глобального поиска по всем файлам каталога.
  4. Активируем иконку Использовать регулярное выражение (Use Regular Expression, Alt + R).
  5. В поле поиска вводим шаблон, учитывающий специфику синтаксиса запросов 1С:

Цены\.Стоимость\s*/\s*ВЫБОР[\s\|]+КОГДА\s+Цены\.Количество\s*=\s*0

Такой шаблон проигнорирует любые варианты переносов строк и отступов, безошибочно указав файл объекта метаданных и конкретную строку запроса.

Способ 4. Использование 1C:Enterprise Development Tools (1C:EDT)

Современная среда разработки 1C:EDT, построенная на базе платформы Eclipse, изначально лишена недостатков классического Конфигуратора в части поиска:

  1. Окно поиска файлов и текста в 1C:EDT поддерживает полноценный многострочный ввод текста.
  2. Редактор кода BSL содержит встроенный флаг Regular expressions в диалоге поиска, что позволяет свободно задавать многострочные шаблоны без перехода в сторонние программы.

Способ 5. Использование надстроек для Конфигуратора (Снегопат)

Для разработчиков, работающих исключительно в классическом Конфигураторе, существует возможность расширения возможностей среды с помощью надстройки Снегопат (Snegopat). Встроенные скрипты надстройки (в частности, скрипт расширенного поиска) внедряют в интерфейс Конфигуратора диалоговое окно с поддержкой регулярных выражений, позволяя искать многострочные блоки запросов непосредственно в окне редактируемого модуля 1С.

Способ 6. Программный поиск средствами платформы (начиная с 8.3.23)

Если задачу поиска многострочных конструкций по текстам модулей необходимо автоматизировать в рамках служебных обработок, обратим внимание на развитие платформы. Начиная с версии платформы 8.3.23, во встроенный язык добавлена прямая работа с регулярными выражениями. Посмотрим на пример кода функции:


ШаблонПоиска = "КОГДА[\s\|]+Цены\.Количество\s*=\s*0[\s\|]+ТОГДА\s+1";
Результаты = СтрНайтиВсеПоРегулярномуВыражению(ТекстМодуля, ШаблонПоиска, Истина);

Для Каждого Совпадение Из Результаты Цикл
    Сообщить("Найдено совпадение на позиции: " + Совпадение.НачальнаяПозиция);
КонецЦикла;

Функция СтрНайтиВсеПоРегулярномуВыражению с параметром МногострочныйПоиск = Истина позволяет программно анализировать исходные тексты конфигурации любой сложности.

← На главную