Как вызвать функцию или процедуру в 1С по её строковому имени

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

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

Использование встроенных операторов Выполнить и Вычислить

Самый прямой способ выполнить произвольный код, представленный в виде строки, — это использование встроенных функций платформы Выполнить() и Вычислить(). Разберем разницу между ними и правила их применения.

Оператор Вычислить (Eval) используется для вычисления выражения, которое возвращает результат. Чаще всего он применяется для вызова функций. Проанализируем пример кода:


// Предположим, у нас есть имя функции в переменной
ИмяФункции = "МояСуперФункция";
Параметр = 10;

// Формируем строку вызова и получаем результат
Результат = Вычислить(ИмяФункции + "(" + Параметр + ")");

Оператор Выполнить (Execute) предназначен для выполнения полноценных фрагментов кода или процедур, которые не возвращают значения. Важно помнить, что Выполнить() не возвращает результат напрямую в переменную через знак равенства в основном коде.

Рассмотрим пример вызова процедуры:


ИмяПроцедуры = "ОбработатьДанные";
Команда = ИмяПроцедуры + "(Контекст)";
Выполнить(Команда);

Решение проблемы видимости переменных

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

Для решения этой задачи выясним причину: оператор должен видеть переменную в текущем контексте. Рассмотрим правильный подход:


// Сначала инициализируем переменную в текущем контексте
РезультатВыполнения = Неопределено;

// Теперь вызываем динамический код, который присваивает значение этой переменной
ИмяМетода = "РассчитатьСумму";
Выполнить("РезультатВыполнения = " + ИмяМетода + "()");

// Теперь переменная РезультатВыполнения содержит данные
Сообщить(РезультатВыполнения);

Практический пример: Динамический вызов по имени страницы

Проанализируем реальный сценарий из практики. Допустим, у нас есть форма с несколькими страницами (вкладками). При нажатии на общую кнопку "Выполнить" должна запускаться процедура, соответствующая текущей открытой вкладке. Чтобы не писать бесконечные конструкции Если... ИначеЕсли, мы можем использовать динамический вызов.

Разберем, как это реализовать:

  1. Определим имя текущей страницы на форме.
  2. Сформируем имя серверной процедуры на основе имени страницы.
  3. Вызовем процедуру через Выполнить().

&НаСервере
Процедура КоманднаяПанельВыполнить(Команда)
    // Извлекаем имя текущей страницы
    ИмяСтраницы = Элементы.ГруппаСтраницы.ТекущаяСтраница.Имя;
    
    // Формируем имя метода, например, "Обработать_Склад"
    ИмяПроцедуры = "Обработать_" + ИмяСтраницы;
    
    // Вызываем метод
    Попытка
        Выполнить(ИмяПроцедуры + "()");
    Исключение
        Сообщить("Метод " + ИмяПроцедуры + " не реализован!");
    КонецПопытки;
КонецПроцедуры

Современные методы БСП

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

Например, метод ВыполнитьМетодКонфигурации позволяет вызвать процедуру или функцию, передав её имя и массив параметров. Это избавляет от необходимости вручную склеивать строки и следить за кавычками.

Альтернатива: Использование объектов-интерфейсов

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

Мы можем создать несколько обработок, в каждой из которых есть процедура с одинаковым именем, например, ВыполнитьДействие(). Передавая в основную процедуру саму обработку (объект), мы вызываем метод напрямую:


Процедура Сделать(ОбъектАлгоритма)
    // Здесь мы не используем Выполнить, а вызываем известный метод переданного объекта
    ОбъектАлгоритма.ВыполнитьДействие();
КонецПроцедуры

Важные ограничения и рекомендации

При использовании динамических вызовов необходимо учитывать следующие особенности платформы:

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

← На главную