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

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

При работе в 1С мы часто сталкиваемся с необходимостью распечатать или сохранить табличный документ, будь то акт, счет или отчет. Однако, когда пользователь нажимает кнопку "Сохранить" в открытой печатной форме, ему обычно предлагается стандартное имя файла, например, "Новый документ". Это неудобно, поскольку требует ручного ввода осмысленного имени каждый раз. В этой статье мы подробно разберем, как программно подставить желаемое имя файла для сохранения печатной формы, чтобы пользователю не приходилось вводить его вручную.

Мы рассмотрим несколько подходов, начиная от самых простых и заканчивая более сложными сценариями, такими как динамическое формирование имени и асинхронное сохранение.

Решение 1: Использование метода Показать() и свойства ИспользуемоеИмяФайла

Давайте начнем с самого прямого и эффективного способа, который позволяет нам "подкинуть" имя файла в диалог сохранения. Это достигается с помощью метода Показать() объекта ТабличныйДокумент и свойства ИспользуемоеИмяФайла.

Метод ТабличныйДокумент.Показать()

Объект ТабличныйДокумент (или SpreadsheetDocument) имеет метод Показать(), который не только выводит табличный документ на экран для просмотра и редактирования, но и позволяет указать предлагаемое имя файла для сохранения. Рассмотрим его синтаксис:

Показать(<Заголовок>, <ИмяФайла>, <Активизация>)

  1. <Заголовок> (необязательный, тип: Строка): Заголовок окна табличного документа.
  2. <ИмяФайла> (необязательный, тип: Строка): Это ключевой параметр для нашей задачи. Если мы передадим сюда непустую строку, то при закрытии окна, если документ был изменен, пользователю будет предложено сохранить табличный документ именно в указанный файл.
  3. <Активизация> (необязательный, тип: Булево): Определяет, будет ли активизировано открываемое окно. Значение по умолчанию: Истина.

Давайте посмотрим на пример использования:


// Предположим, у нас уже есть сформированный табличный документ
Перем ТабДок; // Объект типа ТабличныйДокумент
// ... код формирования ТабДок ...

// Формируем желаемое имя файла
ИмяФайлаДляСохранения = "ОтчетПоПродажам_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".mxl";

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

В этом примере, когда пользователь попытается сохранить документ через меню "Файл" -> "Сохранить" или при закрытии окна, ему будет предложено имя файла, например, "ОтчетПоПродажам_20231027.mxl".

Свойство ТабличныйДокумент.ИспользуемоеИмяФайла

Существует также свойство ИспользуемоеИмяФайла (UsedFileName) объекта ТабличныйДокумент. Это свойство типа "Строка" предназначено для чтения и записи и содержит имя файла, в который будет сохранен документ, если пользователь выполнит команду "Сохранить". Оно заполняется в нескольких случаях:

  1. При программной установке значения.
  2. При интерактивном открытии документа из файла.
  3. При вызове метода Показать(), если в нем указано имя файла (как мы рассмотрели выше).
  4. При вызове пользователем команды "Сохранить как…".

Мы можем установить это свойство напрямую, если нам нужно управлять именем файла, например, для объекта ПолеТабличногоДокумента на управляемой форме, хотя для гарантированного подставления в диалог сохранения при первом сохранении все же рекомендуется использовать параметр ИмяФайла метода Показать().


// Если табличный документ уже отображен на форме,
// и мы хотим изменить предлагаемое имя файла для последующего сохранения
ТабДок.ИспользуемоеИмяФайла = "МойДокументДляСохранения.mxl";

Важно: Значение этого свойства не сохраняется при сохранении документа в двоичные данные или при сохранении документа в файл программно через метод Записать().

Решение 2: Динамическое формирование имени файла и особенности сохранения

Часто нам требуется не просто фиксированное имя файла, а имя, которое динамически формируется на основе данных документа, текущей даты или других реквизитов. Давайте разберем, как этого добиться, и какие есть нюансы.

Программное задание динамического имени файла

Мы можем формировать имя файла, используя данные из нашей информационной базы. Например, включить в имя номер документа, дату, наименование контрагента или тип отчета. Это делает сохраняемые файлы более информативными и удобными для поиска. Обратите внимание на обработку запрещенных символов.


