[РЕШЕНО] Обработка номенклатуры работает очень долго

Тема в разделе "Отчеты и обработки для "1С:Предприятие 8"", создана пользователем Zenma, 2 фев 2017.

  1. TopicStarter Overlay
    Zenma
    Offline

    Zenma

    Регистрация:
    18 ноя 2016
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте, есть обработочка, призванная поменять 1 реквизит у элементов справочника НОменклатуры в 1с:ERP

    Собственно есть таблица значений из 4 столбцов, в которых заполнены группы и подгруппы, в которых сидят элементы номенклатуры. Я эту ТЗ помещаю в запрос, присоединяю таблицу номенлатуры и в каждом элементе, который совпал по родителю и родителю родителя меняю реквизит Товарная Категория. Эта обработка обрабатывает 1800 элементов за 15 минут. Это норма или я какую-то фигню сделал, поэтому и так медленно?
    Буду благодарен за любую помощь, спасибо.

    Вот текст:


    Код:
    Запрос = Новый Запрос;
        Запрос.Текст =
                "ВЫБРАТЬ
                |    ТаблицаЗначений.Тип КАК Тип,
                |    ТаблицаЗначений.Группа КАК Группа,
                |    ТаблицаЗначений.Гравировка КАК Гравировка,
                |    ТаблицаЗначений.Кладовая КАК Кладовая
                |ПОМЕСТИТЬ ТаблицаЗначений
                |ИЗ
                |    &ВнешняяТЗ КАК ТаблицаЗначений
                |;
                |
                |////////////////////////////////////////////////////////////////////////////////
                |ВЫБРАТЬ
                |    Номенклатура.Ссылка,
                |    Номенклатура.Родитель,
                |    Номенклатура.Родитель.Родитель КАК ПраРодитель,
                |    Номенклатура.ТоварнаяКатегория,
                |    ТаблицаЗначений.Кладовая,
                |    ТаблицаЗначений.Гравировка
                |ИЗ
                |    Справочник.Номенклатура КАК Номенклатура
                |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаЗначений КАК ТаблицаЗначений
                |        ПО Номенклатура.Родитель.Наименование = ТаблицаЗначений.Группа
                |            И Номенклатура.Родитель.Родитель.Наименование = ТаблицаЗначений.Тип";
    
     
        Запрос.УстановитьПараметр("ВнешняяТЗ", ТабНП);
         
        РезультатЗапроса = Запрос.Выполнить();
     
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
     
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Если НЕ ЗначениеЗаполнено(ВыборкаДетальныеЗаписи.ТоварнаяКатегория) тогда
                НоменклатураДляПроставленияТК = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
                НоменклатураДляПроставленияТК.ТоварнаяКатегория = Справочники.ТоварныеКатегории.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Кладовая);
                НоменклатураДляПроставленияТК.Записать();
            КонецЕсли;
    
        КонецЦикла;
  2. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.286
    Симпатии:
    968
    Баллы:
    204
    Запрос сколько по времени выполняется из этих 15 минут?

    Заполненость категории можно сразу в запросе выполнять, как и узнать товарную категорию.
    Zenma нравится это.
  3. Yuriy_Alexandrovich
    Offline

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

    Регистрация:
    15 сен 2011
    Сообщения:
    1.349
    Симпатии:
    87
    Баллы:
    54
    В запрос добавьте условие по товарной категории "ГДЕ Номенклатура.ТоварнаяКатегория = ЗНАЧЕНИЕ(Справочник.ТоварныеКатегории.ПустаяСсылка)"
    Это отсечет часть записей в выборке, и их не нужно будет определять в цикле обхода запроса
    --- Объединение сообщений, 2 фев 2017 ---
    поскольку "Справочники.ТоварныеКатегории.НайтиПоНаименованию(ВыборкаДетальныеЗаписи.Кладовая);" не меняется в цикле, выноси его за цикл,
    таким образом сократишь количество обращений к бд в 1800 раз :)
    Последнее редактирование: 2 фев 2017
    Zenma нравится это.
  4. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.286
    Симпатии:
    968
    Баллы:
    204
    Так понимаю, кладовая может быть разной :)
    Zenma и Yuriy_Alexandrovich нравится это.
  5. Yuriy_Alexandrovich
    Offline

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

    Регистрация:
    15 сен 2011
    Сообщения:
    1.349
    Симпатии:
    87
    Баллы:
    54
    Да, проглядел
    --- Объединение сообщений, 2 фев 2017 ---
    В этом случае нужно внести эту таблицу в запрос
    Zenma нравится это.
  6. TopicStarter Overlay
    Zenma
    Offline

    Zenma

    Регистрация:
    18 ноя 2016
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    запрос обрабатывает
    Была такая мысль, но подумал, что раз в номенклатуре нет заполненных этих полей, то и нафиг не надо.
    Щас добавил, спасибо)
    --- Объединение сообщений, 3 фев 2017 ---

    добавил условие, спасибо.
    по поводу товарных категорий - у меня они в таблице значений, вернее, там строка, по которой я их ищу в таблице))
    Строка - так как входные данные тяну из ексельчика, который заполняли люди, которым пофигу, как я буду анализировать данные, которые они предоставили. Поэтому приходиться из того, что они налабали руками выцеплять нужные цифры.
    Грузятся данные в таблицу значений быстро, кстати.
    Да, они и правда могут быть различными, поэтому я в каждой строке вынужден искать их соответствие в справочнике(( Но таблица то в запросе.
    Или я чего-то не понимаю?
    --- Объединение сообщений, 3 фев 2017 ---
    Извините, я понял про какую таблицу Вы говорите, спасибо)
    сейчас попробую.
    нужно только понять, как их можно сравнивать...
    Последнее редактирование: 3 фев 2017
  7. TopicStarter Overlay
    Zenma
    Offline

    Zenma

    Регистрация:
    18 ноя 2016
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Вроде я понял все, запустил заполнение 20 записей - отработало за 15 секунд...
    Отпишусь по выполнению на большом количестве записей.
  8. TopicStarter Overlay
    Zenma
    Offline

    Zenma

    Регистрация:
    18 ноя 2016
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Записывает за 20 минут 2600 элементов справочника
    вот код конечный, может пригодиться кому:
    Код:
    Количествообработанной = 0;
       // время начала операции
        Сообщить(ТекущаяДата());
        Запрос = Новый Запрос;
        Запрос.Текст =
                "ВЫБРАТЬ
                |    ТаблицаЗначений.Тип КАК Тип,
                |    ТаблицаЗначений.Группа КАК Группа,
                |    ТаблицаЗначений.Гравировка КАК Гравировка,
                |    ТаблицаЗначений.Кладовая КАК Кладовая
                |ПОМЕСТИТЬ ТаблицаЗначений
                |ИЗ
                |    &ВнешняяТЗ КАК ТаблицаЗначений
                |;
                |
                |////////////////////////////////////////////////////////////////////////////////
                |ВЫБРАТЬ
                |    Номенклатура.Ссылка,
                |    Номенклатура.Родитель,
                |    Номенклатура.Родитель.Родитель КАК ПраРодитель,
                |    ТаблицаЗначений.Кладовая,
                |    ТаблицаЗначений.Гравировка,
                |    ТоварныеКатегории.Ссылка КАК Категория
                |ИЗ
                |    Справочник.Номенклатура КАК Номенклатура
                |        ВНУТРЕННЕЕ СОЕДИНЕНИЕ ТаблицаЗначений КАК ТаблицаЗначений
                |        ПО Номенклатура.Родитель.Наименование = ТаблицаЗначений.Группа
                |            И Номенклатура.Родитель.Родитель.Наименование = ТаблицаЗначений.Тип
                |        ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ТоварныеКатегории КАК ТоварныеКатегории
                |        ПО ТаблицаЗначений.Кладовая = ТоварныеКатегории.Наименование
                |ГДЕ
                |    Номенклатура.ТоварнаяКатегория = ЗНАЧЕНИЕ(Справочник.ТоварныеКатегории.ПустаяСсылка)";
    
     
        Запрос.УстановитьПараметр("ВнешняяТЗ", ТабНП);
         
        РезультатЗапроса = Запрос.Выполнить();
     
        ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
     
        Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
            Попытка
                НоменклатураДляПроставленияТК = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
                НоменклатураДляПроставленияТК.ТоварнаяКатегория = ВыборкаДетальныеЗаписи.Категория;
                НоменклатураДляПроставленияТК.Записать();
                Количествообработанной = Количествообработанной+1;
            Исключение
            КонецПопытки;
    
        КонецЦикла;
     
       //выдаем количество записей и время конечное
        Сообщить(Количествообработанной);
        Сообщить(ТекущаяДата());
  9. LordMaverick
    Offline

    LordMaverick Профессионал в 1С

    Регистрация:
    17 мар 2014
    Сообщения:
    3.951
    Симпатии:
    463
    Баллы:
    104
    а если это
    Код:
    НоменклатураДляПроставленияТК = ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
    сократить до
    Код:
    НоменклатураДляПроставленияТК = ВыборкаДетальныеЗаписи.Ссылка();
    Zenma нравится это.
  10. nomad_irk
    Offline

    nomad_irk Гуру в 1С

    Регистрация:
    20 окт 2008
    Сообщения:
    9.286
    Симпатии:
    968
    Баллы:
    204
    Ээээ....дык он же изменяет элементы справочника: заполняет реквизит "ТоварнаяКатегория" :)
    Zenma нравится это.
  11. TopicStarter Overlay
    Zenma
    Offline

    Zenma

    Регистрация:
    18 ноя 2016
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    у 48 100 элементов справочника номенклатуры заполнился реквизит за 6 часов 10 минут...
  12. Yuriy_Alexandrovich
    Offline

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

    Регистрация:
    15 сен 2011
    Сообщения:
    1.349
    Симпатии:
    87
    Баллы:
    54
    Выполнение запроса можно ускорить, если извернуться и избавиться от конструкции вида "Номенклатура.Родитель.Родитель.Наименование", и в целом уйти от соединения по полям с строковым типом значений.
    Сделать промежуточную временную таблицу в которой дополнить загруженную тз необходимыми данными.
    Использовать "В ИЕРАРХИИ"
    Zenma нравится это.
  13. TopicStarter Overlay
    Zenma
    Offline

    Zenma

    Регистрация:
    18 ноя 2016
    Сообщения:
    7
    Симпатии:
    0
    Баллы:
    1
    Но как уйти от соединения по полям с строковым типом значений, если у меня есть только имя категории/подкатегории, но нет ссылки на нее?
    Плюс к этому они меняются, то есть перед запросом не определить 1 раз для всех записей...
Похожие темы
  1. blacat
    Ответов:
    3
    Просмотров:
    1.595
  2. emorunov
    Ответов:
    1
    Просмотров:
    1.834
  3. Asttoxa
    Ответов:
    5
    Просмотров:
    1.575
  4. Ivan2014
    Ответов:
    6
    Просмотров:
    843
  5. APATRI0T
    Ответов:
    3
    Просмотров:
    688
Загрузка...

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