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