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

18.11.15

Разработка - Работа с интерфейсом

Возникла задача - дать пользователям возможность незначительно редактировать оформление макетов для внешних печатных форм в рамках конфигурации УПП 1.3. Вот что получилось.

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

Наименование Файл Версия Размер
Внешняя печатная форма
.epf 6,12Kb
8
.epf 6,12Kb 8 Скачать

Как обычно, сначала поискал готовое решение. Максимально близко решение данной задачи описано в этой публикации: //infostart.ru/public/92500/. С той лишь разницей, что там данная задача решалась для конфигурации УТ 11.

Тем не менее, именно эта публикация была взята за основу, и часть работающего кода заимствована оттуда.

РС (регистр сведений) "Пользовательские макеты печати", в котором собственно хранятся макеты, измененные пользователем, является частью подсистемы Печать из БСП (библиотеки стандартных подсистем). И поначалу я думал, что придётся внедрять в УПП версию БСП 2.1. Однако оказалось, что в УПП 1.3 последних версий данный регистр уже включен и даже используется в паре объектов конфигурации. Например, в документе "Выпуск продукции". Это существенно сокращает количество изменений, которые придется внести в конфигурацию, но давайте по порядку.

1. Чтобы дополнить перечень объектов, которые мы видим в форме РС ПользовательскиеМакетыПечати и для которых мы можем редактировать пользовательский макет, надо внести изменения в форму МакетыПечатныхФорм. Также надо не забыть увеличить длину измерения Объект в этом РС, на случай слишком длинного наименования ВПФ (внешней печатной формы). Я указал длину 250.

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

// ----------------------------------------------------------------------------

2. Чтобы появилась возможность получить для редактирования макет из ВПФ и сохранить его в наш регистр, надо доработать общий модуль УправлениеПечатью.

// --------------------------------------------------------------------------
Функция ПолучитьМакет(ПолныйПутьКМакету) Экспорт
	
	ЧастиПути = СтрЗаменить(ПолныйПутьКМакету, ".", Символы.ПС);
	
	Если СтрЧислоСтрок(ЧастиПути) = 3 Тогда
		
	// Miha
        Если Лев(ПолныйПутьКМакету,12) = "Справочники." Тогда
            абПозиция=Найти(ПолныйПутьКМакету,"/");
            абПозиция1=Найти(ПолныйПутьКМакету,"#");;
            Если абПозиция<>0 Тогда
                СтрокаУИД=Сред(ПолныйПутьКМакету,абПозиция+1,абПозиция1-абПозиция-1);
                УИД=Новый УникальныйИдентификатор(СтрокаУИД);
                абОбъект=Справочники.ВнешниеОбработки.ПолучитьСсылку(УИД);

                Запрос = Новый Запрос;
                Запрос.Текст =
                    "ВЫБРАТЬ
 | ПользовательскиеМакетыПечати.ИмяМакета,
 | ПользовательскиеМакетыПечати.Объект,
 | ПользовательскиеМакетыПечати.Макет,
 | ПользовательскиеМакетыПечати.Использование
 |ИЗ
 | РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати
 |ГДЕ
 | ПользовательскиеМакетыПечати.Объект ПОДОБНО &Объект";

                Запрос.УстановитьПараметр("Объект", "%"+СтрокаУИД+"%");

                Результат = Запрос.Выполнить();

                ВыборкаДетальныеЗаписи = Результат.Выбрать();

                Если ВыборкаДетальныеЗаписи.Следующий() Тогда
                    абМакет=ВыборкаДетальныеЗаписи.Макет.Получить();
                    Результат = ПолучитьТабличныйДокументПоДвоичнымДанным(абМакет);
                    Возврат Результат;
                Иначе
                    Если абОбъект<>Справочники.ВнешниеОбработки.ПустаяСсылка() Тогда
                        абОбработкаEPF=абОбъект.ХранилищеВнешнейОбработки.Получить();
                        ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
                        абОбработкаEPF.Записать(ИмяВременногоФайла);
                        абОбработка=ВнешниеОбработки.Создать(ИмяВременногоФайла);
                        абМакет=абОбработка.ПолучитьМакет(СтрПолучитьСтроку(ЧастиПути, 3));
                        Возврат  абМакет;
                    КонецЕсли;
                КонецЕсли;
            КонецЕсли;
        Иначе
            ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1) + "." + СтрПолучитьСтроку(ЧастиПути, 2);
            ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 3);
        КонецЕсли;
        //ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1) + "." + СтрПолучитьСтроку(ЧастиПути, 2);
        //ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 3);
        // Miha - End 
		
	ИначеЕсли СтрЧислоСтрок(ЧастиПути) = 2 Тогда
		ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1);
		ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 2);
	Иначе
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Макет ""%1"" не найден. Операция прервана.'"), ПолныйПутьКМакету);
	КонецЕсли;
