К статье
Практический материал

Разработка и Конфигурация · 11 мин

Где в 1С находится код выполняемой функции и как его найти

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

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

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

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

Где физически хранится код функций в конфигурации 1С

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

Основные места размещения кода:

  • Общие модули — серверные и клиентские процедуры и функции, доступные из любой точки конфигурации. Большинство библиотечных функций типовых решений лежит именно здесь.
  • Модуль формы — обработчики событий элементов формы и вспомогательные функции, работающие с данными формы.
  • Модуль объекта — код, относящийся к конкретному документу, справочнику или регистру: обработка проведения, заполнение, проверка.
  • Модуль менеджера — функции работы с объектом как с типом: создание, получение данных, печатные формы.
  • Модуль приложения и модуль сеанса — код, выполняющийся при старте системы и установке параметров сеанса.

Если функция вызывается коротким именем без префикса — она объявлена либо в текущем модуле, либо в общем модуле с флагом «Глобальный». Если вызов выглядит как ИмяМодуля.ИмяФункции(), префикс прямо указывает на общий модуль, где лежит код.

Как найти функцию по имени через глобальный поиск

Если известно имя функции, самый быстрый способ — глобальный поиск по всей конфигурации. Откройте конфигуратор и нажмите Ctrl+Shift+F либо выберите в меню «Правка» пункт «Глобальный поиск».

Введите имя функции, например ПолучитьКурсВалюты, и запустите поиск. В результатах отобразятся все строки, где встречается это имя: и объявление функции, и все места её вызова. Объявление легко отличить — строка начинается со слова Функция или Процедура.

Порядок действий при глобальном поиске
  1. 1
    Откройте конфигуратор и нажмите Ctrl+Shift+F
  2. 2
    Введите точное имя функции без скобок и параметров
  3. 3
    Включите поиск по всей конфигурации, снимите лишние фильтры
  4. 4
    В результатах найдите строку, начинающуюся с «Функция» — это объявление
  5. 5
    Дважды щёлкните по строке — конфигуратор откроет модуль на нужной позиции

Двойной щелчок по результату открывает модуль и устанавливает курсор на найденную строку. В заголовке окна модуля видно, к какому объекту он относится, — это и есть ответ на вопрос, где лежит код.

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

Переход к определению из места вызова

Когда в руках уже есть фрагмент кода, где функция вызывается, искать её объявление вручную не нужно. Платформа поддерживает переход к определению: поставьте курсор на имя функции и нажмите F12 (в некоторых версиях — через контекстное меню «Перейти к определению»).

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

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

Как найти код через отладчик, если имя функции неизвестно

Частая ситуация: известно только внешнее проявление — кнопка на форме, ошибка при проведении документа, странное значение в отчёте. Имя функции неизвестно, и глобальный поиск не за что зацепить. Здесь основной инструмент — отладчик.

Включите отладку: в конфигураторе откройте «Отладка» → «Начало отладки» или запустите клиентское приложение с ключом отладки. Убедитесь, что в настройках («Сервис» → «Параметры» → «Отладка») разрешена отладка для нужного типа соединения.

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

Второй приём — остановка по ошибке. Включите «Отладка» → «Остановка по ошибке» и воспроизведите проблему. Отладчик остановится ровно на строке, где возникло исключение, а окно стека вызовов (вкладка «Стек вызовов» внизу) покажет полную цепочку: какая функция вызвала какую, с указанием модуля и строки для каждого уровня.

Поиск кода через стек вызовов
  1. 1
    Включите отладку и остановку по ошибке
  2. 2
    Воспроизведите действие, приводящее к ошибке
  3. 3
    Когда отладчик остановится, откройте панель «Стек вызовов»
  4. 4
    Щёлкайте по уровням стека — каждый показывает модуль и строку вызова
  5. 5
    Самый верхний уровень — место ошибки, нижние — цепочка вызвавших функций

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

Как определить выполняющийся код по сообщению об ошибке

Даже без запуска отладчика текст ошибки часто содержит координаты кода. В сообщениях платформа указывает модуль и строку в формате вида {ОбщийМодуль.РаботаСКурсами.Модуль(125)}: Ошибка при вызове метода контекста.

Расшифровка проста: после фигурной скобки идёт путь к модулю — тип метаданных, имя объекта, слово «Модуль», а в круглых скобках — номер строки. Откройте указанный общий модуль в конфигураторе и перейдите к строке через Ctrl+G (переход к строке по номеру).

Если ошибка пришла от пользователя в виде скриншота, попросите развернуть подробности кнопкой «Подробно» — краткий текст часто не содержит координат, а полное описание ошибки их включает.

