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

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

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

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

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

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

Использование директивы &Вместо и ПродолжитьВызов()

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


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

Как работать с результатами выполнения функций

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

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

Работа с макетами в расширениях

Для того чтобы вывести собственные данные, вам потребуется макет. Рассмотрим важные аспекты работы с методом ПолучитьМакет():

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

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

← На главную