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

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

При переходе с файловой базы на клиент-серверный вариант работы разработчики часто сталкиваются с ситуацией, когда внешняя обработка или модуль загрузки данных перестают работать. Пользователь интерактивно выбирает файл на своем рабочем столе (например, C:\Users\User\Desktop\upload.xlsx), нажимает кнопку выполнения, после чего система выдает ошибку: «Ошибка доступа к файлу». При этом в файловой информационной базе эта же обработка работает без сбоев.

Проанализируем природу этой ошибки и разберем корректные способы взаимодействия с файлами в клиент-серверной архитектуре платформы 1С:Предприятие.

Выясним причину возникновения ошибки

В файловой базе данных весь программный код (клиентский и серверный) выполняется локально на одном компьютере пользователя в рамках одного процесса. В этом случае путь C:\Users\User\Desktop\upload.xlsx всегда доступен для любых процедур.

В клиент-серверном режиме архитектура разделена:

  1. Клиентское приложение (тонкий или веб-клиент): запущено на рабочей станции пользователя и видит локальные диски этой машины.
  2. Сервер 1С:Предприятия (служба rphost): выполняется на физическом сервере в серверной комнате или в облаке. Сервер не имеет прямого доступа к диску C: клиентского компьютера.

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

Способ 1. Использование временного хранилища (рекомендуемый подход)

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

В современных конфигурациях 1С (при отключенном режиме модальности) рекомендуется использовать асинхронные методы. Разберем по шагам типовой алгоритм загрузки:


&НаКлиенте
Асинх Процедура ЗагрузитьФайл(Команда)
    
    // 1. Настраиваем диалог выбора файлов
    ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
    ПараметрыДиалога.Заголовок = "Выберите файл для загрузки";
    ПараметрыДиалога.Фильтр = "Файлы Excel (*.xlsx)|*.xlsx|Все файлы (*.*)|*.*";
    ПараметрыДиалога.МножественныйВыбор = Ложь;
    
    // 2. Интерактивно выбираем файл и помещаем его на сервер
    Результат = Ждать ПоместитьФайлНаСерверAsync(,,, ПараметрыДиалога, УникальныйИдентификатор);
    
    Если Результат <> Неопределено И Результат.ПомещениеФайлаОтменено = Ложь Тогда
        // 3. Вызываем серверную обработку, передавая адрес во временном хранилище
        ОбработатьФайлНаСервере(Результат.Адрес, Результат.Ссылка);
        Сообщить("Файл успешно обработан!");
    КонецЕсли;

КонецПроцедуры

&НаСервереБезКонтекста
Процедура ОбработатьФайлНаСервере(АдресХранилища, ИмяЛокальногоФайла)
    
    // Извлекаем двоичные данные из временного хранилища
    ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресХранилища);
    
    // Создаем временный файл на диске сервера
    Расширение = "tmp";
    ПозицияТочки = СтрНайти(ИмяЛокальногоФайла, ".", НаправлениеПоиска.СКонца);
    Если ПозицияТочки > 0 Тогда
        Расширение = Сред(ИмяЛокальногоФайла, ПозицияТочки + 1);
    КонецЕсли;
    
    ИмяСерверногоФайла = ПолучитьИмяВременногоФайла(Расширение);
    ДвоичныеДанные.Записать(ИмяСерверногоФайла);
    
    Попытка
        // Выполняем чтение (например, через ТабличныйДокумент)
        ТабДок = Новый ТабличныйДокумент;
        ТабДок.Прочитать(ИмяСерверногоФайла);
        
        // Алгоритм разбора данных таблицы...
        
    Исключение
        // Обязательно удаляем временный файл в случае ошибки
        УдалитьФайлы(ИмяСерверногоФайла);
        УдалитьИзВременногоХранилища(АдресХранилища);
        ВызватьИсключение;
    КонецПопытки;
    
    // Очищаем дисковое пространство сервера и оперативную память
    УдалитьФайлы(ИмяСерверногоФайла);
    УдалитьИзВременногоХранилища(АдресХранилища);

КонецПроцедуры

При таком подходе файл физически копируется на сервер через встроенный протокол платформы 1С, что гарантирует работу как в локальной сети, так и через тонкий клиент по HTTP/HTTPS или в веб-браузере.

Способ 2. Передача небольших файлов через объект ДвоичныеДанные

Если размер файла заведомо невелик (до 2–5 Мб) и путь к файлу уже известен, можно обойтись без временного хранилища, прочитав двоичные данные на клиенте и передав их параметром в серверную процедуру.

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


&НаКлиенте
Асинх Процедура ЗагрузитьПоПути(ПутьКФайлу)
    
    // Читаем файл на клиенте
    ДвоичныеДанные = Ждать Новый ДвоичныеДанныеAsync(ПутьКФайлу);
    
    // Передаем данные напрямую на сервер
    ОбработатьДанныеНаСервере(ДвоичныеДанные);

КонецПроцедуры

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

КонецПроцедуры

Важное ограничение: Не используйте прямую передачу ДвоичныеДанные для больших файлов. В момент серверного вызова объект полностью сериализуется в пакет запроса, что приводит к резкому росту потребления оперативной памяти процессом rphost. Для больших объемов используйте только временное хранилище.

Способ 3. Использование общего сетевого ресурса (UNC-пути)

Разберем вариант, когда файл помещается в сетевую папку общего доступа (например, \\FileServer\Exchange\upload.xlsx). Этот способ часто применяется при автоматическом обмене по расписанию через регламентные задания.

Чтобы сервер 1С мог прочитать файл по сетевому пути, необходимо учесть следующие системные требования:

  1. Учетная запись службы сервера 1С: По умолчанию служба 1C:Enterprise 8.3 Server Agent работает под локальным пользователем USR1CV8. Этот пользователь не имеет прав доступа к ресурсам других компьютеров в локальной сети. Службу необходимо запустить от имени доменной учетной записи, у которой есть права на чтение и запись в сетевую папку.
  2. Путь к файлу: Путь должен передаваться исключительно в формате UNC (\\ServerName\ShareName\file.ext). Подключенные сетевые диски (например, Z:\file.ext) на сервере будут недоступны, так как они монтируются в сеансе конкретного интерактивного пользователя Windows.

Способ 4. Использование Библиотеки Стандартных Подсистем (БСП)

Если конфигурация разработана на основе БСП, в ней уже реализованы готовые служебные процедуры, абстрагирующие работу с платформенными версиями методов:


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

КонецПроцедуры

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

КонецПроцедуры

Рекомендации по выбору решения

  1. Для пользовательских интерактивных обработок (импорт прайс-листов, банковских выписок, накладных) всегда используйте временное хранилище (ПоместитьФайлНаСерверAsync или БСП). Это делает обработку универсальной для любых рабочих мест и браузеров.
  2. Для фоновых и регламентных заданий без участия человека используйте сетевые папки (UNC) с корректно настроенными доменными правами службы 1С.
  3. Для чтения файлов таблиц (XLSX, CSV) на стороне сервера используйте встроенный объект ТабличныйДокумент, избегая COM-объектов (Excel.Application), которые требуют установки офисного пакета на сервер и тонкой настройки DCOM.
← На главную