Имя: Пароль:
1C
1С v8
Работа с Екселем
,
0 88g88
 
14.09.18
15:49
Приветствую форумчане.
Подскажите как прочитать информацию из ексель файла.
1 88g88
 
14.09.18
15:49
Функция ПрочитатьЛистExcel(ТЗ = Неопределено, ЛистЭксель = Неопределено, НомерПервойСтроки = 1, НомерПервойКолонки = 1, ВсегоСтрок = 0, ВсегоКолонок = 0) Экспорт
    
    Если ЛистЭксель = Неопределено Тогда
        ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
    КонецЕсли;
    Если ВсегоСтрок = 0 Тогда
        ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
    КонецЕсли;
    Если ВсегоКолонок = 0 Тогда
        ВсегоКолонок = ЛистЭксель.Cells.SpecialCells(11).Column;
    КонецЕсли;
    Если ТЗ = Неопределено Тогда
        ТЗ =  Новый ТаблицаЗначений;
        Для Счетчик = 1 По ВсегоКолонок Цикл
            ТЗ.Колонки.Добавить("Колонка"+Счетчик, Новый ОписаниеТипов("Строка"));
        КонецЦикла;
    КонецЕсли;
    Для Счетчик = НомерПервойСтроки По ВсегоСтрок Цикл
        НоваяСтрока = ТЗ.Добавить();
    КонецЦикла;
    
    Область = ЛистЭксель.Range(ЛистЭксель.Cells(НомерПервойСтроки,НомерПервойКолонки), ЛистЭксель.Cells(ВсегоСтрок,ВсегоКолонок));
    Данные = Область.Value.Выгрузить();
    
    Для Счетчик = 0 По ВсегоКолонок-1 Цикл
        ТЗ.ЗагрузитьКолонку(Данные[Счетчик], Счетчик);
    КонецЦикла;
    ЛистЭксель = Неопределено;
    Возврат ТЗ;
КонецФункции
2 user-ok
 
14.09.18
15:50
тихо сам с собою я веду беседу....
3 Скиурус
 
14.09.18
15:50
Продолжайте наблюдения, нам ужасно интересно
4 88g88
 
14.09.18
15:50
Есть вот такой код с вот такой ошибкой.
{ВнешняяОбработка.СнабжениеМатериалы.Форма.Форма.Форма(635)}: Значение не является значением объектного типа (Cells)
        ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
5 Tatitutu
 
14.09.18
15:51
да не боись открывай
тоже самое почти что txt (Блокнот) или doc (Word)
двойной клик и файл откроется
дождись открытия
и читай
слева на право
сверху вниз

там может быть несколько листов
(это фишка Excel)
6 88g88
 
14.09.18
15:52
Ошибка проявляется при попытке обращения к строке.
Даже при явном указании строк при чте
нии области то же самое
7 rphosts
 
14.09.18
15:52
(4) а ему предшествует чтото типа
      ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
8 Tatitutu
 
14.09.18
15:53
(4) идешь в конфигуратор и смотришь

где у тебя ЛистЭксель инициализируется
9 rphosts
 
14.09.18
15:53
файл открыт, страничка файла выбрана?
10 Tatitutu
 
14.09.18
15:54
(9) Подожди...давай из далека

Эксель на компьютере установлен ?
Где вызываешь эту процедуру?
11 88g88
 
14.09.18
15:54
(7)
Если ЛистЭксель = Неопределено Тогда
        ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
    КонецЕсли;
12 88g88
 
14.09.18
15:54
(10) Внешняя обработка, база УПП
13 88g88
 
14.09.18
15:54
(10) да 2010 32 бит
14 s03
 
14.09.18
15:55
(11) Это ты само приложение Excel инициализируешь, а потом ещё файл открыть надо, лист выбрать/указать и только после этого строки/колонки
15 s03
 
14.09.18
15:56
в общем - в гугл, там примеров по самое небалуйся
16 88g88
 
14.09.18
15:59
(15) от туда и взял))) ток вот не работал с екселем. вот и наткнулся на непонимание.
17 1Сергей
 
14.09.18
15:59
Если лист один и файл небольшой, то можно просто загрузить файл в табличный документ. А потом по нему пробежаться
18 88g88
 
14.09.18
16:00
(14) как его указать? лист.
19 s03
 
