Как использовать расширения для изменения обычных форм в 1С?

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

Работа с расширениями в конфигурациях на базе обычных форм (ОФ) вызывает множество вопросов у разработчиков, привыкших к гибкости управляемых форм. Прямое расширение модулей форм, к которому мы привыкли в УФ, в ОФ работает иначе или не работает вовсе. Давайте разберем, какие возможности у нас есть и как правильно подходить к доработке типового функционала без снятия конфигурации с поддержки.

Ограничения использования расширений в ОФ

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

Способ №1: Заимствование формы в расширение

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

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

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

Способ №2: Работа через общие модули

Если ваша задача — изменить логику обработки данных, которая вызывается из формы, рекомендуется использовать общие модули. Этот метод считается более «чистым» и менее подверженным ошибкам при обновлениях.

Разберем алгоритм действий:

  1. Найдите процедуру в общем модуле, которая вызывается из модуля формы (например, при нажатии кнопки или при открытии).
  2. Добавьте этот общий модуль в расширение.
  3. Используйте аннотации &Перед или &После для перехвата вызова.

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


// В расширении общего модуля
&После("ИмяПроцедурыОбработки")
Процедура ИмяПроцедурыОбработки_После(Форма, Параметр)
    // Управление видимостью или доступностью элемента
    Форма.ЭлементыФормы.НазваниеРеквизита.ТолькоПросмотр = Истина;
КонецПроцедуры

Способ №3: Использование модулей объектов

Часто разработчики пытаются манипулировать интерфейсом прямо из модуля объекта (например, документа или справочника). Важно понимать, что модуль объекта работает на сервере и «не видит» клиентскую форму напрямую. Поэтому, чтобы повлиять на интерфейс из модуля объекта, необходимо либо передавать форму как параметр в методы, либо использовать описанный выше способ с общими модулями.

Пример управления доступностью реквизита на основе прав пользователя:


// Пример логики в модуле объекта (через расширение)
Если РольДоступна("Менеджер") Тогда
    // Здесь мы можем менять данные, но не элементы формы напрямую
    ЭтотОбъект.Комментарий = "Изменено через расширение";
КонецЕсли;

Практические советы и рекомендации

Проанализируем ситуацию: стоит ли всегда использовать расширения для ОФ? Если форма крайне сложная, а количество доработок критично, иногда проще (и надежнее) изменить модуль формы в основной конфигурации, сняв её с поддержки. Однако, если задача сводится к мелким изменениям, придерживайтесь следующих правил:

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

← На главную