Как правильно вызвать экспортную функцию модуля объекта в 1С:Предприятие

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

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

Причина возникновения ошибки

Рассмотрим типовую ошибку. В модуле объекта документа ЗаказКлиента объявлена функция:


Функция Рассчитать() Экспорт
    // Алгоритм расчета документа
    Возврат Истина;
КонецФункции

Попытка вызвать ее напрямую через менеджер коллекции:

Документы.ЗаказКлиента.Рассчитать();

приводит к ошибке выполнения. Проанализируем причину: конструкция Документы.ЗаказКлиента обращается к объекту ДокументМенеджер, а не к конкретному экземпляру документа. Модуль менеджера предназначен для общих («статических») процедур и функций, относящихся ко всему объекту метаданных в целом (например, выборка данных, формирование печатных форм списков). Модуль объекта описывает логику и состояние только одного конкретного экземпляра документа, загруженного в оперативную память.

Способ 1. Вызов метода через создание нового объекта

Если для выполнения расчета требуется инициализировать новый документ, создадим экземпляр объекта через менеджер и вызовем его экспортный метод:


ДокОбъект = Документы.ЗаказКлиента.СоздатьДокумент();
ДокОбъект.Рассчитать();

В данном случае переменная ДокОбъект содержит тип ДокументОбъект.ЗаказКлиента, в контексте которого доступна экспортная функция Рассчитать().

Способ 2. Вызов метода существующего документа по ссылке

Если расчет должен выполняться для уже записанного в базу данных документа, получим его объект по имеющейся ссылке. Рассмотрим правильный и безопасный алгоритм получения объекта:

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

Посмотрим на пример кода:


Если ЗначениеЗаполнено(СсылкаНаЗаказ) Тогда
    ДокОбъект = СсылкаНаЗаказ.ПолучитьОбъект();
    Если ДокОбъект <> Неопределено Тогда
        Результат = ДокОбъект.Рассчитать();
    КонецЕсли;
КонецЕсли;

Обратите внимание: метод Ссылка.ПолучитьОбъект() может вернуть Неопределено, если объект был удален из базы или у текущего пользователя ограничены права доступа (RLS). Всегда проверяйте результат на валидность.

Способ 3. Перенос логики в модуль менеджера или общий модуль

Вызов метода ПолучитьОбъект() считывает из базы данных все реквизиты и табличные части, создавая тяжелый объект в памяти. Если функция Рассчитать() выполняет чисто математические вычисления и не меняет состояние конкретного документа, архитектурно правильнее вынести ее:

  1. В модуль менеджера: объявляем метод с ключевым словом Экспорт прямо в модуле менеджера Документы.ЗаказКлиента. Входные данные передаем через параметры (например, структуру значений или массив). Тогда вызов Документы.ЗаказКлиента.Рассчитать(Параметры) отработает корректно и быстро.
  2. В общий серверный модуль: если алгоритм расчета универсален и применяется в разных объектах конфигурации, выносим функцию в серверный модуль без контекста (например, РасчетыСервер).

Дополнительные факторы, вызывающие ошибку вызова

Если объект получен правильно, но ошибка сохраняется, проверим следующие нюансы:

  1. Синхронизация конфигурации базы данных: если метод был добавлен в конфигураторе, но не была нажата клавиша F7 (обновление конфигурации БД), исполняемая среда будет работать со старой версией модуля.
  2. Опечатки в названии: проверьте совпадение букв в имени метода (например, русская и английская раскладка, количество букв «с»).
  3. Директивы компиляции и инструкции препроцессора: если экспортный метод обернут условиями #Если Клиент Тогда или #Если Сервер Тогда, убедитесь, что контекст вызова соответствует директиве.
← На главную