|
1С:Предприятие
:: 1С:Предприятие 8 общая
|
|
| ||
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): Приложению не удается получить доступ к файлу "путь файла". Это можеть быть вызвано одной из следующих причин: - не существующий файл, - файл используется другой программой, - имя книги совпадает с именем другой, открытой в данный момент. Если это связано с директивами компиляции, то они типовые внопка на клиенте, все действия и таблица значений на сервере выполняются. ограничений к файлу нет вроде бы. Да, база клиент-серверная но я и на сервере это пытался делать и на своем компе, ни в какую. | ||
Kigo_Kigo 1 - 15.10.20 - 09:59 | Прям с первого захода такое или с последующих?
Может использовать не Quit(), а Close() потом Quit()? | ||
Kigo_Kigo 2 - 15.10.20 - 10:07 | И посмотри в процессах не болтается Excel.exe? | ||
Dmitry8Grek 3 - 15.10.20 - 10:22 | В процессах нет ExcelB и такое прям с первого захода. | ||
Dmitry8Grek 4 - 15.10.20 - 10:25 | "Может использовать не Quit(), а Close() потом Quit()? " Не помогает :( Может у меня код кривой. С интернета скачал там все 1 в 1. | ||
УдавВПопугаях 5 - 15.10.20 - 10:50 | может быть доступа нет, 1С может быть запущена из под другого пользователя, отличного от того, под которым в винде работаете. через эксплорер нормально открывается? где файл находится?
да и потом - винда такая винда, только что перегружался из за того что папку с рабочего стола удалить не мог, винда говорила, что ПАПКА где то открыта, поэтому не может удалить, при этом все файлы в папке удалить получилось, а вот сама папка понимаете ли где то открыта, поэтому извините | ||
УдавВПопугаях 6 - 15.10.20 - 10:51 | с путями может быть проблема - если русские буквы, длинный путь (даже ограничение было на длину, может пофиксили), недопустимые для экселя символы | ||
Kigo_Kigo 7 - 15.10.20 - 10:52 | (5) Ну да, на сервере она работает под пользователеv USR1CV8, дайте ему админ права | ||
Dmitry8Grek 8 - 15.10.20 - 13:11 | Я все перепробывал, ничего не работает( | ||
Dmitry8Grek 9 - 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): Приложению не удается получить доступ к файлу "путь файла". Это можеть быть вызвано одной из следующих причин: - не существующий файл, - файл используется другой программой, - имя книги совпадает с именем другой, открытой в данный момент если я правильно понял, то доступ получить не может При Эксель.Опен(). ТС, я правильно понял? | ||
Dmitry8Grek 13 - 15.10.20 - 15:46 | пробовал убрать все лишнее но ошибка не уходит.
правильно понял) | ||
УдавВПопугаях 14 - 15.10.20 - 15:48 | все все, совсем все, оставить только голую кнопку и на ней обработчик
Excel = Новый COMОбъект("Excel.Application");
Excel.WorkBooks.Open("ПутьКФайлу");// кстати приведи его тут, где файл то находится | ||
Chameleon1980 15 - 15.10.20 - 15:49 | гугл программисты | ||
Dmitry8Grek 16 - 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". Это может быть вызвано одной из следующих причин. • Указан несуществующий файл или путь. • Файл используется другой программой. • Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент. все также | ||
Dmitry8Grek 17 - 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 | тут какбэ гадать особо нечего, одно из трех
• Указан несуществующий файл или путь.
• Файл используется другой программой. • Имя книги, которую вы пытаетесь сохранить, совпадает с именем другой книги, открытой в данный момент. + еще права доступапричина зависит от обстоятельств на конкретной машине и винде / домене | ||
Dmitry8Grek 22 - 15.10.20 - 16:05 | в пути убрал свою фамилию)) чтобы не узнали такого олуха как я который пишет такие обработки) | ||
Dmitry8Grek 23 - 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 | надо до сотни дойти, иначе путь к файлу не найти | ||
Kigo_Kigo 29 - 15.10.20 - 16:37 | А точно text1.xls файл екселя, а не какого нить txt или csv ? | ||
УдавВПопугаях 30 - 15.10.20 - 16:39 | ну экселю то пох, он бы открыл и то и то Рекламное место пустует | ||
Kigo_Kigo 31 - 15.10.20 - 16:40 | Давай так, открой ексель, набей туда пару строк любым хламом, сохрани в D:\TER\test.xls (а лучше xlsx) и попробуй его открыть | ||
Kigo_Kigo 32 - 15.10.20 - 16:40 | (30) не факт | ||
УдавВПопугаях 33 - 15.10.20 - 16:41 | вернее преобразовывал бы и выдал какую нибудь лажу, но на отсутствие файла бы не ругался | ||
Kigo_Kigo 34 - 15.10.20 - 16:41 | + (31) из 1с | ||
Kigo_Kigo 35 - 15.10.20 - 16:41 | и да, запусти 1с от имени администратора | ||
ZDenis 36 - 15.10.20 - 16:41 | (0) Процедура ЗагрузкаExcel() где выполняется? Не стоит не &НаСервере, не &НаКлиенте Путь к файлу должен быть на том компе, на стороне которого Процедура ЗагрузкаExcel() выполняется. Лучше для облегчения сетевой адрес к доступной по сети папке указать \\тыры пыры\файл. Тогда не важно где будет процедура выполняться | ||
УдавВПопугаях 37 - 15.10.20 - 16:42 | (32)если не углубляться в тонкости, то файл он бы нашел, проблемы с открытием - да | ||
Dmitry8Grek 38 - 15.10.20 - 16:43 | забыл дописать &НаСервере там стоит. И как мне известно если директива не стоит то по умолчанию используется НаСервере:) верно? | ||
ZDenis 39 - 15.10.20 - 16:44 | (38) тогда он находиться на сервере должен, а не на локальном компе | ||
Dmitry8Grek 40 - 15.10.20 - 16:44 | Пробовал создавать в Excel 2007, то есть .xlsx но все также файл не найден) | ||
УдавВПопугаях 41 - 15.10.20 - 16:45 | копец ёпырст | ||
Kigo_Kigo 42 - 15.10.20 - 16:46 | (40) Да, по умолчанию деректива на сервере, но ты все равно напиши, потому как встречался если процедура вызывается на клиенте и переходит в процедуру без объявления -где выполняться, наследует тоже на клиенте | ||
Dmitry8Grek 43 - 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) пое.истика я бы сказал | ||
Dmitry8Grek 46 - 15.10.20 - 17:05 | жаль) я думаю тут ничего не изменить. я Сдаюсь( | ||
Dmitry8Grek 47 - 15.10.20 - 17:38 | Всем откликнувшимся большое спасибо. Пойду искать обработки по загрузке из Excel! Увы и ах. |
|
Список тем форума |