К статье
Практический материал

Разработка и Конфигурация · 10 мин

Как вызвать процедуру из модуля объекта обработки в 1С

Как вызвать процедуру из модуля объекта внешней обработки 1С: создание объекта через Обработки.Имя.Создать(), экспортные процедуры, вызов с сервера и клиента, типовые ошибки.

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

Механизм вызова одинаков для встроенных обработок конфигурации и для внешних файлов .epf, различается только способ получения объекта. Процедура при этом обязательно должна быть экспортной — иначе платформа выдаст ошибку «Процедура или функция с указанным именем не определена».

Ниже разобраны все практические сценарии: вызов из другого модуля конфигурации, вызов из формы, работа с внешними обработками, передача параметров, а также ограничения клиент-серверного режима и типичные ошибки с их решением.

Как устроен модуль объекта обработки и почему нельзя вызвать его напрямую

Обработка в 1С — это объект конфигурации, у которого может быть несколько модулей: модуль объекта, модуль менеджера, модули форм. Модуль объекта исполняется в контексте конкретного экземпляра обработки. Пока экземпляр не создан, кода модуля объекта для вызывающей стороны как бы не существует.

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

Правильная последовательность всегда двухшаговая: сначала Создать(), затем вызов метода через полученную переменную. Это справедливо и для толстого, и для тонкого клиента, и для сервера — различается только доступность контекста.

Базовый вызов процедуры из модуля объекта обработки

Стандартный код вызова выглядит так:

ОбъектОбработки = Обработки.ЗагрузкаДанных.Создать();

ОбъектОбработки.ЗаполнитьНастройки();

Результат = ОбъектОбработки.ВыполнитьЗагрузку(Период);

В модуле объекта обработки «ЗагрузкаДанных» соответствующие процедуры должны быть объявлены с экспортом:

Процедура ЗаполнитьНастройки() Экспорт

// код заполнения

КонецПроцедуры

Функция ВыполнитьЗагрузку(Период) Экспорт

// код загрузки

Возврат Истина;

КонецФункции

Если слово Экспорт пропущено, процедура остаётся приватной и доступна только внутри самого модуля объекта. Это самая частая причина ошибки «Процедура или функция с указанным именем не определена» при внешне корректном коде вызова.

Порядок вызова процедуры из модуля объекта
  1. 1
    Откройте модуль объекта обработки и убедитесь, что нужная процедура объявлена с ключевым словом Экспорт
  2. 2
    В вызывающем модуле создайте объект: ОбъектОбработки = Обработки.ИмяОбработки.Создать()
  3. 3
    Вызовите процедуру через переменную: ОбъектОбработки.ИмяПроцедуры(Параметры)
  4. 4
    Проверьте результат: функция вернула значение, процедура выполнила изменения без исключений

Вызов процедуры внешней обработки из файла .epf

Для внешних обработок, подключённых не к конфигурации, а хранящихся в файле, объект создаётся через менеджер ВнешниеОбработки:

ОбъектОбработки = ВнешниеОбработки.Создать("C:\Обработки\Выгрузка.epf", Ложь);

ОбъектОбработки.ВыполнитьВыгрузку(Каталог);

Второй параметр метода Создать() отвечает за безопасный режим. Значение Ложь означает выполнение без ограничений безопасного режима — используйте это осознанно и только для проверенных файлов, так как внешняя обработка получает полный доступ к данным информационной базы.

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

Вызов из модуля формы и передача самой обработки как объекта

Частая задача — вызвать процедуру модуля объекта из модуля формы той же обработки. Здесь есть нюанс: в управляемой форме реквизит Объект имеет тип ДанныеФормыСтруктура, а не объект обработки, поэтому прямой вызов Объект.МояПроцедура() не сработает.

Решение — преобразовать данные формы в объект на сервере:

&НаСервере

Процедура ВыполнитьНаСервере()

ОбъектОбработки = РеквизитФормыВЗначение("Объект");

ОбъектОбработки.ВыполнитьДействие();

ЗначениеВРеквизитФормы(ОбъектОбработки, "Объект");

КонецПроцедуры

Обратное преобразование ЗначениеВРеквизитФормы нужно, если процедура изменила реквизиты обработки и эти изменения должны отобразиться на форме. Если процедура только читает данные или работает с базой, обратное преобразование можно опустить.

Передача параметров и возврат значений

Параметры передаются в экспортные процедуры модуля объекта точно так же, как в любые другие процедуры платформы. Учитывайте два момента. Первый: если параметр объявлен с Знач, передаётся копия, и изменения внутри процедуры не вернутся наружу. Без Знач параметры передаются по ссылке, и процедура может их менять.

Второй момент касается клиент-серверного взаимодействия. Если объект обработки создаётся на сервере, а параметры приходят с клиента, все передаваемые значения должны быть сериализуемыми: примитивные типы, ссылки, структуры, массивы. Передать, например, объект ТабличныйДокумент с клиента на сервер в параметре не получится.

