Имя: Пароль:
1C
1С v8
УП. Есть у меня 'Упр.приложение глазами пользователя', в нём запрос на наличие товаров.
,
0 aka AMIGO
 
27.01.18
15:08
Гл.1.2, уточняю для тех, у кого оно тоже есть.
(Если нет - то приведу их Запрос)
Запросом проверяется наличие товаров на Складе.
Что-то Запрос не работает, как задумано
Для меня он пока сложен, но часть вполне понятна.
Из ТЧ документа формируется ВТ, далее - левое соединение с выборкой из регистра РН Товарные запасы.. Мож чего и не просек..
Я так понимаю, что при Левом С. должны вывестись в некую табличку товары из ТЧ, либо сработать простой перебор выборки, с сообщениями о недостатке кол-ва.
В цикл по обработке ВыборкаРезультатаСНехваткой не попадает..
Данные вроде-б нецелованные, не должно бы так быть..
1 aka AMIGO
 
27.01.18
15:10
Пожалуй, приведу Запрос:
//Контроль остатков при оперативном проведении
    Если Режим = РежимПроведенияДокумента.Оперативный Тогда
        // Создадим запрос, чтобы контролировать остатки по товарам
        Запрос = Новый Запрос("ВЫБРАТЬ
                              |    ТоварыВДокументе.Товар КАК Товар,
                              |    СУММА(ТоварыВДокументе.Количество) КАК Количество,
                              |    МАКСИМУМ(ТоварыВДокументе.НомерСтроки) КАК НомерСтроки
                              |
                              |ПОМЕСТИТЬ ТребуетсяТовара
                              |
                              |ИЗ
                              |    Документ.РасходТовара.Товары КАК ТоварыВДокументе
                              |
                              |ГДЕ
                              |    ТоварыВДокументе.Ссылка = &Ссылка
                              |    И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)
                              |
                              |СГРУППИРОВАТЬ ПО
                              |    ТоварыВДокументе.Товар
                              |
                              |ИНДЕКСИРОВАТЬ ПО
                              |    Товар
                              |;
                              |
                              |////////////////////////////////////////////////////////////////////////////////
                              |ВЫБРАТЬ
                              |    ПРЕДСТАВЛЕНИЕ(ТребуетсяТовара.Товар) КАК ТоварПредставление,
                              |    ВЫБОР
                              |        КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество
                              |            ТОГДА ТоварыВДокументе.Количество
                              |        ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
                              |    КОНЕЦ КАК Нехватка,
                              |    ТоварыВДокументе.Количество - ВЫБОР
                              |        КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество
                              |            ТОГДА ТоварыВДокументе.Количество
                              |        ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
                              |    КОНЕЦ КАК МаксимальноеКоличество,
                              |    ТребуетсяТовара.НомерСтроки КАК НомерСтроки
                              |
                              |ИЗ
                              |    ТребуетсяТовара КАК ТребуетсяТовара
                              |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки(
                              |                ,
                              |                Товар В
                              |                        (ВЫБРАТЬ
                              |                            ТребуетсяТовара.Товар
                              |                        ИЗ
                              |                            ТребуетсяТовара)
                              |                    И Склад = &Склад) КАК ТоварныеЗапасыОстатки
                              |        ПО ТребуетсяТовара.Товар = ТоварныеЗапасыОстатки.Товар
                              |        ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходТовара.Товары КАК ТоварыВДокументе
                              |        ПО ТребуетсяТовара.Товар = ТоварыВДокументе.Товар
                              |            И ТребуетсяТовара.НомерСтроки = ТоварыВДокументе.НомерСтроки
                              |
                              |ГДЕ
                              |    ТоварыВДокументе.Ссылка = &Ссылка И
                              |    0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
                              |
                              |УПОРЯДОЧИТЬ ПО
                              |    НомерСтроки");

        Запрос.УстановитьПараметр("Склад", Склад);
        Запрос.УстановитьПараметр("Ссылка", Ссылка);
        РезультатСНехваткой = Запрос.Выполнить();

        ВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать();

        // Выдадим ошибки для строк, в которых не хватает остатка
        Пока ВыборкаРезультатаСНехваткой.Следующий() Цикл
2 zippygrill
 
27.01.18
15:11
Помещай данные РН Товарные запасы в ВТ и потом соединяй с ТЧ документа
3 aka AMIGO
 
27.01.18
15:12
ЗЫ. Приложение - вполне легальное.
4 aka AMIGO
 
27.01.18
15:13
(2) А, то бишь - наоборот.. Ладушки, таймаут беру.
Работаю мееееедленно, та чно, прошу извинить за тягомотину :)
5 aka AMIGO
 
