Имя: Пароль:
1C
1C 7.7
v7: Табличная часть документа и регистр в запросе
0 ziPedro
 
12.10.13
18:45
Есть документ с табличной частью, движений по регистрам он не делает. Есть отчет который по документу просто выводит строки из табличной части с наименованием номенклатуры. Нужно присоединить секцию с актуальным остатком ТМЦ по этой номенклатуре из регистра. Создаю 2 запроса 1 вытаскивает строки из документа, второй смотрит строки в регистре. Сравниваю наименование номенклатуры в документе с наименованием в регистре(Знаю что долго, но отчет делается за 1 день поэтому клиента устраивает), так вот если в регистре есть на данный момент времени в наличии номенклатура, то он выводит ее в отчет, а что делать если номенклатуры нет? как вывести нулевое значение? Помогите пожалуйста уже весь моск сломал.
Код отчета:
Процедура КОтправке()
    Перем Запрос, ТекстЗапроса, Таб;
    //Создание объекта типа Запрос
    Запрос = СоздатьОбъект("Запрос");
    ЗапросРегистр = СоздатьОбъект("Запрос");
    
    ТекстЗапроса =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы все;
    |Обрабатывать НеПомеченныеНаУдаление;  
    |ТекДок = Документ.Заказ.ТекущийДокумент;
    |Дата = Документ.Заказ.ДатаДок;
    |Строка = Документ.Заказ.НомерСтроки;
    |Номер = Документ.Заказ.НомерДок;
    |Наименование = Документ.Заказ.Наименование.Наименование;
    |Артикул = Документ.Заказ.Артикул;
    |Анулирован = Документ.Заказ.Анулирован;
    |Количество = Документ.Заказ.Количество;
    |Обзвонено = Документ.Заказ.Обзвонено;    
    |Заказать = Документ.Заказ.Заказать;
    |Отправлено = Документ.Заказ.Отправлено;
    |Размер = Документ.Заказ.Размер;
    |Доставка = Документ.Заказ.ДостКурьером;
    |Цвет = Документ.Заказ.Цвет;
    |Группировка Номер ;
    |Группировка Строка ;
    //|Условие(Обзвонено = 1);
    //|Условие(Анулирован = 0);
    |Условие(Отправлено = 0);
    |Условие(Количество <> 0);
    |"//}}ЗАПРОС
    ;
    
    ТекстЗапросаРегистр =
    "//{{ЗАПРОС(Сформировать)
    |Период с ВыбНачПериода по ВыбКонПериода;
    |ОбрабатыватьДокументы все;
    |Код = Регистр.ОстаткиТМЦ.Номенклатура.Код;
    |Наименование1 = Регистр.ОстаткиТМЦ.Номенклатура.Наименование;
    |Количество = Регистр.ОстаткиТМЦ.Количество;
    |Функция КоличествоКонОст = КонОст(Количество);
    |Группировка Наименование1 все ВошедшиеВЗапрос  ;
    |"//}}ЗАПРОС
    ;
    
    Если Курьер = 1 Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |Условие( Доставка = 1 ) ;";
    КонецЕсли;    
    Если Почта = 1 Тогда
        ТекстЗапроса = ТекстЗапроса + "
        |Условие( Доставка = 0 ) ;";
    КонецЕсли;
    Если (Курьер = 1) и (Почта = 1)  Тогда
        Предупреждение("Выберите Курьером или почтой, либо снимите обе галочки");
        Возврат;
    КонецЕсли;
    
    // Если ошибка в запросе, то выход из процедуры
    Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
        Возврат;
    КонецЕсли;
    Если ЗапросРегистр.Выполнить(ТекстЗапросаРегистр) = 0 Тогда
        Возврат;
    КонецЕсли;
    
    // Подготовка к заполнению выходных форм данными запроса
    Таб = СоздатьОбъект("Таблица");
    Таб.ИсходнаяТаблица("К отправке");
    // Заполнение полей "Заголовок"
    Таб.ВывестиСекцию("Заголовок");
    Состояние("Заполнение выходной таблицы...");
    Таб.Опции(0, 0, Таб.ВысотаТаблицы(), 0);
    х = 0;
    Пока Запрос.Группировка(1) = 1 Цикл
        Таб.ВывестиСекцию("Номер");
        //Пока Запрос.Группировка(2) = 1 Цикл
        Пока Запрос.Группировка(2) = 1 Цикл
            Пока ЗапросРегистр.Группировка(1) = 1 цикл
                Если СокрЛП(Запрос.Наименование) = СокрЛП(ЗапросРегистр.Наименование1) тогда
                    х = ЗапросРегистр.КоличествоКонОст;
                    Таб.ВывестиСекцию("Наименование");
                КонецЕсли;
            КонецЦикла;
        КонецЦикла;
        // Заполнение полей Наименование
    КонецЦикла;
    //Вывод заполненной формы
    Таб.ТолькоПросмотр(1);
    Таб.Показать("К отправке", "");
