При разработке собственных печатных форм в среде 1С:Предприятие (особенно на управляемых формах) часто возникает задача предустановить имя файла для пользователя. Когда пользователь нажимает кнопку сохранения в окне просмотра ТабличногоДокумента, платформа должна предлагать осмысленное имя (например, «Счет_№123.mxl»), а не оставлять поле пустым. Разберем, как реализовать это правильно и избежать распространенных ошибок доступа.
Первое, что приходит на ум разработчику — использование свойства ИспользуемоеИмяФайла. Это свойство объекта ТабличныйДокумент действительно предназначено для хранения имени файла, которое будет предложено пользователю при сохранении.
Однако важно помнить о правилах его использования:
Многие разработчики совершают ошибку, пытаясь передать полный путь во второй параметр метода Показать(). Давайте проанализируем синтаксис:
ТабличныйДокумент.Показать(Заголовок, ИмяФайла, Активизация)
Если во второй параметр (ИмяФайла) вы передаете полный путь с диском, платформа воспринимает это как команду на запись в файловую систему. Если у пользователя или процесса 1С нет соответствующих прав или путь указан неверно, вы получите ошибку доступа (например, «Ошибка доступа к файлу. 5 (0x00000005)»).
Рассмотрим, как правильно организовать код для корректного вывода документа с заданным именем. Для этого мы разделим логику: формирование документа на сервере и его показ на клиенте.
Сначала подготовим функцию на сервере для формирования данных:
&НаСервере
Функция СформироватьТабДокНаСервере(СсылкаНаОбъект)
ТабДок = Новый ТабличныйДокумент;
// ... здесь логика заполнения макета ...
// Например:
Макет = Документы.НазваниеДокумента.ПолучитьМакет("МойМакет");
// Вывод областей...
ТабДок.ИспользуемоеИмяФайла = "ПечатнаяФорма_" + СокрЛП(СсылкаНаОбъект.Номер);
Возврат ТабДок;
КонецФункции
Затем вызовем эту процедуру на клиенте и отобразим результат:
&НаКлиенте
Процедура Печать(Команда)
ТабДок = СформироватьТабДокНаСервере(Объект.Ссылка);
// Просто передаем заголовок окна. Имя файла уже задано в свойстве объекта.
ТабДок.Показать("Печатная форма документа");
КонецПроцедуры
Если ваша задача — не показать документ пользователю, а сохранить его автоматически (например, при пакетной печати), метод Показать() использовать нельзя. В этом случае используйте метод Записать().
Важное примечание: При использовании метода Записать() код должен выполняться там, где доступна файловая система, в которую вы хотите произвести запись. Если это клиентская машина, используйте клиентский код. Если серверный каталог — серверный.
// Программное сохранение документа
ПутьКФайлу = "C:\Reports\Документ.xlsx";
ТабДок.Записать(ПутьКФайлу, ТипФайлаТабличногоДокумента.XLSX);
Показать().ИспользуемоеИмяФайла для установки «предлагаемого» имени файла при ручном сохранении пользователем.Записать(), предварительно убедившись, что у процесса есть права на запись в указанную директорию.