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

01.09.15

Разработка - Механизмы платформы 1С

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

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


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

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

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

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

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4576    dsdred    53    

73

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Все мы используем массивы в своем коде. Это один из первых объектов, который дают ученикам при прохождении обучения программированию. Но умеем ли мы ими пользоваться? В этой статье я хочу показать все методы массива, а также некоторые фишки в работе с массивами.

24.01.2024    5301    YA_418728146    25    

63

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6427    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18491    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12101    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

28.08.2023    8841    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6284    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    15998    SeiOkami    31    

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

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


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

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

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

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

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

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

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

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