Одна из целей — скопировать существующую внешнюю печатную форму и немного исправить форму, ну или просто картинку добавить попросили по-быстрому.
В общем понадобилось клиенту сгенерировать много внешних печатных форм с отличающимися визуально макетами(где то шрифт изменить, где то картинку добавить), естественно код сделан быстро — остальное делать не охота. Предоставил ему делать то, что он хочет.
Продолжая мысль, и написав универсально модуль заполнения Табличного документа, можно в режиме 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
Хотите изменить оформление макета внешней печатной формы динамически ?
Одна из целей — скопировать существующую внешнюю печатную форму и немного исправить форму, ну или просто картинку добавить попросили по-быстрому.
В общем понадобилось клиенту сгенерировать много внешних печатных форм с отличающимися визуально макетами(где то шрифт изменить, где то картинку добавить), естественно код сделан быстро — остальное делать не охота. Предоставил ему делать то, что он хочет.
Продолжая мысль, и написав универсально модуль заполнения Табличного документа, можно в режиме 1С перемещать параметры, т.е. расположение к примеру Представления заказчика независимо от его расположения в макете, хоть в подвале пусть пользователь его выведет, только правильно назовет параметр.
Перейти к публикации
Продолжая мысль, и написав универсально модуль заполнения Табличного документа можно в режиме 1С перемещать параметры, т.е. расположение к примеру Представления заказчика независимо от его расположения в макете, хоть в подвале пусть пользователь его выведет, только правильно назовет параметр.
Эмммм….. а как же «Макеты печатных форм» в УТ 11? То же самое динамическое изменение макетов. Или я не догнал, о чем тут речь идет?
Аааа….блин…. Всё. Дошло. Это чтобы можно было макеты внешних использовать так же, как и встроенных.
Пятница. Туплю уже. 🙂
Тогда плюс однозначно.
Тут внешние печатные формы, а так разницы в механизме нет
Я к примеру хочу использовать этот механизм, при выставлении самим себе документов от имени поставщика(у заказчика в его текущей кривой базе что-то подобное). Поставщиков море, для многих надо другие формы сделать.
К поставщику прикрепили Внешний счет, акт, счет-фактуру и при пакетной печати печатаются именно эти внешние печатные формы.
Заказчик именно на легкости внесения изменений упор делал, а тут скопировали, макетики изменили, к контрагенту привязали.
Идея хорошая, привязка к клиенту печатных форм в некоторых случаях нужна. Ставлю плюс за идею и за вариант реализации.
В итоге пришел чуть -чуть к другому.
Печатные формы — это один одинаковый шаблон-заготовка для всех, с макетами и одним реквизитом-названием способа печати формы.
В справочнике Дополнительные отчеты и обработки доп. реквизит — контрагент.
Изменения вносятся только в РС Пользовательские макеты, дляотобрашения Дополнительных форм обработок по контрагентам.
Далее, частично код взят из публикации: а именно…
Сделана своя функция ПолучитьМакет, которая смотрит сначала в регистр Пользовательские макеты, если там нет то берет макеты из справочника Дополнительные отчеты и обработки — привязанные к контрагенту.
Имеем: при формировании можно использовать разные макеты и разные способы формирования макетов.
При этом пользователь имеет возможность их править в 1С.
Ах да, у реквизита Объект Регистра сведений Пользовательские макеты надо увеличить длину до 200 символов.
Преимущества: весь код по формированию макетов находится в одном месте.
А можно реализовать это же через расширение конфигурации?