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

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

Что делать, если переменная не определена в 1С

Разбираем ошибку «Переменная не определена» в 1С: типичные причины, методы поиска в конфигураторе, проверка директив компиляции и исправление кода.

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

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

Чаще всего причина банальна: опечатка, потерянное объявление после копирования кода из другого модуля или неправильная директива компиляции. Реже проблема кроется в архитектуре — переменная объявлена в общем модуле, к которому нет доступа из текущего контекста. Ниже разобраны все типовые сценарии и порядок их устранения.

Как понять, где именно возникла ошибка

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

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

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

Ошибка при проверке модуляСинтаксическая проблема

Ищите опечатку или отсутствующее объявление Перем в этом же модуле

Ошибка только в режиме ПредприятиеПроблема контекста исполнения

Проверяйте директивы &НаКлиенте, &НаСервере и доступность общих модулей

Ошибка после копирования кодаПотерянное объявление

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

Ошибка после обновления конфигурацииИзменился состав модулей

Проверьте, не переименован или не удалён общий модуль с экспортной переменной

Опечатки и несовпадение имён — самая частая причина

Первый шаг — найти все вхождения имени в модуле. Используйте поиск по модулю (Ctrl+F) с включённым поиском по текущему модулю или по всей конфигурации (Ctrl+Shift+F). Если объявление найдено, но имя хотя бы в одном месте отличается — исправьте несовпадающие вхождения.

Типичные источники опечаток: перепутанные буквы «е/ё» (в 1С это разные символы), пропущенная или лишняя буква в длинных именах, случайное использование латинской буквы вместо кириллической — «а», «е», «о», «с» визуально неотличимы, но для компилятора это другие идентификаторы. Если имя скопировано из внешнего источника (текстовый файл, чат, браузер), вероятность смешения алфавитов особенно высока.

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

Если одна и та же переменная «теряется» в разных местах модуля, используйте замену (Ctrl+H) с точным именем из сообщения об ошибке на правильное — это быстрее и безопаснее ручного исправления каждого вхождения.
ПЗ
Практическое замечание

Проверка объявления переменной и области видимости

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

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

Отдельный случай — переменные формы. В модуле формы данные чаще всего хранятся не в переменных, а в реквизитах формы, и обращение к ним идёт через ЭтаФорма.ИмяРеквизита или напрямую по имени реквизита. Если вы обращаетесь к реквизиту формы как к обычной переменной, которой нет в объявлениях, получите ту же ошибку. Проверьте список реквизитов формы в конфигураторе и скорректируйте обращение.

Экспортные переменные общих модулей

Если переменная объявлена в общем модуле с ключевым словом Экспорт, обращение к ней выполняется через имя модуля: ИмяОбщегоМодуля.ИмяПеременной. Обращение к имени напрямую без указания модуля приведёт к ошибке «Переменная не определена». Проверьте также, что у общего модуля не снят флаг глобальности там, где это требуется, и что сам модуль доступен в нужном контексте (клиент/сервер).

Директивы компиляции и контекст исполнения

В управляемых формах и при разделении кода на клиентскую и серверную части директивы &НаКлиенте, &НаСервере, &НаСервереБезКонтекста определяют, где компилируется процедура. Переменная, объявленная в коде, который компилируется только на сервере, недоступна в клиентской процедуре — и наоборот.

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

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

Маршрут решения

Как выбрать действие

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

Пошаговый порядок устранения ошибки

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

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

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

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

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

Проверка модуля в конфигураторе
Норма

Ошибок и предупреждений по переменным нет

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

Сообщение «Переменная не определена» осталось или появились новые

Запуск сценария в режиме Предприятие
Норма

Код выполняется до конца без исключений

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

Ошибка возникает только в определённом режиме (клиент/сервер)

Поиск имени по конфигурации
Норма

Все вхождения ссылаются на одно объявление

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

Часть вхождений указывает на несуществующее имя

Типичные ошибки при исправлении

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

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

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

Профилактика: как не допускать таких ошибок

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

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

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

Итог

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

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

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

Может ли ошибка возникать из-за разницы регистра букв?

Нет. Встроенный язык 1С нечувствителен к регистру: «Сумма» и «СУММА» — одна переменная. Ошибку вызывают только различия в самих символах: пропущенные буквы, перестановки, смешение кириллицы и латиницы, разница «е/ё».

Почему переменная видна в одной процедуре, но не видна в другой?

Потому что она объявлена внутри первой процедуры через Перем — это локальная переменная. Чтобы имя было доступно всем процедурам модуля, объявление нужно разместить в разделе описания переменных модуля, до первой процедуры. Альтернатива — передавать значение через параметры.

Что делать, если ошибка появилась после обновления конфигурации?

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

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

Объявите её в общем модуле с ключевым словом Экспорт и обращайтесь через имя модуля: ИмяОбщегоМодуля.ИмяПеременной. Убедитесь, что в свойствах модуля установлены флажки доступности для нужного контекста (Сервер и/или Клиент), иначе обращение из недоступного контекста даст ту же ошибку.

Опасно ли просто добавить объявление Перем, чтобы убрать ошибку?

Опасно, если вы не понимаете, откуда должно браться значение. Пустое объявление уберёт сообщение компилятора, но переменная будет иметь значение Неопределено, что приведёт к ошибкам выполнения или неверным расчётам. Сначала выясните, какое значение и откуда должна получать переменная.

Почему проверка модуля проходит, а в режиме Предприятие ошибка остаётся?

Скорее всего, проверка выполнялась не для того контекста. В форме проверки модуля выберите все контексты исполнения (тонкий клиент, веб-клиент, сервер) и повторите проверку. Ошибка проявится в том контексте, где переменная или общий модуль недоступны.