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