Почему метод НачатьПолучениеФайлов создает пустые файлы в веб-клиенте и как это исправить

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

При разработке под управляемые формы 1С часто возникает ситуация, когда код, идеально работающий в тонком клиенте, начинает вести себя некорректно в веб-клиенте. Одной из самых неприятных проблем является получение «пустых» файлов (размером 0 байт) при использовании асинхронного метода НачатьПолучениеФайлов. Рассмотрим детально, почему это происходит и как обеспечить стабильную работу выгрузки файлов во всех браузерах.

Анализ программной логики и типичные ошибки кода

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


ПолучаемыеФайлы = Новый Массив;
Для Сч = 0 По МассивФайлов.Количество() - 1 Цикл
    // Имя - название файла, Хранение - адрес во временном хранилище
    ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(МассивФайлов[Сч].Имя, МассивФайлов[Сч].Хранение);
    ПолучаемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
КонецЦикла;

ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект);
НачатьПолучениеФайлов(ОповещениеОЗавершении, ПолучаемыеФайлы, КаталогЭкспортаДокументов, Ложь);

На первый взгляд код выглядит верным, но в веб-клиенте критически важным становится механизм управления временным хранилищем. Выясним причину, по которой данные могут «исчезать» до момента их физической записи на диск.

Критическая роль Уникального Идентификатора формы

Основная причина получения пустого файла в веб-клиенте — преждевременная очистка временного хранилища. Когда мы помещаем данные в хранилище на сервере без указания второго параметра (идентификатора), 1С привязывает эти данные к текущему сеансу, но их жизненный цикл может быть очень коротким. В веб-клиенте из-за асинхронной природы запросов и особенностей работы расширения браузера сервер может посчитать данные ненужными еще до того, как клиентское приложение успеет их выкачать.

Правильный подход: при помещении файла во временное хранилище обязательно указывайте УникальныйИдентификатор текущей формы. Это гарантирует, что файл будет «жить» в хранилище до тех пор, пока форма открыта.


// На сервере
АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);

Проанализируем ситуацию: если вы используете Новый УникальныйИдентификатор вместо идентификатора формы, данные могут быть удалены сразу после завершения серверного вызова, так как на новый GUID никто не ссылается. Использование идентификатора формы — это «якорь», который удерживает данные для метода НачатьПолучениеФайлов.

Особенности работы Internet Explorer и права доступа

Если данные в хранилище есть (проверяется методом ПолучитьИзВременногоХранилища().Размер), но файл на диске все равно пустой, следует обратить внимание на настройки безопасности операционной системы и браузера. Рассмотрим влияние пути сохранения.

Никогда не используйте системные папки (например, корень диска C:\) или рабочий стол пользователя в качестве жестко заданного пути в веб-клиенте. Windows накладывает жесткие ограничения на запись данных браузерными процессами в эти директории. Рассмотрим пошагово, как избежать блокировки:

  1. Попробуйте сохранять файлы во временную директорию пользователя, используя КаталогВременныхФайлов().
  2. В настройках Internet Explorer добавьте адрес вашего веб-сервера в зону «Надежные узлы».
  3. Убедитесь, что в свойствах зоны «Надежные узлы» отключен «Защищенный режим» (Protected Mode). Именно он часто позволяет создать пустой файл (дескриптор), но блокирует передачу бинарного контента из расширения 1С в файловую систему.

Неизбежность диалогового окна в Web-клиенте

Часто разработчики задаются вопросом: почему при параметре Интерактивно = Ложь браузер все равно выводит окно подтверждения сохранения? Разберем технические причины этого поведения.

Важный момент: в веб-клиенте безопасность обеспечивается самим браузером. Ни один современный браузер (Chrome, Firefox, Safari, IE11) не позволит скрипту «тихо» и бесконтрольно записывать файлы на диск пользователя без его ведома. Это фундаментальное правило защиты от вредоносного ПО. Метод НачатьПолучениеФайлов в веб-клиенте всегда будет инициировать диалог, если только не используются специализированные внешние компоненты, выходящие за рамки стандартного расширения работы с файлами.

Проверка расширения работы с файлами

Для корректной работы метода НачатьПолучениеФайлов в любом браузере должно быть подключено расширение работы с файлами 1С. Рассмотрим, как программно проверить его готовность:


&НаКлиенте
Асинхрон Процедура СохранитьФайлы()
    Если Не ПодключеноРасширениеРаботыСФайлами() Тогда
        УстановитьРасширениеРаботыСФайлами();
    КонецЕсли;
    
    // Далее логика получения файлов
КонецПроцедуры

Если расширение не установлено или заблокировано антивирусом (что часто бывает в Windows 7), метод может отрабатывать некорректно, не выдавая явных ошибок, но приводя к созданию пустых файлов или отсутствию реакции системы.

Итоги и рекомендации

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

Соблюдение этих архитектурных принципов позволит вашему решению работать стабильно независимо от того, использует пользователь тонкий клиент или заходит в базу через Internet Explorer.

← На главную