9 сент. 2012 г.

QlikView + 1С без 1С коннектора II

В предыдущем посте мы подключались из QlikView к 1С по COM-соединению. Сейчас рассмотрим обратное взаимодействие, подключимся из 1С к QlikView и загрузим данные.
Для экспериментов используем демо-базу 1С:Управление торговлей 11. Создаем новый документ QlikView, включаем возможность динамического обновления, скрипт загрузки настраиваем так же, как в прошлом примере.
Теперь некоторые дополнения:
Во первых, формируем строку SQL для всего объема данных. Это ускоряет загрузку, по сравнению с построчным формированием.
Во вторых, форматируем дату, числа и строки для SQL. В прошлый раз я на этом не заострял внимание, в итоге загружались не все данные.
Создаем обработку, пишем код:
&НаКлиентеНаСервереБезКонтекста
Функция sqlСтрока(Данные)
 Возврат "'" + Данные + "'";
КонецФункции 

&НаКлиентеНаСервереБезКонтекста 
Функция sqlЧисло(Данные)
 Возврат Формат(Данные, "ЧРД=.; ЧРГ=' '; ЧГ=0");
КонецФункции 

&НаКлиентеНаСервереБезКонтекста 
Функция sqlДата(Данные)
 Возврат Формат(Данные, "ДФ=dd.MM.yyyy");
КонецФункции 

&НаСервере
Функция ПолучитьSQLСтроку()
 
 Запрос = Новый Запрос;
 Запрос.Текст = 
  "ВЫБРАТЬ
  | НАЧАЛОПЕРИОДА(ВыручкаИСебестоимостьПродаж.Период, ДЕНЬ) КАК Период,
  | РегистрАналитикаУчетаПоПартнерам.Организация,
  | РегистрАналитикаУчетаПоПартнерам.Партнер КАК Партнер,
  | РегистрАналитикаУчетаНоменклатуры.Номенклатура,
  | СУММА(ВыручкаИСебестоимостьПродаж.Количество) КАК Количество,
  | СУММА(ВыручкаИСебестоимостьПродаж.СуммаВыручки) КАК Сумма,
  | СУММА(ВыручкаИСебестоимостьПродаж.Себестоимость) КАК Себестоимость
  |ИЗ
  | РегистрНакопления.ВыручкаИСебестоимостьПродаж КАК ВыручкаИСебестоимостьПродаж
  |  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаПоПартнерам КАК РегистрАналитикаУчетаПоПартнерам
  |  ПО ВыручкаИСебестоимостьПродаж.АналитикаУчетаПоПартнерам = РегистрАналитикаУчетаПоПартнерам.КлючАналитики
  |  ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.АналитикаУчетаНоменклатуры КАК РегистрАналитикаУчетаНоменклатуры
  |  ПО ВыручкаИСебестоимостьПродаж.АналитикаУчетаНоменклатуры = РегистрАналитикаУчетаНоменклатуры.КлючАналитики
  |
  |СГРУППИРОВАТЬ ПО
  | РегистрАналитикаУчетаПоПартнерам.Организация,
  | РегистрАналитикаУчетаПоПартнерам.Партнер,
  | РегистрАналитикаУчетаНоменклатуры.Номенклатура,
  | НАЧАЛОПЕРИОДА(ВыручкаИСебестоимостьПродаж.Период, ДЕНЬ)
  |
  |УПОРЯДОЧИТЬ ПО
  | Партнер,
  | Период
  |АВТОУПОРЯДОЧИВАНИЕ";

 sql_string = 
 "INSERT INTO * 
 |(Data, Firma, Partner, Tovar, Quantity, Summa, Cost) 
 |VALUES";
 ПерваяСтрока = Истина; 
 Результат = Запрос.Выполнить().Выбрать();
 Пока Результат.Следующий() Цикл
  
  sql_string = sql_string + ?(ПерваяСтрока, "", ", ") + 
  " (" + sqlДата(Результат.Период) + ", " + 
  sqlСтрока(Результат.Организация) + ", " + sqlСтрока(Результат.Партнер) + ", " + sqlСтрока(Результат.Номенклатура) + ", " + 
  sqlЧисло(Результат.Количество) + ", " + 
  sqlЧисло(Результат.Сумма) + ", " + 
  sqlЧисло(Результат.Себестоимость) + ")";
  
  ПерваяСтрока = Ложь;
  
 КонецЦикла;
 
 Возврат sql_string;
 
КонецФункции

&НаКлиенте
Процедура Подключить(Команда)
 
 sql_string = ПолучитьSQLСтроку();
 
 Qlik = Новый COMОбъект("QlikTech.QlikView");
 QlikDoc = Qlik.OpenDoc("d:\QlikView\myDocs\test1C.qvw");
 QlikDoc.DynamicUpdateCommand(sql_string);
 
КонецПроцедуры
 
Все, запускаем обработку. В результате, должен открыться QlikView с нашим документом, помещаем на лист нашу таблицу, если заранее этого не сделали. Готово, размещаем диаграммы по вкусу.

QlikView + 1С без коннектора

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

  1. а как достать из 1С табличные части документов и реестров?

    ОтветитьУдалить
  2. Вот здесь http://start1c.blogspot.ru/2012/10/1-qlikview.html я добавил в консоль запросов возможность выгрузки результата запроса в QlikView. Можно воспользоваться этим решением, либо адаптировать под свои задачи.

    ОтветитьУдалить
    Ответы
    1. спасибо! то есть этим способом нельзя добраться до табличных частей7

      Удалить
    2. Способ в этой статье - частный случай, в реализации для консоли запросов обобщенный вариант решения. Методика в обоих случаях одна и та же. Поэтому и решение в этом способе можно адаптировать под себя, либо воспользоваться консолью. Главное, создать запрос, собирающий в базе необходимые вам данные, в том числе, и по табличным частям документов.

      Удалить
    3. Связь с кликом через консоль запросов очень удобная вещь! Спасибо! Но с табличными частями не понятно!
      Вот запрос:
      ВЫБРАТЬ
      РеализацияТоваровУслуг.ДатаПлатежа as D,
      РеализацияТоваровУслуг.Контрагент.Наименование as Cl,
      РеализацияТоваровУслуг.Менеджер.Наименование as Man,
      РеализацияТоваровУслуг.Товары.Количество as Q
      ИЗ
      Документ.РеализацияТоваровУслуг КАК РеализацияТоваровУслуг

      Вместо количества товаров (Q) в результатирующую таблицу попадает значение "таблица значений"

      Удалить
    4. Потому что обращаешься в запросе к табличной части через ссылку.
      В твоем случае надо хотя бы сразу же к табличной части документа.

      ВЫБРАТЬ
      РеализацияТоваровУслугТовары.Ссылка.ДатаПлатежа,
      РеализацияТоваровУслугТовары.Ссылка.Контрагент.Наименование,
      РеализацияТоваровУслугТовары.Ссылка.Менеджер.Наименование,
      РеализацияТоваровУслугТовары.Количество
      ИЗ
      Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары

      Или же вытащить данные из нужного регистра.

      Удалить
    5. Все понятно! Прошу прощения за глупый вопрос, мало опыта работы с 1С. Спасибо =)

      Удалить
  3. Добрый день. Только начинаю знакомится с кликвью у меня сейчас иная задача. Из 1С прочитать файл формата кликвью. Как это можно сделать?

    Спасибо.

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