При активной работе с файловой системой в среде 1С:Предприятие 7.7 программисты часто сталкиваются с нестабильной ошибкой Неверное имя файла!. Особенно остро эта проблема проявляется при массовой генерации отчетов или выгрузке данных в текстовые файлы, когда процедура выполняется в цикле. Примечательно, что ошибка может возникать хаотично: один и тот же файл может успешно записаться в один запуск и вызвать отказ в другой.
Рассмотрим природу этой ошибки. Несмотря на буквальный текст сообщения, проблема чаще всего кроется не в синтаксической некорректности пути (хотя это первое, что стоит проверить), а в конфликтах доступа на уровне операционной системы и сетевых протоколов. Проанализируем основные причины и пошагово разберем методы их устранения.
Выясним, как внешние программы влияют на работу 1С. Когда объект Текст вызывает метод Записать(), операционная система создает файл. В этот же микросекундный интервал современные антивирусы (например, Kaspersky, Windows Defender) или служба индексирования Windows Search могут попытаться перехватить файл для сканирования или добавления в индекс метаданных.
Если 1С пытается перезаписать файл, который в данный момент «удерживается» антивирусом для проверки, система возвращает код ошибки доступа, который устаревшее ядро 1С 7.7 интерпретирует как Неверное имя файла!. Проанализируем ситуацию: если файл небольшой (до 10-20 Кб), проверка проходит быстро, что и создает эффект «нестабильности» — иногда 1С успевает проскочить, иногда нет.
Решение:
Посмотрим на ситуацию, когда запись ведется на сетевой ресурс (шару). Современные версии Windows (10, 11) и серверные ОС используют агрессивное кэширование метаданных в протоколах SMB 2.0/3.0. Это приводит к тому, что клиентская машина «считает», что файл еще открыт или заблокирован, хотя сервер уже готов к работе.
Разберем параметры реестра, которые могут влиять на это поведение. На клиентской машине существуют настройки DirectoryCacheLifetime и FileInfoCacheLifetime. Если запись идет интенсивно, 1С 7.7 не успевает синхронизировать состояние дескрипторов файлов по сети.
Рекомендация: По возможности избегайте прямой записи из 1С 7.7 на сетевые диски в высоконагруженных циклах.
Самый надежный способ решить проблему — изменить алгоритм работы с файлами. Рассмотрим стратегию «Локальная запись — Сетевое копирование». Вместо того чтобы мучить сетевой протокол и антивирус постоянными обращениями, выполним следующие действия:
КаталогВременныхФайлов()).Пример реализации такого подхода:
// Определим пути
ЛокальныйПуть = КаталогВременныхФайлов() + ID;
СетевойПуть = СокрЛП(Константа.ПутьДляРассылки) + "\" + ID;
// Записываем локально
Текст = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку("Данные для выгрузки");
Текст.Записать(ЛокальныйПуть);
// Копируем в сеть средствами ФС
ФС.КопироватьФайл(ЛокальныйПуть, СетевойПуть, 0);
ФС.УдалитьФайл(ЛокальныйПуть);
Проанализируем поведение метода Записать(). В 1С 7.7 он работает не всегда корректно при перезаписи существующих файлов. Чтобы минимизировать риск, попробуем явно удалять старый файл перед созданием нового и введем небольшую технологическую паузу.
Разберем пример кода с обработкой исключительной ситуации:
Для IDn = 1 По IDq Цикл
ID = Лев(ТЗ.ПолучитьПараметрыКолонки((IDn-1)*4+2), 8); // Проверьте на спецсимволы!
ПолныйПуть = СокрЛП(Константа.ПутьДляРассылки) + "\" + ID;
// Предварительно удаляем файл, если он есть
Если ФС.СуществуетФайл(ПолныйПуть) = 1 Тогда
ФС.УдалитьФайл(ПолныйПуть);
КонецЕсли;
Текст = СоздатьОбъект("Текст");
Текст.ДобавитьСтроку("Содержимое");
// Попытка записи с простейшим механизмом ожидания
Попытка
Текст.Записать(ПолныйПуть);
Исключение
// Если не удалось, подождем 0.5 сек и попробуем снова
КомандаСистемы("ping -n 1 -w 500 127.0.0.1 > nul");
Текст.Записать(ПолныйПуть);
КонецПопытки;
КонецЦикла;
Если стандартный объект Текст продолжает выдавать ошибки, стоит обратиться к более мощным инструментам Windows. Рассмотрим использование Scripting.FileSystemObject. Этот объект работает напрямую с WinAPI и более корректно обрабатывает файловые потоки.
Посмотрим на пример реализации функции записи через FSO:
Процедура глЗаписатьФайлFSO(ИмяФайла, СтрокаДанных)
FSO = СоздатьОбъект("Scripting.FileSystemObject");
// 2 - ForWriting, True - Create if not exists
// -1 - Unicode, 0 - ASCII
Попытка
ТекстФайл = FSO.CreateTextFile(ИмяФайла, -1);
ТекстФайл.WriteLine(СтрокаДанных);
ТекстФайл.Close();
Исключение
Сообщить("Ошибка FSO: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
Метод CreateTextFile часто оказывается более устойчивым к микро-блокировкам со стороны системы, чем встроенный метод Записать() объекта Текст.
Проанализируем дополнительные факторы, которые могут приводить к сообщению Неверное имя файла!:
ID не содержит символов перевода строки, табуляции или знаков / : * ? " < > |. В 1С 7.7 визуально в Сообщить() строка может выглядеть чисто, но содержать невидимый Chr(13).MAX_PATH составляет 260 символов. Если ваша сетевая шара имеет длинное имя, лимит может быть превышен.Подводя итог, можно сказать, что в 90% случаев проблема решается комбинацией добавления папки в исключения антивируса и переходом на локальную запись с последующим копированием. Это изолирует 1С от капризов сетевых протоколов и внешнего мониторинга системы.