1с как получить макет из расширения
Шаблон я заготовил еще на БСП 2.х, сейчас актуальна БСП 3.0.х – шаблон менял с развитием БСП. Сравнивая шаблоны получилось очень наглядно как «1С» реализует концепцию «вести разработку как бы сбоку, оставляя типовые объекты на поддержке, а в идеале на замке». Для этого развивает программный интерфейс подсистем БСП, что позволяет свести к минимуму количество объектов в расширении конфигурации.
Для БСП 2.х и БСП 3.0 макет табличного документа и алгоритм формирования печатной формы располагаю в объекте обработка, расширения конфигурации. «Обычно макет печатной формы располагается при объекте, но если макет является общим для двух и более объектов, то либо его следует располагать в обработке, либо это должен быть общий макет.» [ИТС, БСП гл. 3.38 Печать]. Для меня важно оставить конфигурацию «девственной» и минимум объектов заимствовать в расширение конфигурации, поэтому в обработке.
Если на БСП 2.х укладываемся в 7 шагов:
- Создаем Расширение;
- Создаем обработку;
- Создаем макет в обработке;
- Заимствуем сам объект (например, документ), для которого требуется добавить команду печати;
- Заимствуем Группу команд – «Печать»;
- Создаем команду у обработки и определяем свойства «Тип параметра команды» (шаг 4) и «Группа» (шаг 5);
- В модуле менеджера Обработки располагаем процедуру с кодом формирования печатной формы и методы подсистемы Печать.
После этого в командной панели формы объекта (например, документа) и формы журнала, в меню «Печать» появится созданная команда.
Рис. 1 Расширение конфигурации на БСП 2.х
то на БСП 3.0 получаем желаемое за 4-е шага
- Создаем Расширение;
- Создаем обработку;
- Создаем макет в обработке;
- В модуле менеджера Обработки располагаем процедуру с кодом формирования печатной формы и методы подсистемы Печать.
Благодаря развившемуся программному интерфейсу подсистемы «Печать» в расширении конфигурации ничего заимствовать более не нужно.
Рис. 2 Расширение конфигурации на БСП 3.0
Повинуясь ИТС, подсистему «ПодключаемыеОтчетыИОбработки» заимствуем и в нее включаем созданную обработку.
Вот тот программный интерфейс БСП 3.0, благодаря которому нет более надобности заимствовать «Группу команд», «Документ» и создавать команды у обработки. Следующие процедуры, располагаем в модуле менеджера обработки.
Процедуру формирования печатной формы располагаем в ММ обработки
До процедуры с кодом формирования конкретного табличного документа, я заворачиваю в метод «обертку» ПечатнаяФорма(), в который вынес общие действия характерные для формирования любого табличного документа и обработки массива ссылок, которые нужно распечатать.
В самой процедуре формирования печатной формы я придерживаюсь следующей структуры:
- Определяю параметры печати и макет табличного документа;
- Запросом выбираю нужные данные;
- Результатами выборки заполняю структуру ДанныеПечати и таблицы значений данными табличных частей. Причем, имена ключей структуры и полей таблицы значений совпадают с именами параметров макета;
- Области макета собираю в массив и обхожу его заполняя параметры макета из созданных коллекций на предыдущем шаге, на каждом витке цикла выводя в результирующий табличный документ. Для повышения устойчивости кода заполняю методом ЗаполнитьЗначенияСвойств().
Такой прием позволяет в дальнейшем передвигать параметры по областям макета, не меняя код в процедуре и выглядит элегантно.
После того как я себе «зарубил на носу» разрабатывать «так», когда приходят задачи изменить печатные формы не «так» разработанные (например, мной давно) теперь я испытываю когнитивный диссонанс J . Собрал этот паттерн для себя, может, кто еще проникнется.
//тол+ Обновление публикации от 20.02.2020 г.
Клиентский контекст при формировании печатной формыЗ арекся, не добавлять клиентский контекст, если не наберет +100, но статья набрала.
«В отдельных случаях для формирования некоторых печатных форм может потребоваться клиентский контекст. Например, для запроса дополнительных параметров печатной формы у пользователя непосредственно перед печатью» [ИТС, БСП гл. 3.38 Печать]
Как (было) на БСП 2.х?
В старых (и не очень) конфигурациях я не задумывался о модальности и смело шел любым путем.
Форму(ы) для клиентского контекста, располагаем в той же обработке в расширении. Нужные типы для реквизитов формы, заимствуем из основной конфигурации. Например, справочник «ВидыЦен».
Последовательность действий такая:
- Добавляем команду в обработку;
- Одной строкой кода, в обработчике команды открываем форму;
- Из формы возвращаем параметры;
- Передаем управление в метод Печать() модуля менеджера обработки, формируем табличный документ на сервере;
Рис. 3 Заход в клиентский контекст на БСП 2.0
Далее вендор объявил «священную войну» модальности, и я стал под эти знамена. Вроде ничего сложного, но в меня плохо зашел «отказ от модальности», может потому, что это «костыль» от самой 1С что бы подружиться с браузерами.
Отказ от модальности заставил усложнить код реализующий заход в клиентский контекст:
- В обработчике команды заменяем модальное открытие на не модальный вызов;
- В клиентской форме при создании блокируем окно владельца;
Рис. 4 Заход в клиентский контекст на БСП 2.0 + отказ от модальности
Как теперь можно на БСП 3.х?
- Достаточно в процессе создания команды, в модуле менеджера обработки в процедуре «ДобавитьКомандыПечати» определить свойство «Обработчик», указав имя экспортируемой функции модуля клиентской формы.
- Если предполагается формирование печатной формы на сервере, из клиентского контекста передаем управление в метод Печать() модуля менеджера обработки.
Рис. 5 Заход в клиентский контекст на БСП 3.х
Реквизит формы в расширении определяем кодом, ну что бы уже «ваще не гадить»
Рис. 6 Программное создание реквизита формы.
БСП 3.х. рулит!
П.С. Попытался сложить окна в EDT вертикально, что бы нарезать скрины … и не смог:( Конфигуратор forever!
Платформа 8.3.10.2252
Добавляю макет документа в расширение, дорабатываю, в режиме предприятия пытаюсь печатать - дамп
отключаю расширение, перезапускаю - пробую печатать - дамп
столкнулся второй раз за сегодня, первый раз "спасло" ТиИ с реиндексацией, логикой и сжатием, сейчас проверю - спасет ли второй раз
это нормально? макеты в расширении кто нибудь дорабатывал, работают?
(0) Дорабатывал, работают. Сталкивался с дампом при работе расширения (но не из-за макета)после обновления , вот не помню, платформы или конфигурации. Так и не разобрался почему. (как разберешься, если при попытки запуска обрабтки из расширения программа тут же в краш)Но помогло создание расширения заново. Ничего не менял ни в коде ни в совместимости и проблема ушла
(1) а расширение вновь создавать - содать пустое и сравнить-объединить с выгруженным?
(2) да Создавал пустое и вновь все переносил в расширение. Причем создать и загрузка из файла не помогла, только именно создание с нуля. Но код переносил простым копированием из старого файла расширения. Конечно это не панацея но мне помогло
(4) мне не помогло :(
стоит удалить из расширения и все замечательно
если у кого есть возможность - напишите на хотлайн, вдруг поправят.
(6) правил сразу три макета - моксель, док и одт
просто наличие любого из заимствованных макетов в расширении вызывает дамп, независимо от типа макета
у меня два расширения в одной конфигурации - во второе случайно добавил эти три макета, удалил - думал в этом была причина, оказалось нет
(7) Вот наверное в чем дело. Неправильно пняли друг друга. Макеты я НЕ ЗАИМСТВОВАЛ, а КОПИРОВАЛ из формы основной конфы в форму расширения и там правил. Не уверен, что расширение поддерживает заимствование макета
(9) по пкм - дает заимствовать, а вот работать видимо пока не совсем может
в принципе - можно было скопировать, дать другие имена и переопределить модуль менеджера, где макеты определяются.
ну да ладно, итак надоело эксперименты ставить )
УправлениеПечатью.МакетПечатнойФормы("Документ.КоммерческоеПредложениеКлиенту.ПФ_MXL_КоммерческоеПредложение_РФК") - говорит нет такого, проверил - точно не видит, зато через метаданные - макет есть
прикольно
Документы.КоммерческоеПредложениеКлиенту.ПолучитьМакет(Метаданные.Документы.КоммерческоеПредложениеКлиенту.Макеты.ПФ_MXL_КоммерческоеПредложение_РФК)
возвращает неопределено
эээх
(0) Ты первопроходец. Еще никто толком не работает с расширением конфигурации и толком ничего не знает. Все правят всё по старинке.
(0) А я вообще не додумался до того, что макеты можно заимствовать из основной конфигурации ) просто добавил в расширении новый макет, скопировал в него всё сос тарого, сделал нужные изменения и в нужном месте делаю подмену его вызова.
(13)А откуда обращаешься к макету? Обращение из модуля менеджера документа в расширении отлично все видит
(21) пробовал из модуля менеджера заимствованного документа и из модуля менеджера исходного документа, а (13) - вызов из общего модуля
(28) ты не поверишь - автозаполнение в конфигураторе работает, ибо оно работает по метаданным ,а в них макет есть
не работает уже в режиме предприятия
+30 проверил, расширение в таком случае отвалилось, поскольку существует объект с таким именем
итого - ничего не вышло, пошел добавлять макет в рабочую конфигурацию.
(31) Попробую найти в своем бардаке подобное решение с макетом в расширении или создам новое. Отпишусь
(36) Слушай, проверил все вдоль и поперек. РАБОТАЕТ! Скрины нужны? Создал в обработке (копированием) ПечатьСчетаНаОплату новый макет счета. В модуле менеджера обработки только одна запись замены макета
В созданный макет просто вставил маркер, чтобы определять что макет из расширения. И при вызове из заимствованной формы и при вызове из формы конфигурации срабатывает на раз-два. Шли свое расширение, очень любопытно посмотреть
А может у тебя платформа 8.3.10 и стоит режим совместимости с 8.3.8?
(38) нет, совместимость выключена совсем
(37) а макет создан в основной конфигурации или в расширении?
у меня вся соль в том, что метаданные макет в расширении видят, СП его при автодополнении кода подставляет, но макет не видится менеджером объекта
(37) слать - уже неохота возвращать макет взад, я его уже вычистил.
Многие из нас знакомы с замечательным механизмом БСП "Макеты печатных форм", позволяющим пользователю самостоятельно менять макеты из метаданных конфигурации. В этой статье мы рассмотрим, как при помощи механизма расширения (модулей) данный функционал можно распространить на дополнительные обработки внешних печатных форм.
Релизацию задачи можно разделить на три шага перехвата и модернизации механизмов:
При разработке внешних печатных форм следует придерживаться определенных правил.
Разберем каждый из шагов подробнее.
1. Перехват и модернизации механизма заполнения типового списка макетов
Механизм находится в процедуре формы РегистрСведений.ПользовательскиеМакетыПечати.Форма.МакетыПечатныхФорм.ЗаполнитьТаблицуМакетовПечатныхФорм().
Добавляем форму МакетыПечатныхФорм в расширение, в модуле формы прописываем следующий код:
Схематично вышеприведенный код работает следующим образом:
2. Перехват и модернизации механизма получения макета по имени объекта метаданных
Механизм находится в функции ОбщийМодуль.УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету)
Добавляем общий модуль УправлениеПечатью в расширение. В модуле расширения пишем следующий код:
Схематично вышеприведенный код работает следующим образом:
3. Перехват и модернизации механизма записи модернизированного пользовательского макета
Механизм находится в функции ОбщийМодуль.УправлениеПечатью.ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище).
Общий модуль УправлениеПечатью мы уже добавили в наше расширение, поэтому сразу добавляем в модуль УравлениеПечатью следующий код:
Схема работы кода выглядит аналогично п.2.
4. Особенности печати пользовательского макета для внешней печатной формы
Разрабатывая внешнюю печатную форму, необходимо помнить о нескольких несложных правилах:
Вот, собственно, и все. Буду раз вашим комментариям.
Системные требования
Платформа: не ниже v8.3.11
БСП: v2.4.4.145 - v3.0.1.355
Специальные предложения
Мысли об оптимизации.
В этой (1.0) версии, для получения макета непосредственно из внешней обработки, выполнятся запрос к базе данных, хотя контекст, из которого вызывается функция МакетПечатнойФормы(), в большинстве случаев уже несет в себе ОбработкуОбъект.
Можно написать отдельную функцию получения макета, где входящим параметром нужно передавать ОбработкуОбъект, но такое решение усложняет, т.к. необходимо во внешних обработках переписывать место получения макета.
Если бы расширение позволяло добавлять в перехватываемую функцию необязательные параметры.
Смотрю в сторону дополнительных свойств ОбработкиОбъекта. Тогда тем, кому важна временнАя оптимизация получения макета могли бы добавлять ОбработкуОбъект в дополнительные свойства перед вызовом функции МакетПечатнойФормы().
Многие из нас знакомы с замечательным механизмом БСП "Макеты печатных форм", позволяющим пользователю самостоятельно менять макеты из метаданных конфигурации. В этой статье мы рассмотрим, как при помощи механизма расширения (модулей) данный функционал можно распространить на дополнительные обработки внешних печатных форм.
Релизацию задачи можно разделить на три шага перехвата и модернизации механизмов:
При разработке внешних печатных форм следует придерживаться определенных правил.
Разберем каждый из шагов подробнее.
1. Перехват и модернизации механизма заполнения типового списка макетов
Механизм находится в процедуре формы РегистрСведений.ПользовательскиеМакетыПечати.Форма.МакетыПечатныхФорм.ЗаполнитьТаблицуМакетовПечатныхФорм().
Добавляем форму МакетыПечатныхФорм в расширение, в модуле формы прописываем следующий код:
Схематично вышеприведенный код работает следующим образом:
2. Перехват и модернизации механизма получения макета по имени объекта метаданных
Механизм находится в функции ОбщийМодуль.УправлениеПечатью.МакетПечатнойФормы(ПутьКМакету)
Добавляем общий модуль УправлениеПечатью в расширение. В модуле расширения пишем следующий код:
Схематично вышеприведенный код работает следующим образом:
3. Перехват и модернизации механизма записи модернизированного пользовательского макета
Механизм находится в функции ОбщийМодуль.УправлениеПечатью.ЗаписатьМакет(ИмяОбъектаМетаданныхМакета, АдресМакетаВоВременномХранилище).
Общий модуль УправлениеПечатью мы уже добавили в наше расширение, поэтому сразу добавляем в модуль УравлениеПечатью следующий код:
Схема работы кода выглядит аналогично п.2.
4. Особенности печати пользовательского макета для внешней печатной формы
Разрабатывая внешнюю печатную форму, необходимо помнить о нескольких несложных правилах:
Вот, собственно, и все. Буду раз вашим комментариям.
Системные требования
Платформа: не ниже v8.3.11
БСП: v2.4.4.145 - v3.0.1.355
Специальные предложения
Мысли об оптимизации.
В этой (1.0) версии, для получения макета непосредственно из внешней обработки, выполнятся запрос к базе данных, хотя контекст, из которого вызывается функция МакетПечатнойФормы(), в большинстве случаев уже несет в себе ОбработкуОбъект.
Можно написать отдельную функцию получения макета, где входящим параметром нужно передавать ОбработкуОбъект, но такое решение усложняет, т.к. необходимо во внешних обработках переписывать место получения макета.
Если бы расширение позволяло добавлять в перехватываемую функцию необязательные параметры.
Смотрю в сторону дополнительных свойств ОбработкиОбъекта. Тогда тем, кому важна временнАя оптимизация получения макета могли бы добавлять ОбработкуОбъект в дополнительные свойства перед вызовом функции МакетПечатнойФормы().
Читайте также: