При самостоятельной разработке или копировании типовых печатных форм во внешнюю печатную форму (ВПФ) разработчики часто сталкиваются с типовыми ошибками подсистемы печати Библиотеки стандартных подсистем (БСП). Разберем детально причины возникновения этих ошибок, методы их быстрого устранения и способы отладки внешних печатных форм в среде 1С:Предприятие 8.3.
Проанализируем текст базовой ошибки, возникающей при вызове внешней обработки:
В обработчике печати не был сформирован табличный документ для: ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара
Выясним причину такого поведения подсистемы печати. В стандартной процедуре регистрации внешней обработки СведенияОВнешнейОбработке() каждой команде задается строго определенный идентификатор. Например, разработчик указывает ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара. Однако в процедуре Печать модуля объекта часто используется скопированный из типовой конфигурации вызов, где префикс отсутствует:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, "ЗаданиеНаОтборРазмещениеТовара") Тогда
// Код формирования
КонецЕсли;
КонецПроцедуры
Рассмотрим, что происходит в этот момент: метод УправлениеПечатью.НужноПечататьМакет ищет в переданной коллекции имя ЗаданиеНаОтборРазмещениеТовара. Поскольку БСП ожидает идентификатор ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара, функция возвращает значение Ложь. Блок формирования макета пропускается, результирующий табличный документ в коллекцию не добавляется, и система генерирует исключение.
Для исправления ситуации обеспечим строгое соответствие идентификатора команды и проверяемого имени макета:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ИмяМакета = "ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара";
Если УправлениеПечатью.НужноПечататьМакет(КоллекцияПечатныхФорм, ИмяМакета) Тогда
ТабличныйДокумент = СформироватьЗаданиеНаОтборРазмещениеТовара(МассивОбъектов, ОбъектыПечати);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
ИмяМакета,
НСтр("ru = 'Задание на отбор (размещение) товара'"),
ТабличныйДокумент
);
КонецЕсли;
КонецПроцедуры
При переносе кода функции печати из типового документа часто копируются строчки, работающие с контекстными переменными формы документа, например:
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_" + ПараметрыПечати.ИмяФормы;
Если в вызывающую функцию передать пустой параметр или Неопределено, обращение к несуществующему свойству ИмяФормы вызовет фатальную ошибку. Рассмотрим правильные варианты работы с этим свойством:
ТабличныйДокумент.ИмяПараметровПечати используется платформой для запоминания параметров печати пользователя (масштаб, ориентация, колонтитулы) в системном хранилище. Для внешних печатных форм достаточно указать уникальную статическую строку:
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ЗаданиеНаОтборРазмещениеТовара";
ПараметрыПечати, в самом начале тела функции добавим проверку:
Если ПараметрыПечати = Неопределено Тогда
ПараметрыПечати = Новый Структура;
КонецЕсли;
Разберем по шагам, как быстро проверять и отлаживать код ВПФ без постоянного переподключения файла через справочник дополнительных отчетов и обработок.
ДокументСсылка соответствующего типа и кнопку Сформировать. В обработчике нажатия кнопки сымитируем вызов подсистемы печати:
&НаСервере
Процедура ВыполнитьПечатьНаСервере()
МассивОбъектов = Новый Массив;
МассивОбъектов.Добавить(ДокументСсылка);
КоллекцияПечатныхФорм = УправлениеПечатью.ПодготовитьКоллекциюПечатныхФорм("ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара");
ОбъектыПечати = Новый СписокЗначений;
ПараметрыВывода = УправлениеПечатью.ПодготовитьСтруктуруПараметровВывода();
ЭтотОбъект = РеквизитФормыВЗначение("Отчет"); // или "Объект" для внешней обработки
ЭтотОбъект.Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода);
// Получаем готовый табличный документ для просмотра
СтрокаТаблицы = КоллекцияПечатныхФорм.Найти("ПФ_MXL_ЗаданиеНаОтборРазмещениеТовара", "ИмяМакета");
Если СтрокаТаблицы <> Неопределено Тогда
Элементы.ПолеТабличногоДокумента.Вывести(СтрокаТаблицы.ТабличныйДокумент);
КонецЕсли;
КонецПроцедуры
ОбщийМодуль.ДополнительныеОтчетыИОбработки и найдем место вызова процедуры печати подключаемой обработки. Установим точку останова перед строкой вызова метода Печать. Запустим печать из документа и по нажатию клавиши F11 выполним вход непосредственно в модуль объекта внешней формы.При адаптации алгоритмов часто возникает ошибка синтаксического контроля Ожидается ключевое слово 'КонецЕсли'. Если логических условий в коде много, визуальный поиск пропущенного закрывающего оператора отнимает много времени. Рассмотрим быстрые способы поиска проблемного места в Конфигураторе:
Ctrl + A и нажмем Ctrl + Shift + F (пункт меню Текст — Блок — Форматировать). Платформа автоматически сдвинет отступы вложенных условий. Пролистав код, мы сразу увидим строчку, где отступ неестественно съехал вправо и не вернулся обратно на свой уровень.Если и нажмем Ctrl + ]. Курсор автоматически переместится к соответствующему оператору КонецЕсли. Если перехода не происходит или курсор прыгает не на ту конструкцию, значит, парность условий нарушена именно в этом блоке.Ctrl + G и введем нужный номер строки.