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

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

Запрос в обработке проведения

Запрос в обработке проведения
Я
   prilforreal
 
31.10.18 - 09:46
Доброго утра, Миста! В обработке проведения запросом нахожу приходную запись из того же регистра, чтобы из нее заполнить расходную запись, запросом нахожу ее через штрихкод, но почему то код в самой записи регистра не распознается, подскажите где ошибся?
И еще меня терзают чувства что можно все сделать как то проще, без запроса...

если СокрЛП(ТекСтрокаТабличнаяЧасть1.Товар.Родитель)="002_ИЗДЕЛИЯ"  тогда
        ШК=ТекСтрокаТабличнаяЧасть1.ШтрихКод;
        ШтК=ЛЕВ(ШК,13);
              //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

    // Данный фрагмент построен конструктором.

    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!

    
    Запрос = Новый Запрос;
    Запрос.Текст = 
        "ВЫБРАТЬ
        |    ОтправкаОстатки.Пункт,
        |    ОтправкаОстатки.ВремяОтправки,
        |    ОтправкаОстатки.Контрагент,
        |    ОтправкаОстатки.Комментарий,
        |    ОтправкаОстатки.Маршрут,
        |    ОтправкаОстатки.ВремяПрибытия,
        |    ОтправкаОстатки.Код,
        |    ОтправкаОстатки.ПлощадьОстаток
        |ИЗ
        |    РегистрНакопления.Отправка.Остатки КАК ОтправкаОстатки
        |ГДЕ
        |    ОтправкаОстатки.Код = &ШтК";
    
    Запрос.УстановитьПараметр("Штк", Штк);    
    //Рез = Запрос.Выполнить.Выбрать();

    
    РезультатЗапроса = Запрос.Выполнить();    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    КодОтпр=ВыборкаДетальныеЗаписи.Код;    
    Сообщить(КодОтпр);
    Если ШтК=ВыборкаДетальныеЗаписи.Код Тогда
        
            Движения.Отправка.Записывать=Истина;
            Движение=Движения.Отправка.Добавить();
            Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
            Движение.Период=Дата;
            Движение.Контрагент=Контрагент;
            Движение.Комментарий=ВыборкаДетальныеЗаписи.Комментарий;
            Движение.Маршрут=ВыборкаДетальныеЗаписи.Маршрут;
            Движение.Пункт=ВыборкаДетальныеЗаписи.Пункт;
            Движение.ВремяОтправки=ВыборкаДетальныеЗаписи.ВремяОтправки;
            Движение.ВремяПрибытия=ВыборкаДетальныеЗаписи.ВремяПрибытия;
            Движение.Площадь=ВыборкаДетальныеЗаписи.ПлощадьОстаток;
            Движение.Код=ВыборкаДетальныеЗаписи.Код;

    КонецЕсли;
 
 
   Радим1987
 
1 - 31.10.18 - 09:57
Жди ща начнется)))
   azernot
 
2 - 31.10.18 - 09:58
Самое первое:
нет строки
ВыборкаДетальныеЗаписи.Слудущий()
   prilforreal
 
3 - 31.10.18 - 10:03
(2) Это же обработка проведения, все итак в цикле, мне только одна запись нужна, код которой соответствует коду строки.
   azernot
 
4 - 31.10.18 - 10:05
(3) Мсьё профессионал? Тогда что мсьё делает на Мисте?

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
КодОтпр=ВыборкаДетальныеЗаписи.Код;    

Ожидаемо даёт КОдОТпр = Неопределено.

Чисто ради интереса, попробуй

ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
КодОтпр=ВыборкаДетальныеЗаписи.Код;
   azernot
 
5 - 31.10.18 - 10:06
+(4)
А вообще, код из (0) это треш. Запомни ссылку на эту ветку. Если будешь продолжать изучать 1С, через пару лет загляни в эту ветку. Поржёшь.
   Радим1987
 
6 - 31.10.18 - 10:07
(5) +
   prilforreal
 
7 - 31.10.18 - 10:10
(5) Хорошо) Почитаю обязательно)) Поместил в цикл работу с выборкой и все заработало)
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    КодОтпр=ВыборкаДетальныеЗаписи.Код;    
    Сообщить(КодОтпр);
    Если ШтК=ВыборкаДетальныеЗаписи.Код Тогда
    
        // Вставить обработку выборки ВыборкаДетальныеЗаписи

        
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА


            Движения.Отправка.Записывать=Истина;
            Движение=Движения.Отправка.Добавить();
            Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
            Движение.Период=Дата;
            Движение.Контрагент=Контрагент;
            Движение.Комментарий=ВыборкаДетальныеЗаписи.Комментарий;
            Движение.Маршрут=ВыборкаДетальныеЗаписи.Маршрут;
            Движение.Пункт=ВыборкаДетальныеЗаписи.Пункт;
            Движение.ВремяОтправки=ВыборкаДетальныеЗаписи.ВремяОтправки;
            Движение.ВремяПрибытия=ВыборкаДетальныеЗаписи.ВремяПрибытия;
            Движение.Площадь=ВыборкаДетальныеЗаписи.ПлощадьОстаток;
            Движение.Код=ВыборкаДетальныеЗаписи.Код;

        КонецЕсли;
        КонецЦикла;
   hhhh
 
8 - 31.10.18 - 10:12
(5) он уже давно здесь мелькает. похоже уже ас.
   prilforreal
 
9 - 31.10.18 - 10:12
(5) Спасибо, Сэмпай!)
   azernot
 
10 - 31.10.18 - 10:18
(7) Вопрос вовсе не в цикле.
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
лишь открывает выборку

А вот 
ВыборкаДетальныеЗаписи.Следующий();
позиционирет не следующую запись.

Если в запросе предполагается всего одна строка, то конструкция
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
не нужна. Достаточно спозиционироваться один раз.


Вообще же, желательно при проведении документов,  запрос выполнять один раз, по всей табличной части, а потом уже перебирая результат запроса в цикле формировать движения.

Также крайне нежелательно обращаться к реквизитам ссылки через точку:
ТекСтрокаТабличнаяЧасть1.Товар.Родитель
в этот момент система считывает данные всего объекта Товар, что приводит к тормозам, а поскольку это в транзакции проведения, ещё и к блокировкам.
 
 Рекламное место пустует
   prilforreal
 
11 - 31.10.18 - 10:24
(10) Спасибо! А как спозиционироваться один раз без ВыборкаДетальныеЗаписи.Следующий();?
   azernot
 
12 - 31.10.18 - 10:26
(11) Просто скопировать код из (4).

Ну или
Если ВыборкаДетальныеЗаписи.Следующий() Тогда

вместе

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
   azernot
 
13 - 31.10.18 - 10:26
*(12) вместО
   prilforreal
 
14 - 31.10.18 - 10:28
(13) Ясно, буду практиковать, еще раз спасибо и хорошего дня)

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