1с получить макет внешней обработки в модуле менеджера

Обновлено: 05.07.2024

Использование модуля объекта, модуля менеджера объекта и общих модулей

Область применения: управляемое приложение, мобильное приложение, обычное приложение.

Методическая рекомендация (полезный совет)

1. Модуль объекта предназначен для реализации поведения отдельного экземпляра объекта ( СправочникОбъект , ДокументОбъект и т.п.). В модуле объекта размещаются процедуры и функции, которые работают с данными объекта ( ЭтотОбъект и переменные модуля объекта), в том числе когда он еще не записан в информационную базу.

Например, в модуле объекта могут размещаться:

  • обработчики событий объекта
  • процедуры заполнения экземпляра объекта.

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

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

  • относящиеся не к одному, а сразу к некоторой совокупности объектов. Например, это функции для вывода на печать списка объектов; функции, возвращающие информацию, общую для всех экземпляров объекта метаданных; процедуры обновления данных информационной базы, которые связаны с объектом метаданных; и т.п.
  • которые работают с объектом, записанным в ИБ. В таких функциях входным параметром является ссылка на объект. Например, это функции для получения печатной формы по ссылке на объект, процедуры формирования движений по ссылке на объект и т.п.

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

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

(1) Styvi,
только через объект внешней обработки
и только на стороне сервера:

(1) Styvi,
только через объект внешней обработки
и только на стороне сервера:


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

(3) спасибо, может и клиентская печать потребуется, но пока что в описании темы у меня такой вопрос:

УФ: как получить макет внешней обработки в серверной процедуре управляемой формы этой обработки ?

то есть попробую Вашу строку:
Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("Макет");

(9) Rothschild, это было образно, вместо гугла можете подставить по вкусу. (11) ZergKRSK,
гугл - это империя "добра"
.
которая скоро всех поработит!
:) (14) Rothschild, Спаси если можешь - от деления на ноль в документе)))) Но это уже добро пожаловать в мою последнюю темку)))) (19)
Если печатаешь из формы, (где есть Объект, ЭтаФорма) тогда вот это:
в модульформы.
а вот это в модуль обработки (где есть ЭтотОбъект):
Использую внешнею обработку. Второй вариант в модуль объекта а первный в модуль формы с кнопкой(командой) печать? (21) если про (20), то это все один вариант. В одной обработке это все нужно разместить. (22)Точнее не много хочу другой спросить если поможете. Как на макет вывести данные из таблицыЗначений? (24) формируй документ на сервере и сформированный ТабличныйДокумент передавай на клиент. а Таблицу значений Клиент не умеет. Понял. Скажи а еще бывает ошибка, когда я получаю макет (пытаюсь выгрузить ТАБДок) в 1с пишет метод в тонком клиенте не работает? Ну хорошо. А не подскажите допустим (на клиенте не работает) а как вообще из ТЗ вывести? Приммерный алгоритм, если вам не сложно подсказать)? (26) Не знаю, что там за структура в таблице значений.
Можно построчно выводить.
Вообще, проще будет пример найти, коих в сети валом и посмотреть.

Есть внешняя обработка - Обработка.epf
В ней сформирован макет - "Справка"
В модуле формы прописываем:

Работает на платформе (8.3.14.1779) в файловой и клиент-серверной версиях.


Т.е. обращение происходит непосредственно к макету внутри самой конфигурации, а мне нужно обратиться именно к своему макету в этой внешней обработке!
Подскажите пожалуйста, как это сделать для управляемых форм?

В форме внешней обработки нужна серверная контекстная процедура с таким кодом

&НаСервере
//.
РеквизитФормыВЗначение(Объект).ПолучитьМакет("ИмяМакета")
//.

Благодарю за помощь, сделал вот так и заработало:
Макет = ПолучитьМакетОбработки();
СхемаКомпоновкиДанных = Макет;
.

Ещё такой вопрос, может кто сможет подсказать, ещё вначале сохранял обработку "ПечатьЭтикетокИЦенников" через правую кнопку "Сохранить как внешнюю обработку", но есть некоторый код, который исполняется в Модуле менеджера встроеной обработки, вопрос, как его перенести во внешнюю обработку? Просто копированием? Тогда другой вопрос, может ли код из модуля менеджера благополучно работать в модуле объекта (в частном случае в модуле внешней обработки)?

(5) markovki, Будет работать, главное чтобы пересечений не было.

(6) mylogin, о каких пересечениях идет речь, поясните пожалуйста?

(7) markovki, Например в коде модуля менеджера используются переменные с такими же именами, как и у реквизитов обработки и т.п.

В общем получилось, но не совсем.
Всё-таки есть обращения в типовой макет.
Что я сделал. скопировал текст модуля менеджера типовой обработки в модуль объекта внешней обработки
И чтобы понять есть ли где обращение к типовому макету переименовал свой макет вместо "ПоляШаблона" назвал его "ПоляШаблона2"
В результате выдало ошибку:


