При разработке или доработке внешней печатной формы (ВПФ) для конфигураций, использующих Библиотеку стандартных подсистем (БСП), например УТ 11.5, возникает стандартная проблема. Для отладки изменений приходится постоянно выполнять рутинную процедуру: сохранить файл обработки, зайти в "Дополнительные отчеты и обработки", найти нужную форму, нажать "Обновить из файла" и только потом проверять результат. Этот процесс отнимает много времени и усложняет отладку.
Рассмотрим, как модифицировать внешнюю печатную форму таким образом, чтобы ее можно было запускать напрямую через меню "Файл - Открыть". Это позволит нам вносить изменения в код и сразу же проверять их, значительно ускоряя процесс разработки.
Самый простой и эффективный способ — добавить в нашу обработку специальную форму, которая будет служить для отладки. Важно понимать, что при подключении ВПФ через стандартный механизм БСП эта форма будет проигнорирована, так как система обращается напрямую к экспортным процедурам модуля объекта. Таким образом, наличие отладочной формы не помешает работе ВПФ в боевом режиме.
Разберем по шагам, как это сделать.
Создаем новую форму. В дереве метаданных вашей внешней обработки добавьте новую управляемую форму. Назначьте ее основной формой обработки. Это нужно, чтобы именно она открывалась при запуске через "Файл - Открыть".
Добавляем реквизиты на форму. Нам понадобится как минимум один реквизит для выбора документа, на основе которого будет формироваться печатная форма. Назовем его, например, ТестовыйДокумент и укажем для него нужный тип ссылки (например, ДокументСсылка.РеализацияТоваровУслуг).
Создаем кнопку для формирования отчета. Добавьте на форму команду, например, "Сформировать", и перетащите ее на форму в виде кнопки. В обработчике нажатия этой кнопки мы и напишем основной код для эмуляции вызова БСП.
Пишем код для эмуляции вызова БСП. Когда мы печатаем документ из системы, БСП подготавливает и передает в нашу ВПФ несколько служебных параметров. В режиме отладки мы должны создать их вручную. Процедура печати в модуле объекта ВПФ обычно имеет следующую сигнатуру:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// ... логика формирования печатной формы
КонецПроцедуры
Наша задача — подготовить все эти параметры в коде кнопки на отладочной форме и вызвать эту процедуру.
Посмотрим на пример кода для обработчика нажатия кнопки "Сформировать":
&НаКлиенте
Процедура Сформировать(Команда)
// 1. Проверяем, выбран ли тестовый документ
Если НЕ ЗначениеЗаполнено(Объект.ТестовыйДокумент) Тогда
Сообщить("Необходимо выбрать документ для печати!");
Возврат;
КонецЕсли;
// 2. Подготавливаем параметры для вызова процедуры Печать
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(Объект.ТестовыйДокумент);
// Этот параметр используется для сопоставления комплектов документов,
// для простой отладки можно передать пустой список
ОбъектыПечати = Новый СписокЗначений;
// Этот параметр используется для возврата настроек печати,
// например, доступности редактирования
ПараметрыВывода = Новый Структура;
// 3. Формируем коллекцию печатных форм. Это ключевой момент.
// БСП ожидает Таблицу Значений с определенной структурой.
КоллекцияПечатныхФорм = Новый ТаблицаЗначений;
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяВРЕГ", Новый ОписаниеТипов("Строка"));
КоллекцияПечатныхФорм.Колонки.Добавить("Синоним", Новый ОписаниеТипов("Строка"));
КоллекцияПечатныхФорм.Колонки.Добавить("ТабличныйДокумент", Новый ОписаниеТипов("ТабличныйДокумент"));
КоллекцияПечатныхФорм.Колонки.Добавить("ИмяМакета", Новый ОписаниеТипов("Строка")); // Иногда используется для выбора макета
// ... можно добавить и другие колонки, если ваша логика их использует:
// Картинка, ПолныйПутьКМакету, ИмяФайлаПечатнойФормы и т.д.
// 4. Вызываем серверную процедуру, которая вызовет метод из модуля объекта
СформироватьНаСервере(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода)
// 5. Вызываем экспортную процедуру Печать из модуля объекта нашей обработки
// Обратите внимание, что мы получаем объект обработки через РеквизитФормыВЗначение("Объект")
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// 6. Показываем результат пользователю
// После выполнения процедуры Печать, в нашей таблице КоллекцияПечатныхФорм
// должен появиться заполненный табличный документ.
Если КоллекцияПечатныхФорм.Количество() > 0 Тогда
ТабДок = КоллекцияПечатныхФорм[0].ТабличныйДокумент;
ТабДок.Показать("Результат печати");
Иначе
Сообщить("Печатная форма не была сформирована!");
КонецЕсли;
КонецПроцедуры
Что мы сделали? Мы создали на форме "оболочку", которая имитирует поведение БСП: собирает необходимые параметры, вызывает основную процедуру печати и, в отличие от БСП, самостоятельно показывает результат на экране. Теперь вы можете открывать вашу ВПФ через "Файл - Открыть", выбирать тестовый документ, нажимать "Сформировать" и сразу видеть результат, а также использовать полноценную отладку с точками останова.
При регистрации ВПФ в "Дополнительных отчетах и обработках" мы указываем тип команды. От этого зависит, где система будет искать "точку входа" — основную процедуру для выполнения.
ВызовСерверногоМетода): Это наиболее распространенный вариант для ВПФ. Система ищет экспортную процедуру с именем Печать в модуле объекта обработки. Именно этот случай мы рассмотрели выше. Наше отладочное решение идеально подходит для этого типа.
ВызовКлиентскогоМетода): В этом случае система ищет экспортную процедуру с именем Печать в модуле основной формы обработки. Этот подход используется реже, но тоже встречается. Если ваша ВПФ использует клиентский метод, то отладка становится еще проще — вам даже не нужно создавать отдельную отладочную форму, так как вся логика уже находится в модуле формы. Однако для универсальности и совместимости рекомендуется использовать серверный метод.
Важно понимать, что термины "серверный" и "клиентский" метод в данном контексте не связаны с тем, в каком режиме работает ваша база (файловая или клиент-серверная). Они определяют лишь местоположение исполняемой процедуры в структуре метаданных обработки.
.epf, код придется переносить из расширения в обработку вручную.
Таким образом, создание простой отладочной формы внутри самой ВПФ — это мощный и удобный прием, который экономит массу времени и делает процесс разработки и отладки внешних печатных форм гораздо более комфортным.