Форум 1С
Программистам, бухгалтерам, администраторам, пользователям
Задай вопрос - получи решение проблемы
31 мар 2025, 12:14

Файлы, формулы, веб-клиент

Автор posvad, 24 мар 2025, 14:43

0 Пользователей и 1 гость просматривают эту тему.

posvad

Уважаемые господа, Помогите. Всю голову сломал!

Задача: клиент заходит веб-клиентом. Загружает экселевский файл. Нужно проверить неизменность формул на листах, в том числе и скрытых.

Иного инструмента, кроме COMОбъекта, который может видеть формулы ячеек, да еще в скрытых листах я не нашел.

Веб-клиент COMОбъекты не умеет (он вообще может работать не из-под винды, тогда какие еще COMОбъекты).

Значит передаю файл на сервер и там обрабатываю.

Вот код:


&НаКлиенте
Процедура ПрогрузитьФайл(Команда) //Забираем бинарные данные у клиента и пихаем их во временное хранилище
   
    ПолноеИмяФайла = "";
    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
    Диалог.Заголовок = "Выбирайте файл";
    ОбработкаОкончанияЗагрузки =Новый ОписаниеОповещения("СообщениеОбУдаче", ЭтаФорма,  ПолноеИмяФайла);
    ОбработкаНачалаЗагрузки = Новый ОписаниеОповещения("СообщениеОбУдаче", ЭтаФорма);
    //НачатьПомещениеФайлов(ОбработкаОкончанияЗагрузки, Диалог, Истина,,ОбработкаНачалаЗагрузки);
    НачатьПомещениеФайла(Новый ОписаниеОповещения("СообщениеОбУдаче", ЭтаФорма),,,Истина,УникальныйИдентификатор);
   
КонецПроцедуры   

&НаКлиенте
Процедура СообщениеОбУдаче(ФайлПередан, Адрес, Парам3, Парам4) Экспорт //Обработка оповещения, которая собственно и иннициирует обработку файла на сервере и вывод результатов на клиенте
    Если ФайлПередан Тогда
        Сообщения = ОбработкаФайла(Адрес, Парам3);
        Для Каждого Сообщ из Сообщения Цикл
            Очередная = РезультатыПроверки.Добавить();
            Очередная.Запись = Сообщ;
        КонецЦикла;
    КонецЕсли;
КонецПроцедуры


&НаСервере
Функция ОбработкаФайла(Адрес, НазваниеФайлаУКлиента)
   
    ЪТЗ = Новый Массив; //Накопитель для сообщений для клиента
   
    ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(Адрес); //Бинарные данные из временного хранилища
    ИмяФайла = ПолучитьИмяВременногоФайла(".xls");                  //Почти случайное имя в папке Temp
    ФайлВременногоХранилища.Записать(ИмяФайла);                     //Записываем файл с этим именем
   
    ExcelПриложение = Новый COMОбъект("Excel.Application");         //Собственно COMОбъкт
    Книга = ExcelПриложение.WorkBooks.Open(ИмяФайла);               //Выдает ошибку, мол типа толи файла еще нет, толи он занят другой программой
   
    ЪТЗ.Добавить("Прогрузка данных из файла " + НазваниеФайлаУКлиента + " начата. Ожидайте...");
   


{Обработка.ФайлГодовойЗаявки.Форма.Форма1.Форма(84)}: Ошибка при вызове метода контекста (Open)
   Книга = ExcelПриложение.WorkBooks.Open(ИмяФайла);   
по причине:
Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу "C:\Users\USR1CV8\AppData\Local\Temp\v8_E5AB_7.xls". Это может быть вызвано одной из следующих причин.

• Указан несуществующий файл или путь.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.


Когда смотрю глазами - файл в папке Temp на месте и свободен.
Толи он запаздывает на долю секунды и сервер обращается к нему раньше, чем он записался, толи его надо как-то закрыть перед открытием...

Ситуация осложняется тем, что точки останова в серверных процедурах на отрабатывают.


Подскажите, пожалуйста, чего не хватает для открытия файла.

fruitella

Не видно как ты помещаешь во временное хранилище, чтобы потом его обрататывать на сервере. Ты пытаешься получить информацию о файле из пустого адреса. 

posvad

fruitella,
ФайлВременногоХранилища.Записать(ИмяФайла);                     //Записываем файл с этим именем

После этой строчки файл появляется на диске с указанным именем. Экселем открывается. Содержимое соответствует переданному.



Во временное хранилище помещается

 НачатьПомещениеФайла(Новый ОписаниеОповещения("СообщениеОбУдаче", ЭтаФорма),,,Истина,УникальныйИдентификатор);

fruitella

posvad, ты не понял. У тебя строка

ФайлВременногоХранилища = ПолучитьИзВременногоХранилища(Адрес);

Ты пыаешься получить некие данные из временного хранилища по определенному адресу. Но чтобы это получить, сперва это нужно туда поместить.
Для этого используется специальный метод
ПоместитьВоВременноеХранилище(ТвойОбъектДляПомещения);

posvad

fruitella, Я бы охотно с Вами согласился, если бы не одно "Но".

Если закомментировать всё, что после строки

ФайлВременногоХранилища.Записать(ИмяФайла);

дать отработать функциям и поискать файл, то файл оказывается в указанном месте, с нужным содержимым порядка нескольких десятков мегабайт и никакой программой не открытый.

Это значит, что команда ФайлВременногоХранилища.Записать(ИмяФайла) отработала корректно.

Если же раскомментировать следующую строку

Книга = ExcelПриложение.WorkBooks.Open(ИмяФайла);

то получаю ошибку: Приложению Microsoft Excel не удается получить доступ к файлу...
1• Указан несуществующий файл или путь.
2• Файл используется другой программой.
3• Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент.

Напрашивается вывод:
1) путь есть, файл как минимум через пару секунд есть. Может быть эти несколько мегабайт в данный момент еще дописываются? Пайза в 5-10 секунд не помогает. Мало? Или дело не в этом?
2) Файл не может использоваться другой программой, но может быть он остался открытым после записи. Может быть попытаться его Закрыть? Как?
3) Никакие другие книги не открыты. Но возможно это пункт 2.


antoneus

Это пробовали?

ЦитироватьСоздать папку C:\Windows\SysWOW64\config\systemprofile\Desktop или C:\Windows\System32\config\systemprofile\Desktop (в зависимости от разрядности вашей системы)

posvad

antoneus,

да, сделано на этапе обращения к ком-объекту.

posvad

Всё найдено решение!!!!!! :zebzdr:  :zebzdr:  :zebzdr:  :zebzdr:  :zebzdr:

expression.Open(FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad, OpenConflictDocument)


Книга = ExcelПриложение.WorkBooks.Open(ИмяФайла, 0, Истина); Открытие файла в режиме "только для чтения" решило проблему

Похожие темы (5)

Рейтинг@Mail.ru

Поиск