При переходе на новые релизы платформы 1С:Предприятие 8.3 (в частности, на ветку 8.3.23) разработчики часто сталкиваются с ситуацией, когда стабильно работавший годами код внезапно перестает функционировать. Одной из таких проблем является невозможность записи текстовых файлов напрямую в сетевые каталоги (UNC-пути), особенно если база данных опубликована на веб-сервере Apache. В этой статье мы подробно разберем, почему это происходит и как обойти данное ограничение, используя проверенные методы.
Рассмотрим типичную ситуацию: в расширении или основной конфигурации написана процедура, которая формирует данные для фронт-офиса или обмена. Код успешно проходит через отладчик, переменные заполнены, метод НачатьЗапись() или Записать() выполняется без генерации исключений, а в Журнале регистрации не фиксируется никаких ошибок. Однако в конечном сетевом каталоге файл так и не появляется.
Проанализируем пример кода, который часто приводит к подобному поведению на платформе 8.3.23.1685:
Если СтрокаМассив.Касса = "1" Тогда
ТекстФлаг.НачатьЗапись(Новый ОписаниеОповещения, КаталогОбмена + "\flv001.txt", КодировкаТекста.Системная);
ТекстФайл.НачатьЗапись(Новый ОписаниеОповещения, КаталогОбмена + "\goods001.txt", КодировкаТекста.Системная);
ИначеЕсли СтрокаМассив.Касса = "2" Тогда
ТекстФлаг.НачатьЗапись(Новый ОписаниеОповещения, КаталогОбмена + "\flv002.txt", КодировкаТекста.Системная);
ТекстФайл.НачатьЗапись(Новый ОписаниеОповещения, КаталогОбмена + "\goods002.txt", КодировкаТекста.Системная);
КонецЕсли;
В данном случае используется асинхронный метод НачатьЗапись(). Выясним основные причины, по которым этот код может давать сбой в новых реалиях:
usr1cv8 или LocalSystem). В версии 8.3.23 механизмы взаимодействия с сетевым окружением стали более жесткими, и доступ к UNC-путям (\\server\share) может блокироваться на уровне прав процесса, даже если для «Всех» открыт полный доступ.НачатьЗапись() требует наличия установленного «Расширения для работы с файлами» в браузере. В проблемных релизах платформы (таких как 1685) наблюдались баги, когда обратный вызов (callback) просто не инициировался.Первым делом попробуем упростить код и исключить влияние механизмов оповещения. Попробуем заменить асинхронную запись на обычную синхронную. Это позволит нам понять, виноват ли механизм оповещений или сама файловая система.
Разберем пример изменения кода:
// Вместо асинхронного вызова:
// ТекстФлаг.НачатьЗапись(Новый ОписаниеОповещения, ПутьКФайлу, КодировкаТекста.Системная);
// Используем стандартный метод Записать():
Попытка
ТекстФлаг.Записать(КаталогОбмена + "\flv001.txt", КодировкаТекста.Системная);
ТекстФайл.Записать(КаталогОбмена + "\goods001.txt", КодировкаТекста.Системная);
Исключение
ЗаписьЖурналаРегистрации("ОшибкаЗаписиФайла", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;
Важный нюанс: Обязательно проверьте переменную КаталогОбмена. Если она пуста или содержит некорректные символы, 1С не всегда выдаст ошибку сразу, особенно при работе в расширении. Проанализируйте состояние переменной непосредственно перед вызовом записи.
Если прямая запись в сетевую папку (UNC-путь) через объект ТекстовыйДокумент не дает результата, наиболее надежным решением (хотя и «костыльным») является использование промежуточного локального хранилища. Этот метод гарантированно обходит проблемы прав веб-сервера на сетевые ресурсы при создании файловых потоков.
Рассмотрим алгоритм реализации этого метода:
Посмотрим на пример реализации через метод СкопироватьФайл() или системные команды:
// 1. Формируем локальный путь
ЛокальныйПуть = КаталогВременныхФайлов() + "goods_temp.txt";
ТекстФайл.Записать(ЛокальныйПуть, КодировкаТекста.Системная);
// 2. Целевой сетевой путь
СетевойПуть = "\\ServerName\Exchange\goods001.txt";
// 3. Копируем файл средствами встроенного языка
Попытка
КопироватьФайл(ЛокальныйПуть, СетевойПуть);
Исключение
// Если встроенный метод не справляется, можно запустить rcopy или copy через командную строку
КомандаСистемы("cmd /c copy /y " + ЛокальныйПуть + " " + СетевойПуть);
КонецПопытки;
Использование КомандаСистемы с командой copy или rcopy часто оказывается более эффективным, так как эти команды выполняются в контексте операционной системы и имеют другие механизмы работы с сетевыми очередями печати и записи.
Разберем дополнительные настройки, которые могут влиять на работу с файлами в новых версиях платформы:
РежимИспользованияМодальности установлен в значение Использовать, если вы используете старые методы, или переведите весь код на ЗаписатьАсинх(), если планируете долгосрочную поддержку на новых релизах.Резюмируем: Если после обновления платформы 1С файлы перестали записываться в сетевые папки при работе через Apache, не тратьте время на поиск ошибки в логике ТекстовыйДокумент. Скорее всего, это системное ограничение или баг релиза. Используйте схему «Локальная запись -> Копирование в сеть» — это обеспечит стабильность работы вашего фронт-офиса и сэкономит время на отладку.