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