Имя: Пароль:
1C
1С v8
Заполнение табличной части
0 gaur777
 
17.08.17
11:31
Добрый день!
Подскажите пожалуйста, как составить условие заполнения.
У меня есть 25 полей для заполнения
Поля заполняются из отправленного запроса на веб-сервис
На данный момент возвращает 7 строк
Но есть такая проблема. В некоторых строках есть поля, которые не заполнены и поэтому программа выводит ошибку (Поле объекта не обнаружено (...) таких 6 полей.
Вот как мне составить правильно условие: если поле не заполнено, оно тупо его обходит и не заполняет  
я понимаю что задача простая, я просто не понимаю как это правильно написать.
1 Альбатрос
 
17.08.17
11:32
Попытка/Исключение/конецПопытки
2 Рэйв
 
17.08.17
11:34
Если ЗначениеЗаполнено(Поле) Тогда
   ....
КонецЕсли;
3 gaur777
 
17.08.17
11:37
(2) Ну я вот так делаю
Что не так?        

Если ЗначениеЗаполнено(стр) Тогда            
        стр.UUIDУпаковки                       = ДеталиСтроки.packingList.packingForm.UUID;
        стр.ДолжностьВетВрача                  = СтрокаВСД.confirmedBy.post;
        стр.ДатаТТН                            = СтрокаВСД.waybillDate;
        стр.НомерТТН                           = СтрокаВСД.waybillNumber;
        стр.ОбследованиеПартии                 = ДеталиСтроки.cargoInspected;
        стр.ПроведениеЭкспертизыПродукции      = ДеталиСтроки.cargoExpertized;
           Иначе       
        КонецЕсли;
4 Рэйв
 
17.08.17
11:38
(3)У тебя стр - это что? И она точно у тебя ВСЯ должна быть пустая или только какое то ее поле?
5 Альбатрос
 
17.08.17
11:39
(3) Не так то, что нет каких-то полей
6 Рэйв
 
17.08.17
11:40
И вообще дай полный текст ошибки.а то не понятно на какую сторону ругается
7 gaur777
 
17.08.17
11:40
(4) Вот вся процедура.
стр = Остатки.Добавить()
Остатки - табличная часть

Процедура ОбработкаОтвета(ОтветСписок)
    
    Для Каждого СтрокаВСД из ОтветСписок.vetDocument Цикл
        стр = Остатки.Добавить();
        ЗаполнитьЗначенияСвойств(стр, СтрокаВСД);
        ДеталиСтроки           = СтрокаВСД.batch;
        СписокСвойств          = ДеталиСтроки.Свойства();
        стр.ДатаВыпуска        = ПолучитьДатуИзОтвета(ДеталиСтроки.DateOfProduction.firstdate);
        
        Если СписокСвойств.Получить("expirydate") <> Неопределено Тогда
            стр.ГоденДо        = ПолучитьДатуИзОтвета(ДеталиСтроки.expirydate.firstdate);
        КонецЕсли;
        
        стр.GUIDЦели                           = СтрокаВСД.purpose.guid;
        стр.UuidВСД                            = СтрокаВСД.uuid;
        стр.Статус                             = СтрокаВСД.status;
        стр.UUIDСтраныПроисхождения            = ДеталиСтроки.countryofOrigin.UUID;
        стр.ВетВрач                            = СтрокаВСД.confirmedBy.fio;
        стр.ВидПродукции                       = Справочники.ОписаниеПродукцииВетис.НайтиПоРеквизиту("GUID",Строка(ДеталиСтроки.subProduct.guid));
        стр.ДатаВСД                            = СтрокаВСД.issueDate;
        стр.unitGuid                           = ДеталиСтроки.unit.guid;
        стр.ЕдиницаИзмерения                   = ПолучитьОписаниеЕдиницыИзмеренияПоGUID(стр.unitGuid);
        стр.КоличествоУпаковок                 = Число(ДеталиСтроки.packingAmount);
        стр.Местность                          = СтрокаВСД.locationProsperity;
        стр.Наименование                       = ДеталиСтроки.productItem.name;
        стр.НекачественныйГруз                 = ДеталиСтроки.lowGradeCargo;
        стр.ОбъемПродукции                     = ДеталиСтроки.volume;    
        стр.Продукция                          = Справочники.ОписаниеПродукцииВетис.НайтиПоРеквизиту("GUID",Строка(ДеталиСтроки.product.guid));
        стр.СкоропортящаясяПродукция           = ДеталиСтроки.perishable;
        стр.СпособХранения                     = СтрокаВСД.transportStorageType;
        стр.ТипВСД                             = СтрокаВСД.Type;
        стр.ТипПродукции                       = Справочники.ОписаниеПродукцииВетис.НайтиПоРеквизиту("КодВЕТИС",Число(ДеталиСтроки.productType));
        стр.ТипТранспорта                      = СтрокаВСД.transportInfo.transportNumber.vehicleNumber;
        стр.Транспорт                          = СтрокаВСД.transportInfo.transportType;
        стр.ФормаВСД                           = СтрокаВСД.form;
        стр.UUIDПлощадкиОтправителя            = СтрокаВСД.consignor.enterprise.UUID;
        стр.UUIDПлощадкиПолучателя             = СтрокаВСД.consignee.enterprise.UUID;
        стр.UUIDХСОтправителя                  = СтрокаВСД.consignor.businessEntity.UUID;
        стр.UUIDХСПолучателя                   = СтрокаВСД.consignee.businessEntity.UUID;
        
        Если ЗначениеЗаполнено(стр) Тогда            
        стр.UUIDУпаковки                       = ДеталиСтроки.packingList.packingForm.UUID;
        стр.ДолжностьВетВрача                  = СтрокаВСД.confirmedBy.post;
        стр.ДатаТТН                            = СтрокаВСД.waybillDate;
        стр.НомерТТН                           = СтрокаВСД.waybillNumber;
        стр.ОбследованиеПартии                 = ДеталиСтроки.cargoInspected;
        стр.ПроведениеЭкспертизыПродукции      = ДеталиСтроки.cargoExpertized;
           Иначе       
        КонецЕсли;
    
    КонецЦикла;
            
КонецПроцедуры
8 gaur777
 
17.08.17
11:42
(6) и так на каждую из 6 полей ругается, которые у меня в условие {ВнешняяОбработка.ПросмотрСкладскогоЖурналаВетис.Форма.Форма.Форма(122)}: Поле объекта не обнаружено (packingList)
        стр.UUIDУпаковки                       = ДеталиСтроки.packingList.packingForm.UUID;
9 Рэйв
 
17.08.17
11:42
(7)Ну и зачем ты проверяешь стр? Оно полубому у тебя не пустое, потому что ты в самом начале делаешь
стр = Остатки.Добавить();
10 Рэйв
 
17.08.17
11:44
(8)Проблема в том, что у ДеталиСтроки нет поля  packingList.
и стр тут совсем не причем.
11 gaur777
 
17.08.17
11:45
(10) так я же объясняю приходит 10 строчек с 25 полями
в 3 строках из 10 этих полей нет (т.к. исходящая продукция), а в других 7 они есть и они должны заполняться. вот как-то так

стр.UUIDУпаковки                       = ДеталиСтроки.packingList.packingForm.UUID;
        стр.ДолжностьВетВрача                  = СтрокаВСД.confirmedBy.post;
        стр.ДатаТТН                            = СтрокаВСД.waybillDate;
        стр.НомерТТН                           = СтрокаВСД.waybillNumber;
        стр.ОбследованиеПартии                 = ДеталиСтроки.cargoInspected;
        стр.ПроведениеЭкспертизыПродукции      = ДеталиСтроки.cargoExpertized;
12 gaur777
 
17.08.17
11:48
(10) щас скину скрины, всё станет понятно!
13 Рэйв
 
17.08.17
11:48
(11)Если нечем проверить наличие полей типа .Свойство у структуры, то делай обращение к этим полям как в(1)
14 ok_sys
 
17.08.17
11:49
Если ЗначениеЗаполнено(стр) Тогда
а должно быть
Если ЗначениеЗаполнено(СтрокаВСД.***) Тогда
разве нет?
15 dezss
 
17.08.17
11:54
Если СтрокаВСД.Свойствро("Имя_свойства") Тогда
  стр.свойствро = СтрокаВСД.Имя_свойства;
КонецЕсли;

И так делай на каждое свойство, которого может не быть.
16 Рэйв
 
17.08.17
11:59
(15)Не факт что это структура и у СтрокаВСД есть метод .Свойство()
17 dezss
 
17.08.17
12:01
(16) не факт, но надо проверить.
Использовать Попытка/Исключение, ИМХО, надо только при записи в базу, работе с ТО и т.п., в остальных надо стараться избегать. А то потом "В этой транзакции уже происходили ошибки" можно словить, а разбираться в этом бывает довольно геморно)
18 gaur777
 
