Как программно определить имя текущей функции или процедуры в 1С?

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При разработке сложных систем, особенно универсальных модулей логирования, перед программистом часто встает задача: как автоматически определить, из какого метода (процедуры или функции) был произведен вызов? В языках вроде C++ или Python существуют встроенные макросы или инструменты рефлексии (например, __FUNCTION__). В платформе 1С:Предприятие прямого аналога "из коробки", возвращающего строку с именем текущего метода, не существует. Однако сообщество разработчиков выработало несколько эффективных стратегий решения этой задачи.

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

Способ 1. Явное указание имени (Статический метод)

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

Рассмотрим пример реализации:


Процедура РассчитатьНалоги(Данные)
    ИмяМетода = "РассчитатьНалоги";
    ЛогированиеКлиентСервер.ЗаписатьЛог(ИмяМетода, "Начало расчета");
    
    // Основной код процедуры
    
КонецПроцедуры

Преимущества этого метода:

  1. Высокая скорость: Платформа не тратит ресурсы на анализ программного стека.
  2. Читаемость: Любой разработчик, открыв код, сразу видит, какая информация передается в лог.
  3. Гибкость: Вы можете передать не только чистое имя функции, но и уточняющую информацию, например, "МодульОбъекта.ПередЗаписью".

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

Способ 2. Искусственное исключение и анализ стека вызовов

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

Разберем алгоритм по шагам:

  1. Намеренно вызываем исключительную ситуацию (например, деление на ноль или обращение к несуществующему методу).
  2. Перехватываем ошибку в блоке Попытка...Исключение.
  3. Используем функцию ИнформацияОбОшибке() для получения подробностей.
  4. Парсим полученную строку, чтобы вычленить название последнего метода.

Рассмотрим пример функции, которая возвращает имя вызвавшего ее метода:


Функция ИмяТекущегоМетода() Экспорт
    Попытка
        // Генерируем ошибку
        ВызватьИсключение "ОпределяемСтек";
    Исключение
        Информация = ИнформацияОбОшибке();
        // Получаем строку стека, где указано место ошибки
        ТекстОшибки = Информация.Описание; 
        ПодробноеОписание = ПодробноеПредставлениеОшибки(Информация);
        
        // Здесь необходимо реализовать парсинг строки.
        // Обычно строка выглядит так: "имя_модуля, строка 15: имя_процедуры"
        Возврат ВычленитьИмяМетодаИзСтека(ПодробноеОписание);
    КонецПопытки;
КонецФункции

Важное предостережение: Генерация исключения — это крайне ресурсоемкая операция для платформы 1С. Мы не рекомендуем использовать этот метод в циклах, при проведении документов или в высоконагруженных участках кода. Это замедлит работу системы в десятки раз.

Способ 3. Использование инструментов БСП

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

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

{ОбщийМодуль.НалогиЛогика.Модуль(45)}: Ошибка при вызове метода контекста...

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

Способ 4. Шаблоны текста (Сниппеты) как компромисс

Проанализируем ситуацию: если программный метод слишком медленный, а ручной — неудобный, как упростить жизнь программисту? Рассмотрим использование функционала Конфигуратора 1С — "Шаблоны текста".

Вы можете создать шаблон, который будет автоматически вставлять вызов процедуры логирования с уже заполненным именем. Посмотрим, как это настроить:

  1. Откройте меню "Сервис" — "Шаблоны текста".
  2. Создайте новый шаблон с кодом (например, "лог").
  3. В тексте шаблона укажите конструкцию, которая будет требовать ввода имени или вставлять стандартную заглушку.

Хотя это не является полной автоматизацией "в рантайме", это значительно ускоряет разработку и снижает количество опечаток при написании кода.

Особенности работы в версии 8.3.21 и выше

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

Рекомендации по выбору решения

Проанализировав все доступные варианты, мы можем сделать следующие выводы:

Таким образом, несмотря на отсутствие системной переменной ЭтотМетод, разработчик 1С обладает достаточным арсеналом средств для реализации качественного и информативного логирования в своих прикладных решениях.

← На главную