// --------------------------------------------------------------------------

3. Также понадобится передавать во внешнюю обработку параметр со ссылкой на элемент справочника "Внешние обработки", чтобы ВПФ могла найти свой пользовательский макет в регистре. Для этого правим общий модуль УниверсальныеМеханизмы.

// --------------------------------------------------------------------------
Функция НапечататьВнешнююФорму(Ссылка, ИсточникМакета) Экспорт
	
	Перем ДополнительныеПараметры;
	
	ДвоичныеДанные = ИсточникМакета.СсылкаНаВнешнююОбработку.Принадлежность[ИсточникМакета.НомерСтроки - 1].ХранилищеВнешнейОбработки.Получить();
	
	// Получить дополнительные параметры внешней обработки
	ИсточникМакета.Свойство("ДополнительныеПараметрыОбработки", ДополнительныеПараметры);
	
	// Miha
	Если ДополнительныеПараметры = Неопределено Тогда
		ДополнительныеПараметры = Новый Структура;
	КонецЕсли;
	ДополнительныеПараметры.Вставить("СсылкаНаВнешнююОбработку", ИсточникМакета.СсылкаНаВнешнююОбработку);
	// Miha - End

// --------------------------------------------------------------------------

На этом изменения в конфигураторе завершены. Остальные изменения можно делать непосредственно в файлах ВПФ.

4. Во-первых, понадобится добавить реквизит ДополнительныеПараметры с типом Произвольный.

5. В названии макетов должно быть одно из сочетаний: ПФ_MXL, ПФ_DOC или ПФ_ODT. Это проверяется встроенной подсистемой.

6. Когда получаем макет, вместо стандартного ПолучитьМакет вызываем функцию МСК_ПолучитьМакет. Нужный код приведен ниже.

// --------------------------------------------------------------------------
Функция МСК_ПолучитьМакет(ИмяМакета)
	СтрокаУИД=Строка(ДополнительныеПараметры.СсылкаНаВнешнююОбработку.УникальныйИдентификатор());

	Запрос = Новый Запрос;
	Запрос.Текст =
	"ВЫБРАТЬ
 | ПользовательскиеМакетыПечати.ИмяМакета,
 | ПользовательскиеМакетыПечати.Объект,
 | ПользовательскиеМакетыПечати.Макет
 |ИЗ
 | РегистрСведений.ПользовательскиеМакетыПечати КАК ПользовательскиеМакетыПечати
 |ГДЕ
 | ПользовательскиеМакетыПечати.Объект ПОДОБНО &amp;Объект
 | И ПользовательскиеМакетыПечати.Использование";

	Запрос.УстановитьПараметр("Объект", "%"+СтрокаУИД+"%");

	Результат = Запрос.Выполнить();

	ВыборкаДетальныеЗаписи = Результат.Выбрать();

	Если ВыборкаДетальныеЗаписи.Следующий() Тогда
	    ДвМакет=ВыборкаДетальныеЗаписи.Макет.Получить();
	    ИспользуемыйМакет = ПолучитьТабличныйДокументПоДвоичнымДанным(ДвМакет);
	Иначе
		ИспользуемыйМакет = ПолучитьМакет(ИмяМакета);
	КонецЕсли;

	Возврат ИспользуемыйМакет;
	
