7.7 Сократить время выполнения процедуры

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем amoRNizam, 26 апр 2017.

  1. TopicStarter Overlay
    amoRNizam
    Offline

    amoRNizam Опытный в 1С

    Регистрация:
    14 окт 2015
    Сообщения:
    123
    Симпатии:
    0
    Баллы:
    26
    1С 7.7 ТИС 9.2
    Здравствуйте. Такая ситуация:
    Создаем новую реализацию, выбираем контрагента, затем в поле "Заказ" нажимаем на кнопку выбора (идет поиск заявки покупателя). Процедура поиска заявки продолжается около двух минут. Это довольно продолжительно и это время ценно, особенно когда нужно выполнить много работы.
    В процедуре стоит интервал обработки документов за 20 дней, этот интервал сокращать не желательно.
    Можно ли как то сократить время выполнение процедуры?
    Помогите пожалуйста с этой сложностью.
    Ниже код этой процедуры в документе "Реализация"
    Код:
    Процедура ПриНачалеВыбораЗначения(ЭлементДиалога,ФлагОбработки)
        Если  ЭлементДиалога="ЗаявкаПокупателя" Тогда
            СписокНоменклатуры=СоздатьОбъект("СписокЗначений");
            СписокЗаявок=СоздатьОбъект("СписокЗначений");
            ВыгрузитьТабличнуюЧасть(СписокНоменклатуры,"Номенклатура");
            ФлагОбработки=0;
            НачалоЗапроса=ДатаДок-20;
            ТекстЗапроса="//{{ЗАПРОС(СписокЗаявок)
            |Период с НачалоЗапроса по ДатаДок;
            |Владелец = Регистр.Заявки.ДоговорПокупателя.Владелец;
            |Номенклатура = Регистр.Заявки.Номенклатура;
            |КоличествоРасход = Регистр.Заявки.КоличествоРасход;
            |ТекущийДокумент = Регистр.Заявки.ЗаявкаПокупателя;
            |Функция КоличествоРасходКонОст = КонОст(КоличествоРасход);
            |Группировка ТекущийДокумент без групп;
            |Условие(Номенклатура в СписокНоменклатуры);
            |Условие(Владелец = Контрагент);
           
            |"//}}ЗАПРОС
            ;
            Запрос=СоздатьОбъект("Запрос");
            Запрос.Выполнить(ТекстЗапроса);
            ПОка Запрос.Группировка()=1 Цикл
                Если ПустоеЗначение(Запрос.ТекущийДокумент)=0 Тогда
                    СписокЗаявок.ДобавитьЗначение(Запрос.ТекущийДокумент);
                конецЕсли;           
            КонецЦикла;           
            Если СписокЗаявок.РазмерСписка()>0 Тогда       
                СписокЗаявок.ВыбратьЗначение(ЗаявкаПокупателя,"Выберите заказ",,50,1);           
            иначе
                Предупреждение("Заказы не найдены");
            конецЕсли;       
        конецЕсли;   
    КонецПроцедуры

    Вложения:

  2. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.453
    Симпатии:
    523
    Баллы:
    204
    Судя по всему у вас работа по сети, а не терминал. Отсюда и тормоза...
    Переход на терминальный сервер значительно ускорит процесс...

    Но можно изменить код.

    1) ВыбратьПоЗначению (значение отбора - контрагент. должна быть включена графа отбора)
    2) ОбратныйПорядок(1)
    3) ВыбратьДокументы(ДатаДок-20,ДатаДок)
    amoRNizam нравится это.
  3. TopicStarter Overlay
    amoRNizam
    Offline

    amoRNizam Опытный в 1С

    Регистрация:
    14 окт 2015
    Сообщения:
    123
    Симпатии:
    0
    Баллы:
    26
    Спасибо большое, помогли!!
  4. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.453
    Симпатии:
    523
    Баллы:
    204
  5. TopicStarter Overlay
    amoRNizam
    Offline

    amoRNizam Опытный в 1С

    Регистрация:
    14 окт 2015
    Сообщения:
    123
    Симпатии:
    0
    Баллы:
    26
    Сделал отбор по контрагенту. Сразу не заметил, процедура долго выполнялась только из-за того, что шел расчет остатков. Когда сделал таким образом, как в коде внизу, то процедура быстро выполняется, выводятся нужные документы, но выводятся и те, на основе которых уже сделана реализация. Как сделать, чтобы не выводились уже выполненные заявки и при этом не использовать функцию расчета (чтобы опять долго процедура не выполнялась) не разберусь.
    Я скорее всего точно не понял, как именно вы советовали изменить код. Извините.
    Код:
    Процедура ПриНачалеВыбораЗначения(ЭлементДиалога,ФлагОбработки)
        Если  ЭлементДиалога="ЗаявкаПокупателя" Тогда
            СписокНоменклатуры=СоздатьОбъект("СписокЗначений");
            СписокЗаявок=СоздатьОбъект("СписокЗначений");
            ВыгрузитьТабличнуюЧасть(СписокНоменклатуры,"Номенклатура");
            ФлагОбработки=0;
            НачалоЗапроса=ДатаДок-20;
            ТекстЗапроса="//{{ЗАПРОС(СписокЗаявок)
        |Период с НачалоЗапроса по ДатаДок;
        |Владелец = Документ.ЗаявкаПокупателя.Контрагент;
        |Номенклатура = Документ.ЗаявкаПокупателя.ТекущийДокумент;
        |Группировка Номенклатура без групп;
        |Условие(Номенклатура в СписокНоменклатуры);
        |Условие(Владелец = Контрагент);
        |"//}}ЗАПРОС
            ;
            Запрос=СоздатьОбъект("Запрос");
            Запрос.Выполнить(ТекстЗапроса);
            ПОка Запрос.Группировка()=1 Цикл
                Если ПустоеЗначение(Запрос.Номенклатура)=0 Тогда
                    СписокЗаявок.ДобавитьЗначение(Запрос.Номенклатура);
                конецЕсли;           
            КонецЦикла;           
            Если СписокЗаявок.РазмерСписка()>0 Тогда       
                СписокЗаявок.ВыбратьЗначение(ЗаявкаПокупателя,"Выберите заказ",,50,1);           
            иначе
                Предупреждение("Заказы не найдены");
            конецЕсли;       
        конецЕсли;   
    КонецПроцедуры
  6. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.453
    Симпатии:
    523
    Баллы:
    204
    в запросе этого не сделать...
    А если через выборку документов (как я предлагал) - можно.
    добавить еще в цикл выборки ВыбратьПодчиненныеДокументы и если есть подчиненные реализации - не добавлять в список.

    К тому же выборка с фильтром все равно работает быстрее чем запрос
  7. TopicStarter Overlay
    amoRNizam
    Offline

    amoRNizam Опытный в 1С

    Регистрация:
    14 окт 2015
    Сообщения:
    123
    Симпатии:
    0
    Баллы:
    26
    Спасибо! Вчера пытался вникнуть, как сделать по вашему совету, но это всё что получилось в итоге. Сейчас буду читать про выборку)
    Я пока особо не умею программировать на 1С.
  8. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.453
    Симпатии:
    523
    Баллы:
    204
    глобальный поиск по конфигурации ОбратныйПорядок - думаю найдете пример
    amoRNizam нравится это.
  9. TopicStarter Overlay
    amoRNizam
    Offline

    amoRNizam Опытный в 1С

    Регистрация:
    14 окт 2015
    Сообщения:
    123
    Симпатии:
    0
    Баллы:
    26
    Сделал вот так:
    Код:
    Процедура ПриНачалеВыбораЗначения(ЭлементДиалога,ФлагОбработки)
        Если  ЭлементДиалога="ЗаявкаПокупателя" Тогда
            СписокНоменклатуры=СоздатьОбъект("СписокЗначений");
            СписокЗаявок=СоздатьОбъект("СписокЗначений");
            ВыгрузитьТабличнуюЧасть(СписокНоменклатуры,"Номенклатура");
            ФлагОбработки=0;    
           
            Док=СоздатьОбъект("Документ.ЗаявкаПокупателя");
            ДокПодч=СоздатьОбъект("Документ");
           
           
            Док.ОбратныйПорядок(1);
            Док.ВыбратьДокументы(ДатаДок-20,ДатаДок);
            ДокПодч.ВыбратьПодчиненныеДокументы(ДатаДок-20,ДатаДок,Док.ТекущийДокумент());
            Пока Док.ПолучитьДокумент() = 1 Цикл 
                Если Док.Контрагент = Контрагент Тогда 
                    СписокЗаявок.ДобавитьЗначение(Док.ТекущийДокумент());   
                КонецЕсли;
            КонецЦикла;
            Если СписокЗаявок.РазмерСписка()>0 Тогда       
                СписокЗаявок.ВыбратьЗначение(ЗаявкаПокупателя,"Выберите заказ",,,);           
            иначе
                Предупреждение("Заказы не найдены");
            конецЕсли; 
           
        конецЕсли;   
    КонецПроцедуры
    Работает, но как не включать в список подчиненные, не могу найти решение. Помогите пожалуйста.
  10. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.453
    Симпатии:
    523
    Баллы:
    204
    нашли=0;
    Если Док.Контрагент = Контрагент Тогда
    ДокПодч.ВыбратьПодчиненныеДокументы(ДатаДок-20,ДатаДок,Док.ТекущийДокумент()); //вот сюда перенести
    Пока ДокПодч.ПолучитьДокумент()=1 Цикл
    Если ДокПодч.Вид()="Реализация" Тогда //укажите правильный вид документа
    нашли=1;
    прервать;
    КонецЕсли;
    КонецЦикла;

    если нашли=0 тогда
    СписокЗаявок.ДобавитьЗначение(Док.ТекущийДокумент());
    конецесли;
    amoRNizam нравится это.
  11. TopicStarter Overlay
    amoRNizam
    Offline

    amoRNizam Опытный в 1С

    Регистрация:
    14 окт 2015
    Сообщения:
    123
    Симпатии:
    0
    Баллы:
    26
    Спасибо большое работает!!
    Последний вопрос остался:
    Как можно указать два вида документа.
    в коде есть ДокПодч.Вид()="Реализация" и нужно еще чтобы условие было по документу "РеализацияРозница", так как если у заявки в подчинении есть РеализацияРозница, то она всё равно выводится.
    Код:
    Процедура ПриНачалеВыбораЗначения(ЭлементДиалога,ФлагОбработки)
        Если  ЭлементДиалога="ЗаявкаПокупателя" Тогда
            СписокНоменклатуры=СоздатьОбъект("СписокЗначений");
            СписокЗаявок=СоздатьОбъект("СписокЗначений");
            ВыгрузитьТабличнуюЧасть(СписокНоменклатуры,"Номенклатура");
            ФлагОбработки=0;    
            нашли=0;
            Док=СоздатьОбъект("Документ.ЗаявкаПокупателя");
            ДокПодч=СоздатьОбъект("Документ");
            Док.ОбратныйПорядок(1);
            Док.ВыбратьДокументы(ДатаДок-20,ДатаДок);
            Пока Док.ПолучитьДокумент() = 1 Цикл  
               
                Если Док.Контрагент = Контрагент Тогда
                    ДокПодч.ВыбратьПодчиненныеДокументы(ДатаДок-20,ДатаДок,Док.ТекущийДокумент());
                    Пока ДокПодч.ПолучитьДокумент()=1 Цикл
                        Если ДокПодч.Вид()="Реализация" Тогда  
                            Если ДокПодч.ПометкаУдаления()=0 Тогда
                                нашли=1;
                                прервать;                   
                            КонецЕсли;
                        КонецЕсли;  
                       
                    КонецЦикла;  
                    если нашли=0 тогда
                        СписокЗаявок.ДобавитьЗначение(Док.ТекущийДокумент());
                    КонецЕсли;
                   
                КонецЕсли;
            КонецЦикла;
            Если СписокЗаявок.РазмерСписка()>0 Тогда       
                СписокЗаявок.ВыбратьЗначение(ЗаявкаПокупателя,"Выберите заказ",,,);           
            иначе
                Предупреждение("Заказы не найдены");
            КонецЕсли; 
           
        КонецЕсли;   
    КонецПроцедуры  
  12. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.453
    Симпатии:
    523
    Баллы:
    204
    условие ИЛИ никто не отменял
    amoRNizam нравится это.
  13. TopicStarter Overlay
    amoRNizam
    Offline

    amoRNizam Опытный в 1С

    Регистрация:
    14 окт 2015
    Сообщения:
    123
    Симпатии:
    0
    Баллы:
    26
    Сразу не сообразил.
    Спасибо вам большое! Всё отлично работает благодаря вашей помощи!
  14. Бухгалтерский угодник
    Offline

    Бухгалтерский угодник Администраторы Команда форума Администратор

    Регистрация:
    29 дек 2008
    Сообщения:
    22.453
    Симпатии:
    523
    Баллы:
    204

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