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