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

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

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

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

Общая схема решения задачи

Процесс сохранения файла можно разделить на три этапа, которые мы проанализируем пошагово:

  1. Интерактивный выбор файла пользователем на стороне клиента и его загрузка во временное хранилище.
  2. Передача управления на сервер, где файл извлекается из временного хранилища.
  3. Физическая запись файла на диск сервера с использованием объекта ДвоичныеДанные.

Шаг 1. Выбор файла на клиенте и загрузка на сервер

Начиная с версии 8.3.15, платформа 1С требует использования асинхронных методов для работы с файлами. Метод НачатьПомещениеФайлаНаСервер является основным инструментом. Рассмотрим пример процедуры, которая инициирует этот процесс:


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

Здесь важно обратить внимание на параметр УникальныйИдентификатор формы. Передавая его, мы гарантируем, что временный файл будет автоматически удален из хранилища после закрытия формы, что помогает поддерживать чистоту серверных ресурсов.

Шаг 2. Обработка результата и вызов серверной процедуры

После того как пользователь выбрал файл и платформа загрузила его в «облако» временного хранилища, срабатывает процедура обратного вызова (callback). Разберем, как она должна выглядеть:


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

Шаг 3. Сохранение данных на физический диск сервера

Теперь рассмотрим самое главное — серверную часть. Проанализируем ситуацию: сервер 1С работает под определенной учетной записью операционной системы. Именно эта учетная запись должна иметь права на запись в целевой каталог.


&НаСервере
Процедура СохранитьФайлНаДискеСервера(АдресХранилища, ИмяФайла)
    
    // Извлекаем данные из временного хранилища в объект ДвоичныеДанные
    ДанныеФайла = ПолучитьИзВременногоХранилища(АдресХранилища);
    
    // Определяем путь на сервере. 
    // ВАЖНО: Путь должен быть доступен пользователю, под которым запущен сервер 1С (USR1CV8).
    КаталогНаСервере = "C:\Storage\IncomingFiles\";
    ПолныйПуть = КаталогНаСервере + ИмяФайла;
    
    Попытка
        // Записываем данные на физический диск
        ДанныеФайла.Записать(ПолныйПуть);
    Исключение
        // В случае ошибки (например, нет прав) генерируем понятное сообщение
        ВызватьИсключение "Ошибка при записи файла на сервер: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
    КонецПопытки;
    
КонецПроцедуры

Важные технические нюансы и безопасность

Рассмотрим подробнее критические моменты, которые часто упускают начинающие разработчики:

  1. Права доступа ОС. Если вы указываете путь типа C:\MyFolder\, убедитесь, что системный пользователь USR1CV8 (или тот, под которым работает служба «Агент сервера 1С») имеет права «Изменение» и «Запись» на эту папку. Если папка находится на сетевом ресурсе, путь должен быть в формате UNC (например, \\ServerName\Share\), а служба 1С должна быть запущена от имени доменного пользователя с соответствующими правами.
  2. Кроссплатформенность. Если ваш сервер 1С работает на Linux, пути Windows (начинающиеся с буквы диска) не сработают. Проанализируем решение: используйте функцию ПолучитьРазделительПути() для формирования корректных путей или проверяйте тип платформы через ТипПлатформы().
  3. Очистка имен файлов. Имя файла, полученное с клиента, может содержать спецсимволы, недопустимые в файловой системе сервера. Рекомендуется использовать регулярные выражения или простые функции замены для удаления символов типа * ? / \ | из переменной ИмяФайла перед сохранением.
  4. Профили безопасности. Если в вашей информационной базе включены профили безопасности, попытка записи файла по произвольному пути приведет к ошибке. Выясним причину: 1С блокирует прямой доступ к файловой системе в целях безопасности. В этом случае путь записи необходимо добавить в список разрешенных каталогов в консоли администрирования кластера 1С.

Особенности работы в веб-клиенте

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


&НаКлиенте
Процедура ПриОткрытии(Отказ)
    #Если ВебКлиент Тогда
        ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПроверкиРасширения", ЭтотОбъект);
        НачатьПодключениеРасширенияРаботыСФайлами(ОписаниеОповещения);
    #КонецЕсли
КонецПроцедуры

&НаКлиенте
Процедура ПослеПроверкиРасширения(Подключено, ДополнительныеПараметры) Экспорт
    Если Не Подключено Тогда
        НачатьУстановкуРасширенияРаботыСФайлами();
    КонецЕсли;
КонецПроцедуры

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

Заключение

Мы разобрали полный цикл передачи файла: от выбора пользователем на клиенте до физического сохранения на диск сервера. Помните, что использование метода НачатьПомещениеФайлаНаСервер — это залог стабильной работы вашего приложения в любых условиях (тонкий клиент, веб-клиент, мобильное приложение). Всегда уделяйте внимание правам доступа серверной учетной записи и проверяйте входные данные на наличие опасных символов в путях.

← На главную