gifts2017

УТ 11. Динамическое изменение MXL-макета внешней печатной формы в режиме 1С.

Опубликовал Александр Гуляев (gavrikprog) в раздел Программирование - Практика программирования

Хотите изменить оформление макета внешней печатной формы динамически ?
Одна из целей - скопировать существующую внешнюю печатную форму и немного исправить форму, ну или просто картинку добавить попросили по-быстрому.

В общем понадобилось клиенту сгенерировать много внешних печатных форм с отличающимися визуально макетами(где то шрифт изменить, где то картинку добавить), естественно код сделан быстро - остальное делать не охота. Предоставил ему делать то, что он хочет.


Продолжая мысль, и написав универсально модуль заполнения Табличного документа, можно в режиме 1С перемещать параметры, т.е. расположение к примеру Представления заказчика независимо от его расположения в макете, хоть в подвале пусть пользователь его выведет, только правильно назовет параметр.

1С:Предприятие 8.2 (8.2.14.533),  Управление торговлей, редакция 11.0 (11.0.7.2)

Макеты можем отредактировать на Администрирование - Макеты печатных форм. Наши будут в самом низу

 

Режим конфигуратор, изменения:

Регистр Сведений - ПользовательскиеМакетыПечати

Открываем форму МакетыПечатныхФорм и вносим следующие изменения

//********************************************************************************************

&НаСервере

      Процедура ЗаполнитьСписокМетаданных(Фильтр = Неопределено)

         
СписокМакетовДерево = РеквизитФормыВЗначение("СписокМакетов");

         
ЗаполнитьДеревоПоКоллекцииМетаданных(СписокМакетовДерево, Метаданные.Документы, Ложь, Фильтр);
         
ЗаполнитьДеревоПоКоллекцииМетаданных(СписокМакетовДерево, Метаданные.Обработки, Ложь);
         
ЗаполнитьДеревоПоКоллекцииМетаданных(СписокМакетовДерево, Метаданные.ОбщиеМакеты, Истина);

         
//+gavrikprog

          //тут не запрос, потому что так быстро отлажиматься - у меня одна внешняя форма в тесте
         
Выборка=Справочники.ДополнительныеОтчетыИОбработки.Выбрать();
          Пока
Выборка.Следующий() Цикл
             
абОбработкаEPF=Выборка.Ссылка.ХранилищеОбработки.Получить();
             
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
             
абОбработкаEPF.Записать(ИмяВременногоФайла);
             
абОбработка=ВнешниеОбработки.Создать(ИмяВременногоФайла );
             
ДобавитьКоллекциюМакетов(абОбработка.Метаданные().Макеты,
             
СписокМакетовДерево,
             
"Справочники.ДополнительныеОтчетыИОбработки/"+Выборка.Ссылка.УникальныйИдентификатор()+"#",
             
Выборка.Ссылка.Наименование,
             
Фильтр);

          КонецЦикла;
         
//-gavrikprog

         
Если СписокМакетовДерево.Строки.Количество() > 0 Тогда

 

//********************************************************************************************

Также изменения модуля УправлениеПечатью
//********************************************************************************************

Функция ПолучитьМакет(ПолныйПутьКМакету) Экспорт

   
ЧастиПути = СтрЗаменить(ПолныйПутьКМакету, ".", Символы.ПС);

    Если
СтрЧислоСтрок(ЧастиПути) = 3 Тогда

       
//+gavrikprog
       
Если Лев(ПолныйПутьКМакету,12)="Справочники." Тогда
           
абПозиция=Найти(ПолныйПутьКМакету,"/");
           
абПозиция1=Найти(ПолныйПутьКМакету,"#");;
            Если
абПозиция<>0 Тогда
               
СтрокаУИД=Сред(ПолныйПутьКМакету,абПозиция+1,абПозиция1-абПозиция-1);
               
УИД=Новый УникальныйИдентификатор(СтрокаУИД);
               
абОбъект=Справочники.ДополнительныеОтчетыИОбработки.ПолучитьСсылку(УИД);

               
Запрос = Новый Запрос;
               
Запрос.Текст =
                   
"ВЫБРАТЬ
                    |    ПользовательскиеМакетыПечати.ИмяМакета,
                    |    ПользовательскиеМакетыПечати.Объект,
                    |    ПользовательскиеМакетыПечати.Макет,
                    |    ПользовательскиеМакетыПечати.Использование
                    |ИЗ
                    |    РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати
                    |ГДЕ
                    |    ПользовательскиеМакетыПечати.Объект ПОДОБНО &Объект"
