Как правильно организовать загрузку файлов Excel в клиент-серверном режиме 1С?

Программист 1С v8.3 (Управляемые формы) 1С:Управление нашей фирмой Управленческий учет Торговля и дистрибуция
← На главную

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

Отказ от COM-объектов в пользу нативных средств

Основная проблема заключается в том, что сервер 1С не должен зависеть от установленного на нем офисного пакета Microsoft. Использование Excel.Application в серверной среде — это «антипаттерн», который приводит к утечкам памяти и зависанию процессов. Вместо этого мы будем использовать объект ТабличныйДокумент, который умеет работать с табличными данными нативно.

Решение 1: Чтение файла на стороне клиента

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

Разберем алгоритм по шагам:

  1. Пользователь выбирает файл через диалог открытия файла на клиенте.
  2. Клиентская процедура считывает данные из файла в ТабличныйДокумент.
  3. Полученные данные (например, массив структур или таблица значений) передаются в серверную процедуру для записи в базу данных.

Решение 2: Передача данных через двоичные данные и временное хранилище

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

Посмотрим на пример реализации такого кода:


&НаКлиенте
Процедура ЗагрузитьФайл(Команда)
    Режим = РежимДиалогаВыбораФайла.Открытие;
    Диалог = Новый ДиалогВыбораФайла(Режим);
    Если Диалог.Выбрать() Тогда
        ПутьКФайлу = Диалог.ВыбранныеФайлы[0];
        ДвоичныеДанные = Новый ДвоичныеДанные(ПутьКФайлу);
        АдресВоВременномХранилище = ПоместитьВоВременноеХранилище(ДвоичныеДанные, УникальныйИдентификатор);
        ПрочитатьДанныеНаСервере(АдресВоВременномХранилище);
    КонецЕсли;
КонецПроцедуры

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

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

При реализации данного подхода обратите внимание на следующие моменты:

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

← На главную