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

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

Как найти переменную в 1С: поиск в конфигураторе и отладчике

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

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

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

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

Определите, что именно нужно найти

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

Отдельный случай — поиск реквизита объекта, который пользователь ошибочно называет «переменной». Например, «переменная СуммаДокумента» на самом деле может быть реквизитом документа, параметром запроса или колонкой таблицы значений. Уточните, откуда взялось имя: из сообщения об ошибке, из чужого кода или из описания задачи. Это определит, где искать.

Найдите переменную внутри одного модуля

Если модуль уже открыт, самый быстрый способ — локальный поиск. Нажмите Ctrl+F, введите имя переменной и подтвердите поиск. Клавиша F3 продолжает поиск дальше по тексту, Shift+F3 — ищет в обратном направлении. Включите опцию «Слово целиком», чтобы имя «Сумма» не находило «СуммаНДС» и «СуммаДокумента» — это резко сокращает число ложных совпадений.

Ещё быстрее работает поиск от текущей позиции курсора: поставьте курсор на имя переменной в коде и нажмите Ctrl+F3 — конфигуратор найдёт следующее вхождение этого же слова без открытия диалога. Так удобно пройтись по всем местам, где переменная читается или изменяется внутри процедуры.

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

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

Найдите переменную по всей конфигурации

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

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

Если переменная является экспортной (объявлена как «Перем Имя Экспорт;» в общем модуле), она доступна из других модулей через имя модуля. В этом случае ищите и обращения вида «ИмяМодуля.ИмяПеременной» — добавьте точку в строку поиска, чтобы найти именно внешние обращения.

Посмотрите значение переменной в отладчике

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

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

Для сложных значений — структур, таблиц значений, ссылок на объекты — используйте «Табло» (Shift+F9) или окно «Вычислить выражение» (меню «Отладка — Вычислить выражение»). В табло можно добавить несколько выражений сразу и наблюдать, как они меняются при пошаговом выполнении (F10 — шаг через, F11 — шаг внутрь процедуры). Таблицы значений и деревья раскрываются в отдельном окне просмотра.

Просмотр значения в отладчике
  1. 1
    Разрешите отладку и запустите её из конфигуратора (Отладка — Начать отладку)
  2. 2
    Поставьте точку останова (F9) после строки присваивания
  3. 3
    Выполните в сеансе действие, вызывающее этот код
  4. 4
    Наведите курсор на переменную или добавьте её в табло (Shift+F9)
  5. 5
    Пройдите код пошагово (F10/F11) и отследите изменение значения

Найдите, откуда переменная получает значение

Частая практическая задача: значение переменной неверное, и нужно понять, где оно испортилось. Начните с глобального поиска всех присваиваний — ищите строки вида «ИмяПеременной =» (со знаком равенства и пробелом). Каждое такое место — потенциальный источник значения.

Если переменная передаётся как параметр в процедуру, поднимитесь по стеку вызовов: в отладчике окно «Стек вызовов» показывает, кто вызвал текущую процедуру и с какими аргументами. Двойной щелчок по уровню стека переносит в вызывающий код, где можно посмотреть, что именно передано.

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

Инструменты просмотра значений

Всплывающая подсказка (наведение курсора)

Быстро для простых типов; не подходит для таблиц и структур

Табло (Shift+F9)

Несколько выражений сразу, значения обновляются при пошаговом выполнении

Вычислить выражение

Можно писать произвольные выражения и вызывать функции, но без постоянного наблюдения

Сообщить() в коде

Работает без отладки, но засоряет код и требует последующей очистки

Учтите ограничения и типичные ошибки

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

Ещё одна ловушка — оптимизация компилятора и директивы компиляции. Переменная, объявленная в клиентской процедуре, недоступна в серверной, даже если имена совпадают. А в толстом клиенте и управляемом приложении один и тот же модуль формы может компилироваться в разных контекстах — проверяйте директивы &НаКлиенте и &НаСервере у процедур.

Не ищите переменные в запросах: параметры запроса (например, «&Контрагент») — это не переменные встроенного языка, их значения устанавливаются методом УстановитьПараметр, и искать их нужно по имени параметра в тексте процедуры, а не по тексту запроса.

Типичные ошибки
01
Поиск без опции «Слово целиком» — сотни ложных совпадений по частичным именам
02
Точка останова на серверном коде при отладке только клиента — остановка не происходит
03
Путаница локальных переменных с одинаковыми именами в разных процедурах
04
Ожидание, что глобальный поиск покажет значения — он ищет только текст кода
05
Оставленные в коде вызовы Сообщить() после отладки — мусор в сообщениях пользователей

Проверьте результат и закрепите выводы

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

Если значение в отладчике не совпадает с тем, что вы видите в базе, проверьте, не модифицируется ли переменная в вызываемых процедурах по ссылке (параметры по умолчанию передаются по ссылке, если не указано «Знач»). Это частая причина «самопроизвольного» изменения значений.

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

Как проверить результат

Объявление переменной
Норма

Строка «Перем» найдена в том же модуле и той же области видимости

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

Объявление не найдено — возможно, это параметр, реквизит или переменная другого модуля

Значение в отладчике
Норма

Значение в табло соответствует логике алгоритма на каждом шаге

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

Значение меняется внезапно — ищите присваивание в вызываемой процедуре

Срабатывание точки останова
Норма

Выполнение останавливается на нужной строке

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

Остановки нет — проверьте типы предметов отладки и режим запуска сервера

Итог

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

Поиск переменной в коде — это Ctrl+F в модуле и Ctrl+Shift+F по конфигурации с опцией «Слово целиком». Просмотр значения — только в отладчике: точка останова, табло и пошаговое выполнение. Всегда проверяйте область видимости и контекст компиляции (клиент/сервер).

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

Как найти все места, где переменной присваивается значение?

Используйте глобальный поиск (Ctrl+Shift+F) со строкой «ИмяПеременной =» со знаком равенства. Включите «Слово целиком» и просмотрите каждое вхождение: присваивание отличается от чтения наличием знака «=» слева от выражения. В отладчике дополнительно отследите изменения через табло при пошаговом выполнении.

Почему точка останова не срабатывает?

Чаще всего код выполняется в другом контексте: на сервере, в фоновом задании или во внешнем соединении, а отладка подключена только к клиентскому сеансу. Откройте «Отладка — Подключение» и проверьте доступные предметы отладки. Для клиент-серверной базы убедитесь, что сервер 1С запущен в режиме отладки.

Как посмотреть содержимое таблицы значений в отладчике?

Добавьте переменную с таблицей в табло (Shift+F9) или откройте «Вычислить выражение», затем нажмите кнопку просмотра (лупа) рядом со значением. Откроется отдельное окно со строками и колонками таблицы, где можно пролистать все данные.

Можно ли найти переменную, если известно только её значение, а не имя?

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

Чем переменная отличается от реквизита объекта?

Переменная существует только в памяти во время выполнения кода и исчезает после завершения. Реквизит — это поле объекта конфигурации (справочника, документа), данные которого хранятся в базе. Реквизиты ищутся в дереве конфигурации и через поиск ссылок на метаданные, а не через объявления «Перем».

Как найти экспортную переменную общего модуля?

Откройте общий модуль и найдите строку «Перем Имя Экспорт;» в секции объявления. Чтобы найти все обращения к ней из других модулей, выполните глобальный поиск по строке «ИмяМодуля.ИмяПеременной» — так вы увидите все внешние чтения и присваивания.