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