Имя: Пароль:
1C
1С v8
Не заполняется ТЧ.
0 Maikroft
 
22.02.18
09:23
Добрый день.
В документе есть две табличные части на форме. Одну из них требуется заполнить по тарифам вот такой вот процедурой, вызываемой из команды.  Запрос данные собирает верно, но заполнения при этом не происходит. При этом ошибок никаких не выдает. Может, сможете посоветовать?
&НаСервере
Процедура ЗаполнитьСуммыПоТарифуПрочееПаллетыНаСеpвере()
    
    Запрос = Новый Запрос;
    Запрос.Текст = "ВЫБРАТЬ
                   |    ЕСТЬNULL(СкладскиеУслугиПрочееПаллеты.КоличествоОтгруженныхПаллет, 0) КАК КоличествоОтгруженныхПаллет,
                   |    ЕСТЬNULL(ЕСТЬNULL(СкладскиеУслугиПрочееПаллеты.КоличествоОтгруженныхПаллет, 0) * ЕСТЬNULL(ТарифнаяСеткаКЛУОтгрузкаСрезПоследних.ТарифПаллет, 0), 0) КАК СуммаЗатратПоТарифу,
                   |    ЕСТЬNULL(ТарифнаяСеткаКЛУОтгрузкаСрезПоследних.ТарифПаллет, 0) КАК ТарифПаллет
                   |ИЗ
                   |    Документ.СкладскиеУслуги.ПрочееПаллеты КАК СкладскиеУслугиПрочееПаллеты
                   |        ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ТарифнаяСеткаКЛУОтгрузка.СрезПоследних(&Период, ) КАК ТарифнаяСеткаКЛУОтгрузкаСрезПоследних
                   |        ПО СкладскиеУслугиПрочееПаллеты.Ссылка.Склад = ТарифнаяСеткаКЛУОтгрузкаСрезПоследних.Склад
                   |ГДЕ
                   |    СкладскиеУслугиПрочееПаллеты.Ссылка = &ТекущееКЛУ";
    
    Запрос.УстановитьПараметр("ТекущееКЛУ", Объект.Ссылка);
    Запрос.УстановитьПараметр("Период", Объект.Месяц);
    Выборка = Запрос.Выполнить().Выбрать();
    Если Выборка.Следующий() Тогда
        Если Выборка.ТарифПаллет = 0 Тогда
            Сообщение = "Не задан тариф на отгрузку транзитных паллет для " + Объект.Склад + " на " + Объект.Месяц;
            Сообщить(Сообщение);
        Иначе
            Выборка.Сбросить();
            Пока Выборка.Следующий() Цикл
                Для Каждого Стр из Объект.ПрочееПаллеты Цикл
                    Стр.СуммаЗатратПоТарифу = Выборка.СуммаЗатратПоТарифу;
                КонецЦикла;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
    
КонецПроцедуры
1 Mort
 
22.02.18
09:27
Впервые за много лет вижу использование "Выборка.Сбросить()"
2 Maikroft
 
22.02.18
09:35
Ну, мне требуется проверить первую строку, если она не 0, то можно продолжать. Не имеет смысла в цикле крутить эту проверку.
3 Maikroft
 
22.02.18
09:36
Ибо Тариф одинаковый для всех строк, если он задан.
Можно еще просто первую строку выбирать, но с моим знанием 1С пока не получилось.)
4 Малыш Джон
 
22.02.18
09:36
(2) это можно сделать и в цикле Пока Выборка.Следующий()
и если она равна 0 - то Прервать;
5 Малыш Джон
 
22.02.18
09:37
+ (4) если она равна = если тариф равен
6 Малыш Джон
 
22.02.18
09:38
(0) если честно -смущает код

Пока Выборка.Следующий() Цикл
  Для Каждого Стр из Объект.ПрочееПаллеты Цикл
    Стр.СуммаЗатратПоТарифу = Выборка.СуммаЗатратПоТарифу;
  КонецЦикла;
КонецЦикла;

почему ты думаешь, что у тебя порядок строк в ТЧ документа и порядок строк в выборке - совпадают?
7 dezss
 
22.02.18
09:41
Объект.ПрочееПаллеты случайно не пустая ТЧ?
8 smilemanrus
 
22.02.18
10:20
(0) Типы значения проверял?
может быть не совпадают?
9 Maikroft
 
22.02.18
10:25
Прервать использовать не могу, там дальше еще один запрос, поэтому пришлось так.

ПрочееПаллеты заполненная ТЧ, в запросе все считается верно и выводится в три столбца, как и должно быть. Порядок строк в ТЧ документа и выборке совпадают (по крайней мере судя по запросу).

Типы значений везде Число, на всякий случай проверил.

Даже если убрать проверку на 0 значение, все равно такая же картина.
10 Maikroft
 
22.02.18
10:26
Да, второй запрос пока закомментировал, чтобы исключить влияние.
11 dezss
 
22.02.18
10:46
я как всмотрелся в код, так волосы зашевелились...
нафига цикл в цикле?
бери первый попавшийся ТарифПаллет, 1 раз проходи тч и в этом проходе все считай:
Стр.СуммаЗатратПоТарифу = стр.КоличествоОтгруженныхПаллет*ТарифПаллет;
12 dezss
 
22.02.18
10:48
(11) + если это сложно тебе для понимания, то делай так:
    Если Выборка.Следующий() Тогда
        Если Выборка.ТарифПаллет = 0 Тогда
            Сообщение = "Не задан тариф на отгрузку транзитных паллет для " + Объект.Склад + " на " + Объект.Месяц;
            Сообщить(Сообщение);
        Иначе
            ТарифПаллет = Выборка.ТарифПаллет;
            Для Каждого Стр из Объект.ПрочееПаллеты Цикл
                Стр.СуммаЗатратПоТарифу = стр.КоличествоОтгруженныхПаллет*ТарифПаллет;
            КонецЦикла;
        КонецЕсли;
    КонецЕсли;
13 Малыш Джон
 
22.02.18
10:53
(9) Прервать прерывает не процедуру а цикл, в котором он используется
14 Maikroft
 
22.02.18
10:54
Так, спасибо огромное за советы, пойду пробовать.
Я только учусь, так что не обессудьте.)
15 Малыш Джон
 
22.02.18
10:58
(12) да, так будет гораздо правильнее

да и с самим тарифом можно запрос не городить,а использовать

Отбор  = Новый Структура("Склад",Объект.Склад);

ТаблицаСреза= РегистрыСведений.ТарифнаяСеткаКЛУОтгрузка.СрезПоследних(Объект.Месяц, Отбор);

Если ТаблицаСреза.Количество()=0 Тогда Сообщить("Низя!")
Иначе Тариф = ТаблицаСреза[0].ТарифПаллет Конец
16 Мимохожий Однако
 
22.02.18
10:59
(0) Выборка.СуммаЗатратПоТарифу = 0 ИМХО
17 Maikroft
 
22.02.18
17:31
dezss, тебе отдельное спасибо, поправил так, как ты порекомендовал, все считается. Я просто читал, что в запросе проще сразу подсчитывать.