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