Каталог решений - Создание новой внешней печатной формы под управляемое приложение с нуля (для начинающих)

Создание новой внешней печатной формы под управляемое приложение с нуля (для начинающих)

Создание новой внешней печатной формы под управляемое приложение с нуля (для начинающих)

В наличии

Сам сейчас работаю в фирме, где еще "обычное приложение" 1С, и переход будет осуществляться где-то через год, но возникла нужда сделать печатную форму под управляемое приложение, везде очень много статей, о том как сделать "подобную" внешнюю печатную форму, типо счёта и т.д, но много моментов проходят как "тут и так все легко и понятно" и не уделяют на мой взгляд должного внимания этим аспектам. Итак я хотел бы поделиться опытом и в подробностях описать этот процесс, надеюсь будет кому-то полезно.

Категория:

Описание

Приступим! Заходим в конфигуратор 1С 8.3 и создаем новую обработку(Я буду делать на примере своей, которую делал для УТ 11 — это будет расписка о получении товаров курьером). В отличие от обычного приложения, чтобы просто добавить вашу внешнюю печатную форму ( далее ВПФ ) в вашу конфигурацию нужно написать код с описанием вашей ВПФ иначе система просто откажет в её добавлении и напишет что отсутствует функция «СведенияОВнешнейОбработке()» в которой и должны находиться данные сведения. Начнём писать, откроем модуль нашей обработки и напишем требуемую функцию. Код я опишу ниже и там же его подробно прокомментирую:

Функция СведенияОВнешнейОбработке() Экспорт
	
	ПараметрыРегистрации = Новый Структура;
	МассивНазначений = Новый Массив;
	МассивНазначений.Добавить("Документ.ЗаказКлиента"); //здесь мы добавляем в наш массив документ или несколько документов(если несколько - такой же строкой кода добавляем еще вид) к которому делаем внешнюю печ. форму
	ПараметрыРегистрации.Вставить("Вид", "ПечатнаяФорма"); //может быть – ПечатнаяФорма, ЗаполнениеОбъекта, ДополнительныйОтчет, СозданиеСвязанныхОбъектов…Здесь выбираем вид, в нашем случае это Печатная форма 
	ПараметрыРегистрации.Вставить("Назначение", МассивНазначений); //Добавляем наш массив со списком документов
	ПараметрыРегистрации.Вставить("Наименование", "Расписка о получении товаров"); //здесь будет имя под которым обработка будет зарегестрирована в справочнике внешних обработок
	ПараметрыРегистрации.Вставить("БезопасныйРежим", ЛОЖЬ); 
	ПараметрыРегистрации.Вставить("Версия", "1.0"); 
	ПараметрыРегистрации.Вставить("Информация", "Печать расписки о получении ТМЦ курьером для доставки"); //здесь пишем описание
	ТаблицаКоманд = ПолучитьТаблицуКоманд(); // добавляем строки команд, особо не мудря можно оставить все по стандарту
	ДобавитьКоманду(ТаблицаКоманд, "Расписка о получении товаров", "РаспискаОПолученииТоваров", "ВызовСерверногоМетода", Истина, "ПечатьMXL"); // заполняем наши строки данными из параметров
	ПараметрыРегистрации.Вставить("Команды", ТаблицаКоманд); // создаём те самые сведения о ВПФ которые запросит управляемое приложение при добавлении оной в конфигурацию.
	
	Возврат ПараметрыРегистрации; //возвращаем их при запросе конфигурации
	
КонецФункции

Функция ПолучитьТаблицуКоманд()
	
	Команды = Новый ТаблицаЗначений;
	Команды.Колонки.Добавить("Представление", Новый ОписаниеТипов("Строка")); //как будет выглядеть описание ВПФ для пользователя
	Команды.Колонки.Добавить("Идентификатор", Новый ОписаниеТипов("Строка")); //имя макета ВПФ
	Команды.Колонки.Добавить("Использование", Новый ОписаниеТипов("Строка")); //ВызовСерверногоМетода или Клиентского метода
	Команды.Колонки.Добавить("ПоказыватьОповещение", Новый ОписаниеТипов("Булево"));
	Команды.Колонки.Добавить("Модификатор", Новый ОписаниеТипов("Строка"));
	Возврат Команды;
	
