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

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

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

Постановка задачи и анализ ограничений

Рассмотрим стандартную ситуацию: нам необходимо создать внешнюю обработку, которая будет запускаться в браузере. Пользователь должен нажать на кнопку, выбрать текстовый файл на своем компьютере, а программа должна прочитать его содержимое для дальнейшего анализа. Главное условие — мы не можем добавлять новые реквизиты в справочники или регистры конфигурации, то есть должны использовать только возможности самой обработки и временного хранилища — для этого подойдёт загрузка данных из Excel в документы и справочники 1С.

Для решения этой задачи проанализируем механизм передачи данных между клиентом и сервером. В веб-клиенте мы не можем просто использовать объект ЧтениеТекста и указать путь вроде C:\MyFiles\data.txt. Вместо этого нам нужно «пробросить» содержимое файла на сторону сервера 1С, где платформа сможет работать с ним как с объектом типа ДвоичныеДанные.

Шаг 1: Интерактивный выбор файла на клиенте

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

Разберем пример кода для команды на форме обработки. Сначала мы создаем описание оповещения — это указание платформе, какую процедуру нужно выполнить, когда пользователь завершит выбор файла в диалоговом окне.


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

Обратите внимание на использование параметра УникальныйИдентификатор. Мы передаем идентификатор формы, чтобы временное хранилище «знало», как долго нужно хранить этот файл. Файл будет доступен до тех пор, пока открыта форма обработки.

Шаг 2: Обработка результата выбора

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


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

Шаг 3: Чтение текстовых данных на сервере

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

Способ А: Использование временного файла на диске сервера. Этот метод более нагляден и проще в отладке. Мы извлекаем данные из хранилища, записываем их в файл в специальную временную папку сервера (например, если требуется конвертация файлов из CSV в XLS), а затем читаем его стандартным объектом ЧтениеТекста.


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

Способ Б: Чтение через поток (без записи на диск). Этот вариант более производителен, так как исключает лишние операции ввода-вывода с диском сервера, используя встроенные инструменты работы с потоками. Мы открываем поток для чтения прямо из объекта ДвоичныеДанные.


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

Важные нюансы и рекомендации

Проанализируем ключевые моменты, которые могут повлиять на стабильность работы вашей обработки в веб-клиенте:

  1. Кодировка текста: Веб-клиент часто сталкивается с файлами в разных кодировках. Если вы заранее знаете, что файлы приходят в кодировке Windows-1251, обязательно указывайте это в параметрах ЧтениеТекста. Если кодировка неизвестна, 1С попытается определить её автоматически, но для UTF-8 лучше использовать файлы с меткой BOM.
  2. Размер файла: Помните, что метод ПолучитьИзВременногоХранилища загружает все содержимое файла в оперативную память сервера. При работе с очень большими файлами (сотни мегабайт) в веб-клиенте лучше использовать потоковую обработку, чтобы не вызвать перегрузку памяти.
  3. Безопасность: Поскольку мы используем УникальныйИдентификатор формы при помещении файла, данные будут автоматически удалены из временного хранилища сервером 1С после закрытия формы или истечения времени жизни сеанса. Это избавляет нас от необходимости вручную очищать хранилище.
  4. Отказ от расширений: Использование НачатьПомещениеФайлаНаСервер — это залог того, что ваша обработка заработает у любого пользователя в любом современном браузере (Chrome, Firefox, Safari, Edge) без предварительной настройки рабочего места.

Таким образом, мы выяснили, что для работы с текстовыми файлами в веб-клиенте вовсе не обязательно лезть в конфигурацию или использовать устаревшие методы. Комбинация асинхронного метода помещения файла и серверной обработки двоичных данных позволяет реализовать гибкий и надежный механизм загрузки данных в любую внешнюю обработку.

← На главную