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



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

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

Продолжая мысль, и написав универсально модуль заполнения Табличного документа, можно в режиме 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

9 Comments

  1. gavrikprog

    Хотите изменить оформление макета внешней печатной формы динамически ?

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

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

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

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

    Reply
  2. gavrikprog

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

    Reply
  3. seducer

    Эмммм….. а как же «Макеты печатных форм» в УТ 11? То же самое динамическое изменение макетов. Или я не догнал, о чем тут речь идет?

    Reply
  4. seducer

    Аааа….блин…. Всё. Дошло. Это чтобы можно было макеты внешних использовать так же, как и встроенных.

    Пятница. Туплю уже. 🙂

    Тогда плюс однозначно.

    Reply
  5. gavrikprog

    Тут внешние печатные формы, а так разницы в механизме нет

    Reply
  6. gavrikprog

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

    К поставщику прикрепили Внешний счет, акт, счет-фактуру и при пакетной печати печатаются именно эти внешние печатные формы.

    Заказчик именно на легкости внесения изменений упор делал, а тут скопировали, макетики изменили, к контрагенту привязали.

    Reply
  7. isn

    Идея хорошая, привязка к клиенту печатных форм в некоторых случаях нужна. Ставлю плюс за идею и за вариант реализации.

    Reply
  8. gavrikprog

    В итоге пришел чуть -чуть к другому.

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

    В справочнике Дополнительные отчеты и обработки доп. реквизит — контрагент.

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

    Далее, частично код взят из публикации: а именно…

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

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

    При этом пользователь имеет возможность их править в 1С.

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

    Преимущества: весь код по формированию макетов находится в одном месте.

    Reply
  9. gull22

    А можно реализовать это же через расширение конфигурации?

    Reply

Leave a Comment

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