КонецПроцедуры
1 Рэйв
 
12.10.13
18:50
переходи на 8-ку, динозавр:-)  Там это реализовано 2 словами.
Левое соединение.
А в 77 я помню была фишка вроде чтобы включать в  запрос все. но где не помню.
2 ziPedro
 
12.10.13
18:52
Я бы перешел но это самописная база клиента которого не удается перетянуть на 8ку, но и отказывать ему нельзя :(
3 Рэйв
 
12.10.13
18:56
(2) тогда делаешь левое соединение искуственно.
Получаешь  в ТЗ1 полныйц список номенклатуры, а в ТЗ2 полный список номенклатуры с остатками

Перебираешь первую и ищешь во второй. Не нашел- значит 0.
4 dangerouscoder
 
12.10.13
18:57
За день? Жесть какая.. Я лет 5 назад переводил такую конфу на прямые запросы..
5 viktor_vv
 
12.10.13
18:59
В первом запросе добавь

    |НаименованиеТМЦ = Документ.Заказ.Наименование;

    |Группировка ТекЗаказ ;
    |Группировка СтрокаДокумента ;
во втором


   |НаименованиеТМЦ = Регистр.ОстаткиТМЦ.Номенклатура;
//  |Группировка Наименование1 все ВошедшиеВЗапрос  ;

  |Группировка НаименованиеТМЦ   ;


       Пока Запрос.Группировка(2) = 1 Цикл
ЗапросРегистр.вНачалоВыборки();
Если ЗапросРегистр.Получить(Запрос.НаименованиеТМЦ) = 1
//            Пока ЗапросРегистр.Группировка(1) = 1 цикл
//                Если СокрЛП(Запрос.Наименование) = СокрЛП(ЗапросРегистр.Наименование1) тогда
                    х = ЗапросРегистр.КоличествоКонОст;
                    Таб.ВывестиСекцию("Наименование");
                КонецЕсли;
         //   КонецЦикла;
        КонецЦикла;
6 viktor_vv
 
12.10.13
19:00
Точнее

       Пока Запрос.Группировка(2) = 1 Цикл
           ЗапросРегистр.вНачалоВыборки();
           Если ЗапросРегистр.Получить(Запрос.НаименованиеТМЦ) = 1
//            Пока ЗапросРегистр.Группировка(1) = 1 цикл

//                Если СокрЛП(Запрос.Наименование) = СокрЛП(ЗапросРегистр.Наименование1) тогда

                    х = ЗапросРегистр.КоличествоКонОст;

Иначе
х = 0 ;
                КонецЕсли;
                    Таб.ВывестиСекцию("Наименование");
         //   КонецЦикла;

        КонецЦикла;
7 viktor_vv
 
12.10.13
19:02
И быстрее будет, а то у тебя конечно жесть полная.
8 ziPedro
 
12.10.13
19:15
2 viktor_vv Спасибо тебе огромное, все получилось.
9 viktor_vv
 
12.10.13
19:16
(7) + Забыл еще, во втором так
|Группировка НаименованиеТМЦ   Без групп;

Чтобы иерархию не строил.
10 Gepard
 
12.10.13
19:33
начни изучать 1с++, очень классно такие штуки делаются на прямых запросах