Имя: Пароль:
1C
1С v8
Тормоза при работе с переносом значений из 77 в 8.2 по OLE
0 zhenyat
 
28.01.13
14:10
Здравствуйте
Изучаю 8 - ку :)
Пришлось начать изучение сразу с обработки импорта данных из самописной конфы 7.7 в УПП на 8.2
Обе базы файловые.

Обработка работает, но остались вопросы:

Справочник Номенклатура. Почти 4000 элементов. Загружать надо не весь, а выборочно. Т.е. пользователи заполняют список для импорта выбранными элементами, а затем загружают по этому списку. Загрузка элементов справочника в таблицу значений для последующего выбора занимает примерно 1-2 минуты... Это очень долго!

Вот код:

ТекстЗапроса=
   "//{{ЗАПРОС(Сформировать)
   |Обрабатывать НеПомеченныеНаУдаление;
   |Код = Справочник.Номенклатура.Код;
   |Наименование = Справочник.Номенклатура.Наименование;
   |Штрихкод = Справочник.Номенклатура.Штрихкод;
   |Группировка Код Без Групп;
   |";//}}ЗАПРОС
   
   Запрос=База77.CreateObject("Запрос");
   Если Запрос.Выполнить(ТекстЗапроса)=0 Тогда
       ОбщегоНазначения.СообщитьОбОшибке("Ошибка выпонения запроса номенклатуры в базе-источнике");
       Возврат;
   КонецЕсли;
   
   Таблица = Новый ТаблицаЗначений;
   Таблица.Колонки.Добавить("Код",,,15);
   Таблица.Колонки.Добавить("Наименование",,,50);
   Таблица.Колонки.Добавить("Штрихкод",,,15);
   
   Пока Запрос.Группировка() Цикл
       
       Строка = Таблица.Добавить();
       Строка.Код = Запрос.Код;
       Строка.Наименование = Запрос.Наименование;
       Строка.Штрихкод = Запрос.Штрихкод;
       
   КонецЦикла;


Тормозит именно цикл заполнения таблицы значений "Таблица". При чем когда запрос выбирал сами объекты (Справочник.Номенклатура.ТекущийЭлемент) - цикл работал еще медленнее...

В итоге выкрутилась тем что вместо заполнения таблицы и последующим выбором из нее, запрашиваю у пользователя код номенклатуры, по этому коду нахожу элемент в 7.7 и заполняю список для импорта данными этого элемента.

Но осадочек остался - может все-таки есть какие-то способы быстрого заполнения таблицы или дерева значений в 8-ке данными из базы 7.7 по OLE?
1 Бешеная Нога
 
28.01.13
14:13
еще как вариант попробовать выгрузить результат запроса в таблицу значений и работать с ней
2 Ork
 
28.01.13
14:14
(0) "Пока Запрос.Группировка() Цикл"

Не верю...
3 Ёпрст
 
28.01.13
14:18
Строка = Таблица.Добавить();
тем более
4 dk
 
28.01.13
14:21
Группировка Код Без Групп
сурово
-------

   |Обрабатывать НеПомеченныеНаУдаление;
   |Код = Справочник.Номенклатура.Код;
   |Ссылка = Справочник.Номенклатура.ТекущийЭлемент;
   |Наименование = Справочник.Номенклатура.Наименование;
   |Штрихкод = Справочник.Номенклатура.Штрихкод;
   |Группировка Ссылка Без Групп;

---
Для ускорения можешь выгрузить в ТЗ и перебрать ТЗ 7-ное

ТЗ = 0;
Запрос.Выгрузить(ТЗ, 1, 0);
ТЗ.ВыбратьСтроки();
Пока ТЗ.ПолучитьСтроку() > 0 Цикл
  ...
5 Popkorm
 
28.01.13
14:32
(0) может все таки так:
Запрос.Группировка(1)
6 zhenyat
 
28.01.13
18:40
(5) Когда группировка одна смысл указывать ее номер?
Тем более что сам запрос выполняется практически мгновенно

(1)(4) Пробовала и выгружать сначала в ТЗ - без особой разницы :(

(2)(3) Что вас смущает в приведенном коде?
7 zladenuw
 
28.01.13
18:44
(0) я бы это дело в файл. а потом с уппырища читал бы. в разы быстрее было бы.
8 Галахад
 
гуру
28.01.13
18:46
Не пойму в чем проблема? 1-2 минуты. Ну не так уж и долго.
9 zladenuw
 
28.01.13
18:47
(8) хотят сразу. а ком он долгий. я тоже гнался за ним. потом плюнул использую КД и обмен через файл. в разы быстрее. и проще править :)
10 Галахад
 
гуру
28.01.13
18:51
(9) Так (0) как я понял нужна интерактивность. Пользогвтель галочки ставит. А затем переносит.
Хотя. Можно было и признак какой-нибудь организовать в семерке.
11 zladenuw
 
28.01.13
18:53
(10) в 7 выбрала. нажала выгрузить. алт+таб на 8. там кнопку загрузить. опля 5 секунд. быстрее ?
12 Галахад
 
гуру
28.01.13
18:55
(11) Не. Я не про то. У (0) не все объекты выгружаются, а по какому-то признаку. А для его проставления и нужно получить список из 4000 позиций.
13 zladenuw
 
