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

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

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

Анализ архитектурного подхода

Автор вопроса предложил использовать механизм ПриСозданииНаСервере в расширении общего модуля ПодключаемыеКоманды. Это правильный путь, так как использование встроенных «точек входа» типовых конфигураций позволяет охватить максимум форм одним кодом. Однако важно учитывать ограничения: не во всех типовых формах присутствуют нужные вызовы ПодключаемыеКоманды или СобытияФорм. В таких случаях подход требует комбинирования.

Шаг 1: Централизация логики через общие модули

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


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

КонецПроцедуры

Процедура ДобавитьЭлементыФормы(Форма)
    НовыйЭлемент = Форма.Элементы.Добавить("МойНовыйРеквизит", Тип("ПолеФормы"), Форма.Элементы.ГруппаКоманд);
    НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
    // ... дальнейшая настройка
КонецПроцедуры

Шаг 2: Работа с обработчиками событий

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

Для обхода этого ограничения используем механизм «прокси-процедур»:

  1. В модуле формы (которую мы все же добавили в расширение) создаем простую процедуру-заглушку.
  2. В этой процедуре вызываем метод нашего общего модуля, передавая туда необходимые параметры (ЭтаФорма, Элемент).
  3. В общем модуле выполняем всю основную бизнес-логику.

// В модуле формы (в расширении)
&НаКлиенте
Процедура Расш_МойРеквизитПриИзменении(Элемент)
    МойОбщийМодульКлиент.ОбработкаИзмененияРеквизита(ЭтотОбъект, Элемент);
КонецПроцедуры

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

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

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

← На главную