Внешние печатные формы в обычном и управляемом приложении

Расширение БСП по реализации механизма пользовательских макетов для обработок внешних печатных форм.

Как получить макет на клиенте?

В этом нам поможет отдельная функция, работающая на стороне сервера. С помощью функции «РеквизитФормыВЗначение()» мы передадим объект в виде нашей внешней обработки в серверную функцию и там получим макет. В качестве реквизита формы выступает основной реквизит, выделенный на самой форме жирным шрифтом. Подробный код функции содержит следующие строки:

Рис.1 Подробный код функцииРис.1 Подробный код функции

Объявление функции;

&НаСервере Функция ПолучитьМакетНаСервере()

Передача объекта с клиентской формы на сервер;

ОбъектВнешнейОбработки = РеквизитФормыВЗначение(“Объект”);

Получение макета по наименованию. Наименование задается при добавлении макета во внешнюю обработку;

Рис.2 Получение макета по наименованиюРис.2 Получение макета по наименованию

НовыйМакет = ОбработкаОбъект.ПолучитьМакет(“НовыйМакет”);

Возвращаем полученный макет на клиент;

Возврат НовыйМакет; КонецФункции

Это изменение призвано оптимизировать работу тонкого клиента и перенести «тяжелые» операции на сервер. Подобные разграничения пропагандирует компания 1С, стараясь оставить на стороне клиента лишь работы по прорисовке интерфейса. Чуть больше строк кода даст нам прирост производительности и более стандартизированный код. Если придерживаться единых стандартов 1С при разработке, то будет намного удобнее и понятнее поддерживать сложные конфигурации.

Для обычных форм:

Макет = ПолучитьМакет(“Макет1”);

1. Перехват и модернизации механизма заполнения типового списка макетов

Механизм находится в процедуре формы РегистрСведений.ПользовательскиеМакетыПечати.Форма.МакетыПечатныхФорм.ЗаполнитьТаблицуМакетовПечатныхФорм().

Добавляем форму МакетыПечатныхФорм в расширение, в модуле формы прописываем следующий код:

&Перед(“ЗаполнитьТаблицуМакетовПечатныхФорм”)Процедура simПМВПФ_ЗаполнитьТаблицуМакетовПечатныхФорм() //Ищем запросом все неотключенные внешние обработки печатных форм Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка |ИЗ | Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки |ГДЕ | ДополнительныеОтчетыИОбработки.Вид = &ВПФ | И ДополнительныеОтчетыИОбработки.Публикация <> &Отключена | И НЕ ДополнительныеОтчетыИОбработки.ПометкаУдаления”; Запрос.УстановитьПараметр(“ВПФ” , Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма); Запрос.УстановитьПараметр(“Отключена” , Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена); РезультатЗапроса = Запрос.Выполнить(); ВДЗ = РезультатЗапроса.Выбрать(); Пока ВДЗ.Следующий() Цикл //Получаем обработку-объект, для доступа к ее макетам, через метаданные ОбработкаОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(ВДЗ.Ссылка); ОбъектМетаданныхКоллекции = ОбработкаОбъект.Метаданные(); //Перебираем макеты Для каждого ОбъектМетаданныхМакет из ОбъектМетаданныхКоллекции.Макеты Цикл //Вызов нетиповой функции проверки соответствия префикса в макете ТипМакета = sim_ТипМакета(ОбъектМетаданныхМакет.Имя); Если ТипМакета = Неопределено Тогда Продолжить; КонецЕсли; //Добавление макета на форму ДобавитьОписаниеМакета(ОбъектМетаданныхКоллекции.ПолноеИмя() + “.” + ОбъектМетаданныхМакет.Имя, ОбъектМетаданныхМакет.Синоним, ОбъектМетаданныхКоллекции.Синоним, ТипМакета); КонецЦикла; КонецЦикла; КонецПроцедуры&НаСервереФункция sim_ТипМакета(ИмяОбъектаМетаданныхМакета, ОбработкаОбъект) Позиция = СтрНайти(ИмяОбъектаМетаданныхМакета, “ПФ_”); Если Позиция = 0 Тогда Возврат Неопределено; КонецЕсли; //получаем требуемый макет МакетПечатнойФормы = ОбработкаОбъект.ПолучитьМакет(ИмяОбъектаМетаданныхМакета); ТипМакета = Неопределено; Если ТипЗнч(МакетПечатнойФормы) = Тип(“ТабличныйДокумент”) Тогда ТипМакета = “MXL”; ИначеЕсли ТипЗнч(МакетПечатнойФормы) = Тип(“ДвоичныеДанные”) Тогда ТипМакета = ВРег(УправлениеПечатьюСлужебный.ОпределитьРасширениеФайлаДанныхПоСигнатуре(МакетПечатнойФормы)); КонецЕсли; Возврат ТипМакета; КонецФункции

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


 

