11.01.2011

Внешние  обработки, печатные формы, обработки по заполнению табличных частей

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

Общее описание

Механизм предназначен для подключения (без изменения конфигурации):

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

Для реализации механизма ВПФО используется справочник "Внешние обработки".

Для справочника предусмотрены специализированные реквизиты*:

    1. Произвольная обработка
    2. Обработка для заполнения табличных частей объектов
    3. Внешняя печатная форма

ПРИМЕЧАНИЕ
Полный перечень реквизитов будет описан ниже, в разделе Техническая реализация механизма "Внешние  обработки, печатные формы, обработки по заполнению табличных частей"

Для удобства, формы списков ВПФО вызываются раздельно, с предустановленным отбором по реквизиту "Вид обработки", из подменю "Сервис".

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

Для остальных пользователей назначаются права на чтение(использование) и запись(изменение) по каждому элементу справочника ВПФО.

Преимущества  использования механизма ВПФО перед механизмом платформы открытия внешних обработок: 

Описание видов справочника ВПФО и требования к подключаемым внешним обработкам

Рассмотрим каждый вид ВПФО по отдельности.

Произвольная обработка

Для включения произвольных обработок в базу данных, необходимо указывать только внешнюю обработку, которая находится на диске.

Открытие произвольных обработок в форме списка производится при выборе элемента ВПФО с видом "Произвольная обработка". При этом, производится сохранение двоичных данных из реквизита "Хранилище внешней обработки" на диск во временный файл. После этого, у сохраненной внешней обработки открывается основная форма.  

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

Обработка для заполнения ТЧ объектов

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

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

Перед открытием формы объекта в командных панелях табличных полей (источником данных для которых является табличная часть объекта), которым соответствуют определенные строки  в справочнике ВПФО, программно добавляются пункты в подменю "Заполнить" (если подменю "Заполнить" отсутствует на командной панели, оно создается).

При нажатии на созданную перед открытием кнопку подменю "Заполнить" происходит сохранение соответствующей обработки на диск во временный файл,  для сохраненной внешней обработки вызывается процедура:

Копировать в буфер обмена

Инициализировать (Объект, ИмяТабличнойЧасти, ТабличноеПолеОбъекта)

где:

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

Обработка так же может иметь в своем составе макет "Параметры_Авторегистрации",  используемый для автоматического заполнения принадлежности печатной формы в справочнике "Внешние обработки". Макет должен состоять из 2-х колонок – "полное имя объекта" и "имя табличной части".

Пример макета Параметры_Авторегистрации:

картинка

Внешняя печатная форма

Для подключаемых внешних печатных форм указывается:

Для каждого типа объекта дополнительно можно указать:

Вызов диалога настройка условий отбора осуществляется при начале выбора значения в колонке "отбор":

картинка

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

картинка

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

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

Для сохраненной внешней обработки:

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

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

Обработка так же может иметь в своем составе макет "Параметры_Авторегистрации",  используемый для автоматического заполнения принадлежности печатной формы в справочнике "Внешние обработки" состоящий из одной колонки – полное имя объекта для которого будет создаваться соответствующая кнопка печати.

Пример макета Параметры_Авторегистрации:

картинка

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

Техническая реализация механизма "Внешние  обработки, печатные формы, обработки по заполнению табличных частей"

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

картинка

Реквизиты:

ТабличнаяЧасть.Принадлежность. Хранит типы объектов, для которых задается ВПФО и прочие описанные ниже параметры. Табличная часть используется для элементов с видом обработки: "Печатная форма" или "Заполнение табличных частей".

Реквизиты табличной части:

** Используется только для элементов с видом обработки: "Заполнение табличных частей"
*** Используется только для элементов с видом обработки: "печатная форма".

Подключение дополнительных печатных форм к формам объектов конфигурации

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

Копировать в буфер обмена
//////////////////////////////////////////////////////////////////////////////   
//  МОДУЛЬ ОБЪЕКТА 
//////////////////////////////////////////////////////////////////////////////   


// Возвращает доступные варианты печати документа, обрабатываемые в модуле объекта 
// 
// Вовращаемое значение: 
//  Струткура, каждая строка которой соответствует одному из вариантов печати 
//   
Функция ПолучитьСтруктуруПечатныхФорм() Экспорт 

     // структура индивидуальная для каждого типа объекта 
     Возврат Новый Структура("Аванс_Отчет","Авансовый отчет"); 

КонецФункции // ПолучитьСтруктуруПечатныхФорм() 


//////////////////////////////////////////////////////////////////////////////   
//  ФОРМА ОБЪЕКТА 
//////////////////////////////////////////////////////////////////////////////   

// Хранит дерево макетов печатных форм 
Перем мДеревоМакетов; 

// Хранит элемент управления подменю печати 
Перем мПодменюПечати; 

// Хранит элемент управления кнопку печать по умолчанию 
Перем мПечатьПоУмолчанию; 


