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