При разработке внешних печатных форм в современных конфигурациях на базе Библиотеки стандартных подсистем (БСП), таких как КА 2, ERP 2 или УТ 11, разработчики часто сталкиваются с двумя задачами. Во-первых, стандартный заголовок окна «Печать документов» не всегда информативен. Во-вторых, при сохранении сформированного табличного документа в файл (например, PDF или Excel), 1С может предлагать неудачное имя файла — просто название макета без номера и даты. Рассмотрим подробно, как решить эти задачи программным путем, используя возможности БСП.
Заголовок окна, в котором открывается печатная форма, определяется в процедуре Печать модуля менеджера объекта или внешней обработки. Для управления этим параметром используется структура ПараметрыВывода, которая передается в процедуру в качестве одного из аргументов. Проанализируем, как это реализовать.
По умолчанию БСП устанавливает заголовок «Печать документов». Чтобы его изменить, необходимо в структуре ПараметрыВывода установить значение для ключа Заголовок. Разберем пример кода для внешней печатной формы:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
// Устанавливаем собственный заголовок окна печати
ПараметрыВывода.Вставить("Заголовок", "Печать заявки на отгрузку");
// Далее следует стандартный код формирования печатной формы...
КонецПроцедуры
Важно помнить, что этот заголовок будет отображаться в верхней части окна формы «Печать документов», помогая пользователю ориентироваться, с каким именно документом он работает в данный момент.
Основная сложность часто возникает именно с именем файла, которое предлагается системой при нажатии кнопки «Сохранить». В БСП за это отвечает процедура УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(). Многие разработчики используют только первые три-четыре параметра этой функции, пропуская самые важные для именования файлов.
Рассмотрим структуру этой процедуры подробнее. Нас интересует 7-й параметр — ИмяФайлаПечатнойФормы:
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
ИмяМакета,
СинонимМакета,
ТабличныйДокумент,
Картинка,
ПолныйПутьКМакету,
ИмяФайлаПечатнойФормы // Вот этот параметр отвечает за имя файла
);
Если этот параметр не заполнен, система берет СинонимМакета и добавляет к нему дату и номер, если сможет их определить автоматически. Однако для внешних печатных форм этот механизм часто дает сбой, предлагая только статичное название (например, просто «Заявка»).
Если вы печатаете сразу несколько документов, нам нужно, чтобы для каждого из них сформировалось свое уникальное имя файла. Для этого в 7-й параметр следует передать не просто строку, а объект Соответствие. Выясним, как это работает на практике:
Соответствие.Посмотрим на пример реализации в процедуре Печать:
Процедура Печать(МассивОбъектов, КоллекцияПечатныхФорм, ОбъектыПечати, ПараметрыВывода) Экспорт
ИменаФайлов = Новый Соответствие;
// Формируем табличный документ (ваша функция формирования)
ТабДок = СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ИменаФайлов);
// Заполняем коллекцию, передавая соответствие имен файлов в 7-й параметр
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
КоллекцияПечатныхФорм,
"МояВнешняяПечатнаяФорма",
"Заявка",
ТабДок,
,
, // Путь к макету можно оставить пустым для внешней ПФ
ИменаФайлов
);
КонецПроцедуры
Внутри функции формирования документа (СформироватьПечатнуюФорму) мы должны заполнить это соответствие. Рассмотрим подробнее этот процесс:
Функция СформироватьПечатнуюФорму(МассивОбъектов, ОбъектыПечати, ИменаФайлов)
ТабДок = Новый ТабличныйДокумент;
// ... логика вывода областей в ТабДок ...
Для Каждого СсылкаНаОбъект Из МассивОбъектов Цикл
// Получаем данные для имени файла
НомерДок = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(СсылкаНаОбъект.Номер, Истина, Истина);
ДатаДок = Формат(СсылкаНаОбъект.Дата, "ДФ=dd.MM.yyyy");
Контрагент = СсылкаНаОбъект.Контрагент.Наименование;
ЖелаемоеИмяФайла = СтрШаблон("Заявка № %1 от %2 (%3)", НомерДок, ДатаДок, Контрагент);
// Удаляем недопустимые символы (/ \ : * ? " < > |)
ЖелаемоеИмяФайла = ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(ЖелаемоеИмяФайла, "");
// Ключ - ссылка на документ, Значение - имя файла
ИменаФайлов.Вставить(СсылкаНаОбъект, ЖелаемоеИмяФайла);
// Важно! Для связи табдокумента и объекта заполняем ОбъектыПечати
УправлениеПечатью.ЗадатьОбластьПечатиДокумента(ТабДок, 1, ОбъектыПечати, СсылкаНаОбъект);
КонецЦикла;
Возврат ТабДок;
КонецФункции
Проанализируем критические моменты, которые могут повлиять на корректность работы данного механизма:
ОбщегоНазначенияКлиентСервер.ЗаменитьНедопустимыеСимволыВИмениФайла(). Если в наименовании контрагента окажутся кавычки или в номере документа — слеш, 1С выдаст ошибку при попытке сохранить файл на диск.УправлениеПечатью.ЗадатьОбластьПечатиДокумента(), БСП не поймет, к какому документу относится конкретная страница табличного документа, и не сможет применить имя файла из вашего Соответствия.Table.pdf.УстановитьИмяСохраняемогоФайла в общих модулях, но для внешних печатных форм предпочтительнее использовать стандартный параметр коллекции.Таким образом, использование структуры ПараметрыВывода для визуального оформления интерфейса и 7-го параметра коллекции печатных форм для именования файлов позволяет сделать работу пользователя с внешними печатными формами максимально комфортной и соответствующей стандартам типовых решений 1С.