8.х Как повысить производительность при переборе элементов справочника?

Тема в разделе "Общие вопросы "1С:Предприятие 8"", создана пользователем Ludmillka, 29 окт 2013.

  1. TopicStarter Overlay
    Ludmillka
    Offline

    Ludmillka Опытный в 1С

    Регистрация:
    13 сен 2013
    Сообщения:
    159
    Симпатии:
    0
    Баллы:
    26
    Всем привет! Есть такой код:
    Код:
    спрРаботы = Справочники.Работы;
    //проверяем возможность заполнения - есть ли у источника потомки - если есть, заполнять нельзя
    ВыборкаПотомковПоПриемнику = спрРаботы.Выбрать(Приемник.Ссылка);
    ВыборкаПотомковПоИсточнику = спрРаботы.Выбрать(Источник);
    Если ВыборкаПотомковПоПриемнику.Следующий() Тогда
    Сообщить("У работы "+СокрЛП(Приемник.Наименование)+" заданы потомки. Копирование невозможно");
    Возврат;
    КонецЕсли;
    

    Очень долго висит на строчке
    Код:
    Если ВыборкаПотомковПоПриемнику.Следующий() Тогда
    
    Что можно с этим сделать? Как уменьшить время работы?
  2. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Конфа какая? своя? RLS используете?
  3. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    попробуйте через запрос, выгрузите результат в ТЗ и по количеству строк, ну или сразу количество в запросе посчитать
  4. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Запросом не пробовали???

    Да с запросом то же через выборку можно
    Выборка=РезультатЗапроса.Выполнить().Выбрать();

    Если Выборка.Следующий() Тогда

    КонецЕсли;

    Просто в запросе можно выбрать представления, что быстрее будет чем тянуть ссылку

    Просто ссылка может содержать кучу реквизитов, которые ссылкаются на кучу таблиц
  5. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    можно и выборку, просто я чаще тз использую...
  6. TopicStarter Overlay
    Ludmillka
    Offline

    Ludmillka Опытный в 1С

    Регистрация:
    13 сен 2013
    Сообщения:
    159
    Симпатии:
    0
    Баллы:
    26
    Конфигурация УСО (не своя), RLS не использовали. А разве запрос не тоже самое даст, все-равно перебирать предется, а виснет именно на переборе.

    А может что-то с индексами сделать?
  7. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    ну если через ТЗ, то не перебор будет в итоге, а сразу количество получите штатной функцией - попробуйте - ничего не теряете же
  8. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Смотрите
    1. В УСО уже может быть включено ограничение на уровне записей, по этому в запросе с РАЗРЕШЕННЫЕ будет работать быстрее
    2. Как я уже сказал когда Вы делаете через выборку, то получаете ссылку со всеми ее реквизитами, а реквизиты то же имеюю ссылочный тип исистема их то же тащит. По этому я Вам запросе рекомендую брать либо наименование либо представлени, но не ссылку - так запрос быстрее работаь будет.
  9. TopicStarter Overlay
    Ludmillka
    Offline

    Ludmillka Опытный в 1С

    Регистрация:
    13 сен 2013
    Сообщения:
    159
    Симпатии:
    0
    Баллы:
    26
    Попробую, спасибо!

    Только вот у меня еще вопросик, там дальше еще хуже
    Код:
    Пока ВыборкаПотомковПоИсточнику.Следующий() Цикл
    ИсточникДляПотомка = ВыборкаПотомковПоИсточнику.Ссылка;
    Если  ИсточникДляПотомка.ПометкаУдаления=ложь тогда
    НоваяРабота = Справочники.Работы.СоздатьЭлемент();
    НоваяРабота.Наименование = ИсточникДляПотомка.Наименование;
    НоваяРабота.Код=ИсточникДляПотомка.Код;
    НоваяРабота.Владелец = Приемник.Владелец;
    НоваяРабота.Родитель = Приемник.Ссылка;
    НоваяРабота.Записать();
    ЗаполнитьРаботуНаОсновании(НоваяРабота,ИсточникДляПотомка,тзСоответствия);
    КонецЕсли;
    КонецЦикла;
    
    Как мне обойти вот это
    Код:
     ИсточникДляПотомка = ВыборкаПотомковПоИсточнику.Ссылка;
    , если все-равно нужен перебор?
  10. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    В запросе Выбираете все необходимые реквизиты ту же самую пометку на удаление и будет Вам

    Пока ВыборкаПотомковПоИсточнику.Следующий() Цикл

    Если ВыборкаПотомковПоИсточнику.ПометкаУдачения=ложь тогда

    А лучше сразу это условие в запросе указать

    Перебор нужен - ни кт тут не спорит
  11. TopicStarter Overlay
    Ludmillka
    Offline

    Ludmillka Опытный в 1С

    Регистрация:
    13 сен 2013
    Сообщения:
    159
    Симпатии:
    0
    Баллы:
    26
    Поняла, просто запрос должен сам по себе быстрее работать?

    А можно еще вам вопрос не по теме, может в 1с-ке быть какое-нибудь ограничение на отправку писем?
  12. NcSteel
    Offline

    NcSteel Опытный в 1С

    Регистрация:
    29 окт 2013
    Сообщения:
    78
    Симпатии:
    0
    Баллы:
    26
    При выборе "ссылки" в запросе, доп реквизиты не тянутся, поэтому и представление тянуть не надо.

    По теме вопроса топик стартера. Старайтесь делать все через запросы. Если использовать выборки из менеджера объекта конфигурации, то будет тянуться весь объект справочника, что в 99% не нужно.

    Запросы почти всегда работают быстрее, но есть случаи когда скорость равна.

    Ограничений на отправку писем в 1С нет, если речь именно о платформе.
  13. Tiger86
    Offline

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

    Регистрация:
    24 мар 2011
    Сообщения:
    6.407
    Симпатии:
    108
    Баллы:
    104
    запрос не всегда быстрее, просто в нем вы огрничите поля(реквизиты) для выборки и потому существенно быстрее будет работать Выборка.Следующий()
  14. TopicStarter Overlay
    Ludmillka
    Offline

    Ludmillka Опытный в 1С

    Регистрация:
    13 сен 2013
    Сообщения:
    159
    Симпатии:
    0
    Баллы:
    26
    Всем огромное спасибо! Буду переписывать запросом!
  15. Draco
    Offline

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

    Регистрация:
    28 окт 2009
    Сообщения:
    13.628
    Симпатии:
    946
    Баллы:
    204
    Имеллось ввиду что и Вы написали "По теме вопроса топик стартера. Старайтесь делать все через запросы. Если использовать выборки из менеджера объекта конфигурации, то будет тянуться весь объект справочника, что в 99% не нужно." что весь объет не нужен, достточно представления и нескольких полей. Еще одна беда когда люди делают составные поля... тогда еще хуже.
  16. NcSteel
    Offline

    NcSteel Опытный в 1С

    Регистрация:
    29 окт 2013
    Сообщения:
    78
    Симпатии:
    0
    Баллы:
    26
    Если речь о сравнении скорости работы методов менеджера объекта конфигурации и скорости работы Запроса, то разницы нет если конечно не разыменовывать составной реквизит.
  17. TopicStarter Overlay
    Ludmillka
    Offline

    Ludmillka Опытный в 1С

    Регистрация:
    13 сен 2013
    Сообщения:
    159
    Симпатии:
    0
    Баллы:
    26
    Вот я переписала все запросами. Какое-то время даже работало быстрее, но сейчас опять все стало подвисать.

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

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

    Регистрация:
    5 янв 2009
    Сообщения:
    14.735
    Симпатии:
    508
    Баллы:
    204
    Еще проверяйте на пометку удаления
  19. TopicStarter Overlay
    Ludmillka
    Offline

    Ludmillka Опытный в 1С

    Регистрация:
    13 сен 2013
    Сообщения:
    159
    Симпатии:
    0
    Баллы:
    26
    Спасибо, действительно, не подумала.
  20. TopicStarter Overlay
    Ludmillka
    Offline

    Ludmillka Опытный в 1С

    Регистрация:
    13 сен 2013
    Сообщения:
    159
    Симпатии:
    0
    Баллы:
    26
    Если верить замеру производительности, стало работать дольше :sm_razz:

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