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