Створення зовнішньої друкованої форми в керованому додатку на прикладі конфігурації зарплата і
Рейтинг: 5/5
Сьогодні хочу розповісти Вам як створювати зовнішні друковані форми для конфігурації "Зарплата і Управління Персоналом 3.0". Як відомо в ЗУП 3.0 використана бібліотека стандратною підсистем, а значить струтура обробки виглядає зовсім по іншому. Коли мені вперше довелося робити друковану форму для БСП в керованих формах (тоді це була УТ 11), першим ділом я поліз на диск ІТС з метою знайти там докладну документацію, про те які експортні процедури, з якими параметрами повинні бути в обрабтке і як воно все працює. Тут ІТС мене трохи розчарував, тому що там все розказано, про те, як процедури повинні виглядати в модулі документа, а у зовнішній друкованій формі параметри процедури "друк" переставлені місцями, тому довелося шукати інформацію в інших джерелах і колупати підсистему зсередини.
Ну що ж, почнемо. Те, що у нас вийде в кінці, цілком можна буде використовувати як шаблон.
Крок перший - очевидний. Створюємо нову обробку. Дамо її довільне ім'я: "ОбразецПечаті".
Крок другий. Створимо макет. Оскільки у нас тестовий приклад, то макет я створю найпростіший, без єдиного параметра.
Крок третій - найцікавіший. Відкриваємо модуль об'єкта і починаємо програмувати. Згідно БСП при реєстрації зовнішньої обробки, вона (обробка) повинна повідомити, що вона вміє, до яких об'єктів вона прив'язана, як вона називається. На питання, що вона вміє обробка повинна повернути список команд - це таблиця значень. У нашому випадку обробка вміє виводити одну друковану форму, тому команда буде всього одна. Для формування таблиці значень визначимо пару процедур, які у всіх зовнішніх друкованих формах завжди будуть однаковими:
// процедура, яка готує структуру таблиці команд
// Створимо порожню таблицю команд і колонки в ній
Команди = Новий ТабліцаЗначеній;
// Як буде виглядати опис друкованої форми для користувача
Команди.Колонкі.Добавіть ( "Подання", Новий ОпісаніеТіпов ( "Рядок"));
// Ім'я нашого макета, що б могли відрізнити викликану команду в обробці друку
Команди.Колонкі.Добавіть ( "Ідентифікатор", Новий ОпісаніеТіпов ( "Рядок"));
// Тут задається, як повинна викликатися команда обробки
// Можливі варіанти:
// - ОткритіеФорми - в цьому випадку в колонці ідентифікатор має бути зазначено ім'я форми, яке повинна буде відкрити система
// - ВизовКліентскогоМетода - викликати клієнтську експортну процедуру з модуля форми обробки
// - ВизовСерверногоМетода - викликати серверну експортну процедуру з модуля об'єкта обробки
Команди.Колонкі.Добавіть ( "Використання", Новий ОпісаніеТіпов ( "Рядок"));
// Наступний параметр вказує, чи потрібно показувати сповіщення при початку і завершення роботи обробки. Не має сенсу при відкритті форми
Команди.Колонкі.Добавіть ( "ПоказиватьОповещеніе", Новий ОпісаніеТіпов ( "Булево"));
// Для друкованої форми повинен містити рядок ПечатьMXL
Команди.Колонкі.Добавіть ( "Модифікатор", Новий ОпісаніеТіпов ( "Рядок"));
// Створює в таблиці команд новий рядок
Функція ДобавітьКоманду (ТабліцаКоманд, Подання, Ідентифікатор, Використання, ПоказиватьОповещеніе = Брехня, Модифікатор = "")
НоваяКоманда = ТабліцаКоманд.Добавіть ();
НоваяКоманда. Подання = подання;
НоваяКоманда. Ідентифікатор = Ідентифікатор;
НоваяКоманда. Використання = Використання;
НоваяКоманда. ПоказиватьОповещеніе = ПоказиватьОповещеніе;
НоваяКоманда. Модифікатор = Модифікатор;
КонецФункціі
Далі починаємо експортну програмувати процедуру, яка буде викликатися програмою, при додаванні файлу зовнішньої обробки в довідник.
Функція СведеніяОВнешнейОбработке () Експорт
ПараметриРегістраціі = Новий Структура;
МассівНазначеній = Новий Масив;
МассівНазначеній.Добавіть ( "Документ.ПріемНаРаботу");
ПараметриРегістраціі.Вставіть ( "Вид", "ПечатнаяФорма"); // може бути - ЗаполненіеОб'екта, ДополнітельнийОтчет, СозданіеСвязаннихОб'ектов.
ПараметриРегістраціі.Вставіть ( "Призначення", МассівНазначеній);
ПараметриРегістраціі.Вставіть ( "Найменування", "Привіт світ"); // ім'я під яким обробка буде зареєстрована в довіднику зовнішніх обробок
ПараметриРегістраціі.Вставіть ( "Версія", "1.0");
ПараметриРегістраціі.Вставіть ( "БезопаснийРежім", ІСТИНА);
ПараметриРегістраціі.Вставіть ( "Інформація", "Зразок"); // так буде виглядати опис печ.форми для користувача
ТабліцаКоманд = ПолучітьТабліцуКоманд ();
ДобавітьКоманду (ТабліцаКоманд, "Привіт світ", "Макет", "ВизовСерверногоМетода", Істина, "ПечатьMXL");
ПараметриРегістраціі.Вставіть ( "Команди", ТабліцаКоманд);
Повернення ПараметриРегістраціі;
КонецФункціі
Власне в ній і доведеться Вам колупати кожен раз, коли Ви створюєте нову зовнішню друковану форму. З шматка коду видно, що прив'язувати її ми будемо до документа "Прийом на роботу", відповідно Ви пишете своє. Називатися друкована форма у нас буде "Привіт світ", знову таки міняємо на своє. Ось тут в шаблоні зручно буде написати явну білеберду, щоб вона впадала в очі, щоб не забути її виправити потім, на мій поглядом "Привіт світ" підходить як не можна до речі. Версія - це для себе, пишіть що хочете, вона буде відображатися у формі елемента довідника зовнішніх обробок. Слово "ЗРАЗОК" - теж видно тільки в формі довідника друкованих форм. Далі додаємо команду, ось тут другим параметрів передається ім'я кнопки, це те, що побачить користувач в документі в пункті меню "друк".
Крок четвертий - не менш цікавий.
-А ось і ні, тепер не функція, а процедура.
-А як повернути макет?
-Послати його в функцію глобального модуля підсистеми друку.
Ось текст цієї процедури:
Процедура Друк (МассівОб'ектов, КоллекціяПечатнихФорм, Об'ектиПечаті, ПараметриВивода) Експорт
Якщо УправленіеПечатью.НужноПечататьМакет (КоллекціяПечатнихФорм, "Макет") Тоді
УправленіеПечатью.ВивестіТаблічнийДокументВКоллекцію (КоллекціяПечатнихФорм,
"Макет", "Макет",
СформіроватьТабДокумнтОбразца (МассівОб'ектов, Об'ектиПечаті));
КонецЕсли;
КонецПроцедури
Тепер разясненія. У першому рядку процедури йде трохи непоняное умова. Справа в тому, що при виклику процедури друку система передає нам таблицю значень, в якій зазначено, що нам треба надрукувати. Посути функція УправленіеПечатью.НужноПечататьМакет (.) Перевіряє наявність в таблиці значень рядка в якій в колонці "ІмяВРЕГ" рядки з назвою макета. На практиці в більшості випадків річ марна, тому що наша обробка буде вміти формувати тільки одну друковану форму. Тобто цю умову можна опустити і на працездатність це не вплине.
Далі УправленіеПечатью.ВивестіТаблічнийДокументВКоллекцію (.) - вона то якраз і додає табличний макет куди потрібно, щоб потім вивести його на екран. Якщо Вам потрібно показати свій табличний документ в своєму вікні (не в типовому), то чи не викликайте цю процедуру, а просто напишіть тут свій код.
Ще хочу додати, що процедура Друк виконується на клієнті і при необхідності Ви можете тут відкрити довільну форму, з метою запитати додаткову інформацію у користувача необхідну для друку.
Далі СформіроватьТабДокумнтОбразца (.) - це функція, яку нам належить написати в модулі обробки і яка повертає табличний документ. У 100 з 100 випадків вона буде серверна, тому що нам треба отримати значення реквізитів з об'єктів перерахованих в параметрі "МассівОб'ектов".
Крок п'ятий - формуємо макет.
УРА, ми нарешті почнемо алгоритму формування макета, отримання даних і т.д.
Функція СформіроватьТабДокумнтОбразца (МассівОб'ектов, Об'ектиПечаті)
табДок = Новий ТаблічнийДокумент;
макет = ПолучітьМакет ( "Макет");
областьШапка = Макет.ПолучітьОбласть ( "Шапка");
табДок.Вивесті (областьШапка);
Ось власне і все, спасибі за увагу
Я Вам набрехав
Розгорнув базу УТ 11.0.9.5 Демо
Все нормально працює.
У модулі менеджера документа (авансовий звіт наприклад) 5 параметрів
Процедура Друк (МассівОб'ектов, ПараметриПечаті. КоллекціяПечатн ихФорм, Об'ектиПечаті, ПараметриВивода) Експорт
А в нашій обробці - 4. Не треба копіювати процедуру друк, копіюйте функцію, яка повертає табличний документ. У моїй процедурі друк підмінити мій виклик "СформіроватьТа бДокумнтОбразца (.)" На виклик того, що Ви скопіювали
Ось хоч стріляйте!
Процедура Друк (МассівОб'ектов, КоллекціяПечатн ихФорм, Об'ектиПечаті, ПараметриВивода) Експорт
Якщо УправленіеПечатью.НужноПечататьМакет (КоллекціяПечатн ихФорм, "ПФ_MXL_ЗаявкаТ ребованіеНаСкла д") Тоді
УправленіеПечатью.ВивестіТаблічнийДокументВКоллекцію (КоллекціяПечатн ихФорм,
"ПФ_MXL_ЗаявкаТ ребованіеНаСкла д", "ПФ_MXL_ЗаявкаТ ребованіеНаСкла д",
СформіроватьПеч атнуюФормуЗаказ НаПеремещеніе (М ассівОб'ектов, Об'ектиПечаті));
КонецЕсли;
КонецПроцедури
Недостатньо фактичних параметрів в модулі (Загальний модуль ДополнітельниОт четІОбработкі, 746 рядок)