При попытке адаптации обработки по загрузки данных из Excel выходит ошибка:
Произошла исключительная ситуация (Microsoft Office Excel): Нет доступа к файлу ...
• Имени файла или пути не существует.
• Файл используется другой программой.
• Имя книги, которую вы пытаетесь сохранить, совпадает с именем открытой в данный момент книги.
При этом соm отрабатывает, но файл не читается.
Тот же самый модуль в обычном приложении отрабатывает без проблем.
Это из-за серверного варианта работы? Как данный вопрос можно исправить?
Метот добавления папки C:\Windows\System32\config\systemprofile\Desktop не помог(((
Про клиент-сервер, Вам правильно написали выше. От себя замечу, что для вашей задачи эксель собственно и не нужен. Грубый код (что непонятно спрашивайте)
Процедура АнализФайла()
// Читаем файл и преобразуем его в табличный документ
Попытка
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Объект.ПутьКФайлу);
// Отправляем таб. док на разбор
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ТочкаВремени");
ТЗ.Колонки.Добавить("Сотрудник");
ТЗ.Колонки.Добавить("verified");
ТЗ.Колонки.Добавить("ТочкаПрохода");
ТЗ.Колонки.Добавить("Статус");
Сч = 1; // Заголовок в файле есть, пойдем сто второй строки.
Пока НЕ Сч = ТабДок.ВысотаТаблицы цикл
Сч = (Сч+1);
НС = ТЗ.Добавить();
НС.ТочкаВремени = ТабДок.ПолучитьОбласть(Сч,1,Сч,1).ТекущаяОбласть.Текст;
НС.Сотрудник = ТабДок.ПолучитьОбласть(Сч,2,Сч,2).ТекущаяОбласть.Текст;
КонецЦикла;
Исключение
Сообщить("Неудалось прочитать файл: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Объект.ПутьКФайлу);
Поясню, ПутьКФайлу - содержит полный путь к файлу НА СЕРВЕРЕ т.к. процедура с этими методами должна быть серверной. Как работать с клиентом и сервером в двух словах не описать. Суть в том, что надо забрать файл с клиента (с ПК пользователя) и поместить его на сервер (туда где "крутится" 1с). Прилагаю два внешних модуля, которые сам писал и использую во всех своих конфигурациях для работы с файловой системой. Один модуль серверный, второй клиент. Какой-какой из названий понятно. Там все грубо, писалось под себя, но думаю разберетесь.
Тот же самый модуль в обычном приложении отрабатывает без проблем.
тут несколько вариантом, в УФ заполняется эксель на клиенте или на сервер? скорее всего нет доступа к папке, укажите сетевую, должно помочь. опять же если на сервере заполняется файл, стоит ли на самом сервере офис?
(2) Можно более подробно, не совсем поняла, что значит передать файл на сервер?
На текущий момент на процедура на сервере содержит код:
//Пытаемся подключиться к Excel
Попытка
Excel = новый COMОбъект("Excel.Application");
Исключение
Сообщить("Похоже, Excel на компьютере не установлен. Необходимо выполнить установку/переустановку Excel.");
Возврат;
КонецПопытки;
(8) ну значит у вас две проблемы
1. Файл должен быть доступен с кластера 1С, в том числе по правам доступа службы под которой запущен агент сервера
2. На сервере должен быть установлен Word и зарегистрирован COM (обычно автоматом регистрируется при установке), но возможны еще проблемы с разрядностью
а вообще если у вас только чтение файла, без записи, лучший вариант сделать как в (5) будет быстрее читать и не требует офиса
Про клиент-сервер, Вам правильно написали выше. От себя замечу, что для вашей задачи эксель собственно и не нужен. Грубый код (что непонятно спрашивайте)
Процедура АнализФайла()
// Читаем файл и преобразуем его в табличный документ
Попытка
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Объект.ПутьКФайлу);
// Отправляем таб. док на разбор
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("ТочкаВремени");
ТЗ.Колонки.Добавить("Сотрудник");
ТЗ.Колонки.Добавить("verified");
ТЗ.Колонки.Добавить("ТочкаПрохода");
ТЗ.Колонки.Добавить("Статус");
Сч = 1; // Заголовок в файле есть, пойдем сто второй строки.
Пока НЕ Сч = ТабДок.ВысотаТаблицы цикл
Сч = (Сч+1);
НС = ТЗ.Добавить();
НС.ТочкаВремени = ТабДок.ПолучитьОбласть(Сч,1,Сч,1).ТекущаяОбласть.Текст;
НС.Сотрудник = ТабДок.ПолучитьОбласть(Сч,2,Сч,2).ТекущаяОбласть.Текст;
КонецЦикла;
Исключение
Сообщить("Неудалось прочитать файл: " + ОписаниеОшибки());
КонецПопытки;
КонецПроцедуры
(5) пользователю данные приходят в Ex, соответственно прочитать и записать данные мне нужно из него. Как используя табличный документ открыть данный файл и получить из него данные, программно?
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать(Объект.ПутьКФайлу);
Поясню, ПутьКФайлу - содержит полный путь к файлу НА СЕРВЕРЕ т.к. процедура с этими методами должна быть серверной. Как работать с клиентом и сервером в двух словах не описать. Суть в том, что надо забрать файл с клиента (с ПК пользователя) и поместить его на сервер (туда где "крутится" 1с). Прилагаю два внешних модуля, которые сам писал и использую во всех своих конфигурациях для работы с файловой системой. Один модуль серверный, второй клиент. Какой-какой из названий понятно. Там все грубо, писалось под себя, но думаю разберетесь.
(15) Не за что. Но есть нюанс. Если все работает без переноса между клиентом и сервером, это значит, что клиент и сервер на одной машине. Вы уверены, что всегда так будет?
(17) смотрите, чтобы было понятно. Клиент - это тот компьютер, с которого запущен сеанс работы с 1с. Сервер - это тот компьютер где запущена платформа. Если совсем наглядно.
1. Файловая база на ПК. Клиент и сервер в одном месте. Не важно в какую процедур (серверную или клиентскую) путь к файлу передается, он будет одним и тем же.
2. Сервер 1с-предприятия, к нему подключается клиент с другого ПК. Получается клиент одно, а сервер другое. Пользователь указал путь к файлу на своем ПК (C:\share\fail.doc) - это локальный путь. В клиентских процедурах он правильный, т.к. они выполняется на клиенте т.е. на ПК пользователя и там этот путь правильный и корректный. Но если вы передадите этот путь в серверную процедуру, то получите ошибку т.к. файл будет искаться не на компьютере пользователя. а на сервере (там где служба сервера работает) и там он найден естественно не будет.
Поэтому универсальных вариантов два:
1. Перемещать файл на сервер.
2. Использовать сетевые пути. доступные и с клиента и с сервера.
(18) в принципе суть я поняла, но пока не совсем догоняю как это программно реализовать, т.е. тот текст я посмотрела, что во вложении был, там получается что мы файл который указал пользователь записываем программно на сервер и далее используем путь к нему?
(19) В общих чертах да. проблема в том. что просто скопировать файл с клиента на сервер нельзя. Схема следующая:
1. На стороне клиента файл помещается во временное хранилище.
2. На стороне сервера он от туда извлекается и записывается с каким-то локальным путем на сервере. Этот самый путь используется в серверных процедурах по работе с данным файлом.
Это вообще единственно правильный вариант.
Любой сбой в сети - и цепочка поломалась, а в 1С это вообще критично, с их отсутствием обратной связи и контроля исполнения.
(9) варианта два:
1 - Программно открывать файл на клиенте, передавать на сервер в виде потока двоичных данных, и обрабатывать на севере
2 - Пользователю копировать файл в сетевой каталог, в том числе доступный с сервера SQL
ТабличныйДокумент (SpreadsheetDocument)
Прочитать (Read)
Вариант синтаксиса: Из файла
Синтаксис:
Прочитать(<ИмяФайла>, <СпособЧтенияЗначений>)
Параметры:
<ИмяФайла> (обязательный)
Тип: Строка.
Имя файла табличного документа.
<СпособЧтенияЗначений> (необязательный)
Тип: СпособЧтенияЗначенийТабличногоДокумента.
Определяет, каким образом нужно интерпретировать значения, считываемые из исходного документа XLS, XLSX или ODS.
При загрузке табличного документа из формата Excel 97 - 2010 и OpenOffice Calc, в случае если в ячейке исходного документа содержалось значение типа Дата или Число, то в ячейку результирующего табличного документа это значение попадает в зависимости от значения этого параметра.
Значение по умолчанию: Текст.
Описание варианта метода:
Чтение табличного документа из файла.
Вариант синтаксиса: Из потока
Синтаксис:
Прочитать(<Поток>, <СпособЧтенияЗначений>, <ТипФайлаТаблицы>)
Параметры:
<Поток> (обязательный)
Тип: Поток, ПотокВПамяти, ФайловыйПоток.
Поток для чтения табличного документа.
<СпособЧтенияЗначений> (необязательный)
Тип: СпособЧтенияЗначенийТабличногоДокумента.
Определяет, каким образом нужно интерпретировать значения, считываемые из исходного документа XLS, XLSX или ODS.
При загрузке табличного документа из формата Excel 97 - 2010 и OpenOffice Calc, в случае если в ячейке исходного документа содержалось значение типа Дата или Число, то в ячейку результирующего табличного документа это значение попадает в зависимости от значения этого параметра.
Значение по умолчанию: Текст.
<ТипФайлаТаблицы> (необязательный)
Тип: ТипФайлаТабличногоДокумента.
Формат, в котором табличный документ хранится в потоке.
При чтении табличного документа из потока допустимы следующие форматы: MXL, ODS.
Значение по умолчанию: MXL.
Описание варианта метода:
Чтение табличного документа из потока.
При чтении из потока допускается использование только следующих форматов: MXL, MXL7, ODS.
Описание:
Считывает табличный документ из файла.
Позволяет считывать табличный документ из файла табличного документа Microsoft Excel 97 - 2010 ( *.xls и *.xlsx) или электронной таблицы OpenOffice Calc ( *.ods).
Доступность:
Сервер, толстый клиент, внешнее соединение, мобильное приложение (сервер).
Пример:
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\My Documents\Таблица1.mxl");
Использование в версии:
Доступен, начиная с версии 8.0.
Ком соединение, разрядность ОС, разрядность ПО, компоненты, Доступы к папкам и файлам, монопольный режим и в управляемом приложении открывать/читать через клиент
Прописал и сохранение файлов чтоб с сервера читало, однако сообщение ни куда не ушло. А нужно именно эксель открывать, а не встроенной приблудой 1с, которая глючит, если пользователь файл xslx в xls переименовал. А эксель, вполне такое хавает.