Как изменить имя документа при сохранении печатной формы в 1С

Программист 1С v8.3 (Управляемые формы) IT и автоматизация бизнеса
← На главную

При работе с внешними печатными формами в 1С часто возникает задача: сделать так, чтобы при нажатии кнопки «Сохранить» или при отправке по почте файл назывался не стандартно, а содержал в себе номер, дату или название контрагента. По умолчанию система предлагает имя на основе синонима макета, что не всегда удобно для идентификации файлов в папке. Разберем подробно, как программно управлять наименованием сохраняемого файла, используя механизмы Библиотеки стандартных подсистем (БСП).

Анализ механизма формирования имени файла

Для начала проанализируем, как 1С понимает, какое имя присвоить файлу. В современных конфигурациях на базе управляемых форм за формирование коллекции печатных форм отвечает общая процедура УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию. Именно в этой точке закладываются параметры, которые в дальнейшем будут использованы формой «Сохранение печатных форм».

Рассмотрим структуру параметров этой процедуры. В БСП версии 2.x и 3.x она выглядит следующим образом:


Процедура ВывестиТабличныйДокументВКоллекцию(
    КоллекцияПечатныхФорм, 
    ИмяМакета, 
    СинонимМакета, 
    ТабличныйДокумент, 
    Картинка = Неопределено, 
    ПолныйПутьКМакету = "", 
    ИмяФайлаПечатнойФормы = Неопределено) Экспорт

Здесь для нас критически важны два параметра:

  1. СинонимМакета (3-й параметр) — строка, которая отображается пользователю в списке доступных печатных форм и зачастую используется как имя файла по умолчанию.
  2. ИмяФайлаПечатнойФормы (7-й параметр) — специальный параметр, предназначенный именно для задания имени сохраняемого файла.

Решение 1: Использование седьмого параметра (Рекомендуемое)

Это наиболее правильный и «чистый» способ с точки зрения архитектуры БСП. Мы передаем в коллекцию имя файла, которое не влияет на то, что видит пользователь на экране в списке кнопок «Печать», но будет подставлено при сохранении в PDF или другой формат.

Выясним, как применить это в модуле вашей внешней печатной формы. В процедуре Печать нам необходимо сформировать строку с нужным именем. Проанализируем пример кода:


Для Каждого ТекущийОбъект Из МассивОбъектов Цикл
    // ... формирование табличного документа ...
    
    // Формируем красивое имя файла
    НомерЧистый = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ТекущийОбъект.Номер, Истина, Истина);
    ИмяФайла = СтрШаблон("Доверенность № %1 от %2", НомерЧистый, Формат(ТекущийОбъект.Дата, "ДФ=dd.MM.yyyy"));
    
    // Выводим в коллекцию с использованием 7-го параметра
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
        КоллекцияПечатныхФорм, 
        "ПараметрыПечати_Доверенность_Доверенность", 
        "Доверенность (М-2)", 
        ТабличныйДокумент, 
        , 
        , 
        ИмяФайла);
КонецЦикла;

Важный нюанс: Если вы печатаете сразу несколько документов (массовая печать), параметр ИмяФайлаПечатнойФормы может принимать не только Строку, но и объект типа Соответствие. В этом случае ключом будет ссылка на документ, а значением — строка с именем файла. Это позволит системе при сохранении «пачки» документов в архив присвоить каждому файлу уникальное имя.

Решение 2: Использование третьего параметра (СинонимМакета)

В некоторых старых версиях БСП или специфических конфигурациях (например, старые релизы Бухгалтерии предприятия 3.0) седьмой параметр может игнорироваться или отсутствовать. В этом случае выясним, как работает СинонимМакета. Если передать пустую строку или специфический заголовок в этот параметр, 1С возьмет его за основу имени файла.

Посмотрим на пример из обсуждения на форуме:


УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(
    КоллекцияПечатныхФорм, 
    "ИдентификаторМакэта", 
    "Счет № " + Объект.Номер, // Имя файла будет взято отсюда
    ТабличныйДокумент);

Однако помните, что это значение также изменит заголовок закладки в окне предпросмотра печати. Если для вас это не критично, данный способ является самым простым и быстрым в реализации.

Как правильно получить номер и дату для имени файла

Проанализируем ситуацию: часто номера в 1С содержат лидирующие нули (000000001) или префиксы организации/узла (БП-00001). Использовать такие строки в имени файла неудобно. Для «очистки» номера рекомендуем использовать стандартную функцию 1С:

ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(Объект.Номер, Истина, Истина)

Эта функция уберет все лишнее, оставив только значимую часть. Также будьте осторожны с символами, недопустимыми в именах файлов ОС (например, слеши в номерах типа «15/1»). Рассмотрим код, который безопасно подготавливает имя:


Функция СформироватьИмяФайла(ДокументСсылка)
    Номер = ПрефиксацияОбъектовКлиентСервер.НомерНаПечать(ДокументСсылка.Номер, Истина, Истина);
    Дата = Формат(ДокументСсылка.Дата, "ДФ=yyyy-MM-dd");
    
    Результат = "Доверенность_" + Номер + "_от_" + Дата;
    
    // Удаляем символы, которые запрещены в Windows/Linux
    ЗапрещенныеСимволы = "/\:*?""<>|";
    Для Индекс = 1 По СтрДлина(ЗапрещенныеСимволы) Цикл
        Символ = Сред(ЗапрещенныеСимволы, Индекс, 1);
        Результат = СтрЗаменить(Результат, Символ, "");
    КонецЦикла;
    
    Возврат Результат;
КонецФункции

Продвинутый уровень: Переопределение через Общий модуль

Если задача стоит глобально (изменить логику именования для всех печатных форм конфигурации), стоит заглянуть в общий модуль УправлениеПечатьюПереопределяемый. Там существует процедура ПриОпределенииНастроекПечати (или аналогичные в зависимости от версии БСП). Рассмотрим, как можно вмешаться в процесс централизованно:

В некоторых конфигурациях используется специализированная процедура ОпределитьИменаФайловПечатныхФорм. Проанализируем ее назначение: она вызывается непосредственно перед сохранением или отправкой почты. Переопределив ее в расширении, вы сможете добавить к имени файла, например, ИНН контрагента или сумму документа, не меняя код каждой конкретной печатной формы.

Итоги и рекомендации

Разберем по шагам, что нужно сделать в вашей внешней обработке:

  1. Найдите функцию ПечатнаяФорма или процедуру Печать в модуле объекта внешней обработки.
  2. Перед вызовом ВывестиТабличныйДокументВКоллекцию соберите строку имени файла из данных документа (Номер, Дата, Контрагент).
  3. Используйте 7-й параметр (если БСП современная) для передачи этой строки.
  4. Если 7-й параметр не срабатывает, используйте 3-й параметр.
  5. Обязательно очищайте строку от префиксов и запрещенных символов / \ : *, чтобы избежать ошибок записи на диск.

Использование правильного параметра ИмяФайлаПечатнойФормы гарантирует, что при отправке документа клиенту по электронной почте он получит файл с понятным названием, что значительно повышает лояльность и удобство работы с вашими документами.

← На главную