Как вызвать процедуру модуля объекта плана видов расчета из управляемой формы 1С?

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

Разбор ситуации и ключевые правила

В управляемом приложении 1С объекты типа ПланВидовРасчетаОбъект существуют только на стороне сервера (и в толстом клиенте). На клиентской стороне управляемой формы может храниться только ссылка на элемент — ПланВидовРасчетаСсылка. Из-за этого напрямую обратиться к процедуре модуля объекта с клиента невозможно.

Рассмотрим основные условия, которые должны выполняться для успешного вызова процедуры из модуля объекта:

  1. Вызов процедуры должен происходить в серверном контексте управляемой формы (директива &НаСервере или &НаСервереБезКонтекста).
  2. Вызываемая процедура или функция в модуле объекта обязательно должна быть объявлена с ключевым словом Экспорт.
  3. В серверном коде необходимо получить объект базы данных по ссылке с помощью метода ПолучитьОбъект() или создать новый объект через менеджер.

Шаг 1. Объявление процедуры в модуле объекта

Перейдем в модуль объекта нашего плана видов расчета и убедимся, что процедура доступна для внешнего вызова. Обязательно укажем ключевое слово Экспорт:


// Модуль объекта Плана видов расчета
Процедура МояЭкспортнаяПроцедура(Параметр1) Экспорт
    
    // Алгоритм обработки данных объекта
    
КонецПроцедуры

Шаг 2. Вызов процедуры из модуля управляемой формы

В модуле управляемой формы (например, формы документа или другого объекта) создадим серверную процедуру. Передадим в нее ссылку на нужный вид расчета, получим объект с помощью метода ПолучитьОбъект() и вызовем экспортную процедуру.

Проанализируем пример кода:


&НаСервереБезКонтекста
Процедура ВызватьПроцедуруОбъектаНаСервере(СсылкаНаВидРасчета)
    
    Если ЗначениеЗаполнено(СсылкаНаВидРасчета) Тогда
        // Получаем объект базы данных по ссылке
        ОбъектВидаРасчета = СсылкаНаВидРасчета.ПолучитьОбъект();
        
        Если ОбъектВидаРасчета <> Неопределено Тогда
            // Вызываем экспортную процедуру модуля объекта
            ОбъектВидаРасчета.МояЭкспортнаяПроцедура("ЗначениеПараметра");
            
            // Если процедура изменяла реквизиты объекта, сохраняем изменения
            // ОбъектВидаРасчета.Записать();
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры

Разберем по шагам, что происходит в данном фрагменте. Для оптимизации вызова используется директива &НаСервереБезКонтекста, которая исключает передачу всей формы на сервер. Ссылка на вид расчета передается в процедуру в качестве параметра. Метод ПолучитьОбъект() считывает данные элемента из базы и возвращает экземпляр объекта, у которого становится доступна экспортная процедура.

Важно: Если вызванная процедура меняет реквизиты или табличные части элемента, эти изменения останутся только в оперативной памяти сервера. Чтобы сохранить их в базе данных, необходимо явно вызвать метод Записать().

Создание нового элемента плана видов расчета

Если задача состоит в том, чтобы вызвать процедуру для еще не записанного вида расчета, объект создается через менеджер с помощью метода СоздатьВидРасчета():


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

Альтернативное решение: Использование модуля менеджера

Выясним причину, почему получение объекта не всегда является лучшим решением. Если вызываемый алгоритм выполняет вычисления или получение данных, но не модифицирует сам объект вида расчета, чтение объекта через ПолучитьОбъект() создаст лишнюю нагрузку на сервер и СУБД.

В таких сценариях рекомендуется выносить служебную логику в Модуль менеджера плана видов расчета:

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

Рассмотрим пример вызова процедуры из модуля менеджера:


// Вызов экспортной процедуры модуля менеджера
ПланыВидовРасчета.ОсновныеНачисления.РассчитатьДополнительныеДанные(СсылкаНаВидРасчета);

Этот подход экономит ресурсы сервера и ускоряет выполнение серверных операций в управляемом приложении.

← На главную