Как программно выгрузить текстовый файл в веб-клиенте 1С с заданным именем

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

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

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

Анализируем проблему: почему обычный метод может не сработать

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

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


&НаКлиенте
Процедура СохранитьФайл(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Фильтр = "Текстовый файл (*.txt)|*.txt";
    Диалог.ПолноеИмяФайла = "НашеИмяФайла.txt"; // Программное задание имени
    Если Диалог.Выбрать() Тогда
        // Здесь логика записи
    КонецЕсли;
КонецПроцедуры

Проблема этого подхода в том, что в 99% случаев в веб-клиенте выполнение остановится на методе Выбрать(), если не установлены расширения работы с файлами или не настроены разрешения в браузере. Поэтому нам необходимо рассмотреть более надежный и современный вариант.

Современное решение: использование временного хранилища и асинхронных методов

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

Разберем этот процесс по шагам.

Шаг 1. Формирование текстовых данных на сервере

Для создания чистого текстового файла (например, в кодировке UTF-8) лучше использовать объект ЗаписьТекста, а не ЗначениеВФайл, так как последний записывает данные во внутреннем формате 1С, который не всегда удобно читать сторонними редакторами.


&НаСервере
Функция ПодготовитьФайлНаСервере()
    // Создаем уникальное имя для временного файла на сервере
    ИмяФайла = ПолучитьИмяВременногоФайла("txt");
    
    // Записываем текст
    ТекстДляЗаписи = "Это содержимое нашего файла." + Символы.ПС + "Вторая строка.";
    Запись = Новый ЗаписьТекста(ИмяФайла, КодировкаТекста.UTF8);
    Запись.ЗаписатьСтроку(ТекстДляЗаписи);
    Запись.Закрыть();
    
    // Читаем файл в двоичные данные для передачи на клиент
    ДвоичныеДанные = Новый ДвоичныеДанные(ИмяФайла);
    
    // Помещаем во временное хранилище и получаем адрес
    Адрес = ПоместитьВоВременноеХранилище(ДвоичныеДанные, ЭтаФорма.УникальныйИдентификатор);
    
    // Удаляем временный файл с сервера, он нам больше не нужен
    УдалитьФайлы(ИмяФайла);
    
    Возврат Адрес;
КонецФункции

Шаг 2. Инициирование скачивания на клиенте

Теперь воспользуемся методом НачатьПолучениеФайлаССервера(). Этот метод асинхронный, он не блокирует работу интерфейса и корректно обрабатывается браузером как стандартная загрузка (Download).


&НаКлиенте
Процедура ВыполнитьВыгрузку(Команда)
    // Получаем адрес данных из сервера
    АдресХранилища = ПодготовитьФайлНаСервере();
    
    // Задаем имя файла, которое увидит пользователь
    ИмяФайлаДляСохранения = "Отчет_Продажи.txt";
    
    // Используем метод платформы для получения файла
    // Этот метод инициирует стандартный диалог сохранения или скачивание в папку "Загрузки"
    НачатьПолучениеФайлаССервера(АдресХранилища, ИмяФайлаДляСохранения);
КонецПроцедуры

Важные нюансы работы в веб-клиенте

Проанализируем несколько критических моментов, которые отличают работу в браузере от работы в обычном приложении:

  1. Выбор конкретного каталога: В веб-клиенте вы не можете программно заставить браузер сохранить файл по строго заданному пути (например, D:\Work\Files\). Это ограничение безопасности HTML5 API. Поведение системы зависит от настроек браузера пользователя: если включена опция «Всегда спрашивать, куда сохранять», появится диалог выбора папки. В противном случае файл упадет в папку «Загрузки».
  2. Асинхронность: Если после выгрузки файла вам нужно выполнить какие-то действия (например, вывести сообщение «Готово»), необходимо использовать ОписаниеОповещения и передавать его в параметры метода получения файла.
  3. Кодировка: При работе с кириллицей всегда явно указывайте КодировкаТекста.UTF8 в объекте ЗаписьТекста. Это обеспечит корректное открытие файла в Notepad++, Excel и других приложениях.

Использование Диалога Выбора Файла (асинхронный вариант)

Если вам все же принципиально использовать именно ДиалогВыбораФайла для того, чтобы пользователь заранее выбрал путь, в веб-клиенте это нужно делать через Показать() вместо Выбрать(). Посмотрим на пример:


&НаКлиенте
Процедура СохранитьЧерезДиалог(Команда)
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
    Диалог.Заголовок = "Выберите путь для сохранения выгрузки";
    Диалог.ПолноеИмяФайла = "Выгрузка_Данных.txt";
    
    Оповещение = Новый ОписаниеОповещения("ПослеВыбораФайла", ЭтотОбъект);
    Диалог.Показать(Оповещение);
КонецПроцедуры

&НаКлиенте
Процедура ПослеВыбораФайла(ВыбранныеФайлы, ДополнительныеПараметры) Экспорт
    Если ВыбранныеФайлы <> Неопределено Тогда
        ПолныйПуть = ВыбранныеФайлы[0];
        // Теперь мы знаем, куда пользователь хочет сохранить файл
        // Но помните, что в веб-клиенте прямая запись по пути через "ЗаписьТекста.Записать()" 
        // может потребовать установленного расширения работы с файлами!
    КонецЕсли;
КонецПроцедуры

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

← На главную