При работе с устаревшими конфигурациями или решениями на базе обычного приложения (например, Астор: Торговый дом 7 или УПП) часто возникает задача расширения функционала без снятия объектов с поддержки. Основная сложность заключается в том, что механизмы расширений в 1С 8.3 полноценно работают с управляемыми формами, в то время как визуальное редактирование обычных форм в расширениях ограничено или невозможно. Рассмотрим подробнее несколько проверенных способов решения этой задачи.
Это самый современный и «чистый» метод для платформы 8.3. Несмотря на то, что мы не можем визуально «дорисовать» кнопку на стандартной обычной форме внутри расширения, платформа позволяет полностью заменить форму объекта на свою.
Проанализируем последовательность действий:
ФормаДокументаСвоя.ФормаДокументаСвоя в качестве Основной формы.Важный нюанс: Этот метод позволяет сохранить типовой объект «на замочке» в основной конфигурации. Однако при обновлении типового решения, если логика основной формы изменится, нам потребуется вручную перенести эти изменения в нашу форму в расширении.
Если мы не хотим полностью дублировать форму, можно попытаться внедрить кнопку программно. Выясним причину, почему это сложно сделать напрямую: обычные формы не всегда позволяют перехватить событие ПриОткрытии через расширение так, чтобы корректно манипулировать ЭлементыФормы.
Тем не менее, мы можем использовать следующий алгоритм:
Найдем в модуле обычной формы вызов какой-либо процедуры общего модуля (например, проверки прав или инициализации параметров), которая вызывается при открытии. Затем в расширении создадим &После для этой процедуры общего модуля.
Рассмотрим пример кода, который может быть размещен в расширении для программного создания кнопки:
&После("ПроцедураИнициализацииВОбщемМодуле")
Процедура Расш1_ПроцедураИнициализацииВОбщемМодуле(Форма)
// Проверяем, что это нужная нам форма
Если Форма.ИмяФормы = "Документ.РеализацияТоваровУслуг.Форма.ФормаДокумента" Тогда
НоваяКнопка = Форма.ЭлементыФормы.Добавить(Тип("Кнопка"), "КнопкаДопДействие", Истина, Форма.ПанельОсновная);
НоваяКнопка.Заголовок = "Дополнительное действие";
НоваяКнопка.Верх = 10;
НоваяКнопка.Лево = 10;
НоваяКнопка.Ширина = 150;
// Назначаем действие программно
ДействиеКнопки = Новый Действие("ПодключеннаяПроцедураНажатия");
НоваяКнопка.УстановитьДействие("Нажатие", ДействиеКнопки);
КонецЕсли;
КонецПроцедуры
Обратите внимание, что обработчик ПодключеннаяПроцедураНажатия должен физически существовать в модуле формы. Поскольку мы не можем менять модуль формы без снятия с поддержки, этот метод часто комбинируется с использованием внешних обработок.
Во многих конфигурациях (включая семейство «Астор» и «УПП») встроен механизм подключения внешних обработок. Разберем, как это помогает нам добавить «кнопку», не меняя форму.
Если в форме документа есть стандартная кнопка «Заполнить» или подменю «Действия», платформа часто динамически подтягивает туда список внешних обработок из справочника «Внешние обработки» (или «Дополнительные отчеты и обработки»).
Посмотрим на алгоритм реализации:
.epf).ВыполнитьНажатие или Инициализировать, в зависимости от требований конфигурации).В этом случае кнопка появится в выпадающем списке меню «Заполнить», что является абсолютно штатным и безопасным способом доработки системы.
В конфигурации «Торговый дом 7» существуют свои особенности. Проанализируем упоминание справочника «Имена печатных форм». В данной системе механизм печати может быть использован как универсальный «слот» для выполнения произвольного кода.
Хак с внешней печатной формой:
Вы можете создать внешнюю печатную форму, которая вместо вывода табличного документа на экран будет выполнять нужное действие (например, загрузку данных из Excel). В конце выполнения кода достаточно установить Отказ = Истина в процедуре печати, чтобы не открывалось пустое окно предпросмотра. Таким образом, пользователь нажимает кнопку «Печать» -> выбирает вашу обработку, и действие выполняется без изменения дизайна формы.
Выбор метода зависит от строгости ограничений:
Помните, что работа с обычными формами требует внимательного отношения к координатам элементов при программном добавлении, так как в отличие от управляемых форм, здесь используется абсолютное позиционирование (в пикселях).