1с вызов функции из модуля менеджера отчета

Обновлено: 07.07.2024


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

Как известно, платформа 1С-8.2/8.3 предоставляет возможность повторного использования кода путем размещения его в экспортных процедурах и функциях в следующих местах конфигурации:

  1. Модули объектов "Форма" и "УправляемаяФорма" ;
  2. Общие модули конфигурации;
  3. Модули менеджеров объектов;
  4. Модули объектов;

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


Модули объектов форм (по замечанию awk):

Этот вариант переиспользования не очень удобен по ряду причин:

- Объекты "Форма" или "УправляемаяФорма" отдельно создать можно только на стороне клиентов (метод ПолучитьФорму () не доступен на сервере). Поэтому на стороне сервера применение этого варианта переиспользования кода ограничено серверным контекстом управляемых форм.

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


Общие модули конфигурации:

Этот вариант является самым простым с точки зрения использования на стороне клиента в управляемых формах, поскольку общие модули и их методы можно сделать непосредственно доступными для использования на клиенте:

&НаКлиенте
Процедура ОбработчикСобытия ( Элемент… )
//…
ВычЗначение = ИмяОбщегоМодуля1 . МетодФункция1 ( Пар1 , Пар2 , Пар3… );
//…
ИмяОбщегоМодуля2 . МетодПроцедура2 ( Арг1 , Арг2 , Арг3… );
//…
КонецПроцедуры

Недостаток размещения кода в общих модулях заключается в уменьшении универсальности обработки (отчета).
Ее функционал «размазывается» по конфигурации. При переносе функционала в другое прикладное решение приходится помнить, что кроме самой обработки также требуется подтянуть «то, пятое, десятое».
А для универсальных обработок, используемых в качестве внешних, такая зависимость от общих модулей может оказаться вообще неприемлемой.


Модули менеджеров объектов:

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

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

&НаСервереБезКонтекста
Функция ФормМетодФункция1 ( Пар1 , Пар2 , Пар3… )
Возврат Обработки [ ИмяОбработки ]. МетодФункция1 ( Пар1 , Пар2 , Пар3… );
КонецФункции

&НаСервереБезКонтекста
Процедура ФормМетодПроцедура2 ( Арг1 , Арг2 , Арг3… )
Обработки [ ИмяОбработки ]. МетодПроцедура2 ( Арг1 , Арг2 , Арг3… );
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикСобытия ( Элемент… )
//…
ВычЗначение = ФормМетодФункция1 ( Пар1 , Пар2 , Пар3… );
//…
ФормМетодПроцедура2 ( Арг1 , Арг2 , Арг3… );
//…
КонецПроцедуры

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

Дело в том, что у внешних обработок и отчетов нет менеджера объекта как такового.
А при сохранении встроенной обработки во внешнюю обработку модуль ее менеджера попросту теряется (кстати, без предупреждения).
В этом случае остается единственное место для размещения повторно используемого кода – модуль объекта обработки (отчета).


Модули объектов:

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

&НаСервере
Функция ФормМетодФункция1 ( Пар1 , Пар2 , Пар3… )
Обработка = РеквизитФормыВЗначение ( "Объект" );
Возврат Обработка . МетодФункция1 ( Пар1 , Пар2 , Пар3… );
КонецФункции

&НаСервере
Процедура ФормМетодПроцедура2 ( Арг1 , Арг2 , Арг3… )
Обработка = РеквизитФормыВЗначение ( "Объект" );
Обработка . МетодПроцедура2 ( Арг1 , Арг2 , Арг3… );
КонецПроцедуры

&НаКлиенте
Процедура ОбработчикСобытия ( Элемент… )
//…
ВычЗначение = ФормМетодФункция1 ( Пар1 , Пар2 , Пар3… );
//…
ФормМетодПроцедура2 ( Арг1 , Арг2 , Арг3… );
//…
КонецПроцедуры

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


Что же делать, если метод объекта фактически является «статическим» и не использует данные самого объекта?

Например, пусть метод возвращает список значений меню, динамически зависящего только от значений переданных методу параметров. Ясно, что использование контекстного серверного вызова в этой ситуации явно неоправданно.

В специально предназначенном строковом реквизите обработки при инициализации модуля объекта сохраняется внутреннее строковое представление типа объекта обработки/отчета:

// установим внутреннее строковое представление типа значения объекта обработки
ЭтотОбъект . ОбработкаТип = ЗначениеВСтрокуВнутр ( ТипЗнч ( ЭтотОбъект ));

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

В принципе реквизит обработки можно заменить реквизитом самой формы.
Тогда описанное выше действие нужно будет выполнять в обработчике «ПриСозданииНаСервере» :

