Запрос к регистру накоплений

1. PeRom 51 25.09.08 16:52 Сейчас в теме
Есть регистр накоплений(вид остатки) 3 измерения и 1 ресурс
при работе обработки идет обращение к итогам по 2м измерениям с условием по третьему и по трём измерениям в общей сложности 1,5 млн. значений. Пробовал при каждом обращении выполнять запрос с параметрами(около 2х сек. 1 запрос) - вроде быстро делает 1 запрос но при таком количестве обращений(1,5 млн.) обработка работает долго.
Подскажите, как лучше организовать доступ к значениям с учётом того, что обработку нужно прогонять каждый день и, желательно, что-б она работала не больше получаса.
По теме из базы знаний
Ответы
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
2. kitt 323 25.09.08 18:14 Сейчас в теме
А выгрузить итоги через объект РегистрНакопленияМенеджер с нужным отбором в тз и пробежать по ней?
3. PeRom 51 25.09.08 19:05 Сейчас в теме
Пробежаться не получится, нужно получать конкретную цифирку по уже определённым значениям измерений - можно было-бы 1 запрос перегнать в таблицу и искать по ней, но при определённых значениях измерений нужен итог по одному из измерений, но не полный, а с условием:
Измерения
номенклатура(несколько тысяч)
действие(заказано, произведено, брак..... итого 9)
дата(весь календарь)
загружаю отчёт производства - данные за 2 месяца с остатками, обрезанными на дату начала, по всем действиям 200 столбцов на 10 000 строк. Хорошо ещё, что расшифровка по датам только по 3м действиям. Изменится в отчёте может любая цифра, в том числе остаток на начало.
Так что по одной номенклатуре нужно вытащить цифру по действию и дате из интервала, а также итог на дату обрезки.
Как это можно организовать с наименьшими временными затратами?
4. kitt 323 25.09.08 19:28 Сейчас в теме
Всё-таки, хоть я и не понял до конца, чего ты хочешь добиться, но считаю, что запрос в цикле гонять, это не есть гут. Можеть кинешь самый главный кусок кода сюда, попробуем все вместе разобраться.
5. PeRom 51 25.09.08 19:56 Сейчас в теме
Вот что наваял, где ЗапросКоличества() возвращает колво с отбором по всем переданным параметрам, а ЗапросКоличестваНаДату() по двум с условием, что ДатаДействия в регистре(не Период, с ним бы попроще было, но там дата проведения сидит) меньше либо равна ДатаДействияЗ.
Код
Для Каждого строкаТЗ Из тзЗагрузки Цикл
   Сообщить(тзЗагрузки.Индекс(строкаТЗ));  
   Если (тзЗагрузки.Индекс(строкаТЗ)=0) Тогда
      строкаТЗ0 = строкаТЗ;
   КонецЕсли;
   Если (тзЗагрузки.Индекс(строкаТЗ)>0)
      и (тзЗагрузки.Индекс(строкаТЗ)<100)  //ограничения для быстрой проверки
      Тогда
      МаркерЗ = строкаТЗ[2];
      .......//поиск или создание эл справочников
      МаркерЗ = спрСВн.Ссылка;
   //ЗАКАЗАНО
      ВидыДвиженияЗ = Справочники.ВидыДвижения.заказ;
      ДатаДействияЗ = строкаТЗ[11];
      Занести = Число(строкаТЗ[6])-ЗапросКоличестваНаДату(МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
      Если Занести <> 0 Тогда
         ЗанестиВБазу(Занести,МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
      КонецЕсли;
   //ПРОИЗВЕДЕНО
      ВидыДвиженияЗ = Справочники.ВидыДвижения.произв;
      //Остатки на начало периода(18-я колонка)
      столб = 18;
      ДатаДействияЗ = строкаТЗ0[столб+1]-86400; //60*60*24;
      ИзЗаказов = Число(?(ПустаяСтрока(строкаТЗ[столб]),0,строкаТЗ[столб]));
      ИзБазы = ЗапросКоличестваНаДату(МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
      Занести = ИзЗаказов-ИзБазы;
      Если Занести <> 0 Тогда
         ЗанестиВБазу(Занести,МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
      КонецЕсли;
      //Обороты
      Для столб = 19 по 78 Цикл
         ДатаДействияЗ = строкаТЗ0[столб];
         ИзЗаказов = Число(?(ПустаяСтрока(строкаТЗ[столб]),0,строкаТЗ[столб]));
         ИзБазы = ЗапросКоличества(МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
         Занести = ИзЗаказов-ИзБазы;
         Если Занести <> 0 Тогда
            ЗанестиВБазу(Занести,МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
         КонецЕсли;
      КонецЦикла;
..................//дальше аналогично ещё по 5 действиям
Показать полностью
6. PeRom 51 26.09.08 19:45 Сейчас в теме
Вместо выполнения запроса в цикле сделал 3 запроса(время выполнения 35 сек) и функцию выбора значения из тз с результатами запроса. Но почему-то метод НайтиСтроки() всегда возвращает пустой массив и с тремя записями в структуре и с одной, хотя запрос с теме-же параметрами из предидущего поста циферку давал, и после изменений запрос содержит значения с такими измерениями.
Можт что не так сделал?
Код
Функция Количество(ТЗ,Маркер,ВидыДвижения,ДатаДействия="00010101000000")
   структ = Новый Структура;
   структ.Вставить("Маркер",Маркер);
   //структ.Вставить("ВидыДвижения",ВидыДвижения);
   тзВыбора = Новый ТаблицаЗначений;
   Если ТЗ = 0 Тогда  тзВыбора = тзЗапроса;
   ИначеЕсли ТЗ = 1 Тогда  тзВыбора = тзЗапроса1;
   //структ.Вставить("ДатаДействия",ДатаДействия);
   Иначе тзВыбора = тзЗапроса2;
   КонецЕсли;
   массВыбора = тзВыбора.НайтиСтроки(структ);
   Сообщить("массВыбора_"+массВыбора.Количество()+"*"+массВыбора.ВГраница());   
КонецФункции
Показать полностью
7. kitt 323 26.09.08 20:30 Сейчас в теме
8. PeRom 51 26.09.08 21:44 Сейчас в теме
Уже всё. Пришёл ПЯТНИЦО, до понедельника. Спасибо за интерес!
9. PeRom 51 29.09.08 12:20 Сейчас в теме
Вот ПЯТНИЦО ушёл и всё стало на свои места и заработало, даже НайтиСтроки() по трём колонкам ищет!!!
Всем, кто поддержал Спасибо. Китт - особая благодарность!
Оставьте свое сообщение

Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот