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

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

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

Как вызвать процедуру модуля объекта в 1С: получение объекта по ссылке, Экспорт, обращение из формы и внешнего кода. Примеры кода, ошибки и ограничения.

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

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

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

Что такое модуль объекта и когда в нём размещают код

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

В модуль объекта принято выносить логику, которая неразрывно связана с данными самого объекта: заполнение табличных частей, проверку корректности реквизитов, формирование движений. Если процедура работает с данными объекта и должна вызываться извне — её объявляют с ключевым словом Экспорт.

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

Получение объекта по ссылке — основной способ

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

Поэтому стандартная последовательность вызова выглядит так:

ДокСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000001", ТекущаяДатаСеанса());

Если ЗначениеЗаполнено(ДокСсылка) Тогда

ДокОбъект = ДокСсылка.ПолучитьОбъект();

ДокОбъект.ЗаполнитьПоОснованию(Основание);

КонецЕсли;

Для справочников логика идентична: Справочники.Номенклатура.НайтиПоКоду("001").ПолучитьОбъект(), затем вызов экспортной процедуры через точку.

Порядок вызова процедуры модуля объекта
  1. 1
    Убедитесь, что процедура в модуле объекта объявлена с ключевым словом Экспорт
  2. 2
    Получите ссылку на нужный элемент (поиск по номеру, коду, запросом)
  3. 3
    Вызовите метод ПолучитьОбъект() у ссылки
  4. 4
    Вызовите процедуру через точку от полученного объекта
  5. 5
    При необходимости сохраните изменения методом Записать()

Вызов из формы объекта

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

Правильный подход — серверная процедура формы с преобразованием данных формы в объект:

&НаСервере

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

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

ТекОбъект.ЗаполнитьПоОснованию(Основание);

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

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

Пара методов РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы() обязательна: первая превращает данные формы в объект, вторая возвращает изменённый объект обратно в форму, чтобы пользователь увидел результат.

Вызов из модуля менеджера и новых объектов

Если объект ещё не записан в базу, получить его не по ссылке, а созданием: Документы.РеализацияТоваровУслуг.СоздатьДокумент() или Справочники.Номенклатура.СоздатьЭлемент(). Возвращаемое значение — уже объект, поэтому ПолучитьОбъект() не нужен:

НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();

НовыйДок.Дата = ТекущаяДатаСеанса();

НовыйДок.ЗаполнитьПоОснованию(Основание);

НовыйДок.Записать(РежимЗаписиДокумента.Проведение);

Из модуля менеджера (например, из функции печати или обработчика создания на основании) обращение аналогично: менеджер работает со ссылками, поэтому сначала получают объект, затем вызывают его экспортные методы.

Ограничения клиент-серверного взаимодействия

Модуль объекта исполняется только на сервере (в тонком и веб-клиенте) либо в толстом клиенте. Прямой вызов процедуры модуля объекта с клиента управляемого приложения невозможен — объект нельзя передать между клиентом и сервером как параметр.

Отсюда следуют практические правила: вся работа с объектом оформляется в серверных процедурах и функциях; на клиент передаются только простые типы данных, ссылки и структуры. Если нужно вызвать логику объекта по кнопке в форме — используйте серверную процедуру формы, как показано выше.

Альтернативы: когда объект получать не нужно

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

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

Способы вызова логики объекта

Через ПолучитьОбъект()

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

Через СоздатьДокумент()/СоздатьЭлемент()

Для новых объектов, которых ещё нет в базе. ПолучитьОбъект() не требуется.

Через общий модуль

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

Через серверную процедуру формы

Когда вызов инициируется из управляемой формы. Требует преобразования РеквизитФормыВЗначение.

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

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

Вторая группа ошибок — попытка вызова на клиенте управляемого приложения. Платформа сообщит, что переменная не определена или метод недоступен в данном контексте. Решение — перенос вызова в серверную процедуру.

Третья ситуация — изменения «теряются»: процедура отработала, но в базе ничего не изменилось. Причина в том, что после вызова не выполнен Записать(). Процедура модуля объекта меняет объект только в памяти.

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

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

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

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

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

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

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

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

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

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

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

Если процедура изменяет реквизиты или табличные части и результат должен сохраниться в базе — да, вызовите Записать(). Если процедура только возвращает вычисленное значение, запись не требуется.

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

Да. В сеансе, созданном через COM или веб-сервис, доступен тот же встроенный язык: получается объект по ссылке, вызывается экспортная процедура, при необходимости выполняется Записать(). Ограничение — на сторону клиента можно вернуть только простые типы и ссылки, сам объект передать нельзя.

Чем модуль объекта отличается от модуля менеджера?

Модуль объекта работает с конкретным экземпляром (его реквизитами и табличными частями) и требует получения объекта. Модуль менеджера работает с типом в целом — поиском, созданием, печатью — и вызывается напрямую через Документы.ИмяДокумента.ИмяПроцедуры().