Имя: Пароль:
1C
1С v8
Поиск и замена в табличной части документа
,
0 cry_san
 
25.09.17
10:18
Здравствуйте!
На форме есть элемент со ссылкой на документ. Далее перебираю всю табличную часть для изменения одной ячейки

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

Вопрос в том, есть ли более быстрый поиск в табличной части?
Делал так:

Табл1 = Док.Взаиморасчеты .Найти(Строка("№ ") + Строка(НомерЛСчета), "ЛицевойСчет");
Если Табл1 <> Неопределено Тогда
   Сообщить("Не найдено");
Иначе
   Табл1.СуммаПриход = 200;
КонецЕсли;

Ругается:
Значение не является значением объектного типа (СуммаПриход) Табл1.СуммаПриход = 200;

Что я делаю не так?
Прошу вашей помощи.
1 Lexey_
 
25.09.17
10:22
Если Табл1 = Неопределено Тогда
   Сообщить("Не найдено");
2 Denis_CFO
 
25.09.17
10:22
(0) По-поводу "быстроты" не скажу, а во-втором примере ошибка простая: там "Табл1" - это массив строк. Поэтому,  либо по-индексу - Табл1[0].СуммаПриход = 200;, либо циклом перебирай весь массив.
3 Lexey_
 
25.09.17
10:23
(2) "это массив строк" - нет
4 Denis_CFO
 
25.09.17
10:23
(3) Точно, я спутал Найти и НайтиСтроки.
5 perester
 
25.09.17
10:25
строчкапоиска = Строка("№ ") + Строка(НомерЛСчета))>0;

Док.Взаиморасчеты.Найти(строчкапоиска ,"ЛицевойСчет")
6 perester
 
25.09.17
10:28
строчкапоиска = Строка("№ ") + Строка(НомерЛСчета);
Если НЕ Док.Взаиморасчеты.Найти(строчкапоиска ,"ЛицевойСчет") = Неопределено тогда
ок.Взаиморасчеты.Найти(строчкапоиска ,"ЛицевойСчет").СуммаПриход =  Число(ОстатокТело);
КонецЕсли;
7 h-sp
 
25.09.17
10:31
(6) таки наверно

строчкапоиска = Справочники.ЛицевыеСчета.НайтиПоНаименованию("№ " + НомерЛСчета);
8 cry_san
 
25.09.17
10:38
Нет. Строчка поиска именно строка. Произвольная.
9 1dvd
 
25.09.17
10:41
(8) пробовал (1)?
10 h-sp
 
25.09.17
10:43
(8) строкапоиска здесь это не строка поиска. в вашем смысле. Это название переменной такое в программе.
11 cry_san
 
25.09.17
10:43
(9) Да, поправил. Теперь выдает Не найдено, хотя такая строка там есть.
Полностью выглядит так:
Лицевой счет № 46600 от 27.08.2016 г.
А ищем
№ 46600
12 cry_san
 
25.09.17
10:44
(10) Это понятно.
13 1dvd
 
25.09.17
10:44
(11) так тебе часть строки надо? тогда только первый вариант или запрос
14 cry_san
 
25.09.17
10:44
Или ищет не по части строки а по полному значению?
15 1dvd
 
25.09.17
10:45
(14) по полному
16 cry_san
 
25.09.17
10:45
(13) Блин
А запрос быстрее будет или от также перебирает все строки?
17 1dvd
 
25.09.17
10:46
(16) запрос будет быстрее, но он не вернет тебе ссылку на строку. Надо будет позиционироваться опять же через НайтиСтроки или найти
18 Конь в пальто
 
25.09.17
10:47
(16) быстрее
19 Конь в пальто
 
25.09.17
10:47
(17) зачем?
20 Конь в пальто
 
25.09.17
10:49
не прочел смысл (0)
21 cry_san
 
25.09.17
10:51
(20) Смысл найти и изменить одно значение в 100500 строках табличной части
22 Конь в пальто
 
25.09.17
10:53
(21) да понял уже)
23 cry_san
 
25.09.17
10:55
Всем спасибо!
Принцип понятен. Дальше я сам.
Благодарю!
24 h-sp
 
25.09.17
10:55
(21) тогда (7) находите сначала элемент в справочнике Лицевые счета. А потом уже в ТЧ ищете элемент справочника через НайтиСтроки
25 cry_san
 
25.09.17
10:58
Все получилось именно так.
Спасибо! (24)
26 perester
 
25.09.17
11:15
(17) Запрос найдет номер строки, а со знанием номера получить строку много ума не надо
27 AlvlSpb
 
25.09.17
11:21
(26) Не совсем понимаю зачем искать номер строки, если запросом выбрать ссылки на документ из Док.Взаиморасчеты по условию Где ДокВзаиморасчеты.ЛицевойСчет = &ЛицевойСчет
установить Параметр ЛицевойСчет =  Справочники.ЛицевыеСчета.НайтиПоНаименованию(//наше наименование)
Вынрузить результат в массив и перебором массива установить нужные значения (можно и в ТЗ). Никакого поиска в 100500 строк. Должно работать быстрее
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.