При выгрузке печатных форм и табличных документов из 1С:Предприятие 7.7 в файлы Excel разработчики часто формируют наименование файла на основе заголовка отчета. Если заголовок содержит подробные данные (например, период, наименование документа, время формирования со секундами), стандартная процедура ФС.ВыбратьФайл() может прекратить работать или молча завершаться без открытия диалогового окна.
Разберем подробнее технические причины, по которым возникает эта проблема, и проанализируем практические способы её решения.
Проанализируем ситуацию и выделим ключевые факторы, из-за которых диалог выбора файла завершается с ошибкой или не открывается вовсе:
:), так как они зарезервированы для обозначения дисков и альтернативных потоков NTFS. Если в имя файла подставляется время со секундами (например, 14:29:16), диалог Windows API не сможет обработать такую строку.ФС.ВыбратьФайл() использует внутренний буфер платформы. Если в переменной имени файла передается строка длиной более 63 символов, функция может сбоить, обрезать строку или не вызывать системный диалог сохранения.Рассмотрим стандартный подход к исправлению строки имени файла. Перед передачей переменной в метод ФС.ВыбратьФайл() необходимо удалить двоеточия и сократить наименование, чтобы его длина не превышала 63 символов.
Посмотрим на пример обработки строки:
ИмяФайла = "Движения_Партии_" + ДатаСтр;
ИмяФайла = СтрЗаменить(ИмяФайла, ":", "-");
Если СтрДлина(ИмяФайла) > 60 Тогда
ИмяФайла = Лев(ИмяФайла, 60);
КонецЕсли;
Если ФС.ВыбратьФайл(1, ИмяФайла, НачИмяКаталога, "Выберите файл для сохранения", "*.xls|*.xls", "xls") = 1 Тогда
// Сохранение файла
КонецЕсли;
Выясним, как обойти ограничение платформы 1С 7.7 в 63 символа, если нам необходимо сохранить файл с длинным подробным наименованием. Для этого передадим в метод ФС.ВыбратьФайл() короткое имя по умолчанию или пустую строку, а полная длина сгенерированного имени будет применена уже после выбора каталога пользователем.
Разберем данный алгоритм по шагам:
ФС.ВыбратьФайл() с пустым или кратким значением в параметре имени.Рассмотрим пример кода:
// Формируем полное имя файла
ПолноеИмяФайла = "Движения регистра ПартииНаличие за период с 03.10.2017 по 03.10.2017";
ПолноеИмяФайла = СтрЗаменить(ПолноеИмяФайла, ":", "-");
// Для диалога используем краткое имя
ИмяФайлаДляДиалога = "Отчет.xls";
Если ФС.ВыбратьФайл(1, ИмяФайлаДляДиалога, НачИмяКаталога, "Укажите папку для сохранения", "Файлы Excel (*.xls)|*.xls", "xls") = 1 Тогда
ИтоговыйПуть = НачИмяКаталога + ПолноеИмяФайла + ".xls";
Таб.Записать(ИтоговыйПуть, "XLS");
КонецЕсли;
Если табличный документ выгружается в формат Excel, мы можем воспользоваться встроенными возможностями приложения Excel через Automation-объект. Метод GetSaveAsFilename приложения Excel не имеет ограничения платформы 1С 7.7 в 63 символа на начальное значение.
Посмотрим на пример применения этого метода:
Попытка
Эксель = СоздатьОбъект("Excel.Application");
НачальноеИмя = "Движения_регистра_ПартииНаличие_03102017";
ВыбранныйПуть = Эксель.GetSaveAsFilename(НачальноеИмя, "Файлы Excel (*.xls), *.xls");
Эксель.Quit();
Если ПустоеЗначение(ВыбранныйПуть) = 0 И ВыбранныйПуть <> "False" Тогда
Таб.Записать(ВыбранныйПуть, "XLS");
КонецЕсли;
Исключение
Сообщить("Не удалось запустить Excel для выбора пути файла!");
КонецПопытки;
Важное замечание: даже при использовании сторонних диалоговых окон имя файла не должно содержать спецсимволы Windows (:, /, \, *, ?, ", <, >, |).