Использование механизма редактирования макетов БСП для внешних обработок

24.11.17

Разработка - БСП (Библиотека стандартных подсистем)

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

Файлы

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

Наименование Скачано Купить файл
Использование механизма редактирования макетов БСП в для внешних обработок.:
.epf 9,35Kb
34 1 850 руб. Купить

Подписка PRO — скачивайте любые файлы со скидкой до 85% из Базы знаний

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

Оформить подписку и скачать решение со скидкой

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

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

Но этот механизм работает только для объектов из самой конфигурации. А как нам его использовать для своих внешних отчетов и обработок ? И можно ли ? Начинаем смотреть.

Сами пользовательские макеты у нас хранятся в регистре сведений - ПользовательскиеМакетыПечати

Регистр независимый, непериодический. Измерения имеют строковый тип, сам макет - тип "хранилище значений".

Все красиво, все прекрасно. На данном этапе нет никаких причин и ограничений для использования его по своему назначению.

Посмотрим на форму списка регистра, называется он "МакетыПечатныхФорм".

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

&НаСервере
Функция ТипМакета(ИмяОбъектаМетаданныхМакета)
	
	ТипыМакетов = Новый Массив;
	ТипыМакетов.Добавить("MXL");
	ТипыМакетов.Добавить("DOC");
	ТипыМакетов.Добавить("ODT");
	
	Для Каждого ТипМакета Из ТипыМакетов Цикл
		Позиция = СтрНайти(ИмяОбъектаМетаданныхМакета, "ПФ_" + ТипМакета);
		Если Позиция > 0 Тогда
			Возврат ТипМакета;
		КонецЕсли;
	КонецЦикла;
	
	Возврат Неопределено;
	
КонецФункции

Видим, что в список попадут исключительно печатные формы по объектам метаданных, да еще и с формализованными именами вида "ПФ_MXL" "ПФ_DOC" "ПФ_ODT".

Значит, на стандартной форме мы никак не увидим нашего макета. Но это все равно делу не мешает.

Зайдя в любой менеджер объекта, мы увидим, что печатная форма стандартно вызывается через общий модуль.

Макет = УправлениеПечатью.МакетПечатнойФормы(ИмяОбъектаМетаданных);

Это экспортная процедура

Функция МакетПечатнойФормы(ПолныйПутьКМакету) Экспорт
	
	ЧастиПути = СтрЗаменить(ПолныйПутьКМакету, ".", Символы.ПС);
	
	Если СтрЧислоСтрок(ЧастиПути) = 3 Тогда
		ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1) + "." + СтрПолучитьСтроку(ЧастиПути, 2);
		ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 3);
	ИначеЕсли СтрЧислоСтрок(ЧастиПути) = 2 Тогда
		ПутьКМетаданным = СтрПолучитьСтроку(ЧастиПути, 1);
		ПутьКОбъектуМетаданных = СтрПолучитьСтроку(ЧастиПути, 2);
	Иначе
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Макет ""%1"" не найден. Операция прервана.'"), ПолныйПутьКМакету);
	КонецЕсли;
	
	Запрос = Новый Запрос;
	
	Запрос.Текст = "ВЫБРАТЬ Макет КАК Макет, Использование КАК Использование
					|ИЗ
					|	РегистрСведений.ПользовательскиеМакетыПечати
					|ГДЕ
					|	Объект=&Объект
					|	И	ИмяМакета=&ИмяМакета
					|	И	Использование";
	
	Запрос.Параметры.Вставить("Объект", ПутьКМетаданным);
	Запрос.Параметры.Вставить("ИмяМакета", ПутьКОбъектуМетаданных);
	
	УстановитьОтключениеБезопасногоРежима(Истина);
	УстановитьПривилегированныйРежим(Истина);
	
	Выборка = Запрос.Выполнить().Выбрать();
	
	УстановитьПривилегированныйРежим(Ложь);
	УстановитьОтключениеБезопасногоРежима(Ложь);
	
	Результат = Неопределено;
	
	Если Выборка.Следующий() Тогда
		Результат = Выборка.Макет.Получить();
	Иначе
		Если СтрЧислоСтрок(ЧастиПути) = 3 Тогда
			Результат = ОбщегоНазначения.МенеджерОбъектаПоПолномуИмени(ПутьКМетаданным).ПолучитьМакет(ПутьКОбъектуМетаданных);
		Иначе
			Результат = ПолучитьОбщийМакет(ПутьКОбъектуМетаданных);
		КонецЕсли;
	КонецЕсли;
	
	Если Результат = Неопределено Тогда
		ВызватьИсключение СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru = 'Макет ""%1"" не найден. Операция прервана.'"), ПолныйПутьКМакету);
	КонецЕсли;
		
	Возврат Результат;
	