&НаСервере
Процедура ПриСозданииНаСервере ( Отказ , СтандартнаяОбработка )
Обработка = РеквизитФормыВЗначение ( "Объект" );
// установим внутреннее строковое представление типа значения объекта обработки
ЭтаФорма . ОбработкаТип = ЗначениеВСтрокуВнутр ( ТипЗнч ( Обработка ));

ЗначениеВРеквизитФормы ( Обработка , "Объект" );
КонецПроцедуры

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

&НаСервереБезКонтекста
Функция ФормМетодФункция1 ( ОбработкаТип , Пар1 , Пар2 , Пар3 )
// создаем объект обработки по внутреннему строковому представлению его типа
// для внеконтекстного выполнения экспортных методов
Обработка = Новый ( ЗначениеИзСтрокиВнутр ( ОбработкаТип ));
Возврат Обработка . МетодФункция1 ( Пар1 , Пар2 , Пар3… );
КонецФункции

&НаСервереБезКонтекста
Процедура ФормМетодПроцедура2 ( ОбработкаТип , Арг1 , Арг2 , Арг3… )
// создаем объект обработки по внутреннему строковому представлению его типа
// для внеконтекстного выполнения экспортных методов
Обработка = Новый ( ЗначениеИзСтрокиВнутр ( ОбработкаТип ));
Обработка . МетодПроцедура2 ( Арг1 , Арг2 , Арг3… );
КонецПроцедуры
В

&НаКлиенте
Процедура ОбработчикСобытия ( Элемент… )
//…
ВычЗначение = ФормМетодФункция1 ( Объект . ОбработкаТип , Пар1 , Пар2 , Пар3… );
//…
ФормМетодПроцедура2 ( Объект . ОбработкаТип , Арг1 , Арг2 , Арг3… );
//…
КонецПроцедуры
В

Таким образом, решается поставленная задача:
вызовы методов объекта осуществляется при внеконтекстных серверных вызовах со стороны клиента в управляемой форме.

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


Применение:

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

Ограничения применения:

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

При использовании в другом соединении (например, в фоновом задании или во внешнем соединении) у нас не получится создать объект внешней обработки/отчета по переданному внутреннему строковому представлению типа объекта обработки/отчета (смотрите первый пример ниже по тексту).
Поскольку в этом случае функция ЗначениеИзСтрокиВнут () вернет значение Тип ( “Неопределено” ) вместо типа нужного нам объекта.

Например, может возникнуть вполне естественное желание запустить на выполнение обработку в фоновом задании.
Для этого потребуется экспортный метод некоего общего модуля, позволяющего выполнять произвольный код на стороне сервера.
Пусть это будет общий модуль «УТР_Сервер» и метод «ВыполнитьНаСервере» (реальный пример из конфигурации «Управление аптечной сетью» ):

Процедура ВыполнитьНаСервере ( Строка , ПереданноеЗначение =Неопределено) Экспорт
Выполнить( Строка );
КонецПроцедуры

Запустить обработку на выполнение в фоновом задании с передачей типа объекта обработки для его создания можно попытаться так:


&НаСервереБезКонтекста
Функция ЗапуститьНаВыполнениеВФоновомЗаданииНаСервере1 ( ОбработкаТип , стАргументы , ТаймаутФЗ , ФоновоеЗаданиеКлюч , ЕррорИнфо )
Обработка = Новый( ЗначениеИзСтрокиВнутр ( ОбработкаТип ));
ОбработкаИмя = Обработка . Метаданные (). Имя ;

стПараметры = Новый Структура ( "А" , стАргументы );
стПараметры . Вставить ( "ОбработкаТип" , ОбработкаТип );

КодВыполнения =
"П = ПереданноеЗначение;
|// по переданному типу объекта обработки - НЕ РАБОТАЕТ .
|Обработка = Новый(ЗначениеИзСтрокиВнутр(П.ОбработкаТип));
|Обработка.МетодПроцедура2(П.А.Арг1,П.А.Арг2,П.А.Арг3);
|" ;

ИмяМетодаФЗ = "УТР_Сервер.ВыполнитьНаСервере" ;
ПараметрыФЗ = Новый Массив ;
ПараметрыФЗ . Добавить ( КодВыполнения ); // исполняемый код, запускающий обработку на сервере
ПараметрыФЗ . Добавить ( стПараметры ); // параметры исполняемого кода

