Пользовательские макеты для внешних печатных форм (обработок)

30.10.21

Разработка - Инструментарий разработчика

Расширение БСП по реализации механизма пользовательских макетов для обработок внешних печатных форм.

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

Наименование Файл Версия Размер
Расширение для конфигураций на БСП 2.4.4.х-3.0.1.355
.cfe 22,70Kb
24
.cfe 1.2.0 22,70Kb 24 Скачать
Печать счета из заказа клиента (УТ 11.4)
.epf 13,81Kb
14
.epf 13,81Kb 14 Скачать

Многие из нас знакомы с замечательным механизмом БСП "Макеты печатных форм", позволяющим пользователю самостоятельно менять макеты из метаданных конфигурации. В этой статье мы рассмотрим, как при помощи механизма расширения (модулей) данный функционал можно распространить на дополнительные обработки внешних печатных форм.

Приступим!

Релизацию задачи можно разделить на три шага перехвата и модернизации механизмов:

  1. Заполнения типового списка макетов
  2. Получения макета по имени объекта метаданных 
  3. Записи модернизированного пользовательского макета

При разработке внешних печатных форм следует придерживаться определенных правил.

Разберем каждый из шагов подробнее.

1. Перехват и модернизации механизма заполнения типового списка макетов

Механизм находится в процедуре формы РегистрСведений.ПользовательскиеМакетыПечати.Форма.МакетыПечатныхФорм.ЗаполнитьТаблицуМакетовПечатныхФорм().

Добавляем форму МакетыПечатныхФорм в расширение, в модуле формы прописываем следующий код:

&Перед("ЗаполнитьТаблицуМакетовПечатныхФорм")
Процедура simПМВПФ_ЗаполнитьТаблицуМакетовПечатныхФорм()
	
	//Ищем запросом все неотключенные внешние обработки печатных форм
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ
		|	ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
		|ГДЕ
		|	ДополнительныеОтчетыИОбработки.Вид = &ВПФ
		|	И ДополнительныеОтчетыИОбработки.Публикация <> &Отключена
		|	И НЕ ДополнительныеОтчетыИОбработки.ПометкаУдаления";
	
	Запрос.УстановитьПараметр("ВПФ"			, Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма);
	Запрос.УстановитьПараметр("Отключена"	, Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена);
	
	РезультатЗапроса = Запрос.Выполнить();
	
	ВДЗ = РезультатЗапроса.Выбрать();
	
	Пока ВДЗ.Следующий() Цикл
		
		//Получаем обработку-объект, для доступа к ее макетам, через метаданные
		ОбработкаОбъект 			= ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(ВДЗ.Ссылка);
		ОбъектМетаданныхКоллекции	= ОбработкаОбъект.Метаданные();
		
		//Перебираем макеты
		Для каждого ОбъектМетаданныхМакет из ОбъектМетаданныхКоллекции.Макеты Цикл
			
			//Вызов нетиповой функции проверки соответствия префикса в макете
			ТипМакета = sim_ТипМакета(ОбъектМетаданныхМакет.Имя, ОбработкаОбъект);
			Если ТипМакета = Неопределено Тогда
				Продолжить;
			КонецЕсли;
			
			//Добавление макета на форму
			ДобавитьОписаниеМакета(ОбъектМетаданныхКоллекции.ПолноеИмя() + "." + ОбъектМетаданныхМакет.Имя, ОбъектМетаданныхМакет.Синоним, ОбъектМетаданныхКоллекции.Синоним, ТипМакета);
	
		КонецЦикла;
	КонецЦикла;
		
КонецПроцедуры

&НаСервере
Функция sim_ТипМакета(ИмяОбъектаМетаданныхМакета, ОбработкаОбъект)
	
	Позиция = СтрНайти(ИмяОбъектаМетаданныхМакета, "ПФ_");
	Если Позиция = 0 Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	//получаем требуемый макет
	МакетПечатнойФормы	= ОбработкаОбъект.ПолучитьМакет(ИмяОбъектаМетаданныхМакета);
	
	ТипМакета = Неопределено;
	
	Если ТипЗнч(МакетПечатнойФормы) = Тип("ТабличныйДокумент") Тогда
		ТипМакета = "MXL";
	ИначеЕсли ТипЗнч(МакетПечатнойФормы) = Тип("ДвоичныеДанные") Тогда
		ТипМакета = ВРег(УправлениеПечатьюСлужебный.ОпределитьРасширениеФайлаДанныхПоСигнатуре(МакетПечатнойФормы));
	КонецЕсли;
	
	Возврат ТипМакета;
	
