|
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с++, очень классно такие штуки делаются на прямых запросах
|
| Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |