7.7 Передать в запрос значения из ТЗ

Тема в разделе "Отчеты и обработки для "1С:Предприятие 7.7"", создана пользователем -=Ан=-, 24 окт 2008.

  1. TopicStarter Overlay
    -=Ан=-
    Offline

    -=Ан=-

    Регистрация:
    24 окт 2008
    Сообщения:
    5
    Симпатии:
    0
    Баллы:
    1
    Необходимо написать отчёт, в котором будут выводится конечные остатки товаров, вошедших в определенные документы. Заполняю таблицу значений номенклатурой из различных документов. Каким образом получить конечный остаток только для этих значений? (т.е. передать в запрос код товара из ТЗ)

    Получилось только двойным циклом: для каждой строки из ТЗ перебирается какждая строка Запроса на условие совпадения артикула. А при условии что в таблице значений до 1000 строк, а самой номенклатуры около 50.000 то этот процесс затягивается довольно надолго.

    Код:
    Процедура Сформировать()
    Перем ТЗ, ДокЗ, ДокВ, ДокС, Запрос, Таб, i;
    
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса = 
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбДата по ВыбДата;
    |Товар = Регистр.Партии.Номенклатура;
    |ОстатокТовара = Регистр.Партии.Количество;
    |Функция Остаток = КонОст(ОстатокТовара);
    |Группировка Товар без групп;
    |"//}}ЗАПРОС
    ;
    
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;
    
    //Создание таблицы значений
    ТЗ=СоздатьОбъект("ТаблицаЗначений");
    ТЗ.НоваяКолонка("Артикул","Число",,0);
    ТЗ.НоваяКолонка("Наименование","Текст");
    
    ДокЗ=СоздатьОбъект("Документ.ЗакрытиеСменыРеализация");
    ДокЗ.ВыбратьДокументы(ВыбДата,ВыбДата);
    
    ДокВ=СоздатьОбъект("Документ.РасходнаяНакладная");
    ДокВ.ВыбратьДокументы(ВыбДата,ВыбДата);
    
    ДокС=СоздатьОбъект("Документ.Списание");
    ДокС.ВыбратьДокументы(ВыбДата,ВыбДата);
    
    //Создание таблицы
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("ВыбывшиеПозиции");
    Таб.ВывестиСекцию("Шапка|Основная");
    
    //Заполняем ТЗ номенклатурой из Z-отчётов
    Состояние("Обработка Z-Отчётов");
    Пока ДокЗ.ПолучитьДокумент()=1 Цикл
    ДокЗ.ВыбратьСтроки();
    Пока ДокЗ.ПолучитьСтроку()=1 Цикл
    ТЗ.НоваяСтрока();
    ТЗ.Артикул=ДокЗ.Номенклатура.Артикул;
    ТЗ.Наименование=ДокЗ.Номенклатура.ПолнНаименование;
    КонецЦикла;
    КонецЦикла;
    
    //Заполняем ТЗ номенклатурой из возвратов
    Состояние("Обработка возвратов");
    Пока ДокВ.ПолучитьДокумент()=1 Цикл
    ДокВ.ВыбратьСтроки();
    Пока ДокВ.ПолучитьСтроку()=1 Цикл
    ТЗ.НоваяСтрока();
    ТЗ.Артикул=ДокВ.Номенклатура.Артикул;
    ТЗ.Наименование=ДокВ.Номенклатура.ПолнНаименование;
    КонецЦикла;
    КонецЦикла;
    
    //Заполняем ТЗ номенклатурой из списаний
    Состояние("Обработка списаний");
    Пока ДокС.ПолучитьДокумент()=1 Цикл
    ДокС.ВыбратьСтроки();
    Пока ДокС.ПолучитьСтроку()=1 Цикл
    ТЗ.НоваяСтрока();
    ТЗ.Артикул=ДокС.Номенклатура.Артикул;
    ТЗ.Наименование=ДокС.Номенклатура.ПолнНаименование;
    КонецЦикла;
    КонецЦикла;
    
    //Удаляем повторяющиеся строки
    ТЗ.Свернуть("Артикул","Наименование");
    
    Состояние("Проверка остатков");
    Для i = 1 По ТЗ.КоличествоСтрок() Цикл
    ТЗ.ПолучитьСтрокуПоНомеру(i);
    //??????????????????????????????????????????????
    
    КонецЦикла;
    
    Таб.ТолькоПросмотр(1);
    Таб.Показать("ВыбывшиеПозиции", "");
    КонецПроцедуры
    
    Заранее благодарен, если кто-то поможет.
  2. Stado_adama
    Offline

    Stado_adama Модераторы Модератор

    Регистрация:
    27 ноя 2007
    Сообщения:
    1.086
    Симпатии:
    0
    Баллы:
    26
    когда перебераешь документы, ты не в ТЗ коды с наименованием закидывай, а в СЗ сами элементы... типа
    Код:
    СЗ.ДобавитьЗначение(ДокВ.Номенклатура);
    
    а в запросе потом пропиши условие
    Код:
    |Условие(Товар в СЗ);
    

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