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