Имя: Пароль:
1C
1С v8
Как правильно написать, чтобы ИНАЧЕ отрабатывало правильно
, , ,
0 KIraA
 
27.07.17
07:03
Добрый день. Вот запрос...при условии если номенклатура не найдена отрабатывает правильно, а при ИНАЧЕ данные по количеству не садятся. Подскажите как правильно написать?

"ВЫБРАТЬ
    |    ПеремещениеТоваровТовары.Ссылка.СсылкаНаХранилищеСмет,
    |    ПеремещениеТоваровТовары.Номенклатура,
    |    СУММА(ПеремещениеТоваровТовары.Количество) КАК Количество,
    |    ПеремещениеТоваровТовары.Ссылка.СкладОтправитель,
    |    ПеремещениеТоваровТовары.Ссылка.СкладПолучатель
    |ИЗ
    |    Документ.ПеремещениеТоваров.Товары КАК ПеремещениеТоваровТовары
    |ГДЕ
    |    ПеремещениеТоваровТовары.Ссылка.СсылкаНаХранилищеСмет = &СсылкаНаХранилищеСмет
    |    И ПеремещениеТоваровТовары.Ссылка.СкладОтправитель = &СкладОтправитель
    |    И ПеремещениеТоваровТовары.Ссылка.СкладПолучатель = &СкладПолучатель
    |    И ПеремещениеТоваровТовары.Ссылка.Проведен
    |
    |СГРУППИРОВАТЬ ПО
    |    ПеремещениеТоваровТовары.Номенклатура,
    |    ПеремещениеТоваровТовары.Ссылка.СсылкаНаХранилищеСмет,
    |    ПеремещениеТоваровТовары.Ссылка.СкладОтправитель,
    |    ПеремещениеТоваровТовары.Ссылка.СкладПолучатель" ;
    
    Запрос.УстановитьПараметр("СсылкаНаХранилищеСмет",Объект.Ссылка);
    Запрос.УстановитьПараметр("СкладОтправитель",Справочники.Склады.НайтиПоНаименованию("Основной склад"));
    Запрос.УстановитьПараметр("СкладПолучатель",Объект.СкладТехника);
    рез = запрос.Выполнить().Выгрузить();
    Данные = Объект.Товары.Выгрузить();
    
    
      Для каждого стр Из рез Цикл
        
        СтрокаТЗ = Данные.Найти(стр.Номенклатура, "Номенклатура");
        Если СтрокаТЗ = Неопределено Тогда
            стрТч = Объект.Товары.Добавить();
            стрТч.Номенклатура =  стр.Номенклатура;
            стрТч.КолФ = стр.Количество;
        иначе
            стрТч = Данные.Найти(стр.Номенклатура, "Номенклатура");
            стрТч.КолФ = стр.Количество;    
        КонецЕсли;
        
    КонецЦикла;
1 Amra
 
27.07.17
07:05
В Иначе опять пытаетесь найти строку с номенклатурой, зная что не нашли ее? Добавляйте строку в ТЗ, а не ищите
2 zvial
 
27.07.17
07:05
СтрокаТЗ = Данные.Найти(стр.Номенклатура, "Номенклатура");
Если СтрокаТЗ = Неопределено Тогда
СтрокаТЗ = Объект.Товары.Добавить();
СтрокаТЗ.Номенклатура =  стр.Номенклатура;
КонецЕсли;
СтрокаТЗ.КолФ = стр.Количество;
3 Альбатрос
 
27.07.17
07:07
Правильно соединить данные тч с перемещениями в запросе.
4 Amra
 
27.07.17
07:07
Чот я еще не проснулся)
5 Альбатрос
 
27.07.17
07:08
иначе
            стрТч = Данные.Найти(стр.Номенклатура, "Номенклатура");
            стрТч.КолФ = стр.Количество;  

а вот тут чо, ошибки не выскакивает?
6 KIraA
 