14.09.18
16:02
(16) а только один пример нашел? второй-третий хотя бы взглянуть пробовал?
20 1Сергей
 
14.09.18
16:02
Вот, недавно что-то делал. Может, поможет


    Ехель = ПолучитьCOMОбъект("", "Excel.Application");
    //Ехель.Visible = 1;
    ...
        Попытка
            Ехель.Workbooks.Open(СтрокаФайлов.Путь + СтрокаФайлов.ИмяФайла);
            Щит = Воркбук.Sheets(1);
        Исключение
            СтрокаФайлов.Статус = "Не удалось открыть файл";
            Продолжить;
        КонецПопытки;
        
        ЧислоСтолбцов = Щит.Cells(1,1).SpecialCells(11).Column;
        ЧислоСтрок = Щит.Cells(1,1).SpecialCells(11).Row;
    ...
21 1Сергей
 
14.09.18
16:03
Пардон,

Воркбук = Ехель.Workbooks.Open(СтрокаФайлов.Путь + СтрокаФайлов.ИмяФайла);
22 Temai
 
14.09.18
16:05
Держи еще кода, мне не жалко  

Excel = Новый COMОбъект("Excel.Application");  
    Книга = Excel.WorkBooks.Open(Вложение);
    Excel.Visible = 0;
    Excel.ActiveWindow.DisplayWorkbookTabs = 1;
    Excel.ActiveWindow.TabRatio = 0.6;    
    
    Лист = Книга.WorkSheets(1);
    
    ВсегоСтрок = Лист.Cells.SpecialCells(11).Row;//-кол-во строк всего

    ВсегоКолонок = Лист.Cells.SpecialCells(11).Column;//-кол-во колонок всего

    
    Для а = 1 По ВсегоСтрок Цикл
        Для б = 1 по ВсегоКолонок Цикл
            Если Лев(Лист.Cells(а, б).FormulaR1C1, 1) = "=" Тогда
                Лист.Cells(а, б).FormulaR1C1 = Лист.Cells(а, б).FormulaR1C1;
            КонецЕсли;
        Конеццикла;
    Конеццикла;
    
    FullName = Excel.ActiveWorkbook.FullName;            
    Excel.DisplayAlerts = false;
    Excel.ActiveWorkbook.SaveAs(FullName, 51);// 18 - xls 97-2003; 51 - xlsx 2007-2013

    //Excel.Visible = 1;       // если нужно поработать дальше с книгой

    Excel.Application.Quit();// если просто выходим
23 MyNameIs
 
14.09.18
16:06
ТабДок = Новый ТабличныйДокумент;
ТабДок.Прочитать("C:\temp\Таблица1.xlsx");
24 1Сергей
 
14.09.18
16:07
(23) как там по листам прыгать?
Раньше нельзя было. Уже завезли?
25 Temai
 
14.09.18
16:08
(1) Твой код:
    Если ЛистЭксель = Неопределено Тогда
        ЛистЭксель = ПолучитьCOMОбъект(,"Excel.Application");
    КонецЕсли;
    Если ВсегоСтрок = 0 Тогда
        ВсегоСтрок = ЛистЭксель.Cells.SpecialCells(11).Row;
    КонецЕсли;

Разумеется у тебя падает с ошибкой у тебя лист не определен, возьми код из 22
26 d4rkmesa
 
14.09.18
16:09
(0) Правильный подход в (17) и (23)
27 s03
 
14.09.18
16:10
(26) не факт, у ТС УПП, а значит, возможно 8.2
28 MyNameIs
 
14.09.18
16:15
(24) вроде свойство ВысотаТаблицы включает в себя все листы
29 88g88
 
14.09.18
16:16
(22) Попробую сейчас
30 88g88
 
14.09.18
16:23
(22) Во вложении что должно быть?
31 Dimma
 
14.09.18
16:23
(0)
Почитай
http://www.sky1c.ru/node/88
или лучше
http://catalog.mista.ru/public/341855/
если 1С старше 8.3.6
32 88g88
 
14.09.18
16:41
Как обход строк в нем делать?
33 1Сергей
 
14.09.18
16:41
(30) полное имя файла
34 88g88
 
14.09.18
16:44
Сделал тестовый файл, получил 1 столбец 5 сток.
То есть нашел, открыл, получил значение по строкам и столбцам.