27.01.18
15:15
Одно сообранже только напрягает.. ВТ будет огромной. У нас 19.000 товаров в справочнике, нетбук мой не выдержит :)
6 Defender aka LINN
 
27.01.18
15:56
(5) Огромная - это несколько миллионов записей
7 breezee
 
27.01.18
16:22
(0) Вот тут у вас отбор
    |    ТоварыВДокументе.Ссылка = &Ссылка
                              |    И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)

У вас вид товара случайно не услуга в ваших нецелованных данных?)

Не думали переделать вот эту часть кода
РезультатСНехваткой = Запрос.Выполнить();

        ВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать();

на:
РезультатЗапроса = Запрос.Выполнить();

        ВыборкаРезультатаСНехваткой = РезультатЗапроса.Выбрать();

Потому что, я никогда еще не видел, чтобы переменная в которую помещается результат запроса называлась не "Результат запроса"))
8 breezee
 
27.01.18
16:25
(4)
(0) В цикл по обработке ВыборкаРезультатаСНехваткой не попадает.

А, у вас результат запроса пустой? Так бы и сказали

Вот эта часть кода у вас что делает? Когда ответите на вопрос, и поймете, почему данных у вас и нет
|ГДЕ
                              |    ТоварыВДокументе.Ссылка = &Ссылка И
                              |    0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
9 aka AMIGO
 
27.01.18
17:02
(6-8) Спасибо, ребята, за внимание.
(8) Именно над этим и ломаю голову.
БД учебная, так что авторы её должны учить, как правильно сделать..
А "неправильно" так я и сам мастак :)

Итак..
1.
чтобы переменная в которую помещается результат запроса называлась не "Результат запроса"))
- строки писаны учителями! )
2.
|ГДЕ
|    ТоварыВДокументе.Ссылка = &Ссылка
По-моему представлению, это указание на док в запросе, из которого выбираем ТЧ и строим ВТ

3.
|    0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)
конструкция для меня новая, я-б написал без ЕСТЬNULL

Ну, семерочник, что с меня взять?.. :((
10 breezee
 
27.01.18
17:20
(9) - строки писаны учителями! )
Есть автор? Если это учебный центр1 - пойду сожгу пару сертификатов, пожалуй))
>конструкция для меня новая, я-б написал без ЕСТЬNULL
Нет, я не про естьнал, с ним все ок. Я про то, где это используется.
Вот, смотрите
1)Вы выбираете данные из документ
2)Вы связываетесь с данными из регистра левым соединением. У вас получается таблица, где ВСЕ строки из документа + строки из регистра, которые соответствуют условиям связи
3)В таблице, которая получилась вы удаляете в конструкции "ГДЕ" вообще все строки, которые не соответствуют условию. То есть вы режете всю таблицу, а не только одну из таблиц связи. Конкретно в вашей задаче обрежатся данные, которых в регистре нет, даже если они есть в документе
Как-то так
11 Сияющий Асинхраль
 
27.01.18
20:51
(7) "Потому что, я никогда еще не видел, чтобы переменная в которую помещается результат запроса называлась не "Результат запроса"" - сильный совет!!! Не думаешь, что переменная, она на то и переменная, что называть ее можно как вздумается, а уж переменная "РезультатЗапроса" уж точно не относится к зарезервинованным словам, поэтому и называться может как угодно в том числе и "ВыборкаРезультатаСНехваткой" от этого результаты запроса не изменятся, также как не изменится значение переменной "А", если ее обозвать "Б", но не изменить способ формирования...
12 Сияющий Асинхраль
 
27.01.18
21:00
А вот условие в (8) и правда странное. Я имею в виду его вторую часть:

0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0)

Здесь пофиг на ЕстьNULL, оно всего навсего расставляет нули вместо неопределенных значений, здесь странно то, что в запросе это условие оставляет только отрицательные остатки :-), а то бишь КоличествоОстаток < 0 , иначе говоря убирает из  запроса все реальные остатки, вот у тебя там и нет ничего... Походу, просто знак сравнения не в ту сторону поставили...
13 Лефмихалыч
 
27.01.18
22:40
(1) второе левое соединение с табличной частью убери, оно ненужно.
14 Лефмихалыч
 
27.01.18
22:41
+(13) которое "ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходТовара.Товары КАК ТоварыВДокументе"

ТоварыВДокументе - это твоя ВТ и есть, соединения с ней достаточно.
15 Tateossian
 
27.01.18
22:51
А зачем в запросе на остатки оператор ПРЕДСТАВЛЕНИЕ? Для печатных форм - оно понятно, но вот тут на кой черт?
Закон Брукера: Даже маленькая практика стоит большой теории.