27.07.17
07:09
zvial....Ошибка ((({Документ.СБ_Смета.Форма.ФормаДокумента.Форма(63)}: Значение не является значением объектного типа (КолФ)
        СтрокаТЗ.КолФ = стр.Количество;
7 KIraA
 
27.07.17
07:10
Альбатрос нет не выскакивает
8 Альбатрос
 
27.07.17
07:11
(7) Врешь
9 Альбатрос
 
27.07.17
07:11
Должна быть такая же как в (6)
10 Альбатрос
 
27.07.17
07:12
а не, это я туплю
11 KIraA
 
27.07.17
07:13
Так как правильно? Вроде элементарный запрос, а не работает
12 zvial
 
27.07.17
07:13
А, проглядел. У вас вообще что и где ищется то?
Возможно,
СтрокаТЗ = Данные.Найти(стр.Номенклатура, "Номенклатура");
должно выглядеть как
СтрокаТЗ = Объект.Товары.Найти(стр.Номенклатура, "Номенклатура");
?
Ну и смотрите куда реквизит КолФ делся )
13 Альбатрос
 
27.07.17
07:13
СтрокаТЗ = Данные.Найти(стр.Номенклатура, "Номенклатура");
        Если СтрокаТЗ = Неопределено Тогда
            стрТч = Объект.Товары.Добавить();
            стрТч.Номенклатура =  стр.Номенклатура;
            стрТч.КолФ = стр.Количество;
        иначе
            СтрокаТЗ .КолФ = стр.Количество;    
        КонецЕсли;
14 zvial
 
27.07.17
07:14
(12) Для чего ТЧ объекта выгружать в ТЗ Данные?
15 Альбатрос
 
27.07.17
07:14
И это, ты учитывай, что Данные это отдельная ТЗ, а не ТЧ документа
16 Альбатрос
 
27.07.17
07:15
СтрокаТЗ = Объект.Товары.Найти(стр.Номенклатура, "Номенклатура");
        Если СтрокаТЗ = Неопределено Тогда
            стрТч = Объект.Товары.Добавить();
            стрТч.Номенклатура =  стр.Номенклатура;
            стрТч.КолФ = стр.Количество;
        иначе
            СтрокаТЗ .КолФ = стр.Количество;    
        КонецЕсли;
17 Альбатрос
 
27.07.17
07:15
вот так короче
18 KIraA
 
27.07.17
07:17
{Документ.Смета.Форма.ФормаДокумента.Форма(57)}: Метод объекта не обнаружен (Найти)
    СтрокаТЗ = Объект.Товары.Найти(стр.Номенклатура, "Номенклатура");
19 KIraA
 
27.07.17
07:20
zvial....Мне в смету при открытии нужно получить данные по всем документам перемещения
20 Альбатрос
 
27.07.17
07:26
(18) Объект.Товары что такое?
21 zvial
 
27.07.17
07:27
(18) Объект.Товары какой тип имеет?
22 KIraA
 
27.07.17
07:30
Это таблица Товары в Смете, в ней есть колонки (Номенклатура и КолФ), номенклатура уже заполнена, нужно при открытии заполнить автоматически КолФ из документов перемещения на складе
23 1dvd
 
27.07.17
07:31
таблица - понятие растяжимое... Скорее всего, табличная часть
24 KIraA
 
27.07.17
07:31
ДаДа)) табличная часть
25 Альбатрос
 
27.07.17
07:34
(24) Не вяжется это с (18)
26 Альбатрос
 
27.07.17
07:34
(24) Показывай скрин из отладчика
27 zvial
 
27.07.17
07:36
(25) Ага, у ТабличнаяЧасть метод Найти(<Значение>, <Колонки>)  имеется.
28 KIraA
 
27.07.17
07:40
Данные = Объект.Товары;


{Документ.СБ_Смета.Форма.ФормаДокумента.Форма(57)}: Метод объекта не обнаружен (Найти)
        СтрокаТЗ = Данные.Найти(стр.Номенклатура,"Номенклатура");
29 KIraA
 
27.07.17
07:41
Скрин? Это куда и как?
30 1dvd
 
27.07.17
07:41
Сообщить(ТипЗнч(Объект.Товары));
31 1dvd
 
27.07.17
07:42
32 Адинэснег
 
27.07.17
07:45
засунь в ВТ свою таблицу и обработай в запросе
33 KIraA
 
27.07.17
07:54
34 KIraA
 
27.07.17
07:55
Адинэснег...."я не волшебник, я только учусь..." это обо мне))) Если не сложно поподробнее.
35 1dvd
 
27.07.17
07:55
(33) отладчиком пользуемся, а про SHIFT-F9 не слышали?
36 KIraA
 
27.07.17
07:57
1dvd да так вроде тоже понятно, не?
37 1dvd
 
