«Переменная не определена» в 1С: причины и как исправить
В коде используется имя, которое в этом месте модуля не объявлено и ничем не инициализировано. Ошибка обычно обнаруживается при компиляции модуля, поэтому модуль не запускается целиком.
Текст ошибки
Причины
- Опечатка в имени переменной, в том числе латинская буква вместо русской
- Переменная объявлена в другой процедуре и в текущей не видна
- Переменная модуля формы объявлена с директивой &НаКлиенте, а используется в серверной процедуре
- Обращение к реквизиту формы или объекта без Объект. или ЭтотОбъект.
- Используется имя общего модуля или метаданных, которого нет в конфигурации
- Код вставлен из другой конфигурации или из внешней обработки
Как работает область видимости
Переменная, которой впервые присвоено значение внутри процедуры, локальна для этой процедуры. Переменные модуля объявляются через Перем в начале модуля и видны всем его процедурам. Но в модуле управляемой формы важна директива: клиентская переменная модуля не видна в серверных процедурах, и наоборот.
&НаКлиенте
Перем КэшНастроек;
&НаСервере
Процедура ЗаполнитьНаСервере()
// Ошибка: переменная объявлена для клиента
// Если КэшНастроек = Неопределено Тогда ...
КонецПроцедуры
Данные, нужные и на клиенте, и на сервере, храните в реквизите формы или передавайте параметром серверной процедуры.
Пошаговое исправление
- Посмотрите имя в скобках и строку в тексте ошибки. Выполните синтаксический контроль модуля (в конфигураторе кнопка на панели модуля или Ctrl+F7), чтобы увидеть все такие места сразу.
- Проверьте раскладку: латинская «C» или «o» в русском слове выглядят одинаково, но для платформы это другое имя. Наберите имя заново.
- Если это реквизит объекта в модуле формы, обращайтесь через основной реквизит:
Объект.Организация. - Если это имя общего модуля, убедитесь, что модуль существует и компилируется в нужном контексте. Серверный общий модуль без флага «Вызов сервера» не виден в клиентском коде.
- Если переменная должна быть доступна в нескольких процедурах, объявите её в начале модуля через
Перемили передавайте параметром.
Переменные в Выполнить() и Вычислить()
Код, выполняемый через Выполнить(), видит локальные переменные процедуры, в которой вызван. Если строка кода формируется в одном месте, а выполняется в другом, нужные переменные могут оказаться недоступны. В этом случае передавайте данные через структуру с понятными ключами.
Для пользователя
Если сообщение появляется при открытии внешней обработки или отчёта, файл несовместим с вашей конфигурацией или повреждён. Возьмите версию, подготовленную для вашего релиза. Если ошибка появилась в типовой конфигурации после доработок, обратитесь к тому, кто вносил изменения.
Частые вопросы
Чем «Переменная не определена» отличается от значения Неопределено?
Неопределено — нормальное значение переменной, которая существует. «Переменная не определена» означает, что такого имени в этом месте кода нет вообще.
Почему падает весь модуль, а не одна строка?
Модуль компилируется целиком перед выполнением. Если компиляция не прошла, не работает ни одна его процедура.