новое событие
Информационный поток
Задания вакансии материалы разработки сообщения форума

Модуль объекта и модуль менеджера. Отличия

  • Добавить свою публикацию
  • для этого требуется регистрация

Предисловие

Изображение

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

 

Понимание в различии их назначения позволяет писать более правильный по структуре программный код, а в некоторых случаях сэкономить ресурсы сервера 1С и увеличить производительность прикладного решения.

 

В статье рассмотрим принципиальные различия между этими модулями как с теоретической стороны, так и на конкретном практическом примере.

Теория

Обратимся к основам объектно-ориентированного программирования (ООП) и проведем аналогию с нашим примером. В ООП методы для объектов можно разделить на статические (static) и простые. Простые методы могут быть вызваны только для конкретного объекта, доступ к которому мы имеем в текущем контексте программного кода. Статические методы не имеют непосредственного доступа к данным объектов. Для обращения к объекту первоначально нужно создать его экзмемпляр. То же самое относится к платформе 1С:Предприятие 8.x.

Изображение

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

 

От теории перейдем к практике.

Практика

Перейдем к практическому примеру. Предположим, что нам нужно решить задачу по печати списка товаров.Пользотель выводит на печать товар либо непосредственно из элемента справочника, либо из форму списка товаров. Рассмотрим два способа выполнения поставленной задачи.

 

Процедура печати в модуле объекта

В модуле объекта справочника добавим следующую функцию:

 
// В функцию передаем ссылку на элемент справочника
Функция ПечатьВыбранныхТоваров(Ссылка) Экспорт           	
	ТабДок = Новый ТабличныйДокумент;    	
	Макет = Справочники.Товары.ПолучитьМакет("Макет");  	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Товары.Представление КАК Товар,
		|	Товары.ПометкаУдаления,
		|	Товары.Артикул
		|ИЗ
		|	Справочник.Товары КАК Товары
		|ГДЕ
		|	Товары.Ссылка В(&МассивТоваров)";
    Запрос.УстановитьПараметр("МассивТоваров", Ссылка); //Ставим отбор по ссылке
	Результат = Запрос.Выполнить();                    
	ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
	ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
	ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
	ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
	ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали");  
	ТабДок.Очистить();
	ТабДок.Вывести(ОбластьЗаголовок);
	ТабДок.Вывести(ОбластьШапкаТаблицы);
	ТабДок.НачатьАвтогруппировкуСтрок();         
	ВыборкаДетальныеЗаписи = Результат.Выбрать();   
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
		ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
	КонецЦикла;                         
	ТабДок.ЗакончитьАвтогруппировкуСтрок();
	ТабДок.Вывести(ОбластьПодвалТаблицы);
	ТабДок.Вывести(ОбластьПодвал);    	
	Возврат ТабДок;                
КонецФункции
	

 Программный код полностью сформирован конструктором печати. Единственное, что стоит отметить - это отобр по ссылке на элемент справочника "Товары" в запросе. Ссылка передается в качестве параметра в функцию. В результате вызова функции "ПечатьВыбранныхТоваров" будет возвращен табличный документ с заполненной позицией товара.

Изображение

Программный код для вызова метода объекта "ПечатьВыбранныхТоваров" по команде формы "Печать" представлен на следующем листинге: 

 &НаКлиенте
Процедура Печать(Команда)
	// Обращаемся к серверной процедуре для получения сформированного табличного документа
	ТабДок = ПечатьСервер();
	// Показываем сформированный табличный документ
	ТабДок.Показать(); 	
КонецПроцедуры       
&НаСервере
Функция ПечатьСервер() 	
	// Конвертируем объект формы в объект справочника "Товары" для вызова функции из модуля объекта
	ОбъектТовар = РеквизитФормыВЗначение("Объект");
	// Вызываем процедуру модуля объекта, передав туда ссылку на текущий элемент справочника. Результат
	// возвращаем на клиентскую часть
	Возврат ОбъектТовар.ПечатьВыбранныхТоваров(Объект.Ссылка);	
КонецФункции

 Таким образом, мы распечатали текущий элемент справочника, работая с его объектом. Но в задаче было сказано распечатать список товаров, которые пользователь сам должен выбрать. При работе с объектом дать пользователю такую возможность простым путем не представляется возможным. Наиболее правильно было бы выполнять печать из списка элементов справочника "Товары".

Процедура печати в модуле менеджера

В модуль менеджера справочника добавим следующую экспортную процедуру:

 // Передаем массив ссылок на товары
