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