Создание новой внешней печатной формы под управляемое приложение с нуля (для начинающих)
Сам сейчас работаю в фирме, где еще "обычное приложение" 1С, и переход будет осуществляться где-то через год, но возникла нужда сделать печатную форму под управляемое приложение, везде очень много статей, о том как сделать "подобную" внешнюю печатную форму, типо счёта и т.д, но много моментов проходят как "тут и так все легко и понятно" и не уделяют на мой взгляд должного внимания этим аспектам. Итак я хотел бы поделиться опытом и в подробностях описать этот процесс, надеюсь будет кому-то полезно.
- Описание
- Подробнее
Описание
Приступим! Заходим в конфигуратор 1С 8.3 и создаем новую обработку(Я буду делать на примере своей, которую делал для УТ 11 — это будет расписка о получении товаров курьером). В отличие от обычного приложения, чтобы просто добавить вашу внешнюю печатную форму ( далее ВПФ ) в вашу конфигурацию нужно написать код с описанием вашей ВПФ иначе система просто откажет в её добавлении и напишет что отсутствует функция «СведенияОВнешнейОбработке()» в которой и должны находиться данные сведения. Начнём писать, откроем модуль нашей обработки и напишем требуемую функцию. Код я опишу ниже и там же его подробно прокомментирую:
Функция СведенияОВнешнейОбработке() Экспорт
ПараметрыРегистрации = Новый Структура;
МассивНазначений = Новый Массив;
МассивНазначений.Добавить("Документ.ЗаказКлиента"); //здесь мы добавляем в наш массив документ или несколько документов(если несколько - такой же строкой кода добавляем еще вид) к которому делаем внешнюю печ. форму
ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть – ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов…Здесь выбираем вид, в нашем случае это Печатная форма
ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); //Добавляем наш массив со списком документов
ПараметрыРегистрации.Вставить("Наименование", "Расписка о получении товаров"); //здесь будет имя под которым обработка будет зарегестрирована в справочнике внешних обработок
ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ);
ПараметрыРегистрации.Вставить("Версия", "1.0");
ПараметрыРегистрации.Вставить("Информация", "Печать расписки о получении ТМЦ курьером для доставки"); //здесь пишем описание
ТаблицаКоманд = ПолучитьТаблицуКоманд(); // добавляем строки команд, особо не мудря можно оставить все по стандарту
ДобавитьКоманду(ТаблицаКоманд, "Расписка о получении товаров", "РаспискаОПолученииТоваров", "ВызовСерверногоМетода", Истина, "ПечатьMXL"); // заполняем наши строки данными из параметров
ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); // создаём те самые сведения о ВПФ которые запросит управляемое приложение при добавлении оной в конфигурацию.
Возврат ПараметрыРегистрации; //возвращаем их при запросе конфигурации
КонецФункции
Функция ПолучитьТаблицуКоманд()
Команды = Новый ТаблицаЗначений;
Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); //как будет выглядеть описание ВПФ для пользователя
Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //имя макета ВПФ
Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); //ВызовСерверногоМетода или Клиентского метода
Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
Возврат Команды;
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
НоваяКоманда = ТаблицаКоманд.Добавить();
НоваяКоманда.Представление = Представление;
НоваяКоманда.Идентификатор = Идентификатор;
НоваяКоманда.Использование = Использование;
НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
НоваяКоманда.Модификатор = Модификатор;
КонецПроцедуры
Сохраним и попробуем добавить нашу пустую обработку в конфигурацию с одними лишь её сведениями. Откроем справочник внешних обработок и жмём добавить. Если всё хорошо — то видим сформировавшееся окно ВПФ, с теми сведениями, которые мы писали.
Ну и также открыв любой документ или список документов ( к которым мы его привязывали ) мы увидим что в печати доступна наша внешняя печатная форма. ( прелесть использования универсального механизма )
Теперь давайте сделаем так чтобы при нажатии на нашу кнопку( да, да ту самую на которую вы возможно потыкали и ничего не произошло ) происходила стандартная обработка печати нашей формы.
Идём в конфигуратор в нашу обработку и создаём макет (табличный документ). У меня это будет «РаспискаОПолученииТоваров», тут отнеситесь внимательно, название вашего Макета должно совпадать с названием макета в сведениях о внешней обработке, иначе платформа просто
не заполнит макет и выдаст ошибку.
Путём нехитрых манипуляций с встроенными фишками для работы с табличным документом, я создал вот такой простенький макет:
(на скрине ошибочка — на самом деле макет называется «РаспискаОПолученииТоваров»
Прокомментирую некоторые иероглифы, слева находятся области таблицы, сделанные для удобства и поэтапного вывода (все пробелы не находящиеся в областях не выведутся и документ схлопнутся и документ будет выглядеть довольно красиво при печати) . Например в коде я буду выводить табличную часть так: сначала выведу область «Строка» как шапку ТЧ, а потом циклом буду выводить область «Строка» и количество строк в печатном документе с наименованием товара у меня совпадет с количеством строк самого документа из который будет печататься данная печатная форма, а итоге получу табличную часть аналогичную тем которые сделаны в счет, торг12 и т.д.
обозначение типа является Параметром в который в коде будет попадать значение из конкретного документа ( в моем случае заказа ), например МойМакет.Параметры.МойПараметр = Значение;
обозначение типа является шаблоном (смешанным типом), он собственно и применяется когда в 1 строке должен быть и тексти параметры ( поглядите на область «шапка» ).
Давайте теперь вернемся в наш модуль и попробуем заполнить и распечатать наш макет:
Добавляем код:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода, Отладка=ложь) Экспорт //стандартная процедура печати, она вызовется в тот момент когда вы нажмете "Печать"
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "РаспиcкаОПолученииТоваров", "Расписка о получении товаров", СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати));
Конецпроведуры
Дабы все было красиво используем процедуру из нашей конфигурации и добавим внутрь только нашу функцию в 4ый параметр «СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати)» и опишем её чуть ниже
Функция СформироватьПечатнуюФорму(СсылкаНаДокумент, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РаспиcкаОПолученииТоваров";
МакетОбработки = ПолучитьМакет("РаспиcкаОПолученииТоваров");
//заполняем шапку
ОбластьШапка = МакетОбработки.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.ТекДата = Формат(ТекущаяДата(),"ДЛФ=ДД");
ОбластьШапка.Параметры.Организация = СсылкаНаДокумент.Организация.Наименование;
ОбластьШапка.Параметры.ФИО = СсылкаНаДокумент.Курьер;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ДокументыФизическихЛицСрезПоследних.Серия,
| ДокументыФизическихЛицСрезПоследних.Номер,
| ДокументыФизическихЛицСрезПоследних.ДатаВыдачи,
| ДокументыФизическихЛицСрезПоследних.СрокДействия,
| ДокументыФизическихЛицСрезПоследних.КемВыдан
|ИЗ
| РегистрСведений.ДокументыФизическихЛиц.СрезПоследних(, Физлицо = &Владелец) КАК ДокументыФизическихЛицСрезПоследних
|ГДЕ
| ДокументыФизическихЛицСрезПоследних.ВидДокумента = &ВидДокумента";
Запрос.УстановитьПараметр("Владелец",СсылкаНаДокумент.Курьер);
Запрос.УстановитьПараметр("ВидДокумента",ПредопределенноеЗначение("Справочник.ВидыДокументовФизическихЛиц.ПаспортРФ"));
//выводим шапку в табличный документ
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
ОбластьШапка.Параметры.Серия = Выборка.Серия;
ОбластьШапка.Параметры.Номер = Выборка.Номер;
КонецЕсли;
ТабличныйДокумент.Вывести(ОбластьШапка);
//заполняем строки ТЧ
ОбластьСтроки = МакетОбработки.ПолучитьОбласть("Строка");
ТабличныйДокумент.Вывести(ОбластьСтроки);
ОбластьСтрокиТЧ = МакетОбработки.ПолучитьОбласть("СтрокаТЧ");
Для Каждого ТекущаяСтрока Из СсылкаНаДокумент.Товары Цикл
Если ТекущаяСтрока.Номенклатура.ТипНоменклатуры = Перечисления.ТипыНоменклатуры.Товар Тогда
ОбластьСтрокиТЧ.Параметры.Номенклатура = ТекущаяСтрока.Номенклатура;
ОбластьСтрокиТЧ.Параметры.НомерСтроки = ТекущаяСтрока.НомерСтроки;
ОбластьСтрокиТЧ.Параметры.Цена = ТекущаяСтрока.Цена;
ОбластьСтрокиТЧ.Параметры.Количество = ТекущаяСтрока.Количество;
ОбластьСтрокиТЧ.Параметры.ЕдиницаИзмерения = ТекущаяСтрока.Номенклатура.ЕдиницаИзмерения;
ОбластьСтрокиТЧ.Параметры.Сумма = ТекущаяСтрока.Сумма;
ТабличныйДокумент.Вывести(ОбластьСтрокиТЧ);
КонецЕсли;
КонецЦикла;
//Заполняем Итого
ОбластьИтого = МакетОбработки.ПолучитьОбласть("Итого");
ОбластьИтого.Параметры.Итого = СсылкаНаДокумент.СуммаДокумента;
ОбластьИтого.Параметры.Валюта = СсылкаНаДокумент.Валюта;
ТабличныйДокумент.Вывести(ОбластьИтого);
//заполняем подвал
ОбластьПодвал = МакетОбработки.ПолучитьОбласть("Подвал");
ОбластьПодвал.Параметры.Адрес = СсылкаНаДокумент.АдресДоставки;
ТабличныйДокумент.Вывести(ОбластьПодвал);
ТабличныйДокумент.АвтоМасштаб = Истина;
Возврат ТабличныйДокумент;
КонецФункции
Немного комментариев: Прежде всего нужно получить наш макет методом
ПолучитьМакет();
далее получаем Области нашего макета
ОбластьИтого = МакетОбработки.ПолучитьОбласть("Итого");
В области заполняем параметры
ОбластьИтого.Параметры.ТутНазваниеВашегоПараметра = СсылкаНаДокумент.ВашРеквизит
Как только вы заполнили нужные параметры нужно вывести область
ТабличныйДокумент.Вывести(ОбластьПодвал);
Если вам нужно вывести таблицу , то циклом заполняем одну и ту же область и выводим её, будьте внимательны и не прихватите лишних полей , пустых например — получится некрасиво. Ну вот в общем то и все 🙂 Если есть вопросы задавайте их в личку или комментарии.