Skip to content

Внешняя печатная форма (Только программно)

Настройка обработки

Создаем новую внешнюю обработку

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

Модуль формы

////////////////////////////////////////////////////////////////////////////////
// Не забудь забиндить событие формы ПриСозданииНаСервере к обработчику
// В обработчике ПриСозданииНаСервере нужно указать описание типов для списка объектов печати
//
////////////////////////////////////////////////////////////////////////////////
#Область ОбработчикиСобытийФормы
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДополнительнаяОбработка = Неопределено;
ИдентификаторКоманды = "";
ОбъектыНазначения = Новый Массив;
Параметры.Свойство("ДополнительнаяОбработкаСсылка", ДополнительнаяОбработка);
Параметры.Свойство("ИдентификаторКоманды", ИдентификаторКоманды);
Параметры.Свойство("ОбъектыНазначения", ОбъектыНазначения);
Если ТипЗнч(ОбъектыНазначения) <> Тип("Массив") Тогда
ВызватьИсключение "Неверный тип параметра ""Объекты назначения""";
КонецЕсли;
ДобавляемыеРеквизиты = Новый Массив;
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ДополнительнаяОбработкаСсылка",
Новый ОписаниеТипов("СправочникСсылка.ДополнительныеОтчетыИОбработки")));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ИдентификаторКоманды", ОбщегоНазначения.ОписаниеТипаСтрока(0)));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("ОбъектыНазначения", Новый ОписаниеТипов("СписокЗначений")));
ДобавляемыеРеквизиты.Добавить(Новый РеквизитФормы("СписокОбъектовПечати", Новый ОписаниеТипов("СписокЗначений")));
ЭтотОбъект.ИзменитьРеквизиты(ДобавляемыеРеквизиты);
ЭтотОбъект["ДополнительнаяОбработкаСсылка"] = ДополнительнаяОбработка;
ЭтотОбъект["ИдентификаторКоманды"] = ИдентификаторКоманды;
ЭтотОбъект["ОбъектыНазначения"].ЗагрузитьЗначения(ОбъектыНазначения);
НовыйЭлемент = Элементы.Добавить("СписокОбъектовПечати", Тип("ПолеФормы"), ЭтотОбъект);
НовыйЭлемент.Заголовок = "Список объектов печати";
НовыйЭлемент.Вид = ВидПоляФормы.ПолеВвода;
НовыйЭлемент.ПутьКДанным = "СписокОбъектовПечати";
НовыйЭлемент.УстановитьДействие("НачалоВыбора", "СписокОбъектовПечатиНачалоВыбора");
НоваяКоманда = ЭтотОбъект.Команды.Добавить("ТестПечати");
НоваяКоманда.Заголовок = "Тест печати";
НоваяКоманда.Действие = "ТестПечати";
НовыйЭлемент = Элементы.Добавить("КомандаТестПечати", Тип("КнопкаФормы"), КоманднаяПанель);
НовыйЭлемент.Заголовок = "Тест печати";
НовыйЭлемент.ИмяКоманды = "ТестПечати";
НовыйЭлемент.КнопкаПоУмолчанию = Истина;
// ================================================== ВАЖНО =========================================================
// Тут укажи нужжный тип
СписокДокументов = Новый СписокЗначений;
СписокДокументов.ТипЗначения = Новый ОписаниеТипов("ДокументСсылка.МойДокумент");
ЭтотОбъект["СписокОбъектовПечати"] = СписокДокументов;
// ==================================================================================================================
КонецПроцедуры
#КонецОбласти
#Область ОбработчикиКомандФормы
&НаКлиенте
Процедура ТестПечати(Команда)
МассивДокументов = ЭтотОбъект["СписокОбъектовПечати"].ВыгрузитьЗначения();
МассивПечатныхФорм = СписокСформированныхПечатныхФорм(МассивДокументов);
УправлениеПечатьюКлиент.ПечатьДокументов(МассивПечатныхФорм, МассивДокументов ,ЭтотОбъект);
КонецПроцедуры
#КонецОбласти
#Область СлужебныеПроцедурыИФункции
&НаКлиенте
Процедура Печать(ИмяКоманды, МассивОбъектов, ПараметрыПечати = Неопределено,
КоллекцияПечатныхФорм = Неопределено, ОбъектыПечати = Неопределено, ПараметрыВывода = Неопределено) Экспорт
ПараметрыИсточника = Новый Структура;
ПараметрыИсточника.Вставить("ИдентификаторКоманды", ЭтотОбъект["ИдентификаторКоманды"]);
ПараметрыИсточника.Вставить("ОбъектыНазначения", ЭтотОбъект["ОбъектыНазначения"]);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("ИсточникДанных", ЭтотОбъект["ДополнительнаяОбработкаСсылка"]);
ПараметрыФормы.Вставить("ПараметрыИсточника", ПараметрыИсточника);
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыФормы);
КонецПроцедуры
&НаСервере
Функция СписокСформированныхПечатныхФорм(МассивДокументов)
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
// ТУТ ТОТ ЖЕ ИДЕНТИФИКАТОР, ЧТО И В МОДУЛЕ ОБЪЕКТА ОБРАБОТКИ
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ПФ_MXL_БиркаНесоответствующейПродукции");
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
ОбработкаОбъект.Печать(МассивДокументов, КоллекцияПечатныхФорм, МассивДокументов, ПараметрыВывода);
МассивПечатныхФорм = ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
Возврат МассивПечатныхФорм;
КонецФункции
#КонецОбласти

Модуль объекта обработки

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