Контрольные точки

Как проверить, что найден нужный код

Имя и сигнатура функции
Норма

Имя и набор параметров совпадают с местом вызова

Тревожный признак

Имя совпадает, но параметры другие — возможно, найдена одноимённая функция в другом модуле

Поведение при отладке
Норма

Точка останова в найденной функции срабатывает при воспроизведении сценария

Тревожный признак

Точка останова не срабатывает — выполняется другой код

Путь модуля
Норма

Модуль соответствует префиксу вызова (ИмяМодуля.ИмяФункции)

Тревожный признак

Префикс вызова указывает на другой общий модуль

Поиск кода внешних обработок, расширений и подписок

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

Расширения конфигурации. В режиме предприятия откройте «Все функции» → «Стандартные» → «Расширения конфигурации» и посмотрите список подключённых расширений. Код расширения перекрывает или дополняет типовые модули, поэтому фактически выполняемый текст может отличаться от того, что видно в основной конфигурации. Открыть модуль расширения можно в конфигураторе через «Конфигурация» → «Расширения конфигурации».

Внешние обработки и отчёты. Если действие запускается из файла .epf или .erf, код находится внутри этого файла. Откройте его в конфигураторе через «Файл» → «Открыть» — структура модулей у внешней обработки такая же, как у объектов конфигурации.

Подписки на события. Если код срабатывает «сам» при записи или проведении документа, а в модуле объекта его нет — ищите в ветке «Общие» → «Подписки на события». Обработчик подписки указывает на процедуру в общем модуле, и именно там лежит выполняемый код.

Типичные ошибки при поиске кода
01
Правка модуля основной конфигурации, когда фактически работает расширение — изменения не влияют на поведение
02
Поиск только по общим модулям, когда функция объявлена локально в модуле формы — глобальный поиск по имени решает проблему
03
Игнорирование подписок на события — код «из ниоткуда» при записи документа почти всегда находится именно там
04
Поиск по имени с опечаткой или без учёта регистронезависимости — 1С нечувствителен к регистру, но лишний символ в запросе обнулит результаты

Ограничения и меры предосторожности

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

Отладка на рабочей базе — отдельный риск. Точка останова в серверном коде останавливает выполнение для всех сеансов, проходящих через этот код, если включён соответствующий режим отладки. На продуктивной базе отлаживайтесь под отдельным пользователем, в копии базы или в часы минимальной нагрузки.

Также помните, что просмотр кода закрытых модулей (поставляемых без исходного текста) невозможен штатными средствами — конфигуратор покажет только заглушку. Это нормальное ограничение защиты, а не признак проблемы с базой.

Итог

Что важно запомнить

Код функции в 1С всегда находится в каком-либо модуле конфигурации, расширения или внешней обработки. Имя известно — используйте глобальный поиск (Ctrl+Shift+F) или переход к определению (F12). Имя неизвестно — отладчик с шагом «внутрь» и стек вызовов покажут фактически выполняемый код. Перед правками проверьте расширения и подписки на события, а эксперименты проводите на копии базы.

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

Как быстро найти, какой код выполняется при нажатии кнопки на форме?

Откройте модуль формы в конфигураторе и найдите процедуру с именем команды кнопки — обычно это обработчик вида ИмяКоманды(Команда). Если обработчик неочевиден, поставьте точку останова в модуле формы и нажмите кнопку под отладкой — выполнение остановится на нужном обработчике.

Почему глобальный поиск не находит функцию, хотя она точно выполняется?

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

Что означает запись вида {ОбщийМодуль.Имя.Модуль(250)} в тексте ошибки?

Это координаты кода: тип метаданных (общий модуль), его имя и номер строки в круглых скобках. Откройте указанный модуль в конфигураторе и перейдите к строке через Ctrl+G — там находится место возникновения ошибки.

Можно ли посмотреть код функции прямо в режиме 1С:Предприятие?

Штатно — нет, просмотр и редактирование модулей доступны только в конфигураторе. Однако через отладчик, подключённый к сеансу предприятия, можно видеть выполняемый код и значения переменных в реальном времени.

Функция есть и в конфигурации, и в расширении — какая из них выполняется?

Выполняется версия из расширения, если оно активно и корректно применено: расширение перекрывает модули основной конфигурации. Проверить фактическое поведение можно точкой останова — отладчик остановится в том модуле, который реально исполняется.

Как найти код, который срабатывает при записи документа, если в модуле объекта его нет?

Проверьте ветку «Общие» → «Подписки на события» — обработчики подписок на события записи и проведения указывают на процедуры в общих модулях. Также код может находиться в расширении конфигурации, дополняющем модуль объекта.