Почему не работает метод ФС.ВыбратьФайл() в 1С 7.7 при задании длинного имени файла и как это исправить?

Программист 1С v7.7 IT и автоматизация бизнеса
← На главную

При выгрузке печатных форм и табличных документов из 1С:Предприятие 7.7 в файлы Excel разработчики часто формируют наименование файла на основе заголовка отчета. Если заголовок содержит подробные данные (например, период, наименование документа, время формирования со секундами), стандартная процедура ФС.ВыбратьФайл() может прекратить работать или молча завершаться без открытия диалогового окна.

Разберем подробнее технические причины, по которым возникает эта проблема, и проанализируем практические способы её решения.

Основные причины проблемы

Проанализируем ситуацию и выделим ключевые факторы, из-за которых диалог выбора файла завершается с ошибкой или не открывается вовсе:

  1. Запрещенные символы операционной системы. В именах файлов Windows категорически запрещено использовать двоеточия (:), так как они зарезервированы для обозначения дисков и альтернативных потоков NTFS. Если в имя файла подставляется время со секундами (например, 14:29:16), диалог Windows API не сможет обработать такую строку.
  2. Ограничение платформы 1С 7.7 на длину предзаполненного имени. Метод ФС.ВыбратьФайл() использует внутренний буфер платформы. Если в переменной имени файла передается строка длиной более 63 символов, функция может сбоить, обрезать строку или не вызывать системный диалог сохранения.
  3. Превышение максимальной длины пути (MAX_PATH). Общая длина пути к файлу (включая имя каталога и расширение) в Windows ограничена 260 символами. При сохранении в глубокие вложенные папки длинные имена файлов приводят к сбою файловых операций.

Способ 1. Очистка имени от спецсимволов и сокращение длины

Рассмотрим стандартный подход к исправлению строки имени файла. Перед передачей переменной в метод ФС.ВыбратьФайл() необходимо удалить двоеточия и сократить наименование, чтобы его длина не превышала 63 символов.

Посмотрим на пример обработки строки:


ИмяФайла = "Движения_Партии_" + ДатаСтр;
ИмяФайла = СтрЗаменить(ИмяФайла, ":", "-");
Если СтрДлина(ИмяФайла) > 60 Тогда
    ИмяФайла = Лев(ИмяФайла, 60);
КонецЕсли;

Если ФС.ВыбратьФайл(1, ИмяФайла, НачИмяКаталога, "Выберите файл для сохранения", "*.xls|*.xls", "xls") = 1 Тогда
    // Сохранение файла
КонецЕсли;

Способ 2. Разделение выбора каталога и формирования имени файла

Выясним, как обойти ограничение платформы 1С 7.7 в 63 символа, если нам необходимо сохранить файл с длинным подробным наименованием. Для этого передадим в метод ФС.ВыбратьФайл() короткое имя по умолчанию или пустую строку, а полная длина сгенерированного имени будет применена уже после выбора каталога пользователем.

Разберем данный алгоритм по шагам:

  1. Подготавливаем полное информативное имя файла и удаляем из него все двоеточия и другие запрещенные символы.
  2. Вызываем ФС.ВыбратьФайл() с пустым или кратким значением в параметре имени.
  3. Склеиваем выбранный каталог и полное корректное имя файла непосредственно перед записью на диск.

Рассмотрим пример кода:


// Формируем полное имя файла
ПолноеИмяФайла = "Движения регистра ПартииНаличие за период с 03.10.2017 по 03.10.2017";
ПолноеИмяФайла = СтрЗаменить(ПолноеИмяФайла, ":", "-");

// Для диалога используем краткое имя
ИмяФайлаДляДиалога = "Отчет.xls";

Если ФС.ВыбратьФайл(1, ИмяФайлаДляДиалога, НачИмяКаталога, "Укажите папку для сохранения", "Файлы Excel (*.xls)|*.xls", "xls") = 1 Тогда
    ИтоговыйПуть = НачИмяКаталога + ПолноеИмяФайла + ".xls";
    Таб.Записать(ИтоговыйПуть, "XLS");
КонецЕсли;

Способ 3. Использование COM-объекта Excel

Если табличный документ выгружается в формат Excel, мы можем воспользоваться встроенными возможностями приложения Excel через Automation-объект. Метод GetSaveAsFilename приложения Excel не имеет ограничения платформы 1С 7.7 в 63 символа на начальное значение.

Посмотрим на пример применения этого метода:


Попытка
    Эксель = СоздатьОбъект("Excel.Application");
    НачальноеИмя = "Движения_регистра_ПартииНаличие_03102017";
    ВыбранныйПуть = Эксель.GetSaveAsFilename(НачальноеИмя, "Файлы Excel (*.xls), *.xls");
    Эксель.Quit();
    
    Если ПустоеЗначение(ВыбранныйПуть) = 0 И ВыбранныйПуть <> "False" Тогда
        Таб.Записать(ВыбранныйПуть, "XLS");
    КонецЕсли;
Исключение
    Сообщить("Не удалось запустить Excel для выбора пути файла!");
КонецПопытки;

Важное замечание: даже при использовании сторонних диалоговых окон имя файла не должно содержать спецсимволы Windows (:, /, \, *, ?, ", <, >, |).

← На главную