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