В процессе разработки и сопровождения конфигураций на платформе 1С:Предприятие 8.3 часто возникает ситуация, когда необходимо полностью изменить логику работы конкретного общего модуля. Ситуация осложняется, если модуль является «закрытым» — то есть при попытке его открытия конфигуратор выдает сообщение «Исходный текст модуля отсутствует». В этой статье мы разберем, как с помощью механизма расширений полностью подменить логику такого модуля и нужно ли при этом корректировать вызовы в остальной части программы.
Начнем с главного вопроса: можно ли заменить общий модуль ABC другим модулем EF_01_ABC так, чтобы платформа автоматически перенаправляла вызовы? Ответ — да, это возможно. Механизм расширений в 1С спроектирован таким образом, что он позволяет перехватывать выполнение процедур и функций на уровне таблицы имен платформы. Если в расширении объявлен метод с аннотацией &Вместо, платформа при обращении к оригинальному методу в первую очередь передает управление в расширение.
При этом менять обращения в коде всей конфигурации (например, с ABC.Метод() на EF_01_ABC.Метод()) не требуется. Платформа сделает это автоматически на этапе компиляции кода в памяти.
Рассмотрим подробнее, как работает перехват. Когда мы заимствуем модуль в расширение и создаем в нем процедуру-дублер, мы используем специальную аннотацию. Это позволяет нам полностью игнорировать оригинальный алгоритм.
Проанализируем пример реализации в расширении:
&Вместо("ИмяОригинальнойПроцедуры")
Процедура EF_01_ИмяОригинальнойПроцедуры(Параметр1, Параметр2)
// Здесь пишем абсолютно новый код
Сообщить("Работает логика из расширения!");
// Оригинальный код модуля вызван не будет
КонецПроцедуры
Важно понимать, что если вы не вызываете внутри своей процедуры команду ПродолжитьВызов(), то оригинальный код (даже если он скрыт) никогда не исполнится. Это и есть «полная замена» функционала.
Основная сложность возникает, когда текст модуля скрыт. Вы не видите имен процедур, количества их параметров и логики внутри. Выясним, как действовать в такой ситуации, чтобы создать корректную «заглушку» в расширении. В некоторых случаях для глубокого анализа структуры файлов поставки может потребоваться распаковщик конфигураций В8АнПак, который позволяет работать с форматами cf и cfe на низком уровне.
Шаг 1. Определение сигнатуры методов.
Поскольку мы не видим исходник, нам нужно восстановить структуру экспортных методов. Разберем основные способы:
ИмяМодуля.. Чтобы автоматизировать этот процесс, можно использовать специализированный поиск вызовов общих модулей в коде. Анализируя вызовы, мы можем понять, сколько параметров передается в ту или иную функцию.ИмяМодуля.ИмяФункции( — система может подсказать количество и даже имена параметров.Шаг 2. Создание расширения.
Добавляем новый модуль в расширение. Важно: имя самого модуля в расширении может быть любым, но в аннотации &Вместо должно быть указано точное имя функции из оригинального модуля ABC.
Шаг 3. Реализация параметров.
Проанализируем ситуацию с параметрами. Если оригинальная функция принимает три параметра, ваша функция в расширении обязана принимать такое же количество. Если вы ошибетесь в количестве аргументов, программа завершится с ошибкой во время выполнения (Runtime error).
Рассмотрим нюанс, упомянутый опытными разработчиками: если скрытый модуль имеет свойство Глобальный. В этом случае обращение к его методам происходит без указания имени модуля (просто ИмяПроцедуры()). Для таких модулей замена через &Вместо также работает, однако нужно быть предельно внимательным с именами, чтобы не возникло конфликтов в глобальном пространстве имен.
Если по каким-то причинам стандартный перехват не срабатывает (что бывает крайне редко на новых версиях платформы), существует «обходной путь»: создание неглобального модуля в расширении с теми же именами функций. Но в этом случае, как правильно заметили на форуме, придется менять вызовы по всей базе, что крайне нежелательно.
Разберем ситуации, когда замена может не сработать или вызвать проблемы:
Экспорт. Внутренние процедуры закрытого модуля останутся недоступными. Чтобы заранее выявить такие зависимости, рекомендуется провести статический анализ кода проекта.ТаблицуЗначений или Структуру, ваш новый код в расширении должен делать то же самое, иначе остальная конфигурация «сломается», ожидая измененных данных.EF_. Фирма 1С использует его для официальных патчей (исправлений). Если вы планируете внедрять изменения именно таким способом, вам может пригодиться конвертер расширения конфигурации в патч.Выясним причину, по которой декомпиляция или замена закрытых модулей считается допустимой. Согласно законодательству, лицо, правомерно владеющее экземпляром программы, вправе изучать и преобразовывать объектный код в исходный текст, если это необходимо для достижения способности к взаимодействию с другими программами или для исправления явных ошибок, которые мешают нормальной эксплуатации продукта.
Мы выяснили, что механизм расширений является мощным инструментом «чистого» изменения логики системы. Для полной замены закрытого модуля нам необходимо:
&Вместо, полностью повторяя сигнатуру (количество параметров).Таким образом, полная замена общего модуля возможна, она легальна в рамках исправления ошибок и не требует трудоемкого изменения кода во всех объектах конфигурации.