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

18.11.15

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

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

Скачать файл

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

Наименование По подписке [?] Купить один файл
Внешняя печатная форма
.epf 6,12Kb
8
8 Скачать (1 SM) Купить за 1 850 руб.

Как обычно, сначала поискал готовое решение. Максимально близко решение данной задачи описано в этой публикации: //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 1С:ERP Управление предприятием 2 Платные (руб)

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

2400 руб.

29.06.2020    18417    26    6    

40

Работа с интерфейсом Программист Стажер Платформа 1С v8.3 Бесплатно (free)

Это инструкция по дизайну форм в среде 1С. Гайд охватывает рекомендации и стандарты для оптимизации пользовательского интерфейса. В гайде содержатся указания по использованию элементов интерфейса, включая как основные, так и продвинутые аспекты. Предоставляются также примеры и антипримеры для наглядного понимания принципов дизайна

20.08.2024    13926    mrXoxot    43    

114

Работа с интерфейсом Программист Платформа 1С v8.3 Бесплатно (free)

Пример простого и симпатичного прогресс-бара в динамическом списке, без картинок, используя редактирование запроса.

27.05.2024    6388    smielka    37    

98

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

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

27.12.2023    13790    830    elcoan    47    

114

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

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

2 стартмани

10.04.2023    11378    161    acces969    31    

122

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

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

1 стартмани

05.07.2022    5158    kalyaka    6    

33

Работа с интерфейсом Программист Пользователь Платформа 1С v8.3 8.3.14 Конфигурации 1cv8 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Абонемент ($m)

Ещё с времен платформы 8.3.13 можно изменять цвет стилей интерфейса главного окна. Данное расширение позволит вам выбрать из подготовленных десятка стилей на свой вкус.

1 стартмани

01.07.2022    23418    380    rpgshnik    67    

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

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


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