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