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

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

Что значит «переменная не определена» в 1С и как исправить ошибку

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

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

Сообщение обычно выглядит так: {Обработка.ИмяОбработки.Форма.Форма.Форма(42)}: Переменная не определена (МояПеременная). В скобках указывается проблемное имя, а перед двоеточием — место: конкретный модуль и номер строки. Этого достаточно, чтобы быстро локализовать проблему, если понимать, как устроены области видимости в 1С.

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

Как устроена область видимости переменных в 1С

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

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

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

Типичные причины ошибки

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

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

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

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

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

Имя не объявлено или опечатка — ищите в том же модуле

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

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

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

Сравните с типовой конфигурацией поставщика

Ошибка в одной форме из двухРазные контексты форм

Переменные одной формы недоступны в другой

Как найти проблемное место

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

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

Далее проверьте три вещи: правильно ли написано имя (сравните посимвольно с объявлением), объявлена ли переменная выше по коду или в разделе объявлений модуля, и находится ли использование в той же области видимости, что и объявление. Для поиска объявления удобно использовать контекстный поиск по модулю (Ctrl+F) с точным именем.

Порядок диагностики
  1. 1
    Прочитайте сообщение: выпишите имя переменной и номер строки
  2. 2
    Откройте модуль в конфигураторе и перейдите к строке
  3. 3
    Проверьте написание имени посимвольно
  4. 4
    Найдите объявление переменной поиском по модулю
  5. 5
    Проверьте директивы компиляции (&НаКлиенте, &НаСервере) у процедуры
  6. 6
    Если имя из общего модуля — проверьте признаки модуля и наличие Экспорт
  7. 7
    Запустите проверку конфигурации для поиска остальных ошибок

Способы исправления по сценариям

Опечатка или отсутствующее объявление

Если имя написано с ошибкой — исправьте его на корректное. Если переменная действительно нужна, но не объявлена, добавьте в начало процедуры строку Перем МояПеременная; либо инициализируйте переменную присваиванием до первого чтения. Для переменных уровня модуля объявление размещается в самом верху модуля, до первой процедуры.

Переменная другой формы или объекта

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

Вызов процедуры общего модуля

Убедитесь, что вызов записан полностью: ИмяМодуля.ИмяПроцедуры(). Проверьте, что у процедуры в общем модуле стоит слово Экспорт, а в свойствах общего модуля установлены нужные флаги доступности (сервер, клиент, внешнее соединение) и снят флаг «Приватный». Если процедура серверная, а вызывается из клиентского контекста, оформите серверную процедуру-обёртку в модуле формы с директивой &НаСервере.

Ошибка после обновления конфигурации

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

bsl
Перем СуммаИтого; // объявление до использования
СуммаИтого = 0;
Для Каждого Строка Из Товары Цикл
    СуммаИтого = СуммаИтого + Строка.Сумма;
КонецЦикла;

Как проверить, что ошибка устранена

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

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

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

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

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

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

Окно сообщений пустое

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

Снова появляется «Переменная не определена»

Запуск проблемного сценария
Норма

Операция выполняется до конца

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

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

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

Нет ошибок компиляции модулей

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

Остались аналогичные ошибки в других местах

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

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

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

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

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

Профилактика: как не сталкиваться с ошибкой

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

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

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

Итог

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

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

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

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

Такое бывает, когда проблемный код находится в ветке, которая компилируется для другого контекста: например, процедура с директивой &НаСервере обращается к имени, доступному только на клиенте. Проверка модуля в конфигураторе по умолчанию может не охватывать все варианты компиляции. Запустите полную проверку конфигурации с проверкой модулей для всех режимов.

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

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

Что делать, если неопределённое имя — это реквизит объекта?

Реквизиты объекта не являются переменными модуля. В модуле объекта к ним обращаются напрямую по имени, а в модуле формы — через основной реквизит, например Объект.Сумма. Если вы скопировали код из модуля объекта в модуль формы, добавьте обращение через соответствующий контекст.

Опасна ли эта ошибка для данных в базе?

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

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

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

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

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