7.7 Как синхронизировать два запроса?

Тема в разделе "Конфигурирование на платформе "1С:Предприятие 7.7"", создана пользователем Не волшебник, 5 фев 2007.

  1. TopicStarter Overlay
    Не волшебник
    Offline

    Не волшебник

    Регистрация:
    5 фев 2007
    Сообщения:
    2
    Симпатии:
    0
    Баллы:
    1
    Как в 1С можно синхронизировать два запроса.Если точнее:
    Есть задание разработать отчет, который должен отражать остатки на начало и на конец выбранного пользователем периода и обороты его за период в количественном выражении.(Задание из контрольной работы по курсу "Базовые объекты").при этом нужно сделать два запроса - один "с начала времен" и до даты начала периода отчета (не включая её) и другой по заданному пользователю периоду. Синхронизировать запросы предложили бегая по одному их них в цикле, позиционируясь на результате другого(метод Получить("значение группировки Товар"), вынимая из него данные по выбранному товару.
    Получилось следующее:

    Процедура Сформировать()

    Перем НаНачало, Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    НаНачало = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с '01.01.1900' по (ВыбНачПериода-1);
    |ОбрабатыватьДокументы все;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Товар = Документ.ПрихНакл.Товар, Документ.РасхНакл.Товар, Справочник.Товары.ТекущийЭлемент;
    |ПриходНаНачало = Документ.ПрихНакл.Количество;
    |РасходНаНачало = Документ.РасхНакл.Количество;
    |Функция ПриходНаНачалоСум = Сумма(ПриходНаНачало);
    |Функция РасходНаНачалоСум = Сумма(РасходНаНачало);
    |Функция ОстатокНаНачало = Сумма((ПриходНаНачало)-(РасходНаНачало));
    |Группировка Товар упорядочить по Товар.Наименование;
    |Условие(Товар в ВыбТовар);
    |"//}}ЗАПРОС
    ;
    Если НаНачало.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;


    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы все;
    |Обрабатывать НеПомеченныеНаУдаление;
    |Товар = Документ.ПрихНакл.Товар, Документ.РасхНакл.Товар, Справочник.Товары.ТекущийЭлемент;
    |Приход = Документ.ПрихНакл.Количество;
    |Расход = Документ.РасхНакл.Количество;
    |Функция ПриходСумма = Сумма(Приход);
    |Функция РасходСумма = Сумма (Расход);

    |Функция ОстатокНаКонец = Сумма((Приход)-(Расход));
    |Группировка Товар упорядочить по Товар.Наименование;
    |Условие(Товар в ВыбТовар);
    |"//}}ЗАПРОС
    ;


    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
    Возврат;
    КонецЕсли;

    Пока Запрос.Группировка("Товар") = 1 Цикл
    НаНачало.Получить(ВыбТовар);

    //вот здесь как-раз и непонятно, как именно выбрать из него данные по выбранному товару?

    КонецЦикла;


    Запрос.Выгрузить(ТЗ,0,1);

    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    // Заполнение полей "Заголовок"
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("Сформировать");
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    Пока Запрос.Группировка(1) = 1 Цикл

    // Заполнение полей Товар
    Таб.ВывестиСекцию("Товар");
    КонецЕсли;
    КонецЦикла;
    // Заполнение полей "Итого"
    Таб.ВывестиСекцию("Итого");
    // Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("Сформировать", "");
    КонецПроцедуры

    И еще : Чтобы пустые строки не попадали в отчет( по тем товарам, у которых и остатка и движений не было) необходимо проверять результаты при выводе в таблицу. Как это сделать?
  2. littlefrankie
    Offline

    littlefrankie

    Регистрация:
    14 дек 2006
    Сообщения:
    15
    Симпатии:
    0
    Баллы:
    1
    Не понятно зачем ты вызываешь НаНачало.Получить(ВыбТовар) если у тебя и так в запросе
    Условие(Товар в ВыбТовар);
    Может надо так:

    Код:
    Пока Запрос.Группировка("Товар") = 1 Цикл
    Если НаНачало.Получить(Запрос.Товар)=1 Тогда
    //выбрать данные по выбранному товару
    КонецЕсли;
    КонецЦикла;
    
    Также не понятно зачем в запросе
    Товар = Документ.ПрихНакл.Товар, Документ.РасхНакл.Товар, Справочник.Товары.ТекущийЭлемент;
    если конструкция вида
    Товар = Справочник.Товары.ТекущийЭлемент;
    и так перебирает все товары
  3. Enot79
    Offline

    Enot79

    Регистрация:
    28 мар 2007
    Сообщения:
    1
    Симпатии:
    0
    Баллы:
    1
    Здравствуйте!Вы доделали отчет???Если сделали,помогите,пожалуйста,никак не справлюсь с этой синхронизацией((
  4. pOkEmOn
    Offline

    pOkEmOn

    Регистрация:
    1 мар 2007
    Сообщения:
    34
    Симпатии:
    0
    Баллы:
    1
    есть такая конструкция, как Запрос.Получить(<сюда пихаем например Запрос2.Товар>);

    получается выборка из запроса приходит в соответствие с запросом2
    и это в цикле переборки группировок запроса

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