Как правильно распределить код между формой и модулем объекта в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Почему важно разделять код

Прежде чем мы перейдем к техническим деталям, проанализируем ситуацию, зачем вообще нужно это разделение. Рассмотрим основные причины:

  1. Клиент-серверное взаимодействие: Код в модуле управляемой формы часто выполняется на клиенте (в интерфейсе), а модуль объекта всегда выполняется на сервере. Вынос тяжелых операций (формирование писем, расчеты) в модуль объекта оптимизирует работу системы.
  2. Доступность без формы: Если код отправки письма находится в форме, вы не сможете вызвать его, например, из регламентного задания или из другой обработки, не открывая окно пользователю. Код в модуле объекта доступен всегда, когда создан экземпляр этого объекта.
  3. Типизация и структура: Модуль объекта предназначен для описания логики самой сущности (обработки или документа), а модуль формы — для управления элементами управления (кнопками, списками, цветами).

Проблема 1: Как передать переменные формы в модуль объекта

Рассмотрим ситуацию: у вас на форме есть поля Период и МинимальнаяСумма. Вы перенесли код формирования письма в модуль объекта и обнаружили, что эти переменные там «не видны». Это логично, так как модуль объекта не имеет прямого доступа к контексту формы. Выясним, как это исправить.

Способ А: Использование параметров процедуры

Это самый простой и правильный путь, если данные нужны только для выполнения конкретного действия. Мы модифицируем процедуру в модуле объекта так, чтобы она принимала данные «снаружи».

В модуле объекта напишем следующее:


Процедура СформироватьИОтправитьПисьмо(Знач ПериодПисьма, Знач ПороговаяСумма) Экспорт
    // Теперь переменные ПериодПисьма и ПороговаяСумма доступны внутри
    ТекстТела = "Отчет за период: " + ПериодПисьма;
    Если Сумма > ПороговаяСумма Тогда
        // Логика отправки
    КонецЕсли;
КонецПроцедуры

Обратите внимание на ключевое слово Экспорт — без него процедуру нельзя будет вызвать из модуля формы.

Способ Б: Реквизиты объекта вместо реквизитов формы

Если данные (период, сумма) являются неотъемлемой частью логики обработки, их лучше создать не в редакторе формы (вкладка «Реквизиты» формы), а в самом объекте конфигурации (в дереве метаданных внешней обработки). Рассмотрим, что это дает:

  1. Реквизиты объекта доступны в форме через префикс Объект.ИмяРеквизита.
  2. Реквизиты объекта напрямую доступны в модуле объекта через ЭтотОбъект.ИмяРеквизита или просто по имени.

В этом случае в модуле объекта код будет выглядеть так:


Процедура СформироватьИОтправитьПисьмо() Экспорт
    // Используем реквизиты, созданные в дереве метаданных обработки
    ТекстТела = "Отчет за период: " + Период; 
    // Период — это реквизит самой обработки
КонецПроцедуры

Проблема 2: Как вызвать процедуру модуля объекта из формы

Теперь разберем механизм вызова. В управляемом приложении мы не можем просто написать имя процедуры модуля объекта в коде формы. Нам нужно выполнить преобразование данных формы в объектный вид на стороне сервера.

Проанализируем шаги, которые необходимо выполнить в модуле формы:

  1. Создаем на форме команду (кнопку).
  2. В обработчике команды вызываем серверную процедуру.
  3. В серверной процедуре получаем объект из реквизита формы Объект.

Пример кода в модуле управляемой формы:


&НаКлиенте
Процедура КомандаОтправить(Команда)
    ОтправитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ОтправитьНаСервере()
    // 1. Преобразуем данные формы в реальный объект обработки
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    
    // 2. Вызываем экспортный метод модуля объекта
    // Если мы пошли по пути параметров:
    ОбъектОбработки.СформироватьИОтправитьПисьмо(Объект.Период, Объект.МинимальнаяСумма);
    
    // 3. Если в модуле объекта данные были изменены и их нужно вернуть на форму:
    // ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");
КонецПроцедуры

Использование метода РеквизитФормыВЗначение создает временный экземпляр объекта в памяти сервера, заполняет его текущими данными из полей формы и позволяет обращаться ко всем методам модуля объекта.

Автоматизация проверок: событие ОбработкаПроверкиЗаполнения

Разберем еще один важный момент, упомянутый в обсуждении: проверку заполненности полей. Вместо того чтобы писать в форме длинные конструкции Если ЗначениеЗаполнено(Поле) = Ложь Тогда..., в 1С предусмотрен стандартный механизм.

Посмотрим, как это работает по шагам:

  1. В дереве метаданных у нужного реквизита объекта установим свойство Проверка заполнения в значение Выдавать ошибку.
  2. В модуле объекта создадим обработчик события ОбработкаПроверкиЗаполнения.
  3. Система сама подчеркнет красным пустые поля и выдаст сообщение пользователю при вызове метода ПроверитьЗаполнение().

Пример программного вызова проверки из модуля формы:


&НаСервере
Функция ПроверитьДанныеНаСервере()
    ОбъектОбработки = РеквизитФормыВЗначение("Объект");
    // Метод возвращает Истина, если все обязательные поля заполнены
    Возврат ОбъектОбработки.ПроверитьЗаполнение(); 
КонецФункции

Подведем итоги

Для эффективного распределения кода мы должны следовать следующим правилам:

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

Во-вторых, использовать параметры процедур для передачи уникальных данных из формы или переносить важные переменные в реквизиты объекта метаданных.

В-третьих, в модуле формы использовать связку &НаСервере и РеквизитФормыВЗначение для обращения к методам объекта.

Такой подход делает ваш код профессиональным, понятным и защищенным от ошибок, связанных с контекстом выполнения.

← На главную