Ищем фрагмент кода в 1С: от модуля до всей конфигурации и истории хранилища

· 9 мин

Содержание

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

Типичная ситуация: пользователь присылает скриншот с текстом «Не заполнен склад отправитель», а вы понятия не имеете, какая из двух тысяч процедур это выводит. Или нужно найти все вызовы устаревшей функции перед обновлением. Оба случая решаются штатными средствами за пару минут, если знать, какой инструмент взять.

Поиск в открытом модуле: Ctrl+F и соседние клавиши

Когда понятно, в каком объекте искать, глобальный поиск не нужен. Откройте модуль двойным щелчком по объекту в дереве конфигурации и используйте сочетания клавиш редактора.

КлавишиЧто делает
Ctrl+Fокно поиска по текущему модулю
F3 / Shift+F3следующее / предыдущее вхождение
Ctrl+Hпоиск с заменой
Ctrl+Gпереход к строке по номеру
Ctrl+Alt+Pсписок процедур и функций модуля

В окне поиска есть флажки учёта регистра и поиска целого слова. Флажок целого слова полезен для коротких имён: поиск Сумма без него найдёт ещё СуммаНДС, СуммаДокумента и десятки других переменных.

💡 Выделите слово в тексте модуля перед нажатием Ctrl+F — оно сразу подставится в поле поиска.

Переход по номеру строки (Ctrl+G) особенно полезен при разборе ошибок. Платформа указывает место ошибки в формате {Документ.РеализацияТоваровУслуг.МодульОбъекта(214)}: тип и имя объекта, вид модуля и номер строки в скобках. Открываете модуль объекта, жмёте Ctrl+G, вводите 214 — и вы на месте.

⚠️ У объекта может быть несколько модулей: модуль объекта, модуль менеджера, модули каждой формы. Поиск Ctrl+F работает только в том модуле, где стоит курсор. Если не нашли — это ещё не значит, что строки нет в объекте.

Глобальный поиск по всей конфигурации

Команда Правка → Глобальный поиск (Ctrl+Shift+F) просматривает тексты всех модулей сразу: общих модулей, модулей объектов, менеджеров, форм, команд. Порядок такой:

  1. Откройте конфигурацию: Конфигурация → Открыть конфигурацию.
  2. Нажмите Ctrl+Shift+F.
  3. Введите искомый текст. Настройте учёт регистра и поиск целого слова.
  4. Ограничьте область поиска, если знаете подсистему или группу объектов: в окне можно выбрать не всю конфигурацию, а отмеченные объекты.
  5. Запустите поиск. Результаты появятся в окне «Результаты поиска» списком «объект — строка».
  6. Двойной щелчок по строке результата открывает модуль ровно на найденной позиции.

В типовой Бухгалтерии 3.0 поиск по всей конфигурации занимает от нескольких секунд до минуты в зависимости от диска и мощности машины. Если ищете часто, сужайте область: результатов меньше, разбирать их быстрее.

Поиск ссылок на объект — когда ищете не текст, а использование

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

Эти два инструмента дополняют друг друга:

  • 🔤 глобальный поиск — по тексту модулей, видит строки, имена переменных, запросы внутри кода;
  • 🔗 поиск ссылок — по связям метаданных, видит использование объекта в составе других объектов, а не только в коде.

Как найти код по тексту сообщения или ошибки

Главная хитрость: сообщение пользователю почти никогда не лежит в коде целиком. Тексты собирают из частей и подставляют значения. Поэтому искать фразу дословно — частая причина «ничего не найдено».

Что мешает найти фразу целиком:

  • 🌐 НСтр. Строки для пользователя оформляют как НСтр("ru = 'Не заполнен склад'") — внутри могут быть другие кавычки и языковой префикс.
  • 🧩 Параметры. Вместо имени склада в коде стоит %1, а значение подставляет СтрШаблон или функция из БСП.
  • ↩️ Перенос строк. Длинный текст разбит на строки, каждая продолжается символом |. Фраза, разорванная переносом, не совпадёт с вашим запросом.
  • 🏷️ Синоним реквизита. Часть сообщений платформа формирует сама из синонима реквизита: «Поле “Склад” не заполнено». Такого текста в модулях нет вообще.

