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