;

               
Запрос.УстановитьПараметр("Объект", "%"+СтрокаУИД+"%");

               
Результат = Запрос.Выполнить();

               
ВыборкаДетальныеЗаписи = Результат.Выбрать();

                Если
ВыборкаДетальныеЗаписи.Следующий() Тогда
                   
абМакет=ВыборкаДетальныеЗаписи.Макет.Получить();
                   
Результат = ПолучитьТабличныйДокументПоДвоичнымДанным(абМакет);
                    Возврат
Результат;
                Иначе
                    Если
абОбъект<>Справочники.ДополнительныеОтчетыИОбработки.ПустаяСсылка() Тогда
                       
абОбработкаEPF=абОбъект.ХранилищеОбработки.Получить();
                       
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
                       
абОбработкаEPF.Записать(ИмяВременногоФайла);
                       
абОбработка=ВнешниеОбработки.Создать(ИмяВременногоФайла );
                       
абМакет=абОбработка.ПолучитьМакет("аб_ПФ_MXL_Заказ");
                        Возврат 
абМакет;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        Иначе
           
ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1) + "." + СтрПолучитьСтроку(ЧастиПути, 2);
           
ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 3);
        КонецЕсли;
       
//ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1) + "." + СтрПолучитьСтроку(ЧастиПути, 2);
        //ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 3);
        //-gavrikprog

   
ИначеЕсли СтрЧислоСтрок(ЧастиПути) = 2 Тогда
       
ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1);
       
ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 2);
    Иначе
        ВызватьИсключение
НСтр("ru = 'Некорректные параметры функции.'");
    КонецЕсли;


//********************************************************************************************

Общий модуль "ДополнительныеОтчетыИОбработки"
//********************************************************************************************

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

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

   
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();

   
ОбъектыПечати = Новый СписокЗначений;

   
ВнешняяОбработкаОбъект = ПолучитьОбъектВнешнейОбработки(ИсточникДанных, ПараметрыИсточника.БезопасныйРежим);

   
//+gavrikprog
   
ПараметрыВывода.Вставить("абОбработка", ИсточникДанных);
   
//-gavrikprog

//********************************************************************************************

Изменения во внешней обработке:

Когда получаем макет выполняем свою функцию(тут сами крутитесь - думаю несложно)

но когда получаем макет -

Макет=абПолучитьМакет(абОбработка);

 

В модуле объекта внешней формы;

//********************************************************************************************

Перем абОбработка;

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

   
//+gavrikprog
   
ПараметрыВывода.Свойство("абОбработка", абОбработка);
    //-gavrikprog

   
ПараметрыВывода.ДоступнаПечатьПоКомплектно = Истина;

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

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

//+gavrikprog
Функция абПолучитьМакет(СсылкаНаЭлементСправочникаДополнительныеОтчетыИОбработки)
   
УстановитьПривилегированныйРежим(Истина);
   
Результат1=ПолучитьМакет("аб_ПФ_MXL_Заказ");

    Если
абОбработка<>Неопределено Тогда

       
СтрокаУИД=Строка(СсылкаНаЭлементСправочникаДополнительныеОтчетыИОбработки.УникальныйИдентификатор());


       
Запрос = Новый Запрос;
       
Запрос.Текст =
       
"ВЫБРАТЬ
        |    ПользовательскиеМакетыПечати.ИмяМакета,
        |    ПользовательскиеМакетыПечати.Объект,
        |    ПользовательскиеМакетыПечати.Макет,
        |    ПользовательскиеМакетыПечати.Использование
        |ИЗ
        |    РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати
        |ГДЕ
        |    ПользовательскиеМакетыПечати.Объект ПОДОБНО &Объект"
;

       
Запрос.УстановитьПараметр("Объект", "%"+СтрокаУИД+"%");

       
Результат = Запрос.Выполнить();

       
ВыборкаДетальныеЗаписи = Результат.Выбрать();

        Если
ВыборкаДетальныеЗаписи.Следующий() Тогда
           
абМакет=ВыборкаДетальныеЗаписи.Макет.Получить();
           
Результат1 = ПолучитьТабличныйДокументПоДвоичнымДанным(абМакет);
        КонецЕсли;

    КонецЕсли;

    Возврат
Результат1;
КонецФункции

