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

Кому подойдет информация: Программист 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
Яндекс.Метрика