ЕррорИнфо = "" ;
Попытка
Задание = ФоновыеЗадания . Выполнить (
ИмяМетодаФЗ , ПараметрыФЗ , ОбработкаИмя + "_" + ФоновоеЗаданиеКлюч , "Выполнение обработки """ + ОбработкаИмя + """" );
Если ТаймаутФЗ > 0 Тогда
Задание . ОжидатьЗавершения ( ТаймаутФЗ );
КонецЕсли;
ЗаданиеGUID = Задание . УникальныйИдентификатор ;;
Исключение
ЗаданиеGUID = Неопределено;
ЕррорИнфо = ОписаниеОшибки ();
КонецПопытки;

Возврат ЗаданиеGUID ;
КонецФункции


Обход ограничений:

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

Для этого есть три основных способа:

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


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

&НаСервереБезКонтекста
Функция ЗапуститьНаВыполнениеВФоновомЗаданииНаСервере2 ( ОбработкаТип , стАргументы , ТаймаутФЗ , ФоновоеЗаданиеКлюч , ЕррорИнфо )
Обработка = Новый( ЗначениеИзСтрокиВнутр ( ОбработкаТип ));
ОбработкаИмя = Обработка . Метаданные (). Имя ;

стПараметры = Новый Структура ( "А" , стАргументы );
стПараметры . Вставить ( "ОбработкаАдрес" , ПолучитьНавигационнуюСсылкуДопОбработки ( ОбработкаИмя ));

КодВыполнения =
"П = ПереданноеЗначение;
|// по навигационной ссылке двоичных данных обработки в ИБ
|Обработка = ВнешниеОбработки.Создать(ВнешниеОбработки.Подключить(П.ОбработкаАдрес,,Ложь));
|Обработка.МетодПроцедура2(П.А.Арг1,П.А.Арг2,П.А.Арг3);
|" ;

ИмяМетодаФЗ = "УТР_Сервер.ВыполнитьНаСервере" ;
ПараметрыФЗ = Новый Массив ;
ПараметрыФЗ . Добавить ( КодВыполнения ); // исполняемый код, запускающий обработку на сервере
ПараметрыФЗ . Добавить ( стПараметры ); // параметры исполняемого кода

ЕррорИнфо = "" ;
Попытка
Задание = ФоновыеЗадания . Выполнить (
ИмяМетодаФЗ , ПараметрыФЗ , ОбработкаИмя + "_" + ФоновоеЗаданиеКлюч , "Выполнение обработки """ + ОбработкаИмя + """" );
Если ТаймаутФЗ > 0 Тогда
Задание . ОжидатьЗавершения ( ТаймаутФЗ );
КонецЕсли;
ЗаданиеGUID = Задание . УникальныйИдентификатор ;;
Исключение
ЗаданиеGUID = Неопределено;
ЕррорИнфо = ОписаниеОшибки ();
КонецПопытки;

Возврат ЗаданиеGUID ;
КонецФункции


2) Передать через аргумент метода фонового задания полный путь к файлу обработки/отчета
(полный путь можно получить из атрибута объекта “ИспользуемоеИмяФайла”,
этот путь должен быть доступен на стороне сервера):


&НаСервереБезКонтекста
Функция ЗапуститьНаВыполнениеВФоновомЗаданииНаСервере3 ( ОбработкаТип , стАргументы , ТаймаутФЗ , ФоновоеЗаданиеКлюч , ЕррорИнфо )
Обработка = Новый( ЗначениеИзСтрокиВнутр ( ОбработкаТип ));
ОбработкаИмя = Обработка . Метаданные (). Имя ;

стПараметры = Новый Структура ( "А" , стАргументы );
стПараметры . Вставить ( "ОбработкаПутьФайла" , Обработка . ИспользуемоеИмяФайла );

КодВыполнения =
"П = ПереданноеЗначение;
|// по пути к файлу обработки
|Обработка = ВнешниеОбработки.Создать(П.ОбработкаПутьФайла,Ложь);
|Обработка.МетодПроцедура2(П.А.Арг1,П.А.Арг2,П.А.Арг3);
|" ;

ИмяМетодаФЗ = "УТР_Сервер.ВыполнитьНаСервере" ;
ПараметрыФЗ = Новый Массив ;
ПараметрыФЗ . Добавить ( КодВыполнения ); // исполняемый код, запускающий обработку на сервере
ПараметрыФЗ . Добавить ( стПараметры ); // параметры исполняемого кода

ЕррорИнфо = "" ;
Попытка
Задание = ФоновыеЗадания . Выполнить (
ИмяМетодаФЗ , ПараметрыФЗ , ОбработкаИмя + "_" + ФоновоеЗаданиеКлюч , "Выполнение обработки """ + ОбработкаИмя + """" );
Если ТаймаутФЗ > 0 Тогда
Задание . ОжидатьЗавершения ( ТаймаутФЗ );
КонецЕсли;
ЗаданиеGUID = Задание . УникальныйИдентификатор ;;
Исключение
ЗаданиеGUID = Неопределено;
ЕррорИнфо = ОписаниеОшибки ();
КонецПопытки;

Возврат ЗаданиеGUID ;
КонецФункции
В

3) Передать через аргумент метода фонового задания сами двоичные данные файла обработки/отчета
(их можно получить конструктором по значению атрибута объекта “ИспользуемоеИмяФайла”):

&НаСервереБезКонтекста
Функция ЗапуститьНаВыполнениеВФоновомЗаданииНаСервере4 ( ОбработкаТип , стАргументы , ТаймаутФЗ , ФоновоеЗаданиеКлюч , ЕррорИнфо )
Обработка = Новый( ЗначениеИзСтрокиВнутр ( ОбработкаТип ));
ОбработкаИмя = Обработка . Метаданные (). Имя ;

стПараметры = Новый Структура ( "А" , стАргументы );
стПараметры . Вставить ( "ОбработкаДанные" ,Новый ДвоичныеДанные ( Обработка . ИспользуемоеИмяФайла ));

КодВыполнения =
"П = ПереданноеЗначение;
|// по двоичным данным обработки
|ИмяФайла = ПолучитьИмяВременногоФайла("".epf"");
|П.ОбработкаДанные.Записать(ИмяФайла);
|Обработка = ВнешниеОбработки.Создать(ИмяФайла,Ложь);
|Обработка.МетодПроцедура2(П.А.Арг1,П.А.Арг2,П.А.Арг3);
|" ;

ИмяМетодаФЗ = "УТР_Сервер.ВыполнитьНаСервере" ;
ПараметрыФЗ = Новый Массив ;
ПараметрыФЗ . Добавить ( КодВыполнения ); // исполняемый код, запускающий обработку на сервере
ПараметрыФЗ . Добавить ( стПараметры ); // параметры исполняемого кода

ЕррорИнфо = "" ;
Попытка
Задание = ФоновыеЗадания . Выполнить (
ИмяМетодаФЗ , ПараметрыФЗ , ОбработкаИмя + "_" + ФоновоеЗаданиеКлюч , "Выполнение обработки """ + ОбработкаИмя + """" );
Если ТаймаутФЗ > 0 Тогда
Задание . ОжидатьЗавершения ( ТаймаутФЗ );
КонецЕсли;
ЗаданиеGUID = Задание . УникальныйИдентификатор ;;
Исключение
ЗаданиеGUID = Неопределено;
ЕррорИнфо = ОписаниеОшибки ();
КонецПопытки;

Возврат ЗаданиеGUID ;
КонецФункции
В

Описание файлов поставки:

Пример.epf – демонстрационная обработка с примерами использования
(в том числе разные варианты выполнения в фоновом задании):


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


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


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


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

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


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

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

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

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

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

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

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


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

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

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


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

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

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

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


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

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


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


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

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

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

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

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

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

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

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

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

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

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

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

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

Stiff --> Stiff



Просмотр профиля Создаю с помощью конструктора печати макет.Процедуру он кидает в модуль менеджера.Я создаю кнопку на форме и в событии этой кнопки хочу вызвать процедуру из модуля менеджера.Как правильно это сделать я не знаю.Помогите, кто знает, пожалуйста.(И вообще правильно ли я делаю?)
Процедура называется так:
pablo --> pablo



Просмотр профиля Правильно поставленный вопрос содержит до 90% ответа. Stiff --> Stiff



Просмотр профиля logist --> logist



Просмотр профиля Какие кнопки на форме. Для кого в УИ сделали "Команды"?
Создаете команду, и в ее модуле прописываете вызов процедуры печати. Таким образом кнопка появился сама на форме дока и списка. Kabachok --> Kabachok



Просмотр профиля

указывать не в явном виде "СчетНаОплатуПокупателю", а подставлять строку с названием, например? Просто заранее неизвестно, какой именно документ необходимо напечатать.

Petre --> Petre



Просмотр профиля Допрацьовую:
- "Бухгалтерія для України 2.1";
- "Альфа-Авто: Автосалон+Автосервіс+Автозапчастини, українська версія". Kabachok --> Kabachok



Просмотр профиля

Нет, я имела ввиду, что в одном случае это может быть счет, в другом акт какой-то. Не важно. В общем, я же не могу в явном виде перечислять, что если это один документ, то вызов будет такой, если другой документ, то соответственно другой вызов.
Уже разобралась.

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