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

30.10.21

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

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

Скачать файл

ВНИМАНИЕ: Файлы из Базы знаний - это исходный код разработки. Это примеры решения задач, шаблоны, заготовки, "строительные материалы" для учетной системы. Файлы ориентированы на специалистов 1С, которые могут разобраться в коде и оптимизировать программу для запуска в базе данных. Гарантии работоспособности нет. Возврата нет. Технической поддержки нет.

Наименование По подписке [?] Купить один файл
Расширение для конфигураций на БСП 2.4.4.х-3.0.1.355
.cfe 22,70Kb ver:1.2.0
24
24 Скачать (2 SM) Купить за 2 150 руб.
Печать счета из заказа клиента (УТ 11.4)
.epf 13,81Kb
14
14 Скачать (1 SM) Купить за 1 850 руб.

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

Приступим!

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

  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

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

См. также

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

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

10000 руб.

02.09.2020    160733    889    399    

870

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

Инструмент представляет собой обработку для проведения свёртки или обрезки баз данных. Работает на ЛЮБЫХ конфигурациях (УТ, БП, ERP и т.д.). Поддерживаются управляемые и обычные формы. Может выполнять свертку сразу нескольких баз данных и выполнять их автоматически без непосредственного участия пользователя.

8400 руб.

20.08.2024    8264    62    29    

74

SALE! 15%

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

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

22200 19980 руб.

06.10.2023    15580    38    7    

73

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

Инструмент для написания и отладки кода в режиме «1С:Предприятие». Представляет собой консоль кода с возможностью пошаговой отладки, просмотра значений переменных любых типов, использования процедур и функций, просмотра стека вызовов, вычисления произвольных выражений на встроенном языке в контексте точки останова, синтаксического контроля и остановки по ошибке. В консоли используется удобный редактор кода с подсветкой, контекстной подсказкой, возможностью вызова конструкторов запроса и форматной строки.

9360 руб.

17.05.2024    23723    70    45    

119

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

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

10000 руб.

10.11.2023    10596    38    27    

63

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

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

4800 руб.

14.01.2013    188340    1141    0    

913

Инструментарий разработчика Программист 8.3.14 1С:Конвертация данных Россия Платные (руб)

Расширение для конфигурации “Конвертация данных 3”. Добавляет подсветку синтаксиса, детальную контекстную подсказку, глобальный поиск по коду.

15000 руб.

07.10.2021    17511    6    32    

42

Инструментарий разработчика Программист Платные (руб)

Менеджер конфигураций 1С — альтернативный стартер информационных баз 1С:Предприятие.

1800 руб.

21.02.2023    7790    8    35    

23
Отзывы
14. Tavalik 3410 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 159 20.09.18 16:19 Сейчас в теме
по моему вот этих 2-х пунктов

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

вполне достаточно для редактирования макетов в пользовательском режиме. Для чего весь остальной код ?
9. simy4 34 28.09.18 15:09 Сейчас в теме
(5)Добрый день. Вы проверили ваше утверждение, или только предполагаете?
10. kassbar 159 28.09.18 23:12 Сейчас в теме
(9) я делаю печатные формы только через расширения, чтобы пользователи сами меняли макеты через Еще-Изменить макет.
И точно знаю что Префикс печатной формы + получение макета через путь к нему = автоматическое редактирование макетов пользователем )
11. simy4 34 29.09.18 01:13 Сейчас в теме
(10) в данной публикации речь идет о дополнительных внешних обработках печати, подключение которых не предполагет использования расширения (и редактирования макета пользователем).
12. kassbar 159 29.09.18 13:03 Сейчас в теме
(11) надеюсь кто-то найдет это материал полезным
simy4; triera2000; klaus38; +3 Ответить
13. nemo2010 23.10.19 14:34 Сейчас в теме
Спасибо! Помогло решить проблему редактирования внешней печ.формы WORD/
14. Tavalik 3410 24.10.20 10:39 Сейчас в теме
Спасибо. Очень полезное расширение, все работает.
15. Tavalik 3410 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 70 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 9 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";
	Иначе
		Возврат Неопределено;
	КонецЕсли;
	
КонецФункции

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