6. Объектная модель прикладного решения
#67

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

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

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

Если метод вызывается у созданного экземпляра элемента справочника так: «Справочники.Номенклатура.СоздатьОбъект().Метод1()», в каком модуле нужно описать процедуру (метод) «Метод1», чтобы обращение сработало?

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

Пояснение

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