10 янв. 2013 г.

Получение данных из таблицы QlikView

Продолжая изучать API QlikView, меня заинтересовала возможность получения данных из таблиц (объект TableBox) напрямую, по COM-соединению. Раз когда-то понадобилось получение данных из Excel, то и подобный вариант может кого-то заинтересовать. Покопавшись в документации, нашел два способа получения данных из этих объектов. Пример для управляемого приложения.

Допустим, у нас на листе находится простая таблица с ID "TB01". Попробуем в 1С получить из нее данные. Сначала рассмотрим классический обход по ячейкам, похоже на обход листа Excel:

&НаКлиенте
Процедура Команда1(Команда)
 
 Qlik = Новый COMОбъект("QlikTech.QlikView");
 QlikDoc = Qlik.OpenDoc("d:\test1C\test1c.qvw"); 

 ТаблицаКлик = QlikDoc.GetSheetObject("TB01");
 
 ВысотаТаблицы = ТаблицаКлик.GetRowCount();
 ШиринаТаблицы = ТаблицаКлик.GetColumnCount();
 
 Для ТекСтрока = 0 По ВысотаТаблицы - 1 Цикл
  Для ТекКолонка = 0 По ШиринаТаблицы - 1 Цикл
   Ячейка = ТаблицаКлик.GetCell(ТекСтрока, ТекКолонка);
   ТекстЯчейки = СокрЛП(Ячейка.Text);
   //...прочие команды
  КонецЦикла;
 КонецЦикла;
 
КонецПроцедуры
 
Данная процедура довольно затратна по времени по сравнению со следующим способом. Сделаем тоже самое с помощью команды GetTableAsText. Эта команда выгружает всю таблицу сразу в текст, что дает преимущество в скорости выполнения.

&НаКлиенте
Процедура Команда2(Команда)
 
 Qlik = Новый COMОбъект("QlikTech.QlikView");
 QlikDoc = Qlik.OpenDoc("d:\test1C\test1c.qvw"); 
 
 //преобразуем таблицу в текст, разделитель - символ табуляции
 //1 - с заголовками, 0 - без заголовков
 //в данном примере заголовки понадобятся для создания колонок в таблице значений
 ТекстКлик = QlikDoc.GetSheetObject("TB01").GetTableAsText(1);
 
 ЗаполнитьТаблицуСервер(ТекстКлик);
 
КонецПроцедуры

&НаКлиентеНаСервереБезКонтекста
Функция ПолучитьДанныеСтроки(Текст, НомерСтроки)
 
 мСтрока = СтрПолучитьСтроку(Текст, НомерСтроки);
 мСтрока = СтрЗаменить(мСтрока, Символы.Таб, Символы.ПС);
 
 Возврат мСтрока;
 
КонецФункции

&НаСервере
Процедура ЗаполнитьТаблицуСервер(ТекстКлик)

 КолСтрок = СтрЧислоСтрок(ТекстКлик);
 
 Если КолСтрок <= 1 Тогда
  Возврат;
 КонецЕсли;
 
 ТЗ = Новый ТаблицаЗначений;
 мСтрока = ПолучитьДанныеСтроки(ТекстКлик, 1);
 Для Сч = 1 По СтрЧислоСтрок(мСтрока) Цикл
  мКолонка = СтрПолучитьСтроку(мСтрока, Сч);
  ТЗ.Колонки.Добавить(СтрЗаменить(мКолонка, " ", ""), , мКолонка);
 КонецЦикла;
 
 Для Сч = 2 По КолСтрок Цикл
  СтрТЗ = ТЗ.Добавить();
  мСтрока = ПолучитьДанныеСтроки(ТекстКлик, Сч);
  Для мКол = 1 По СтрЧислоСтрок(мСтрока) Цикл
   СтрТЗ[мКол - 1] = СтрПолучитьСтроку(мСтрока, мКол);
  КонецЦикла;
 КонецЦикла;
 
 //...прочие команды
 
КонецПроцедуры // ЗаполнитьТаблицуСервер()

Пример обработки

9 комментариев:

  1. а зачем это может понадобиться?
    зачем в транзакционую систему грузить данные из системы для анализа 0_о

    ОтветитьУдалить
    Ответы
    1. Пользователь может хотеть странного )
      Например, на одной из предыдущих работ торговый аналитик
      делал хитрый анализ в Excel, а потом результат грузился в
      1С для план-факт анализа.

      Удалить
  2. {ВнешняяОбработка.ВнешняяОбработка1.Форма.Форма.Форма(12)}: Ошибка при вызове конструктора (COMОбъект)
    Qlik = Новый COMОбъект("QlikTech.QlikView");
    по причине:
    -2147221005(0x800401F3): Недопустимая строка с указанием класс

    ОтветитьУдалить
  3. Все норм. установил приложение "QlikView"

    ОтветитьУдалить
  4. &НаСервереБезКонтекста
    Процедура ТребуетсяВызовИнициализатораНаСервере()

    ПолучитьДанныеТаблицКликВью();

    КонецПроцедуры

    &НаКлиентеНаСервереБезКонтекста
    Процедура ПолучитьДанныеТаблицКликВью()

    Qlik = Новый COMОбъект("QlikTech.QlikView");

    //дальше пример получения потексту из статьи

    КонецПроцедуры

    &НаКлиенте
    Процедура Команда1(Команда)

    Если ИнициализацияНаСервере Тогда
    ТребуетсяВызовИнициализатораНаСервере();
    Иначе
    ПолучитьДанныеТаблицКликВью();
    КонецЕсли;

    КонецПроцедуры


    Вот пример инициализации с выбором на стороне сервера или клиента. На форму помещаете булевый реквизит "ИнициализацияНаСервере". Дает пользователю определение зависимости где установлено само приложение КликВью чтобы не получить ошибку "по причине:
    -2147221005(0x800401F3): Недопустимая строка с указанием класс"

    ОтветитьУдалить
  5. Подскажите пожалуйста. У меня задача следующая. Имея файлы с типом qvd я могу 1С прочитать из него данные?

    ОтветитьУдалить
  6. QlikDoc.GetSheetObject("TB01") . Как узнать Имя таблицы?

    ОтветитьУдалить