Вижу обработчик но что в нем не пойму
    Для а = 1 По ВсегоСтрок Цикл
        Для б = 1 по ВсегоКолонок Цикл
            Если Лев(Лист.Cells(а, б).FormulaR1C1, 1) = "=" Тогда
                Лист.Cells(а, б).FormulaR1C1 = Лист.Cells(а, б).FormulaR1C1;
            КонецЕсли;
        Конеццикла;
    Конеццикла;
35 88g88
 
14.09.18
16:48
к примеру в обработчик написать сообщить и значение по ячейкам в столбце.
принцип обращения не пойму.
36 88g88
 
16.10.18
13:24
(22) В продолжение темы.
Использовал код в сообщении 22. Локально под пользователем все работает.
Но в регламентированном задании не отрабатывает код.
ошибку выдает "Значение не является значением объектного типа (Application)"

Сталкивался кто с подобным? подскажите как исправить.
37 Cool_Profi
 
16.10.18
13:25
(36) У тебя (точнее у пользователя, под которым 1с-сервер крутится) правов нет. Или вообще на сервере ексельне установлен
38 88g88
 
16.10.18
13:27
(37) На сервере офисный пакет есть. все в порядке.
По вопросу прав в какую сторону копать?
39 88g88
 
16.10.18
13:36
(38) пользователь 1с сервера USR1CV8 учетная запись не доменная.
40 Cyberhawk
 
16.10.18
13:46
Завязывай уже с СОМ-объектами
41 ЦиркУехал
 
16.10.18
13:52
это все уже прошлый век

теперь модно так
берешь табличный документ со структурой выводишь его, в него копируешь из Экселя, и загружаешь табличны документ !!
все круть неимоверная.
никаких комов никаких  Эксель подключений вообще быстро и удобно.
42 Cyberhawk
 
16.10.18
13:55
(41) Это какая-то чешуя ручная
43 ЦиркУехал
 
16.10.18
13:56
(42) да норм, все быстро.
ctrl-a
ctrl-c
ctrl-v
все!
44 1Сергей
 
16.10.18
13:59
(43) поясни за "табличный документ со структурой"
ето как
45 88g88
 
16.10.18
14:05
(41) (42) (43) (44)
Все не просто.
в документе коды номенклатуры.
Занесены они в последовательности согласно настроению внутреннего заказчика. То-есть никакой.
1С открывает файл, находит все коды, формирует запрос (из 15 вложенных запросов). После построчно проходит по всем кодам, ищет в запросе соответствия движений, и записывает их в соответственные строки и конкретные столбцы екселья.
Не спрашивайте зачем, даже понять не пытаюсь.
Заказчик просит, директор ножками топает :)
46 Cyberhawk
 
16.10.18
14:19
Почему не пошлешь заказчика?
47 ЦиркУехал
 
16.10.18
14:32
(44) Пример есть в ЕРП и в УТ и в КА...
например Заказ Клиента /загрузить из внешнего файла.
48 88g88
 
16.10.18
15:10
(46)
И уволиться нафиг!
49 Cyberhawk
 
16.10.18
15:11
(48) Один из лучших способов поднять зп
50 shadow_sw
 
17.10.18
06:54
Попытка    
    Ex = новый COMОбъект("Excel.Application");
    WB = Ex.Workbooks.Open(ИмяФайла);
    WS = WB.WorkSheets(1);
    Arr = WS.UsedRange.Value;
    WB.Close(0);
Исключение
    Возврат;
КонецПопытки;

МассивКолонок = Arr.выгрузить();
ВсегоСтрок = (МассивКолонок.Получить(0).Количество())-1;

Для Строка=0 по ВсегоСтрок Цикл
51 88g88
 
17.10.18
11:08
В итоге...
Агент сервера 1С запускался под учетной записью 1С. Созданной по умолчанию при установки программного обеспечения.
Создали нового пользователя с необходимыми правами в домене и папками доступа. После службе, Агент сервера 1с, указали что запускаться она будет от имени этого пользователя.
Никаких дополнительных настроек подключения к SQL не понадобилось. Просто смена пользователя запускающего службу.
После чего все проблемы исчезли.
Как и писалось ранее офисный пакет необходим на сервере где стоит "сервер 1с", не путать с SQL.
(Внимание: Название службы не точное, но что то в этом роде;))

Спасибо всем кто не скупился на дельные советы и поднимал настроение!
Программист всегда исправляет последнюю ошибку.