При разработке внешних печатных форм (ВПФ) на управляемых формах программисты часто сталкиваются с проблемой их отладки. В штатном режиме работы Библиотеки стандартных подсистем (БСП) внешняя обработка регистрируется в справочнике «Дополнительные отчеты и обработки», а формирование печатной формы происходит в модуле объекта без вызова пользовательского интерфейса самой обработки. Кроме того, фоновые задания и безопасный режим могут препятствовать срабатыванию точек останова.
Рассмотрим, как правильно организовать процесс отладки внешних печатных форм и обработок, какие изменения можно внести на время тестирования и как настроить среду разработки.
Прежде чем перейти к практическим способам отладки, проанализируем базовые принципы работы печатных форм в БСП:
Печать должны располагаться в модуле объекта обработки, а не в модуле формы. При стандартном вызове из документа или справочника форма обработки вообще не создается.БезопасныйРежим = Истина), где ограничена работа с файловой системой, внешними компонентами и привилегированным кодом. При обычном интерактивном открытии через меню «Файл — Открыть» безопасный режим отключен.Самый простой и быстрый способ отладить алгоритм — добавить во внешнюю обработку основную форму, через которую можно выбрать целевой объект (сотрудника, документ или справочник) и запустить печать нажатием кнопки.
Разберем реализацию этого способа по шагам:
СсылкаНаОбъект с типом нужного документа или справочника (например, СправочникСсылка.Сотрудники или ДокументСсылка.ЗаказКлиента) и выносим его на форму.Печать и размещаем кнопку на форме.Посмотрим на пример кода в модуле управляемой формы:
&НаСервере
Функция ПечатьИзФормыНаСервере()
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(СсылкаНаОбъект);
// Подготавливаем структуры БСП
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ИмяПечатнойФормы");
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
ОбъектыПечати = Новый СписокЗначений;
// Получаем объект обработки и вызываем процедуру печати модуля объекта
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Возврат КоллекцияПечатныхФорм.ВыгрузитьКолонку("ТабличныйДокумент");
КонецФункции
&НаКлиенте
Процедура ПечатьИзФормы(Команда)
Если Не ЗначениеЗаполнено(СсылкаНаОбъект) Тогда
Предупреждение("Выберите объект для формирования печатной формы!");
Возврат;
КонецЕсли;
МассивТабличныхДокументов = ПечатьИзФормыНаСервере();
Для Каждого ТабличныйДокумент Из МассивТабличныхДокументов Цикл
Если ТабличныйДокумент <> Неопределено Тогда
ТабличныйДокумент.Показать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Теперь достаточно открыть обработку через пункт меню «Файл» → «Открыть» в режиме «1С:Предприятие», выбрать нужный объект и нажать на кнопку. Точки останова в модуле формы и в процедуре Печать модуля объекта будут гарантированно срабатывать.
Если требуется максимально точно воспроизвести стандартное поведение БСП с выводом предварительного просмотра, используем вызов клиентской подсистемы печати:
&НаСервере
Функция СформироватьПечатныеФормыНаСервере()
Массив = Новый Массив;
Массив.Добавить(СсылкаНаОбъект);
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ИдентификаторКоманды");
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.Печать(Массив, КоллекцияПечатныхФорм, Новый СписокЗначений, Неопределено);
Возврат ОбщегоНазначения.ТаблицаЗначенийВМассив(КоллекцияПечатныхФорм);
КонецФункции
&НаКлиенте
Процедура КомандаПечать(Команда)
КоллекцияПечатныхФормМассив = СформироватьПечатныеФормыНаСервере();
УправлениеПечатьюКлиент.ПечатьДокументов(КоллекцияПечатныхФормМассив);
КонецПроцедуры
Рассмотрим альтернативный способ, который часто применяется опытными разработчиками:
Чтобы не добавлять временные реквизиты и формы в каждую разрабатываемую печатную форму, можно создать единую служебную обработку-раннер:
.epf на диске и поле выбора объекта конфигурации.
ВнешняяОбработка = ВнешниеОбработки.Создать(ПутьКФайлу, Ложь);
ВнешняяОбработка.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
Если точки останова внутри серверных процедур все равно не срабатывают, проверим настройки среды:
-debug для протокола TCP или соответствующая настройка HTTP-отладки).Выполнение этих рекомендаций позволяет комфортно отлаживать любые внешние печатные формы и обработки на управляемых формах.