10. Интерфейсные механизмы
#73

Готовишься к экзамену?

Полнофункциональный тренажер @bot_1cnik_bot с полноценным обучением, режимом экзамена и подробной статистикой.

Перейти в бота

В модуле объекта справочника «Номенклатура» есть процедура, объявленная с ключевым словом «Экспорт». Можно ли вызвать эту процедуру напрямую из модуля любой подчиненной формы (например, из формы документа «Ведомость в кассу» при доработке автозаполнения), если в форме удается получить объект типа «СправочникОбъект.Номенклатура»?

Да, но только из формы, где основной реквизит формы - именно объект «СправочникОбъект.Номенклатура».
Неправильно: ограничение по «основному реквизиту формы» не является обязательным условием. Важно не то, какой реквизит назначен основным, а то, что у вас есть переменная/значение именно объекта нужного типа, у которого и вызывается экспортный метод.
Да, но только из подчиненных форм самого справочника «Номенклатура».
Неправильно: экспортные процедуры модуля объекта доступны не только формам этого справочника. Их можно вызывать из любого модуля, если получен экземпляр объекта «Номенклатура» (объект, а не ссылка).
Да, но только из модулей основных форм справочника «Номенклатура».
Неправильно: принадлежность формы к «основной» не дает уникального права на вызов. Экспортная процедура вызывается через объект, поэтому место вызова (какая именно форма) не критично.
Да, вызвать можно из модуля любой формы конфигурации, если в контексте есть объект «Номенклатура».
Правильно: ключевое слово «Экспорт» делает процедуру доступной извне, но вызвать ее можно только у конкретного экземпляра объекта. Поэтому любая форма (включая подчиненные формы и формы документов) может вызвать метод, если она получила значение типа «СправочникОбъект.Номенклатура» и обращается к процедуре через этот объект.

Пояснение

Расширенная подсказка (с привязкой к автозаполнению «Ведомости в кассу» и практике разработки): 1) Что реально означает «Экспорт» в модуле объекта - «Экспорт» разрешает обращаться к процедуре/функции из других модулей. - Но это не «глобальный вызов по имени». Экспортный метод вызывается у конкретного объекта: сначала объект нужно получить, затем вызвать у него метод. 2) Главное условие: получить именно объект, а не ссылку - Ссылка (например, «СправочникСсылка.Номенклатура») сама по себе метод модуля объекта не выполняет. - Нужно получить «СправочникОбъект.Номенклатура». 3) Типовые способы получить объект (когда вы в модуле формы) - Если форма редактирует объект (форма элемента), часто объект уже есть в реквизитах формы (например, реквизит «Объект»), и его можно взять из формы. - Если у вас есть ссылка на номенклатуру (например, реквизит формы/строка табличной части), то объект получают через получение объекта по ссылке. 4) Как это применить при доработке автозаполнения «Ведомости в кассу» Сценарий: вы добавили кнопку/обработчик, который при «Заполнить» делает дополнительные расчеты (например, подставляет комментарий, проверяет аналитику, подбирает значения в табличную часть по правилам компании). В любой форме (в том числе в «Ведомости в кассу») вы можете: - получить нужный объект «Номенклатура» (если он вам нужен для вычислений/проверок), - вызвать у него экспортную процедуру из модуля объекта. Важно: при этом форма документа не обязана быть «формой номенклатуры». 5) Практические замечания, чтобы не «сломать» заполнение ведомости - Автозаполнение ведомости обычно опирается на способ выплаты сотрудника и наличие задолженности к выплате за выбранный месяц/вид выплаты. Доработки лучше делать так, чтобы не подменять базовую логику, а дополнять (например, постобработка заполненной табличной части). - Если ваш вызов экспортных методов выполняет серверную логику, размещайте его в серверном контексте обработчика (иначе получите ошибки выполнения на клиенте). 6) Мини-проверка себя - В отладчике убедитесь, что переменная, у которой вызывается метод, имеет тип именно «СправочникОбъект.Номенклатура». - Если тип «СправочникСсылка.Номенклатура» - сначала получите объект, и только потом вызывайте экспортную процедуру.