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

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

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

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

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

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

Ниже разобраны рабочие способы вызова, отличия для клиентского и серверного контекста, особенности управляемых и обычных форм, а также ошибки, которые чаще всего мешают коду заработать.

Как устроено взаимодействие модуля формы и модуля объекта

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

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

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

Шаг 1. Объявите процедуру в модуле объекта с ключевым словом Экспорт

Откройте модуль объекта (например, документа «РеализацияТоваров») и добавьте процедуру с ключевым словом Экспорт. Без него метод останется приватным, и вызов из формы выдаст ошибку.

Процедура ЗаполнитьПоОстаткам(Склад) Экспорт

// логика заполнения табличной части

Для Каждого Строка Из Товары Цикл

// ...

КонецЦикла;

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

Обратите внимание: внутри модуля объекта обращение к реквизитам и табличным частям идёт напрямую (Товары, Контрагент), без префикса Объект.. Это удобно, но требует помнить, что код выполняется только в контексте объекта.

Если процедура уже существует, достаточно дописать Экспорт в её заголовок. Проверьте, что слово стоит после закрывающей скобки параметров: Процедура МояПроцедура(Параметр1) Экспорт.

Шаг 2. Вызовите процедуру в модуле формы через объект

В модуле формы создайте серверную процедуру с директивой &НаСервере. Внутри неё преобразуйте данные формы в объект и вызовите нужный метод:

&НаСервере

Процедура ЗаполнитьПоОстаткамНаСервере(Склад)

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

ДокументОбъект.ЗаполнитьПоОстаткам(Склад);

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

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

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

Порядок действий
  1. 1
    В модуле объекта объявите процедуру с ключевым словом Экспорт
  2. 2
    В модуле формы создайте процедуру с директивой &НаСервере
  3. 3
    Получите объект: РеквизитФормыВЗначение("Объект")
  4. 4
    Вызовите метод объекта через точку с нужными параметрами
  5. 5
    Верните изменения в форму: ЗначениеВРеквизитФормы(Объект, "Объект")
  6. 6
    Сохраните конфигурацию и проверьте работу кнопки в режиме предприятия

Шаг 3. Организуйте вызов с клиента, если команда на форме

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

&НаКлиенте

Процедура ЗаполнитьПоОстаткамКоманда(Команда)

Склад = ПолучитьСкладПоУмолчанию();

ЗаполнитьПоОстаткамНаСервере(Склад);

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

Имейте в виду ограничение: параметры, передаваемые с клиента на сервер, должны быть сериализуемыми — примитивные типы, ссылки, структуры, массивы. Передать сам объект документа или результат запроса с клиента на сервер нельзя.

Если форма уже работает на сервере (например, обработчик ПриСозданииНаСервере), промежуточная клиентская процедура не нужна — вызывайте серверный метод напрямую.

Альтернативные способы вызова и когда их применять

Обращение через Объект.Ссылка и получение объекта

Вместо преобразования данных формы можно получить объект по ссылке: ОбъектДляВызова = Объект.Ссылка.ПолучитьОбъект(). Такой способ работает только для записанных объектов и создаёт отдельный экземпляр — изменения в нём не попадут в открытую форму автоматически. Используйте этот вариант, когда нужно выполнить действие над сохранённым объектом независимо от формы.

Вынесение логики в общий модуль

Если процедура не использует данные конкретного объекта (не обращается к его реквизитам), правильнее разместить её в общем модуле с флагами «Сервер» и, при необходимости, «Вызов сервера». Тогда вызов из формы упрощается до МойОбщийМодуль.МояПроцедура(Параметры) без преобразований данных формы.

Менеджер объекта

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

Сравнение вариантов

Модуль объекта + Экспорт

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

Общий модуль

Оптимален для универсальных операций без привязки к объекту. Проще вызывается, легче тестируется, рекомендуется как основное место бизнес-логики.

Модуль менеджера

Для действий над объектами по ссылке без открытия: печать, создание, подбор данных. Не имеет доступа к данным открытой формы.

Типичные ошибки и как их исправить

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

Вторая распространённая проблема — попытка вызвать серверный метод объекта из клиентской процедуры. Платформа сообщит, что метод недоступен в данном контексте. Решение — перенести вызов в процедуру с директивой &НаСервере.

Третья ошибка — изменения не отображаются на форме после выполнения процедуры. Причина в пропущенном вызове ЗначениеВРеквизитФормы(): объект изменился, но данные формы остались прежними.

Типичные ошибки
01
Нет ключевого слова Экспорт — метод не виден из формы, вызов падает с ошибкой
02
Вызов из клиентской процедуры — модуль объекта недоступен на клиенте, нужен серверный контекст
03
Пропущен ЗначениеВРеквизитФормы — объект изменён, но пользователь видит старые данные
04
Имя реквизита формы отличается от "Объект" — РеквизитФормыВЗначение возвращает Неопределено; проверьте имя основного реквизита в редакторе формы

Как проверить, что вызов работает правильно

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

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

Контрольные точки

Как проверить результат

Компиляция модуля
Норма

Конфигуратор не сообщает об ошибках при сохранении

Тревожный признак

Ошибка "Процедура не определена" при проверке модуля

Выполнение в отладчике
Норма

Точка останова в модуле объекта срабатывает

Тревожный признак

Выполнение не доходит до процедуры объекта

Данные на форме
Норма

После выполнения команды форма показывает обновлённые данные

Тревожный признак

Объект изменён, но на форме старые значения

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

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

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

Нет. Без Экспорт процедура доступна только внутри своего модуля. Единственный способ сделать её видимой для формы — добавить Экспорт в заголовок объявления.

Почему РеквизитФормыВЗначение("Объект") возвращает Неопределено?

Чаще всего основной реквизит формы называется иначе. Откройте редактор формы, посмотрите имя основного реквизита (у него установлено свойство «Основной реквизит») и используйте это имя в вызове.

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

Да, в обычных формах проще: реквизит формы уже является объектом, поэтому достаточно написать вызов через имя реквизита, например ДокументОбъект.МояПроцедура(). Преобразования РеквизитФормыВЗначение не требуется.

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

Через список параметров при вызове, как обычно: ДокументОбъект.Заполнить(Склад, ДатаОтбора). Параметры должны быть сериализуемыми, если вызов идёт с клиента на сервер: ссылки, примитивные типы, структуры и массивы подходят.

Что лучше: экспортная процедура в модуле объекта или общий модуль?

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

Итог

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

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