При разработке внешних печатных форм (ВПФ) на базе Библиотеки стандартных подсистем (БСП) в конфигурациях «1С:Управление торговлей 11», «1С:ERP» или «1С:Комплексная автоматизация» разработчики часто сталкиваются с ситуацией, когда вместо сформированного документа в пользовательском режиме отображается системное сообщение: «Печатная форма недоступна». Разберем детально, из-за чего возникает данная ошибка, как работает механизм печати БСП и как правильно доработать код внешней печатной формы УПД.
Проанализируем архитектуру подсистемы «Управление печатью». Сообщение «Печатная форма недоступна» формируется платформой не случайным образом. Это происходит в следующих типовых ситуациях:
ТабличныйДокумент, высота которого равна 0 (в него не было выведено ни одной строки или секции макета), подсистема БСП расценивает это как отсутствие данных для вывода и блокирует отображение формы.РеализацияТоваровУслуг). В итоге коллекция типов документов к печати остается пустой, цикл вывода макета не выполняется, а функция возвращает пустую таблицу.СведенияОВнешнейОбработке(), должен строго совпадать со вторым параметром при добавлении макета в коллекцию через метод УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(). При различии хотя бы в один символ подсистема не сможет сопоставить результат с вызванным действием.Рассмотрим по шагам правильную реализацию экспортной функции печати и алгоритма формирования табличного документа во внешней обработке.
Шаг 1. Проверяем регистрацию и экспортную функцию печати
Посмотрим на пример функции Печать в модуле объекта внешней печатной формы. Она должна принимать стандартный набор параметров БСП и вызывать процедуру заполнения коллекции:
Функция Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
СтруктураТипов = ОбщегоНазначенияУТ.СоответствиеМассивовПоТипамОбъектов(МассивОбъектов);
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"УПД_Серии",
"Универсальный передаточный документ (УПД)",
СформироватьПечатнуюФормуУПД_Серии(СтруктураТипов, МассивОбъектов, ОбъектыПечати)
);
ФормированиеПечатныхФорм.ЗаполнитьПараметрыОтправки(ПараметрыВывода.ПараметрыОтправки, СтруктураТипов, КоллекцияПечатныхФорм);
КонецФункции
Шаг 2. Исправляем сбор данных для документов реализации
Выясним причину возврата пустого документа. В процедуре формирования УПД массив ОснованияНаРеализацию накапливает ссылки на документы продажи. Чтобы передать их в печать, необходимо проанализировать выставленные счета-фактуры с помощью метода Документы.СчетФактураВыданный.ПолучитьСчетаФактурыНаПечать(). Если этого не сделать, массив ДокументыБезВыданногоСчетаФактуры останется пустым, и цикл вывода макета просто не запустится.
Разберем исправленный фрагмент функции формирования печатного документа:
Функция СформироватьПечатнуюФормуУПД_Серии(СтруктураТипов, МассивОбъектов, ОбъектыПечати, ПараметрыПечати = Неопределено, КомплектыПечати = Неопределено) Экспорт
УстановитьПривилегированныйРежим(Истина);
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.АвтоМасштаб = Истина;
ТабличныйДокумент.ОриентацияСтраницы = ОриентацияСтраницы.Ландшафт;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_УПД_Серии";
СтруктураТиповНаПечать = Новый Структура;
МассивСчетФактураВыданный = Новый Массив;
ОснованияНаРеализацию = Новый Массив;
ДокументыБезВыданногоСчетаФактуры = Новый Массив;
Если ПараметрыПечати = Неопределено Тогда
ПараметрыПечати = Новый Структура;
КонецЕсли;
// Распределяем ссылки по типам документов
Для Каждого СтруктураОбъектов Из СтруктураТипов Цикл
ИмяОбъекта = Сред(СтруктураОбъектов.Ключ, 10);
Если ИмяОбъекта = "СчетФактураВыданный" Тогда
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(МассивСчетФактураВыданный, СтруктураОбъектов.Значение);
ИначеЕсли ИмяОбъекта = "РеализацияТоваровУслуг" Тогда
ОбщегоНазначенияКлиентСервер.ДополнитьМассив(ОснованияНаРеализацию, СтруктураОбъектов.Значение);
КонецЕсли;
КонецЦикла;
// Обязательный блок: анализ связанных счетов-фактур для реализаций
Если ОснованияНаРеализацию.Количество() > 0 Тогда
РезультатАнализа = Документы.СчетФактураВыданный.ПолучитьСчетаФактурыНаПечать(ОснованияНаРеализацию);
ПараметрыПечати.Вставить("МассивСчетФактураВыданный", РезультатАнализа.СчетаФактурыНаПечать);
Для Каждого СтрокаТаблицыОшибок Из РезультатАнализа.ТаблицаОшибок Цикл
Если СтрокаТаблицыОшибок.НеВыставленСчетФактура Тогда
ДокументыБезВыданногоСчетаФактуры.Добавить(СтрокаТаблицыОшибок.ДокументОснование);
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если МассивСчетФактураВыданный.Количество() > 0 Тогда
СтруктураТиповНаПечать.Вставить("СчетФактураВыданный", МассивСчетФактураВыданный);
КонецЕсли;
Для Каждого Документ Из ДокументыБезВыданногоСчетаФактуры Цикл
ИмяОбъекта = Документ.Метаданные().Имя;
Если СтруктураТиповНаПечать.Свойство(ИмяОбъекта) Тогда
СтруктураТиповНаПечать[ИмяОбъекта].Добавить(Документ);
Иначе
МассивДокументовТипа = Новый Массив;
МассивДокументовТипа.Добавить(Документ);
СтруктураТиповНаПечать.Вставить(ИмяОбъекта, МассивДокументовТипа);
КонецЕсли;
КонецЦикла;
// Формирование областей табличного документа
НомерТипаДокумента = 0;
Для Каждого СтруктураОбъектов Из СтруктураТиповНаПечать Цикл
НомерТипаДокумента = НомерТипаДокумента + 1;
Если НомерТипаДокумента > 1 Тогда
ТабличныйДокумент.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
МенеджерОбъекта = Документы[СтруктураОбъектов.Ключ];
ПараметрыПечати.Вставить("НеВыводитьУПДПосредника", Истина);
ДанныеДляПечати = МенеджерОбъекта.ПолучитьДанныеДляПечатнойФормыУПД(ПараметрыПечати, СтруктураОбъектов.Значение);
ЗаполнитьТабличныйДокументУПД_Серии(ТабличныйДокумент, ДанныеДляПечати, ОбъектыПечати, КомплектыПечати);
КонецЦикла;
Возврат ТабличныйДокумент;
КонецФункции
Для ускорения поиска ошибок при разработке внешних печатных форм воспользуемся следующими практическими приемами:
Возврат ТабличныйДокумент; и проверьте значение свойства ТабличныйДокумент.ВысотаТаблицы. Если высота равна 0, проверьте коллекции СтруктураТиповНаПечать и ДанныеДляПечати — в них должны быть реальные строки и ссылки.УстановитьПривилегированныйРежим(Истина) будет проигнорирован. Если в алгоритме требуется доступ к защищенным данным или модулям, установите признак БезопасныйРежим = Ложь в функции регистрации.Печать, передав в качестве параметра массив с конкретной ссылкой на документ реализации.