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