17.08.17
12:15
Вот для примера
первый скрин исходящая продукция
http://pastenow.ru/793c1a279fe235ff32d0459832f66a30
второй входящая продукция
http://pastenow.ru/fac998dd98d9672fee3b326f26fc7185
19 gaur777
 
17.08.17
12:33
Так в итоге, какой выход из ситуации, я так и не понял
20 Рэйв
 
17.08.17
12:42
(19)Оберни строчку в попытку и не мучайся.При ошибке оно попадет в исключение и пойдет дальше, ничего не делая.
21 gaur777
 
17.08.17
13:35
(20) так и что? оно не заполняет эти строчки тогда вообще
мне необходимо чтоб оно где-то заполняло, а где их нет, там проходило дальше
22 Рэйв
 
17.08.17
13:37
(21)Ты не понял все заполняй нормально, а
критичную строку:

//---
Попытка
     стр.UUIDУпаковки=ДеталиСтроки.packingList.packingForm.UUID;
Исключение
КонецПопытки;
23 breezee
 
17.08.17
13:38
Типо такого стр.UUIDУпаковки                       = ?(ЗначениеЗаполнено(ДеталиСтроки.packingList.packingForm.UUID), ДеталиСтроки.packingList.packingForm.UUID, 0);
24 gaur777
 
