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

Кому подойдет информация: Программист 1С.
Подойдет для конфигураций: 1С: Бухгалтерия предприятия 8, ред. 3.0, Управление торговлей, ред. 11.

Стояла несложная на первый взгляд задача в рамках перехода с обычного приложения на управляемый интерфейс для внешней печатной формы "переписать" ее код. Задача решалась в управляемом интерфейсе конфигурации 1С: Бухгалтерия 8 редакция 3.0. Но у формы была одна особенность. При обращении к экспортной функции модуля "Печать()" внешней обработки, вызывалась "промежуточная форма" для заполнения некоторых параметров, которые должны были так же выводится в печатную форму. Если для обычного приложения проблемы с такой реализацией не было вообще, то в управляемом приложении столкнулся с кучей сложностей, которые с трудом, но были преодолены. 

Скачать готовое решение можно на странице публикации на Infostart.ru.

Первое: вызов "промежуточной формы". Сначала столкнулся с этой проблемой, но потом было найдено стандартное в таком случае решение. В модуле обработки:

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

    НоваяКоманда = ТаблицаКоманд.Добавить();
    НоваяКоманда.Представление = Представление;
    НоваяКоманда.Идентификатор = Идентификатор;
    НоваяКоманда.Использование = Использование;
    НоваяКоманда.ПоказыватьОповещение = ПоказыватьОповещение;
    НоваяКоманда.Модификатор = Модификатор;

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

Управляемое приложение: Вызов промежуточной формы внешней печатной формы на клиенте

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

&НаКлиенте
Процедура Печать(ИдентификаторВыполняемойКоманды, МассивОбъектовНазначения) Экспорт
    
    Открыть();
КонецПроцедуры

На форме размещается кнопка, в процедуру которой возвращается Табличный документ - результат выполнения кода для получения самой печатной формы:

&НаКлиенте
Процедура Печатать(Команда)
    ТабДокумент = ПечататьНаСервере();
    
    Закрыть();
КонецПроцедуры


Функция ПечататьНаСервере()
    ОбъектФормы = РеквизитФормыВЗначение("Объект");
    ТабДокумент = ОбъектФормы.СформироватьПечатнуюФормуАктНаСписаниеМЦ();
    Возврат ТабДокумент;
КонецФункции

При желании можно далее просто открыть ТабДокумент с помощью метода Показать().

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

Использование типовой формы печати во внешней печатной форме в управляемом интерфейсе

&НаКлиенте
Процедура Печатать(Команда)
    ТабДокумент = ПечататьНаСервере();

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

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

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

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

Процедура СформироватьПечатныеФормы(КоллекцияПечатныхФорм, ИменаМакетов, Отказ)
    
    ...
        //
        //УправлениеПечатью.СформироватьПечатныеФормы(Параметры.ИмяМенеджераПечати, ИменаМакетов,

        УправлениеПечатьюСформироватьПечатныеФормы(Параметры.ИмяМенеджераПечати, ИменаМакетов,
        //\\
    ...
    
КонецПроцедуры

В модуль формы копируется типовая процедура СформироватьПечатныеФормы, переименовывается в моем примере УправлениеПечатьюСформироватьПечатныеФормы, в ней комментируются или изменяются участки кода:

Процедура УправлениеПечатьюСформироватьПечатныеФормы(ИмяМенеджераПечати, Знач ИменаМакетов, МассивОбъектов, ПараметрыПечати,
    КоллекцияПечатныхФорм, ОбъектыПечати = Неопределено, ПараметрыВывода, ДопустимыеТипыОбъектовПечати = Неопределено) Экспорт
    
    // 
    //ПараметрыВывода = ПодготовитьСтруктуруПараметровВывода();

    ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
    //\\    
    ...    
    //
    //КоллекцияПечатныхФорм = ПодготовитьКоллекциюПечатныхФорм(Новый Массив);
    //\\
    
    ...
    //
    //ВнешниеПечатныеФормы = СписокПечатныхФормИзВнешнихИсточников(ИсточникВнешнихПечатныхФорм);
    //\\

 

    ... 
        
        //
        //ИдентификаторыВнешнихПечатныхФорм = ВнешниеПечатныеФормы.ВыгрузитьЗначения();
        //Для Каждого Идентификатор Из ИдентификаторыВнешнихПечатныхФорм Цикл
        //    Если ИменаМакетов.Найти(Идентификатор) = Неопределено Тогда
        //        ИменаМакетов.Добавить(ПрефиксВнешнихПечатныхФорм + Идентификатор);
        //        ДобавленныеВнешниеПечатныеФормы.Добавить(ПрефиксВнешнихПечатныхФорм + Идентификатор);
        //    КонецЕсли;
        //КонецЦикла;
        //\\

    КонецЕсли;

    Для Каждого ИмяМакета Из ИменаМакетов Цикл

        ...
        Если Найти(Идентификатор, ПрефиксВнешнихПечатныхФорм) > 0 Тогда // это внешняя печатная форма
            Идентификатор = Сред(Идентификатор, СтрДлина(ПрефиксВнешнихПечатныхФорм) + 1);
            //
            //ВнешняяПечатнаяФорма = ВнешниеПечатныеФормы.НайтиПоЗначению(Идентификатор);
            //\\

        ...

                        //
                        //СообщитьПечатнаяФормаНедоступна(Объект);
                        //\\

        ...

                    //
                    //СообщитьПечатнаяФормаНедоступна(МассивОбъектов);
                    //\\

        ...

        //
        //ВременнаяКоллекцияДляОднойПечатнойФормы = ПодготовитьКоллекциюПечатныхФорм(Идентификатор);

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

    ...    

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

Минус, который вижу в данной реализации, что если разработчик изменит вид общей формы ""ПечатьДокументов" типовой конфигурации, то возможно, действия потребуется повторять, если будет необходимо, чтобы форма обработки ничем не отличалась от типовой.


© www.azhur-c.ru 2013-2014. Все права защищены. Использование текстов и изображений с данной страницы без письменного разрешения владельца запрещено. При использовании материалов с данной страницы обязательно указание ссылки на данную страницу.

07-10-2014

Журавлев А.С. (www.azhur-c.ru)

Назад

Авторизация
Регистрация     Забыли пароль?

ural-rosaudit.ru - Аудит в сфере ЖКХ, www.ural-rosaudit.ru
azhur-blog.ru - мошенничество в интернете, www.azhur-blog.ru
info-compas.ru - каталог, инфокурсы, видеокурсы, видео курсы, обучение он-лайн, www.info-compas.ru
https://vk.com/effective_ideas - Группа вКонтакте Методы заработка и работы при помощи Интернет

 

Проверить аттестат
Cистема управления контентом Santafox&trade. Санкт-Петербург, Ленинский проспект, д. 23 (812) 545-47-48
Яндекс.Метрика