В современной разработке на платформе 1С:Предприятие 8.3 задача передачи файла с локального компьютера пользователя на серверную сторону является одной из самых частых. Это может быть загрузка прайс-листов, сканов документов или обмен данными. Однако работа в тонком клиенте или веб-клиенте накладывает определенные ограничения: мы не можем просто обратиться к файловой системе сервера напрямую с клиента. Нам необходимо сначала «поднять» файл во временное хранилище 1С, а затем программно извлечь его на стороне сервера и записать на физический диск.
В этой статье мы подробно разберем, как реализовать этот процесс, используя современные асинхронные методы платформы, и обсудим важные нюансы безопасности и прав доступа.
Процесс сохранения файла можно разделить на три этапа, которые мы проанализируем пошагово:
ДвоичныеДанные.Начиная с версии 8.3.15, платформа 1С требует использования асинхронных методов для работы с файлами. Метод НачатьПомещениеФайлаНаСервер является основным инструментом. Рассмотрим пример процедуры, которая инициирует этот процесс:
&НаКлиенте
Процедура ВыбратьИЗагрузитьФайл(Команда)
// Создаем описание оповещения о завершении процесса
ОписаниеЗавершения = Новый ОписаниеОповещения("ЗагрузитьФайлЗавершение", ЭтотОбъект);
// Настраиваем параметры диалога выбора файла
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выберите файл для загрузки на сервер";
ПараметрыДиалога.МножественныйВыбор = Ложь;
// Запускаем асинхронный процесс помещения файла во временное хранилище
НачатьПомещениеФайлаНаСервер(ОписаниеЗавершения, , , , ПараметрыДиалога, УникальныйИдентификатор);
КонецПроцедуры
Здесь важно обратить внимание на параметр УникальныйИдентификатор формы. Передавая его, мы гарантируем, что временный файл будет автоматически удален из хранилища после закрытия формы, что помогает поддерживать чистоту серверных ресурсов.
После того как пользователь выбрал файл и платформа загрузила его в «облако» временного хранилища, срабатывает процедура обратного вызова (callback). Разберем, как она должна выглядеть:
&НаКлиенте
Процедура ЗагрузитьФайлЗавершение(ОписаниеПомещенногоФайла, ДополнительныеПараметры) Экспорт
// Проверяем, не отказался ли пользователь от выбора
Если ОписаниеПомещенногоФайла = Неопределено Тогда
Возврат;
КонецЕсли;
// Получаем адрес во временном хранилище и имя оригинального файла
АдресХранилища = ОписаниеПомещенногоФайла.Адрес;
ИмяФайла = ОписаниеПомещенногоФайла.СсылкаНаФайл.Имя;
// Вызываем серверный метод для физического сохранения
СохранитьФайлНаДискеСервера(АдресХранилища, ИмяФайла);
ПоказатьОповещениеПользователя("Успех", , "Файл успешно сохранен на сервере!");
КонецПроцедуры
Теперь рассмотрим самое главное — серверную часть. Проанализируем ситуацию: сервер 1С работает под определенной учетной записью операционной системы. Именно эта учетная запись должна иметь права на запись в целевой каталог.
&НаСервере
Процедура СохранитьФайлНаДискеСервера(АдресХранилища, ИмяФайла)
// Извлекаем данные из временного хранилища в объект ДвоичныеДанные
ДанныеФайла = ПолучитьИзВременногоХранилища(АдресХранилища);
// Определяем путь на сервере.
// ВАЖНО: Путь должен быть доступен пользователю, под которым запущен сервер 1С (USR1CV8).
КаталогНаСервере = "C:\Storage\IncomingFiles\";
ПолныйПуть = КаталогНаСервере + ИмяФайла;
Попытка
// Записываем данные на физический диск
ДанныеФайла.Записать(ПолныйПуть);
Исключение
// В случае ошибки (например, нет прав) генерируем понятное сообщение
ВызватьИсключение "Ошибка при записи файла на сервер: " + КраткоеПредставлениеОшибки(ИнформацияОбОшибке());
КонецПопытки;
КонецПроцедуры
Рассмотрим подробнее критические моменты, которые часто упускают начинающие разработчики:
C:\MyFolder\, убедитесь, что системный пользователь USR1CV8 (или тот, под которым работает служба «Агент сервера 1С») имеет права «Изменение» и «Запись» на эту папку. Если папка находится на сетевом ресурсе, путь должен быть в формате UNC (например, \\ServerName\Share\), а служба 1С должна быть запущена от имени доменного пользователя с соответствующими правами.ПолучитьРазделительПути() для формирования корректных путей или проверяйте тип платформы через ТипПлатформы().* ? / \ | из переменной ИмяФайла перед сохранением.Если ваши пользователи работают через браузер (веб-клиент), им может потребоваться установка расширения работы с файлами. Выясним, как проверить его наличие и предложить установку:
&НаКлиенте
Процедура ПриОткрытии(Отказ)
#Если ВебКлиент Тогда
ОписаниеОповещения = Новый ОписаниеОповещения("ПослеПроверкиРасширения", ЭтотОбъект);
НачатьПодключениеРасширенияРаботыСФайлами(ОписаниеОповещения);
#КонецЕсли
КонецПроцедуры
&НаКлиенте
Процедура ПослеПроверкиРасширения(Подключено, ДополнительныеПараметры) Экспорт
Если Не Подключено Тогда
НачатьУстановкуРасширенияРаботыСФайлами();
КонецЕсли;
КонецПроцедуры
Без этого расширения в некоторых браузерах методы работы с файлами могут работать с ограничениями или требовать дополнительных подтверждений безопасности от пользователя.
Мы разобрали полный цикл передачи файла: от выбора пользователем на клиенте до физического сохранения на диск сервера. Помните, что использование метода НачатьПомещениеФайлаНаСервер — это залог стабильной работы вашего приложения в любых условиях (тонкий клиент, веб-клиент, мобильное приложение). Всегда уделяйте внимание правам доступа серверной учетной записи и проверяйте входные данные на наличие опасных символов в путях.