КонецФункции


Схематично вышеприведенный код работает следующим образом:


 

2. Перехват и модернизации механизма получения макета по имени объекта метаданных

Механизм находится в функции ОбщийМодуль.УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету)

Добавляем общий модуль УправлениеПечатью в расширение. В модуле расширения пишем следующий код:


// Возвращает макет печатной формы по полному пути к макету.
//
// Параметры:
//  ПутьКМакету - Строка - полный путь к макету в формате:
//                         "Документ.<ИмяДокумента>.<ИмяМакета>"
//                         "Обработка.<ИмяОбработки>.<ИмяМакета>"
//                         "ОбщийМакет.<ИмяМакета>".
//						   "ВнешняяОбработка.<ИмяОбработки>.<ИмяМакета>"
// Возвращаемое значение:
//  ТабличныйДокумент - для макета типа MXL.
//  ДвоичныеДанные    - для макетов DOC и ODT.
//
&Вместо("МакетПечатнойФормы")
Функция simПМВПФ_МакетПечатнойФормы(ПутьКМакету) Экспорт
	
	//Вычленим старший тип объекта метаданных
	ЧастиПути = СтрРазделить(ПутьКМакету, ".", Истина);
	
	//Нас интересуют только внешние обработки
	Если ЧастиПути[0]="ВнешняяОбработка" Тогда
		
		//Типовой код
		ТекстОшибки = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Макет ""%1"" не найден. Операция прервана.'"), ПутьКМакету);
		
		ИмяМакета = ЧастиПути[ЧастиПути.ВГраница()];
		ЧастиПути.Удалить(ЧастиПути.ВГраница());
		ИмяОбъекта = СтрСоединить(ЧастиПути, ".");
		
		ТекстЗапроса = 
		"ВЫБРАТЬ
		|	ПользовательскиеМакетыПечати.Макет КАК Макет
		|ИЗ
		|	РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати
		|ГДЕ
		|	ПользовательскиеМакетыПечати.Объект = &Объект
		|	И ПользовательскиеМакетыПечати.ИмяМакета ПОДОБНО &ИмяМакета
		|	И ПользовательскиеМакетыПечати.Использование";
		
		Запрос = Новый Запрос(ТекстЗапроса);
		Запрос.Параметры.Вставить("Объект", ИмяОбъекта);
		Запрос.Параметры.Вставить("ИмяМакета", "%" + ИмяМакета + "%");
		
		УстановитьОтключениеБезопасногоРежима(Истина);
		УстановитьПривилегированныйРежим(Истина);
		
		Выборка = Запрос.Выполнить().Выбрать();
		
		УстановитьПривилегированныйРежим(Ложь);
		УстановитьОтключениеБезопасногоРежима(Ложь);
		
		//+sim если макет нашелся в регистре - берем его
		Если Выборка.Следующий() Тогда
			Возврат Выборка.Макет.Получить();
		Иначе //иначе получаем макет непосредственно из обработки
			_Макет = simПМВПФ_ПолучитьМакетВнешнейОбработки(ИмяОбъекта,ИмяМакета); 
			Если _Макет <> Неопределено Тогда
				Возврат _Макет;
			Иначе
				ВызватьИсключение ТекстОшибки;
			КонецЕсли;
			
		КонецЕсли;
		//-sim
		
	КонецЕсли;	
	
	//!!!Продолжаем типовой вызов
	Возврат ПродолжитьВызов(ПутьКМакету);
	
КонецФункции


