При разработке под управляемые формы 1С часто возникает ситуация, когда код, идеально работающий в тонком клиенте, начинает вести себя некорректно в веб-клиенте. Одной из самых неприятных проблем является получение «пустых» файлов (размером 0 байт) при использовании асинхронного метода НачатьПолучениеФайлов. Рассмотрим детально, почему это происходит и как обеспечить стабильную работу выгрузки файлов во всех браузерах.
Разберем стандартный механизм получения файлов с сервера на клиент. Для этого используется массив объектов типа ОписаниеПередаваемогоФайла. Проанализируем исходный фрагмент кода, который часто становится источником проблем:
ПолучаемыеФайлы = Новый Массив;
Для Сч = 0 По МассивФайлов.Количество() - 1 Цикл
// Имя - название файла, Хранение - адрес во временном хранилище
ОписаниеПередаваемогоФайла = Новый ОписаниеПередаваемогоФайла(МассивФайлов[Сч].Имя, МассивФайлов[Сч].Хранение);
ПолучаемыеФайлы.Добавить(ОписаниеПередаваемогоФайла);
КонецЦикла;
ОповещениеОЗавершении = Новый ОписаниеОповещения("ВыполнитьПослеПолученияФайлов", ЭтотОбъект);
НачатьПолучениеФайлов(ОповещениеОЗавершении, ПолучаемыеФайлы, КаталогЭкспортаДокументов, Ложь);
На первый взгляд код выглядит верным, но в веб-клиенте критически важным становится механизм управления временным хранилищем. Выясним причину, по которой данные могут «исчезать» до момента их физической записи на диск.
Основная причина получения пустого файла в веб-клиенте — преждевременная очистка временного хранилища. Когда мы помещаем данные в хранилище на сервере без указания второго параметра (идентификатора), 1С привязывает эти данные к текущему сеансу, но их жизненный цикл может быть очень коротким. В веб-клиенте из-за асинхронной природы запросов и особенностей работы расширения браузера сервер может посчитать данные ненужными еще до того, как клиентское приложение успеет их выкачать.
Правильный подход: при помещении файла во временное хранилище обязательно указывайте УникальныйИдентификатор текущей формы. Это гарантирует, что файл будет «жить» в хранилище до тех пор, пока форма открыта.
// На сервере
АдресФайла = ПоместитьВоВременноеХранилище(ДанныеФайла, ЭтаФорма.УникальныйИдентификатор);
Проанализируем ситуацию: если вы используете Новый УникальныйИдентификатор вместо идентификатора формы, данные могут быть удалены сразу после завершения серверного вызова, так как на новый GUID никто не ссылается. Использование идентификатора формы — это «якорь», который удерживает данные для метода НачатьПолучениеФайлов.
Если данные в хранилище есть (проверяется методом ПолучитьИзВременногоХранилища().Размер), но файл на диске все равно пустой, следует обратить внимание на настройки безопасности операционной системы и браузера. Рассмотрим влияние пути сохранения.
Никогда не используйте системные папки (например, корень диска C:\) или рабочий стол пользователя в качестве жестко заданного пути в веб-клиенте. Windows накладывает жесткие ограничения на запись данных браузерными процессами в эти директории. Рассмотрим пошагово, как избежать блокировки:
КаталогВременныхФайлов().Часто разработчики задаются вопросом: почему при параметре Интерактивно = Ложь браузер все равно выводит окно подтверждения сохранения? Разберем технические причины этого поведения.
Важный момент: в веб-клиенте безопасность обеспечивается самим браузером. Ни один современный браузер (Chrome, Firefox, Safari, IE11) не позволит скрипту «тихо» и бесконтрольно записывать файлы на диск пользователя без его ведома. Это фундаментальное правило защиты от вредоносного ПО. Метод НачатьПолучениеФайлов в веб-клиенте всегда будет инициировать диалог, если только не используются специализированные внешние компоненты, выходящие за рамки стандартного расширения работы с файлами.
Для корректной работы метода НачатьПолучениеФайлов в любом браузере должно быть подключено расширение работы с файлами 1С. Рассмотрим, как программно проверить его готовность:
&НаКлиенте
Асинхрон Процедура СохранитьФайлы()
Если Не ПодключеноРасширениеРаботыСФайлами() Тогда
УстановитьРасширениеРаботыСФайлами();
КонецЕсли;
// Далее логика получения файлов
КонецПроцедуры
Если расширение не установлено или заблокировано антивирусом (что часто бывает в Windows 7), метод может отрабатывать некорректно, не выдавая явных ошибок, но приводя к созданию пустых файлов или отсутствию реакции системы.
Подведем итог нашему анализу. Чтобы файлы в веб-клиенте сохранялись корректно и не были пустыми, необходимо соблюдать следующие правила:
Начать... или ...Асинх), так как синхронные методы в современных браузерах постепенно выводятся из эксплуатации.НачатьПолучениеФайлов с помощью Сообщить.Соблюдение этих архитектурных принципов позволит вашему решению работать стабильно независимо от того, использует пользователь тонкий клиент или заходит в базу через Internet Explorer.