// Предположим, у нас есть ссылка на документ "РеализацияТоваровУслуг"
СсылкаНаДокумент = ...; 

// Формируем имя файла, используя номер и дату документа
ИмяФайла = "Реализация_" 
           + СсылкаНаДокумент.Номер + "_" 
           + Формат(СсылкаНаДокумент.Дата, "ДФ=yyyyMMdd") 
           + ".mxl";

// Важно: Удаляем или заменяем запрещенные символы в имени файла
// Например, символ "/" в дате или другие спецсимволы, которые могут быть в номере или наименовании.
ИмяФайла = СтрЗаменить(ИмяФайла, "/", "_"); // Пример замены

ТабДок.Показать("Печатная форма реализации", ИмяФайла);

Использование для внешних печатных форм: КоллекцияПечатныхФорм и УправлениеПечатью

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

  1. Через КоллекцияПечатныхФорм: Для внешних обработок, которые возвращают печатные формы, мы можем установить свойство СинонимМакета для элемента в коллекции перед выводом табличного документа. Это может повлиять на предлагаемое имя файла.
  2. Метод УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(): В БСП часто используется этот метод. Он имеет третий параметр, который позволяет явно указать предлагаемое имя файла для сохранения.
  3. 
    // Пример использования (упрощенно)
    // Предполагается, что ТабДок - это наш табличный документ,
    // а СсылкаНаОбъект - ссылка на документ, для которого формируется печатная форма.
        
    ИмяФайлаДляСохранения = "АктВыполненныхРабот_" + СсылкаНаОбъект.Номер + ".mxl";
        
    // Если используется подсистема УправлениеПечатью
    УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(ТабДок, 
                                                        "АктВыполненныхРабот", 
                                                        ИмяФайлаДляСохранения, 
                                                        СсылкаНаОбъект);
    

Различия в работе ИспользуемоеИмяФайла и Показать()

Мы уже упоминали, что свойство ТабличныйДокумент.ИспользуемоеИмяФайла предназначено для чтения и записи. Однако, прямое присвоение значения этому свойству может не сработать для команды "Сохранить", если табличный документ отображается в элементе управления ПолеТабличногоДокумента на форме, а не открывается через метод Показать(). Для гарантированного подставления имени в диалог сохранения при первом сохранении всегда используйте ТабДокумент.Показать(<Заголовок>, <ИмяФайла>).

Решение 3: Программное сохранение и асинхронные операции

Иногда нам нужно сохранить табличный документ на диск полностью программно, без участия пользователя, или же выполнить сохранение в фоне, не блокируя интерфейс.

Метод ТабличныйДокумент.Записать()

Для полностью программного сохранения табличного документа используется метод ТабличныйДокумент.Записать(). Этот метод позволяет указать полный путь к файлу и желаемый формат.

Записать(<ИмяФайла>, <ТипФайлаТабличногоДокумента>)

  1. <ИмяФайла> (тип: Строка): Полный путь к файлу, включая имя файла и расширение.
  2. <ТипФайлаТабличногоДокумента> (необязательный, тип: ПеречислениеСсылка.ТипыФайловТабличногоДокумента): Определяет формат сохранения. По умолчанию сохраняется в формате MXL (формат табличного документа 1С). Можем выбрать другие форматы, такие как XLS, XLSX, PDF, HTML, TXT.

// Пример программного сохранения в формате MXL
ПутьКФайлу = КаталогВременныхФайлов() + "МойОтчет.mxl";
Попытка
    ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.MXL);
    Сообщить("Документ успешно сохранен в " + ПутьКФайлу);
Исключение
    Сообщить("Ошибка при сохранении документа: " + ОписаниеОшибки());
КонецПопытки;

// Пример программного сохранения в формате PDF
ПутьКФайлуPDF = КаталогВременныхФайлов() + "МойОтчет.pdf";
Попытка
    ТабДок.Записать(ПутьКФайлуPDF, ТипФайлаТабличногоДокумента.PDF);
    Сообщить("Документ успешно сохранен в " + ПутьКФайлуPDF);
Исключение
    Сообщить("Ошибка при сохранении документа в PDF: " + ОписаниеОшибки());
КонецПопытки;

Асинхронные операции: ТабличныйДокумент.НачатьЗапись()