// Возвращает макет внешней печатной формы имени объекта и имени мкета.
//
// Параметры:
//  ПутьКМакету - Строка - полный путь к макету в формате:
//                         "ВнешняяОбработка.<ИмяОбработки>.<ИмяМакета>"
//                         "<ИмяОбработки>.<ИмяМакета>".
// Возвращаемое значение:
//  ТабличныйДокумент 	- для макета типа MXL.
//  ДвоичныеДанные    	- для макетов DOC и ODT.
//  Неопределено		- если макет не найден
&НаСервере
Функция simПМВПФ_ПолучитьМакетВнешнейОбработки(ИмяОбъекта,ИмяМакета)
	
	//ищем запросом нужную нам обработку
	Запрос = Новый Запрос;
	Запрос.Текст = 
		"ВЫБРАТЬ ПЕРВЫЕ 1
		|	ДополнительныеОтчетыИОбработки.Ссылка КАК Ссылка
		|ИЗ
		|	Справочник.ДополнительныеОтчетыИОбработки КАК ДополнительныеОтчетыИОбработки
		|ГДЕ
		|	НЕ ДополнительныеОтчетыИОбработки.ПометкаУдаления И
		|	ДополнительныеОтчетыИОбработки.Вид = &ВПФ
		|	И ДополнительныеОтчетыИОбработки.Публикация <> &Отключена
		|	И ДополнительныеОтчетыИОбработки.ИмяОбъекта = &ИмяОбъекта";
	
	Запрос.УстановитьПараметр("ИмяОбъекта"	, СтрЗаменить(ИмяОбъекта,"ВнешняяОбработка.",""));
	Запрос.УстановитьПараметр("ВПФ"			, Перечисления.ВидыДополнительныхОтчетовИОбработок.ПечатнаяФорма);
	Запрос.УстановитьПараметр("Отключена"	, Перечисления.ВариантыПубликацииДополнительныхОтчетовИОбработок.Отключена);
	
	УстановитьОтключениеБезопасногоРежима(Истина);
	УстановитьПривилегированныйРежим(Истина);
	
	РезультатЗапроса = Запрос.Выполнить();	
	
	
	ВДЗ = РезультатЗапроса.Выбрать();
	
	Если ВДЗ.Следующий() Тогда
		
		//получаем обработку-объект
		ОбработкаОбъект = ДополнительныеОтчетыИОбработки.ОбъектВнешнейОбработки(ВДЗ.Ссылка);
		
		УстановитьПривилегированныйРежим(Ложь);
		УстановитьОтключениеБезопасногоРежима(Ложь); 
		
		//получаем требуемый макет
		Возврат ОбработкаОбъект.ПолучитьМакет(ИмяМакета);
					
	КонецЕсли;
	
	Возврат Неопределено;
	
КонецФункции

Схематично вышеприведенный код работает следующим образом:

3. Перехват и модернизации механизма записи модернизированного пользовательского макета

Механизм находится в функции ОбщийМодуль.УправлениеПечатью.ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище).

Общий модуль УправлениеПечатью мы уже добавили в наше расширение, поэтому сразу добавляем в модуль УравлениеПечатью следующий код:

// Сохраняет пользовательский макет печати в информационной базе.
&Вместо("ЗаписатьМакет")
Процедура simПМВПФ_ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище) Экспорт
	
	//Вычленим старший тип объекта метаданных
	ЧастиИмени = СтрРазделить(ИмяОбъектаМетаданныхМакета, ".");
	
	//Нас интересуют только внешние обработки
	Если ЧастиИмени[0] = "ВнешняяОбработка" Тогда  
		
		//Типовой код
		ИмяМакета = ЧастиИмени[ЧастиИмени.ВГраница()];
		ИзмененныйМакет = ПолучитьИзВременногоХранилища(АдресМакетаВоВременномХранилище);
		ИмяВладельца = "";
		Для НомерЧасти = 0 По ЧастиИмени.ВГраница()-1 Цикл
			Если Не ПустаяСтрока(ИмяВладельца) Тогда
				ИмяВладельца = ИмяВладельца + ".";
			КонецЕсли;
			ИмяВладельца = ИмяВладельца + ЧастиИмени[НомерЧасти];
		КонецЦикла;
		
		//+sim нетиповое получение макета для ВнешнейОбработки
		МакетИзМетаданных = simПМВПФ_ПолучитьМакетВнешнейОбработки(ИмяВладельца,ИмяМакета);
		//-sim
		
		Запись = РегистрыСведений.ПользовательскиеМакетыПечати.СоздатьМенеджерЗаписи();
		Запись.Объект = ИмяВладельца;
		Запись.ИмяМакета = ИмяМакета;
		Если МакетыРазличаются(МакетИзМетаданных, ИзмененныйМакет) Тогда
			Запись.Использование = Истина;
			Запись.Макет = Новый ХранилищеЗначения(ИзмененныйМакет, Новый СжатиеДанных(9));
			Запись.Записать();
		Иначе
			Запись.Прочитать();
			Если Запись.Выбран() Тогда
				Запись.Удалить();
			КонецЕсли;
		КонецЕсли;
		
		Возврат;
		
	КонецЕсли;
	
	//!!! продолжаем вызов тиоповой процедуры
	ПродолжитьВызов(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище);
	