17.08.17
13:45
(22) Вот делаю так! Всё равно не заполняет эти поля во всех строчках!

Процедура ОбработкаОтвета(ОтветСписок)
    
    Для Каждого СтрокаВСД из ОтветСписок.vetDocument Цикл
        стр = Остатки.Добавить();
        
        ЗаполнитьЗначенияСвойств(стр, СтрокаВСД);
        ДеталиСтроки           = СтрокаВСД.batch;
        СписокСвойств          = ДеталиСтроки.Свойства();
        стр.ДатаВыпуска        = ПолучитьДатуИзОтвета(ДеталиСтроки.DateOfProduction.firstdate);
        
        Если СписокСвойств.Получить("expirydate") <> Неопределено Тогда
            стр.ГоденДо        = ПолучитьДатуИзОтвета(ДеталиСтроки.expirydate.firstdate);
        КонецЕсли;
                
        стр.GUIDЦели                           = СтрокаВСД.purpose.guid;
        стр.UuidВСД                            = СтрокаВСД.uuid;
        стр.Статус                             = СтрокаВСД.status;
        стр.UUIDСтраныПроисхождения            = ДеталиСтроки.countryofOrigin.UUID;
        стр.ВетВрач                            = СтрокаВСД.confirmedBy.fio;
        стр.ВидПродукции                       = Справочники.ОписаниеПродукцииВетис.НайтиПоРеквизиту("GUID",Строка(ДеталиСтроки.subProduct.guid));
        стр.ДатаВСД                            = СтрокаВСД.issueDate;
        стр.unitGuid                           = ДеталиСтроки.unit.guid;
        стр.ЕдиницаИзмерения                   = ПолучитьОписаниеЕдиницыИзмеренияПоGUID(стр.unitGuid);
        стр.КоличествоУпаковок                 = Число(ДеталиСтроки.packingAmount);
        стр.Местность                          = СтрокаВСД.locationProsperity;
        стр.Наименование                       = ДеталиСтроки.productItem.name;
        стр.НекачественныйГруз                 = ДеталиСтроки.lowGradeCargo;
        стр.ОбъемПродукции                     = ДеталиСтроки.volume;    
        стр.Продукция                          = Справочники.ОписаниеПродукцииВетис.НайтиПоРеквизиту("GUID",Строка(ДеталиСтроки.product.guid));
        стр.СкоропортящаясяПродукция           = ДеталиСтроки.perishable;
        стр.СпособХранения                     = СтрокаВСД.transportStorageType;
        стр.ТипВСД                             = СтрокаВСД.Type;
        стр.ТипПродукции                       = Справочники.ОписаниеПродукцииВетис.НайтиПоРеквизиту("КодВЕТИС",Число(ДеталиСтроки.productType));
        стр.ТипТранспорта                      = СтрокаВСД.transportInfo.transportNumber.vehicleNumber;
        стр.Транспорт                          = СтрокаВСД.transportInfo.transportType;
        стр.ФормаВСД                           = СтрокаВСД.form;
        стр.UUIDПлощадкиОтправителя            = СтрокаВСД.consignor.enterprise.UUID;
        стр.UUIDПлощадкиПолучателя             = СтрокаВСД.consignee.enterprise.UUID;
        стр.UUIDХСОтправителя                  = СтрокаВСД.consignor.businessEntity.UUID;
        стр.UUIDХСПолучателя                   = СтрокаВСД.consignee.businessEntity.UUID;
        
      Попытка
            стр.UUIDУпаковки                       = ДеталиСтроки.packingList.packingForm.UUID;
            стр.ДолжностьВетВрача                  = СтрокаВСД.confirmedBy.post;
            стр.ДатаТТН                            = СтрокаВСД.waybillDate;
            стр.НомерТТН                           = СтрокаВСД.waybillNumber;
            стр.ОбследованиеПартии                 = ДеталиСтроки.cargoInspected;
            стр.ПроведениеЭкспертизыПродукции      = ДеталиСтроки.cargoExpertized;
          Исключение
      КонецПопытки;
      
    КонецЦикла;
            
КонецПроцедуры
25 _Дайвер_
 
17.08.17
13:47
(22) +
26 breezee
 
17.08.17
13:49
(24) Запускай отладку и смотри по f10 что у тебя там происходит. Чтобы вычислить выражение(кусок кода) shift + f9. Мне кажется, ты сам не знаешь, что должно быть в результате и что у тебя происходит в коде
27 breezee
 
17.08.17
13:51
А еще  "Справочники.ОписаниеПродукцииВетис.НайтиПоРеквизиту" 3 раза обращаешься, вынеси в 1 запрос и получай все данные за раз
28 gaur777
 
17.08.17
13:54
(26) Это самый простой ответ в этом вопросе. Но я прекрасно понимаю что я хочу. Я ведь даже скрины скинул, выше посмотрите в ветке

(27) Зачем? Это роли никакой не играет в данном вопросе
29 gaur777
 
17.08.17
14:02
(26) интересное кино
значение в вычислить выражения отображаются
но в табличную часть не сохраняет
почему?
30 gaur777
 
17.08.17
14:07
Всё дурью маюсь
Прошу прощения, глупость допустил большую
Поля которые не заполняет, указал не тот формат
Всем спасибо большое
Буду впредь внимательней
31 gaur777
 
17.08.17
14:07
Точнее не тот тип
32 breezee
 
17.08.17
14:22
(28) Зачем? Это роли никакой не играет в данном вопросе
В данном - нет, на каком-нибудь собеседовании через годик-другой сыграет))
33 gaur777
 
17.08.17
14:26
(32) хах я вас понял
сейчас исправлю
34 dezss
 
17.08.17
14:28
(27) вообще да, но на практике, это обращение будет же кэшировано...
35 gaur777
 
22.08.17
14:26
Добрый день всем!!! Помогите пожалуйста. задача такая:
У меня имеется внешняя обработка.
1 действие - по нажатию кнопки отправляю запрос на сервис.
2 действие - по нажатию 2 кнопки получаю ответ с over количеством записей

на форме есть поле ввода (ДокументКонтрагента) имеет тип ДокументСсылка.ДокументКонтрагента
Нажимая на него я выбираю нужную мне строку документа с нужными мне значениями реквизита ("НомерМашины" и "ДатаОтправки")
Теперь нужно описать условие
Если реквизит НомерМашины (из документа) = реквизиту НомерТТН (из внешней обработки) и ДатаОтправки = ДатеТТН (тогда заполняется табличная часть этой строкой)
Тоесть нужно отбирать только ту запись запроса, которая соответствует выбранному документу контрагента.

Вот скриншот формы внешней обработки - где я получаю ответ:
http://pastenow.ru/4a67d3a046821c452c933089a7c5b657
36 azernot
 
22.08.17
15:01
Какой тип у "ответа с over количеством записей"?
37 lexasan
 
22.08.17
15:57
(35) "1 действие - по нажатию кнопки отправляю запрос на сервис. " - отправляй данные с фильтром для получения только нужного ответа, мы же не знаем как сервис устроен.