Функция ПечатьВыбранныхТоваров(МассивТоваров) Экспорт  	
	ТабДок = Новый ТабличныйДокумент;   	
	Макет = Справочники.Товары.ПолучитьМакет("Макет"); 	
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	Товары.Представление КАК Товар,
		|	Товары.ПометкаУдаления,
		|	Товары.Артикул
		|ИЗ
		|	Справочник.Товары КАК Товары
		|ГДЕ
		|	Товары.Ссылка В(&МассивТоваров)";
    Запрос.УстановитьПараметр("МассивТоваров", МассивТоваров); // Устанавливаем отбор по массиву
	Результат = Запрос.Выполнить();              
	ОбластьЗаголовок = Макет.ПолучитьОбласть("Заголовок");
	ОбластьПодвал = Макет.ПолучитьОбласть("Подвал");
	ОбластьШапкаТаблицы = Макет.ПолучитьОбласть("ШапкаТаблицы");
	ОбластьПодвалТаблицы = Макет.ПолучитьОбласть("ПодвалТаблицы");
	ОбластьДетальныхЗаписей = Макет.ПолучитьОбласть("Детали"); 
	ТабДок.Очистить();
	ТабДок.Вывести(ОбластьЗаголовок);
	ТабДок.Вывести(ОбластьШапкаТаблицы);
	ТабДок.НачатьАвтогруппировкуСтрок();     
	ВыборкаДетальныеЗаписи = Результат.Выбрать();  
	Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
		ОбластьДетальныхЗаписей.Параметры.Заполнить(ВыборкаДетальныеЗаписи);
		ТабДок.Вывести(ОбластьДетальныхЗаписей, ВыборкаДетальныеЗаписи.Уровень());
	КонецЦикла;                     
	ТабДок.ЗакончитьАвтогруппировкуСтрок();
	ТабДок.Вывести(ОбластьПодвалТаблицы);
	ТабДок.Вывести(ОбластьПодвал);    
	Возврат ТабДок;           	
КонецФункции

 Главное отличие от функции в модуле объекта - это параметр функции. Теперь в качестве параметра передается массив с ссылками на товары, которые необходимо распечатать.

 

Программный код модуля команды формы "Печать" выглядит следующим образом:

 &НаКлиенте
Процедура Печать(Команда) 	
	ТабДок = ПечатьСервер();
	ТабДок.Показать(); 	
КонецПроцедуры  
&НаСервере
Функция ПечатьСервер()    	
	// Передаем массив ссылок выделенных товаров в списке справочника
	// в функцию модуля менеджера "ПечатьВыбранныхТоваров"
	Возврат Справочники.Товары.ПечатьВыбранныхТоваров(Элементы.Список.ВыделенныеСтроки); 	
КонецФункции

 При этом результат выполнения команды в режиме 1С:Предприятия будет следующим:

Изображение

В случае использования метода из модуля менеджера мы можем обращаться к данным справончника "Товары" без получения объекта для каждой ссылки. Поскольку получения объекта означает получение всех данных из базы данных по элементу справочника и помещение полученных данных в оперативную память, то реализация задачи вторым способом положительно повлияет на производительность. Ведь в таком случае мы будем использовать минимум ресурсов (оперативной памяти) серверной машины.

Что же использовать?

Как всегда, все зависит от конкретной задачи. Если нужно выполнить печать документа, то более оптимальный вариант - использовать модуль менеджера. Если нужно заполнять объект, например, внешней обработкой заполнения табличных частей, то в таком случае процедуры и функции лучше располагать в модуле объекта, поскольку их работа предполагает именно с объектом.

 

В типовой конфигурации "Управление торговлей" версии 11 повсеместно используетмся модуль менеджера для печати документов. Если посмотреть на конфигурацию "Управление производственным предприятием", то модуль менеджера практически не используется, так как конфигурация писалась в старых версиях платформы, где полноценной поддержки этого механизма не было.

 

Конфигурация с примерами из статьи.

 
0
Читайте также
Автоматический подбор размера шрифта в объекте РисунокТабличногоДокумента
Как реализовать функцию автоматического подбора размера шрифта в поле
Недостатки объектной модели
Принцип объектной модели и его недостатки
Разработки
МАГАЗьКА - программа для автоматизации розничной торговли
Программа позволяет автоматизировать торговлю
Рабочее место менеджера по продажам для УТ10.3, КА1.1, УПП1.3
Менеджер по продажам- рабочее место:планирование продаж и т.д.
Еще от автора
≡ к списку статей