Как действовать:

  1. Возьмите из сообщения 2-3 самых редких слова подряд, без чисел и имён. Из «Не заполнен склад отправитель в строке 5» берите склад отправитель.
  2. Отключите учёт регистра.
  3. Если результатов ноль, сократите до одного редкого слова.
  4. Если сообщение о незаполненном поле, найдите реквизит по синониму в дереве метаданных и проверьте его свойство «Проверка заполнения» — сообщение может формироваться автоматически.
// Так текст выглядит в модуле — поиск фразы «склад отправитель в строке 5» его не найдёт
ТекстСообщения = СтрШаблон(НСтр("ru = 'Не заполнен склад отправитель в строке %1'"), НомерСтроки);

Регулярные выражения: где они работают

В штатном окне поиска Конфигуратора режима регулярных выражений нет. Поиск идёт по точному вхождению подстроки с учётом двух флажков. Для шаблонов вида «любой вызов функции X с тремя параметрами» нужен другой инструмент:

  • 🧰 1C:Enterprise Development Tools (EDT) — среда на базе Eclipse. В поиске по файлам (Ctrl+H, вкладка поиска по тексту) есть флажок «Regular expression».
  • 📁 Выгрузка в файлы + внешний редактор — VS Code, Notepad++, Sublime Text или консольные grep и rg (ripgrep). Про выгрузку — в следующем разделе.

Полезные шаблоны для кода 1С:

