При работе с крупными конфигурациями, такими как ERP Управление предприятием 2.0, часто возникает необходимость кастомизации типовых печатных форм. Типовой механизм расширений позволяет вносить изменения, не снимая основную конфигурацию с поддержки. Однако начинающие разработчики часто сталкиваются с технической сложностью: при попытке просто скопировать код из основной конфигурации в модуль расширения система выдает ошибку, сообщающую, что процедуры или функции с таким именем уже определены. Разберем детально, как правильно модифицировать код в расширении, какие инструменты для этого предоставляет платформа 1С:Предприятие 8.3 и какие нюансы следует учитывать при работе с ERP.
Прежде чем переходить к практике, выясним причину проблемы. Модуль расширения не является самостоятельным изолированным объектом; он дополняет существующий модуль основной конфигурации. Когда мы просто копируем текст процедуры из основной программы в расширение, платформа видит два идентичных идентификатора в одном пространстве имен. В языке 1С запрещено объявление двух процедур с одинаковыми именами в рамках одного модуля. Для решения этой задачи используются специальные аннотации (директивы компиляции), которые указывают платформе, как именно нужно поступить с кодом: выполнить его до основной процедуры, после нее или полностью заменить оригинал.
Рассмотрим самый надежный и быстрый способ добавления методов в расширение. Вместо ручного копирования текста кода, воспользуемся встроенными функциями контекстного меню Конфигуратора. Это гарантирует правильное создание заголовка функции с нужной аннотацией.
Пошаговый алгоритм действий:
ПечатьАктОбОказанииУслуг).После этого платформа автоматически создаст в модуле расширения пустую «заготовку» метода с соответствующим префиксом и аннотацией. Только после этого внутрь созданной конструкции можно переносить логику из оригинала для последующей правки.
Проанализируем ситуацию: какой тип перехвата выбрать? Выбор аннотации определяет стабильность работы расширения при будущих обновлениях ERP.
Аннотация &Перед (&Before):
Используется, когда нам нужно выполнить какие-то действия до начала работы основного кода. Например, инициализировать дополнительные переменные или проверить условия, при которых выполнение основной логики должно быть прервано (через исключение).
Аннотация &После (&After):
Код расширения выполнится сразу после завершения основной процедуры. Это идеально подходит для модификации уже сформированных данных. Например, если типовой код сформировал таблицу значений для печати, а нам нужно добавить в нее колонку с данными из дополнительных реквизитов.
Аннотация &Вместо (&Around):
Полностью замещает типовой метод. Это самый радикальный способ. Рассмотрим пример кода, который может появиться в расширении:
&Вместо("СформироватьПечатнуюФорму")
Процедура Расш1_СформироватьПечатнуюФорму(ПараметрыПечати, Объекты)
// Наш измененный код
// Мы можем полностью переписать логику формирования акта
КонецПроцедуры
Важно помнить, что внутри аннотации &Вместо мы можем вызвать оригинальный код, используя команду ПродолжитьВызов(). Это позволяет добавить свою логику «вокруг» типовой, сохранив возможность выполнения оригинального кода без его полного копирования.
В современных версиях платформы (8.3.15 и выше) доступна аннотация &ВместоСКонтролем. Разберем по шагам, зачем она нужна. При обычном &Вместо, если фирма «1С» изменит типовой код в обновлении ERP, ваше расширение продолжит работать по-старому, что может привести к скрытым ошибкам или потере важных данных. Аннотация &ВместоСКонтролем заставляет платформу сравнивать текст исходного метода с тем, который был на момент создания расширения. Если тексты различаются, система выдаст предупреждение при компиляции, что позволит вовремя адаптировать расширение под новый релиз конфигурации.
Проанализируем специфику печати актов в ERP. Большинство печатных форм реализовано через механизмы Библиотеки стандартных подсистем (БСП). Простого изменения макета в расширении часто бывает недостаточно. Выясним причину: данные для печати собираются в сложных запросах, которые могут находиться в общих модулях или функциях формирования данных модуля менеджера.
При модификации печати в ERP следует:
СформироватьСтруктуруДанных или аналогичная.Рассмотрим пример добавления поля в запрос через расширение:
&Вместо("ПодготовитьДанныеДляПечатиАкта")
Функция Расш1_ПодготовитьДанныеДляПечатиАкта(МассивОбъектов)
// Вызываем оригинальный метод для получения базовой структуры
СтруктураДанных = ПродолжитьВызов(МассивОбъектов);
// Дополняем запрос или результат своими данными
Для Каждого СтрокаДанных Из СтруктураДанных.РезультатТаблица Цикл
СтрокаДанных.НовоеПоле = "Значение из расширения";
КонецЦикла;
Возврат СтруктураДанных;
КонецФункции
После внесения изменений в расширение крайне важно убедиться, что выполняется именно ваш код. Посмотрим на несколько советов по отладке:
Таким образом, правильный путь модификации обработки — это не копирование текста модуля, а использование штатных механизмов интеграции методов в расширение с последующим выбором подходящей стратегии перехвата (&Вместо или &После). Это обеспечит чистоту кода и минимизирует проблемы при поддержке информационной системы.