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

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

Как получить имя переменной в 1С

Почему в 1С нельзя напрямую получить имя переменной и как решить задачу: отладчик, метаданные, структуры, СообщитьПользователю и обходные приёмы для разработчика.

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

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

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

Почему в 1С нельзя получить имя переменной напрямую

Встроенный язык 1С компилируется во внутреннее представление, и обратной связи «значение → имя переменной» в рантайме не существует. У одной переменной может быть несколько имён-ссылок, а одно имя в разных процедурах указывает на разные значения, поэтому платформа просто не хранит такого соответствия для исполняемого кода.

Это осознанное ограничение, а не недоработка. В языках вроде C# оператор nameof() работает на этапе компиляции и подставляет строковый литерал. В 1С аналогичную роль выполняет сам разработчик: если имя нужно в логике программы, его передают в код явно, строкой.

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

Как посмотреть имена и значения переменных в отладчике

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

Просмотр переменных в отладчике
  1. 1
    Поставьте точку останова (F9) на нужной строке модуля
  2. 2
    Запустите отладку (F5) и дождитесь остановки
  3. 3
    Откройте меню Отладка → Локальные переменные — увидите все имена и значения текущей процедуры
  4. 4
    Для произвольного выражения используйте Отладка → Вычислить выражение (Shift+F9)
  5. 5
    Чтобы наблюдать переменную при движении по коду, добавьте её в табло (Отладка → Табло)

Окно «Локальные переменные» показывает имена всех переменных текущего контекста вместе с типами и значениями. Табло позволяет закрепить отдельные переменные и отслеживать их изменение при пошаговом выполнении (F10, F11).

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

Как вывести имя переменной в сообщение или журнал

Самая частая практическая задача — записать в лог что-то вроде «Контрагент = ООО Ромашка». Поскольку имя программно не извлекается, его передают строкой вместе со значением. Это не костыль, а принятый в 1С-разработке шаблон.

bsl
Процедура ЗаписатьВЛог(ИмяПеременной, Значение)
    ЗаписьЖурналаРегистрации("Отладка", УровеньЖурналаРегистрации.Информация,,,
        ИмяПеременной + " = " + Строка(Значение));
КонецПроцедуры

// Вызов:
ЗаписатьВЛог("Контрагент", Контрагент);

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

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

Для разовой диагностики подойдёт и СообщитьПользователю с аналогичной конкатенацией. Для постоянного логирования предпочтительнее журнал регистрации — он не прерывает работу пользователя и сохраняется централизованно.

Как получить имя объекта метаданных, реквизита или колонки

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

bsl
// Имя объекта метаданных по ссылке
ИмяОбъекта = Ссылка.Метаданные().Имя; // например, "РеализацияТоваровУслуг"

// Имена реквизитов объекта
Для Каждого Реквизит Из Ссылка.Метаданные().Реквизиты Цикл
    Сообщить(Реквизит.Имя);
КонецЦикла;

// Имена колонок таблицы значений
Для Каждого Колонка Из ТаблицаЗначений.Колонки Цикл
    Сообщить(Колонка.Имя);
КонецЦикла;

// Ключи структуры
Для Каждого КлючЗначение Из СтруктураДанных Цикл
    Сообщить(КлючЗначение.Ключ);
КонецЦикла;

Метод Метаданные() доступен у ссылок, объектов, записей регистров и многих других типов. Через него получают не только имя, но и синоним, представление, состав реквизитов и табличных частей.

Для структур и соответствий имена «полей» — это ключи, и они перебираются циклом Для Каждого. Если нужно проверить существование конкретного ключа, используйте метод Свойство() у структуры: СтруктураДанных.Свойство("Сумма", НайденноеЗначение).

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

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

Вызов Ссылка.Метаданные().Имя
Норма

Возвращает строку с именем объекта из конфигуратора

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

Ошибка «Метод объекта не обнаружен» — значит, у типа нет метаданных (например, это число или строка)

Перебор Структура.Свойство()
Норма

Возвращает Истина и заполняет значение для существующего ключа

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

Всегда возвращает Ложь — проверьте регистр и точное написание ключа

Как определить тип переменной и представление значения

Рядом с задачей об имени часто стоит задача о типе: понять, что вообще лежит в переменной. Для этого есть штатные средства — функция ТипЗнч() и оператор Тип(), которые возвращают тип значения, а не его имя.

bsl
ТипЗначения = ТипЗнч(Переменная);
Сообщить(ТипЗначения); // например, "СправочникСсылка.Контрагенты"

Если ТипЗнч(Переменная) = Тип("Строка") Тогда
    // работаем как со строкой
КонецЕсли;

Строковое представление значения даёт функция Строка() или неявное преобразование при конкатенации. Для ссылочных объектов это обычно представление (наименование, номер и дата документа), а не имя переменной — не путайте эти понятия при построении сообщений.

Комбинация ТипЗнч() и Метаданные().Имя закрывает большинство диагностических сценариев: первый показывает тип, второй — имя объекта конфигурации для ссылочных типов.

Обходные приёмы, когда имя нужно в логике программы

Иногда имя требуется не для отладки, а как часть алгоритма: например, сопоставить переменные полям внешнего файла или построить универсальный сериализатор. Здесь работают несколько подходов.

Сравнение подходов

Структура вместо набора переменных

Ключи структуры — это и есть имена, доступные программно. Подходит для передачи именованных наборов данных между процедурами

Явная передача имени строкой

Просто и надёжно для логирования, но требует дисциплины: при переименовании переменной строку нужно править вручную

Метаданные и реквизиты

Правильный путь для объектов конфигурации; не работает для локальных переменных модуля

Текст модуля через конфигуратор

Парсинг исходного кода — крайняя мера для инструментальных разработок, не для прикладного кода

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

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

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

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

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

Есть ли в 1С аналог nameof() из C#?

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

Как узнать имена всех переменных процедуры без отладчика?

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

Как получить имя документа или справочника по ссылке?

Вызовите у ссылки метод Метаданные() и прочитайте свойство Имя: Ссылка.Метаданные().Имя. Для пользовательского представления используйте свойство Синоним или функцию Строка() от самой ссылки.

Можно ли обратиться к переменной по имени, хранящемуся в строке?

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

Как вывести в журнал регистрации, какая переменная содержит ошибочное значение?

Передайте имя строкой вместе со значением в общую процедуру логирования, например: ЗаписатьВЛог("СуммаДокумента", СуммаДокумента). Дополнительно полезно фиксировать тип через ТипЗнч() и место вызова — это ускоряет поиск причины.

Итог

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

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