КонецПроцедуры

Схема работы кода выглядит аналогично п.2.

4. Особенности печати пользовательского макета для внешней печатной формы

Разрабатывая внешнюю печатную форму, необходимо помнить о нескольких несложных правилах:

  1. Имя каждой отдельной внешней обработки должно быть уникально
  2. Макеты, которые вы хотите дать на редактирование пользователям, должны префиксироваться согласно правилам БСП (ПФ_MXL_,ПФ_DOC_)
  3. Получать макет необходимо функцией БСП УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету)
  4. Получая область макета для печати, необходимо сначала проверить ее наличие (пользователь мог ее удалить) методом Найти(ИмяОбласти)
    Макет = ЭтотОбъект.ПолучитьМакет("СоставПоказателей");
    ТекОбласть = Макет.Области.Найти(ИмяОбласти);
  5. Заполнять параметры макета следует процедурой ЗаполнитьЗначенияСвойств(Область.Параметры, Источник), ровно по той же причине (пользователь может удалить параметры)

Вот, собственно, и все. Буду раз вашим комментариям.

Системные требования

Платформа: не ниже v8.3.11

БСП: v2.4.4.145 - v3.0.1.355

БСП пользовательские макеты внешние печатные формы обработки расширения программирование

См. также

Infostart Toolkit: Инструменты разработчика 1С 8.3 на управляемых формах

Инструментарий разработчика Роли и права Запросы СКД Платформа 1С v8.3 Управляемые формы Запросы Система компоновки данных Конфигурации 1cv8 Платные (руб)

Набор инструментов программиста и специалиста 1С для всех конфигураций на управляемых формах. В состав входят инструменты: Консоль запросов, Консоль СКД, Консоль кода, Редактор объекта, Анализ прав доступа, Метаданные, Поиск ссылок, Сравнение объектов, Все функции, Подписки на события и др. Редактор запросов и кода с раскраской и контекстной подсказкой. Доработанный конструктор запросов тонкого клиента. Продукт хорошо оптимизирован и обладает самым широким функционалом среди всех инструментов, представленных на рынке.

13000 руб.

02.09.2020    119910    656    389    

701

Infostart PrintWizard

Пакетная печать Печатные формы Инструментарий разработчика Платформа 1С v8.3 Запросы 1С:Зарплата и кадры бюджетного учреждения 1С:Конвертация данных 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 Платные (руб)

Инструмент, позволяющий абсолютно по-новому взглянуть на процесс разработки печатных форм. Благодаря конструктору можно значительно снизить затраты времени на разработку печатных форм, повысить качество и "прозрачность" разработки, а также навести порядок в многообразии корпоративных печатных форм.

18000 руб.

06.10.2023    7007    20    6    

37

Infostart УДиФ: Управление данными и формами

Инструменты администратора БД Инструментарий разработчика Роли и права Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Расширение позволяет без изменения кода конфигурации выполнять проверки при вводе данных, скрывать от пользователя недоступные ему данные, выполнять код в обработчиках. Не изменяет данные конфигурации, легко устанавливается практически на любую конфигурацию на управляемых формах.

10000 руб.

10.11.2023    3244    10    1    

31

SALE! 30%

PowerTools

Инструментарий разработчика Инструменты администратора БД Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 Россия Платные (руб)

Универсальный инструмент программиста для администрирования конфигураций. Сборник наиболее часто используемых обработок под единым интерфейсом.

3600 2520 руб.

