Разработка и Конфигурация · 9 мин
Как обратиться к процедуре модуля объекта в 1С
Как вызвать процедуру модуля объекта в 1С: получение объекта по ссылке, Экспорт, обращение из формы и внешнего кода. Примеры кода, ошибки и ограничения.
Модуль объекта в 1С содержит процедуры и функции, которые работают с конкретным экземпляром прикладного объекта — справочника, документа, плана счетов и т.д. В отличие от общих модулей, обратиться к ним напрямую нельзя: сначала нужно получить сам объект, и только через него вызвать экспортную процедуру.
Типовая задача выглядит так: есть документ «РеализацияТоваровУслуг», в его модуле объекта описана экспортная процедура ЗаполнитьПоОснованию(), и её нужно вызвать из обработки, другого документа или внешнего кода. Без понимания разницы между ссылкой и объектом это вызывает затруднения у начинающих разработчиков.
Ниже разобраны все рабочие способы обращения: через ПолучитьОбъект(), из формы объекта, из модуля менеджера, а также ограничения клиент-серверного взаимодействия и типичные ошибки.
Что такое модуль объекта и когда в нём размещают код
Модуль объекта — это модуль, который компилируется в контексте конкретного экземпляра объекта конфигурации: документа, справочника, плана видов характеристик, обработки. В нём доступны реквизиты объекта напрямую, без обращения через точку, а также предопределённые обработчики событий: ПередЗаписью, ПриЗаписи, ОбработкаПроведения, ОбработкаЗаполнения.
В модуль объекта принято выносить логику, которая неразрывно связана с данными самого объекта: заполнение табличных частей, проверку корректности реквизитов, формирование движений. Если процедура работает с данными объекта и должна вызываться извне — её объявляют с ключевым словом Экспорт.
Важно понимать: без слова Экспорт процедура остаётся приватной. Попытка вызвать её извне приведёт к ошибке «Процедура или функция с указанным именем не определена».
Получение объекта по ссылке — основной способ
Ключевое отличие, которое нужно усвоить: ссылка и объект — разные сущности. Ссылка — это лёгкий идентификатор записи в базе, через неё доступны только реквизиты. Объект — это полноценный экземпляр в памяти, в контексте которого исполняется модуль объекта.
Поэтому стандартная последовательность вызова выглядит так:
ДокСсылка = Документы.РеализацияТоваровУслуг.НайтиПоНомеру("000001", ТекущаяДатаСеанса());
Если ЗначениеЗаполнено(ДокСсылка) Тогда
ДокОбъект = ДокСсылка.ПолучитьОбъект();
ДокОбъект.ЗаполнитьПоОснованию(Основание);
КонецЕсли;
Для справочников логика идентична: Справочники.Номенклатура.НайтиПоКоду("001").ПолучитьОбъект(), затем вызов экспортной процедуры через точку.
- 1Убедитесь, что процедура в модуле объекта объявлена с ключевым словом Экспорт
- 2Получите ссылку на нужный элемент (поиск по номеру, коду, запросом)
- 3Вызовите метод ПолучитьОбъект() у ссылки
- 4Вызовите процедуру через точку от полученного объекта
- 5При необходимости сохраните изменения методом Записать()
Вызов из формы объекта
Если код выполняется в модуле формы документа или справочника, объект доступен через реквизит формы Объект. Однако в управляемой форме это данные формы, а не сам объект встроенного языка, поэтому прямой вызов Объект.МояПроцедура() на клиенте не сработает.
Правильный подход — серверная процедура формы с преобразованием данных формы в объект:
&НаСервере
Процедура ВыполнитьЗаполнениеНаСервере()
ТекОбъект = РеквизитФормыВЗначение("Объект");
ТекОбъект.ЗаполнитьПоОснованию(Основание);
ЗначениеВРеквизитФормы(ТекОбъект, "Объект");
КонецПроцедуры
Пара методов РеквизитФормыВЗначение() и ЗначениеВРеквизитФормы() обязательна: первая превращает данные формы в объект, вторая возвращает изменённый объект обратно в форму, чтобы пользователь увидел результат.
Вызов из модуля менеджера и новых объектов
Если объект ещё не записан в базу, получить его не по ссылке, а созданием: Документы.РеализацияТоваровУслуг.СоздатьДокумент() или Справочники.Номенклатура.СоздатьЭлемент(). Возвращаемое значение — уже объект, поэтому ПолучитьОбъект() не нужен:
НовыйДок = Документы.РеализацияТоваровУслуг.СоздатьДокумент();
НовыйДок.Дата = ТекущаяДатаСеанса();
НовыйДок.ЗаполнитьПоОснованию(Основание);
НовыйДок.Записать(РежимЗаписиДокумента.Проведение);
Из модуля менеджера (например, из функции печати или обработчика создания на основании) обращение аналогично: менеджер работает со ссылками, поэтому сначала получают объект, затем вызывают его экспортные методы.
Ограничения клиент-серверного взаимодействия
Модуль объекта исполняется только на сервере (в тонком и веб-клиенте) либо в толстом клиенте. Прямой вызов процедуры модуля объекта с клиента управляемого приложения невозможен — объект нельзя передать между клиентом и сервером как параметр.
Отсюда следуют практические правила: вся работа с объектом оформляется в серверных процедурах и функциях; на клиент передаются только простые типы данных, ссылки и структуры. Если нужно вызвать логику объекта по кнопке в форме — используйте серверную процедуру формы, как показано выше.
Альтернативы: когда объект получать не нужно
Не всегда стоит тянуть весь объект в память. Если процедура не использует данные конкретного экземпляра, её логичнее перенести в общий модуль — тогда вызов упростится до МойОбщийМодуль.ИмяПроцедуры(Параметры) без получения объекта.
Если нужно прочитать или изменить только отдельные реквизиты без бизнес-логики записи, иногда достаточно работы через запрос. Но если процедура содержит проверки, заполнение табличных частей или формирование движений — получение объекта обязательно.
Способы вызова логики объекта
Подходит, когда процедура использует данные конкретного экземпляра. Минус — полная загрузка объекта и риск конфликта блокировок.
Для новых объектов, которых ещё нет в базе. ПолучитьОбъект() не требуется.
Когда логика не привязана к экземпляру. Проще вызов, нет накладных расходов на загрузку объекта.
Когда вызов инициируется из управляемой формы. Требует преобразования РеквизитФормыВЗначение.
Типичные ошибки и их диагностика
Самая частая ошибка — «Метод объекта не обнаружен» или «Процедура или функция не определена». Причины: забыто слово Экспорт, опечатка в имени, либо вызов идёт у ссылки, а не у объекта. Проверьте, что перед вызовом выполнен ПолучитьОбъект().
Вторая группа ошибок — попытка вызова на клиенте управляемого приложения. Платформа сообщит, что переменная не определена или метод недоступен в данном контексте. Решение — перенос вызова в серверную процедуру.
Третья ситуация — изменения «теряются»: процедура отработала, но в базе ничего не изменилось. Причина в том, что после вызова не выполнен Записать(). Процедура модуля объекта меняет объект только в памяти.
Что важно запомнить
Процедура модуля объекта вызывается только через экземпляр объекта: Ссылка.ПолучитьОбъект().ИмяПроцедуры(). Процедура должна быть экспортной, вызов — в серверном контексте, а для сохранения результата нужен Записать(). Если логика не привязана к экземпляру, выносите её в общий модуль.
Частые вопросы
Можно ли вызвать процедуру модуля объекта без получения объекта?
Нет. Модуль объекта существует только в контексте экземпляра. Если процедура не использует данные конкретного объекта, перенесите её в общий модуль или модуль менеджера — тогда объект получать не потребуется.
Почему возникает ошибка «Процедура или функция не определена»?
Чаще всего процедура объявлена без ключевого слова Экспорт, есть опечатка в имени, либо вызов выполняется у ссылки, а не у объекта. Проверьте объявление процедуры и наличие вызова ПолучитьОбъект() перед обращением.
Как вызвать процедуру модуля объекта из внешней обработки?
Точно так же: получите ссылку на нужный элемент (например, через параметр формы обработки или запрос), вызовите ПолучитьОбъект() и обратитесь к экспортной процедуре. В управляемой форме обработки делайте это в серверной процедуре.
Нужно ли записывать объект после вызова процедуры?
Если процедура изменяет реквизиты или табличные части и результат должен сохраниться в базе — да, вызовите Записать(). Если процедура только возвращает вычисленное значение, запись не требуется.
Можно ли вызвать процедуру модуля объекта из COM-соединения или веб-сервиса?
Да. В сеансе, созданном через COM или веб-сервис, доступен тот же встроенный язык: получается объект по ссылке, вызывается экспортная процедура, при необходимости выполняется Записать(). Ограничение — на сторону клиента можно вернуть только простые типы и ссылки, сам объект передать нельзя.
Чем модуль объекта отличается от модуля менеджера?
Модуль объекта работает с конкретным экземпляром (его реквизитами и табличными частями) и требует получения объекта. Модуль менеджера работает с типом в целом — поиском, созданием, печатью — и вызывается напрямую через Документы.ИмяДокумента.ИмяПроцедуры().