Почему не работает переход по F12 к описанию процедуры в 1С и как найти закрытый код

Программист 1С v8.3 (Обычные формы)
← На главную

При работе с отраслевыми решениями на платформе «1С:Предприятие 8» (например, линейками «ДАЛИОН» или «Трактиръ» от разработчика «СофтБаланс») программисты часто сталкиваются с ситуацией, когда невозможно быстро перейти к определению функции или процедуры. Вы нажимаете клавишу F12, но система никак не реагирует, а глобальный поиск выдает только места вызова этой процедуры, но не ее объявление.

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

Выясняем причину: почему не работает переход по F12?

Основная причина, по которой Конфигуратор 1С не позволяет «провалиться» в процедуру при нажатии F12, заключается в использовании механизма «Поставки конфигурации без исходных текстов».

При сборке коммерческих тиражных решений разработчики скрывают исходный код ключевых модулей для защиты своей интеллектуальной собственности и предотвращения несанкционированного изменения логики программы (особенно в модулях интеграции с государственными системами, такими как ЕГАИС, «Честный ЗНАК» или «Меркурий»).

Давайте проанализируем, как это работает на уровне платформы:

  1. Компиляция в p-код: При сохранении конфигурации без исходных текстов платформа компилирует программный код модулей в промежуточный байт-код (p-код).
  2. Удаление исходного текста: Сам читаемый текст модулей (листинг программы) физически удаляется из файлов базы данных.
  3. Выполнение платформой: Платформа 1С успешно выполняет скомпилированный p-код при запуске программы пользователем, но Конфигуратор не может отобразить исходный текст разработчику, так как его просто нет в системе. Соответственно, переход по F12 становится невозможным.

Загадка глобального поиска: почему нет имени общего модуля?

Второй важный вопрос, который возникает у разработчиков при анализе подобных строк кода:


СписокПодчиненныхДокументов = ЕГАИС_ИнвентаризацияАлкогольнойПродукцииЗаполнитьСписокПодчиненныхДокументов(ЭтотОбъект, ПараметрыРучныхКорректировок);

Обратите внимание, что в коде вызывается функция ЕГАИС_ИнвентаризацияАлкогольнойПродукцииЗаполнитьСписокПодчиненныхДокументов напрямую, без указания имени какого-либо общего модуля (например, нет конструкции вида ИмяОбщегоМодуля.ИмяПроцедуры). При этом глобальный поиск по конфигурации находит только вызовы данной функции в открытых модулях объектов, но не само её объявление.

Разберем эту ситуацию по шагам:

Как проанализировать структуру закрытого модуля («Черный ящик»)?

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

Метод 1. Выгрузка конфигурации в файлы

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

  1. В Конфигураторе выберите меню Конфигурация -> Выгрузить конфигурацию в файлы....
  2. Укажите пустую папку на диске и дождитесь окончания процесса выгрузки.
  3. После завершения выгрузки откройте папку и выполните текстовый поиск по файлам (например, с помощью Notepad++ или VS Code) по имени интересующей вас процедуры: ЕГАИС_ИнвентаризацияАлкогольнойПродукцииЗаполнитьСписокПодчиненныхДокументов.

В результате вы найдете XML-файл описания метаданных закрытого общего модуля. В нем не будет тела самой функции, но платформа сохраняет объявления методов и их параметры, что позволит вам увидеть точную структуру сигнатуры функции.

Метод 2. Анализ замера производительности и отладки

Давайте выясним, как ведет себя закрытый модуль при замере производительности и отладке в платформе 1С:

Что делать, если нужно изменить логику закрытой процедуры?

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

  1. Расширения конфигурации: Вы можете создать расширение конфигурации и использовать аннотации &Перед, &После или &Вместо для перехвата вызова защищенного метода. Даже если исходный код метода закрыт, платформа позволяет переопределять его вызовы через механизмы расширений, если метод является экспортным.
  2. Подписки на события: Если закрытый метод выполняет запись документов или справочников, вы можете использовать подписки на события (например, «ПередЗаписью» или «ПриЗаписи»), чтобы скорректировать данные до или сразу после работы закрытого алгоритма.
  3. Анализ возвращаемых данных: Зачастую закрытые функции возвращают структуру или таблицу значений. Вы можете написать внешнюю обработку-обертку, которая будет вызывать защищенную функцию, анализировать возвращаемый результат в открытом коде и модифицировать его под ваши бизнес-требования.
← На главную