Версия 5.1 БП 3.0.73.54 стал делать ВПФ, выяснилось (внезапно), что в общем модуле "УправлениеПечатью" процедура "ПодготовитьКоллекциюПечатныхФорм" лишилась "Экспорт", пришлось вставить немного изменённую в модуль формы ВПФ.
В принципе всё описано в исходной публикации //infostart.ru/public/162019/.
Могу добавить только, что для последних версий БСП и, соответственно, конфигураций на управляемых формах, наметилась тенденция выносить процедуры и функции печати из модуля менеджера в общие модули. Поэтому, чаще всего, созданную конструктором ВПФ придётся допиливать, перенося в модуль ВПФ эти самые процедцры и функции из общих модулей.
Инструкция для управляемого приложения
Создадим ВПФ, например, для документа Счет покупателю, печатная форма Счет-заказ (пример делаю на платформе 8.3.8.1784 БП 3.0.43.247 база ДЕМО).
Создание ВПФ
Исхожу из того, что пользоваться конфигуратором, тот, кто создаёт ВПФ умеет, потому картинки оттуда рисовать не будем. Результатом будет внешняя форма, которая ничем не отличается от типовой печатной формы документа.
Итак, по пунктам:
- Копируем модуль менеджера документа Счет покупателю, открыв его в Конфигураторе. Копируется весь модуль, например, нажав Ctrl + A, потом Ctrl + С.
- Открываем конструктор в режиме учета, выбираем Тип документа СчетНаОплатуПокупателю и нажимаем кнопку Вставить:
- Жмём следующую кнопку Анализ. Получаем на закладке Команды и функции список доступных команд печати, список процедур и функций модуля менеджера, и текст выделенных процедур в правом окне. В левом верхнем окне снимаем все галки (кнопки управление вверху) и отмечаем нужную нам печатную форму СчетЗаказ. В левом нижнем окне нужные для печати выбранной формы процедуры будут отмечены зелёным цветом автоматически. Если необходимо, можно отметить и другие процедуры и функции с помощью кнопки нужна\ не нужна, они будут перенесены в итоговую обработку, но использовать автоматически ВПФ их не будет, поэтому подумайте, оно Вам надо? В правом окне можно просмотреть текст выделенных в левом нижнем окне процедур и функций. Текст можно изменить, правда никогда этой возможностью не пользовался, но мало ли кому понадобится?:
- Следующая кнопка Сформировать. Создаёт текст модуля обработки ВПФ:
- Жмём Скомпилировать – на экране ничего не изменится, просто будет создана ВПФ.
- Кнопка Сохранить предложит выбрать путь, куда сохранить созданную обработку и открыть созданную ВПФ для проверки. ВПФ создаётся со встроенной формой обработки, поэтому её можно отлаживать не прибегая к дополнительным средствам. При открытии ВПФ сразу проверяем работоспособность, выбрав документ и сформировав печатную форму:
Как уже говорилось, сейчас она ничем не отличается от типовой, и если нужно что-то изменить, это придётся делать руками, о чём расскажу ниже. Хочется заметить, что указанный порядок формирования ВПФ минимален, остальное пробуйте сами…или не пробуйте. Здесь фактически просто перечислены шаги быстрого создания ВПФ для последующей доработки.
Что удивило, и типовая и внешняя вместо суммы прописью выдают в демке сумму числом:
Изменение полученной ВПФ
Для исправления ситуации, и добавления чего-то своего в ВПФ, начнём вносить изменения:
- Вставим макет счета в ВПФ (по умолчанию используется тот же, что и в типовой форме счета). Для этого посмотрим, какой макет используется. В модуле объекта ВПФ :
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "СчетЗаказ") Тогда
ТаблицаСведенийСчетНаОплату = ПолучитьТаблицуСведенийСчетаНаОплату(МассивОбъектов);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(КоллекцияПечатныхФорм, "СчетЗаказ", "Счет на оплату",
ПечатьТорговыхДокументов.ПечатьСчетаНаОплату(ТаблицаСведенийСчетНаОплату, ОбъектыПечати),,"ОбщийМакет.ПФ_MXL_СчетЗаказ");
ПараметрыВывода.Вставить("ФормироватьЭД", Истина);
КонецЕсли;
Из процедуры Печать видим, что нам нужен общий макет ПФ_MXL_СчетЗаказ. Копируем его в конфигураторе. Ветка Общие – Общие макеты:
Затем в обработке встаём на Макеты и вставляем, теперь макет есть в ВПФ, нужно изменить код модуля, чтобы использовать именно его, а не общий макет:
- Анализируем текст процедуры печати и добавляем процедуры и функции общих модулей, использующиеся при формировании печатной формы:
- Первое, что меняем, это убираем из процедуры печать вызов общего макета – удаляем текст «ОбщийМакет.»
- Видим, что табличный документ формируется в общем модуле ПечатьТорговыхДокументов, функцию ПечатьСчетаНаОплату из которого копируем в модуль нашей ВПФ (встаем на текст ПечатьСчетаНаОплату и жмём F12 , выбираем функцию и попадаем в общий модуль, где копируем функцию). Я предпочитаю добавленные процедуры и функции включать в отдельную область, которую выделяю в модуле ВПФ:
#Область ДобавленныеПроцедурыИФункции
//между этими строками вставляем скопированные из общих модулей процедуры
#КонецОбласти
- Сохраняем то, что получилось (или нажимаем на синтаксис контроль). Получаем сообщение об ошибках:
{ВнешняяОбработка.СчетНаОплатуПокупателю_ВнешняяПечатная.МодульОбъекта(371,3)}: Процедура или функция с указанным именем не определена (ВывестиЗаголовокПредупреждение)
<<?>>ВывестиЗаголовокПредупреждение(СведенияОДокументе.Получатель, ТабличныйДокумент, Макет); (Проверка: Сервер).
Поскольку не определена процедура без указания через точку, делам вывод, что она находится в том же общем модуле, что и скопированная нами перед этим функция ПечатьСчетаНаОплату – находим её там, и копируем в модуль ВПФ. И вновь пробуем сохранить. В данном случае нам повезло – ошибок больше нет. В обще-то это редкость, по большому счёту, это самый трудоёмкий момент. Бывает, что может понадобится копирование нескольких процедур и функций, и, может быть, даже не из одного модуля. Главное не просто скопировать, но и правильно их потом вызывать. Универсального рецепта для этого у меня нет.
- Убираем в процедуре печать строку «ПечатьТорговыхДокументов.» - теперь эта функция будет вызываться из модуля ВПФ.
- Сохраняем ВПФ, проверяеем в режиме учёта – всё работает, только теперь, всё, что нужно для изменений, у нас находятся в ВПФ. Теперь можно делать необходимые изменения .
- Изменяем текст модуля ВПФ:
- Вызов встроенного макеета вместо общего – находим строку "ОбщийМакет.ПФ_MXL_СчетЗаказ", видим, что находится она в добавленной функции из общего модуля, и не меняя общий модуль ПечатьТорговыхДокументов (сохраняя типовую конфигурацию на полной поддержке) изменяем функцию модуля ВПФ:
//Макет = УправлениеПечатью.МакетПечатнойФормы("ОбщийМакет.ПФ_MXL_СчетЗаказ"); //Было
Макет = ПолучитьМакет("ПФ_MXL_СчетЗаказ"); //Стало
Внимание: После каждого изменения лучше сохранять ВПФ и проверять работоспособность, если менять всё подряд, потом может получится, что легче будет начать с начало, чем исправить то, что наменяли. Ещё совет, когда всё работает, и собираетесь что- то допилить, создайте новую версию ВПФ, и меняйте её – останется рабочий вариант, и текущий, с попыткой допила)))
- Исправим сумму прописью – сейчас она почему – то выводится числом, вариантов много, можно, например, использовать форматную строку в ячейке макета СуммаПрописью, но это некрасиво, поэтому попробуем найти место в тексте модуля, где заполняется этот параметр и исправим его. Видим строку:
ДанныеПечатиСуммаПрописью.СуммаПрописью = ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью(СуммаКПрописи, СведенияОДокументе.Валюта);
Отладчиком смотрим, где собака порылась. На вид всё фильдиперсово, однако видим вместо строки число. Видим, что при вызове функции общего модуля ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью в параметре СведенияОДокументе.Валюта пусто. Вариантов исправления много – можно вытащить процедуру СформироватьСуммуПрописью в модуль ВПФ, можно посмотреть заполнение строки СведенияОДокументе и заполнить валюту там, можно проверить заполнение валюты, и если там пусто использовать валюту по умолчанию из константы. Мне лень, поэтому возьмём валюту из договора:
ДанныеПечатиСуммаПрописью.СуммаПрописью = ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью(СуммаКПрописи, СведенияОДокументе.ДоговорКонтрагента.ВалютаВзаиморасчетов);//СведенияОДокументе.Валюта);
Сохраняем, проверяем:
- Теперь добавим в макет новый параметр, например Комментарий и выведем после итоговой строки (пример условный, просто как пример)))):
Обратите внимание, что параметр находится внутри области макета, создал я его так (профи просьба не читать далее)))), встав на СуммаПрописью правой кнопкой – раздвинуть, потом скопировал СуммаПрописью, вставил в среднюю стоку и поменял в третьей строчке СуммаПрописью на Комментарий.
В тексте модуля делаем следующие изменения:
ДанныеПечатиСуммаПрописью = Новый Структура("ИтоговаяСтрока, СуммаПрописью, Комментарий");
и четырьмя строчками ниже вставляем строку:
ДанныеПечатиСуммаПрописью.Комментарий = СокрЛП(СведенияОДокументе.Документ.Комментарий);
В итоге получим кусок кода:
// Вывести Сумму прописью
ОбластьМакета = Макет.ПолучитьОбласть("СуммаПрописью");
ДанныеПечатиСуммаПрописью = Новый Структура("ИтоговаяСтрока, СуммаПрописью, Комментарий");
СуммаКПрописи = Сумма + ?(СведенияОДокументе.СуммаВключаетНДС, 0, СуммаНДС);
ДанныеПечатиСуммаПрописью.ИтоговаяСтрока = СтроковыеФункцииКлиентСервер.ПодставитьПараметрыВСтроку(НСтр("ru='Всего наименований %1, на сумму %2'"), НомерСтроки, ОбщегоНазначенияБПВызовСервера.ФорматСумм(СуммаКПрописи, СведенияОДокументе.Валюта));
ДанныеПечатиСуммаПрописью.СуммаПрописью = ОбщегоНазначенияБПВызовСервера.СформироватьСуммуПрописью(СуммаКПрописи, СведенияОДокументе.ДоговорКонтрагента.ВалютаВзаиморасчетов);//СведенияОДокументе.Валюта);
ДанныеПечатиСуммаПрописью.Комментарий = СокрЛП(СведенияОДокументе.Документ.Комментарий);
Сохраняем, проверяем:
Заключение
Не претендую на полноту и истину в последней инстанции в изложении. Просто показал на простом примере, как быстро создать и немного изменить внешнюю печатную форму счет на оплату покупателю в БП 3.0. Может кому поможет…