Многие пользователи и разработчики сталкиваются с ситуацией, когда при нажатии кнопки «Сохранить» в сформированном отчете или печатной форме 1С предлагает пустое поле имени файла или стандартное название «Таблица». Это замедляет работу, вынуждая вручную вводить название документа. Особенно часто эта проблема проявляется после переустановки операционной системы или очистки кэша 1С, когда «память» программы обнуляется.
В этой статье мы подробно разберем, как программно управлять именем файла при сохранении табличного документа, рассмотрим несколько способов реализации этой задачи и выясним, какие механизмы платформы 1С отвечают за это поведение.
Рассмотрим самый простой и эффективный способ, на котором настаивали участники обсуждения. Метод Показать() объекта ТабличныйДокумент имеет несколько параметров, которые напрямую влияют на то, что увидит пользователь в диалоговом окне.
Проанализируем синтаксис метода:
Показать(<Заголовок>, <ПутьКФайлу>, <ЗакрыватьПриПовторномВыводе>)
Разберем подробнее, как это работает:
Посмотрим на пример кода:
ТабДок = Новый ТабличныйДокумент;
// ... (здесь идет формирование документа)
ИмяОтчета = "Реестр_платежей_от_" + Формат(ТекущаяДата(), "ДФ=yyyyMMdd");
ТабДок.Показать(ИмяОтчета);
В данном случае, когда пользователь откроет форму и захочет сохранить документ в формате Excel или PDF, в поле «Имя файла» уже будет подставлено «Реестр_платежей_от_20231027».
Выясним причину, по которой настройки «слетают» после переустановки Windows. За это отвечает свойство ИмяПараметровПечати. Это строковый идентификатор, под которым 1С сохраняет настройки печати (отступы, ориентацию, масштаб) и последние пути сохранения для конкретной формы в системном профиле пользователя.
Если в коде задать это свойство, 1С начнет «узнавать» этот отчет:
ТабДок.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_РЕЕСТР_ПЛАТЕЖЕЙ";
Почему это важно: когда вы один раз сохраните файл под определенным именем в определенную папку, 1С запомнит этот выбор для данного идентификатора. После переустановки системы папка %AppData%\1C\1Cv8 очищается, и все эти связи теряются. Чтобы восстановить функционал, необходимо, чтобы программа один раз успешно выполнила сохранение с заполненным свойством ИмяПараметровПечати.
Разберем современный подход, который появился в более новых версиях платформы. У объекта ТабличныйДокумент появилось прямое свойство ИмяФайла. Это наиболее приоритетный параметр для диалога сохранения.
Рассмотрим пример использования:
ТабДок = Новый ТабличныйДокумент;
// Формирование документа...
ТабДок.ИмяФайла = "Накладная_№" + НомерДокумента;
ТабДок.Показать();
Использование этого свойства гарантирует, что даже если заголовок окна отличается (например, содержит техническую информацию), имя файла при сохранении будет именно таким, какое вы задали в ИмяФайла.
Иногда требуется не просто предложить имя, а полностью контролировать процесс сохранения, например, запретить изменять путь или принудительно устанавливать расширение .xlsx. В этом случае мы проанализируем использование объекта ДиалогВыбораФайла.
Рассмотрим по шагам, как это реализовать:
ДиалогВыбораФайла с режимом РежимДиалогаВыбораФайла.Сохранение.ПолноеИмяФайла.Записать() у табличного документа.Пример реализации:
Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
Диалог.Заголовок = "Выберите куда сохранить отчет";
Диалог.ПолноеИмяФайла = "Отчет_по_продажам_" + Формат(ТекущаяДата(), "ДФ=dd.MM.yyyy");
Диалог.Фильтр = "Лист Excel (*.xlsx)|*.xlsx|Документ PDF (*.pdf)|*.pdf";
Если Диалог.Выбрать() Тогда
ВыбранныйПуть = Диалог.ПолноеИмяФайла;
// Определяем тип файла на основе расширения или выбора пользователя
ТабДок.Записать(ВыбранныйПуть, ТипФайлаТабличногоДокумента.XLSX);
КонецЕсли;
Проанализируем ситуацию, описанную в сообщениях форума. Пользователь утверждает, что «раньше имя было, а теперь пусто». Это классический признак работы механизма кэширования настроек. Платформа 1С хранит пользовательские настройки в файлах *.pfl. В этих файлах запоминается последнее введенное значение в строке «Имя файла» для каждого типа отчета (если используется ИмяПараметровПечати).
Когда систему переустановили, эти файлы были удалены. Если программист не указал имя файла явно в коде (через Показать() или ИмяФайла), программа больше не может «подсмотреть» последнее удачное сохранение в кэше и предлагает пустое поле. Вывод: для стабильной работы необходимо всегда явно прописывать имя файла в коде, не полагаясь на память системы.
Посмотрим на нюансы работы в разных режимах запуска. В толстом клиенте взаимодействие с файловой системой Windows происходит напрямую, и вышеописанные методы работают идеально. Однако в тонком клиенте или при работе через браузер ситуация сложнее. Разобраться с логикой клиент-серверного взаимодействия поможет руководство по работе с файлами в управляемых формах 1С 8.3.
В веб-клиенте браузер сам управляет процессом скачивания файлов. Чтобы передать имя файла из 1С в браузер, часто используется механизм временных хранилищ:
ПолучитьФайл(), где вторым параметром передается желаемое имя.Пример для тонкого клиента:
ИмяФайлаНаСервере = ПолучитьИмяВременногоФайла("xlsx");
ТабДок.Записать(ИмяФайлаНаСервере, ТипФайлаТабличногоДокумента.XLSX);
АдресХранилища = ПоместитьВоВременноеХранилище(Новый ДвоичныеДанные(ИмяФайлаНаСервере));
ПолучитьФайл(АдресХранилища, "Нужное_Имя_Файла.xlsx", Истина);
Таким образом, мы рассмотрели все основные способы управления именованием файлов. Наиболее правильным и современным подходом для обычных форм и управляемого приложения (до версии 8.3.15) является использование первого параметра метода Показать(), а для новых версий — использование свойства ИмяФайла. Это обеспечит комфортную работу пользователей и исключит необходимость повторного ввода названий документов вручную.