КонецФункции
Процедура ДобавитьКоманду(ТаблицаКоманд, Представление, Идентификатор, Использование, ПоказыватьОповещение = Ложь, Модификатор = "")
	
	НоваяКоманда = ТаблицаКоманд.Добавить();
	НоваяКоманда.Представление = Представление; 
	НоваяКоманда.Идентификатор = Идентификатор;
	НоваяКоманда.Использование = Использование;
	НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
	НоваяКоманда.Модификатор = Модификатор;
	
КонецПроцедуры 

Сохраним и попробуем добавить нашу пустую обработку в конфигурацию с одними лишь её сведениями. Откроем справочник внешних обработок и жмём добавить. Если всё хорошо — то видим сформировавшееся окно ВПФ, с теми сведениями, которые мы писали.

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

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

Идём в конфигуратор в нашу обработку и создаём макет (табличный документ). У меня это будет «РаспискаОПолученииТоваров», тут отнеситесь внимательно, название вашего Макета должно совпадать с названием макета в сведениях о внешней обработке, иначе платформа просто 

не заполнит макет и выдаст ошибку.

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

(на скрине ошибочка — на самом деле макет называется «РаспискаОПолученииТоваров»

Прокомментирую некоторые иероглифы, слева находятся области таблицы, сделанные для удобства и поэтапного вывода (все пробелы не находящиеся в областях не выведутся и документ схлопнутся и документ будет выглядеть довольно красиво при печати) . Например в коде я буду выводить табличную часть так: сначала выведу область «Строка» как шапку ТЧ, а потом циклом буду выводить область «Строка» и количество строк в печатном документе с наименованием товара у меня совпадет с количеством строк самого документа из который будет печататься данная печатная форма, а итоге получу табличную часть аналогичную тем которые сделаны в счет, торг12 и т.д.

обозначение типа является Параметром в который в коде будет попадать значение из конкретного документа ( в моем случае заказа ), например МойМакет.Параметры.МойПараметр = Значение;

обозначение типа является шаблоном (смешанным типом), он собственно и применяется когда в 1 строке должен быть и тексти параметры ( поглядите на область «шапка» ).

 

Давайте теперь вернемся в наш модуль и попробуем заполнить и распечатать наш макет:

 

Добавляем код:

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода, Отладка=ложь) Экспорт //стандартная процедура печати, она вызовется в тот момент когда вы нажмете "Печать"	
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "РаспиcкаОПолученииТоваров", "Расписка о получении товаров", СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати));
Конецпроведуры

Дабы все было красиво используем процедуру из нашей конфигурации и добавим внутрь только нашу функцию в 4ый параметр «СформироватьПечатнуюФорму(МассивОбъектов[0], ОбъектыПечати)» и опишем её чуть ниже

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

	ТабличныйДокумент.Вывести(ОбластьИтого);
	//заполняем подвал
	ОбластьПодвал = МакетОбработки.ПолучитьОбласть("Подвал");
	ОбластьПодвал.Параметры.Адрес = СсылкаНаДокумент.АдресДоставки;
	ТабличныйДокумент.Вывести(ОбластьПодвал);
	
	ТабличныйДокумент.АвтоМасштаб = Истина;
	
	Возврат ТабличныйДокумент;
	
КонецФункции

Немного комментариев: Прежде всего нужно получить наш макет методом 

ПолучитьМакет();

далее получаем Области нашего макета 

ОбластьИтого = МакетОбработки.ПолучитьОбласть("Итого");

В области заполняем параметры 

ОбластьИтого.Параметры.ТутНазваниеВашегоПараметра = СсылкаНаДокумент.ВашРеквизит

Как только вы заполнили нужные параметры нужно вывести область 

ТабличныйДокумент.Вывести(ОбластьПодвал); 

Если вам нужно вывести таблицу , то циклом заполняем одну и ту же область и выводим её, будьте внимательны и не прихватите лишних полей , пустых например — получится некрасиво. Ну вот в общем то и все 🙂 Если есть вопросы задавайте их в личку или комментарии.

 

has been added to your cart:
Оформление заказа