Как посмотреть программный код модуля, который находится в макете 1С?

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

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

Разберем суть механизма: зачем код прячут в макеты?

Чаще всего такой подход используют разработчики универсальных решений (например, модули электронного документооборота Диадок, банковские модули обмена ВТБ или Сбербанк). Проанализируем основные причины использования этой технологии:

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

Выясним, как код обращается к таким макетам

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


Процедура МетодСервера()
    // Получаем двоичные данные из макета
    ДанныеМакета = ЭтотОбъект.ПолучитьМакет("ВспомогательныйМодуль");
    
    // Формируем путь во временном каталоге
    ПутьКФайлу = КаталогВременныхФайлов() + "InternalModule.epf";
    
    // Записываем данные на диск
    ДанныеМакета.Записать(ПутьКФайлу);
    
    // Подключаем внешнюю обработку программно
    ВнешняяОбработкаОбъект = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
    
    // Вызываем экспортный метод из модуля скрытой обработки
    ВнешняяОбработкаОбъект.ВыполнитьДействие();
КонецПроцедуры

В данном примере мы видим, что объект ВнешниеОбработки используется для динамического создания объекта из файла, который только что был извлечен из макета ВспомогательныйМодуль. Это и есть та самая «матрешка», о которой шла речь в обсуждении.

Как извлечь модуль для анализа: пошаговая инструкция

Если вам необходимо изучить алгоритм, зашитый в макет, выполните следующие шаги. Рассмотрим наиболее простые и эффективные способы.

Способ 1: Использование временных файлов

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

  1. Запустите 1С:Предприятие в режиме отладки.
  2. Откройте интересующую вас внешнюю обработку.
  3. Выполните действие, которое инициирует обращение к скрытой логике (например, нажмите кнопку «Выгрузить» или «Сформировать»).
  4. Не закрывая программу, перейдите в каталог временных файлов пользователя. В Windows это обычно путь: %TEMP%.
  5. Отсортируйте файлы по дате изменения. Ищите файлы с расширением .epf или .erf с именами, похожими на те, что встречаются в коде (например, v8_2D34_5.epf).
  6. Скопируйте этот файл в отдельную папку и откройте его через Конфигуратор. Теперь вам доступен весь программный код модуля этой обработки.

Способ 2: Принудительное сохранение через код

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


МакетСКодом = ЭтотОбъект.ПолучитьМакет("ИмяВашегоМакета");
ПутьДляСохранения = "C:\Debug\ExtractedModule.epf";
МакетСКодом.Записать(ПутьДляСохранения);
Сообщить("Файл успешно извлечен в: " + ПутьДляСохранения);

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

Как отлаживать код внутри извлеченного модуля?

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

  1. Откройте извлеченную обработку в Конфигураторе.
  2. Установите точку останова в нужном месте кода.
  3. Убедитесь, что в настройках отладки включена Отладка внешних обработок.
  4. В основной обработке найдите место, где вызывается ВнешниеОбработки.Создать(). Если путь к файлу там формируется динамически (с использованием случайных имен), измените код так, чтобы он всегда обращался к вашему извлеченному файлу (например, C:\Debug\ExtractedModule.epf).
  5. Запустите процесс. Когда основная программа обратится к файлу по вашему пути, 1С распознает его как открытый в Конфигураторе, и отладка сработает.

Другие типы макетов, содержащие логику

Не только Двоичные данные могут содержать исполняемый код. Рассмотрим альтернативные варианты, которые также могут встретиться в сложных конфигурациях:

  1. Текстовый макет. Иногда разработчики хранят в макете чистый текст кода. В основном модуле он считывается функцией Макет.ПолучитьТекст() и запускается через оператор Выполнить(ТекстМакета). Чтобы посмотреть такой код, достаточно просто открыть макет в Конфигураторе.
  2. Макет оформления (XSLT). Используется при преобразовании XML-данных. Внутри XSLT-схем могут содержаться скрипты на языке JavaScript или VBScript, которые выполняются в процессе трансформации.
  3. HTML-документ. В макетах типа HTML может находиться сложная логика на JavaScript, которая взаимодействует с 1С через механизм onhelp или специфические события форм.

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

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

← На главную