7.7 Как построить запрос к регистру?

Тема в разделе "Общие вопросы "1С:Предприятие 7.7"", создана пользователем MaxS, 2 июл 2006.

  1. TopicStarter Overlay
    MaxS
    Offline

    MaxS

    Регистрация:
    2 июл 2006
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Код:
    Функция ПравильностьВыбораСчетаФактуры1()
    Перем Запрос, ТекстЗапроса;
    
    Сообщить(ТекущееВремя());
    
    МожноЗаписывать = 1;
    СписокСчетФактур = СоздатьОбъект("СписокЗначений");
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку()=1 Цикл
    СписокСчетФактур.ДобавитьЗначение(Док.СчетФактура); 
    КонецЦикла;
    //Док = ТекущийДокумент(); 
    ПериодС = ДобавитьМесяц(ТекущаяДата(),-48); // 4 года назад
    
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(ПравильностьВыбораСчетаФактуры)
    |Период с ПериодС;
    |Реестр = Регистр.РеестрПредоставляемыхСчетФактур.Реестр;
    |Сумма = Регистр.РеестрПредоставляемыхСчетФактур.Сумма;
    |СчетФактура = Регистр.РеестрПредоставляемыхСчетФактур.СчетФактура;
    |Функция СуммаПриход = (Сумма);
    |Группировка Реестр;
    |Группировка СчетФактура;
    |Условие(СчетФактура в СписокСчетФактур);
    |"//}}ЗАПРОС;
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    МожноЗаписывать = 0;
    Иначе
    
    Пока Запрос.Группировка(1) = 1 Цикл
    // Заполнение полей Реестр
    Если Запрос.Реестр <> Док Тогда
    Пока Запрос.Группировка(2) = 1 Цикл
    // Заполнение полей СчетФактура
    Сообщить(глПредставлениеДокумента(Запрос.СчетФактура) + " уже используется в " + глПредставлениеДокумента(Запрос.Реестр));
    МожноЗаписывать = 0;
    КонецЦикла;
    КонецЕсли;
    КонецЦикла;
    КонецЕсли;
    
    Сообщить(ТекущееВремя());
    Возврат МожноЗаписывать;
    
    КонецФункции
    
    
    Функция ПравильностьВыбораСчетаФактуры2()
    
    Рег = СоздатьОбъект("Регистр.РеестрПредоставляемыхСчетФактур"); 
    ТЗ = СоздатьОбъект("ТаблицаЗначений");
    Рег.ВыгрузитьИтоги(ТЗ);
    Док.ВыбратьСтроки();
    Пока Док.ПолучитьСтроку()=1 Цикл
    СтрокаТЗ = 0;
    Если ТЗ.НайтиЗначение(Док.СчетФактура,СтрокаТЗ,"СчетФактура")=1 Тогда
    Сообщить("В строке №"+Док.НомерСтроки+" выбрана счет-фактура '" +глПредставлениеДокумента(Док.СчетФактура)+ "', которая уже используется в документе '" + глПредставлениеДокумента(ТЗ.ПолучитьЗначение(СтрокаТЗ,"Реестр"))+"'" );
    КонецЕсли;    
    КонецЦикла;
    
    
    КонецФункции
    
    
    Создал новый документ, в табличной части которого ссылки на счет-фактуры. Счет-фактура должна быть только в единственном документе.
    Как это правильно сделать?
    Создал оборотный регистр, ресурсы Сумма и НДС, остальное Измерения. Двигаю регистр так:
    Регистр.РеестрПредоставляемыхСчетФактур.Движение(ДокОснование, ТекущийДокумент(), СчетФактура, СуммаСчетаФактуры, СуммаНДС);

    В Вышеприведённой функции 1 запрос выполняется 10 секунд. В том регистре всего 5 движений, а в базе полно других документов, счет-фактур и т.д. Почему так долго?

    Функция 2 выполняется моментально.

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