Имя: Пароль:
1C
1С v8
Помогите с запросом
0 AlvlSpb
 
10.02.17
20:07
ломал голову, но так и не сообразил как сделать. Задача - отобрать заказы покупателя и номенклатуру где в ТЧ Запасы есть резервирование товара, но на дату заказа нет этого товара на складах. Казалось бы просто. Сделал запрос:

Код:
"ВЫБРАТЬ
|    ЗаказПокупателяЗапасы.Ссылка,
|    ЗаказПокупателяЗапасы.Ссылка.Дата,
|    ЗаказПокупателяЗапасы.Номенклатура,
|    ЗаказПокупателяЗапасы.Резерв,
|    ЗапасыОстатки.КоличествоОстаток
|ИЗ
|    Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
|        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки(&Дата, ) КАК ЗапасыОстатки
|        ПО ЗаказПокупателяЗапасы.Номенклатура = ЗапасыОстатки.Номенклатура
|ГДЕ
|    ЗаказПокупателяЗапасы.Резерв > 0
|    И ЗапасыОстатки.КоличествоОстаток = 0


Но параметр &Дата в вирт таблице Запасы.Остатки должна быть дата заказа, т.е. результат этой же выборки - Выборка.Дата
  Как можно получить нужную дату в данном случае?
1 ГдеСобака Зарыта
 
10.02.17
20:10
В поиск "срез последних на каждую дату".
2 AlvlSpb
 
10.02.17
20:14
(1) Какой срез последних? - регистр накопления а не сведений. И в том и вопрос, что заказов тьма и нужно проверить в каких есть резерв но на ДАТУ заказа этого товара не было на складах
3 jsmith82
 
10.02.17
20:22
(2) ты его не понял
4 AlvlSpb
 
10.02.17
20:24
(3) Возможно. Тогда нужно разъяснение
5 jsmith82
 
10.02.17
20:28
Да там про логику запроса к РС. Получаем цену на разные даты
В данном случае у нас должна быть таблица ОстаткиИОбороты РН с периодичностью Регистратор
6 AlvlSpb
 
10.02.17
20:33
(5) Кажется начинаю понимать. Сейчас попробую. Спасибо за разъяснение
7 AlvlSpb
 
10.02.17
21:02
Нет. Не разобрался. Вопрос остается
8 jsmith82
 
10.02.17
21:12
Опаньке
9 jsmith82
 
10.02.17
21:12
проблема с соединением двух таблиц?
10 AlvlSpb
 
10.02.17
21:32
(9) Кажется сделал. Соединил таблицы так

Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.Остатки КАК ЗапасыОстатки
        ПО (ЗаказПокупателяЗапасы.Ссылка = ЗапасыОстатки.ЗаказПокупателя.Ссылка)
11 h-sp
 
10.02.17
21:45
(10) не прокатит
12 AlvlSpb
 
10.02.17
21:50
(11) Да. Проверил отчетами. Врет
13 h-sp
 
10.02.17
21:54
(12) если пишешь

РегистрНакопления.Запасы.Остатки

без параметра &Дата, то это значит остатки на сегодняшний день.
14 AlvlSpb
 
10.02.17
22:03
(13) В первоначальном запросе есть этот параметр, но в том и вопрос как его получить, если он тоже результат выборки.
15 h-sp
 
10.02.17
22:57
(14) откажись от таблицы остатки. Пользуйся таблицей ОстаткиИОбороты
16 mkalimulin
 
10.02.17
23:17
(0) Эта задача называется "Остатки на каждую дату в запросе". Посмотрите поиском - найдете примеры решений.
Пользуйтесь конструктором JUG.
http://catalog.mista.ru/public/569569/
Там есть библиотека шаблонов, и этот случай тоже.
17 AlvlSpb
 
10.02.17
23:24
(15) А почему ОстаткиИОбороты? Логики не понимаю

(16) Спасибо за подсказку. Буду разбираться
18 jsmith82
 
10.02.17
23:55
конфы с собой нет
написал в блокноте


ВЫБРАТЬ
       ЗаказПокупателяЗапасы.Ссылка,
       ЗаказПокупателяЗапасы.Ссылка.Дата КАК Дата,
    ЗаказПокупателяЗапасы.Номенклатура,
        ЗаказПокупателяЗапасы.Резерв
ПОМЕСТИТЬ ВтЗаказы
ИЗ
        Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы  
ГДЕ
        ЗаказПокупателяЗапасы.Резерв > 0
;

ВЫБРАТЬ
    ОО.Период,
    ОО.Номенклатура,
    ОО.КоличествоНачальныйОстаток КАК Остаток
