Warning
Данная статья не претендует на оригинальность и не является конечным решением. Подходы решения задач и примеры программного кода несут исключительно обучающий характер. |
Часто возникает ситуация, когда нужно взять стандартную печатную форму конфигурации и модифицировать ее. В таком случае ее делают внешней и уже потом модифицируют, добавляя некоторую приставку к представлению команды печати.
Но сама по себе процедура выноса печатной формы во внешнюю, почти всегда несколько проблематична и сопровождается изобретением очередного велосипеда для вызова стандартной процедуры печати,чтоб ее отлаживать во время модификации:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыПечати) Экспорт
ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "DefaultMXL");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = ПолучитьТаблиныйДокументПоУмолчанию(МассивОбъектов, ОбъектыПечати);
КонецЕсли;
КонецПроцедуры
Думаю не только мне надоело изобретать велосипеды для ее вызова.
Это вдохновило меня на разработку следующей стандартной формы:
Программная реализация:
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// получим сведения о внешней обработке
СведенияОВнешнейОбработке = РеквизитФормыВЗначение("Объект").СведенияОВнешнейОбработке();
// загрузим все идентификаторы и представления команд в таблицу формы
ТаблицаКоманд.Загрузить(СведенияОВнешнейОбработке.Команды);
// заполним список выбора команд внешней обработки
Элементы.КомандаПечати.СписокВыбора.ЗагрузитьЗначения(СведенияОВнешнейОбработке.Команды.ВыгрузитьКолонку("Представление"));
// установим тип списка значений - что печтает эта форма
ТипыОбъектовПечати = СтрЗаменить(СтрСоединить(СведенияОВнешнейОбработке.Назначение, ","), ".", "Ссылка.");
ОбъектыПечати.ТипЗначения = Новый ОписаниеТипов(ТипыОбъектовПечати);
// если эту форму открыли из формы документа - заполним документ и выбранную команду печати
Если Параметры.ОбъектыНазначения <> Неопределено Тогда
ОбъектыПечати.ЗагрузитьЗначения(Параметры.ОбъектыНазначения);
КомандаПечати = СведенияОВнешнейОбработке.Команды.Найти(Параметры.ИдентификаторКоманды).Представление;
ИначеЕсли ТаблицаКоманд.Количество() = 1 Тогда
КомандаПечати = ТаблицаКоманд[0].Представление;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПодготовитьКоллекциюПечатныхФорм(Знач Идентификатор)
Результат = Новый ТаблицаЗначений;
Для Каждого ИмяКолонки Из УправлениеПечатьюКлиентСервер.ИменаПолейКоллекцииПечатныхФорм() Цикл
Результат.Колонки.Добавить(ИмяКолонки);
КонецЦикла;
ПечатнаяФорма = Результат.Добавить();
ПечатнаяФорма.ИмяМакета = Идентификатор;
ПечатнаяФорма.ИмяВРЕГ = ВРег(Идентификатор);
ПечатнаяФорма.Экземпляров = 1;
Возврат Результат;
КонецФункции
&НаСервере
Функция СформироватьИЗаполнитьКоллекциюПечатныхФорм()
// получим выбранный идентификатор
ИдентификаторКоманды = ТаблицаКоманд.Выгрузить().Найти(КомандаПечати).Идентификатор;
// создадим новую коллекцию ПФ
КоллекцияПечатныхФорм = ПодготовитьКоллекциюПечатныхФорм(ИдентификаторКоманды); // раньше была экспортной в УправлениеПечатью
// установим новые парметры вывода по умолчанию
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// выполним заполнение коллекции
РеквизитФормыВЗначение("Объект").Печать(ОбъектыПечати.ВыгрузитьЗначения(), КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// вернем коллекцию на клиент
Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
КонецФункции
&НаКлиенте
Процедура ВыполнитьПечать(Команда)
// проверим не забыли ли ввести все данные
Если НЕ ОбъектыПечати.Количество() ИЛИ ПустаяСтрока(КомандаПечати) Тогда
Возврат;
КонецЕсли;
КоллекцияПечатныхФорм = СформироватьИЗаполнитьКоллекциюПечатныхФорм();
// подготовим параметры открытия общей формы ПечатьДокументов
ПараметрыОткрытия = Новый Структура;
ПараметрыОткрытия.Вставить("ПараметрыПечати", Неопределено);
ПараметрыОткрытия.Вставить("КоллекцияПечатныхФорм", КоллекцияПечатныхФорм);
ПараметрыОткрытия.Вставить("ПараметрКоманды", ОбъектыПечати.ВыгрузитьЗначения());
// откроем форму
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ЭтаФорма);
//ЭтаФорма.Закрыть();
КонецПроцедуры
Описание:
- Гибкая реализация, которая подойдет для внешней печатной формы любого документа;
- Поддерживает вызов из формы документа (вдруг нужно будет заполнять какие-то реквизиты из этой формы печати);
- Для отображения табличного документа используется стандартная общая форма печати.
Зависимости:
- Наличие БСП v3;
- Управляемое приложение.
(1)
В последней БСП она перестала быть экспортной.
На бух 3.0.70.39 не сработало. Видимо писалось для устаревшей БСП
Показать
Переделал:
Показать
(2)
УправлениеПечатьюКлиентСервер.ИменаПолейКоллекцииПечатныхФорм() тоже перестала быть экпортной в последних релизах.