Функция РассчитатьИтог(ТаблицаСтрок, Знач Коэффициент) Экспорт

Итог = 0;

Для Каждого Строка Из ТаблицаСтрок Цикл

Итог = Итог + Строка.Сумма * Коэффициент;

КонецЦикла;

Возврат Итог;

КонецФункции

Ограничения и альтернативы: когда модуль объекта — не лучшее место

Не всякий код стоит вызывать через объект обработки. Если логика не зависит от состояния конкретного экземпляра (реквизитов обработки), её правильнее разместить в общем модуле — вызов станет проще и не потребует создания объекта. Создание объекта обработки — не бесплатная операция: платформа инициализирует весь контекст объекта.

Ещё одно ограничение: экспортные процедуры модуля объекта недоступны в фоновых заданиях напрямую по строковому имени метода. Для фонового выполнения обычно создают объект обработки внутри процедуры общего модуля, которую и указывают как метод фонового задания.

Где размещать вызываемый код

Модуль объекта обработки

Подходит, когда логика использует реквизиты и состояние конкретной обработки. Требует создания объекта перед вызовом.

Общий модуль

Подходит для универсальных функций без состояния. Вызывается напрямую по имени, доступен в фоновых заданиях.

Модуль менеджера обработки

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

Типичные ошибки и их диагностика

Первая и самая распространённая ошибка — «Процедура или функция с указанным именем не определена». Причины: отсутствует Экспорт, опечатка в имени, либо процедура объявлена в модуле формы, а не в модуле объекта. Проверьте, в каком именно модуле лежит код.

Вторая ошибка — «Метод объекта не обнаружен (Создать)». Возникает при опечатке в имени обработки или когда обработка внешняя, а вызов идёт через Обработки. вместо ВнешниеОбработки.. Третья группа проблем — нарушение контекста: попытка вызвать серверный метод с клиента или использовать РеквизитФормыВЗначение в клиентской процедуре.

Типичные ошибки
01
Вызов Обработки.Имя.Процедура() без создания объекта — менеджер обработки не содержит методов модуля объекта
02
Пропущено ключевое слово Экспорт — процедура остаётся приватной и недоступна извне
03
Вызов РеквизитФормыВЗначение в клиентской процедуре — метод доступен только на сервере
04
Создание объекта внешней обработки через Обработки. вместо ВнешниеОбработки. — платформа не найдёт файл
05
Изменение реквизитов объекта без обратного ЗначениеВРеквизитФормы — форма не увидит изменений
Контрольные точки

Как проверить результат

Компиляция модуля
Норма

Конфигуратор не сообщает об ошибках при проверке модуля

Тревожный признак

Ошибка «Процедура не обнаружена» — проверьте Экспорт и имя

Выполнение вызова
Норма

Процедура отрабатывает, функция возвращает ожидаемое значение

Тревожный признак

Исключение в момент вызова — проверьте создание объекта и контекст

Данные на форме
Норма

После ЗначениеВРеквизитФормы реквизиты формы обновились

Тревожный признак

Форма показывает старые значения — пропущено обратное преобразование

Итог

Что важно запомнить

Вызов процедуры из модуля объекта обработки всегда строится в два шага: создать объект через Обработки.Имя.Создать() или ВнешниеОбработки.Создать(), затем вызвать экспортную процедуру через точку. Из формы объект получают через РеквизитФормыВЗначение на сервере. Код без привязки к состоянию обработки лучше выносить в общие модули.

Частые вопросы

Можно ли вызвать процедуру модуля объекта без создания объекта?

Нет. Модуль объекта исполняется только в контексте экземпляра. Если создание объекта нежелательно, перенесите процедуру в общий модуль или в модуль менеджера обработки — они доступны без экземпляра.

Почему возникает ошибка «Процедура или функция с указанным именем не определена»?

Чаще всего процедура объявлена без ключевого слова Экспорт, либо имя написано с опечаткой, либо код находится в модуле формы, а не в модуле объекта. Проверьте все три пункта.

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

Напрямую указать метод модуля объекта нельзя. Создайте экспортную процедуру в общем модуле, укажите её как метод фонового задания, а внутри неё создайте объект обработки и вызовите нужную процедуру.

Чем отличается вызов встроенной и внешней обработки?

Встроенная создаётся через Обработки.ИмяОбработки.Создать(), внешняя — через ВнешниеОбработки.Создать() с указанием пути к файлу .epf. Дальнейший вызов экспортных процедур идентичен.

Почему из формы нельзя вызвать процедуру через реквизит Объект?

В управляемой форме реквизит Объект — это ДанныеФормыСтруктура, а не объект обработки. На сервере преобразуйте его методом РеквизитФормыВЗначение("Объект"), вызовите процедуру и при необходимости верните изменения через ЗначениеВРеквизитФормы.

Влияет ли безопасный режим на вызов процедур внешней обработки?

Да. При создании объекта в безопасном режиме действуют ограничения на операции с файловой системой, COM-объектами и рядом других возможностей. Если процедура использует эти механизмы, она завершится ошибкой.