Внешняя печатная форма в управляемом приложении

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

Создание

Как уже было сказано выше, внешняя печатная форма — это просто-напросто внешняя обработка соответствующая некоторым требованиям. Первым требованием является реализация в модуле печатной формы экспортной функции СведенияОВнешнейОбработке().

Итак, создаем новую внешнюю обработку и в модуле объекта этой обработки размещаем примерно такой код:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

Функция СведенияОВнешнейОбработке() Экспорт

ПараметрыРегистрации = Новый Структура;

//указываем сведения о внешней печатной форме

ПараметрыРегистрации.Вставить(“Вид”, “ПечатнаяФорма”);

ПараметрыРегистрации.Вставить(“Версия”, “1.2”);

ПараметрыРегистрации.Вставить(“ВерсияБСП”, “3.0.1.287”);

ПараметрыРегистрации.Вставить(“Наименование”, “Печатная форма для ПКО”);

ПараметрыРегистрации.Вставить(“Информация”, “Внешняя печатная форма для документов”);

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

ПараметрыРегистрации.Вставить(“БезопасныйРежим”, Истина);

//определим документы и/или справочники

//в которых будет использоваться эта печатная форма

ПараметрыРегистрации.Вставить(“Назначение”, Новый Массив);

ПараметрыРегистрации.Назначение.Добавить(“Документ.ПриходныйКассовыйОрдер”);

//используется для дополнительных отчетов

//подключенных к подсистеме “Варианты отчетов”

ПараметрыРегистрации.Вставить(“ОпределитьНастройкиФормы”, Ложь);

//если требуются исключения из безопасного режима, их можно запросить

ПараметрыРегистрации.Вставить(“Разрешения”, Новый Массив);

ПараметрыРегистрации.Разрешения.Добавить(РаботаВБезопасномРежиме.РазрешениеНаИспользованиеИнтернетРесурса(“https”,”yandex.ru”,80,”очень надо”));

//определяем таблицу команд

ПараметрыРегистрации.Вставить(“Команды”, ПолучитьТаблицуКоманд());

//добавляем команду

Команда = ПараметрыРегистрации.Команды.Добавить();

Команда.Представление = “Печатная форма для ПКО (внешняя)”;

Команда.Идентификатор = “ПечатнаяФормаДляПКО”;

Команда.Использование = “ВызовСерверногоМетода”;

Команда.ПоказыватьОповещение = Истина;

Команда.Модификатор = “ПечатьMXL”;

Возврат ПараметрыРегистрации;

КонецФункции

Функция ПолучитьТаблицуКоманд()

Команды = Новый ТаблицаЗначений;

Команды.Колонки.Добавить(“Представление”, Новый ОписаниеТипов(“Строка”));

Команды.Колонки.Добавить(“Идентификатор”, Новый ОписаниеТипов(“Строка”));

Команды.Колонки.Добавить(“Использование”, Новый ОписаниеТипов(“Строка”));