В современных версиях платформы 1С (начиная с 8.3.7), особенно при работе в тонком или веб-клиенте, использование синхронных методов записи файла (таких как ТабличныйДокумент.Записать()) на клиенте может быть запрещено и вызывать ошибку "Использование синхронных методов на клиенте запрещено!". Это сделано для обеспечения отзывчивости пользовательского интерфейса, так как запись файла может занимать время.

В таких случаях нам необходимо использовать асинхронный аналог – метод ТабличныйДокумент.НачатьЗапись(). Этот метод позволяет инициировать запись файла, не блокируя пользовательский интерфейс. Результат операции возвращается в процедуру-обработчик.

НачатьЗапись(<ОписаниеОповещенияЗавершения>, <ИмяФайла>, <ТипФайлаТабличногоДокумента>, <КодировкаТекста>)

  1. <ОписаниеОповещенияЗавершения> (тип: ОписаниеОповещения): Объект, который описывает процедуру-обработчик, которая будет вызвана по завершении асинхронной операции.
  2. Остальные параметры аналогичны методу Записать().

// Пример асинхронного сохранения
&НаКлиенте
Процедура СохранитьТабДокАсинхронноНаКлиенте()
    // Предположим, ТабДок - это наш табличный документ
    Если ТабДок = Неопределено Тогда
        Возврат;
    КонецЕсли;

    ПутьКФайлу = "ОтчетАсинхронно.pdf"; // Имя файла, которое будет предложено пользователю
    
    // Создаем описание оповещения для обработчика завершения
    ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаЗавершенияЗаписиТабДок", ЭтотОбъект);

    // Вызываем асинхронную запись
    ТабДок.НачатьЗапись(ОписаниеОповещения, ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
КонецПроцедуры

&НаКлиенте
Процедура ОбработкаЗавершенияЗаписиТабДок(Результат, ДополнительныеПараметры) Экспорт
    Если Результат Тогда
        Сообщить("Документ успешно сохранен.");
    Иначе
        Сообщить("Ошибка при сохранении документа.");
    КонецЕсли;
КонецПроцедуры

Асинхронные методы особенно важны для веб- и мобильных клиентов, где блокировка интерфейса крайне нежелательна и может привести к зависанию приложения.

Дополнительные возможности и полезные советы

Помимо рассмотренных программных методов, существуют и другие аспекты, которые могут быть полезны при работе с печатными формами и их сохранением.

Интерактивное сохранение: "Сохранить как..." и "Сохранить копию..."

Помимо стандартной кнопки "Сохранить", пользователь может воспользоваться пунктами меню "Файл - Сохранить как..." или "Файл - Сохранить копию...".

  1. "Сохранить как..." обычно предлагает сохранение в "родном" формате 1С (MXL), но позволяет выбрать другое имя и местоположение.
  2. "Сохранить копию..." предоставляет более широкий выбор форматов для сохранения, таких как HTML, Excel (XLS/XLSX), текстовый файл (TXT) и даже формат 1С 7.7.

Мы можем влиять на предлагаемое имя файла для этих операций, используя рассмотренные выше методы Показать() и свойство ИспользуемоеИмяФайла.

Прикрепление к документу

Измененную или сохраненную печатную форму можно не только сохранить на диск, но и прикрепить непосредственно к документу в 1С (например, как дополнительный файл или присоединенный файл). Это очень удобно для последующего доступа к конкретной версии печатной формы, связанной с определенным документом.

Настройки печати и макеты

В некоторых конфигурациях 1С, особенно в стандартных, в форме настройки параметров печати (обычно через меню "Файл" -> "Параметры страницы" или аналогичное) пользователи могут указать шаблон имени файла. Этот шаблон может включать текст, значения реквизитов документа или отчета, а также текущую дату и время. Это позволяет конечным пользователям настроить удобные для себя имена файлов без вмешательства программиста.

Пользователи также могут изменять макеты печатных форм (например, шрифты, текст, границы, вставлять рисунки) через раздел "Администрирование -> Печатные формы, отчеты и обработки -> Макеты печатных форм". Однако, будьте осторожны: изменение имен областей и параметров в макете может привести к потере работоспособности формы, поэтому такие изменения обычно требуют понимания структуры макета.

Надеемся, что этот подробный разбор поможет вам эффективно управлять процессом сохранения печатных форм в 1С, делая работу с системой более удобной и продуктивной!

← К списку