Можно ли расширением полностью заменить общий модуль 1С (включая закрытые модули)?

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

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

Теоретическая возможность замены

Начнем с главного вопроса: можно ли заменить общий модуль ABC другим модулем EF_01_ABC так, чтобы платформа автоматически перенаправляла вызовы? Ответ — да, это возможно. Механизм расширений в 1С спроектирован таким образом, что он позволяет перехватывать выполнение процедур и функций на уровне таблицы имен платформы. Если в расширении объявлен метод с аннотацией &Вместо, платформа при обращении к оригинальному методу в первую очередь передает управление в расширение.

При этом менять обращения в коде всей конфигурации (например, с ABC.Метод() на EF_01_ABC.Метод()) не требуется. Платформа сделает это автоматически на этапе компиляции кода в памяти.

Разбор механизма аннотации &Вместо

Рассмотрим подробнее, как работает перехват. Когда мы заимствуем модуль в расширение и создаем в нем процедуру-дублер, мы используем специальную аннотацию. Это позволяет нам полностью игнорировать оригинальный алгоритм.

Проанализируем пример реализации в расширении:


&Вместо("ИмяОригинальнойПроцедуры")
Процедура EF_01_ИмяОригинальнойПроцедуры(Параметр1, Параметр2)
    // Здесь пишем абсолютно новый код
    Сообщить("Работает логика из расширения!");
    // Оригинальный код модуля вызван не будет
КонецПроцедуры

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

Как работать с закрытыми модулями (без исходного кода)

Основная сложность возникает, когда текст модуля скрыт. Вы не видите имен процедур, количества их параметров и логики внутри. Выясним, как действовать в такой ситуации, чтобы создать корректную «заглушку» в расширении. В некоторых случаях для глубокого анализа структуры файлов поставки может потребоваться распаковщик конфигураций В8АнПак, который позволяет работать с форматами cf и cfe на низком уровне.

Шаг 1. Определение сигнатуры методов.
Поскольку мы не видим исходник, нам нужно восстановить структуру экспортных методов. Разберем основные способы:

  1. Глобальный поиск по конфигурации: Ищем все вхождения строки ИмяМодуля.. Чтобы автоматизировать этот процесс, можно использовать специализированный поиск вызовов общих модулей в коде. Анализируя вызовы, мы можем понять, сколько параметров передается в ту или иную функцию.
  2. Контекстная подсказка: Несмотря на отсутствие текста, платформа часто хранит метаданные об экспортных методах. Попробуйте в любом открытом модуле начать набирать ИмяМодуля.ИмяФункции( — система может подсказать количество и даже имена параметров.
  3. Замер производительности: Если вызвать штатную функцию, которая обращается к скрытому модулю, в результатах замера производительности отобразятся имена вызываемых методов этого модуля.

Шаг 2. Создание расширения.
Добавляем новый модуль в расширение. Важно: имя самого модуля в расширении может быть любым, но в аннотации &Вместо должно быть указано точное имя функции из оригинального модуля ABC.

Шаг 3. Реализация параметров.
Проанализируем ситуацию с параметрами. Если оригинальная функция принимает три параметра, ваша функция в расширении обязана принимать такое же количество. Если вы ошибетесь в количестве аргументов, программа завершится с ошибкой во время выполнения (Runtime error).

Особенности работы с глобальными модулями

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

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

Технические ограничения и риски

Разберем ситуации, когда замена может не сработать или вызвать проблемы:

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

Правовой аспект (Статья 1280 ГК РФ)

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

Итоги

Мы выяснили, что механизм расширений является мощным инструментом «чистого» изменения логики системы. Для полной замены закрытого модуля нам необходимо:

Таким образом, полная замена общего модуля возможна, она легальна в рамках исправления ошибок и не требует трудоемкого изменения кода во всех объектах конфигурации.

← На главную