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

Программист 1С:Управление торговлей IT и автоматизация бизнеса
← На главную

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

Архитектурные ограничения платформы

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

Разберем подробнее, что именно недоступно:

  1. Захват модуля формы: Вы не сможете добавить в расширение модуль обычной формы и использовать аннотации &Перед, &После или &Вместо для типовых обработчиков событий (например, ПриОткрытии или ПередЗаписью модуля формы).
  2. Изменение элементов формы: Визуальный редактор расширений не поддерживает добавление новых кнопок, полей или изменение свойств существующих элементов на обычных формах.
  3. События формы: Платформа не "пробрасывает" вызовы событий обычных форм в механизм расширений, даже если версия платформы 8.3.9 и выше.

Режим совместимости — фундамент работы

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

Варианты обхода ограничений (Workarounds)

Несмотря на запрет прямого расширения форм, мы можем реализовать логику "чистого кода" (без изменений в основной конфигурации) несколькими альтернативными способами.

Метод 1: Использование общих модулей как посредников

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

Рассмотрим пример. Допустим, в форме есть вызов некоторой типовой процедуры:


// В модуле обычной формы
Процедура ПриОткрытии()
    // ... типовой код ...
    РаботаСДиалогами.УстановитьДоступностьПолей(ЭтаФорма);
КонецПроцедуры

В этом случае мы можем создать расширение для общего модуля РаботаСДиалогами и перехватить процедуру:


&После("УстановитьДоступностьПолей")
Процедура Расш1_УстановитьДоступностьПолей(Форма)
    // Проверяем, что это нужная нам форма
    Если Форма.ИмяФормы = "Документ.РеализацияТоваровУслуг.ФормаДокумента" Тогда
        Если Не РольДоступна("ПолныеПрава") Тогда
            Форма.ЭлементыФормы.КнопкаПровести.Доступность = Ложь;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Это позволит программно управлять элементами обычной формы, не меняя её код напрямую.

Метод 2: Подписки на события в расширении

Если ваша задача связана не с визуальным отображением, а с логикой данных (например, запрет изменения определенных реквизитов), используйте Подписки на события. В расширении можно создавать свои подписки на события объектов (Справочников, Документов), такие как ПередЗаписью или ПриУстановкеНовогоНомера.

Проанализируем ситуацию: нам нужно запретить запись документа определенным пользователям. Создаем в расширении процедуру-обработчик:


Процедура Расш1_ПередЗаписьюДокумента(Источник, Отказ, РежимЗаписи, РежимПроведения) Экспорт
    Если ТипЗнч(Источник) = Тип("ДокументОбъект.РеализацияТоваровУслуг") Тогда
        Если Источник.СуммаДокумента > 100000 И Не РольДоступна("Директор") Тогда
            ОбщегоНазначения.СообщитьОбОшибке("Недостаточно прав для проведения крупной сделки!");
            Отказ = Истина;
        КонецЕсли;
    КонецЕсли;
КонецПроцедуры

Такой подход полностью удовлетворяет требованию "ноль изменений в конфигурации поставщика".

Метод 3: Использование событий Модуля Объекта

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

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

Метод 4: Создание "заглушек" (если разрешена минимальная правка)

Если "идеальная чистота" не является догмой, можно применить комбинированный метод. В модуле обычной формы вставляется одна строка — вызов общего модуля. А вся основная логика выносится в расширение этого общего модуля. Это минимизирует количество правок и упрощает будущие обновления, так как код доработки сосредоточен в расширении.

Стоит ли использовать расширения для УТ 10.3?

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

Рекомендации по выбору стратегии:

Таким образом, мы выяснили, что полноценная работа расширений с обычными формами невозможна из-за архитектурных ограничений, но гибкость платформы 8.3 позволяет решать задачи обходными путями через расширение серверной логики и использование событий объектов. Для ознакомления с практическими примерами реализации подобных решений можно использовать набор готовых расширений для исправления ошибок и доработки УТ 10.3 и других конфигураций.

← На главную