Почему 1С 8.3 выдает ошибку «Файл не обнаружен» при выборе каталога и загрузке TXT-файла?

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

При переходе конфигураций с платформы 1С:Предприятие 8.1 на версию 8.3 разработчики нередко сталкиваются с ситуацией, когда ранее работавший алгоритм загрузки данных из внешнего текстового файла перестает находить файл на рабочих станциях. Проанализируем исходный код процедуры загрузки, выясним основные причины возникновения ошибки и рассмотрим способы их устранения.

Анализ исходного кода и причин ошибки

Посмотрим на типовой пример кода, в котором возникает данная проблема:


Процедура ПолучитьДанныеИзКадровНажатие(Элемент)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    Диалог.Заголовок = "Выберите каталог с данными из программы по кадрам!";
    Диалог.ПолноеИмяФайла = "";
    Диалог.ПредварительныйПросмотр = Истина;
    Фильтр = "TXT (*.txt)|*.txt";
    Диалог.Фильтр = Фильтр;
    
    Если Диалог.Выбрать() Тогда
        фКаталогЗагрузки = Диалог.ПолноеИмяФайла;
    Иначе
        Отказ = Истина;
        Возврат;
    КонецЕсли;
    
    имяФайла = СокрЛП(фКаталогЗагрузки) + "uat_" + Строка(Месяц(Дата)) + "_" + Строка(Формат(Год(Дата),"ЧГ=0")) + ".txt";
    
    Текст = Новый ТекстовыйДокумент();
    Текст.Прочитать(имяФайла);
    // дальнейшая обработка строк...
КонецПроцедуры

В приведенном фрагменте присутствуют сразу несколько критических недочетов, которые приводят к ошибке «Файл не обнаружен» или скрывают файлы в диалоговом окне:

  1. Отсутствие разделителя пути: Свойство Диалог.ПолноеИмяФайла при выборе каталога возвращает путь без закрывающего слэша (например, C:\Обмен). При простой конкатенации строк результирующий путь получается вида C:\Обменuat_9_2026.txt вместо C:\Обмен\uat_9_2026.txt.
  2. Несоответствие режима диалога и фильтра: При инициализации объекта ДиалогВыбораФайла передан режим РежимДиалогаВыбораФайла.ВыборКаталога. В современных операционных системах диалог выбора папки не отображает находящиеся внутри файлы, а свойство Фильтр в данном режиме игнорируется.
  3. Форматирование номера месяца: Функция Строка(Месяц(Дата)) возвращает число без ведущего нуля (для января — 1, для сентября — 9). Если файлы в каталоге именуются с лидирующим нулем (например, uat_09_2026.txt), имя сформируется неверно.

Способ 1. Исправление конкатенации пути и форматирования имени файла

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

Для корректной сборки пути необходимо гарантировать наличие символа \ на конце пути каталога, а также правильно отформатировать дату:


Процедура ПолучитьДанныеИзКадровНажатие(Элемент)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.ВыборКаталога);
    Диалог.Заголовок = "Выберите каталог с данными из программы по кадрам";
    
    Если Не Диалог.Выбрать() Тогда
        Возврат;
    КонецЕсли;
    
    КаталогЗагрузки = СокрЛП(Диалог.Каталог);
    Если Не Прав(КаталогЗагрузки, 1) = "\" Тогда
        КаталогЗагрузки = КаталогЗагрузки + "\";
    КонецЕсли;
    
    // Формируем месяц с лидирующим нулем и год без группировки разрядов
    СтрокаМесяца = Формат(Дата, "ДФ=MM");
    СтрокаГода   = Формат(Год(Дата), "ЧГ=0");
    
    ИмяФайла = КаталогЗагрузки + "uat_" + СтрокаМесяца + "_" + СтрокаГода + ".txt";
    
    // Проверяем физическое существование файла перед чтением
    ПроверяемыйФайл = Новый Файл(ИмяФайла);
    Если Не ПроверяемыйФайл.Существует() Тогда
        Сообщить("Файл не обнаружен по пути: " + ИмяФайла, СтатусСообщения.Важное);
        Возврат;
    КонецЕсли;
    
    Текст = Новый ТекстовыйДокумент();
    Текст.Прочитать(ИмяФайла);
    
    // Обработка данных
КонецПроцедуры

Способ 2. Использование режима выбора конкретного файла

Если требуется, чтобы пользователь видел список файлов в диалоговом окне и мог самостоятельно выбрать нужный документ, следует переключить режим диалога на РежимДиалогаВыбораФайла.Открытие. В этом случае свойство Фильтр отработает штатно, а полный путь будет получен без необходимости ручной склейки строк.


Процедура ПолучитьДанныеИзКадровНажатие(Элемент)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выберите файл с данными";
    Диалог.ПолноеИмяФайла = "";
    Диалог.Фильтр = "Текстовые файлы (*.txt)|*.txt|Все файлы (*.*)|*.*";
    Диалог.МножественныйВыбор = Ложь;
    
    Если Диалог.Выбрать() Тогда
        ИмяФайла = Диалог.ПолноеИмяФайла;
    Иначе
        Возврат;
    КонецЕсли;
    
    Текст = Новый ТекстовыйДокумент();
    Попытка
        Текст.Прочитать(ИмяФайла);
    Исключение
        Сообщить("Не удалось прочитать файл: " + ОписаниеОшибки(), СтатусСообщения.Важное);
        Возврат;
    КонецПопытки;
    
    // Обработка данных
КонецПроцедуры

Рекомендации по диагностике файловых операций

При возникновении ошибок чтения внешних файлов рекомендуется соблюдать следующие правила:

  1. Проверка через объект Файл: Всегда проверяйте существование пути методом Файл.Существует() и выводите пользователю полный сформированный путь при ошибке. Это позволяет сразу увидеть пропущенные слэши или неверные символы.
  2. Учет контекста выполнения: Если обработка данных вынесена в серверный модуль или общий модуль без флага «Клиент», сервер 1С не имеет прямого доступа к локальным дискам рабочей станции пользователя. В таком случае файл необходимо передавать на сервер через временное хранилище с помощью объекта ДвоичныеДанные.
← На главную