КонецФункции

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

Если найдет - то сразу возвращает, содержимое хранилища. А вот если нет, то через менеджер объекта по полному имени получает макет из конфигурации.

Соответственно для внешней обработки, если ничего в хранилище не будет, она неизбежно упадет в исключение.

Ну и ладно, значит так и обработаем.

Осталось понять где же сам редактор.

Сам редактор - это общая форма "РедактированиеТабличногоДокумента". Ее только нужно открыть с нужными нам параметрами, а при закрытии она вызывает оповещение формы родителя с ОпределеннымиСобытиями.

Проанализировав код программы, находим нужные нам методы.

Открыть редактор, делаем кнопку в самой нашей обработке

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

КонецПроцедуры

оповещение возвращает нам параметр, отредактированный макет

&НаКлиенте
Процедура ОбработкаОповещения(ИмяСобытия, Параметр, Источник)
	Если ИмяСобытия = "Запись_ТабличныйДокумент" И Источник.ВладелецФормы = ЭтотОбъект Тогда
		Макет = Параметр.ТабличныйДокумент;
		АдресМакетаВоВременномХранилище = ПоместитьВоВременноеХранилище(Макет);
		ЗаписатьМакет(Параметр.ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище);
	КонецЕсли;

КонецПроцедуры

Как осуществляется запись макета подсмотрим в форме регистра

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

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

Тоже сделаем кнопочку на форме нашей обработки.

&НаКлиенте
Процедура УдалитьМакет(Команда)
	
	УдаляемыеМакеты = Новый Массив;
	УдаляемыеМакеты.Добавить(ИмяОбъектаМетаданных);
	УдалитьИзмененныеМакеты(УдаляемыеМакеты);

КонецПроцедуры

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

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

&НаСервере
Функция ПолучениеМакета()
	Попытка
		Макет = УправлениеПечатью.МакетПечатнойФормы(ИмяОбъектаМетаданных);
		Элементы.ФормаУдалитьМакет.Видимость=Истина;
	исключение
		Макет = РеквизитФормыВЗначение("Объект").ПолучитьМакет("ПФ_MXL_МакетВПФ");
		Элементы.ФормаУдалитьМакет.Видимость=Ложь;
	КонецПопытки;
	Возврат Макет;
КонецФункции

Заодно будем устанавливать видимость кнопки "удалить", если макет там уже есть.

Ну и выведем наш тестовый пример печатной формы

&НаСервере
Функция СформироватьПФНаСервере()
	ТабДок = Новый ТабличныйДокумент;
	
	Макет = ПолучениеМакета();
	ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
	ОбластьСтрокаШапка = Макет.ПолучитьОбласть("СтрокаШапка");
	ОбластьСтрДанные = Макет.ПолучитьОбласть("СтрДанные");
	ТабДок.Вывести(ОбластьШапка);
	ТабДок.Вывести(ОбластьСтрокаШапка);
	Для Каждого Стр из Объект.Товары Цикл
		ОбластьСтрДанные.Параметры.Заполнить(стр);
		ТабДок.Вывести(ОбластьСтрДанные);
	КонецЦикла;
	
	Возврат ТабДок;
	
КонецФункции

 

Собственно все работает.

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

Если вдруг сильно хочется, посмотреть содержимое регистра, то мы его сможем увидеть только запросом, в консольке.

 

Для наглядности, если не очень понятно, прикладываю эту родившуюся обработку.

Эксприментировал на типовой 1С Бухгалтерии 3.0.52.42.

Вступайте в нашу телеграмм-группу Инфостарт

Обработка печатная форма внешней обработки БСП

См. также

Рефакторинг и качество кода БСП (Библиотека стандартных подсистем) Механизмы платформы 1С Программист 1С:Предприятие 8 1С:Библиотека стандартных подсистем Бесплатно (free)

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

23.09.2025    5625    AlexeyPROSTO_1C    1    

15

БСП (Библиотека стандартных подсистем) Программист 1С:Предприятие 8 1С:Библиотека стандартных подсистем Бесплатно (free)

Уже заезженная тема с выводом в Word макетов при помощи БСП, но некоторые коллеги все равно спрашивают. Поэтому размещаю тут материал, как это сделать за три простых шага. Решение, которым я успешно пользуюсь в случаях, когда не нужна универсальность подключаемых внешних печатных форм.

16.09.2025    3954    _seerco2002    0    

33

Нейросети БСП (Библиотека стандартных подсистем) Инструментарий разработчика Программист 1С:Предприятие 8 1С:Библиотека стандартных подсистем Бесплатно (free)

Telegram-бот для разработчиков 1С, работающих с БСП. Если не знаете нужный под задачу метод или не помните название, то опишите боту задачу и получите список подходящих экспортных методов из общих модулей БСП.