и все нормально получала (даже с учетом того, что макеты одинаково называются)

(11) AJlEKCA, спасибо за ответ, но на управляемых формах, при использовании такой конструкции даже при сохранении выдает ошибку:


Но собственно к макету у меня обратиться получилось в данном случае, теперь же ошибки возникают, в коде, который я скопировал из модуля менеджера типовой обработки в модуль внешней обработки, ошибку описывал в 9-м посте

(12) markovki, код из (9) опять-таки ссылается на макет встроенной обработки

(13) AJlEKCA, так и я об этом, пытался сделать по аналогии, вот так:

Но выдает ошибку:

(16) AJlEKCA, насчет СтруктурыНастроек сказать ничего не могу, т.к. типовой механизм достаточно сложный, чтобы понять заполнен он в действительности или нет.
Вообще всё началось с того, что я скопировал реальную базу, разрешил редактирование, переделал макет "ПоляШаблона" этой обработки, добавил в форму одно поле и одну строчку кода для его заполнения, и естесственно всё заработало, но вот уже практически весь день пытаюсь вырвать этот механизм во внешнюю обработку, пока что он постоянно ссылается на типовой макет, не получается искоренить это "явление" полностью)

(15) tarantool, да собственно никуда он не ссылается, потому как нет такого реквизита.
Сделал по примеру 2-го и 3-го постов, просто добавил код

(18) AJlEKCA, как ни странно, но ведь заработало?!
Добавил реквизит во внешнюю обработку со ссылкой на саму себя, если я вас правильно понял)

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

(19) tarantool, согласен, но опыт у меня не большой и тем более сделать это на управлямых формах как видите пока что не получается

(19) tarantool,
Реквизит "Объект" управляемой формы внешней обработки ссылается на сам объект ВнешняяОбработка.<ИмяЭтойСамойВнешнейОбработки>
Именно благодаря этому вы и смогли получить макет из внешней обработки.

В общем вопрос остался открытым, как переделать обращение к внешнему макету?
Здесь:

(24) markovki, я бы посоветовала для начала разобраться с "СтруктураНастроек". посмотрите что и чем заполняется во внутреннем отчете и уже от этого отталкивайтесь во внешнем. то что Вы делаете сейчас называется "пальцем в небо"

Преподаватель 1С
Санкт-Петербург
зарплата от 100 000 руб. до 120 000 руб.
Временный (на проект)


Модуль объекта есть почти у всех основных прикладных объектов конфигурации в 1С.


Также модуль объекта можно открыть из контекстного меню объекта:


Или из меню Действия:


Модуль объекта выполняется при создании объекта. В нем можно объявлять переменные модуля. Экспортные процедуры и функции можно вызывать у созданных программных объектов. К экспортным переменным можно обращаться как к свойствам программных объектов. В модуле есть прямой доступ к реквизитам и табличным частям объекта.

Вызов методов модуля объекта


В модуле объекта напишем следующий код:

Теперь создадим обработку с одной формой и в модуле обработки в событии ПриСозданииНаСервере напишем следующий код:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //заполняем экспортную переменную модуля объекта вызвав экспортную функцию ОбъектНоменклатура . ОбщийОстаток = ОбъектНоменклатура . ОбщийОстаток ( ) ;

Здесь мы сначала создаем новый программный объект справочника Номенклатура вызвав встроенный метод Справочники.Номенклатура.СоздатьЭлемент(). Потом через ссылку на этот объект обращаемся к экспортным переменной и функции объекта.

Теперь поменяем код в модуле формы обработки на следующий:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; //пытаемся заполнить переменную модуля объекта вызвав функцию модуля объекта ОбъектНоменклатура . ПолноеНаименование = ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименование ) ; //ошибка

Здесь мы делаем все то же самое, но обращаемся к не экспортным переменной и функции.


Так как переменная ПолноеНаименование не является экспортной, то к ней нет доступа из других модулей.

Теперь попробуем обратиться к не экспортной функции модуля объекта. Вставим в модуль формы следующий код и откроем обработку:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ; Сообщить ( ОбъектНоменклатура . ПолноеНаименованиеНоменклатуры ( ) ) ; //опять ошибка


Теперь вставим в форму обработки такой код и откроем обработку:

Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка ) ОбъектНоменклатура = Справочники . Номенклатура . СоздатьЭлемент ( ) ;

Здесь мы вызываем экспорную процедуру модуля объекта, а потом встроенным методом Записать записываем объект в базу данных.

В результате в базе данных будет создан новый элемент, у которого заполнен артикул и добавлены 2 строки в табличную часть:


В методе ЗаполнитьРеквизиты() мы обращались напрямую к реквизитам объекта, после чего записали его методом Записать(). Значения реквизитов сохранились в базе данных.

Обработчики событий


В результате откроется список возможных событий:


Рассмотрим основные события модуля объекта:

Для примера создадим в модуле объекта 3 обработчика события и вставим в них следующий код:

Читайте также: