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