При работе в 1С мы часто сталкиваемся с необходимостью распечатать или сохранить табличный документ, будь то акт, счет или отчет. Однако, когда пользователь нажимает кнопку "Сохранить" в открытой печатной форме, ему обычно предлагается стандартное имя файла, например, "Новый документ". Это неудобно, поскольку требует ручного ввода осмысленного имени каждый раз. В этой статье мы подробно разберем, как программно подставить желаемое имя файла для сохранения печатной формы, чтобы пользователю не приходилось вводить его вручную.
Мы рассмотрим несколько подходов, начиная от самых простых и заканчивая более сложными сценариями, такими как динамическое формирование имени и асинхронное сохранение.
Давайте начнем с самого прямого и эффективного способа, который позволяет нам "подкинуть" имя файла в диалог сохранения. Это достигается с помощью метода Показать() объекта ТабличныйДокумент и свойства ИспользуемоеИмяФайла.
Объект ТабличныйДокумент (или SpreadsheetDocument) имеет метод Показать(), который не только выводит табличный документ на экран для просмотра и редактирования, но и позволяет указать предлагаемое имя файла для сохранения. Рассмотрим его синтаксис:
Показать(<Заголовок>, <ИмяФайла>, <Активизация>)
<Заголовок> (необязательный, тип: Строка): Заголовок окна табличного документа.<ИмяФайла> (необязательный, тип: Строка): Это ключевой параметр для нашей задачи. Если мы передадим сюда непустую строку, то при закрытии окна, если документ был изменен, пользователю будет предложено сохранить табличный документ именно в указанный файл.<Активизация> (необязательный, тип: Булево): Определяет, будет ли активизировано открываемое окно. Значение по умолчанию: Истина.Давайте посмотрим на пример использования:
// Предположим, у нас уже есть сформированный табличный документ
Перем ТабДок; // Объект типа ТабличныйДокумент
// ... код формирования ТабДок ...
// Формируем желаемое имя файла
ИмяФайлаДляСохранения = "ОтчетПоПродажам_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd") + ".mxl";
// Выводим табличный документ на экран, подставляя имя файла
ТабДок.Показать("Отчет по продажам", ИмяФайлаДляСохранения);
В этом примере, когда пользователь попытается сохранить документ через меню "Файл" -> "Сохранить" или при закрытии окна, ему будет предложено имя файла, например, "ОтчетПоПродажам_20231027.mxl".
Существует также свойство ИспользуемоеИмяФайла (UsedFileName) объекта ТабличныйДокумент. Это свойство типа "Строка" предназначено для чтения и записи и содержит имя файла, в который будет сохранен документ, если пользователь выполнит команду "Сохранить". Оно заполняется в нескольких случаях:
Показать(), если в нем указано имя файла (как мы рассмотрели выше).Мы можем установить это свойство напрямую, если нам нужно управлять именем файла, например, для объекта ПолеТабличногоДокумента на управляемой форме, хотя для гарантированного подставления в диалог сохранения при первом сохранении все же рекомендуется использовать параметр ИмяФайла метода Показать().
// Если табличный документ уже отображен на форме,
// и мы хотим изменить предлагаемое имя файла для последующего сохранения
ТабДок.ИспользуемоеИмяФайла = "МойДокументДляСохранения.mxl";
Важно: Значение этого свойства не сохраняется при сохранении документа в двоичные данные или при сохранении документа в файл программно через метод Записать().
Часто нам требуется не просто фиксированное имя файла, а имя, которое динамически формируется на основе данных документа, текущей даты или других реквизитов. Давайте разберем, как этого добиться, и какие есть нюансы.
Мы можем формировать имя файла, используя данные из нашей информационной базы. Например, включить в имя номер документа, дату, наименование контрагента или тип отчета. Это делает сохраняемые файлы более информативными и удобными для поиска. Обратите внимание на обработку запрещенных символов.
// Предположим, у нас есть ссылка на документ "РеализацияТоваровУслуг"
СсылкаНаДокумент = ...;
// Формируем имя файла, используя номер и дату документа
ИмяФайла = "Реализация_"
+ СсылкаНаДокумент.Номер + "_"
+ Формат(СсылкаНаДокумент.Дата, "ДФ=yyyyMMdd")
+ ".mxl";
// Важно: Удаляем или заменяем запрещенные символы в имени файла
// Например, символ "/" в дате или другие спецсимволы, которые могут быть в номере или наименовании.
ИмяФайла = СтрЗаменить(ИмяФайла, "/", "_"); // Пример замены
ТабДок.Показать("Печатная форма реализации", ИмяФайла);
Если мы работаем с внешними печатными формами или используем стандартные подсистемы 1С для управления печатью, такие как "Библиотека стандартных подсистем" (БСП), то можем встретить другие методы для задания имени файла.
КоллекцияПечатныхФорм: Для внешних обработок, которые возвращают печатные формы, мы можем установить свойство СинонимМакета для элемента в коллекции перед выводом табличного документа. Это может повлиять на предлагаемое имя файла.УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(): В БСП часто используется этот метод. Он имеет третий параметр, который позволяет явно указать предлагаемое имя файла для сохранения.
// Пример использования (упрощенно)
// Предполагается, что ТабДок - это наш табличный документ,
// а СсылкаНаОбъект - ссылка на документ, для которого формируется печатная форма.
ИмяФайлаДляСохранения = "АктВыполненныхРабот_" + СсылкаНаОбъект.Номер + ".mxl";
// Если используется подсистема УправлениеПечатью
УправлениеПечатью.ВывестиТабличныйДокументВКоллекцию(ТабДок,
"АктВыполненныхРабот",
ИмяФайлаДляСохранения,
СсылкаНаОбъект);
Мы уже упоминали, что свойство ТабличныйДокумент.ИспользуемоеИмяФайла предназначено для чтения и записи. Однако, прямое присвоение значения этому свойству может не сработать для команды "Сохранить", если табличный документ отображается в элементе управления ПолеТабличногоДокумента на форме, а не открывается через метод Показать(). Для гарантированного подставления имени в диалог сохранения при первом сохранении всегда используйте ТабДокумент.Показать(<Заголовок>, <ИмяФайла>).
Иногда нам нужно сохранить табличный документ на диск полностью программно, без участия пользователя, или же выполнить сохранение в фоне, не блокируя интерфейс.
Для полностью программного сохранения табличного документа используется метод ТабличныйДокумент.Записать(). Этот метод позволяет указать полный путь к файлу и желаемый формат.
Записать(<ИмяФайла>, <ТипФайлаТабличногоДокумента>)
<ИмяФайла> (тип: Строка): Полный путь к файлу, включая имя файла и расширение.<ТипФайлаТабличногоДокумента> (необязательный, тип: ПеречислениеСсылка.ТипыФайловТабличногоДокумента): Определяет формат сохранения. По умолчанию сохраняется в формате MXL (формат табличного документа 1С). Можем выбрать другие форматы, такие как XLS, XLSX, PDF, HTML, TXT.
// Пример программного сохранения в формате MXL
ПутьКФайлу = КаталогВременныхФайлов() + "МойОтчет.mxl";
Попытка
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.MXL);
Сообщить("Документ успешно сохранен в " + ПутьКФайлу);
Исключение
Сообщить("Ошибка при сохранении документа: " + ОписаниеОшибки());
КонецПопытки;
// Пример программного сохранения в формате PDF
ПутьКФайлуPDF = КаталогВременныхФайлов() + "МойОтчет.pdf";
Попытка
ТабДок.Записать(ПутьКФайлуPDF, ТипФайлаТабличногоДокумента.PDF);
Сообщить("Документ успешно сохранен в " + ПутьКФайлуPDF);
Исключение
Сообщить("Ошибка при сохранении документа в PDF: " + ОписаниеОшибки());
КонецПопытки;
В современных версиях платформы 1С (начиная с 8.3.7), особенно при работе в тонком или веб-клиенте, использование синхронных методов записи файла (таких как ТабличныйДокумент.Записать()) на клиенте может быть запрещено и вызывать ошибку "Использование синхронных методов на клиенте запрещено!". Это сделано для обеспечения отзывчивости пользовательского интерфейса, так как запись файла может занимать время.
В таких случаях нам необходимо использовать асинхронный аналог – метод ТабличныйДокумент.НачатьЗапись(). Этот метод позволяет инициировать запись файла, не блокируя пользовательский интерфейс. Результат операции возвращается в процедуру-обработчик.
НачатьЗапись(<ОписаниеОповещенияЗавершения>, <ИмяФайла>, <ТипФайлаТабличногоДокумента>, <КодировкаТекста>)
<ОписаниеОповещенияЗавершения> (тип: ОписаниеОповещения): Объект, который описывает процедуру-обработчик, которая будет вызвана по завершении асинхронной операции.Записать().
// Пример асинхронного сохранения
&НаКлиенте
Процедура СохранитьТабДокАсинхронноНаКлиенте()
// Предположим, ТабДок - это наш табличный документ
Если ТабДок = Неопределено Тогда
Возврат;
КонецЕсли;
ПутьКФайлу = "ОтчетАсинхронно.pdf"; // Имя файла, которое будет предложено пользователю
// Создаем описание оповещения для обработчика завершения
ОписаниеОповещения = Новый ОписаниеОповещения("ОбработкаЗавершенияЗаписиТабДок", ЭтотОбъект);
// Вызываем асинхронную запись
ТабДок.НачатьЗапись(ОписаниеОповещения, ПутьКФайлу, ТипФайлаТабличногоДокумента.PDF);
КонецПроцедуры
&НаКлиенте
Процедура ОбработкаЗавершенияЗаписиТабДок(Результат, ДополнительныеПараметры) Экспорт
Если Результат Тогда
Сообщить("Документ успешно сохранен.");
Иначе
Сообщить("Ошибка при сохранении документа.");
КонецЕсли;
КонецПроцедуры
Асинхронные методы особенно важны для веб- и мобильных клиентов, где блокировка интерфейса крайне нежелательна и может привести к зависанию приложения.
Помимо рассмотренных программных методов, существуют и другие аспекты, которые могут быть полезны при работе с печатными формами и их сохранением.
Помимо стандартной кнопки "Сохранить", пользователь может воспользоваться пунктами меню "Файл - Сохранить как..." или "Файл - Сохранить копию...".
MXL), но позволяет выбрать другое имя и местоположение.HTML, Excel (XLS/XLSX), текстовый файл (TXT) и даже формат 1С 7.7.Мы можем влиять на предлагаемое имя файла для этих операций, используя рассмотренные выше методы Показать() и свойство ИспользуемоеИмяФайла.
Измененную или сохраненную печатную форму можно не только сохранить на диск, но и прикрепить непосредственно к документу в 1С (например, как дополнительный файл или присоединенный файл). Это очень удобно для последующего доступа к конкретной версии печатной формы, связанной с определенным документом.
В некоторых конфигурациях 1С, особенно в стандартных, в форме настройки параметров печати (обычно через меню "Файл" -> "Параметры страницы" или аналогичное) пользователи могут указать шаблон имени файла. Этот шаблон может включать текст, значения реквизитов документа или отчета, а также текущую дату и время. Это позволяет конечным пользователям настроить удобные для себя имена файлов без вмешательства программиста.
Пользователи также могут изменять макеты печатных форм (например, шрифты, текст, границы, вставлять рисунки) через раздел "Администрирование -> Печатные формы, отчеты и обработки -> Макеты печатных форм". Однако, будьте осторожны: изменение имен областей и параметров в макете может привести к потере работоспособности формы, поэтому такие изменения обычно требуют понимания структуры макета.
Надеемся, что этот подробный разбор поможет вам эффективно управлять процессом сохранения печатных форм в 1С, делая работу с системой более удобной и продуктивной!
← К списку