ЗадачаРегулярное выражение
вызов процедуры с пробелами перед скобкой или безЗаписатьДанные\s*\(
экспортные процедуры и функции^\s*(Процедура|Функция)\s+\w+\(.*\)\s+Экспорт
строки с Сообщить(, кроме закомментированных^(?!\s*//).*Сообщить\(
обращение к любому регистру накопления по имениРегистрыНакопления\.\w+
запросы, читающие таблицу документаИЗ\s+Документ\.\w+

💡 Шаблон с (?!...) — это опережающая проверка. В rg она работает только с ключом -P, в grep — тоже с -P. Без ключа утилита выдаст ошибку разбора шаблона.

Регистр в шаблонах кириллицы: ключ -i в rg и grep корректно работает с русскими буквами, если файлы в UTF-8 и в системе стоит UTF-8 локаль.

Поиск по выгруженным файлам конфигурации

Выгрузка превращает конфигурацию в дерево каталогов с XML-описаниями и текстами модулей в файлах .bsl. По такому дереву ищет что угодно — от grep до проводника Windows. И находит то, чего не видит глобальный поиск: например, текст запроса внутри макета схемы компоновки данных.

Как выгрузить

Через меню: Конфигурация → Выгрузить конфигурацию в файлы..., укажите пустой каталог.

Через командную строку — удобно для регулярной выгрузки:

"C:\Program Files\1cv8\8.3.24.1586\bin\1cv8.exe" DESIGNER /F "D:\Bases\Buh" /N "Администратор" /P "" /DumpConfigToFiles "D:\Dump\Buh"

Подставьте свой номер платформы, путь к базе и пользователя. Для серверной базы вместо /F укажите /S "сервер\имябазы".

Где что лежит после выгрузки:

Что ищемПуть в выгрузке
общий модульCommonModules\<Имя>\Ext\Module.bsl
модуль объекта документаDocuments\<Имя>\Ext\ObjectModule.bsl
модуль менеджераDocuments\<Имя>\Ext\ManagerModule.bsl
модуль формыDocuments\<Имя>\Forms\<Форма>\Ext\Form\Module.bsl
макет (в т.ч. схема компоновки)...\Templates\<Макет>\Ext\Template.xml

Чем искать

Консольный rg (ripgrep) — самый быстрый вариант, есть сборка под Windows:

rg -n -i "склад отправитель" D:\Dump\Buh -g "*.bsl"

Если ничего ставить нельзя, хватит PowerShell:

Get-ChildItem D:\Dump\Buh -Recurse -Filter *.bsl |
  Select-String -Pattern "склад отправитель" |
  Select-Object Path, LineNumber, Line

⚠️ Старую утилиту findstr для русских строк не используйте. Модули выгружаются в UTF-8, а findstr с кириллицей в этой кодировке работает ненадёжно и пропускает совпадения.

Номер строки из rg или PowerShell совпадает с номером строки в Конфигураторе. Нашли в файле — открываете модуль, Ctrl+G, вводите номер.

Поиск в хранилище конфигурации и истории версий

Глобальный поиск смотрит только в вашу локальную конфигурацию. При работе с хранилищем это ловушка: коллега поместил изменения, а вы их ещё не получили — поиск их не найдёт.

Перед поиском обновитесь: Конфигурация → Хранилище конфигурации → Обновить конфигурацию из хранилища. После этого локальная конфигурация совпадает с последней версией хранилища.

Как найти строку в старой версии

Задача «в какой версии появилась эта строка» решается через историю:

  1. Откройте Конфигурация → Хранилище конфигурации → История хранилища.
  2. Выделите нужную версию и сохраните её в файл .cf.
  3. Загрузите файл в отдельную пустую базу или сравните с текущей конфигурацией через сравнение с конфигурацией из файла.
  4. Ищите строку обычным глобальным поиском в загруженной версии.

Для одной-двух версий этого достаточно. Если версий сотни, удобнее перегнать историю хранилища в Git: этим занимается открытый инструмент gitsync на OneScript. Каждая версия хранилища становится коммитом с автором и комментарием. Дальше Git сам найдёт, когда строка появилась или исчезла:

git log -S "ЗаписатьДанные(" --oneline -- "*.bsl"

Ключ -S показывает коммиты, в которых число вхождений строки изменилось — то есть её добавили или удалили.

Где искать строку в вашем случае?

Автоматизация поиска внешним скриптом

Когда поиск повторяется — например, перед каждым обновлением проверяете, не вызывает ли доработка удалённые функции БСП, — выгрузку и поиск стоит связать скриптом. Выгрузка делается командой /DumpConfigToFiles из раздела выше, поиск — небольшой программой.

Скрипт на Python ниже обходит выгрузку, ищет регулярное выражение и для каждого совпадения показывает не только файл и строку, но и имя процедуры, в которой оно стоит. Это сильно ускоряет разбор: сразу видно контекст.

import re
import sys
from pathlib import Path

root = Path(sys.argv[1])                     # каталог выгрузки
pattern = re.compile(sys.argv[2], re.IGNORECASE)
proc_re = re.compile(r'^\s*(?:Асинх\s+)?(?:Процедура|Функция)\s+(\w+)', re.IGNORECASE)

for path in sorted(root.rglob('*.bsl')):
    current = '(вне процедур)'
    with path.open(encoding='utf-8-sig') as f:
        for num, line in enumerate(f, 1):
            m = proc_re.match(line)
            if m:
                current = m.group(1)
            if pattern.search(line):
                rel = path.relative_to(root)
                print(f'{rel}:{num}: [{current}] {line.strip()}')

Запуск:

python find_bsl.py D:\Dump\Buh "СообщитьПользователю\s*\("

Кодировка utf-8-sig нужна потому, что файлы выгрузки начинаются с метки BOM. В Python 3 класс \w включает русские буквы, поэтому имена процедур на кириллице ловятся без доработок.

Что ещё можно повесить на такой скрипт:

  • 📋 вывод в CSV, чтобы отдать список мест разработчику или аналитику;
  • ⏰ запуск по расписанию с ночной выгрузкой и сравнением со вчерашним результатом;
  • 🚫 «стоп-лист» запрещённых конструкций, например прямых записей в регистры из форм.

Если в компании уже используют OneScript, ту же логику можно написать на нём — язык почти совпадает со встроенным языком 1С.

Частые вопросы

Глобальный поиск ищет в расширениях конфигурации?
Поиск идёт по открытой конфигурации. Расширение откройте отдельно через Конфигурация → Расширения конфигурации и ищите в нём. Для выгрузки расширения в файлы к команде /DumpConfigToFiles добавьте ключ -Extension с именем расширения.
Как найти строку во внешней обработке или отчёте?
Откройте файл .epf или .erf в Конфигураторе через Файл → Открыть и ищите Ctrl+F в его модулях. Для поиска по множеству обработок выгрузите каждую командой /DumpExternalDataProcessorOrReportToFiles и ищите по файлам.
Почему глобальный поиск не находит текст запроса из отчёта?
Запросы отчётов на СКД хранятся в макете схемы компоновки, а не в модуле. Найдите их в выгрузке в файле Template.xml нужного макета или откройте схему отчёта вручную.
Можно ли найти объект метаданных по имени, а не код?
Да. Над деревом конфигурации есть строка поиска: начните вводить имя или часть имени, дерево отфильтруется. Это быстрее, чем глобальный поиск по тексту.
Поиск в выгрузке безопасен для рабочей базы?
Выгрузка только читает конфигурацию и не меняет базу, монопольный доступ ей не нужен. Каталог выгрузки — обычные файлы, с ними можно делать что угодно.