Разберем ситуацию, с которой часто сталкиваются разработчики при переносе баз из файлового режима в клиент-серверный на ОС Linux. Суть проблемы проста: когда база работает на Windows, путь к файлу вроде C:\Docs\import.xlsx понятен операционной системе сервера. Однако при работе в модели «клиент-сервер» сервер 1С, работающий под Linux, физически не имеет доступа к локальным дискам вашего компьютера. Попытка обратиться к пути C:\... на стороне сервера неминуемо приведет к ошибке доступа.
В архитектуре 1С:Предприятие клиентское приложение и сервер 1С — это разные сущности. Сервер 1С исполняет код в своей изолированной среде и не «видит» файловую систему вашего персонального компьютера. Когда вы пытаетесь передать серверу путь к файлу, сервер пытается найти этот путь в своей директории, где его, разумеется, нет. Для решения этой задачи необходимо изменить подход к передаче данных: вместо передачи пути к файлу, мы должны передать сами данные файла.
Самым надежным и стандартизированным методом в современной платформе 1С является использование механизма временного хранилища. Мы помещаем файл с клиента во временное хранилище, передаем серверу адрес этого хранилища, а затем сервер самостоятельно получает данные и записывает их во временный файл в своей среде.
Рассмотрим процесс реализации на конкретном примере. Весь процесс делится на две основные части: клиентскую и серверную.
Для начала работы на стороне клиента используем метод НачатьПомещениеФайла. Этот метод откроет диалог выбора файла, а после выбора отправит файл во временное хранилище 1С.
&НаКлиенте
Процедура ЗагрузитьДанные(Команда)
АдресФайлаВоВременномХранилище = "";
ОписаниеОповещения = Новый ОписаниеОповещения("ЗагрузитьДанныеЗавершение", ЭтотОбъект);
НачатьПомещениеФайла(ОписаниеОповещения, АдресФайлаВоВременномХранилище, Объект.ВыбранноеИмяФайла,, УникальныйИдентификатор);
КонецПроцедуры
После того как файл успешно помещен во временное хранилище, вызывается процедура завершения. В ней мы передаем полученный Адрес на сервер.
&НаКлиенте
Процедура ЗагрузитьДанныеЗавершение(Результат, Адрес, ВыбранноеИмяФайла, ДополнительныеПараметры) Экспорт
Если Результат Тогда
ЗагрузитьДанныеНаСервере(Адрес, Файл.Расширение);
КонецЕсли;
КонецПроцедуры
Теперь самое важное — серверная часть. Здесь мы используем ПолучитьИзВременногоХранилища, чтобы превратить адрес в ДвоичныеДанные, и создаем временный файл средствами 1С.
&НаСервере
Процедура ЗагрузитьДанныеНаСервере(АдресФайлаВоВременномХранилище, Расширение)
ДвоичныеДанные = ПолучитьИзВременногоХранилища(АдресФайлаВоВременномХранилище);
ИмяВременногоФайла = ПолучитьИмяВременногоФайла(Расширение);
ДвоичныеДанные.Записать(ИмяВременногоФайла);
// Выполняем действия с файлом, например, чтение
Объект.табДокумент.Прочитать(ИмяВременногоФайла, СпособЧтенияЗначенийТабличногоДокумента.Текст);
// Обязательно удаляем временный файл, чтобы не занимать место
УдалитьФайлы(ИмяВременногоФайла);
КонецПроцедуры
При использовании данной схемы следует учитывать несколько критических аспектов, чтобы ваша обработка работала стабильно и не вызывала проблем с производительностью:
УдалитьФайлы() после завершения обработки. Серверная ОС может быстро заполниться временными файлами, если забывать их удалять.Попытка...Исключение при записи и чтении файлов. Это позволит программе корректно обработать ситуацию, если серверу не хватило прав на запись в системную папку временных файлов..xlsx или .csv. Они лучше обрабатываются библиотеками 1С на платформе Linux, чем устаревший .xls (который требует наличия специфических COM-объектов Windows).Прочитать(): Помните, что метод Объект.табДокумент.Прочитать() на стороне сервера требует корректной настройки окружения платформы 1С для работы с табличными документами. В некоторых случаях, если возникают проблемы с распознаванием форматов, целесообразно использовать сторонние библиотеки для разбора данных или перенести парсинг файла на клиентскую сторону, если объем данных позволяет это сделать.Применяя этот подход, вы навсегда решите проблему «отсутствия доступа» к файлам, так как сервер больше не будет пытаться обращаться к файловой системе клиента, а будет работать с потоком данных, который вы ему предоставили через безопасный механизм временного хранилища.