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