Команды.Колонки.Добавить(“ПоказыватьОповещение”, Новый ОписаниеТипов(“Булево”));

Команды.Колонки.Добавить(“Модификатор”, Новый ОписаниеТипов(“Строка”));

Команды.Колонки.Добавить(“ЗаменяемыеКоманды”, Новый ОписаниеТипов(“Строка”));

Возврат Команды;

КонецФункции

Код в основном прокомментирован, но некоторые моменты нужно обговорить отдельно. Функция СведенияОВнешнейОбработке() является общей для всех внешних объектов. Вид внешнего объекта указывается в параметре «Вид» (у нас указана «ПечатнаяФорма»).

Большинство параметров не являются обязательными для заполнения. В нашем случае обязательно указать параметры «Вид», «Версия» и «Команды» — это обязательные параметры для всех видов внешних объектов («Команды» необязательны для отчетов). Кроме этого будет полезно указать параметры «Назначение». Но вообще, желательно указывать как можно больше информации — это поможет не запутаться как Вашим клиентам так и Вам самим.

Параметр «БезопасныйРежим» со значением «Истина» накладывает следующие ограничения:

  • игнорируется привилегированный режим;
  • запрещена работа с COM;
  • запрещена загрузка внешних компонент;
  • запрещен запуск внешних приложений и команд ОС;
  • запрещен доступ к файловой системе (кроме временных файлов);
  • запрещен доступ к интернету.

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

Кроме функции СведенияОВнешнейОбработке() необходимо реализовать еще одну экспортную функцию — Печать(). Эта функция должна иметь следующие параметры:

  • МассивОбъектов — массив ссылок на объекты, для которых требуется сформировать табличные документы;
  • КоллекцияПечатныхФорм — служебная таблица значений, через нее передаются имена макетов для которых могут быть сформированы табличные документы, а также возвращаются синонимы (представления) макетов, сформированные табличные документы и другая информация;
  • ОбъектыПечати — список значений, к котором устанавливается соответствие между объектами и именами областей печати табличного документа (нужно для возможности печати комплектов документов);
  • ПараметрыВывода — структура с предопределенными ключами, через которую можно вернуть некоторые параметры.

Пример реализации функции Печать():

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт

ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, “ПечатнаяФормаДляПКО”);

Если ПечатнаяФорма Неопределено Тогда

ПечатнаяФорма.ТабличныйДокумент = СформироватьТабличныйДокумент(МассивОбъектов, ОбъектыПечати);

ПечатнаяФорма.СинонимМакета = “Печатная форма для ПКО”;

КонецЕсли;

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

Функция СформироватьТабличныйДокумент(МассивОбъектов, ОбъектыПечати)

ТабДок = Новый ТабличныйДокумент;

Макет = ЭтотОбъект.ПолучитьМакет(“Макет”);

ОбластьСтрока = Макет.ПолучитьОбласть(“Строка”);

ПервыйДокумент = Истина;

Для Каждого ОбъектСсылка Из МассивОбъектов Цикл

Если Не ПервыйДокумент Тогда

//выводим документы на разных страницах

ТабДок.ВывестиГоризонтальныйРазделительСтраниц();

КонецЕсли;

ПервыйДокумент = Ложь;

НомерСтрокиНачало = ТабДок.ВысотаТаблицы + 1;

ОбластьСтрока.Параметры.Документ = ОбъектСсылка;

ТабДок.Вывести(ОбластьСтрока);

//зададим область печати объекта в табличном документе

УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДок,

НомерСтрокиНачало, ОбъектыПечати, ОбъектСсылка);

КонецЦикла;

Возврат ТабДок;

КонецФункции

В коде выше мы находим нашу печатную форму по идентификатору и формируем для нее табличный документ.

Подключение

Подключение нашей внешней печатной формы на примере «Бухгалтерии предприятия, редакция 3.0».