14.01.2013    177341    1070    0    

846

Многопоточность. Универсальный «Менеджер потоков» 2.1

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Россия Платные (руб)

Восстановление партий или взаиморасчетов, расчет зарплаты, пакетное формирование документов или отчетов - теперь все это стало доступнее. * Есть желание повысить скорость работы медленных алгоритмов! Но... * Нет времени думать о реализации многопоточности? * о запуске и остановке потоков? * о поддержании потоков в рабочем состоянии? * о передаче данных в потоки и как получить ответ из потока? * об организации последовательности? Тогда ЭТО - то что надо!!!

5000 руб.

07.02.2018    99203    239    97    

296

[ЕХТ] Фреймворк для Расширений 1С

Инструментарий разработчика Платформа 1С v8.3 Управляемые формы Платные (руб)

"Фреймворк для Расширений 1С" это универсальное и многофункциональное решение, упрощающее разработку и поддержку создаваемых Расширений. Поставляется в виде комплекта из нескольких Расширений с открытым исходным кодом. Работает в любых Конфигурациях в режиме Управляемого приложения с режимом совместимости 8.3.12 и выше без необходимости внесения изменений в Конфигурацию.

3000 руб.

27.08.2019    17910    6    8    

38

1С HTML Шаблоны / HTML Templates

Инструментарий разработчика Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Быстрая и удобная обработка для работы с шаблонами HTML. Позволяет легко и быстро формировать код HTML.

2040 руб.

27.12.2017    27945    3    10    

14

Выполнение произвольного кода или запроса с параметрами через Web-сервис (замена COM-подключений)

Инструментарий разработчика Обмен между базами 1C Платформа 1С v8.3 Платные (руб)

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

2400 руб.

24.09.2019    23488    15    15    

31
Отзывы
14. Tavalik 3348 24.10.20 10:39 Сейчас в теме
Спасибо. Очень полезное расширение, все работает.
13. nemo2010 23.10.19 14:34 Сейчас в теме
Спасибо! Помогло решить проблему редактирования внешней печ.формы WORD/
Остальные комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. simy4 34 06.03.18 11:10 Сейчас в теме
Мысли об оптимизации.
В этой (1.0) версии, для получения макета непосредственно из внешней обработки, выполнятся запрос к базе данных, хотя контекст, из которого вызывается функция МакетПечатнойФормы(), в большинстве случаев уже несет в себе ОбработкуОбъект.

Можно написать отдельную функцию получения макета, где входящим параметром нужно передавать ОбработкуОбъект, но такое решение усложняет, т.к. необходимо во внешних обработках переписывать место получения макета.

Если бы расширение позволяло добавлять в перехватываемую функцию необязательные параметры...
Смотрю в сторону дополнительных свойств ОбработкиОбъекта. Тогда тем, кому важна временнАя оптимизация получения макета могли бы добавлять ОбработкуОбъект в дополнительные свойства перед вызовом функции МакетПечатнойФормы().
2. simy4 34 06.03.18 19:28 Сейчас в теме
(1)нет, не выйдет ничего с дополнительными свойствами, т.к. они живут только вместе с ОбработкойОбъектом, а её (кажется) можно передать только параметром.
3. NicNiconovna 29.08.18 13:33 Сейчас в теме
Добрый день! Есть внешняя печатная обработка, есть макет в формате "Двоичные данные" - документ "Word". Макет попадает в "Макеты печатных форм", редактируется, сохраняется. Но при печати выводится старый, неизмененный макет из внешней обработки, хотя отладчиком я попадаю на строку Возврат Выборка.Макет.Получить(); функции simПМВПФ_МакетПечатнойФормы() (то есть в регистр "Пользовательские макеты печати") я попадаю. Что здесь не так? Может, что-то мною упущено? Спасибо.
8. simy4 34 28.09.18 15:07 Сейчас в теме
(3)Добрый день. К сожалению не смогу вам помочь. Слишком мало данных для анализа. Может стоит попробовать почистить кеш.
4. KliMich 10.09.18 15:59 Сейчас в теме
Добрый день!
Однозначно плюс! Работает и с WORD.

