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

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

При разработке собственных печатных форм в среде 1С:Предприятие (особенно на управляемых формах) часто возникает задача предустановить имя файла для пользователя. Когда пользователь нажимает кнопку сохранения в окне просмотра ТабличногоДокумента, платформа должна предлагать осмысленное имя (например, «Счет_№123.mxl»), а не оставлять поле пустым. Разберем, как реализовать это правильно и избежать распространенных ошибок доступа.

Понимание работы свойства ИспользуемоеИмяФайла

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

Однако важно помнить о правилах его использования:

  1. Данное свойство содержит только имя файла (возможно, с расширением), но не полный путь к каталогу на диске.
  2. Если вы попытаетесь записать туда путь вида «D:\МоиДокументы\Файл.mxl», это приведет к непредсказуемому поведению диалога сохранения.
  3. Свойство лишь «подсказывает» платформе, что именно написать в поле «Имя файла» в окне выбора пути, но само по себе сохранение не инициирует.

Использование метода Показать()

Многие разработчики совершают ошибку, пытаясь передать полный путь во второй параметр метода Показать(). Давайте проанализируем синтаксис:

ТабличныйДокумент.Показать(Заголовок, ИмяФайла, Активизация)

Если во второй параметр (ИмяФайла) вы передаете полный путь с диском, платформа воспринимает это как команду на запись в файловую систему. Если у пользователя или процесса 1С нет соответствующих прав или путь указан неверно, вы получите ошибку доступа (например, «Ошибка доступа к файлу. 5 (0x00000005)»).

Правильный подход к отображению печатной формы

Рассмотрим, как правильно организовать код для корректного вывода документа с заданным именем. Для этого мы разделим логику: формирование документа на сервере и его показ на клиенте.

Сначала подготовим функцию на сервере для формирования данных:


&НаСервере
Функция СформироватьТабДокНаСервере(СсылкаНаОбъект)
    ТабДок = Новый ТабличныйДокумент;
    // ... здесь логика заполнения макета ...
    // Например:
    Макет = Документы.НазваниеДокумента.ПолучитьМакет("МойМакет");
    // Вывод областей...
    ТабДок.ИспользуемоеИмяФайла = "ПечатнаяФорма_" + СокрЛП(СсылкаНаОбъект.Номер);
    Возврат ТабДок;
КонецФункции

Затем вызовем эту процедуру на клиенте и отобразим результат:


&НаКлиенте
Процедура Печать(Команда)
    ТабДок = СформироватьТабДокНаСервере(Объект.Ссылка);
    // Просто передаем заголовок окна. Имя файла уже задано в свойстве объекта.
    ТабДок.Показать("Печатная форма документа");
КонецПроцедуры

Как сохранить документ программно без участия пользователя?

Если ваша задача — не показать документ пользователю, а сохранить его автоматически (например, при пакетной печати), метод Показать() использовать нельзя. В этом случае используйте метод Записать().

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


// Программное сохранение документа
ПутьКФайлу = "C:\Reports\Документ.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);

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

  1. Никогда не указывайте полные пути (с буквами дисков) в методе Показать().
  2. Используйте ИспользуемоеИмяФайла для установки «предлагаемого» имени файла при ручном сохранении пользователем.
  3. Для автоматического сохранения на диск применяйте метод Записать(), предварительно убедившись, что у процесса есть права на запись в указанную директорию.
  4. Всегда разделяйте формирование документа (сервер) и его отображение/сохранение (клиент) для обеспечения стабильной работы в управляемых формах.
← На главную