Вход | Регистрация

1С:Предприятие :: 1С:Предприятие 8 общая

Не заполняется ТЧ.

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

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

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

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

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

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

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

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

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

Список тем форума
Рекламное место пустует  Рекламное место пустует
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.
Рекламное место пустует