Вкратце повторю основные этапы:

  1. Открываем вкладку «Администрирование» и переходим в раздел «Печатные формы, отчеты и обработки»;
  2. Устанавливаем галку «Дополнительные отчеты и обработки» и переходим в раздел «Дополнительные отчеты и обработки»;
  3. Жмем кнопку «Добавить из файла» и выбираем файл печатной формы;
  4. (Необязательно) Меняем наименование, комментарии, настраиваем видимость, изменяем размещение;
  5. Жмем кнопку «Записать и закрыть».

[править] В модуле формы внешнего отчета

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

Это имя основного реквизита.

3. Перехват и модернизации механизма записи модернизированного пользовательского макета

Механизм находится в функции ОбщийМодуль.УправлениеПечатью.ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище).

Общий модуль УправлениеПечатью мы уже добавили в наше расширение, поэтому сразу добавляем в модуль УравлениеПечатью следующий код:

// Сохраняет пользовательский макет печати в информационной базе.&Вместо(“ЗаписатьМакет”)Процедура simПМВПФ_ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище) Экспорт //Вычленим старший тип объекта метаданных ЧастиИмени = СтрРазделить(ИмяОбъектаМетаданныхМакета, “.”); //Нас интересуют только внешние обработки Если ЧастиИмени[0] = “ВнешняяОбработка” Тогда //Типовой код ИмяМакета = ЧастиИмени[ЧастиИмени.ВГраница()]; ИзмененныйМакет = ПолучитьИзВременногоХранилища(АдресМакетаВоВременномХранилище); ИмяВладельца = “”; Для НомерЧасти = 0 По ЧастиИмени.ВГраница()-1 Цикл Если Не ПустаяСтрока(ИмяВладельца) Тогда ИмяВладельца = ИмяВладельца + “.”; КонецЕсли; ИмяВладельца = ИмяВладельца + ЧастиИмени[НомерЧасти]; КонецЦикла; //+sim нетиповое получение макета для ВнешнейОбработки МакетИзМетаданных = simПМВПФ_ПолучитьМакетВнешнейОбработки(ИмяВладельца,ИмяМакета); //-sim Запись = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьМенеджерЗаписи(); Запись.Объект = ИмяВладельца; Запись.ИмяМакета = ИмяМакета; Если МакетыРазличаются(МакетИзМетаданных, ИзмененныйМакет) Тогда Запись.Использование = Истина; Запись.Макет = Новый ХранилищеЗначения(ИзмененныйМакет, Новый СжатиеДанных(9)); Запись.Записать(); Иначе Запись.Прочитать(); Если Запись.Выбран() Тогда Запись.Удалить(); КонецЕсли; КонецЕсли; Возврат; КонецЕсли; //!!! продолжаем вызов тиоповой процедуры ПродолжитьВызов(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище); КонецПроцедуры

Схема работы кода выглядит аналогично п.2.

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

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

  1. Имя каждой отдельной внешней обработки должно быть уникально
  2. Макеты, которые вы хотите дать на редактирование пользователям, должны префиксироваться согласно правилам БСП (ПФ_MXL_,ПФ_DOC_)
  3. Получать макет необходимо функцией БСП УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету)
  4. Получая область макета для печати, необходимо сначала проверить ее наличие (пользователь мог ее удалить) методом Найти(ИмяОбласти)
    Макет = ЭтотОбъект.ПолучитьМакет(“СоставПоказателей”);
    ТекОбласть = Макет.Области.Найти(ИмяОбласти);
  5. Заполнять параметры макета следует процедурой ЗаполнитьЗначенияСвойств(Область.Параметры, Источник), ровно по той же причине (пользователь может удалить параметры)

Вот, собственно, и все. Буду раз вашим комментариям.

Системные требования

Платформа: не ниже v8.3.11

БСП: v2.4.4.145  v3.0.1.355

Рейтинг
( 1 оценка, среднее 5 из 5 )
Загрузка ...