Имя: Пароль:
1C
1С v8
Работа с Эксель
0 bommba9
 
21.09.20
09:39
Добрый день всем, как вытянуть нормально из екселя нужные области данных, не сильно понятно. Только начал с этой темой работать и получилось только считать по каждой ячейке, а дальше я даже алгоритм решения не представлю. Мне говорили как то сделать через соответствие.
1 Андроны едут
 
21.09.20
10:02
(0) как-то так:     
Область = Лист.Range("ИмяОбласти").Select();
2 Обработка
 
21.09.20
10:24
(0) Куча коад в гугле.

Вот пример
&НаКлиенте
Процедура ВыполнитьПеренос(Команда)
    Попытка
        Excel = Новый COMОбъект("Excel.Application");
        Excel.WorkBooks.Open(ПутьКФайлу);
        ExcelЛист = Excel.Sheets(1);
    Исключение
        Сообщить("Не установлено приложение MS Excel!");
        Возврат;
    КонецПопытки;
    Попытка
    КонечнаяСтрокаДанных    = Excel.Sheets(1).UsedRange.Rows.Count+2;
    КоличествоКолонокДанных = Excel.Sheets(1).UsedRange.Columns.Count;
    ДанныеЭксель            = Excel.Range(Excel.Sheets(1).Cells(2,1),    Excel.Sheets(1).Cells(КонечнаяСтрокаДанных,КоличествоКолонокДанных)).Value.Выгрузить();
    
     Исключение
        Попытка
            Excel.Application.Quit();
        Исключение
            Отказ = ИСТИНА;
            Возврат;
        КонецПопытки;
    КонецПопытки;
    Попытка
        Excel.Application.Quit();
    Исключение
        Сообщить(ОписаниеОшибки());
    КонецПопытки;
    
    ОбработатьДанные(ДанныеЭксель);

КонецПроцедуры
3 Обработка
 
21.09.20
10:25
Вторая процедура:

&НаСервере
Процедура ОбработатьДанные(Массив)
    
    ЧислоСтрок = Массив[0].Количество();
    ДокС = Док.ПолучитьОбъект();
    Для К =0 По ЧислоСтрок-1 Цикл
        Арт    = Массив[0][к];
        Наим   = Массив[1][к];
        Кол    = Массив[2][к];
        Сум    = Массив[3][к];
        Если Арт = Неопределено Тогда
            Если Наим = Неопределено Тогда
                Сообщить("Не найдент товар!"+Строка(К));
                Продолжить;
            Иначе
                Ном = Справочники.Номенклатура.НайтиПоНаименованию(Наим);
            КонецЕсли;    
        Иначе
            Ном = Справочники.Номенклатура.НайтиПоРеквизиту("Артикул",Арт);
        КонецЕсли;
4 Garykom
 
гуру
21.09.20
10:26
Любители оли откройте уже для себя ТабДок
5 Garykom
 
гуру
21.09.20
10:27
(4) *OLE
6 Обработка
 
21.09.20
10:29
(5) А если чуть чуть по подробней?
7 Garykom
 
гуру
21.09.20
10:30
8 Василий Алибабаевич
 
21.09.20
10:33
(7) Оно сломается на первом же файле, где в шапке будут объединенные ячейки.
9 Василий Алибабаевич
 
21.09.20
10:35
+ (8) Любой документ выпущенный из типовой и сохраненный в xls.
10 Обработка
 
21.09.20
10:39
(7) Спасибо годнота. Может и пригодится.
Как раз на серверах где нет установленного офиса быть может.
А то я мучал их админов ставить на их сервера офис
Или я ошибаюсь?
11 Василий Алибабаевич
 
21.09.20
10:43
(10) Нет. Не ошибаешься. ТабличныйДокумент.Прочитать установленный офис не нужен.
12 Андроны едут
 
21.09.20
10:47
((8) + проблемы с чтением числовых данных и дат
13 Обработка
 
21.09.20
10:51
(12) В защите этой схемы скажу следующее.
1) Я всегда стараюсь в 1с грузить таблицы ексель без объединений без итогов и без всяких там заголовков.
2) Числовые данные и даты можно всегда переформатировать тут же. Даже при чтении через оле это всплывает.
14 Андроны едут
 
21.09.20
11:04
(13) через оле можно переформатировать, так как читаем построчно, а как переформатировать ТабличныйДокумет хз. В справке написано:

в случае если в ячейке исходного документа содержалось значение типа Дата или Число, то в ячейку результирующего табличного документа это значение попадает в зависимости от значения этого параметра.
Значение по умолчанию: Текст.
15 Megas
 
21.09.20
11:28
(7) Блин круто, жалко что слишком много ограничений. Но для простейших файлов пойдёт.
Закон Брукера: Даже маленькая практика стоит большой теории.