Как решить проблему с записью текстовых файлов в сетевые папки после обновления платформы 1С до версии 8.3.23?

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

При переходе на новые релизы платформы 1С:Предприятие 8.3 (в частности, на ветку 8.3.23) разработчики часто сталкиваются с ситуацией, когда стабильно работавший годами код внезапно перестает функционировать. Одной из таких проблем является невозможность записи текстовых файлов напрямую в сетевые каталоги (UNC-пути), особенно если база данных опубликована на веб-сервере Apache. В этой статье мы подробно разберем, почему это происходит и как обойти данное ограничение, используя проверенные методы.

Анализ проблемы: почему отладчик «молчит», а файла нет?

Рассмотрим типичную ситуацию: в расширении или основной конфигурации написана процедура, которая формирует данные для фронт-офиса или обмена. Код успешно проходит через отладчик, переменные заполнены, метод НачатьЗапись() или Записать() выполняется без генерации исключений, а в Журнале регистрации не фиксируется никаких ошибок. Однако в конечном сетевом каталоге файл так и не появляется.

Проанализируем пример кода, который часто приводит к подобному поведению на платформе 8.3.23.1685:


Если СтрокаМассив.Касса = "1" Тогда 
    ТекстФлаг.НачатьЗапись(Новый ОписаниеОповещения, КаталогОбмена + "\flv001.txt", КодировкаТекста.Системная); 
    ТекстФайл.НачатьЗапись(Новый ОписаниеОповещения, КаталогОбмена + "\goods001.txt", КодировкаТекста.Системная); 
ИначеЕсли СтрокаМассив.Касса = "2" Тогда 
    ТекстФлаг.НачатьЗапись(Новый ОписаниеОповещения, КаталогОбмена + "\flv002.txt", КодировкаТекста.Системная); 
    ТекстФайл.НачатьЗапись(Новый ОписаниеОповещения, КаталогОбмена + "\goods002.txt", КодировкаТекста.Системная); 
КонецЕсли;

В данном случае используется асинхронный метод НачатьЗапись(). Выясним основные причины, по которым этот код может давать сбой в новых реалиях:

  1. Контекст веб-сервера: При работе через Apache 1С исполняется от имени системной учетной записи (например, usr1cv8 или LocalSystem). В версии 8.3.23 механизмы взаимодействия с сетевым окружением стали более жесткими, и доступ к UNC-путям (\\server\share) может блокироваться на уровне прав процесса, даже если для «Всех» открыт полный доступ.
  2. Асинхронные вызовы в веб-клиенте: Метод НачатьЗапись() требует наличия установленного «Расширения для работы с файлами» в браузере. В проблемных релизах платформы (таких как 1685) наблюдались баги, когда обратный вызов (callback) просто не инициировался.
  3. Особенности владения файловыми дескрипторами: В новых версиях 1С изменилась логика захвата файлов. Если платформа не может монопольно захватить поток в сетевом каталоге, она может «тихо» прервать операцию без вывода ошибки.

Способ 1. Переход на синхронные методы и проверка путей

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

Разберем пример изменения кода:


// Вместо асинхронного вызова:
// ТекстФлаг.НачатьЗапись(Новый ОписаниеОповещения, ПутьКФайлу, КодировкаТекста.Системная);

// Используем стандартный метод Записать():
Попытка
    ТекстФлаг.Записать(КаталогОбмена + "\flv001.txt", КодировкаТекста.Системная);
    ТекстФайл.Записать(КаталогОбмена + "\goods001.txt", КодировкаТекста.Системная);
Исключение
    ЗаписьЖурналаРегистрации("ОшибкаЗаписиФайла", УровеньЖурналаРегистрации.Ошибка, , , ПодробноеПредставлениеОшибки(ИнформацияОбОшибке()));
КонецПопытки;

Важный нюанс: Обязательно проверьте переменную КаталогОбмена. Если она пуста или содержит некорректные символы, 1С не всегда выдаст ошибку сразу, особенно при работе в расширении. Проанализируйте состояние переменной непосредственно перед вызовом записи.

Способ 2. Двухэтапная схема: локальная запись с последующим переносом

Если прямая запись в сетевую папку (UNC-путь) через объект ТекстовыйДокумент не дает результата, наиболее надежным решением (хотя и «костыльным») является использование промежуточного локального хранилища. Этот метод гарантированно обходит проблемы прав веб-сервера на сетевые ресурсы при создании файловых потоков.

Рассмотрим алгоритм реализации этого метода:

  1. Создаем временный файл или записываем данные в локальную папку на сервере (например, в папку временных файлов 1С).
  2. Используем стандартные средства копирования файлов для переноса в целевой сетевой каталог.
  3. Удаляем временный локальный файл.

Посмотрим на пример реализации через метод СкопироватьФайл() или системные команды:


// 1. Формируем локальный путь
ЛокальныйПуть = КаталогВременныхФайлов() + "goods_temp.txt";
ТекстФайл.Записать(ЛокальныйПуть, КодировкаТекста.Системная);

// 2. Целевой сетевой путь
СетевойПуть = "\\ServerName\Exchange\goods001.txt";

// 3. Копируем файл средствами встроенного языка
Попытка
    КопироватьФайл(ЛокальныйПуть, СетевойПуть);
Исключение
    // Если встроенный метод не справляется, можно запустить rcopy или copy через командную строку
    КомандаСистемы("cmd /c copy /y " + ЛокальныйПуть + " " + СетевойПуть);
КонецПопытки;

Использование КомандаСистемы с командой copy или rcopy часто оказывается более эффективным, так как эти команды выполняются в контексте операционной системы и имеют другие механизмы работы с сетевыми очередями печати и записи.

Рекомендации по настройке безопасности в 8.3.23

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

Резюмируем: Если после обновления платформы 1С файлы перестали записываться в сетевые папки при работе через Apache, не тратьте время на поиск ошибки в логике ТекстовыйДокумент. Скорее всего, это системное ограничение или баг релиза. Используйте схему «Локальная запись -> Копирование в сеть» — это обеспечит стабильность работы вашего фронт-офиса и сэкономит время на отладку.

← На главную