Функция
ПолучитьТабличныйДокументПоДвоичнымДанным(ДвоичныеДанные) Экспорт

   
ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
   
ДвоичныеДанные.Записать(ИмяВременногоФайла);
   
ТабличныйДокумент = Новый ТабличныйДокумент;
   
ТабличныйДокумент.Прочитать(ИмяВременногоФайла);
   
//УдалитьФайлы(ИмяВременногоФайла);

   
Возврат ТабличныйДокумент;

КонецФункции
//-gavrikprog

//********************************************************************************************

 


Иполнитель: 2011 г. www.rt-finance.ru

Скачать файлы

Наименование Файл Версия Размер
Печать_MXL_тестовая.epf 50
.epf 9,16Kb
25.07.13
50
.epf 9,16Kb Скачать

См. также

Подписаться Добавить вознаграждение
Комментарии
0. Александр Гуляев (gavrikprog) 30.09.11 13:04
Хотите изменить оформление макета внешней печатной формы динамически ?
Одна из целей - скопировать существующую внешнюю печатную форму и немного исправить форму, ну или просто картинку добавить попросили по-быстрому.

В общем понадобилось клиенту сгенерировать много внешних печатных форм с отличающимися визуально макетами(где то шрифт изменить, где то картинку добавить), естественно код сделан быстро - остальное делать не охота. Предоставил ему делать то, что он хочет.


Продолжая мысль, и написав универсально модуль заполнения Табличного документа, можно в режиме 1С перемещать параметры, т.е. расположение к примеру Представления заказчика независимо от его расположения в макете, хоть в подвале пусть пользователь его выведет, только правильно назовет параметр.

Перейти к публикации

1. Александр Гуляев (gavrikprog) 30.09.11 13:04
Продолжая мысль, и написав универсально модуль заполнения Табличного документа можно в режиме 1С перемещать параметры, т.е. расположение к примеру Представления заказчика независимо от его расположения в макете, хоть в подвале пусть пользователь его выведет, только правильно назовет параметр.
2. Александр Иванов (seducer) 30.09.11 13:32
Эмммм..... а как же "Макеты печатных форм" в УТ 11? То же самое динамическое изменение макетов. Или я не догнал, о чем тут речь идет?
3. Александр Иванов (seducer) 30.09.11 13:35
Аааа....блин.... Всё. Дошло. Это чтобы можно было макеты внешних использовать так же, как и встроенных.
Пятница. Туплю уже. :)
Тогда плюс однозначно.
4. Александр Гуляев (gavrikprog) 30.09.11 13:35
Тут внешние печатные формы, а так разницы в механизме нет
5. Александр Гуляев (gavrikprog) 30.09.11 13:47
Я к примеру хочу использовать этот механизм, при выставлении самим себе документов от имени поставщика(у заказчика в его текущей кривой базе что-то подобное). Поставщиков море, для многих надо другие формы сделать.
К поставщику прикрепили Внешний счет, акт, счет-фактуру и при пакетной печати печатаются именно эти внешние печатные формы.
Заказчик именно на легкости внесения изменений упор делал, а тут скопировали, макетики изменили, к контрагенту привязали.
6. isn Игнатьев (isn) 21.12.11 09:57
Идея хорошая, привязка к клиенту печатных форм в некоторых случаях нужна. Ставлю плюс за идею и за вариант реализации.
7. Александр Гуляев (gavrikprog) 26.01.12 20:02
В итоге пришел чуть -чуть к другому.

Печатные формы - это один одинаковый шаблон-заготовка для всех, с макетами и одним реквизитом-названием способа печати формы.
В справочнике Дополнительные отчеты и обработки доп. реквизит - контрагент.
Изменения вносятся только в РС Пользовательские макеты, дляотобрашения Дополнительных форм обработок по контрагентам.

Далее, частично код взят из публикации: а именно...
Сделана своя функция ПолучитьМакет, которая смотрит сначала в регистр Пользовательские макеты, если там нет то берет макеты из справочника Дополнительные отчеты и обработки - привязанные к контрагенту.

Имеем: при формировании можно использовать разные макеты и разные способы формирования макетов.
При этом пользователь имеет возможность их править в 1С.

Ах да, у реквизита Объект Регистра сведений Пользовательские макеты надо увеличить длину до 200 символов.

Преимущества: весь код по формированию макетов находится в одном месте.
8. юрий гулидов (gull22) 02.03.16 11:38
А можно реализовать это же через расширение конфигурации?