Зовнішня друкована форма 1С 8.3 для кероване додаток
Розглянемо написання найпростішої зовнішньої друкованої форми в 1С 8.3 для керованого застосування на прикладі конфігурацій Бухгалтерія 3.0 і Управління торгівлею 11 (дана друкована форма буде працювати в обох цих змінах).
Наприклад нам потрібно написати зовнішню друковану форму до документа Реалізація товарів і послуг: вивести основні дані документа, а так само з табличній частині Товари: номенклатуру, ціну, кількість і суму.
Створення зовнішньої обробки
У конфігураторі 1C Підприємство 8 створюємо зовнішню обробку (Файл-> Новий-> Зовнішня обробка), задаємо ім'я, додаємо реквізит Документ з типом ДокументСсилка.РеалізаціяТоваровУслуг, він не є обов'язковим для роботи друкарської форми, але стане в нагоді нам для її реєстрації в базі.
Створення макета друкарської форми
Додаємо новий макет, тип макета залишаємо Табличний документ. На макеті створюємо три області: Шапка, Дані і Підвал. Зробити це можна виділивши потрібну кількість рядків і натиснувши меню Табліца-> імена-> Призначити ім'я (Ctrl + Shift + N).
Після цього починаємо розташовувати в областях та внесіть необхідні. В шапку виведемо назва друкованої форми, номер документа і організацію, а також намалюємо кордону шапки таблиці і напишемо імена колонок. При створенні параметра у властивостях осередку, на закладці макет слід встановити властивість Заповнення в значення Параметр.
В області Дані створимо параметри для виведення рядків табличної частини (Номенклатура, ціна і т.д.), а в області Підвал для підсумків за кількістю і сумою.
програмування
Зайдемо в модуль об'єкта друкованої форми дії-> Відкрити модуль об'єкта.
Тепер в модулі об'єкта слід створити обов'язкову функцію СведеніяОВнешнейОбработке (). Вона необхідна для реєстрації друкованої форми в довіднику ДополнітельниеОтчетиІОбработкі, в ній збирається структура з даними для підключення форми. Ця функція, а також ряд супутніх їй, практично однакові для всіх друкованих форм, тому їх можна просто копіювати в нову друковану форму нічого не змінюючи.
Розглянемо зміст функції СведеніяОВнешнейОбработке (). Для початку створимо її в модулі:
Функція СведеніяОВнешнейОбработке () Експорт КонецФункцііСтворимо структуру ПараметриРегістраціі в якій і будуть зберігатися всі дані необхідні для реєстрації.
ПараметриРегістраціі = Новий Структура;Створимо масив МассівНазначеній в якому будуть зберігатися найменування документів і довідників з яких буде проводитися друк.
МассівНазначеній = Новий Масив;Найменування нашої друкованої форми запишемо в змінну Найменування, для того що б не прописувати його в ручну винесемо отримання найменування в окрему функцію, яка буде отримувати його з уявлення зовнішньої обробки.
Функція УказатьНаіменованіеВнешнейПечатнойФорми () Найменування = ЕтотОб'ект .Метаданние () Представлення (); Повернення Найменування; КонецФункцііА тепер заповнимо змінну.
Найменування = УказатьНаіменованіеВнешнейПечатнойФорми ();Заповнимо МассівНазначеній використовуючи реквізит зовнішньої обробки Документ. Також винесемо отримання елемента масиву в окрему функцію.
Функція ПолучітьМетаданниеДокументаПечаті () ПолноеІмя = Документ .Метаданние () .ПолноеІмя (); Повернення ПолноеІмя; КонецФункцііА тепер додамо отримані дані в масив.
МассівНазначеній Додамо (ПолучітьМетаданниеДокументаПечаті ());Звичайно цей метод не є правильним для випадку, коли у вас кілька призначень, але для одного цілком годиться.
Приступимо до заповнення структури ПараметриРегістраціі.
Вид зовнішньої обробки, може бути: ЗаполненіеОб'екта, ДополнітельнийОтчет, СозданіеСвязаннихОб'ектов, ПечатнаяФорма і т.д.
ПараметриРегістраціі .Вставіть ( "Вид", "ПечатнаяФорма");Призначення заповнимо вже отриманим масивом:
ПараметриРегістраціі .Вставіть ( "Призначення", МассівНазначеній);Найменування з уже заповненою змінної:
ПараметриРегістраціі .Вставіть ( "Найменування", Найменування);Номер версії можна поставити будь-який за бажанням:
ПараметриРегістраціі .Вставіть ( "Версія", "1.1");Безпечний режим не дасть друкованій формі вносити зміни в базу даних. Але вона у нас абсолютно безпечна =), тому ставимо значення Брехня.
ПараметриРегістраціі .Вставіть ( "БезопаснийРежім", Брехня);В поле Інформація вносимо опис друкованої форми для користувача. Запишемо туди Найменування.
ПараметриРегістраціі .Вставіть ( "Інформація", Найменування);Приступимо до створення команди, яка необхідна для виведення на друк нашої друкованої форми. Наведемо колонки ТабліциКоманд, винісши це в окрему функцію.
Функція ПолучітьТабліцуКоманд () Команди = Новий ТабліцаЗначеній; // як буде виглядати опис печ.форми для користувача Команди Колонка Додамо ( "Подання", Новий ОпісаніеТіпов ( "Рядок")); // ім'я макета печ.форми Команди Колонка Додамо ( "Ідентифікатор", Новий ОпісаніеТіпов ( "Рядок")); // ВизовСерверногоМетода Команди Колонка Додамо ( "Використання", Новий ОпісаніеТіпов ( "Рядок")); Команди Колонка Додамо ( "ПоказиватьОповещеніе", Новий ОпісаніеТіпов ( "Булево")); Команди Колонка Додамо ( "Модифікатор", Новий ОпісаніеТіпов ( "Рядок")); Повернення Команди; КонецФункцііВикличемо зізнався функцію.
ТабліцаКоманд = ПолучітьТабліцуКоманд ();Додамо команду друку, винісши цей процес в окрему функцію:
Функція ДобавітьКоманду (ТабліцаКоманд, Подання, Ідентифікатор, Використання, ПоказиватьОповещеніе = Брехня, Модифікатор = "") НоваяКоманда = ТабліцаКоманд Додамо (); НоваяКоманда. Подання = подання; НоваяКоманда. Ідентифікатор = Ідентифікатор; НоваяКоманда. Використання = Використання; НоваяКоманда. ПоказиватьОповещеніе = ПоказиватьОповещеніе; НоваяКоманда. Модифікатор = Модифікатор; КонецФункцііПараметри функції ДобавітьКоманду:
Виклик функції виглядає так:
ДобавітьКоманду (ТабліцаКоманд, Найменування, УказатьНаіменованіеКомандиПечаті (), "ВизовСерверногоМетода", Істина, "ПечатьMXL");Залишилося передати заповнену таблицю команд в ПараметриРегістраціі:
ПараметриРегістраціі .Вставіть ( "Команди", ТабліцаКоманд);І повернути їх з функції:
Повернення ПараметриРегістраціі;На цьому створення функції СведеніяОВнешнейОбработке () завершено, всі параметри необхідні для реєстрації друкованої форми зібрані. Ось повний код цієї та супутніх функцій:
Функція СведеніяОВнешнейОбработке () Експорт ПараметриРегістраціі = Новий Структура; МассівНазначеній = Новий Масив; Найменування = УказатьНаіменованіеВнешнейПечатнойФорми (); МассівНазначеній Додамо (ПолучітьМетаданниеДокументаПечаті ()); // може бути - ЗаполненіеОб'екта, ДополнітельнийОтчет, СозданіеСвязаннихОб'ектов ... ПараметриРегістраціі .Вставіть ( "Вид", "ПечатнаяФорма"); ПараметриРегістраціі .Вставіть ( "Призначення", МассівНазначеній); // ім'я під яким обробка буде зареєстрована в довіднику зовнішніх обробок ПараметриРегістраціі .Вставіть ( "Найменування", Найменування); ПараметриРегістраціі .Вставіть ( "Версія", "1.1"); ПараметриРегістраціі .Вставіть ( "БезопаснийРежім", Брехня); // так буде виглядати опис печ.форми для користувача ПараметриРегістраціі .Вставіть ( "Інформація", Найменування); ТабліцаКоманд = ПолучітьТабліцуКоманд (); ДобавітьКоманду (ТабліцаКоманд, Найменування, УказатьНаіменованіеКомандиПечаті (), "ВизовСерверногоМетода", Істина, "ПечатьMXL"); ПараметриРегістраціі .Вставіть ( "Команди", ТабліцаКоманд); Повернення ПараметриРегістраціі; КонецФункціі Функція ПолучітьТабліцуКоманд () Команди = Новий ТабліцаЗначеній; // як буде виглядати опис печ.форми для користувача Команди Колонка Додамо ( "Подання", Новий ОпісаніеТіпов ( "Рядок")); // ім'я макета печ.форми Команди Колонка Додамо ( "Ідентифікатор", Новий ОпісаніеТіпов ( "Рядок")); // ВизовСерверногоМетода Команди Колонка Додамо ( "Використання", Новий ОпісаніеТіпов ( "Рядок")); Команди Колонка Додамо ( "ПоказиватьОповещеніе", Новий ОпісаніеТіпов ( "Булево")); Команди Колонка Додамо ( "Модифікатор", Новий ОпісаніеТіпов ( "Рядок")); Повернення Команди; КонецФункціі Функція УказатьНаіменованіеВнешнейПечатнойФорми () Найменування = ЕтотОб'ект .Метаданние () Представлення (); Повернення Найменування; КонецФункціі Функція УказатьНаіменованіеКомандиПечаті () Найменування = ЕтотОб'ект .Метаданние () .ПолноеІмя (); Повернення Найменування; КонецФункціі Функція ПолучітьМетаданниеДокументаПечаті () ПолноеІмя = Документ .Метаданние () .ПолноеІмя (); Повернення ПолноеІмя; КонецФункціі Функція ДобавітьКоманду (ТабліцаКоманд, Подання, Ідентифікатор, Використання, ПоказиватьОповещеніе = Брехня, Модифікатор = "") НоваяКоманда = ТабліцаКоманд Додамо (); НоваяКоманда. Подання = подання; НоваяКоманда. Ідентифікатор = Ідентифікатор; НоваяКоманда. Використання = Використання; НоваяКоманда. ПоказиватьОповещеніе = ПоказиватьОповещеніе; НоваяКоманда. Модифікатор = Модифікатор; КонецФункцііПриступимо до написання коду, який буде формувати нашу друковану форму. Так як при створенні команди друку ми використовували параметр ВизовСерверногоМетода, то в модулі об'єкта створюємо обов'язкову серверну процедуру Друк (якщо використовувати ВизовКліентскогоМетода, то процедура Друк повинна бути клієнтської і розташовуватися в модулі основної форми обробки).
Процедура Друк (МассівОб'ектов, КоллекціяПечатнихФорм, Об'ектиПечаті, ПараметриВивода) Експорт КонецПроцедури- МассівОб'ектов - масив містить посилання на друковані документи або довідники (аналог СсилкаНаОб'ект в звичайному додатку);
- КоллекціяПечатнихФорм - таблиця значень містить сформовані табличні документи;
- Об'ектиПечаті - строковою параметр, в якому передаються імена макетів друкованих форм перераховані через кому;
- ПараметриВивода - параметри виведення табличних документів на друк.
У процедурі Друк нам слід сформувати табличний документ з даними нашої друкованої форми і додати його в Колекцію друкованих форм. Для заповнення табличного документа створимо в модулі об'єкта серверну функцію ПечатьФорми, передамо в параметр масив з посиланнями на друковані документи (МассівОб'ектов).
Функція ПечатьФорми (МассівОб'ектов) КонецФункцііУ функції створимо змінну для табличного документа, в який буде виводиться друкована форма, отримаємо макет і області макета.
ТабДок = новий ТаблічнийДокумент; Макет = ПолучітьМакет ( "Макет"); ОбластьШапкі = Макет .ПолучітьОбласть ( "Шапка"); ОбластьДанние = Макет .ПолучітьОбласть ( "Дані"); ОбластьПодвал = Макет .ПолучітьОбласть ( "Підвал");Для того щоб отримати рядки табличній частини Товари всіх документів, що друкуються використовуємо запит.
Запит = новий запит; Запит .УстановітьПараметр ( "МассівОб'ектов", МассівОб'ектов); Запит .Текст = "ВИБРАТИ | РеалізаціяТоваровУслугТовари.Номенклатура, | РеалізаціяТоваровУслугТовари.Сумма, | РеалізаціяТоваровУслугТовари.Цена, | РеалізаціяТоваровУслугТовари.Колічество, | РеалізаціяТоваровУслугТовари.Ссилка | З | Документ.РеалізаціяТоваровУслуг.Товари ЯК РеалізаціяТоваровУслугТовари | ДЕ | РеалізаціяТоваровУслугТовари.Ссилка В (& МассівОб'ектов) ";У параметр запиту передаємо МассівОб'ектов, що б вказати в умови ДЕ, що нам потрібні дані тільки тих документів з яких виводимо друковану форму. Щоб отримати вибірку запиту, спочатку виконуємо його, а потім вивантажуємо.
ОбщаяВиборка = Запит .Виполніть () .Вигрузіть ();Тепер за допомогою циклу обійдемо всі посилання з масиву об'єктів і в одному табличному документі сформуємо друковані форми для всіх обраних документів.
Для Кожного СсилкаНаОб'ект з МассівОб'ектов Цикл КонецЦікла;В даному циклі почнемо формування друкованих форм кожного з документів.
Заповнимо параметри шапки і виведемо її в табличний документ.
ОбластьШапкі .Параметри .ТекстЗаголовка = "Друкована форма" + СсилкаНаОб'ект .Номер; ОбластьШапкі .Параметри .Організація = СсилкаНаОб'ект .Організація; ТабДок .Вивесті (ОбластьШапкі);З отриманої запитом таблиці значень ОбщаяВиборка виберемо рядки тільки по поточному документу, для цього сформуємо структуру відбору. Поле структури має називатися так само, як і поле таблиці за яким здійснюється пошук.
Відбір = Новий Структура; Відбір .Вставіть ( "Посилання", СсилкаНаОб'ект);Тепер відберемо потрібні рядки використовуючи метод НайтіСтрокі (<Структура відбору>) і отримаємо вибірку по документу.
Вибірка = ОбщаяВиборка .НайтіСтрокі (Відбір);Далі в циклі заповнюємо параметри області Дані для кожного рядка вибірки документа і виводимо їх в табличний документ. Також в циклі вважаємо підсумкові значення кількості і суми. Заповнювати кожен параметр окремо ми не будемо, а використовуємо процедуру ЗаполнітьЗначеніяСвойств ((<Приймач »,« Джерело>) з глобального контексту, вона копіює значення властивостей <Джерела> в якості <Приймача>. Зіставлення проводиться по іменах властивостей. Детальніше про це можна прочитати в синтаксис-помічника 1С Підприємство 8.
ІтогоСумма = 0; ІтогоКолічество = 0; Для Кожного Стор з Вибірка Цикл ЗаполнітьЗначеніяСвойств (ОбластьДанние .Параметри, Стор); ІтогоСумма = ІтогоСумма + Стор .Сумма; ІтогоКолічество = ІтогоКолічество + Стор .Кількість; ТабДок .Вивесті (ОбластьДанние); КонецЦікла;Заповнимо і виведемо область Підвал.
ОбластьПодвал .Параметри .ІтогоКолічество = ІтогоКолічество; ОбластьПодвал .Параметри .ІтогоСумма = ІтогоСумма; ТабДок .Вивесті (ОбластьПодвал);Для того що б друкована форма кожного документа виводилася на окремому аркуші, поставимо горизонтальний роздільник.
ТабДок .ВивестіГорізонтальнийРазделітельСтраніц ();Повертаємо заповнений табличний документ з функції ПечатьФорми.
Повернення ТабДок;Код функції ПечатьФорми цілком:
Функція ПечатьФорми (МассівОб'ектов) Експорт ТабДок = новий ТаблічнийДокумент; Макет = ПолучітьМакет ( "Макет"); ОбластьШапкі = Макет .ПолучітьОбласть ( "Шапка"); ОбластьДанние = Макет .ПолучітьОбласть ( "Дані"); ОбластьПодвал = Макет .ПолучітьОбласть ( "Підвал"); Запит = новий запит; Запит .УстановітьПараметр ( "МассівОб'ектов", МассівОб'ектов); Запит .Текст = "ВИБРАТИ | РеалізаціяТоваровУслугТовари.Номенклатура, | РеалізаціяТоваровУслугТовари.Сумма, | РеалізаціяТоваровУслугТовари.Цена, | РеалізаціяТоваровУслугТовари.Колічество, | РеалізаціяТоваровУслугТовари.Ссилка | З | Документ.РеалізаціяТоваровУслуг.Товари ЯК РеалізаціяТоваровУслугТовари | ДЕ | РеалізаціяТоваровУслугТовари.Ссилка В (& МассівОб'ектов) "; ОбщаяВиборка = Запит .Виполніть () .Вигрузіть (); Для Кожного СсилкаНаОб'ект з МассівОб'ектов Цикл ОбластьШапкі .Параметри .ТекстЗаголовка = "Друкована форма" + СсилкаНаОб'ект .Номер; ОбластьШапкі .Параметри .Організація = СсилкаНаОб'ект .Організація; ТабДок .Вивесті (ОбластьШапкі); Відбір = Новий Структура; Відбір .Вставіть ( "Посилання", СсилкаНаОб'ект); Вибірка = ОбщаяВиборка .НайтіСтрокі (Відбір); ІтогоСумма = 0; ІтогоКолічество = 0; Для Кожного Стор з Вибірка Цикл ЗаполнітьЗначеніяСвойств (ОбластьДанние .Параметри, Стор); ІтогоСумма = ІтогоСумма + Стор .Сумма; ІтогоКолічество = ІтогоКолічество + Стор .Кількість; ТабДок .Вивесті (ОбластьДанние); КонецЦікла; ОбластьПодвал .Параметри .ІтогоКолічество = ІтогоКолічество; ОбластьПодвал .Параметри .ІтогоСумма = ІтогоСумма; ТабДок .Вивесті (ОбластьПодвал); ТабДок .ВивестіГорізонтальнийРазделітельСтраніц (); КонецЦікла; повернення ТабДок; КонецФункцііТепер залишилося додати сформований табличний документ Колекцію друкованих форм. Для додавання табличного документа в колекцію можна скористатися типовою процедурою ВивестіТаблічнийДокументВКоллекцію з модуля УправленіеПечатью (процедура є і в Бухгалтерії 3.0 і в Управління торгівлею 11). У параметри цієї процедури необхідно передати:
- КоллекціяПечатнихФорм - таблиця значень містить сформовані табличні документи ;;
- ІмяМакета - найменування команди друку;
- СінонімМакета - найменування друкованої форми;
- ТаблічнийДокумент - заповнений табличний документ.
Для параметрів ІмяМакета і СінонімМакета використовуємо вже створені нами процедури, які використовувалися для заповнення відомостей про зовнішню обробки. Таким чином процедура Друк буде виглядати наступним чином:
Процедура Друк (МассівОб'ектов, КоллекціяПечатнихФорм, Об'ектиПечаті, ПараметриВивода) Експорт УправленіеПечатью .ВивестіТаблічнийДокументВКоллекцію (КоллекціяПечатнихФорм, УказатьНаіменованіеКомандиПечаті (), УказатьНаіменованіеВнешнейПечатнойФорми (), ПечатьФорми (МассівОб'ектов)); КонецПроцедуриЗверніть увагу, що для заповнення параметра ТаблічнийДокумент викликається функція ПечатьФорми, яка описана вище.
На цьому створення друкованої форми в керованому додатку завершено, файл з нею доступний можна скачати по засланні . Про те, як підключити друковану форму до документа буде розказано в наступній статті.
Далі буде…
Дивіться відео зі створення зовнішньої друкованої форми для керованого застосування: