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

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

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

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

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

<span style="font-size: 1em; line-height: 1.25em;">Сохраним и попробуем добавим нашу пустую обработку в конфигурацию с одними лишь её сведениями. Откроем справочник внешних обработок и жмём добавить. Если всё хорошо - то видим сформировавшееся окно ВПФ, с теми сведениями которые мы писали.</span>

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

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

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

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

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

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

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

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

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

 

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ВЗЯТО ОТСЮДА