// Процедура - обработчик события "ПередОткрытием" формы. 
// 
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)// Установка кнопок печати 
     УстановитьКнопкиПечати();КонецПроцедуры // ПередОткрытием() 

// Процедура - обработчик события "ПослеЗаписи" формы. 
// 
Процедура ПослеЗаписи()// Установка кнопок печати 
     УстановитьКнопкиПечати();КонецПроцедуры // ПослеЗаписи() 

//Процедура устанавливает подменю "Печать" и кнопку "Печать по умолчанию" при необходимости 
// 
Процедура УстановитьКнопкиПечати() 

     мДеревоМакетов = ПолучитьДеревоМакетовПечати(Ссылка, ПолучитьСтруктуруПечатныхФорм(), Новый Действие("ОсновныеДействияФормыПечать"), Новый Действие("ОсновныеДействияФормыУстановитьПечатьПоУмолчанию")); 

     УстановитьПодменюПечати    (мПодменюПечати, ЭлементыФормы.ОсновныеДействияФормы, мДеревоМакетов.Строки.Количество() > 0); 
     УстановитьПечатьПоУмолчанию(мПечатьПоУмолчанию, ЭлементыФормы.ОсновныеДействияФормы, мДеревоМакетов, Метаданные().Имя,Новый Действие("ОсновныеДействияФормыПечатьПоУмолчанию")); 

     Если Не мПодменюПечати = Неопределено Тогда 
          СформироватьПодменю(мДеревоМакетов, мПодменюПечати,Истина,Истина); 
     КонецЕсли;       

КонецПроцедуры 

// Процедура - обработчик нажатия на кнопку "Печать по умолчанию" 
// 
Процедура ОсновныеДействияФормыПечатьПоУмолчанию(Кнопка) 

     ПечатьПоДополнительнойКнопке(мДеревоМакетов, ЭтотОбъект, ЭтаФорма, Кнопка.Текст); 

КонецПроцедуры 

// Процедура - обработчик нажатия на кнопку "Печать" 
// 
Процедура ОсновныеДействияФормыПечать(Кнопка) 

     ПечатьПоДополнительнойКнопке(мДеревоМакетов, ЭтотОбъект, ЭтаФорма, Кнопка.Текст); 

КонецПроцедуры 

// Процедура - обработчик нажатия на кнопку "Установить печать по умолчанию" 
// 
Процедура ОсновныеДействияФормыУстановитьПечатьПоУмолчанию(Кнопка) 

     Если НазначитьКнопкуПечатиПоУмолчанию(мДеревоМакетов, Метаданные().Имя) Тогда 

          УстановитьКнопкиПечати(); 

     КонецЕсли; 

КонецПроцедуры 

Подключение обработок по заполнению табличных частей к формам объектов конфигурации

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

Копировать в буфер обмена
//////////////////////////////////////////////////////////////////////////////   
//  ФОРМА ОБЪЕКТА 
//////////////////////////////////////////////////////////////////////////////   

// Хранит соответствие 
Перем мКнопкиЗаполненияТЧ; 

// Процедура - обработчик события "ПередОткрытием" формы. 
// 
Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)// Установка кнопок заполнение ТЧ 
     УстановитьКнопкиПодменюЗаполненияТЧ();КонецПроцедуры // ПередОткрытием() 

// Процедура устанавливает подменю "Заполнить" в командных панелях ТЧ документа при необходимости 
// 
Процедура УстановитьКнопкиПодменюЗаполненияТЧ(); 

     СоответствиеТЧ = Новый Соответствие; 
     СоответствиеТЧ.Вставить(ЭлементыФормы.ВыданныеАвансы,ЭлементыФормы.КоманднаяПанельВыданныеАвансы); 
     СоответствиеТЧ.Вставить(ЭлементыФормы.ВозвратнаяТара,ЭлементыФормы.КоманднаяПанельВозвратнаяТара); 
     СоответствиеТЧ.Вставить(ЭлементыФормы.Прочее,ЭлементыФормы.КоманднаяПанельПрочее); 
     СоответствиеТЧ.Вставить(ЭлементыФормы.ОплатаПоставщикам,ЭлементыФормы.КоманднаяПанельОплатаПоставщикам); 
     СоответствиеТЧ.Вставить(ЭлементыФормы.Товары,ЭлементыФормы.КоманднаяПанельТовары.Кнопки.Заполнить); 

     мКнопкиЗаполненияТЧ = СформироватьПодменюЗаполненияТЧ(Ссылка, СоответствиеТЧ, Новый Действие("НажатиеНаДополнительнуюКнопкуЗаполненияТЧ")); 

КонецПроцедуры 

// Процедура - обработчик нажатия на любую из дополнительных кнопок по заполнению ТЧ 
// 
Процедура НажатиеНаДополнительнуюКнопкуЗаполненияТЧ(Кнопка) 

     ОбработатьНажатиеНаДополнительнуюКнопкуЗаполненияТЧ(мКнопкиЗаполненияТЧ.Строки.Найти(Кнопка.Имя,"Имя",Истина), ЭтотОбъект); 

КонецПроцедуры