Универсальная Форма для внешней печатной формы документа





Универсальная форма вызова процедуры «Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыПечати)», чтобы каждый раз не изобретать велосипед! Реализация протестирована на 1С 8.3.12.1714 (x64).

Warning

Данная статья не претендует на оригинальность и не является конечным решением.

Подходы решения задач и примеры программного кода несут исключительно обучающий характер.

 

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

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

Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыПечати) Экспорт

ПечатнаяФорма = УправлениеПечатью.СведенияОПечатнойФорме(КоллекцияПечатныхФорм, "DefaultMXL");
Если ПечатнаяФорма <> Неопределено Тогда
ПечатнаяФорма.ТабличныйДокумент = ПолучитьТаблиныйДокументПоУмолчанию(МассивОбъектов, ОбъектыПечати);
КонецЕсли;

КонецПроцедуры

Думаю не только мне надоело изобретать велосипеды для ее вызова.

Это вдохновило меня на разработку следующей стандартной формы:

Программная реализация:


&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
// получим сведения о внешней обработке
СведенияОВнешнейОбработке = РеквизитФормыВЗначение("Объект").СведенияОВнешнейОбработке();

// загрузим все идентификаторы и представления команд в таблицу формы
ТаблицаКоманд.Загрузить(СведенияОВнешнейОбработке.Команды);
// заполним список выбора команд внешней обработки
Элементы.КомандаПечати.СписокВыбора.ЗагрузитьЗначения(СведенияОВнешнейОбработке.Команды.ВыгрузитьКолонку("Представление"));

// установим тип списка значений - что печтает эта форма
ТипыОбъектовПечати = СтрЗаменить(СтрСоединить(СведенияОВнешнейОбработке.Назначение, ","), ".", "Ссылка.");
ОбъектыПечати.ТипЗначения = Новый ОписаниеТипов(ТипыОбъектовПечати);

// если эту форму открыли из формы документа - заполним документ и выбранную команду печати
Если Параметры.ОбъектыНазначения <> Неопределено Тогда
ОбъектыПечати.ЗагрузитьЗначения(Параметры.ОбъектыНазначения);
КомандаПечати = СведенияОВнешнейОбработке.Команды.Найти(Параметры.ИдентификаторКоманды).Представление;
ИначеЕсли ТаблицаКоманд.Количество() = 1 Тогда
КомандаПечати = ТаблицаКоманд[0].Представление;
КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Функция ПодготовитьКоллекциюПечатныхФорм(Знач Идентификатор)

Результат = Новый ТаблицаЗначений;
Для Каждого ИмяКолонки Из УправлениеПечатьюКлиентСервер.ИменаПолейКоллекцииПечатныхФорм() Цикл
Результат.Колонки.Добавить(ИмяКолонки);
КонецЦикла;
ПечатнаяФорма = Результат.Добавить();
ПечатнаяФорма.ИмяМакета = Идентификатор;
ПечатнаяФорма.ИмяВРЕГ = ВРег(Идентификатор);
ПечатнаяФорма.Экземпляров = 1;
Возврат Результат;

КонецФункции

&НаСервере
Функция СформироватьИЗаполнитьКоллекциюПечатныхФорм()
// получим выбранный идентификатор
ИдентификаторКоманды = ТаблицаКоманд.Выгрузить().Найти(КомандаПечати).Идентификатор;
// создадим новую коллекцию ПФ
КоллекцияПечатныхФорм = ПодготовитьКоллекциюПечатныхФорм(ИдентификаторКоманды); // раньше была экспортной в УправлениеПечатью
// установим новые парметры вывода по умолчанию
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
// выполним заполнение коллекции
РеквизитФормыВЗначение("Объект").Печать(ОбъектыПечати.ВыгрузитьЗначения(), КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// вернем коллекцию на клиент
Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);

КонецФункции

&НаКлиенте
Процедура ВыполнитьПечать(Команда)

// проверим не забыли ли ввести все данные
Если НЕ ОбъектыПечати.Количество() ИЛИ ПустаяСтрока(КомандаПечати) Тогда
Возврат;
КонецЕсли;

КоллекцияПечатныхФорм = СформироватьИЗаполнитьКоллекциюПечатныхФорм();

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

// откроем форму
ОткрытьФорму("ОбщаяФорма.ПечатьДокументов", ПараметрыОткрытия, ЭтаФорма);
//ЭтаФорма.Закрыть();

КонецПроцедуры

 

Описание:

  • Гибкая реализация, которая подойдет для внешней печатной формы любого документа;
  • Поддерживает вызов из формы документа (вдруг нужно будет заполнять какие-то реквизиты из этой формы печати);
  • Для отображения табличного документа используется стандартная общая форма печати.

Зависимости:

  • Наличие БСП v3;
  • Управляемое приложение.

 

3 Comments

  1. Eret1k

    (1)

    для чего вы написали свою реализацию ПодготовитьКоллекциюПечатныхФорм()

    В последней БСП она перестала быть экспортной.

    Reply
  2. ah7777777

    На бух 3.0.70.39 не сработало. Видимо писалось для устаревшей БСП

    &НаСервереБезКонтекста
    Функция ПодготовитьКоллекциюПечатныхФорм(Знач Идентификатор)
    
    Результат = Новый ТаблицаЗначений;
    Для Каждого ИмяКолонки Из УправлениеПечатьюКлиентСервер.ИменаПолейКоллекцииПечатныхФорм() Цикл
    Результат.Колонки.Добавить(ИмяКолонки);
    КонецЦикла;
    ПечатнаяФорма = Результат.Добавить();
    ПечатнаяФорма.ИмяМакета = Идентификатор;
    ПечатнаяФорма.ИмяВРЕГ = ВРег(Идентификатор);
    ПечатнаяФорма.Экземпляров = 1;
    Возврат Результат;
    
    КонецФункции

    Показать

    Переделал:

    &НаСервереБезКонтекста
    Функция ПодготовитьКоллекциюПечатныхФорм(Знач Идентификатор)
    
    Результат =УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм(Идентификатор);
    
    //ПечатнаяФорма = Результат.Добавить();
    //ПечатнаяФорма.ИмяМакета = Идентификатор;
    //ПечатнаяФорма.ИмяВРЕГ = ВРег(Идентификатор);
    //ПечатнаяФорма.Экземпляров = 1;
    Возврат Результат;
    
    КонецФункции
    

    Показать

    Reply
  3. e-lexa

    (2)

    УправлениеПечатьюКлиентСервер.ИменаПолейКоллекцииПечатныхФорм() тоже перестала быть экпортной в последних релизах.

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *