Разработка и Конфигурация · 11 мин
Как найти переменную в 1С: поиск в конфигураторе и отладчике
Как найти переменную в 1С: глобальный поиск по конфигурации, поиск в модуле, просмотр значений в отладчике, типичные ошибки и проверка результата.
Задача «найти переменную» в 1С возникает в двух разных ситуациях. Первая — нужно найти, где в коде конфигурации объявлена или используется переменная с определённым именем. Вторая — во время отладки требуется посмотреть текущее значение переменной, чтобы понять, почему алгоритм работает не так, как ожидалось. Инструменты для этих задач разные, и путать их — частая причина потери времени.
Для поиска по коду используются встроенные средства конфигуратора: поиск в модуле, глобальный поиск по всей конфигурации и поиск ссылок на объект метаданных. Для просмотра значений во время выполнения служат отладчик, табло, окно «Вычислить выражение» и стек вызовов. Ниже разобраны оба сценария с конкретными шагами, горячими клавишами и ограничениями.
Важно понимать контекст: переменная в 1С существует только внутри своей области видимости — процедуры, функции, модуля. Поэтому «найти переменную» часто означает не только найти строку кода, но и понять, где она объявлена, где меняет значение и в какой момент становится доступной для просмотра.
Определите, что именно нужно найти
Прежде чем открывать поиск, сформулируйте задачу. Если вы ищете, где в конфигурации объявлена переменная с именем, например, «СкидкаПоКарте», — это статический поиск по текстам модулей. Если нужно узнать, какое значение принимает переменная при проведении документа, — это динамический анализ в отладчике. Подходы не пересекаются: отладчик не ищет по коду, а текстовый поиск не показывает значений.
Отдельный случай — поиск реквизита объекта, который пользователь ошибочно называет «переменной». Например, «переменная СуммаДокумента» на самом деле может быть реквизитом документа, параметром запроса или колонкой таблицы значений. Уточните, откуда взялось имя: из сообщения об ошибке, из чужого кода или из описания задачи. Это определит, где искать.
Найдите переменную внутри одного модуля
Если модуль уже открыт, самый быстрый способ — локальный поиск. Нажмите Ctrl+F, введите имя переменной и подтвердите поиск. Клавиша F3 продолжает поиск дальше по тексту, Shift+F3 — ищет в обратном направлении. Включите опцию «Слово целиком», чтобы имя «Сумма» не находило «СуммаНДС» и «СуммаДокумента» — это резко сокращает число ложных совпадений.
Ещё быстрее работает поиск от текущей позиции курсора: поставьте курсор на имя переменной в коде и нажмите Ctrl+F3 — конфигуратор найдёт следующее вхождение этого же слова без открытия диалога. Так удобно пройтись по всем местам, где переменная читается или изменяется внутри процедуры.
Обратите внимание на объявление: строка вида «Перем ИмяПеременной;» в начале модуля означает переменную уровня модуля, доступную всем процедурам этого модуля. Если объявления нет, переменная локальная и создаётся при первом присваивании внутри процедуры. Проверьте также секцию объявления переменных модуля — она расположена выше первой процедуры.
- 1Откройте нужный модуль в конфигураторе
- 2Нажмите Ctrl+F и введите имя переменной
- 3Включите опцию «Слово целиком» для точного совпадения
- 4Пройдите по вхождениям клавишей F3, проверяя контекст каждого
- 5Найдите строку «Перем ...» — это объявление и область видимости
Найдите переменную по всей конфигурации
Когда неизвестно, в каком модуле объявлена переменная, используйте глобальный поиск: меню «Правка — Глобальный поиск» или сочетание Ctrl+Shift+F. Введите имя переменной, укажите область поиска «Вся конфигурация» и включите «Слово целиком». Результат появится в отдельном окне со списком модулей и строк — двойной щелчок открывает нужное место в коде.
Глобальный поиск работает по текстам всех модулей: общих модулей, модулей объектов, модулей форм, модулей менеджеров. Это главный инструмент, когда переменная «прилетает» из незнакомого кода — например, из типовой подсистемы, которую вы раньше не изучали. Учтите: поиск ищет текст, поэтому одноимённые локальные переменные в разных процедурах будут показаны все, и их придётся различать по контексту.
Если переменная является экспортной (объявлена как «Перем Имя Экспорт;» в общем модуле), она доступна из других модулей через имя модуля. В этом случае ищите и обращения вида «ИмяМодуля.ИмяПеременной» — добавьте точку в строку поиска, чтобы найти именно внешние обращения.
Посмотрите значение переменной в отладчике
Текстовый поиск показывает код, но не значения. Чтобы увидеть, чему равна переменная в конкретный момент, включите отладку: меню «Отладка — Начать отладку» в конфигураторе. Предварительно убедитесь, что отладка разрешена на сервере 1С (для файловой базы она доступна по умолчанию, для клиент-серверной может потребоваться запуск сервера с ключом отладки).
Поставьте точку останова (F9) на строке, где переменная уже получила значение, и выполните в сеансе действие, которое приводит к выполнению этого кода. Когда выполнение остановится, наведите курсор мыши на имя переменной — конфигуратор покажет текущее значение во всплывающей подсказке. Это самый быстрый способ для простых типов: чисел, строк, дат.
Для сложных значений — структур, таблиц значений, ссылок на объекты — используйте «Табло» (Shift+F9) или окно «Вычислить выражение» (меню «Отладка — Вычислить выражение»). В табло можно добавить несколько выражений сразу и наблюдать, как они меняются при пошаговом выполнении (F10 — шаг через, F11 — шаг внутрь процедуры). Таблицы значений и деревья раскрываются в отдельном окне просмотра.
- 1Разрешите отладку и запустите её из конфигуратора (Отладка — Начать отладку)
- 2Поставьте точку останова (F9) после строки присваивания
- 3Выполните в сеансе действие, вызывающее этот код
- 4Наведите курсор на переменную или добавьте её в табло (Shift+F9)
- 5Пройдите код пошагово (F10/F11) и отследите изменение значения
Найдите, откуда переменная получает значение
Частая практическая задача: значение переменной неверное, и нужно понять, где оно испортилось. Начните с глобального поиска всех присваиваний — ищите строки вида «ИмяПеременной =» (со знаком равенства и пробелом). Каждое такое место — потенциальный источник значения.
Если переменная передаётся как параметр в процедуру, поднимитесь по стеку вызовов: в отладчике окно «Стек вызовов» показывает, кто вызвал текущую процедуру и с какими аргументами. Двойной щелчок по уровню стека переносит в вызывающий код, где можно посмотреть, что именно передано.
Когда присваиваний много и код ветвистый, удобнее поставить точку останова не на строку, а на условие или использовать пошаговое выполнение от начала процедуры, наблюдая переменную в табло. Так вы увидите точный момент, когда значение меняется на неожиданное.
Инструменты просмотра значений
Быстро для простых типов; не подходит для таблиц и структур
Несколько выражений сразу, значения обновляются при пошаговом выполнении
Можно писать произвольные выражения и вызывать функции, но без постоянного наблюдения
Работает без отладки, но засоряет код и требует последующей очистки
Учтите ограничения и типичные ошибки
Отладка на клиенте и на сервере — разные процессы. Если код выполняется в серверной процедуре, а отладка подключена только к клиентскому сеансу, точка останова не сработает. Проверьте в настройках отладки, что подключены нужные типы предметов отладки: клиент, сервер, фоновые задания. Код в фоновых заданиях и внешних соединениях требует отдельного подключения предмета отладки.
Ещё одна ловушка — оптимизация компилятора и директивы компиляции. Переменная, объявленная в клиентской процедуре, недоступна в серверной, даже если имена совпадают. А в толстом клиенте и управляемом приложении один и тот же модуль формы может компилироваться в разных контекстах — проверяйте директивы &НаКлиенте и &НаСервере у процедур.
Не ищите переменные в запросах: параметры запроса (например, «&Контрагент») — это не переменные встроенного языка, их значения устанавливаются методом УстановитьПараметр, и искать их нужно по имени параметра в тексте процедуры, а не по тексту запроса.
Проверьте результат и закрепите выводы
После того как переменная найдена, убедитесь, что вы нашли именно то объявление. Признаки правильного результата: найденная строка «Перем» находится в той же области видимости, что и интересующий код; все присваивания этой переменной объясняют наблюдаемое поведение; в отладчике значение совпадает с ожидаемым на каждом шаге.
Если значение в отладчике не совпадает с тем, что вы видите в базе, проверьте, не модифицируется ли переменная в вызываемых процедурах по ссылке (параметры по умолчанию передаются по ссылке, если не указано «Знач»). Это частая причина «самопроизвольного» изменения значений.
Как проверить результат
Строка «Перем» найдена в том же модуле и той же области видимости
Объявление не найдено — возможно, это параметр, реквизит или переменная другого модуля
Значение в табло соответствует логике алгоритма на каждом шаге
Значение меняется внезапно — ищите присваивание в вызываемой процедуре
Выполнение останавливается на нужной строке
Остановки нет — проверьте типы предметов отладки и режим запуска сервера
Что важно запомнить
Поиск переменной в коде — это Ctrl+F в модуле и Ctrl+Shift+F по конфигурации с опцией «Слово целиком». Просмотр значения — только в отладчике: точка останова, табло и пошаговое выполнение. Всегда проверяйте область видимости и контекст компиляции (клиент/сервер).
Частые вопросы
Как найти все места, где переменной присваивается значение?
Используйте глобальный поиск (Ctrl+Shift+F) со строкой «ИмяПеременной =» со знаком равенства. Включите «Слово целиком» и просмотрите каждое вхождение: присваивание отличается от чтения наличием знака «=» слева от выражения. В отладчике дополнительно отследите изменения через табло при пошаговом выполнении.
Почему точка останова не срабатывает?
Чаще всего код выполняется в другом контексте: на сервере, в фоновом задании или во внешнем соединении, а отладка подключена только к клиентскому сеансу. Откройте «Отладка — Подключение» и проверьте доступные предметы отладки. Для клиент-серверной базы убедитесь, что сервер 1С запущен в режиме отладки.
Как посмотреть содержимое таблицы значений в отладчике?
Добавьте переменную с таблицей в табло (Shift+F9) или откройте «Вычислить выражение», затем нажмите кнопку просмотра (лупа) рядом со значением. Откроется отдельное окно со строками и колонками таблицы, где можно пролистать все данные.
Можно ли найти переменную, если известно только её значение, а не имя?
Напрямую — нет: поиск работает по тексту кода, а не по значениям. Обходной путь: найдите в отладчике место, где значение проявляется (например, строку, формирующую сообщение или запись), и от него по стеку вызовов и присваиваниям выйдите на переменную-источник.
Чем переменная отличается от реквизита объекта?
Переменная существует только в памяти во время выполнения кода и исчезает после завершения. Реквизит — это поле объекта конфигурации (справочника, документа), данные которого хранятся в базе. Реквизиты ищутся в дереве конфигурации и через поиск ссылок на метаданные, а не через объявления «Перем».
Как найти экспортную переменную общего модуля?
Откройте общий модуль и найдите строку «Перем Имя Экспорт;» в секции объявления. Чтобы найти все обращения к ней из других модулей, выполните глобальный поиск по строке «ИмяМодуля.ИмяПеременной» — так вы увидите все внешние чтения и присваивания.