Как правильно изменить код обработки в расширении 1С и избежать ошибки дублирования имен

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

При работе с крупными конфигурациями, такими как ERP Управление предприятием 2.0, часто возникает необходимость кастомизации типовых печатных форм. Типовой механизм расширений позволяет вносить изменения, не снимая основную конфигурацию с поддержки. Однако начинающие разработчики часто сталкиваются с технической сложностью: при попытке просто скопировать код из основной конфигурации в модуль расширения система выдает ошибку, сообщающую, что процедуры или функции с таким именем уже определены. Разберем детально, как правильно модифицировать код в расширении, какие инструменты для этого предоставляет платформа 1С:Предприятие 8.3 и какие нюансы следует учитывать при работе с ERP.

Причина возникновения ошибки «процедуры и функции с таким именем уже определены»

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

Инструменты конфигуратора для добавления кода в расширение

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

Пошаговый алгоритм действий:

  1. Откроем основную конфигурацию и найдем нужный объект (в нашем примере это обработка ПечатьАктОбОказанииУслуг).
  2. Добавим саму обработку в расширение (правой кнопкой мыши по объекту — «Добавить в расширение»).
  3. Перейдем в модуль менеджера (или модуль объекта) основной конфигурации.
  4. Найдем процедуру или функцию, логику которой необходимо изменить.
  5. Нажмем правой кнопкой мыши на заголовок метода (на само название процедуры).
  6. В появившемся меню выберем пункт «Добавить в расширение...».
  7. В открывшемся окне выберем тип вызова (аннотацию).

После этого платформа автоматически создаст в модуле расширения пустую «заготовку» метода с соответствующим префиксом и аннотацией. Только после этого внутрь созданной конструкции можно переносить логику из оригинала для последующей правки.

Выбор типа аннотации: &Перед, &После, &Вместо

Проанализируем ситуацию: какой тип перехвата выбрать? Выбор аннотации определяет стабильность работы расширения при будущих обновлениях ERP.

Аннотация &Перед (&Before):
Используется, когда нам нужно выполнить какие-то действия до начала работы основного кода. Например, инициализировать дополнительные переменные или проверить условия, при которых выполнение основной логики должно быть прервано (через исключение).

Аннотация &После (&After):
Код расширения выполнится сразу после завершения основной процедуры. Это идеально подходит для модификации уже сформированных данных. Например, если типовой код сформировал таблицу значений для печати, а нам нужно добавить в нее колонку с данными из дополнительных реквизитов.

Аннотация &Вместо (&Around):
Полностью замещает типовой метод. Это самый радикальный способ. Рассмотрим пример кода, который может появиться в расширении:


&Вместо("СформироватьПечатнуюФорму")
Процедура Расш1_СформироватьПечатнуюФорму(ПараметрыПечати, Объекты)
    // Наш измененный код
    // Мы можем полностью переписать логику формирования акта
КонецПроцедуры

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

Использование «Вместо с контролем»

В современных версиях платформы (8.3.15 и выше) доступна аннотация &ВместоСКонтролем. Разберем по шагам, зачем она нужна. При обычном &Вместо, если фирма «1С» изменит типовой код в обновлении ERP, ваше расширение продолжит работать по-старому, что может привести к скрытым ошибкам или потере важных данных. Аннотация &ВместоСКонтролем заставляет платформу сравнивать текст исходного метода с тем, который был на момент создания расширения. Если тексты различаются, система выдаст предупреждение при компиляции, что позволит вовремя адаптировать расширение под новый релиз конфигурации.

Особенности работы с ERP 2.0 и БСП

Проанализируем специфику печати актов в ERP. Большинство печатных форм реализовано через механизмы Библиотеки стандартных подсистем (БСП). Простого изменения макета в расширении часто бывает недостаточно. Выясним причину: данные для печати собираются в сложных запросах, которые могут находиться в общих модулях или функциях формирования данных модуля менеджера.

При модификации печати в ERP следует:

  1. Проверить, откуда берутся данные. Часто это функция СформироватьСтруктуруДанных или аналогичная.
  2. Если в макет добавлены новые поля (параметры), необходимо перехватить процедуру формирования запроса и добавить в него выборку этих полей.
  3. Учитывать область видимости. Если в расширение переносится код, вызывающий неэкспортные (приватные) процедуры основного модуля, эти процедуры также придется добавить в расширение, иначе возникнет ошибка времени выполнения.

Рассмотрим пример добавления поля в запрос через расширение:


&Вместо("ПодготовитьДанныеДляПечатиАкта")
Функция Расш1_ПодготовитьДанныеДляПечатиАкта(МассивОбъектов)
    // Вызываем оригинальный метод для получения базовой структуры
    СтруктураДанных = ПродолжитьВызов(МассивОбъектов);
    
    // Дополняем запрос или результат своими данными
    Для Каждого СтрокаДанных Из СтруктураДанных.РезультатТаблица Цикл
        СтрокаДанных.НовоеПоле = "Значение из расширения";
    КонецЦикла;
    
    Возврат СтруктураДанных;
КонецФункции

Рекомендации по отладке

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

  1. Всегда проверяйте флаг «Активно» в списке расширений.
  2. Используйте точки останова внутри процедур с аннотациями. Если точка останова не срабатывает, возможно, нарушена сигнатура метода (количество или имена параметров должны строго совпадать с оригиналом).
  3. Помните про режим совместимости. Некоторые возможности расширений (например, работа с определенными типами метаданных) зависят от версии режима совместимости, установленной в свойствах самого расширения.

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

← На главную