|
Помогите сделать обработку по загрузке данных из Excel c созданием документа пересчета. | ☑ | ||
---|---|---|---|---|
0
Dmitry8Grek
15.10.20
✎
09:46
|
Добрый день. Текст модуля следующий:
&НаКлиенте Процедура Загрузить(Команда) ЗагрузкаExcel(); КонецПроцедуры Процедура ЗагрузкаExcel() // Попытка открытия файла Excel Попытка Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(Объект.ФайлExcel); Исключение Сообщить("При открытии файла произошла ошибка! Операция прервана!"); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; // Попытка выбрать первый лист // Можно указать любой другой Попытка Excel.Sheets(1).Select(); Исключение // Закрытие файла в том случае, если первый лист не найден Excel.ActiveWorkbook.Close(); Excel = 0; Сообщить("Первый лист не найден!"); ОтменитьТранзакцию(); Возврат; КонецПопытки; // Вычисление количества строк и колонок в зависимости от версии Excel vExcel = Лев(Excel.Version, Найти(Excel.Version,".")-1); Если vExcel = "8" тогда КоличествоСтрок = Excel.Cells.CurrentRegion.Rows.Count; КоличествоКолонок = Макс(Excel.Cells.CurrentRegion.Columns.Count, 13); Иначе КоличествоСтрок = Excel.Cells(1,1).SpecialCells(11).Row; КоличествоКолонок = Excel.Cells(1,1).SpecialCells(11).Column; Конецесли; // Проверка корректности заполнения колонок // Имена колонок в Excel файле должны совпадать с именами реквизитов табличной части, в которую загружаются данные // Переменная МассивКолонок содержит список номеров колонок, которые будут перегружаться МассивКолонок = Новый ТаблицаЗначений; МассивКолонок.Колонки.Добавить("НомерКолонки"); МассивКолонок.Колонки.Добавить("НазваниеКолонки"); Для КолонкаОтсчета = 1 по КоличествоКолонок Цикл ИмяКолонки = Excel.Cells(1, КолонкаОтсчета).Text; // Удаление лишних пробелов из имен колонок ИмяБезПробелов = СтрЗаменить(ИмяКолонки," ",""); // Проверка наличия реквизитов табличной части "Товары" в документе "УстановкаЦен" Если НЕ НаличиеРеквизитаТЧ(ИмяБезПробелов, Метаданные.Документы.ПересчетТоваров, "Товары") Тогда Сообщить("Не найден реквизит с именем " + ИмяБезПробелов + "! Колонка не будет загружена!"); Иначе НовСтрока = МассивКолонок.Добавить(); НовСтрока.НомерКолонки = КолонкаОтсчета; НовСтрока.НазваниеКолонки = ИмяБезПробелов; КонецЕсли; КонецЦикла; // //Если есть колонки для загрузки // и есть колонка "Номенклатура, которая является обязательным к заполнению реквизитом Если МассивКолонок.Количество() <> 0 и МассивКолонок.НайтиСтроки(Новый Структура("НазваниеКолонки", "Номенклатура")).Количество() <> 0 Тогда // Создание документа и заполнение реквизитов шапки НовыйДокумент = Документы.ПересчетТоваров.СоздатьДокумент(); НовыйДокумент.Дата = ТекущаяДата(); НовыйДокумент.Ответственный = ПараметрыСеанса.ТекущийПользователь; НовыйДокумент.Комментарий = "Загружено из файла " + Объект.ФайлExcel; // Заполнение табличной части "Товары" // Переменная СтрокаОтсчета - номер строки в Excel, с которой начинается заполнение Для СтрокаОтсчета = 2 по КоличествоСтрок Цикл НСтр = НовыйДокумент.Товары.Добавить(); Для каждого СтрокаМассив из МассивКолонок Цикл ТекущееЗначение = Excel.Cells(СтрокаОтсчета, СтрокаМассив.НомерКолонки).Text; // Получение имени колонки ИмяКолонки = Excel.Cells(1, СтрокаМассив.НомерКолонки).Text; // Заполнение строки данными Если ИмяКолонки = "Номенклатура" Тогда НСтр.Номенклатура = Справочники.Номенклатура.НайтиПоНаименованию(ТекущееЗначение, Истина); ИначеЕсли ИмяКолонки = "КоличествоФакт" Тогда НСтр.КоличествоФакт = ТекущееЗначение; КонецЕсли; КонецЦикла; КонецЦикла; // Запись и проведение документа НовыйДокумент.Записать(РежимЗаписиДокумента.Проведение); Сообщить("Создан и заполнен документ " + Строка(НовыйДокумент)); Иначе Сообщить("В Excel файле не достаточно данных для заполнения документа!"); КонецЕсли; Excel.DisplayAlerts = 0; Excel.Quit(); Excel.DisplayAlerts = 1; //Элементы.ЗагружаемыйФайл.Прочитать(Объект.ФайлExcel); КонецПроцедуры &НаСервере Функция НаличиеРеквизитаТЧ(ИмяРекв, МетаданныеДок, ИмяТЧ) // Проверка наличия ТЧ ТЧ = МетаданныеДок.ТабличныеЧасти.Найти(ИмяТЧ); Если ТЧ = Неопределено Тогда // Нет такой таб. части в документе Возврат Ложь; Иначе Возврат НЕ (ТЧ.Реквизиты.Найти(ИмяРекв) = Неопределено); КонецЕсли; КонецФункции &НаКлиенте Процедура ФайлExcelНачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка) Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); Диалог.Заголовок = "Выберите Excel - файл"; Диалог.ПолноеИмяФайла = "c:\"; Диалог.Фильтр = "Таблицы (*.xls,*.xlsx)|*.xls;*.xlsx;|Microsoft Excel 97/2000/XP/2003 (*.xls)|*.xls|Microsoft Excel 2007/2010 (*.xlsx)|*.xlsx"; Если Диалог.Выбрать() Тогда Объект.ФайлExcel = Диалог.ПолноеИмяФайла; КонецЕсли; ТабличныйДокументПолучить(); КонецПроцедуры &НаСервере Процедура ТабличныйДокументПолучить() ЗагружаемыйФайл.Прочитать(Объект.ФайлExcel); КонецПроцедуры И в итоге возникает Ошибка пи вызове метода контекста(Оpen): Произошла исключительная ситуация (Microsoft Excel): Приложению не удается получить доступ к файлу "путь файла". Это можеть быть вызвано одной из следующих причин: - не существующий файл, - файл используется другой программой, - имя книги совпадает с именем другой, открытой в данный момент. Если это связано с директивами компиляции, то они типовые внопка на клиенте, все действия и таблица значений на сервере выполняются. ограничений к файлу нет вроде бы. Да, база клиент-серверная но я и на сервере это пытался делать и на своем компе, ни в какую. |
|||
1
Kigo_Kigo
15.10.20
✎
09:59
|
Прям с первого захода такое или с последующих?
Может использовать не Quit(), а Close() потом Quit()? |
|||
2
Kigo_Kigo
15.10.20
✎
10:07
|
И посмотри в процессах не болтается Excel.exe?
|
|||
3
Dmitry8Grek
15.10.20
✎
10:22
|
В процессах нет Excel
B и такое прям с первого захода. |
|||
4
Dmitry8Grek
15.10.20
✎
10:25
|
"Может использовать не Quit(), а Close() потом Quit()? " Не помогает :( Может у меня код кривой. С интернета скачал там все 1 в 1.
|
|||
5
УдавВПопугаях
15.10.20
✎
10:50
|
может быть доступа нет, 1С может быть запущена из под другого пользователя, отличного от того, под которым в винде работаете. через эксплорер нормально открывается? где файл находится?
да и потом - винда такая винда, только что перегружался из за того что папку с рабочего стола удалить не мог, винда говорила, что ПАПКА где то открыта, поэтому не может удалить, при этом все файлы в папке удалить получилось, а вот сама папка понимаете ли где то открыта, поэтому извините |
|||
6
УдавВПопугаях
15.10.20
✎
10:51
|
с путями может быть проблема - если русские буквы, длинный путь (даже ограничение было на длину, может пофиксили), недопустимые для экселя символы
|
|||
7
Kigo_Kigo
15.10.20
✎
10:52
|
(5) Ну да, на сервере она работает под пользователеv USR1CV8, дайте ему админ права
|
|||
8
Dmitry8Grek
15.10.20
✎
13:11
|
Я все перепробывал, ничего не работает(
|
|||
9
Dmitry8Grek
15.10.20
✎
14:38
|
помогитееее с обработкой загрузки данных из ексель, если ли у вас другая обработка по аналогии работающая как эта?
|
|||
10
Мимохожий Однако
15.10.20
✎
14:41
|
Начинай с внятного описания задачи. И показывай этап, на котором застрял.
|
|||
11
УдавВПопугаях
15.10.20
✎
15:34
|
сейчас увидел
в конце модуля написано ЗагружаемыйФайл.Прочитать(Объект.ФайлExcel); а в начале кода Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(Объект.ФайлExcel); может быть тут вопрос? попробуй оставить только обработчик команды и процедуру открытия файла КОМом Процедура Загрузить(Команда) ЗагрузкаExcel(); КонецПроцедуры Процедура ЗагрузкаExcel() Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(Объект.ФайлExcel); КонецПроцедуры |
|||
12
УдавВПопугаях
15.10.20
✎
15:37
|
а все остальные движения убери, потому что непонятно, что и в какой последовательности происходит
(10) это у него Ошибка пи вызове метода контекста(Оpen): Произошла исключительная ситуация (Microsoft Excel): Приложению не удается получить доступ к файлу "путь файла". Это можеть быть вызвано одной из следующих причин: - не существующий файл, - файл используется другой программой, - имя книги совпадает с именем другой, открытой в данный момент если я правильно понял, то доступ получить не может При Эксель.Опен(). ТС, я правильно понял? |
|||
13
Dmitry8Grek
15.10.20
✎
15:46
|
пробовал убрать все лишнее но ошибка не уходит.
правильно понял) |
|||
14
УдавВПопугаях
15.10.20
✎
15:48
|
все все, совсем все, оставить только голую кнопку и на ней обработчик
Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open("ПутьКФайлу"); // кстати приведи его тут, где файл то находится |
|||
15
Chameleon1980
15.10.20
✎
15:49
|
гугл программисты
|
|||
16
Dmitry8Grek
15.10.20
✎
15:54
|
Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу "C:\Users\\Desktop\TER\text1.xls". Это может быть вызвано одной из следующих причин.
• Указан несуществующий файл или путь. • Файл используется другой программой. • Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент. {ВнешняяОбработка.ЗагрузкаИзExcel.Форма.Форма.Форма(14)}: Excel.WorkBooks.Open("C:\Users\\Desktop\TER\text1.xls"); {ВнешняяОбработка.ЗагрузкаИзExcel.Форма.Форма.Форма(5)}: ЗагрузкаExcel(); по причине: Произошла исключительная ситуация (Microsoft Excel): Приложению Microsoft Excel не удается получить доступ к файлу "C:\Users\\Desktop\TER\text1.xls". Это может быть вызвано одной из следующих причин. • Указан несуществующий файл или путь. • Файл используется другой программой. • Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент. все также |
|||
17
Dmitry8Grek
15.10.20
✎
15:55
|
"гугл программисты" есть такое (
|
|||
18
УдавВПопугаях
15.10.20
✎
15:55
|
а что там за путь такой
C:\Users\\Desktop\TER\text1.xls лишних слешей у нас есть много |
|||
19
УдавВПопугаях
15.10.20
✎
15:56
|
а, типа имя учетки убрал что ли
|
|||
20
УдавВПопугаях
15.10.20
✎
15:57
|
попробуй его переместить на диск Д или в корень С, чтобы исключить права доступа на Users
|
|||
21
УдавВПопугаях
15.10.20
✎
16:02
|
тут какбэ гадать особо нечего, одно из трех
• Указан несуществующий файл или путь. • Файл используется другой программой. • Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент. + еще права доступа причина зависит от обстоятельств на конкретной машине и винде / домене |
|||
22
Dmitry8Grek
15.10.20
✎
16:05
|
в пути убрал свою фамилию)) чтобы не узнали такого олуха как я который пишет такие обработки)
|
|||
23
Dmitry8Grek
15.10.20
✎
16:07
|
Произошла исключительная ситуация (Microsoft Excel): К сожалению, нам не удалось найти файл D:\TER\text1.xls. Возможно, он был перемещен, переименован или удален?
{ВнешняяОбработка.ЗагрузкаИзExcel.Форма.Форма.Форма(14)}: Excel.WorkBooks.Open("D:\TER\text1.xls"); {ВнешняяОбработка.ЗагрузкаИзExcel.Форма.Форма.Форма(5)}: ЗагрузкаExcel(); по причине: Произошла исключительная ситуация (Microsoft Excel): К сожалению, нам не удалось найти файл D:\TER\text1.xls. Возможно, он был перемещен, переименован или удален? |
|||
24
УдавВПопугаях
15.10.20
✎
16:22
|
галка "Отображать расширения файлов" стоит в настройках ОС?
|
|||
25
УдавВПопугаях
15.10.20
✎
16:23
|
"Скрывать расширение для зарегистрированных типов"
|
|||
26
УдавВПопугаях
15.10.20
✎
16:25
|
.xls - офис до 2007 кажется, действительно файл создан более ранней версией офиса?
|
|||
27
УдавВПопугаях
15.10.20
✎
16:25
|
прям хрень какая то неведомая
|
|||
28
УдавВПопугаях
15.10.20
✎
16:26
|
надо до сотни дойти, иначе путь к файлу не найти
|
|||
29
Kigo_Kigo
15.10.20
✎
16:37
|
А точно text1.xls файл екселя, а не какого нить txt или csv ?
|
|||
30
УдавВПопугаях
15.10.20
✎
16:39
|
ну экселю то пох, он бы открыл и то и то
|
|||
31
Kigo_Kigo
15.10.20
✎
16:40
|
Давай так, открой ексель, набей туда пару строк любым хламом, сохрани в D:\TER\test.xls (а лучше xlsx) и попробуй его открыть
|
|||
32
Kigo_Kigo
15.10.20
✎
16:40
|
(30) не факт
|
|||
33
УдавВПопугаях
15.10.20
✎
16:41
|
вернее преобразовывал бы и выдал какую нибудь лажу, но на отсутствие файла бы не ругался
|
|||
34
Kigo_Kigo
15.10.20
✎
16:41
|
+ (31) из 1с
|
|||
35
Kigo_Kigo
15.10.20
✎
16:41
|
и да, запусти 1с от имени администратора
|
|||
36
ZDenis
15.10.20
✎
16:41
|
(0) Процедура ЗагрузкаExcel() где выполняется? Не стоит не &НаСервере, не &НаКлиенте
Путь к файлу должен быть на том компе, на стороне которого Процедура ЗагрузкаExcel() выполняется. Лучше для облегчения сетевой адрес к доступной по сети папке указать \\тыры пыры\файл. Тогда не важно где будет процедура выполняться |
|||
37
УдавВПопугаях
15.10.20
✎
16:42
|
(32)если не углубляться в тонкости, то файл он бы нашел, проблемы с открытием - да
|
|||
38
Dmitry8Grek
15.10.20
✎
16:43
|
забыл дописать &НаСервере там стоит. И как мне известно если директива не стоит то по умолчанию используется НаСервере:) верно?
|
|||
39
ZDenis
15.10.20
✎
16:44
|
(38) тогда он находиться на сервере должен, а не на локальном компе
|
|||
40
Dmitry8Grek
15.10.20
✎
16:44
|
Пробовал создавать в Excel 2007, то есть .xlsx но все также файл не найден)
|
|||
41
УдавВПопугаях
15.10.20
✎
16:45
|
копец ёпырст
|
|||
42
Kigo_Kigo
15.10.20
✎
16:46
|
(40) Да, по умолчанию деректива на сервере, но ты все равно напиши, потому как встречался если процедура вызывается на клиенте и переходит в процедуру без объявления -где выполняться, наследует тоже на клиенте
|
|||
43
Dmitry8Grek
15.10.20
✎
16:48
|
создвал и на сервере и на своем компе, но все в никакую ХД. МИСТика
|
|||
44
УдавВПопугаях
15.10.20
✎
16:54
|
в (0) же НаКлиенте написано
&НаКлиенте Процедура Загрузить(Команда) ЗагрузкаExcel(); КонецПроцедуры Процедура ЗагрузкаExcel() // Попытка открытия файла Excel Попытка Excel = Новый COMОбъект("Excel.Application"); Excel.WorkBooks.Open(Объект.ФайлExcel); Исключение Сообщить("При открытии файла произошла ошибка! Операция прервана!"); Сообщить(ОписаниеОшибки()); Возврат; КонецПопытки; |
|||
45
УдавВПопугаях
15.10.20
✎
16:55
|
(43) пое.истика я бы сказал
|
|||
46
Dmitry8Grek
15.10.20
✎
17:05
|
жаль) я думаю тут ничего не изменить. я Сдаюсь(
|
|||
47
Dmitry8Grek
15.10.20
✎
17:38
|
Всем откликнувшимся большое спасибо. Пойду искать обработки по загрузке из Excel! Увы и ах.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |