Имя: Пароль:
1C
1С v8
Обновление табличной части документа
0 elsakovm
 
22.10.19
10:56
Добрый день.
Как обновить табличную часть документа в УФ?
Нужно если есть эта номенклатура в запросе то передать количество, если нету то создать новую
Передаю параметр НоменклатураИЗТЧ с клиента
И когда обновляю на сервере

    Выборка = РезультатЗапроса.Выгрузить();
        
        Для Каждого стр Из Выборка Цикл  
                                
           Если стр.Номенклатура <> НоменклатураИЗТЧ Тогда
               НоваяСтрока = Объект.Запасы.Добавить();
               НоваяСтрока.Номенклатура = стр.Номенклатура;
               НоваяСтрока.КоличествоУвеличения = стр.КоличествоПревышенияОстаток;
               НоваяСтрока.ЕдиницаИзмерения = стр.ЕдИзм;  
           Иначе
               Возврат стр.КоличествоПревышенияОстаток;
           КонецЕсли;
              
        КонецЦикла;

Создаются лишние строки
1 D_E_S_131
 
22.10.19
11:40
"Создаются лишние строки" - а почему считается, что строки лишние?
2 Fram
 
22.10.19
11:43
(0) отладчик в помощь
3 elsakovm
 
22.10.19
11:43
Потому что каждый раз когда сравнивается с результатом запроса и Номенклатура не совпадает создается новая строка
4 JeHer
 
22.10.19
11:45
(3) а что там в "Выборка"?
5 elsakovm
 
22.10.19
11:47
(4)результат запроса из регистра (этими данными я пытаюсь обновить табличную часть)
6 hhhh
 
22.10.19
11:48
(4) главное НоменклатураИЗТЧ. Вот тут бредятина. Если много таких НоменклатураИЗТЧ, то для каждой создаются строки.
7 JeHer
 
22.10.19
11:51
(6) может НоменклатураИЗТЧ не в Объект.Запасы, а в другой табличной части.
8 elsakovm
 
22.10.19
11:54
(6) да, но не пойму как правильно сделать
9 elsakovm
 
22.10.19
11:55
с клиента передаю
НоменклатураИЗТЧ = ТекущаяСтрокаТЧ.Номенклатура;
10 JeHer
 
22.10.19
12:01
(9) что есть в Выборке? Поясню:
- берешь 1-ю номенклатуру из ТЧ, передаешь её в функцию
- делаешь какой-то запрос, получаешь таблицу
- перебираешь эту таблицу, сравниваешь с НоменклатураИЗТЧ
   - делаешь какие-то движения по заданному условию
   - например, условие стр.Номенклатура <> НоменклатураИЗТЧ
   - создаешь новую строку, идешь дальше по таблице
   - опять стр.Номенклатура <> НоменклатураИЗТЧ
   - создаешь новую строку, идешь дальше по таблице
- берешь 2-ю номенклатуру из ТЧ, передаешь её в функцию
- делаешь какой-то запрос, получаешь таблицу
- перебираешь эту таблицу, сравниваешь с НоменклатураИЗТЧ
   - делаешь какие-то движения по заданному условию
   - например, условие стр.Номенклатура <> НоменклатураИЗТЧ
   - создаешь новую строку, идешь дальше по таблице
   - опять стр.Номенклатура <> НоменклатураИЗТЧ
   - создаешь новую строку, идешь дальше по таблице
- и т.д. по все ТЧ

Понятно?
11 Доминошник
 
22.10.19
12:03
(0) Я правильно понимаю - если в выборке 5 строк, и все они не совпадают - то будет создано 5 строк в ТЧ?
(10) Опередил :)
12 elsakovm
 
22.10.19
12:12
(10) дак я думал что я так и делаю
(11) а в итоге так получается
13 hhhh
 
22.10.19
12:15
(12) в чем вопрос тогда? ну так и делал. И так получилось. Всё путем, значит?
14 elsakovm
 
22.10.19
12:19
15 elsakovm
 
22.10.19
12:21
(10) видимо не понятно(. А где именно я не так делаю, вроде все так
16 Мимохожий Однако
 
22.10.19
12:23
(0) В отладчике НоменклатураИЗТЧ  какое значение имеет?
17 elsakovm
 
22.10.19
12:24
на клиенте

Для Каждого ТекущаяСтрокаТЧ из Объект.Запасы Цикл
            НоменклатураИЗТЧ = ТекущаяСтрокаТЧ.Номенклатура;
            ТекущаяСтрокаТЧ.КоличествоУвеличения = ОбновитьКолонкуУвеличениеНаСервере(НоменклатураИЗТЧ);
        КонецЦикла;
18 Ёпрст
 
22.10.19
12:25
(17) короче, выкинь свой код в топку, на сервере бери всю тч целиком и пихай в свой запрос, на выходе уже будешь иметь всё сразу, а не перебирать и что-то искать для каждой строки отдельно
19 elsakovm
 
22.10.19
12:31
(18) можно и так но это не поменяет сути вопроса. как правильно обновить ТЧ документа, как будет выглядеть перебор строк
20 hhhh
 
22.10.19
12:34
(19) как-то так

          Если МассивНоменклатурИзТЧ.Найти(стр.Номенклатура) = Неопределено Тогда

то есть в процедуру передаете весь массив номенклатур
21 elsakovm
 
22.10.19
12:36
(16) там одна строчка скриншот в (14)
22 hhhh
 
22.10.19
12:36
(20)+ хотя, наверно лучше вообще выкинуть всё и переписать.
23 hhhh
 
22.10.19
12:37
(21) в итоге что получается?
24 elsakovm
 
22.10.19
12:38
(22) можно и переписать
25 hhhh
 
22.10.19
12:39
(23)+ где скрин "Создаются лишние строки" ??
26 elsakovm
 
22.10.19
12:44
27 hhhh
 
22.10.19
13:12
(26) сначала запрос посмотреть. Отуда Выборка
28 Мимохожий Однако
 
22.10.19
13:31
(21) В таком случае условие стр.Номенклатура <> НоменклатураИЗТЧ будет всегда истиной. Ты сравниваешь ссылку справочника со строкой таблицы значений
29 D_E_S_131
 
22.10.19
13:52
(26) Что бы найти номенклатуру, которой нет в ТЧ, надо передавать не поочередно строки из ТЧ, а сразу данные из всех строк. Выгрузить в массив и в запросе получать данные, которых нет в этом массиве.
30 elsakovm
 
22.10.19
14:09
(27)

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

        Запрос.УстановитьПараметр("Ссылка",Объект.Ссылка);
        
        РезультатЗапроса = Запрос.Выполнить();         
        Выборка = РезультатЗапроса.Выгрузить();
        
        Для Каждого стр Из Выборка Цикл  
            
           Если стр.Номенклатура <> НоменклатураИЗТЧ Тогда
               НоваяСтрока = Объект.Запасы.Добавить();
               НоваяСтрока.Номенклатура = стр.Номенклатура;
               НоваяСтрока.КоличествоУвеличения = стр.КоличествоПревышенияОстаток;
               НоваяСтрока.ЕдиницаИзмерения = стр.ЕдИзм;  
           Иначе
               Возврат стр.КоличествоПревышенияОстаток;
           КонецЕсли;
              
        КонецЦикла;
    
КонецФункции
31 Мимохожий Однако
 
22.10.19
14:40
(30) Еще раз...
Разберись с условием Если стр.Номенклатура <> НоменклатураИЗТЧ Тогда