Имя: Пароль:
1C
1С v8
Помогите сделать обработку по загрузке данных из 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! Увы и ах.