8.2 Менеджер Временных Таблиц

Тема в разделе "1C и всё что с ней связано", создана пользователем tanat, 11 сен 2012.

  1. tanat

    tanat Well-Known Member

    Регистрация:
    2 мар 2007
    Сообщения:
    265
    Симпатии:
    0
    Легенда:
    гружу данные из экселевского файлика, где по трем страницам разбросаны данные. Во всех трех таблицах есть поле "контрагент", по которому их можно объединить.
    С чтением данных проблем нет. Все отлично читается. А вот "склеить" эти три таблицы - геморрой.
    Делаю через менеджер временных таблиц, положившись на суждение, что через него будет быстрее, чем через перебор строк таблиц.
    Делаю через левое соединение по полю "Контрагент". Все поля в таблице - строковые. Колонки таблиц типизированы: Строка с длиной 1024 символа.

    Запрос выглядит примерно так:
    //1ая таблица
    ЗАпрос = Новый ЗАпрос;
    ЗАпрос.ТЕкст ="Выбрать Таблица.* Поместить ТаблицаКонтрагентов из &Таблица как Таблица";
    Запрос.УстановитьПараметр("Таблица",ТАблица);
    ЗАпрос.Выполнить;

    //Выполняется, не виснет. Дальше вторая и третья таблица

    ЗАпрос.ТЕкст ="Выбрать Таблица2.* Поместить ТаблицаЗаметок из &Таблица2 как Таблица2";
    Запрос.УстановитьПараметр("Таблица",ТАблица);
    ЗАпрос.Выполнить;

    ЗАпрос.ТЕкст ="Выбрать Таблица3.* Поместить ТаблицаСобытий из &Таблица3 как Таблица3";
    Запрос.УстановитьПараметр("Таблица",ТАблица);
    ЗАпрос.Выполнить;
    // тоже все хорошо выполнилось. теперь основной зарпос

    Запрос.Текст = "Выбрать ТАблицаКонтрагентов.*,
    | ТаблицаЗаметок.Заметки как заметки,
    |ТаблицаСобытий.События как события
    | Из
    | ТабилцаКонтрагентов
    | Левое Соединение ТАблицаЗАметок как таблицаЗАметок По ТАблицаКонтрагентов.Контрагент = ТАблицаЗАметок.Контрагент
    | ЛЕвое соединение ТАблицаСобытий как таблицаСобытий по ТАблицаКонтрагентов.Контрагент = ТАблицаСобытий.Контрагент";

    РЕзультат = ЗАпрос.Выполнить().Выгрузить();
    //И вот тут все виснет к е..еням собачим. Причем на тестовом примере с 250 записями все хорошо работает. а на 10 тыс записях в каждой таблице все виснет.

    Есть у кого какие соображения? Почему никаких признаков жизни этот зверь не подает?
     
  2. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    "| ТабилцаКонтрагентов" - Очепятка?

    я так умаю что на выходе будет поболе 100000 тыс строк - может нпоролись на ограничение рекордсета.

    попробуйте исключить таблицу заметок или событий - интересно понять запашет ли...
     
  3. tanat

    tanat Well-Known Member

    Регистрация:
    2 мар 2007
    Сообщения:
    265
    Симпатии:
    0
    "| ТабилцаКонтрагентов" - Очепятка?

    Она самая, писал по памяти в рабочем угаре. в Коде ошибок нет. проверял.

    На выходе должно получиться не более 10 тыс строк. Т.к. в каждой таблице - 9730 с одинаковыми значениями в колонке "Контрагент". Как я понимаю, левым джоином получим таблицу 1 с доп. колонками "заметки" и "события".

    Попробую исключить, обязательно отпишусь о результатах.

    Но на данный момент я крайне разочарован в этом механизме(. Жалкие 3 таблицы с 10 тыс. строк в каждой не можем обработать ((.

    Да, уточню: это клиент-сервер. Управляемое приложение. Процедура "склейки" - выполняется на сервере.

    Кстати, вопрос не по теме: я, когда считываю данные из файла, потом закрываю эксель через .Application.Quit();
    И у меня вылазит сообщение экселя: бла бла бла файл изменен. желаете сохранить? Как от этого избавиться? В файле кодом ничего не меняю, не понимаю даже, откуда эти изменения берутся....
     
  4. puh14

    puh14 Well-Known Member
    1C Team

    Регистрация:
    11 июл 2008
    Сообщения:
    1.412
    Симпатии:
    0
    Файл.ActiveWorkbook.Close() - где Файл = Новый ComОбъект("Excel.Application");

    Кстати - какая максимальная длина текстового поля в вашей версии скуля? на 2000 было 254 символа, а у вас 1024
     
  5. Дайнеко

    Дайнеко Well-Known Member
    1C Team

    Регистрация:
    19 ноя 2009
    Сообщения:
    951
    Симпатии:
    0
    Это может быть, когда файл:
    - созданный в старой версии открывается в новой.
    - в файле есть формулы, его модифицирующие. Например Текущая дата (названия не помню)
    Короче, все это видно при обычном открытии.
     
  6. Darlock

    Darlock Well-Known Member
    1C Team

    Регистрация:
    4 янв 2008
    Сообщения:
    558
    Симпатии:
    0
    "Например Текущая дата (названия не помню)"

    Функция - "СЕГОДНЯ()".

    А по сабжу.... вопрос 1: зачем менеджр временных таблиц нужен, если вы можете использовать пакеты запросов и шустрее и память не жрет на хранение вирт.таблицы.
    И второй момент... думаю у вас все виснет когда для каждой строки из таблицы 1 происходит левое соединение с таблице 2. Насколько понял контрагент у вас один и тот же. а дальще считайте сами 9730 * 9730... сколько?
     
Загрузка...

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