При переходе с тонкого клиента на веб-клиент многие разработчики сталкиваются с тем, что привычные способы работы с файловой системой перестают функционировать. В веб-клиенте 1С код, выполняемый на сервере, не имеет прямого доступа к файлам на компьютере пользователя. Разберем по шагам, как организовать процесс загрузки файла, чтобы его можно было корректно прочитать средствами платформы. Если операцию нужно выполнять регулярно, можно настроить автоматический сбор прайс-листов с почты, FTP, HTTP, их обработку и выгрузку.
Важно осознать фундаментальное различие: работая в браузере, мы сначала передаем данные файла во временное хранилище 1С на сервере. Сама ссылка на временное хранилище — это лишь адрес потока данных, а не путь к файлу на диске. Чтобы открыть такой файл через ТабличныйДокумент.Прочитать() или другие механизмы, нам нужно выполнить промежуточное сохранение данных из хранилища в реальный временный файл на сервере.
Современный стандарт разработки в 1С подразумевает использование асинхронных методов с оператором ЖДАТЬ. Это делает код линейным, избавляет от сложных вложенных обработчиков оповещений и предотвращает блокировку интерфейса браузера.
Рассмотрим пример реализации метода для загрузки файла:
&НаКлиенте
АСИНХ Процедура ПоместитьФайлКоманда(Команда)
ПараметрыДиалога = Новый ПараметрыДиалогаПомещенияФайлов;
ПараметрыДиалога.Заголовок = "Выбор файла Excel";
// Инициализация обратных вызовов
Прогресс = Новый ОписаниеОповещения("ПрогрессОбратныйВызов", ЭтотОбъект);
ПередНачало = Новый ОписаниеОповещения("ПередНачалоОбратныйВызов", ЭтотОбъект);
// Помещение файла на сервер
ОписаниеПомещенногоФайла = ЖДАТЬ ПоместитьФайлНаСерверАсинх(Прогресс, ПередНачало, , ПараметрыДиалога);
Если ОписаниеПомещенногоФайла = Неопределено Тогда
Возврат;
КонецЕсли;
// Передаем адрес во временном хранилище на сервер для обработки
ОбработатьЗагруженныйФайл(ОписаниеПомещенногоФайла.Адрес);
КонецПроцедуры
После того как файл успешно помещен во временное хранилище, мы должны получить его на сервере, сохранить во временный файл и считать содержимое. Приведем пример серверной процедуры:
&НаСервереБезКонтекста
Процедура ОбработатьЗагруженныйФайл(Адрес)
// Генерируем временный путь для файла на сервере
ФайлНаДиске = ПолучитьИмяВременногоФайла("xlsx");
// Получаем двоичные данные из хранилища
ДанныеФайла = ПолучитьИзВременногоХранилища(Адрес);
ДанныеФайла.Записать(ФайлНаДиске);
// Читаем файл в табличный документ
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(ФайлНаДиске, СпособЧтенияЗначенийТабличногоДокумента.Значение);
// Дальнейшая логика обработки данных...
// Не забываем, что после работы желательно удалить временный файл
УдалитьФайлы(ФайлНаДиске);
КонецПроцедуры
Excel.Application не будет работать в веб-клиенте, если сервер 1С запущен под управлением Linux, а также требует установленного MS Excel на сервере Windows. Метод ТабличныйДокумент.Прочитать() является универсальным и кроссплатформенным.УдалитьФайлы() в блоке Попытка...Исключение, чтобы избежать переполнения временной папки сервера.ТабличныйДокумент важно правильно настроить типы ячеек. Если в Excel дата записана как текст, 1С не сможет автоматически преобразовать её в тип Дата, поэтому предусмотрите валидацию данных на этапе разбора таблицы значений.Следуя этим рекомендациям, вы сможете организовать надежный и быстрый механизм импорта данных из Excel, который будет стабильно работать как в обычном, так и в веб-клиенте. В частности, по этой схеме можно реализовать загрузку отчётов о продажах маркетплейсов в БП 3 из Excel для автоматического переноса сведений из файлов площадок в учёт.