Как программно получить список экспортных процедур и функций объекта с параметрами

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

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

Метод 1. Использование специализированных внешних компонент (Native API)

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

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

  1. Загружаем внешнюю компоненту в сеанс с помощью команды УстановитьВнешнююКомпоненту.
  2. Создаем объект компоненты, который будет выступать в роли «анализатора».
  3. Передаем в метод компоненты ссылку на интересующий нас объект (например, обработку или менеджер справочника).
  4. Получаем коллекцию (массив или таблицу значений), содержащую имена методов, их тип (процедура или функция) и массив параметров.

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

Метод 2. Программная выгрузка конфигурации и использование регулярных выражений

Если нам нужно получить список методов не «сию секунду», а в рамках какой-то регламентной задачи или при подготовке справочника функций, мы можем воспользоваться штатной возможностью платформы по выгрузке исходных кодов в текстовые файлы. Начиная с версии 8.3.3, это можно сделать полностью программно.

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


КомандаЗапуска = """C:\Program Files\1cv8\common\1cestart.exe"" DESIGNER /F ""ПутьКБазе"" /N ""Логин"" /P ""Пароль"" /DumpConfigToFiles ""C:\Temp\ConfigDump""";
ЗапуститьПриложение(КомандаЗапуска, , Истина);

После завершения выгрузки все модули будут доступны в формате .bsl. Теперь применим силу регулярных выражений (RegExp) для извлечения нужной нам информации. Рассмотрим пример кода на встроенном языке 1С, который использует объект VBScript.RegExp для поиска экспортных методов:


РегВыражение = Новый COMОбъект("VBScript.RegExp");
РегВыражение.IgnoreCase = Истина;
РегВыражение.Global = Истина;
РегВыражение.MultiLine = Истина;

// Паттерн для поиска: ищем Процедура/Функция, имя и параметры до слова Экспорт
РегВыражение.Pattern = "(?i)(?:процедура|функция)\s+(\w+)\s*\((.*?)\)\s*экспорт";

ТекстМодуля = ЧтениеТекста.Прочитать(); // Читаем файл .bsl
Результаты = РегВыражение.Execute(ТекстМодуля);

Для Каждого Матч Из Результаты Цикл
    ИмяМетода = Матч.SubMatches(0);
    Параметры = Матч.SubMatches(1);
    Сообщить("Найден метод: " + ИмяМетода + " с параметрами: " + Параметры);
КонецЦикла;

Этот способ является наиболее «чистым» с точки зрения лицензионной политики и стабильности, так как мы работаем с обычными текстовыми данными.

Метод 3. Анализ кода через OneScript (oScript)

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

Посмотрим на логику работы через OneScript. Существует библиотека gitsync или отдельные парсеры модулей, которые превращают текст .bsl в объектное дерево (AST). В этом дереве каждый метод представлен отдельным объектом, у которого есть свойства:

Мы можем написать небольшой скрипт на OneScript, который обойдет все файлы выгруженной конфигурации и сформирует JSON-файл со всеми сигнатурами методов. Впоследствии этот JSON легко прочитать в основной базе 1С и использовать для динамического вызова через Выполнить() или Вычислить().

Метод 4. Использование среды разработки EDT (Enterprise Development Tools)

Проанализируем ситуацию, когда разработка ведется в 1C:EDT. Поскольку EDT базируется на платформе Eclipse, она строит глубокий индекс всего проекта. Это означает, что информация обо всех методах уже есть в служебных структурах проекта Java.

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

Метод 5. Регистрация интерфейса через механизмы БСП

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

Посмотрим, как это устроено. Вместо того чтобы пытаться «взломать» модуль и вычитать его функции, разработчик в менеджерском модуле объекта описывает экспортные методы в специальной процедуре (например, ПриОпределенииКомандПодключенныхКОбъекту или аналогичных). Этот подход требует дисциплины программиста, но он абсолютно прозрачен и не зависит от технических ограничений платформы.

Выводы и рекомендации

Подведем итог нашему анализу. Выбор метода зависит от контекста вашей задачи:

  1. Если вам нужно получить список методов «на лету» в пользовательском режиме — используйте проверенные внешние компоненты, но будьте готовы к их обновлению при смене платформы.
  2. Если ваша цель — автоматизация разработки или построение карты системы — лучшим выбором будет выгрузка файлов конфигурации и их анализ с помощью регулярных выражений или OneScript.
  3. Если вы проектируете систему с нуля — закладывайте явную регистрацию доступных методов в специальных функциях, как это сделано в БСП.

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

← На главную