8.х Загрузка из dbf не в цикле

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

  1. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Всем счастья. Ребят, есть ли возможность загрузить данные из файла dbf не построчно? Т.е. не в цикле?
  2. alexburn
    Offline

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Только если двух-ходовочкой через эксель :)
    А почему цикл не устраивает ?
  3. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    700000 строк :)
    --- Объединение сообщений, 25 май 2016 ---
    Ребят, давайте тогда по-другому. Прошу поделиться опытом. Вот прикрепляю обработку. Гляньте плиз. Может кто скажет недочеты.
    Задача. Есть файл dbf. В нем около 700 000 строк. Происходит следующее. Грузится файл. Результат помещается во временную таблицу. Потом проверяется с имеющейся номенклатурой в базе. И если есть новые, они создаются. Если есть изменения, то они меняются. И создаются документы установки цен.
    Сам файл в память грузится минут за 10. Это приемлемо. Но вот потом обработка идет очень медленно. Прошу совета.

    Вложения:

  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

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

    Код:
    |ВЫБРАТЬ РАЗЛИЧНЫЕ
       |   ВТ_Загружено.TNR_Артикул,
       |   МАКСИМУМ(ВТ_Загружено.BENEN_НемецкоеНаименование) КАК BENEN_НемецкоеНаименование
    Это конечно жесть. Имхо проще на этапе формирования ТЗ отсекать дубли по артикулу.


    Это я бы тоже переделал и как минимум индексировал те поля, по которым идет отбор во временной таблице:
    Код:
    |ГДЕ
       |   (НЕ ВТ_ЗагруженоСAccess.BENEN2_РусскоеНаименование = ВЫБОР
       |           КОГДА ВТ_НоменклатураСЦенами.НаименованиеПолное = ""Пустое наименование""
       |             ТОГДА """"
       |           ИНАЧЕ ВТ_НоменклатураСЦенами.НаименованиеПолное
       |         КОНЕЦ
       |       ИЛИ НЕ ВТ_ЗагруженоСAccess.MCODE_МаркетинговыйКод = ВТ_НоменклатураСЦенами.МаркетинговыйКод
       |       ИЛИ НЕ ВТ_ЗагруженоСAccess.TA_ГруппаСкидок = ВТ_НоменклатураСЦенами.ГруппаСкидок
       |       ИЛИ НЕ ВТ_ЗагруженоСAccess.RUBNDS_ЦенаСНДС = ВТ_НоменклатураСЦенами.Цена)
    Разбил по каждому условию на отдельный запрос и объединил бы эти запросы в финале.

    Вообще условие вида ИЛИ НЕ - очень извращенное в плане понимания, что же должно стать результатом запроса.

    Ну и совсем уж хорошо будет, если процедуры создания и изменения номенклатуры будут выполнятся в одной итерации, т.е. запросом будет выгребаться вся существующая номенклатура, если номенклатуры нет - создаем, если есть обновляем данные из *.dbf.
    Последнее редактирование: 25 май 2016
    nbIpKuH_BaH9I нравится это.
  5. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    Вариант добрый: Костя, у тебя больше полумиллиона строк, которые ты обрабатывать еще пытаешься, вы, батенька, зажрались :)
    Вариант злой: в зависимости от сервера баз данных (ты ж не в файловой это делаешь ;)), для MSSQL - SSIS или bcp (для него надо будет сначала в csv перегнать), заливка данных напрямую в специально для этого предназначенный регистр сведений. Дальше будет проще.
    nbIpKuH_BaH9I нравится это.
  6. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    nomad_irk, запрос как раз отрабатывает быстро :). Проблема в самой обработке строк.
    nickpugachev, не вариант. Делается естественно на SQL версии, но все равно на клиентском компе. Прикол в том, что я этого делать не собираюсь. Это делает менеджер. Сейчас она грузит это через другую обработку. Там вообще сутками все делается. А эту обработку писал я. Она делает все быстрее. Но мне просто сейчас надо отладить одну хрень и меня напрягает ждать. Вот и решил спросить :).
    Загрузка данных из файла и выполнение запросов выполняется сравнительно быстро. Долго выполняется сама обработка, т.е. запись уже в базу данных. Коль, не понял прикола с регистром вообще. Все равно придется потом обрабатывать справочник номенклатуры.
  7. nickpugachev
    Offline

    nickpugachev Профессионал в 1С Команда форума

    Регистрация:
    28 май 2012
    Сообщения:
    3.266
    Симпатии:
    131
    Баллы:
    104
    с регистром прикол в том, что ты сразу получишь индексированную по нужным полям таблицу в базе, с которой запросами уже поработать будет проще.
    можно в тот же регистр вливать данные обработкой из dbf как набор записей без отбора
    --- Объединение сообщений, 25 май 2016 ---
    а дальше - отдаться по максимуму в пакетный запрос
  8. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Пакетный запрос то обрабатывается быстро.
  9. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    замер производительности чего говорит про код без учета выполнения запросов?
  10. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Ты видел сколько записей в базу идет?! :)
  11. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    7.548
    Симпатии:
    716
    Баллы:
    204
    Ну так а чего ты ждешь от базы, что она тебе прям всосет 700к строк, да еще и проверить это твоим кодом за секунды? :)
  12. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Ну не за секунды уж. Просто может оптимизировать можно как то :)
  13. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    стр. 651 НоваяСтрока.ЕдиницаИзмерения = ВыборкаРезультатаЗапроса.Ссылка.ОсновнаяЕдиницаИзмерения;
    меняй. запрос в цикле.


    Везде где встречается вызов УстановитьЗначениеДополнительныхРеквизитов() - также запрос в цикле, меняй.
    Не надо каждый раз искать по наименованию свойство, найди и запомни все что нужно один раз до всех циклов.
    nbIpKuH_BaH9I нравится это.
  14. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    на скорость думаю особо не повлияет, но там по коду (со стр. 619 и ниже) есть 3 условия типа ВыборкаРезультатаЗапроса.НаименованиеПолное = ВыборкаРезультатаЗапроса.BENEN2_РусскоеНаименование.
    Ты фактически 2 раза выполняешь одни и те же действия: первый раз в самом запросе сравниваешь, а второй раз при обработке результата запроса уже в коде.
    В выборку просто вывести булевые поля результата сравнения и используй их.
    Кроме того, в таком виде как у тебя - там потенциальный баг, насколько понимаю, поскольку в запросе у тебя сравнение идет CI, а потом в коде когда обрабатываешь уже CS.
  15. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Так, во с этими терминами я не знаком. Поясни пожалуйста?
  16. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104
    в запросе у тебя сравнение строк идет без учета регистра, в коде, когда ты просто пишешь Строка1 = Строка2 сравнение идет с учетом регистра символов.
  17. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    А как это влияет на быстродействие? И в чем конкретно баг? Поставить ВРЕГ?
  18. shurikvz
    Offline

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

    Регистрация:
    1 окт 2009
    Сообщения:
    8.409
    Симпатии:
    316
    Баллы:
    104

    В том что у тебя не перезаполнится наименование номенклатуры в случае если новое и старое наименование различаются только регистром символов. Не зная бизнес-процесса я не могу сказать насколько это критично. Как бы то ни было - оставлять такую неоднозначность ИМХО не стоит.


    Ну можно и так. Лучше на мой взгляд:
    nbIpKuH_BaH9I нравится это.
  19. TopicStarter Overlay
    nbIpKuH_BaH9I
    Offline

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

    Регистрация:
    16 сен 2009
    Сообщения:
    6.977
    Симпатии:
    397
    Баллы:
    104
    Понял. Спасибо.

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