При разработке сложных систем, особенно универсальных модулей логирования, перед программистом часто встает задача: как автоматически определить, из какого метода (процедуры или функции) был произведен вызов? В языках вроде C++ или Python существуют встроенные макросы или инструменты рефлексии (например, __FUNCTION__). В платформе 1С:Предприятие прямого аналога "из коробки", возвращающего строку с именем текущего метода, не существует. Однако сообщество разработчиков выработало несколько эффективных стратегий решения этой задачи.
В этой статье мы подробно разберем все доступные способы — от самых простых и производительных до технически сложных и автоматизированных.
Проанализируем самый очевидный подход, который упоминается в обсуждениях. Это ручная передача имени процедуры в качестве параметра в вызываемый модуль логирования. Несмотря на кажущуюся примитивность, этот метод остается самым надежным и быстрым с точки зрения производительности платформы.
Рассмотрим пример реализации:
Процедура РассчитатьНалоги(Данные)
ИмяМетода = "РассчитатьНалоги";
ЛогированиеКлиентСервер.ЗаписатьЛог(ИмяМетода, "Начало расчета");
// Основной код процедуры
КонецПроцедуры
Преимущества этого метода:
Основным минусом является "человеческий фактор": при копировании кода из одной процедуры в другую легко забыть поменять строку с именем, что приведет к путанице в логах.
Выясним, существует ли способ обойти ручной ввод. Единственный технический механизм в 1С, позволяющий "заглянуть" в текущий контекст выполнения программно — это работа с объектом ИнформацияОбОшибке. Этот метод основан на том, что при возникновении ошибки платформа формирует стек вызовов, в котором указаны все процедуры, активные в данный момент.
Разберем алгоритм по шагам:
Попытка...Исключение.ИнформацияОбОшибке() для получения подробностей.Рассмотрим пример функции, которая возвращает имя вызвавшего ее метода:
Функция ИмяТекущегоМетода() Экспорт
Попытка
// Генерируем ошибку
ВызватьИсключение "ОпределяемСтек";
Исключение
Информация = ИнформацияОбОшибке();
// Получаем строку стека, где указано место ошибки
ТекстОшибки = Информация.Описание;
ПодробноеОписание = ПодробноеПредставлениеОшибки(Информация);
// Здесь необходимо реализовать парсинг строки.
// Обычно строка выглядит так: "имя_модуля, строка 15: имя_процедуры"
Возврат ВычленитьИмяМетодаИзСтека(ПодробноеОписание);
КонецПопытки;
КонецФункции
Важное предостережение: Генерация исключения — это крайне ресурсоемкая операция для платформы 1С. Мы не рекомендуем использовать этот метод в циклах, при проведении документов или в высоконагруженных участках кода. Это замедлит работу системы в десятки раз.
Если ваша конфигурация построена на базе Библиотеки стандартных подсистем (БСП), нам не нужно изобретать велосипед для парсинга текста ошибок. Разберем, какие инструменты нам предоставляют разработчики фирмы 1С.
В общем модуле ОбщегоНазначенияКлиентСервер (или аналогичных в зависимости от версии БСП) часто присутствуют функции для работы со строками и анализа системной информации. Например, функция ПодробноеПредставлениеОшибки() возвращает структурированный текст. Проанализируем типичную структуру такого текста:
{ОбщийМодуль.НалогиЛогика.Модуль(45)}: Ошибка при вызове метода контекста...
Используя встроенные функции поиска подстроки (СтрНайти, Лев, Прав), можно создать универсальный механизм в вашем модуле логирования, который будет автоматически отсекать лишнее и оставлять только НалогиЛогика.Рассчитать.
Проанализируем ситуацию: если программный метод слишком медленный, а ручной — неудобный, как упростить жизнь программисту? Рассмотрим использование функционала Конфигуратора 1С — "Шаблоны текста".
Вы можете создать шаблон, который будет автоматически вставлять вызов процедуры логирования с уже заполненным именем. Посмотрим, как это настроить:
Хотя это не является полной автоматизацией "в рантайме", это значительно ускоряет разработку и снижает количество опечаток при написании кода.
Обратим внимание на важный нюанс. В современных версиях платформы 1С формат представления стека вызовов стал более детальным. При написании собственного парсера для метода с "искусственным исключением" обязательно протестируйте его работу на разных версиях платформы. Строка, возвращаемая ПодробноеПредставлениеОшибки(), может содержать дополнительные сведения о расширениях или фоновых заданиях, что может сбить настройки вашего парсера.
Проанализировав все доступные варианты, мы можем сделать следующие выводы:
Таким образом, несмотря на отсутствие системной переменной ЭтотМетод, разработчик 1С обладает достаточным арсеналом средств для реализации качественного и информативного логирования в своих прикладных решениях.