КонецФункции
// --------------------------------------------------------------------------
Функция ПолучитьТабличныйДокументПоДвоичнымДанным(ДвоичныеДанные) Экспорт

    ИмяВременногоФайла = ПолучитьИмяВременногоФайла();
    ДвоичныеДанные.Записать(ИмяВременногоФайла);
    ТабличныйДокумент = Новый ТабличныйДокумент;
    ТабличныйДокумент.Прочитать(ИмяВременногоФайла);

    Возврат ТабличныйДокумент;

КонецФункции
// --------------------------------------------------------------------------

 

Вы можете скачать готовый пример обработки и подключить её к любому документу в конфигурации, чтобы проверить, как всё работает.

ВПФ внешняя печатная форма настройка макетов пользовательские макеты

См. также

Богатый редактор картинок, хранимых в базе, с возможностью РИСОВАНИЯ. Редактор внешних файлов картинок. Объект, расширяющий возможности работы с картинками из встроенного языка (Три в одном) + Обработка «Стандартизация картинок»

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

Обработка предназначена для редактирования картинок в режиме «Предприятие», с возможностью РИСОВАТЬ на них. Поддерживается работа как в обычных формах (толстый клиент) так и на управляемых формах (тонкий клиент). Обработка позволяет редактировать как картинки, хранимые в базе, так и графические файлы с диска на файловой системе. Помимо базовых функций (изменение размеров, преобразование формата, обрезание картинки, повороты и т.п.) – редактор имеет богатый набор инструментов для рисования. Доступна функция вставки изображения из буфера обмена. Также обработка может быть использована из встроенного языка как объект для редактирования картинок. Объект может быть использован: на стороне клиента, на стороне сервера, из внешнего соединения. Данная обработка будет особенно полезна тем, кто вносит картинки в базу (изображения номенклатуры, фотографии физических лиц и т.п.). Функционал реализуется с использованием JavaScript и бесплатного ПО ImageMagick (без использования внешних компонент).

6000 руб.

16.01.2015    61712    43    59    

80

[Расширения] Динамическое управление видимостью и доступностью элементов форм (УФ) (8.3.6+)

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

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

5000 руб.

14.01.2016    54320    16    21    

42

Управление дашбордами

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

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

2400 руб.

29.06.2020    16625    21    4    

35

Новогоднее оформление для 1С

Работа с интерфейсом Платформа 1С v8.3 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Зарплата и Управление Персоналом 3.x 1С:Управление нашей фирмой 3.0 Бесплатно (free)

Добавьте новогоднего настроения! Расширение создает декорацию в виде гирлянды на некоторых формах объектов.

27.12.2023    10568    745    elcoan    45    

106

Конструктор HTML, CSS и javascript

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

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

2 стартмани

10.04.2023    9488    150    acces969    31    

115

Модель состояния для MVC

Работа с интерфейсом Платформа 1С v8.3 Конфигурации 1cv8 Абонемент ($m)

"MVC плохо применима в 1С" - познакомьтесь с моделью состояния и, возможно, ваше мнение поменяется! Представленное решение является эволюционным развитием идеи реализации MVC для 1С. В новой версии добавлены DSL для описания модели состояния, а также параметризация свойств параметров и элементов формы.

1 стартмани

05.07.2022    3582    kalyaka    2    

27

Табло очереди заказов на экран телевизора

WEB-интеграция Работа с интерфейсом Платформа 1С v8.3 1С:Розница 2 Платные (руб)

Связка из веб-приложения и расширения для 1С: Розница 2.3.

3600 руб.

29.04.2022    12013    1    5    

10
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. nano1c 170 05.04.23 17:26 Сейчас в теме
В настоящий момент в БСП слишком много нужно переделывать чтобы все это заработало. Много мест такого рода:

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


- ну ладно имя макета можно сделать ПФ_ххх, ну а дальше получить объект внешняяобработка - никак..
Оставьте свое сообщение