Есть регистр накоплений(вид остатки) 3 измерения и 1 ресурс
при работе обработки идет обращение к итогам по 2м измерениям с условием по третьему и по трём измерениям в общей сложности 1,5 млн. значений. Пробовал при каждом обращении выполнять запрос с параметрами(около 2х сек. 1 запрос) - вроде быстро делает 1 запрос но при таком количестве обращений(1,5 млн.) обработка работает долго.
Подскажите, как лучше организовать доступ к значениям с учётом того, что обработку нужно прогонять каждый день и, желательно, что-б она работала не больше получаса.
при работе обработки идет обращение к итогам по 2м измерениям с условием по третьему и по трём измерениям в общей сложности 1,5 млн. значений. Пробовал при каждом обращении выполнять запрос с параметрами(около 2х сек. 1 запрос) - вроде быстро делает 1 запрос но при таком количестве обращений(1,5 млн.) обработка работает долго.
Подскажите, как лучше организовать доступ к значениям с учётом того, что обработку нужно прогонять каждый день и, желательно, что-б она работала не больше получаса.
По теме из базы знаний
- Запрос по остаткам регистра накопления на каждый день
- Данные о регистрах накопления в форме с кнопками удаления
- Перенос данных из КА 1.1 (ЗУП 2.5) в ЗУП 3.1. Исправляем ошибки в регистрах накопления
- Доработка проведения в ERP 2.5. (Регистры накопления, Регистры сведений)
- Очистка регистра накопления. Очистка регистра сведений
Ответы
Подписаться на ответы
Инфостарт бот
Сортировка:
Древо развёрнутое
Свернуть все
Пробежаться не получится, нужно получать конкретную цифирку по уже определённым значениям измерений - можно было-бы 1 запрос перегнать в таблицу и искать по ней, но при определённых значениях измерений нужен итог по одному из измерений, но не полный, а с условием:
Измерения
номенклатура(несколько тысяч)
действие(заказано, произведено, брак..... итого 9)
дата(весь календарь)
загружаю отчёт производства - данные за 2 месяца с остатками, обрезанными на дату начала, по всем действиям 200 столбцов на 10 000 строк. Хорошо ещё, что расшифровка по датам только по 3м действиям. Изменится в отчёте может любая цифра, в том числе остаток на начало.
Так что по одной номенклатуре нужно вытащить цифру по действию и дате из интервала, а также итог на дату обрезки.
Как это можно организовать с наименьшими временными затратами?
Измерения
номенклатура(несколько тысяч)
действие(заказано, произведено, брак..... итого 9)
дата(весь календарь)
загружаю отчёт производства - данные за 2 месяца с остатками, обрезанными на дату начала, по всем действиям 200 столбцов на 10 000 строк. Хорошо ещё, что расшифровка по датам только по 3м действиям. Изменится в отчёте может любая цифра, в том числе остаток на начало.
Так что по одной номенклатуре нужно вытащить цифру по действию и дате из интервала, а также итог на дату обрезки.
Как это можно организовать с наименьшими временными затратами?
Вот что наваял, где ЗапросКоличества() возвращает колво с отбором по всем переданным параметрам, а ЗапросКоличестваНаДату() по двум с условием, что ДатаДействия в регистре(не Период, с ним бы попроще было, но там дата проведения сидит) меньше либо равна ДатаДействияЗ.
Код |
---|
Для Каждого строкаТЗ Из тзЗагрузки Цикл
Сообщить(тзЗагрузки.Индекс(строкаТЗ));
Если (тзЗагрузки.Индекс(строкаТЗ)=0) Тогда
строкаТЗ0 = строкаТЗ;
КонецЕсли;
Если (тзЗагрузки.Индекс(строкаТЗ)>0)
и (тзЗагрузки.Индекс(строкаТЗ)<100) //ограничения для быстрой проверки
Тогда
МаркерЗ = строкаТЗ[2];
.......//поиск или создание эл справочников
МаркерЗ = спрСВн.Ссылка;
//ЗАКАЗАНО
ВидыДвиженияЗ = Справочники.ВидыДвижения.заказ;
ДатаДействияЗ = строкаТЗ[11];
Занести = Число(строкаТЗ[6])-ЗапросКоличестваНаДату(МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
Если Занести <> 0 Тогда
ЗанестиВБазу(Занести,МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
КонецЕсли;
//ПРОИЗВЕДЕНО
ВидыДвиженияЗ = Справочники.ВидыДвижения.произв;
//Остатки на начало периода(18-я колонка)
столб = 18;
ДатаДействияЗ = строкаТЗ0[столб+1]-86400; //60*60*24;
ИзЗаказов = Число(?(ПустаяСтрока(строкаТЗ[столб]),0,строкаТЗ[столб]));
ИзБазы = ЗапросКоличестваНаДату(МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
Занести = ИзЗаказов-ИзБазы;
Если Занести <> 0 Тогда
ЗанестиВБазу(Занести,МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
КонецЕсли;
//Обороты
Для столб = 19 по 78 Цикл
ДатаДействияЗ = строкаТЗ0[столб];
ИзЗаказов = Число(?(ПустаяСтрока(строкаТЗ[столб]),0,строкаТЗ[столб]));
ИзБазы = ЗапросКоличества(МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
Занести = ИзЗаказов-ИзБазы;
Если Занести <> 0 Тогда
ЗанестиВБазу(Занести,МаркерЗ,ВидыДвиженияЗ,ДатаДействияЗ);
КонецЕсли;
КонецЦикла;
..................//дальше аналогично ещё по 5 действиям
Показать полностью |
Вместо выполнения запроса в цикле сделал 3 запроса(время выполнения 35 сек) и функцию выбора значения из тз с результатами запроса. Но почему-то метод НайтиСтроки() всегда возвращает пустой массив и с тремя записями в структуре и с одной, хотя запрос с теме-же параметрами из предидущего поста циферку давал, и после изменений запрос содержит значения с такими измерениями.
Можт что не так сделал?
Можт что не так сделал?
Код |
---|
Функция Количество(ТЗ,Маркер,ВидыДвижения,ДатаДействия="00010101000000")
структ = Новый Структура;
структ.Вставить("Маркер",Маркер);
//структ.Вставить("ВидыДвижения",ВидыДвижения);
тзВыбора = Новый ТаблицаЗначений;
Если ТЗ = 0 Тогда тзВыбора = тзЗапроса;
ИначеЕсли ТЗ = 1 Тогда тзВыбора = тзЗапроса1;
//структ.Вставить("ДатаДействия",ДатаДействия);
Иначе тзВыбора = тзЗапроса2;
КонецЕсли;
массВыбора = тзВыбора.НайтиСтроки(структ);
Сообщить("массВыбора_"+массВыбора.Количество()+"*"+массВыбора.ВГраница());
КонецФункции
Показать полностью |
Для получения уведомлений об ответах подключите телеграм бот:
Инфостарт бот