ПОМЕСТИТЬ ВтОО
ИЗ
    РегистрНакопления.Запасы.ОстаткиИОбороты(&НачалоПериода, &КонецПЕриода, Регистратор, Движения, ) КАК ОО

;

ВЫБРАТЬ
    ВтЗаказы.Ссылка,
    ВтЗаказы.Дата,
    ВтЗаказы.Номенклатура,
    ВтЗаказы.Резерв,
    МАКСИМУМ(ЕСТЬNULL(ВтОО.Период, Дата(1, 1, 1)) КАК Период
ПОМЕСТИТЬ ВтЗаказыСПериодомСоединения
ИЗ
    ВтЗаказы КАК ВтЗаказы
    ЛЕВОЕ СОЕДИНЕНИЕ ВтОО КАК ВтОО
        ПО ВтЗаказы.Номенклатура = ВтОО.Номенклатура
        И ВтЗаказы.Дата >= ВтОО.Период
СГРУППИРОВАТЬ ПО
    ВтЗаказы.Ссылка,
    ВтЗаказы.Дата,
    ВтЗаказы.Номенклатура,
    ВтЗаказы.Резерв

;

ВЫБРАТЬ
    ВтЗаказыСПериодомСоединения.Ссылка,
    ВтЗаказыСПериодомСоединения.Дата,
    ВтЗаказыСПериодомСоединения.Номенклатура,
    ВтЗаказыСПериодомСоединения.Резерв,
    ЕСТЬNULL(ВтЗаказыСПериодомСоединения.Остаток, 0) КАК Остаток
ИЗ
    ВтЗаказыСПериодомСоединения КАК ВтЗаказыСПериодомСоединения
    ЛЕВОЕ СОЕДИНЕНИЕ ВтОО КАК ВтОО
        ПО ВтЗаказыСПериодомСоединения.Номенклатура = ВтОО.Номенклатура
        И ВтЗаказыСПериодомСоединения.Период = ВтОО.Период
ГДЕ
    ЕСТЬNULL(ВтЗаказыСПериодомСоединения.Остаток, 0) = 0
19 AlvlSpb
 
11.02.17
00:58
(18) Спасибо большое. Работает! Вызывает уважение как такое можно написать без конфигуратора в блокноте (три незначительные ошибки поправил) Снимаю шляпу и огромная благодарность.
20 AlvlSpb
 
11.02.17
12:13
(18) Еще раз спасибо за помощь. Но.

При детальной проверке
выяснилось, что запрос выдает неверные данные. На основе (точнее на идеи) вашего запроса все-таки сделал свой, который выдал правильный результат (проверил более десятка заказов по отчетам и на разные даты). Сомнения остаются. Посмотрите проф взглядом

ВЫБРАТЬ
    ЗаказПокупателяЗапасы.Ссылка КАК Ссылка,
    ЗаказПокупателяЗапасы.Номенклатура КАК Номенклатура,
    ЗаказПокупателяЗапасы.Резерв КАК Резерв,
    ЗапасыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток
ИЗ
    Документ.ЗаказПокупателя.Запасы КАК ЗаказПокупателяЗапасы
        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.Запасы.ОстаткиИОбороты(, , Регистратор, , ) КАК ЗапасыОстаткиИОбороты
        ПО (ЗаказПокупателяЗапасы.Номенклатура = ЗапасыОстаткиИОбороты.Номенклатура)
ГДЕ
    ЗаказПокупателяЗапасы.Резерв > 0
    И ЕСТЬNULL(ЗапасыОстаткиИОбороты.КоличествоКонечныйОстаток, 0) = 0
    И ЗапасыОстаткиИОбороты.Период = ЗаказПокупателяЗапасы.Ссылка.Дата

УПОРЯДОЧИТЬ ПО
    ЗаказПокупателяЗапасы.Ссылка.Дата
21 jsmith82
 
11.02.17
13:13
одну ошибку в (18) нашел
ИЗ
    ВтЗаказыСПериодомСоединения КАК ВтЗаказыСПериодомСоединения
    ЛЕВОЕ СОЕДИНЕНИЕ ВтОО КАК ВтОО
        ПО ВтЗаказыСПериодомСоединения.Номенклатура = ВтОО.Номенклатура
        И ВтЗаказыСПериодомСоединения.Период <= ВтОО.Период

В (20) нерабочий вариант
22 h-sp
 
11.02.17
13:35
(20) вообще очень странный запрос, непонятно зачем он нужен.
Зачем вы выводите

ЗапасыОстаткиИОбороты.КоличествоКонечныйОстаток КАК КоличествоКонечныйОстаток

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