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