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

если СокрЛП(ТекСтрокаТабличнаяЧасть1.Товар.Родитель)="002_ИЗДЕЛИЯ"  тогда
        ШК=ТекСтрокаТабличнаяЧасть1.ШтрихКод;
        ШтК=ЛЕВ(ШК,13);
              //{{КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА
    // Данный фрагмент построен конструктором.
    // При повторном использовании конструктора, внесенные вручную изменения будут утеряны!!!
    
    Запрос = Новый Запрос;
    Запрос.Текст =
        "ВЫБРАТЬ
        |    ОтправкаОстатки.Пункт,
        |    ОтправкаОстатки.ВремяОтправки,
        |    ОтправкаОстатки.Контрагент,
        |    ОтправкаОстатки.Комментарий,
        |    ОтправкаОстатки.Маршрут,
        |    ОтправкаОстатки.ВремяПрибытия,
        |    ОтправкаОстатки.Код,
        |    ОтправкаОстатки.ПлощадьОстаток
        |ИЗ
        |    РегистрНакопления.Отправка.Остатки КАК ОтправкаОстатки
        |ГДЕ
        |    ОтправкаОстатки.Код = &ШтК";
    
    Запрос.УстановитьПараметр("Штк", Штк);    
    //Рез = Запрос.Выполнить.Выбрать();
    
    РезультатЗапроса = Запрос.Выполнить();    
    ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
    КодОтпр=ВыборкаДетальныеЗаписи.Код;    
    Сообщить(КодОтпр);
    Если ШтК=ВыборкаДетальныеЗаписи.Код Тогда
        
            Движения.Отправка.Записывать=Истина;
            Движение=Движения.Отправка.Добавить();
            Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
            Движение.Период=Дата;
            Движение.Контрагент=Контрагент;
            Движение.Комментарий=ВыборкаДетальныеЗаписи.Комментарий;
            Движение.Маршрут=ВыборкаДетальныеЗаписи.Маршрут;
            Движение.Пункт=ВыборкаДетальныеЗаписи.Пункт;
            Движение.ВремяОтправки=ВыборкаДетальныеЗаписи.ВремяОтправки;
            Движение.ВремяПрибытия=ВыборкаДетальныеЗаписи.ВремяПрибытия;
            Движение.Площадь=ВыборкаДетальныеЗаписи.ПлощадьОстаток;
            Движение.Код=ВыборкаДетальныеЗаписи.Код;

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

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

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


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

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

Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
    КодОтпр=ВыборкаДетальныеЗаписи.Код;    
    Сообщить(КодОтпр);
    Если ШтК=ВыборкаДетальныеЗаписи.Код Тогда
    
        // Вставить обработку выборки ВыборкаДетальныеЗаписи
        
    //}}КОНСТРУКТОР_ЗАПРОСА_С_ОБРАБОТКОЙ_РЕЗУЛЬТАТА

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

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

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

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


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

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

Ну или

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

вместе

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