Только маленький вопрос.
В моей обработке используется "ВызовКлиентскогоМетода" в отличии от "ВызовСерверногоМетода" (в примере _ДемоПечатьСчетовНаОплатуПокупателю).

При этом в форме строка кода:
Макет = УправлениеПечатью.МакетПечатнойФормы(ЭтотОбъект.Метаданные().ПолноеИмя() + "." + ИдентификаторКоманды);
выдает ошибку:
{ВнешняяОбработка.ТрудовойДоговорWORD2018.Форма.Форма.Форма(831)}: Метод объекта не обнаружен (Метаданные)
Макет = УправлениеПечатью.МакетПечатнойФормы(ЭтотОбъект.Метаданные().ПолноеИмя() + "." + ИдентификаторКоманды);

Если явно указываю
Макет = УправлениеПечатью.МакетПечатнойФормы("ВнешняяОбработка.ТрудовойДоговорWORD2018" + "." + ИдентификаторКоманды);
то все работает...

Подскажите, как получить имя внешней обработки из формы (&НаКлиенте или &НаСервере)
6. simy4 34 28.09.18 15:03 Сейчас в теме
(4)Добрый день. В принципе, можно сделать так как сделали вы, просто при создании новой печатной формы копированием, нужно не забывать менять данный параметр.

Что бы обратиться к метаданным обработки объекта с клиента, вам нужно вызвать серверную функцию вида:

&НаКлиенте
Процедура ВашаКлиентскаяПроцедура()
	Макет = УправлениеПечатью.МакетПечатнойФормы(ПолучитьИмяМетаданныхОбъекта() + "." + ИдентификаторКоманды);
КонецПроцедуры

&НаСервере
Процедура ПолучитьИмяМетаданныхОбъекта()
	Возврат РеквизитФормыВЗначение("Объект").Метаданные().ПолноеИмя();
КонецПроцедуры
Показать
7. simy4 34 28.09.18 15:06 Сейчас в теме
(6)А еще лучше, что бы лишний раз не дергать сервер, в ПриСозданииНаСервере закешировать полное имя из метаданных в реквизит формы. В последствии вы просто обращаетесь к этому реквизиту при необходимости.
5. kassbar 156 20.09.18 16:19 Сейчас в теме
по моему вот этих 2-х пунктов

- Макеты, которые вы хотите дать на редактирование пользователям, должны префиксироваться согласно правилам БСП (ПФ_MXL_,ПФ_DOC_)
- Получать макет необходимо функцией БСП УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету)

вполне достаточно для редактирования макетов в пользовательском режиме. Для чего весь остальной код ?
9. simy4 34 28.09.18 15:09 Сейчас в теме
(5)Добрый день. Вы проверили ваше утверждение, или только предполагаете?
10. kassbar 156 28.09.18 23:12 Сейчас в теме
(9) я делаю печатные формы только через расширения, чтобы пользователи сами меняли макеты через Еще-Изменить макет.
И точно знаю что Префикс печатной формы + получение макета через путь к нему = автоматическое редактирование макетов пользователем )
11. simy4 34 29.09.18 01:13 Сейчас в теме
(10) в данной публикации речь идет о дополнительных внешних обработках печати, подключение которых не предполагет использования расширения (и редактирования макета пользователем).
12. kassbar 156 29.09.18 13:03 Сейчас в теме
(11) надеюсь кто-то найдет это материал полезным
simy4; triera2000; klaus38; +3 Ответить
13. nemo2010 23.10.19 14:34 Сейчас в теме
Спасибо! Помогло решить проблему редактирования внешней печ.формы WORD/
14. Tavalik 3348 24.10.20 10:39 Сейчас в теме
Спасибо. Очень полезное расширение, все работает.
15. Tavalik 3348 11.10.21 11:08 Сейчас в теме
В последнем обновлении БСП в методах "МакетПечатнойФормы" и "ЗаписатьМакет" общего модуля "УправлениеПечатью" появился новый обязательный параметр "КодЯзыка". Исправьте и у себя тоже.
16. Stivens 35 28.10.21 08:35 Сейчас в теме
ТипМакета = sim_ТипМакета(ОбъектМетаданныхМакет.Имя);
&НаСервере
Функция sim_ТипМакета(ИмяОбъектаМетаданныхМакета, ОбработкаОбъект)


