В процессе разработки или доработки типовых и отраслевых конфигураций 1С на обычных формах программисты часто сталкиваются с загадочной ситуацией: в коде присутствует явный вызов процедуры, например, ПолучитьЦеныНоменклатурыПоАкции, глобальный поиск по конфигурации находит десятки мест её использования, но при попытке перейти к определению (клавиша F12) или найти само тело процедуры поиск не дает результатов. Давайте вместе разберем, почему так происходит, куда исчезает программный код и как работать в подобных условиях.
Проанализируем типичную ситуацию. Вы открываете общий модуль, в котором, судя по логике, должна находиться искомая процедура, но вместо строк кода видите пустое окно или лаконичный комментарий: «Модуль не содержит исходного текста». Это не ошибка платформы и не сбой конфигурации. Мы имеем дело с закрытым (защищенным) модулем.
Рассмотрим, почему это реализовано именно так. Разработчики отраслевых решений (например, компании «1С-Рарус» или «IT-Trend») защищают свои интеллектуальные наработки. При сборке дистрибутива конфигурации для конечного пользователя применяется процедура удаления исходного кода. Платформа 1С сохраняет возможность исполнять этот код (так как внутри остается скомпилированный байт-код), но прочитать его человеческим глазом в конфигураторе невозможно.
Посмотрим на примеры конфигураций, где скрытие логики является стандартом поставки. Чаще всего это решения на базе «1С:Розница 8», такие как:
В этих программах сложные механизмы, такие как расчет маркетинговых акций, бонусных баллов или специфика учета лекарственных средств, выносятся в модули типа МенеджерОтраслевыхРешений или специальные защищенные общие модули. Искомая вами процедура ПолучитьЦеныНоменклатурыПоАкции — классический пример функции, логика которой скрыта в «коробочном» решении для обеспечения лицензионного контроля.
Проанализируем техническую сторону вопроса. Существует два основных способа, которыми разработчики скрывают код:
.cf или .cfu) снимается галочка «Исходный текст». В результате в конфигурации остаются только заголовки экспортных процедур и функций, чтобы другие части системы могли к ним обращаться, но само «тело» отсутствует..dll), которые подключаются динамически. Процедура в 1С выступает лишь «оберткой», которая передает параметры внешней библиотеке. Именно поэтому при отсутствии ключа защиты или лицензии такие процедуры могут выдавать ошибку или возвращать пустые значения.Поскольку мы не можем прочитать алгоритм напрямую, нам необходимо использовать методы «черного ящика». Рассмотрим по шагам, как понять, что делает процедура ПолучитьЦеныНоменклатурыПоАкции, не видя её текста.
Шаг 1: Анализ входных и выходных данных через отладчик.
Посмотрим на типичный вызов процедуры:
ПолучитьЦеныНоменклатурыПоАкции(МенеджерВременныхТаблиц, "ТаблицаТоваров", ПараметрыРасчета);
Для понимания логики нам нужно поставить точку останова ДО вызова процедуры и ПОСЛЕ него. Воспользуемся табло отладчика:
ТаблицаТоваров (или временной таблицы в менеджере).МенеджерВременныхТаблиц?Шаг 2: Использование замера производительности.
Запустите «Замер производительности» в конфигураторе и выполните действие в пользовательском режиме, которое вызывает скрытую процедуру. В отчете замера вы увидите строку с вашей процедурой. Хотя войти в неё не получится, вы сможете увидеть:
Шаг 3: Изучение документации и макетов.
Часто в отраслевых конфигурациях логика закрытых модулей опирается на настройки, хранящиеся в справочниках или макетах. Посмотрите справочники «Скидки (наценки)», «Маркетинговые акции» или настройки параметров учета. Логика кода обычно строго следует этим настройкам.
Выясним правовой и технический аспекты этого вопроса. Существуют инструменты для декомпиляции байт-кода 1С, однако мы крайне не рекомендуем их использовать по следующим причинам:
DLL, декомпиляция модулей 1С ничего не даст.Если вы столкнулись с процедурой, которой «нигде нет», — это признак профессионального отраслевого решения с механизмами защиты. Не пытайтесь найти её текст в конфигураторе. Вместо этого сосредоточьтесь на анализе изменения данных в отладчике. Понимание того, что приходит «на вход» и что получается «на выходе», в 90% случаев достаточно для успешной интеграции или поиска ошибок в работе системы.