27.07.17
07:58
(36) нет, я так и не понял какой тип у Данные и Объект.Товары
38 KIraA
 
27.07.17
08:01
Объект.Товары это табличная часть, а Данные = Объект.Товары.Выгрузить();
39 1dvd
 
27.07.17
08:03
(38) Ложь
40 KIraA
 
27.07.17
08:14
1dvd может удаленно ко мне подключитесь?)))
41 1dvd
 
27.07.17
08:16
(40) Ага, щаз... У меня на работе всё закрыто
42 1dvd
 
27.07.17
08:16
(40) выполни (30)
43 Dvoe4nik
 
27.07.17
08:16
(0) МассивСтрок= Данные.НайтиСтроки(Новый структура("Номенклатура",стр.Номенклатура));
        Если МассивСтрок.количество =0 Тогда
            стрТч = Объект.Товары.Добавить();
            стрТч.Номенклатура =  стр.Номенклатура;
            стрТч.КолФ = стр.Количество;
        иначе
         ДЛя каждого строкамассива из МассивСтрок цикл
            строкамассива.КолФ = стр.Количество;    
        Конеццикла;
        КонецЕсли;
ИМхо возможно несколько строк имеется в "Данные"
44 KIraA
 
27.07.17
08:16
чЁ делать то?
45 Dvoe4nik
 
27.07.17
08:21
(44) , перед циклом напиши (40) а цикл закоментируй, и посмотри что скажет
46 Dvoe4nik
 
27.07.17
08:22
(45) *(30)
47 Pentosh
 
27.07.17
08:24
(44) а вам что надо то?
Вам вроде уже ответ в (16) написали, а если ошибку действительно кидает на "Найти" (что странно, ибо метод у ТЧ такой есть и синтаксис у вас правильный), тогда выгрузите данные из ТЧ в ТЗ, работайте с ТЗ (ищите и добавляйте в него строки в случае если не находит номенклатуру), а затем загрузите данные обратно в ТЧ (предварительно ее очистив).
48 zvial
 
27.07.17
08:25
(43) Найти все равно бы отработал. Синтаксической ошибки не вывалило бы. Ну и Найти в любом случае находит первую строку
49 1dvd
 
27.07.17
08:25
(47) она и так в ТЗ выгрузила уже, а метода "найти" нет
50 KIraA
 
27.07.17
08:27
Для каждого стр Из рез Цикл         
        МассивСтрок= Данные.НайтиСтроки(Новый структура("Номенклатура",стр.Номенклатура));
        Если МассивСтрок.Количество() =0 Тогда
            стрТч = Объект.Товары.Добавить();
            стрТч.Номенклатура =  стр.Номенклатура;
            стрТч.КолФ = стр.Количество;
        иначе
         ДЛя каждого строкамассива из МассивСтрок цикл
            строкамассива.КолФ = стр.Количество;
            Сообщить(ТипЗнч(Объект.Товары));
        Конеццикла;
    КонецЕсли;
    
    КонецЦикла;

Сообщения: ДанныеФормыКоллекция
           ДанныеФормыКоллекция
51 Dvoe4nik
 
27.07.17
08:29
(50) реквизитформыВЗначение("Объект").товары.выгрузить;
52 Dvoe4nik
 
27.07.17
08:29
*данные= (51)  попробуй так
53 KIraA
 
27.07.17
08:34
Dvoe4nik...всю строчку правильно не напишите?)) и куда точно воткнуть?
54 Dvoe4nik
 
27.07.17
08:38
(53) )))))
Вместо   Данные = Объект.Товары.Выгрузить();
Поставить:     Данные = РеквизитФормыВЗначение("Объект").товары.выгрузить();
55 Dvoe4nik
 
27.07.17
08:40
посмотреть  что скажет Сообщить(ТипЗнч(Данные));
56 Dvoe4nik
 
27.07.17
08:41
(53)  и вообще, порядочные люди сразу признаются что у них: ОФ или УФ))))
57 KIraA
 