02.09.2025    5398    krasnov322    22    

41

Анализ учета БСП (Библиотека стандартных подсистем) 1С:Предприятие 8 1С:Библиотека стандартных подсистем Бесплатно (free)

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

22.05.2025    3965    128    seperblunt    9    

25

Работа с интерфейсом БСП (Библиотека стандартных подсистем) Механизмы типовых конфигураций Программист 1С:Предприятие 8 1C:ERP Бесплатно (free)

В этой статье я расскажу, как в конфигурации 1С:ERP 2.5 при начале работы системы настроить открытие своих нетиповых форм (в том числе и из внешних обработок). Данную методику можно использовать как на тонком клиенте, так и на мобильном или веб-клиенте, а также в мобильном приложении.

12.05.2025    4813    AlexeyPROSTO_1C    2    

18

БСП (Библиотека стандартных подсистем) Обновление 1С Программист 1C:ERP Бесплатно (free)

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

29.04.2025    5007    krasnoshchekovpavel    7    

19

БСП (Библиотека стандартных подсистем) Механизмы платформы 1С Программист 1С:Предприятие 8 Бесплатно (free)

Описание способа создания глобального обработчика оповещений (событие формы), не привязанного к какой-то конкретной форме.

01.04.2025    3536    krasnoshchekovpavel    0    

11
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. Famza 85 24.11.17 11:12 Сейчас в теме
Для обычных форм также работает?
3. Boneman 302 24.11.17 11:16 Сейчас в теме
(1) в конфигурациях на обычных формах, никогда не было возможности редактировать макет в пользовательском режиме. Этот механизм появился в типовых конфигурациях на управляемых формах.
6. binex 280 20.03.18 20:23 Сейчас в теме
(3) редактирование макета в пользовательском режиме на обычных формах https://infostart.ru/public/337901/
2. necropunk 11 24.11.17 11:15 Сейчас в теме
Хех, любопытно, сам этим вопросом задавался, просматривал эти процедуры, но до реализаци руки не дошли.
4. hotey 42 04.12.17 10:39 Сейчас в теме
Уже же вроде было на управляемых формах:
https://infostart.ru/public/92500/
Для УПП сам доделывал под впиленный туда аналогичный механизм: https://infostart.ru/public/419417/
5. Boneman 302 04.12.17 10:57 Сейчас в теме
(4) ну может и было, я весь интернет не отслеживаю. Да, не отрицаю, посмотрел, там старенькая публикация, предполагается доработка конфигурации. Мой вариант, будет работать на любой типовой.
Хотя в принципе, те же яйца...
10. nano1c 174 05.04.23 11:05 Сейчас в теме
(4) попытался допилить под редактирование внеш.форм последнюю ут11 и вдргу обнаружил что там переделывать вообще кучу всего нужно, видимо БСП теперь совсем другая. Проще не пилить вообще, учитывая что обновлять придется, а если нужно править макеты, то либо делать встроенную форму, либо как здесь советуют делать обработку с кнопкой (вся сложность в том чтобы заставить работать стандартную кнопку редактирования макета - там кучу кишок БСП допиливать нужно, но если сделать свою форму с кнопкой, как описано тут, то все проще).
7. RBA1972 07.04.21 12:34 Сейчас в теме
Подскажите, пожалуйста, новичку - откуда взять "ИмяОбъектаМетаданных"?
8. pridecom 711 15.10.21 14:16 Сейчас в теме
(7) ИмяОбъектаМетаданных = "Документ.АвансовыйОтчет.ПФ_MXL_АвансовыйОтчетВИностраннойВалюте_ru";
9. AxiomABC 09.03.23 12:56 Сейчас в теме
С 129 (примерно) релиза "ОбщаяФорма.РедактированиеТабличногоДокумента" в параметры не передаёт "ТабличныйДокумент". Можно самостоятельно получить из регистра "ПользовательскиеМакетыПечати"
11. zan0zzza 08.11.24 14:55 Сейчас в теме
Спасибо, очень помогли!
12. kwazi 761 01.09.25 12:46 Сейчас в теме
Макет = УправлениеПечатью.МакетПечатнойФормы(ПолноеИмя + ".ПФ_MXL_СчетЗаказ");

Большинству будет достаточно этого. Взято из Библиотека стандартных подсистем (демо), _ДемоРасширение, обработка _ДемоПечатьСчетовНаОплатуПокупателюРасширение. И своим заказчикам сделают подарок - не нужно будет бежать к программисту, каждый раз, когда надо будет отредактировать макет. Печатные формы надо делать с помощью расширений, а не доп. обработок.
Для отправки сообщения требуется регистрация/авторизация