Имя: Пароль:
1C
1С v8
Оптимальный способ получить остатки за период
0 ahahaev
 
03.09.13
11:01
Возникла такая задача, нужно выгрузить за определенный период данные в разрезе периода (день), складов и номенклатуры и по каждому дню получить остатки. Сейчас сделал следующим образом: основным запросом получил все данные за период в разрезе дней и за каждый день из периода получаю запросом остатки, после чего к каждой записи основного запроса присоединяю данные из запроса с остатками по конкретному дню.

Чувствую, что должно быть какое-то более оптимальное решение, но все, что приходит в голову - примерно из той же оперы, запросы в цикле, присоединения и поиски по таблицам значений.

Собственно, может кто сталкивался, как решали такие задачи?
1 ahahaev
 
03.09.13
11:34
Неужели нет никаких способов оптимизировать этот алгоритм?
2 Джинн
 
03.09.13
11:41
А простой группировкой по дням уже не катит?
3 MSOliver
 
03.09.13
11:44
Покажите как делаете
4 le_
 
03.09.13
11:46
5 le_
 
03.09.13
11:52
6 Нуф-Нуф
 
03.09.13
11:53
СКД и метод дополнения
7 Нуф-Нуф
 
03.09.13
11:53
или производственный календарь и соединение с таблицей движений, так сказать ручная версия виртуальной таблицы остатки и обороты
8 ahahaev
 
03.09.13
11:54
(4) Я делаю не через систему компоновки данных. Это не отчет, а выгрузка в xml

(2) Как я понимаю, группировка по дням тоже в СКД или я что-то не понял? Остатки запросом же берутся только на определенную дату.

(3)     Запрос = Новый (Основной запрос);
                          
    Запрос.УстановитьПараметр("ДатаНачала", ДатаОт);
    Запрос.УстановитьПараметр("ДатаКонца", КонецДня(ДатаДо));
    
    РезультатЗапроса = Запрос.Выполнить();
    Выгрузка = РезультатЗапроса.Выгрузить();
    
    ЗапросОст = Новый (Запрос к остаткам);

    
    ДатаНачала = Неопределено;
    
    
    Для Каждого Строка Из Выгрузка Цикл
        
        Если ДатаНачала = Неопределено ИЛИ НЕ ДатаНачала = НачалоДня(Строка.Период) Тогда
                
            ЗапросОст.УстановитьПараметр("ДатаНачала", НачалоДня(Строка.Период));
            ВыгрузкаОст = ЗапросОст.Выполнить().Выгрузить();
            
        КонецЕсли;
        
        СтруктураФильтр = Новый Структура;
        
        СтруктураФильтр.Вставить("Склад", Строка.Склад);
        СтруктураФильтр.Вставить("Номенклатура", Строка.Номенклатура1);
        МассивСтрок = ВыгрузкаОст.НайтиСтроки(СтруктураФильтр);
        
        Если МассивСтрок.Количество() = 0 Тогда
            МассивСтрок = Неопределено;
        КонецЕсли;
    
        (Вывод)
    КонецЦикла;
9 MSOliver
 
03.09.13
11:56
(8) плохо
10 MSOliver
 
03.09.13
11:57
Можно динамически создать текст запроса и установкой дат-параметров
11 MSOliver
 
03.09.13
12:00
Однако остатки насчитаны по месяцам, и будет досчет до дней на каждую дату. А можно сразу получить остатки и обороты за период, и высчитать остатки на день
12 Нуф-Нуф
 
03.09.13
12:00
(8) а что мешает результат СКД получить в качестве таблицы значений и выгрузить ее в хмл как тебе надо?
13 ahahaev
 
03.09.13
12:06
(11) Хм, как-то не подумал о таком способе, спасибо, сейчас попробую. А по-поводу динамического запроса - это как?
(12) Как вариант можно и так конечно, тоже приму к сведению, спасибо за совет.
14 MSOliver
 
03.09.13
12:12
Текст  запроса формируется в цикле по датам, на каждой итерации добавлявши запрос получения остатков на дату
15 ahahaev
 
03.09.13
12:24
(14) Ну у меня сейчас примерно так и строится. Когда дата меняется, я меняю параметр запроса и формирую остатки на эту дату.

Можно, конечно, использовать левое соединение от основного запроса и формировать все полностью в цикле, так, наверное, будет лучше, чем каждый раз искать по колонкам.