28.01.13
19:08
(12)она заполняет все позиции в тз, уже из тз пользователь выбирает нужное, не проще будет и быстрее выбирать нужное в 7 и выгружать. а загрузчик можно на фоновое задание сделать.
14 Fragster
 
гуру
28.01.13
19:17
заполнитьЗначенияСвйоств()
15 Fragster
 
гуру
28.01.13
19:18
ну и выкинуть стандартный запрос, запилить на прямом запросе
16 Fragster
 
гуру
28.01.13
19:19
или вообще подцепиться к 7.7 как к внешнему источнику данных или через ADO...
17 zladenuw
 
28.01.13
19:21
(15) тормоз в заполнение тз в приемнике. 8 же не хапает тз 7.
18 zladenuw
 
28.01.13
19:21
(16) блин а я так не пробовал. а как через адо к 7 ?
19 H A D G E H O G s
 
28.01.13
19:32
(18) Либо к табличке SQL, либо к dbf, но это зло.
Проще запилить процедуру в 7.7, которая в csv выгрузит.
20 Ork
 
28.01.13
19:34
(6)

"(2)(3) Что вас смущает в приведенном коде?"

А он в семерке выдаст ошибку. Всмысле писать нужно :
Пока Запрос.Группировка(<НомерГруппировки>) < = 1 >.
21 Тьма
 
28.01.13
19:35
(20)Этот код в восьмерке выполняется. То же для (3)
22 Fragster
 
гуру
28.01.13
21:34
(17) сделай замер:

   Пока Запрос.Группировка() Цикл

       Строка = Таблица.Добавить();

       Код                 = Запрос.Код;
       Наименование        = Запрос.Наименование;
       Штрихкод            = Запрос.Код;

       Строка.Код          = Код;
       Строка.Наименование = Наименование;
       Строка.Штрихкод     = Штрихкод;
       
   КонецЦикла;
23 Fragster
 
гуру
28.01.13
21:46
если медленнее первые строки - то прямой запрос, если вторые - то заполнитьзначениясвойств чуть поможет. но вообще - дальше же что-то с этой ТЗ происходит? может имеет смысл от нее избавиться...
24 zhenyat
 
29.01.13
15:08
(9) (11) (13) Наверное так (выгрузка из 7 в файл - загрузка в 8 из файла) было бы проще и быстрее... Не ожидала что OLE так тормозить будет...
(22) (23) Честно говоря пока еще не понимаю как в ЗаполнитьЗначенияСвойств в качестве Источника передать не строку таблицы а что-то другое...
25 Fragster
 
гуру
29.01.13
15:13
(24) что говорит замер?
26 zhenyat
 
29.01.13
18:19
(25) Медленнее первые строки:

       Код                 = Запрос.Код;
       Наименование        = Запрос.Наименование;
       Штрихкод            = Запрос.Код;


Когда используется выгрузка в ТЗ - этот же код чуть чуть побыстрее...
27 Serginio1
 
29.01.13
18:31
Лучше из 7 ки вызывать 8 ку через COMConnector
с использованием внешней обработки для использования процедур специально написанных на 8 ке

v8: Можно ли по OLE выполнять запросы из 1с 7.7 в 1с 8.2
28 Fragster
 
гуру
29.01.13
18:32
(26)->(23). прямой запрос.
29 zhenyat
 
29.01.13
18:34
(28) можете подсказать где и что по этому поводу почитать?
30 Serginio1
 
29.01.13
18:35
Либо использовать внешний отчет уже в 7 ке v8: Как выполнить процедуру внешней обработки через OLE
(29) Смотри 1С++
31 Fragster
 
гуру
29.01.13
18:42
(29) самый дубовый способ - смотри в файле .dd в каком файле и в каких полях лежат нужные тебе данные и юзай напрямую .dbf вообще без 7.7
32 Serginio1
 
29.01.13
18:44
33 Fragster
 
гуру
29.01.13
18:47
ну да, есть смысл заюзать (32)
34 zhenyat
 
29.01.13
18:49
(32) Спасибо, попробую
35 Serginio1
 
29.01.13
19:04
(34) На 8 ке не тестил, а на семерке такой код рабочий
ТекстЗапроса = "
       |SELECT top 20 Номенклатура.ID ИД
       |,Номенклатура.Descr Наименование
       |FROM $Справочник.Номенклатура AS Номенклатура With (NOLOCK) ";
           
       рс = СоздатьОбъект("ODBCRecordset");
   Сообщить(рс.Открыть(ТекстЗапроса));
   Сообщить(рс.ВыборкаОткрыта());
     Если рс.ВыборкаОткрыта() =1 Тогда  
          рс.ВНачало();
          Сообщить(рс.Конец());
          Сообщить(рс.КолвоПолей());
          Для сч=1 по рс.КолвоПолей() Цикл
             Сообщить(рс.ПолучитьПараметрыПоля(сч));
         КонецЦикла;
         Сообщить(рс.Конец());
         Сч=0;
     Пока рс.Конец()=0 Цикл
         Сч=Сч+1;
         Сообщить(сч);
         Сообщить("ИД="+рс.ПолучитьЗначение(1)+" Наим="+рс.ПолучитьЗначение("Наименование"));
         рс.След();
     КонецЦикла;
  КонецЕсли;
      рс.Закрыть();
Основная теорема систематики: Новые системы плодят новые проблемы.