8.х Двумерный массив в ТЗ

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 8"", создана пользователем NovInNik, 17 мар 2016.

  1. TopicStarter Overlay
    NovInNik
    Offline

    NovInNik Опытный в 1С

    Регистрация:
    12 ноя 2007
    Сообщения:
    194
    Симпатии:
    1
    Баллы:
    29
    Здравствуйте!
    Беру данные из Excel и получаю двумерный массив с помощью
    Лист.UsedRange.Value.Выгрузить();
    Но вот как его обойти, чтобы все это преобразовать в ТЗ. Простым перебором строк и колонок получаю текущее значение массива, а вот как создать "заголовок шапки", и заполнить остальными данными построчно, не получается.
    Спасибо.
  2. nbIpKuH_BaH9I
    Online

    nbIpKuH_BaH9I Модераторы Команда форума Модератор

    Регистрация:
    16 сен 2009
    Сообщения:
    6.979
    Симпатии:
    397
    Баллы:
    104
    Мне кажется Вы делаете двойную работу. Excel из 1С очень туго обрабатывается.
    Вот Вам мой код обработки
    Код:
    Процедура ЗагрузкаИзExcel(ИмяФайла) Экспорт
    
        Попытка
            // Загрузка Microsoft Excel
            Состояние("Загрузка Microsoft Excel...");
            ExcelПриложение = Новый COMОбъект("Excel.Application");
        Исключение
            Сообщить("Ошибка при загрузке Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
            Возврат;
        КонецПопытки;
        Попытка
            // Открытие файла Microsoft Excel
            Состояние("Открытие файла Microsoft Excel...");
            ExcelФайл = ExcelПриложение.WorkBooks.Open(ИмяФайла);
        Исключение
            Сообщить("Ошибка открытия файла Microsoft Excel." + ИмяФайла + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
        КонецПопытки;
        Попытка
            // Обработка файла Microsoft Excel
            Состояние("Обработка файла Microsoft Excel...");
            // Читаем данные первого листа книги
            ExcelЛист = ExcelФайл.Sheets(1);
            // Определить количество строк и колонок выбранного листа книги Excel
            xlCellTypeLastCell = 11;
            ExcelПоследняяСтрока = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Row;
            ExcelПоследняяКолонка = ExcelЛист.Cells.SpecialCells(xlCellTypeLastCell).Column;
        Исключение
            Сообщить("Ошибка открытия листа №1 Microsoft Excel." + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
            // Закрыть COM соединение для экономии памяти
            ExcelПриложение.Quit();
        КонецПопытки;
    
        Для Строка = 1 По ExcelПоследняяСтрока Цикл
            // Обработка нажатия Ctrl + Break
            ОбработкаПрерыванияПользователя();
            Попытка
                // здесь запихивайте все в тз
                Наименование     = СокрЛП(ExcelЛист.Cells(Строка, 1).Value);
                РозничнаяЦена    = СокрЛП(ExcelЛист.Cells(Строка, 2).Value);
                ЕдиницаИзмерения = СокрЛП(ExcelЛист.Cells(Строка, 3).Value);
               
               
               
               
               
               
               
            Исключение
                // Не редко происходит ошибка конвертации отдельной ячейки документа
                Сообщить("Ошибка чтения строки файла Microsoft Excel." + Строка + Символы.ПС + ОписаниеОшибки(), СтатусСообщения.Внимание);
            КонецПопытки;
            // Отобразить информацию о ходе выполнения обработки
            Состояние("Обработка файла Microsoft Excel : "
            + "строка " + Строка + " из " + ExcelПоследняяСтрока);
        КонецЦикла;
        // Закрыть COM соединение для экономии памяти
        ExcelПриложение.Quit();
    
    КонецПроцедуры // ЗагрузкаИзExcel()
  3. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Бегать по строкам/колонкам - очень долго, гораздо быстрее выделить нужную область и получить все значения этой области в виде массива массивов.

    В ТЗ оно превращается просто:

    Код:
    Для Каждого ТекСтрока ИЗ МассивМассивов[0] Цикл
    НСтр = ТЗ.Добавить();
    КонецЦикла;
    
    СчКолонок = 0;
    Для Каждожого ТекКолонка Из ТЗ.Колонки Цикл
    ТЗ.ЗагрузитьКолонку(ТекКолонка.Имя, МассивМассивов[СчКолонок]);
    КонецЦикла;
    Писал на коленке, соориентироваться на месте/отладить придется самостоятельно :)
  4. TopicStarter Overlay
    NovInNik
    Offline

    NovInNik Опытный в 1С

    Регистрация:
    12 ноя 2007
    Сообщения:
    194
    Симпатии:
    1
    Баллы:
    29
    Я тоже пытаюсь сделать с помощью массива массивов. А разве в ТЗ сначала не колонки формируются, а потом строки?
    nomad_irk по Вашему примеру не попадает во второй цикл.
  5. nomad_irk
    Online

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.549
    Симпатии:
    716
    Баллы:
    204
    Естественно, нужно сформировать колонки в ТЗ, можно сделать это автоматически по количеству элементов массива, получаемого из ComSafeArray.

Поделиться этой страницей