Прям как отзыв на Алиекспрессе "Все работает"... Не может оно работать. Вызов и функция - разное количество параметров...

Плюс, но тут возмжно у меня ошибка где-то: в процедуре &Перед("ЗаполнитьТаблицуМакетовПечатныхФорм")
Процедура sim_ЗаполнитьТаблицуМакетовПечатныхФорм()
ДобавитьОписаниеМакета(ОбъектМетаданныхКоллекции.ПолноеИмя() + "." + ОбъектМетаданныхМакет.Имя, ОбъектМетаданныхМакет.Синоним, ОбъектМетаданныхКоллекции.Синоним, ТипМакета); в итоге заходит в:

ОбщийМодуль.УправлениеПечатьюМультиязычность.Модуль.ЯзыкиМакета(ПутьКМакету = "ВнешняяОбработка.Сче..." есть замечательный вызов
"ОбъектМетаданных = Метаданные.НайтиПоПолномуИмени(ИмяОбъекта);"
Для Внешней обработки чего-то ошибку выдает, нету говорит ее в метаданных

Подскажите, где я не внимателен?
17. simy4 34 29.10.21 11:42 Сейчас в теме
(16) вероятно, у тебя более новая версия БСП, чем указана в совместимости этой доработки. Товарищ Tavalik об этом сообщил, спасибо ему, но мои руки не доходят доработать код под новую версию. Подскажи, на какой конфигурации пробуешь расширение? Я постараюсь отладиться на ней.
22. 7OH 69 30.03.23 11:59 Сейчас в теме
(17) 1С:ERP Управление предприятием 2 (2.5.8.171)
Пытается получить языки макета и не находит обработку (что логично)
УправлениеПечатьюМультиЯзычность.ЯзыкиМакета
18. simy4 34 30.10.21 18:35 Сейчас в теме
(16) увидел в листинге ошибку с параметром sim_ТипМакета, поправил, спасибо. В приложенном расширение этой ошибки нет, видимо поэтому ошибка от меня ускользнула.
19. sdaf 11.01.22 20:41 Сейчас в теме
большое спасибо, все работает
20. user1468592 31.07.22 13:41 Сейчас в теме
а как получить путь к макету дополнительной обработки. хочу дополнить типовой макет, но использовать встроенные процедуры и функции, а там должен быть указан полный путь к макету?
21. FReIM 8 14.11.22 11:34 Сейчас в теме
Добавлю еще немного.
Нужны еще две функции, если их нет в конфигурации.
Функция МакетыРазличаются(Знач ИсходныйМакет, ИзмененныйМакет) Экспорт
	Возврат ОбщегоНазначения.КонтрольнаяСуммаСтрокой(НормализоватьМакет(ИсходныйМакет)) <> ОбщегоНазначения.КонтрольнаяСуммаСтрокой(НормализоватьМакет(ИзмененныйМакет));
КонецФункции  

Функция НормализоватьМакет(Знач Макет)
	ХранилищеМакета = Новый ХранилищеЗначения(Макет);
	Возврат ХранилищеМакета.Получить();
КонецФункции
Показать


Так же может потребоваться
Функция КонтрольнаяСуммаСтрокой(Знач Данные, Знач Алгоритм = Неопределено) Экспорт
	
	Если Алгоритм = Неопределено Тогда
		Алгоритм = ХешФункция.MD5;
	КонецЕсли;
	
	ХешированиеДанных = Новый ХешированиеДанных(Алгоритм);
	Если ТипЗнч(Данные) <> Тип("Строка") И ТипЗнч(Данные) <> Тип("ДвоичныеДанные") Тогда
		Данные = ЗначениеВСтрокуXML(Данные);
	КонецЕсли;
	ХешированиеДанных.Добавить(Данные);
	
	Если ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("ДвоичныеДанные") Тогда 
		Результат = СтрЗаменить(ХешированиеДанных.ХешСумма, " ", "");
	ИначеЕсли ТипЗнч(ХешированиеДанных.ХешСумма) = Тип("Число") Тогда
		Результат = Формат(ХешированиеДанных.ХешСумма, "ЧГ=");
	КонецЕсли;
	
	Возврат Результат;
	
КонецФункции

// Преобразует (сериализует) любое значение в XML-строку.
// Преобразованы в могут быть только те объекты, для которых в синтакс-помощнике указано, что они сериализуются.
// См. также ЗначениеИзСтрокиXML.
//
// Параметры:
//  Значение - Произвольный - значение, которое необходимо сериализовать в XML-строку.
//
// Возвращаемое значение:
//  Строка - XML-строка.
//
Функция ЗначениеВСтрокуXML(Значение) Экспорт
	
	ЗаписьXML = Новый ЗаписьXML;
	ЗаписьXML.УстановитьСтроку();
	СериализаторXDTO.ЗаписатьXML(ЗаписьXML, Значение, НазначениеТипаXML.Явное);
	
	Возврат ЗаписьXML.Закрыть();
КонецФункции

// Определяет расширение файла данных исходя из их его сигнатуры. Файл анализируются
// по первым 8 байтам на отношению к типам docx, doc, odt.
// Для вызова из клиентских и серверных модулей печати форм по макетам офисных документов.
//
// Параметры:
//  ДанныеИлиСтруктура - ДвоичныеДанные
//                     - Структура - файл документа или строка таблицы команд.
//
// Возвращаемое значение:
//  Строка, Неопределено - расширение файла двоичных данных или Неопределено, если не удалось определить расширение. 
//
Функция ОпределитьРасширениеФайлаДанныхПоСигнатуре(ДанныеИлиСтруктура) Экспорт
	
	Если ТипЗнч(ДанныеИлиСтруктура) = Тип("Структура") Тогда
		Попытка
			МакетИДанныеОбъекта = УправлениеПечатью.МакетыИДанныеОбъектовДляПечати(ДанныеИлиСтруктура.МенеджерПечати,
				ДанныеИлиСтруктура.Идентификатор, Новый Массив);
			ДвоичныеДанныеМакета = МакетИДанныеОбъекта.Макеты.ДвоичныеДанныеМакетов.Получить(ДанныеИлиСтруктура.Идентификатор);
		Исключение
			Возврат Неопределено;
		КонецПопытки;
	Иначе
		ДвоичныеДанныеМакета = ДанныеИлиСтруктура;
	КонецЕсли;
	
	Если ДвоичныеДанныеМакета = Неопределено Тогда
		Возврат Неопределено;
	КонецЕсли;
	
	ПотокДанных = ДвоичныеДанныеМакета.ОткрытьПотокДляЧтения();
	ЧтениеДанных = Новый ЧтениеДанных(ПотокДанных);
	
	Символ1 = ЧтениеДанных.ПрочитатьБайт();
	Символ2 = ЧтениеДанных.ПрочитатьБайт();
	Символ3 = ЧтениеДанных.ПрочитатьБайт();
	Символ4 = ЧтениеДанных.ПрочитатьБайт();
	Символ5 = ЧтениеДанных.ПрочитатьБайт();
	Символ6 = ЧтениеДанных.ПрочитатьБайт();
	Символ7 = ЧтениеДанных.ПрочитатьБайт();
	Символ8 = ЧтениеДанных.ПрочитатьБайт();
	
	ПотокДанных.Закрыть();
	
	Если Символ1 = 208 И Символ2 = 207 И Символ3 = 17 И Символ4 = 224 И Символ5 = 161 И Символ6 = 177 И Символ7 = 26 И Символ8 = 225 Тогда
		Возврат "doc";
	ИначеЕсли Символ1 = 80 И Символ2 = 75 И Символ3 = 3 И Символ4 = 4 И Символ5 = 20 И Символ6 = 0 И Символ7 = 0 И Символ8 = 8
			  ИЛИ Символ1 = 80 И Символ2 = 75 И Символ3 = 3 И Символ4 = 4 И Символ5 = 10 И Символ6 = 0 И Символ7 = 0 И Символ8 = 0 Тогда
		Возврат "odt";
	ИначеЕсли Символ1 = 80 И Символ2 = 75 И Символ3 = 3 И Символ4 = 4 И Символ5 = 20 И Символ6 = 0 Тогда
		Возврат "docx";
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

Показать
Оставьте свое сообщение