27.07.17
08:44
рез = запрос.Выполнить().Выгрузить();
    Данные = РеквизитФормыВЗначение("Объект").Товары.выгрузить();
    
    
    
        Для каждого стр Из рез Цикл        
        МассивСтрок= Данные.НайтиСтроки(Новый структура("Номенклатура",стр.Номенклатура));
        Если МассивСтрок.Количество() =0 Тогда
            стрТч = Объект.Товары.Добавить();
            стрТч.Номенклатура =  стр.Номенклатура;
            стрТч.КолФ = стр.Количество;
        иначе
         ДЛя каждого строкамассива из МассивСтрок цикл
            строкамассива.КолФ = стр.Количество;
        Конеццикла;
    КонецЕсли;
          
    КонецЦикла;


Результата нет ((((. УФ у меня вроде))
58 KIraA
 
27.07.17
08:48
С 2000 БКИ            1    
    Бумага офисная А 4    2    
        Кабель КСПВ 4х0,5 мм    20
    
по консоли вот данные, в таблицу прилетает только 2я строчка, так как ее в списке нет, остальные есть
59 Pentosh
 
27.07.17
08:51
(58) а вы какого поведения ожидаете?
60 Dvoe4nik
 
27.07.17
08:53
(58)  стрТч = Объект.Товары.Добавить(); замените на
стрТч = Данные.Добавить(); а в конце процедуры напишите
61 Dvoe4nik
 
27.07.17
08:54
ЗначениеВРеквизитФормы(Данные,"Товары");
62 KIraA
 
27.07.17
09:01
рез = запрос.Выполнить().Выгрузить();
    Данные = РеквизитФормыВЗначение("Объект").Товары.выгрузить();
    
       Для каждого стр Из рез Цикл        
        МассивСтрок= Данные.НайтиСтроки(Новый структура("Номенклатура",стр.Номенклатура));
        Если МассивСтрок.Количество() =0 Тогда
            стрТч = Данные.Добавить();
            стрТч.Номенклатура =  стр.Номенклатура;
            стрТч.КолФ = стр.Количество;
        иначе
         ДЛя каждого строкамассива из МассивСтрок цикл
            строкамассива.КолФ = стр.Количество;
        Конеццикла;
    КонецЕсли;
    КонецЦикла;
     ЗначениеВРеквизитФормы(Данные,"Товары");

{Документ.СБ_Смета.Форма.ФормаДокумента.Форма(66)}: Ошибка при вызове метода контекста (ЗначениеВРеквизитФормы)
     ЗначениеВРеквизитФормы(Данные,"Товары");
по причине:
Недопустимое значение параметра (параметр номер '2')
63 KIraA
 
27.07.17
09:05
А вот вариант через Ж... работает, но так априоре не правильно....

    Для каждого стр Из рез Цикл         
        
        СтрокаТЗ = Данные.Найти(стр.Номенклатура,"Номенклатура");
        Если СтрокаТЗ = Неопределено Тогда
            стрТч = Объект.Товары.Добавить();
            стрТч.Номенклатура =  стр.Номенклатура;
            стрТч.КолФ = стр.Количество;  
        КонецЕсли;
    КонецЦикла;


        Для каждого стр Из Объект.Товары Цикл         
        
        СтрокаТЗ = рез.Найти(стр.Номенклатура,"Номенклатура");
        Если СтрокаТЗ = Неопределено Тогда
            иначе            
            стр.КолФ = СтрокаТЗ.Количество;  
        КонецЕсли;
    КонецЦикла;
64 KIraA
 
27.07.17
09:26
Больше подсказок не будет?((( Оставлять через Ж?...
65 Dvoe4nik
 
27.07.17
09:27
(62) еще вариант -Объект.Товары.Загрузить(Данные);
66 Dvoe4nik
 
27.07.17
09:28
вместо ЗначениеВРеквизитФормы(Данные,"Товары");
67 dezss
 
27.07.17
09:28
(64) Напиши задачу, тогда можно будет помочь.
Иначе отрабатывает правильно. Отрабатывает именно так, как и написано в коде. Значит, написано неправильно, а чтобы подсказать как правильно, нужна формулировка задачи.
68 KIraA
 
27.07.17
09:56
Dvoe4nik.....Вот так ЗАРАБОТАЛООООООООО!!!!

Спасибо огромное ВСЕМ кто не остался равнодушен и поучаствовал в решении моей проблемы!!!

Где тут плюсики нажать, для поднятия Вашего рейтинга?)))
Требовать и эффективности, и гибкости от одной и той же программы — все равно, что искать очаровательную и скромную жену... по-видимому, нам следует остановиться на чем-то одном из двух. Фредерик Брукс-младший