Как программно обработать файл Excel из справочника «Файлы» в веб-клиенте 1С

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

Разберем распространенную задачу: пользователь загружает файл Excel в справочник «Файлы» (или «Версии файлов») через веб-клиент, а бухгалтер должен с помощью обработки выгрузить эти данные в табличную часть на форме, отредактировать их и сформировать итоговые документы.

При работе в веб-клиенте (особенно в браузерах Chrome, Firefox или Safari) стандартные механизмы работы с MS Excel через COM-объекты (COMОбъект("Excel.Application")) не работают. Кроме того, при публикации базы на веб-сервере у процесса 1С могут быть ограничены права на запись в произвольные каталоги диска. Рассмотрим подробнее, как обойти эти ограничения и корректно организовать работу с файлами.

Почему возникают сложности при работе в веб-клиенте

Выясним главные причины, по которым классические методы загрузки Excel не подходят для веб-клиента:

  1. Отсутствие COM-технологии в веб-браузерах: вызов объектов MS Office на стороне клиента физически невозможен нигде, кроме Internet Explorer под ОС Windows.
  2. Ограничения прав доступа на веб-сервере: при вызове серверных процедур код выполняется от имени служебной учетной записи (например, IUSR или usr1cv8). У нее может не быть прав на сохранение файлов во временные папки системы.
  3. Хранение файлов в базе: файлы в справочнике хранятся в виде двоичных данных или в томах на сервере. Чтобы обработать их, необходимо выгружать и считывать данные на сервере.

Способ 1. Чтение файла через ТабличныйДокумент на сервере

Начиная с современных версий платформы 1С 8.3, объект ТабличныйДокумент умеет самостоятельно считывать файлы форматов .xlsx, .xls и .ods без установки сторонних программ и MS Office. Это идеальное решение для серверного кода.

Рассмотрим алгоритм действий:

  1. Получаем двоичные данные файла из справочника на сервере.
  2. Записываем их во временный файл во временном каталоге сервера с помощью функции ПолучитьИмяВременногоФайла().
  3. Загружаем файл в ТабличныйДокумент вызовом метода Прочитать().
  4. Удаляем временный файл с диска.
  5. Преобразуем табличный документ в табличную часть формы.

Посмотрим на пример кода, реализующего данный подход:


&НаСервере
Функция ПрочитатьФайлExcelИзСправочника(СсылкаНаФайл)
    
    // Получаем двоичные данные из справочника или хранилища
    ДвоичныеДанныеФайла = РаботаСФайлами.ПолучитьДвоичныеДанныеФайла(СсылкаНаФайл);
    
    // Формируем имя временного файла на сервере
    ИмяВременногоФайла = ПолучитьИмяВременногоФайла("xlsx");
    ДвоичныеДанныеФайла.Записать(ИмяВременногоФайла);
    
    // Читаем файл в ТабличныйДокумент
    ТабДок = Новый ТабличныйДокумент;
    Попытка
        ТабДок.Прочитать(ИмяВременногоФайла);
        УдалитьФайлы(ИмяВременногоФайла);
    Исключение
        УдалитьФайлы(ИмяВременногоФайла);
        ВызватьИсключение "Ошибка при чтении файла Excel: " + ОписаниеОшибки();
    КонецПопытки;
    
    Возвращать ТабДок;
    
КонецФункции

Быстрое конвертирование ТабличногоДокумента в Таблицу Значений

Чтобы не перебирать ячейки табличного документа в медленном цикле по строкам и колонкам, проанализируем использование объекта ПостроительЗапроса. Он позволяет мгновенно превратить область табличного документа в ТаблицуЗначений.

Рассмотрим пример такого преобразования:


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

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

Проанализируем архитектурную альтернативу: если Excel-файл загружается в 1С исключительно для того, чтобы стать основой для документов внутри базы, хранить его в исходном виде .xlsx необязательно.

При загрузке файла первым пользователем целесообразно сразу конвертировать его структуру в формат 1С (например, сериализовать в ХранилищеЗначений в виде таблицы значений или массива структур). В этом случае второй пользователь (бухгалтер) откроет готовые данные мгновенно, без необходимости повторно разбирать файл Excel на сервере.

  1. Первый пользователь загружает файл через веб-клиент.
  2. Сервер сразу разбирает файл и записывает данные в реквизит с типом ХранилищеЗначений (или напрямую в структурированный регистр сведений).
  3. Обработка второго пользователя считывает готовый объект 1С без обращения к файловой системе.

Способ 3. Использование Поля табличного документа на форме

Если структура загружаемых Excel-файлов постоянно меняется, жестко задать колонки для табличной части формы сложно. В такой ситуации удобнее вывести прочитанный ТабличныйДокумент непосредственно на форму обработки.

Схема работы выглядит следующим образом:

  1. Добавляем на форму реквизит с типом ТабличныйДокумент и выводим его как элемент формы Поле табличного документа.
  2. Включаем для элемента свойства Редактирование и Защита = Ложь.
  3. На сервере вычитываем файл через ТабДок.Прочитать() и присваиваем его реквизиту формы.
  4. Пользователь видит привычную сетку с данными прямо на форме в веб-клиенте, может вручную скорректировать ячейки и нажать кнопку для создания документов.

Подводя итог: для успешной обработки файлов Excel в веб-клиенте переносите всю логику чтения на сервер, используйте штатный метод ТабличныйДокумент.Прочитать() и отказывайтесь от вызовов COM-объектов.

← На главную